using Dlhis.Canteen.Api; using Dlhis.Canteen.Api.Request; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Basic.Enums; using Dlhis.Entity.Canteen.Entities; using Dlhis.Entity.Canteen.Enums; using Dlhis.ScheduledTask.Attributes; using Dlhis.ScheduledTask.Common.Request; using Dlhis.ScheduledTask.Common.Services; using Hangfire; using Kurisu.AspNetCore.DataAccess.SqlSugar.Extensions; using Kurisu.AspNetCore.Utils; using Kurisu.AspNetCore.Utils.Extensions; namespace Dlhis.ScheduledTask.Jobs; /// /// 餐补核算 /// [RecurringJob(nameof(MealSupplementHandlerJob), "0 0/30 * * * ?", Name = "餐补核算")] public class MealSupplementHandlerJob : BaseJob { private readonly IHainingMealSupplementApi _hainingMealSupplementApi; private readonly IJinkoJIPService _jinkoJIPService; public MealSupplementHandlerJob(IServiceProvider serviceProvider, IHainingMealSupplementApi hainingMealSupplementApi, IJinkoJIPService jinkoJIPService) : base(serviceProvider) { _hainingMealSupplementApi = hainingMealSupplementApi; _jinkoJIPService = jinkoJIPService; } protected override async Task RunAsync(IServiceProvider serviceProvider) { //查询待处理餐补 var mealSupplements = await DbContext.Queryable() .Where(x => x.Status == MealSupplementStatusEnumtype.Wait || x.Status == MealSupplementStatusEnumtype.Error) .Where(x => x.Workplace != "5") .Where(x => !x.Sync) .ToListAsync(); foreach (var item in mealSupplements) { var gainfo = await DbContext.Queryable().Where(x => x.Code == item.Code).SingleAsync(); if (gainfo == null) { gainfo = await DbContext.Queryable().AS("GainfoLeave").Where(x => x.Code == item.Code).SingleAsync(); if (gainfo == null) { await DbContext.Updateable() .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Error) .SetColumns(x => x.Result == "人员档案不存在") .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == item.UniqueId) .ExecuteCommandAsync(); //后台任务获取人员 BackgroundJob.Enqueue(x => x.TodoByCodeAsync(item.Code)); continue; } else if (gainfo.ResignationDate < item.Date) { try { var r = await _jinkoJIPService.SyncMealSupplementRecordsAsync(new List { new() { UniqueId = item.UniqueId, Status = "FAIL", Msg = "人员离职" } }); await DbContext.Updateable() .SetColumns(x => x.Result == r) .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Success) .SetColumns(x => x.Sync == true) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == item.UniqueId) .ExecuteCommandAsync(); } catch { } continue; } } //创建余额数据 var mealUser = await DbContext.Queryable().Where(x => x.UserCode == gainfo.Code).SingleAsync(); if (mealUser == null) { mealUser = new GainfoMealEntity { Balance = 0, BalanceOfRecharge = 0, BalanceOfSubsidies = 0, UserNo = gainfo.No, UserCode = gainfo.Code, Version = 0, }; await DbContext.InsertAsync(mealUser); } if (item.Workplace == "5") { await SetHainingMealSupplementAsync(item); } else { await SetMealSupplementAsync(gainfo, item); } } } private async Task SetMealSupplementAsync(GainfoEntity gainfo, MealSupplementRecordEntity mealSupplement) { await DbContext.Client.Ado.BeginTranAsync(); try { await CommonHelper.RetryAsync(async () => { var mealUser = await DbContext.Queryable().Where(x => x.UserCode == mealSupplement.Code).FirstAsync(); var b = mealUser.Balance += mealSupplement.Amount; await DbContext.Updateable() .SetColumns(x => x.Version == x.Version + 1) .SetColumns(x => x.Balance == b) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UserCode == mealUser.UserCode && x.Version == mealUser.Version) .ExecuteCommandThrowVersionAsync(); }, 5); await DbContext.InsertAsync(new BalanceRecordEntity { Amount = mealSupplement.Amount, ApplicationType = CanteenApplicationTypeEnumType.MealSupplement, Type = BalanceRecordTypeEnumType.In, BusinessPlaceCode = null, BusinessShiftCode = null, ShiftType = null, CostDate = mealSupplement.Date, CostDateTime = DateTime.Now, UserNo = gainfo.No, No = mealSupplement.UniqueId, //使用DHR流水号 UserCode = gainfo.Code, TenantId = mealSupplement.Factory, Status = BalanceRecordStatusEnumType.Valid, Source = BalanceRecordSourceEnumType.LocalTenantSubsidies, Remark = mealSupplement.UniqueId + ":" + mealSupplement.Remark, CostId = gainfo.CostId, OriginTenantId = gainfo.Factory, Werks = gainfo.Werks, Name = gainfo.Name, IsCostCrossTenant = false, DepartmentNo = gainfo.DepartmentNo, DeviceUniqueNo = null, IsDeleted = false, }); var r = await _jinkoJIPService.SyncMealSupplementRecordsAsync(new List { new() { UniqueId = mealSupplement.UniqueId, Status = "SUCCESS", Msg = "操作成功" } }); //更新餐补信息为成功(同步成功) await DbContext.Updateable() .SetColumns(x => x.Result == r) .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Success) .SetColumns(x => x.Sync == true) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == mealSupplement.UniqueId) .ExecuteCommandAsync(); await DbContext.Client.Ado.CommitTranAsync(); } catch (Exception ex) { await DbContext.Client.Ado.RollbackTranAsync(); await DbContext.Updateable() .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Error) .SetColumns(x => x.Result == ex.Message + " " + ex.StackTrace) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == mealSupplement.UniqueId) .ExecuteCommandAsync(); } } private async Task SetHainingMealSupplementAsync(MealSupplementRecordEntity mealSupplement) { await DbContext.Client.Ado.BeginTranAsync(); try { var hnResponse = mealSupplement.Factory == "501" ? await _hainingMealSupplementApi.AddHsChuNengMealSupplementAsync(new AddHainingMealSupplementRequest { Code = mealSupplement.Code, Amount = mealSupplement.Amount, Date = mealSupplement.Date.Date, Remark = mealSupplement.Remark, UniqueId = mealSupplement.UniqueId }) : await _hainingMealSupplementApi.AddMealSupplementAsync(new AddHainingMealSupplementRequest { Code = mealSupplement.Code, Amount = mealSupplement.Amount, Date = mealSupplement.Date.Date, Remark = mealSupplement.Remark, UniqueId = mealSupplement.UniqueId }); (hnResponse == null || hnResponse.Code != 200).ThrowIfTrue("海宁餐补写入失败:" + hnResponse?.Message); var r = await _jinkoJIPService.SyncMealSupplementRecordsAsync(new List { new() { UniqueId = mealSupplement.UniqueId, Status = "SUCCESS", Msg = "操作成功" } }); //更新餐补信息为成功(同步成功) await DbContext.Updateable() .SetColumns(x => x.Result == r) .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Success) .SetColumns(x => x.Sync == true) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == mealSupplement.UniqueId) .ExecuteCommandAsync(); await DbContext.Client.Ado.CommitTranAsync(); } catch (Exception ex) { await DbContext.Client.Ado.RollbackTranAsync(); await DbContext.Updateable() .SetColumns(x => x.Status == MealSupplementStatusEnumtype.Error) .SetColumns(x => x.Result == ex.Message + " " + ex.StackTrace) .SetColumns(x => x.ModifiedTime == DateTime.Now) .Where(x => x.UniqueId == mealSupplement.UniqueId) .ExecuteCommandAsync(); } } }