From 96dbcd968f3cd66ac27bd053e6ed67263104ae2f Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期五, 05 九月 2025 14:56:56 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs | 191 +++++++++++++++++++++++++++++++++++++++++++++-- 1 files changed, 183 insertions(+), 8 deletions(-) diff --git a/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs b/FlexJobApi.FlexJobServer.Application/Tasks/Commands/TaskInfoCommandHandler.cs index 29b7036..c5a3dfb 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,13 +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<SetTaskInfoRecommendStatusCommand, 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> /// 淇濆瓨浠诲姟 @@ -37,7 +47,7 @@ { var logier = JwtUtils.GetCurrentLogier(); if (logier.EnterpriseId == null) throw Oops.Oh(EnumErrorCodeType.s400, "褰撳墠鐧诲綍鐢ㄦ埛蹇呴』涓轰紒涓氱敤鎴锋墠鍙互鍒涘缓浠诲姟"); - return await request.SaveData<TaskInfo, SaveTaskInfoCommand>( + var entity = await request.SaveData<TaskInfo, SaveTaskInfoCommand>( q => { q = TaskInfoRepository.GetQueryable(rep, false) @@ -71,6 +81,7 @@ .ToList(); }, cancellationToken); + return entity.Id; } /// <summary> @@ -101,16 +112,180 @@ public async Task<int> Handle(SetTaskInfoRecommendStatusCommand request, CancellationToken cancellationToken) { var entities = await TaskInfoRepository.GetQueryable(rep, false) - .Where(it => request.Ids.Contains(it.Id)) + .Where(it => request.Ids.Contains(it.Id) && it.RecommendStatus != request.RecommendStatus) .ToListAsync(); - foreach (var entity in entities) + if (entities.IsNotNull()) { - entity.RecommendStatus = request.RecommendStatus; + foreach (var entity in entities) + { + entity.RecommendStatus = request.RecommendStatus; + if (entity.RecommendStatus == EnumTaskRecommendStatus.Yes) + { + entity.RecommendTime = DateTime.Now; + } + } + await rep.UpdateAsync(entities); } - await rep.UpdateAsync(entities); return entities.Count; } + /// <summary> + /// 鍒犻櫎浠诲姟 + /// </summary> + /// <param name="request"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public Task<int> Handle(DeleteTaskInfoCommand request, CancellationToken cancellationToken) + { + return request.DeleteData<TaskInfo>( + q => + { + q = TaskInfoRepository.GetQueryable(rep, false); + if (q.AsNoTracking().Any(it => request.Ids.Contains(it.Id) && it.Status == EnumTaskStatus.Complete)) + { + throw Oops.Oh(EnumErrorCodeType.s510, "宸插畨鎺掔殑浠诲姟鏃犳硶鍒犻櫎"); + } + return q; + }, 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 < (decimal)0.3) 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; + } + + foreach (var user in entity.TaskInfoUsers) + { + var model = request.TaskInfoUsers.FirstOrDefault(it => it.Id == user.Id); + if (model == null) + { + user.SettlementStatus = null; + } + } + + 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 == null) 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