using Dlhis.Basic.Organization.Request; using Dlhis.Basic.Organization.Response; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; using Kurisu.AspNetCore.Authentication.Abstractions; using Kurisu.AspNetCore.CustomClass; using Kurisu.AspNetCore.DataAccess.Dto; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; using Kurisu.AspNetCore.Utils.Extensions; using SqlSugar; namespace Dlhis.Basic.Organization.Services.Implements; public class GainfoMealService : IGainfoMealService { private readonly IDbContext _dbContext; private readonly ICurrentUser _currentUser; public GainfoMealService(IDbContext dbContext, ICurrentUser currentUser) { _dbContext = dbContext; _currentUser = currentUser; } public async Task> GetPageAsync(GainfoMealPageRequest request) { var factory = _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 == 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 { 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 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 { 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; } //*********************************************************************************************************************************************************************** public async Task> GetWalletFactoriesAsync(string factory) { var wallets = await _dbContext.Queryable().ToListAsync(); var code = wallets.First(x => x.Factory == factory).Code; return wallets.Where(x => x.Code == code).Select(x => x.Factory).ToList(); } }