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