82 lines
4.1 KiB
C#
82 lines
4.1 KiB
C#
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<Pagination<GainfoMealResponse>> GetPageAsync(GainfoMealPageRequest request)
|
|
{
|
|
var factory = _currentUser.GetStringTenantId();
|
|
|
|
var page = await _dbContext.Queryable<UserBalanceEntity>()
|
|
.LeftJoin<GainfoEntity>((meal, gainfo) => meal.UserCode == gainfo.Code)
|
|
.LeftJoin<GainfoLeaveEntity>((meal, gainfo, gainfoLeave) => meal.UserCode == gainfoLeave.Code)
|
|
.LeftJoin<DepartmentEntity>((meal, gainfo, gainfoLeave, dept1) => dept1.No == gainfo.DepartmentNo)
|
|
.LeftJoin<DepartmentEntity>((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<GainfoLeaveEntity>().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<MealSupplementRecordEntity>()
|
|
.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<List<string>> GetWalletFactoriesAsync(string factory)
|
|
{
|
|
var wallets = await _dbContext.Queryable<WalletEntity>().ToListAsync();
|
|
var code = wallets.First(x => x.Factory == factory).Code;
|
|
|
|
return wallets.Where(x => x.Code == code).Select(x => x.Factory).ToList();
|
|
}
|
|
} |