diff --git a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoMealService.cs b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoMealService.cs index 12aa8fd0..d2e3e4f1 100644 --- a/Src/Dlhis.Basic/Organization/Services/Implements/GainfoMealService.cs +++ b/Src/Dlhis.Basic/Organization/Services/Implements/GainfoMealService.cs @@ -28,44 +28,42 @@ public class GainfoMealService : IGainfoMealService public async Task> GetPageAsync(GainfoMealPageRequest request) { var factory = _currentUser.GetStringTenantId(); - - var page = await _dbContext.Queryable().AS(request.IsLeave ? "GainfoLeave" : "Gainfo") - .LeftJoin((x, dept) => dept.No == x.DepartmentNo) - .LeftJoin((x, dept, ms) => ms.Code == x.Code) - .Where(x => x.Factory == factory) - .WhereIF(request.Search.IsPresent(), x => x.Code == request.Search || x.Name == request.Search) - .WhereIF(request.IsLeave && request.SearchDateTimePeriod.HasValue(), x => x.ResignationDate >= request.SearchDateTimePeriod.Start && - x.ResignationDate <= request.SearchDateTimePeriod.End) - .WhereIF(request.SearchDateTimePeriod.HasValue(), (x, dept, ms) => ms.Date >= request.SearchDateTimePeriod.Start && ms.Date <= request.SearchDateTimePeriod.End) - .GroupBy((x, dept, ms) => new { UserCode = x.Code, UserName = x.Name, UserNo = x.No, DepartmentName = dept.Name }) - .Select((x, dept, ms) => new GainfoMealResponse + + 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 == gainfoLeave.DepartmentNo) + .WhereIF(request.Search.IsPresent(), (meal, gainfo, gainfoLeave, dept1, dept2) => meal.UserCode == request.Search + || gainfo.Name == request.Search + || gainfoLeave.Name == request.Search) + .Where((meal, gainfo, gainfoLeave) => gainfo.Factory == factory || gainfoLeave.Factory == factory) + .WhereIF(request.IsLeave, (meal, gainfo, gainfoLeave) => SqlFunc.Subqueryable().Where(x => x.Code == meal.UserCode).Any()) + .WhereIF(request.IsLeave && request.SearchDateTimePeriod.HasValue(), (meal, gainfo, gainfoLeave) => gainfoLeave.ResignationDate >= request.SearchDateTimePeriod.Start && gainfoLeave.ResignationDate <= request.SearchDateTimePeriod.End) + .Select((meal, gainfo, gainfoLeave, dept1, dept2) => new GainfoMealResponse { - UserCode = x.Code, - UserName = x.Name, - UserNo = x.No, - DepartmentName = dept.Name, - Status = request.IsLeave ? GainfoStatusEnumType.Leave : GainfoStatusEnumType.Working, - CurrentMealSupplementAmount = SqlFunc.AggregateSum(ms.Amount), - //CurrentBalance = SqlFunc.AggregateSum(b.Amount) + CurrentBalance = meal.Balance, + UserCode = meal.UserCode, + UserName = SqlFunc.IsNull(gainfo.Name, gainfoLeave.Name), + UserNo = SqlFunc.IsNull(gainfo.No, gainfoLeave.No), + DepartmentName = SqlFunc.IsNull(dept1.Name, dept2.Name), + Status = SqlFunc.IsNullOrEmpty(gainfo.No) ? GainfoStatusEnumType.Leave : GainfoStatusEnumType.Working }) .ToPageListAsync(request); var userCodes = page.Data.Select(x => x.UserCode).ToList(); - - var data = await _dbContext.Queryable().Where(x => x.Status == BalanceRecordStatusEnumType.Valid && x.Source != BalanceRecordSourceEnumType.EMealVoucher) - .Where(x => userCodes.Contains(x.UserCode)) - .GroupBy(x => x.UserCode) - .Select(x => new { x.UserCode, Balance = SqlFunc.AggregateSum(x.Amount) }).ToListAsync(); - - - foreach (var item in page.Data) - { - var d1 = data.FirstOrDefault(x => x.UserCode == item.UserCode); - if (d1 != null) + var summary = await _dbContext.Queryable() + .Where(x => userCodes.Contains(x.Code)) + .WhereIF(request.SearchDateTimePeriod.HasValue(), x => x.Date >= request.SearchDateTimePeriod.Start && x.Date <= request.SearchDateTimePeriod.End) + .GroupBy(x => x.Code) + .Select(x => new { - item.CurrentBalance = d1.Balance; - } - } + x.Code, + Amount = SqlFunc.AggregateSum(x.Amount) + }) + .ToListAsync(); + + page.Data.ForEach(x => { x.CurrentMealSupplementAmount = summary.FirstOrDefault(item => item.Code == x.UserCode)?.Amount ?? 0; }); return page; }