using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.Basic.Organization.Services.Implements; public class MealUserService : IMealUserService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; public MealUserService(IDbContext dbContext, ICurrentUser currentUser) { _dbContext = dbContext; _currentUser = currentUser; } public async Task> GetPageAsync(PageDto request) { var tenantId = _currentUser.GetStringTenantId(); var page = await _dbContext.Queryable() .LeftJoin((meal, gainfo) => meal.UserCode == gainfo.Code) .LeftJoin((meal, gainfo, gainfoLeave) => meal.UserCode == gainfoLeave.Code) .LeftJoin((meal, gainfo, gainfoLeave, dept1) => dept1.No == gainfo.DepartmentNo) .LeftJoin((meal, gainfo, gainfoLeave, dept1, dept2) => dept2.No == gainfo.DepartmentNo) .WhereIF(request.Search.IsPresent(), (meal, gainfo, gainfoLeave, dept1, dept2) => meal.UserCode == request.Search || gainfo.Name.Contains(request.Search) || gainfoLeave.Name.Contains(request.Search)) .Where((meal, gainfo, gainfoLeave) => gainfo.Factory == tenantId || gainfoLeave.Factory == tenantId) .Select((meal, gainfo, gainfoLeave, dept1, dept2) => new MealUserResponse { Balance = meal.Balance, BalanceOfRecharge = meal.BalanceOfRecharge, BalanceOfSubsidies = meal.BalanceOfSubsidies, UserCode = meal.UserCode, UserName = SqlFunc.IsNull(gainfo.Name, gainfoLeave.Name), UserNo = SqlFunc.IsNull(gainfo.No, gainfoLeave.No), DepartmentName = SqlFunc.IsNull(dept1.Name, dept2.Name) }) .ToPageListAsync(request); return page; } /// public async Task MigrationAsync(GainfoBalanceMigrationRequest request) { //只能针对离职人员 var gainfoLeave = await _dbContext.Queryable().Where(x => x.Code == request.BeforeCode).SingleAsync(); gainfoLeave.ThrowIfNull("需要对已离职人员迁移"); var beforeBalance = await _dbContext.Queryable().Where(x => x.UserCode == request.BeforeCode).Select(x => x.Balance).SingleAsync(); if (beforeBalance == 0) { return; } //清空余额 await _dbContext.Updateable() .SetColumns(x => x.Balance == 0) .SetColumns(x => x.ModifiedTime == DateTime.Now) .SetColumns(x => x.Version == x.Version + 1) .Where(x => x.UserCode == request.BeforeCode) //不需要判断version .ExecuteCommandAsync(); //转移到现有人员 var gainfo = await _dbContext.Queryable().Where(x => x.Code == request.NowCode).SingleAsync(); gainfo.ThrowIfNull("目标人员不存在"); var now = DateTime.Now; await _dbContext.InsertAsync(new BalanceRecordEntity { No = SnowFlakeHelper.Instance.NextId().ToString(), UserNo = gainfo.No, Name = gainfo.Name, UserCode = gainfo.Code, DepartmentNo = gainfo.DepartmentNo, Source = BalanceRecordSourceEnumType.BalanceMigration, Type = BalanceRecordTypeEnumType.In, Amount = beforeBalance, BusinessPlaceCode = null, BusinessShiftCode = null, ShiftType = null, CostDate = now.Date, DeviceUniqueNo = null, SubsidiesFromMonth = now.ToString("yyyyMM"), IP = null, CostId = gainfo.CostId, OriginTenantId = gainfo.Factory, IsCostCrossTenant = false, Status = BalanceRecordStatusEnumType.Valid, CostDateTime = DateTime.Now, Remark = $"{gainfoLeave.Code}:余额转入", ApplicationType = CanteenApplicationTypeEnumType.MealSupplement, TenantId = gainfo.Factory, Werks = gainfo.Werks, IsDeleted = false, }); var nowGainfoMeal = await _dbContext.Queryable().Where(x => x.UserCode == request.NowCode).SingleAsync(); var nowBalance = nowGainfoMeal.Balance + beforeBalance; await _dbContext.Updateable() .SetColumns(x => x.Balance == nowBalance) .SetColumns(x => x.ModifiedTime == DateTime.Now) .SetColumns(x => x.Version == x.Version + 1) .Where(x => x.UserCode == request.NowCode && x.Version == nowGainfoMeal.Version) .ExecuteCommandThrowVersionAsync("转入失败"); } }