113 lines
4.6 KiB
C#
113 lines
4.6 KiB
C#
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<Pagination<MealUserResponse>> GetPageAsync(PageDto request)
|
|
{
|
|
var tenantId = _currentUser.GetStringTenantId();
|
|
|
|
var page = await _dbContext.Queryable<GainfoEntity>()
|
|
.LeftJoin<GainfoMealEntity>((x, meal) => x.Code == meal.UserCode)
|
|
.LeftJoin<DepartmentEntity>((x, meal, dept) => dept.No == x.DepartmentNo)
|
|
.WhereIF(request.Search.IsPresent(), (x, meal) => x.Code == request.Search || x.Name == request.Search)
|
|
.Where(x => x.Factory == tenantId)
|
|
.Select((x, meal, dept) => new MealUserResponse
|
|
{
|
|
Balance = meal.Balance,
|
|
BalanceOfRecharge = meal.BalanceOfRecharge,
|
|
BalanceOfSubsidies = meal.BalanceOfSubsidies,
|
|
UserCode = x.Code,
|
|
UserName = x.Name,
|
|
UserNo = x.No,
|
|
DepartmentName = dept.Name,
|
|
})
|
|
.ToPageListAsync(request);
|
|
|
|
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;
|
|
}
|
|
|
|
var gainfo = await _dbContext.Queryable<GainfoEntity>().Where(x => x.Code == request.NowCode).SingleAsync();
|
|
gainfo.ThrowIfNull("目标人员不存在");
|
|
|
|
//清空余额
|
|
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 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 = CanteenApplicaitonTypeEnumType.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("转入失败");
|
|
}
|
|
} |