fix 就餐人员餐补总额显示
This commit is contained in:
@@ -0,0 +1,135 @@
|
||||
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;
|
||||
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 tenantId = _currentUser.GetStringTenantId();
|
||||
|
||||
var page = await _dbContext.Queryable<GainfoMealEntity>()
|
||||
.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 == 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 GainfoMealResponse
|
||||
{
|
||||
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);
|
||||
|
||||
var userCodes = page.Data.Select(x => x.UserCode).ToList();
|
||||
var summary = await _dbContext.Queryable<MealSupplementRecordEntity>()
|
||||
.Where(x => userCodes.Contains(x.Code))
|
||||
.WhereIF(request.DateTimePeriod?.Start.HasValue == true && request.DateTimePeriod?.End.HasValue == true,
|
||||
x => x.Date >= request.DateTimePeriod.Start && x.Date <= request.DateTimePeriod.End)
|
||||
.GroupBy(x => x.Code)
|
||||
.Select(x => new
|
||||
{
|
||||
x.Code,
|
||||
Amount = SqlFunc.AggregateSum(x.Amount)
|
||||
})
|
||||
.ToListAsync();
|
||||
|
||||
page.Data.ForEach(x => { x.MealSupplementAmount = summary.FirstOrDefault(item => item.Code == x.UserCode)?.Amount ?? 0; });
|
||||
|
||||
return page;
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public async Task MigrationAsync(GainfoBalanceMigrationRequest request)
|
||||
{
|
||||
//只能针对离职人员
|
||||
var gainfoLeave = await _dbContext.Queryable<GainfoLeaveEntity>().Where(x => x.Code == request.BeforeCode).SingleAsync();
|
||||
gainfoLeave.ThrowIfNull("需要对已离职人员迁移");
|
||||
|
||||
var beforeBalance = await _dbContext.Queryable<GainfoMealEntity>().Where(x => x.UserCode == request.BeforeCode).Select(x => x.Balance).SingleAsync();
|
||||
if (beforeBalance == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
//清空余额
|
||||
await _dbContext.Updateable<GainfoMealEntity>()
|
||||
.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<GainfoEntity>().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<GainfoMealEntity>().Where(x => x.UserCode == request.NowCode).SingleAsync();
|
||||
var nowBalance = nowGainfoMeal.Balance + beforeBalance;
|
||||
await _dbContext.Updateable<GainfoMealEntity>()
|
||||
.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("转入失败");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user