From aa9198ffa4bf42d96628d4d781e9ef055d65b06e Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期四, 04 九月 2025 15:54:11 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs | 142 ++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 139 insertions(+), 3 deletions(-) diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs index 724213f..1fa4b10 100644 --- a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs +++ b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs @@ -1,4 +1,5 @@ -锘縰sing FlexJobApi.Core; +锘縰sing Aop.Api.Domain; +using FlexJobApi.Core; using Furion.DatabaseAccessor; using Furion.DistributedIDGenerator; using Furion.FriendlyException; @@ -10,6 +11,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; +using TaskInfo = FlexJobApi.Core.TaskInfo; namespace FlexJobApi.FlexJobServer.Application { @@ -17,14 +19,21 @@ /// 浠诲姟鍛戒护澶勭悊鍣� /// </summary> public class TaskInfoCommandHandler( - IRepository<TaskInfo> rep + IRepository<TaskInfo> rep, + IRepository<EnterpriseWallet> repEnterpriseWallet, + AlipayUtils alipayUtils ) : IRequestHandler<SaveTaskInfoCommand, Guid>, IRequestHandler<SetTaskInfoReleaseStatusCommand, int>, IRequestHandler<SetTaskInfoRecommendStatusCommand, int>, - IRequestHandler<DeleteTaskInfoCommand, int> + IRequestHandler<DeleteTaskInfoCommand, int>, + IRequestHandler<SureTaskSettlementOrderCommand, Guid>, + IRequestHandler<RevokeTaskSettlementOrderCommand, Guid>, + IRequestHandler<SureTaskSettlementCommand, Guid> { private readonly IRepository<TaskInfo> rep = rep; + private readonly IRepository<EnterpriseWallet> repEnterpriseWallet = repEnterpriseWallet; + private readonly AlipayUtils alipayUtils = alipayUtils; /// <summary> /// 淇濆瓨浠诲姟 @@ -140,6 +149,133 @@ }, cancellationToken); } + /// <summary> + /// 纭缁撶畻鍗� + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(SureTaskSettlementOrderCommand request, CancellationToken cancellationToken) + { + var entity = await TaskInfoRepository.GetQueryable(rep, false) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.InProcess) throw Oops.Oh(EnumErrorCodeType.s510, "缁撶畻涓笉鍙慨鏀癸紝璇峰厛鎾ゅ洖"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠椾笉鍙慨鏀�"); + entity.SettlementOrderStatus = EnumTaskSettlementOrderStatus.Completed; + entity.SettlementOrderUrl = request.SettlementOrderUrl; + entity.SettlementOrderName = entity.SettlementOrderUrl.Substring(entity.SettlementOrderUrl.LastIndexOf("/") + 1); + entity.SettlementStatus = EnumTaskSettlementStatus.Wait; + entity.SettlementUserCount = request.TaskInfoUsers.Count; + entity.SettlementAmount = request.TaskInfoUsers.Sum(it => it.SettlementAmount ?? 0); + entity.ActualSettlementAmount = request.TaskInfoUsers.Sum(it => it.ActualSettlementAmount ?? 0); + foreach (var model in request.TaskInfoUsers) + { + var user = entity.TaskInfoUsers.FirstOrDefault(it => it.Id == model.Id); + if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, $"鐏靛伐{model.Name}"); + if (user.SettlementStatus == EnumTaskSettlementStatus.InProcess) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}缁撶畻涓笉鍙慨鏀癸紝璇峰厛鎾ゅ洖"); + if (user.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}宸茬粨绠椾笉鍙慨鏀�"); + if (user.CheckReceiveStatus != EnumTaskCheckReceiveStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}鏈獙鏀�"); + if (model.SettlementAmount < 0) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}缁撶畻閲戦涓嶅彲璐熸暟"); + if (model.ActualSettlementAmount < 0) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}瀹炲彂閲戦涓嶅彲璐熸暟"); + if (model.ActualSettlementAmount > 0 && model.ActualSettlementAmount < 1) throw Oops.Oh(EnumErrorCodeType.s510, $"{model.Name}瀹炲彂閲戦涓嶅彲灏忎簬1鍏�"); + user.Bank = model.Bank; + user.BankBranch = model.BankBranch; + user.ReceiveAccount = model.ReceiveAccount; + user.SettlementAmount = model.SettlementAmount; + user.ActualSettlementAmount = model.ActualSettlementAmount; + user.SettlementStatus = EnumTaskSettlementStatus.Wait; + } + await rep.UpdateAsync(entity); + return entity.Id; + } + + /// <summary> + /// 鎾ゅ洖缁撶畻 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(RevokeTaskSettlementOrderCommand request, CancellationToken cancellationToken) + { + var entity = await TaskInfoRepository.GetQueryable(rep, false) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑濮嬬粨绠楋紝璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠椾笉鍙挙鍥�"); + entity.SettlementStatus = EnumTaskSettlementStatus.Wait; + foreach (var user in entity.TaskInfoUsers) + { + if (user.SettlementStatus == EnumTaskSettlementStatus.InProcess) + { + user.SettlementStatus = EnumTaskSettlementStatus.Wait; + } + } + await rep.UpdateAsync(entity); + return entity.Id; + } + + /// <summary> + /// 纭缁撶畻 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public async Task<Guid> Handle(SureTaskSettlementCommand request, CancellationToken cancellationToken) + { + var logier = JwtUtils.GetCurrentLogier(); + var entity = await TaskInfoRepository.GetQueryable(rep, false, logier) + .Include(it => it.TaskInfoUsers) + .Where(it => it.Id == request.TaskInfoId) + .FirstOrDefaultAsync(); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "浠诲姟"); + if (entity.SettlementOrderStatus != EnumTaskSettlementOrderStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s510, "鏈紑濮嬬粨绠楋紝璇峰厛涓婁紶缁撶畻鍗曞苟纭"); + if (entity.SettlementStatus == EnumTaskSettlementStatus.Completed) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粨绠�"); + entity.SettlementStatus = EnumTaskSettlementStatus.InProcess; + entity.SettlementStartTime = DateTime.Now; + foreach (var user in entity.TaskInfoUsers) + { + if (user.SettlementStatus == EnumTaskSettlementStatus.Wait) + { + user.SettlementStatus = EnumTaskSettlementStatus.InProcess; + } + } + var wallet = await repEnterpriseWallet.AsQueryable() + .Where(it => it.EnterpriseId == entity.EnterpriseId && it.Access == EnumEnterpriseWalletAccess.Alipay) + .FirstOrDefaultAsync(); + if (wallet == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘"); + if (wallet.SignStatus != EnumEnterpriseWalletSignStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘鏈绾�"); + if (wallet.AccountBookStatus != EnumEnterpriseWalletAccountBookStatus.Normal) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟閽卞寘璁拌处鏈湭寮�閫�"); + var response = alipayUtils.FundAccountbookQuery(new AlipayFundAccountbookQueryModel + { + AccountBookId = wallet.AccountBookId, + SceneCode = "SATF_FUND_BOOK", + MerchantUserId = wallet.Code, + }); + if (response.IsError) throw Oops.Oh(EnumErrorCodeType.s510, response.SubMsg ?? response.Msg); + wallet.Balance = response.AvailableAmount.ToDecimal() ?? 0; + await repEnterpriseWallet.UpdateAsync(wallet); + + var amount = await TaskInfoRepository.GetQueryable(rep, false, logier) + .Where(it => + it.EnterpriseId == entity.EnterpriseId + && it.Id != request.TaskInfoId + && it.SettlementStatus == EnumTaskSettlementStatus.InProcess + && it.ActualSettlementAmount.HasValue) + .SumAsync(it => it.ActualSettlementAmount!.Value); + amount += entity.ActualSettlementAmount!.Value; + if (wallet.Balance < amount) + throw Oops.Oh(EnumErrorCodeType.s510, "浼佷笟閽卞寘浣欓涓嶈冻"); + + await rep.UpdateAsync(entity); + return entity.Id; + } + private async Task BuildCode(TaskInfo entity) { entity.Code = $"{DateTime.Now:yyyyMMddHHmm}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}"; -- Gitblit v1.9.1