From e49c42ad641fa7ddaa4250ffd408666b087d1d48 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 29 八月 2025 13:25:26 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |  198 ++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 192 insertions(+), 6 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index ba2e8dd..1836a63 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -1,4 +1,8 @@
 锘縰sing FlexJobApi.Core;
+using FlexJobApi.Core.Models.ElectronSignServer.Common;
+using FlexJobApi.Core.Models.ElectronSignServer.Contracts;
+using FlexJobApi.Core.Models.ElectronSignServer.PersonalUserReals;
+using FlexJobApi.Core.Models.ElectronSignServer.Users;
 using Furion;
 using Furion.DatabaseAccessor;
 using Furion.DataValidation;
@@ -29,16 +33,29 @@
             IMediator mediator,
             IRepository<EnterpriseEmployee> rep,
             IRepository<User> repUser,
-            IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract
+            IRepository<Enterprise> repEnterprise,
+            IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract,
+            IRepository<ElectronSignSetting> repElectronSignSetting,
+            IRepository<ContractTemplate> repContractTemplate,
+            IRepository<EnterpriseCost> repEnterpriseCost,
+            IRepository<TaskInfoUser> repTaskInfoUser
         ) :
         IRequestHandler<ImportEnterpriseEmployeesCommand, ImportEnterpriseEmployeesCommandResult>,
         IRequestHandler<EditEnterpriseEmployeeCommand, Guid>,
-        IRequestHandler<InviteElectronSignCommand, Guid>
+        IRequestHandler<InviteElectronSignCommand, Guid>,
+        IRequestHandler<PersonalUserElectronSignCommand, PersonalUserElectronSignCommandResult>,
+        IRequestHandler<EnterpriseUserElectronSignCommand, EnterpriseUserElectronSignCommandResult>,
+        IRequestHandler<StopElectronSignCommand, Guid>
     {
         private readonly IMediator mediator = mediator;
         private readonly IRepository<EnterpriseEmployee> rep = rep;
         private readonly IRepository<User> repUser = repUser;
+        private readonly IRepository<Enterprise> repEnterprise = repEnterprise;
         private readonly IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract = repEnterpriseEmployeeContract;
+        private readonly IRepository<ElectronSignSetting> repElectronSignSetting = repElectronSignSetting;
+        private readonly IRepository<ContractTemplate> repContractTemplate = repContractTemplate;
+        private readonly IRepository<EnterpriseCost> repEnterpriseCost = repEnterpriseCost;
+        private readonly IRepository<TaskInfoUser> repTaskInfoUser = repTaskInfoUser;
 
         /// <summary>
         /// 瀵煎叆鐏靛伐淇℃伅
@@ -210,14 +227,13 @@
                 .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Id == request.Id)
                 .FirstOrDefaultAsync();
             if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐏靛伐");
-            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, "宸茬绾�");
-            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Effect) throw Oops.Oh(EnumErrorCodeType.s400, "宸茬敓鏁�");
             if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s400, "宸查個璇�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, "宸茬绾�");
             await mediator.Send(new CheckContractTemplateCommand
             {
-                Id = request.Id
+                Id = request.ContractTemplateId
             }, cancellationToken);
-            entity.ContractTemplateId = request.Id;
+            entity.ContractTemplateId = request.ContractTemplateId;
             entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Wait;
             entity.UserSignContractTime = null;
             entity.EnterpriseSignContractStatus = null;
@@ -231,8 +247,178 @@
                 UserSignContractStatus = entity.UserSignContractStatus,
             };
             await repEnterpriseEmployeeContract.InsertAsync(contract);
+            //await mediator.Send(new SaveEnterpriseCostCommand
+            //{
+            //    EnterpriseId = logier.EnterpriseId!.Value,
+            //    ContractTemplateId = request.ContractTemplateId,
+            //    EnterpriseEmployeeContractId = contract.Id,
+            //    Type = EnumEnterpriseCostType.ElectronSign
+            //});
             await rep.UpdateAsync(entity);
             return entity.Id;
         }
+
+        /// <summary>
+        /// 涓汉鐢ㄦ埛绛剧害
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<PersonalUserElectronSignCommandResult> Handle(PersonalUserElectronSignCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var entity = await rep.AsQueryable()
+                .Include(it => it.ContractTemplate).ThenInclude(it => it.Values)
+                .Where(it => it.UserId == logier.Id && it.Id == request.Id)
+                .FirstOrDefaultAsync();
+            if (entity == null) throw Oops.Oh(EnumErrorCodeType.s510, "鏈姤鍚嶈浼佷笟");
+            if (entity.UserSignContractStatus == null) throw Oops.Oh(EnumErrorCodeType.s510, "浼佷笟鏈彂璧风绾�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬绾�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Refuse) throw Oops.Oh(EnumErrorCodeType.s510, "宸叉嫆绛�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Stop) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粓姝�");
+            var contract = await repEnterpriseEmployeeContract.AsQueryable()
+                .OrderByDescending(it => it.CreatedTime)
+                .Where(it => it.EnterpriseEmployeeId == request.Id)
+                .FirstOrDefaultAsync();
+            if (contract == null) throw Oops.Oh(EnumErrorCodeType.s404, "鍚堝悓");
+            var user = await repUser.AsQueryable().AsNoTracking()
+                .Include(it => it.UserAuth)
+                .Where(it => it.Id == logier.Id)
+                .FirstOrDefaultAsync();
+            if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐢ㄦ埛");
+            if (entity.ContractTemplate.Access == EnumElectronSignAccess.BestSign && !user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛瀹炲悕");
+            var result = await new SendContractInput
+            {
+                OutContractId = contract.Id.ToString(),
+                TemplateId = entity.ContractTemplate.ElectronSignContractTemplateId!.Value,
+                Title = entity.ContractTemplate.Name,
+                OutUserId = logier.Id.ToString(),
+                Values = entity.ContractTemplate.Values
+                    .Where(it => it.UserType == EnumUserType.Personal)
+                    .Select(it =>
+                    {
+                        string? value = null;
+                        switch (it.BindProperty)
+                        {
+                            case "Name":
+                                value = user.UserAuth.Name;
+                                break;
+                            case "PhoneNumber":
+                                value = user.ContactPhoneNumber;
+                                break;
+                            case "Identity":
+                                value = user.UserAuth.Identity;
+                                break;
+                            default:
+                                break;
+                        }
+                        return new SendContractInputValue
+                        {
+                            Name = it.Name,
+                            Value = value
+                        };
+                    })
+                    .ToList(),
+                UserCount = 2
+            }.SendHttpAsync<SendContractInput, ElectronSignServerResult<SendContractOutput>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
+            if (result?.Success != true)
+            {
+                throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
+            }
+            return result.Result.Adapt<PersonalUserElectronSignCommandResult>();
+        }
+
+        /// <summary>
+        /// 浼佷笟鐢ㄦ埛绛剧害
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<EnterpriseUserElectronSignCommandResult> Handle(EnterpriseUserElectronSignCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var entity = await rep.AsQueryable()
+                .Include(it => it.ContractTemplate).ThenInclude(it => it.Values)
+                .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Id == request.Id)
+                .FirstOrDefaultAsync();
+            if (entity == null) throw Oops.Oh(EnumErrorCodeType.s510, "鐏靛伐涓嶅瓨鍦�");
+            if (entity.UserSignContractStatus == null) throw Oops.Oh(EnumErrorCodeType.s510, "鏈個璇风绾�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛绛夊緟鐏靛伐绛剧害瀹屾垚");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Refuse) throw Oops.Oh(EnumErrorCodeType.s510, "宸叉嫆绛�");
+            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Stop) throw Oops.Oh(EnumErrorCodeType.s510, "宸茬粓姝�");
+            var contract = await repEnterpriseEmployeeContract.AsQueryable()
+                .OrderByDescending(it => it.CreatedTime)
+                .Where(it => it.EnterpriseEmployeeId == request.Id)
+                .FirstOrDefaultAsync();
+            if (contract == null) throw Oops.Oh(EnumErrorCodeType.s404, "鍚堝悓");
+            var enterprise = await repEnterprise.AsQueryable().AsNoTracking()
+                .Include(it => it.EnterpriseAuth)
+                .Where(it => it.Id == logier.EnterpriseId)
+                .FirstOrDefaultAsync();
+            if (enterprise == null) throw Oops.Oh(EnumErrorCodeType.s404, "浼佷笟");
+            if (entity.ContractTemplate.Access == EnumElectronSignAccess.BestSign && !enterprise.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛瀹炲悕");
+            var result = await new SendContractInput
+            {
+                OutContractId = contract.Id.ToString(),
+                TemplateId = entity.ContractTemplate.ElectronSignContractTemplateId!.Value,
+                Title = entity.ContractTemplate.Name,
+                OutUserId = logier.EnterpriseId.ToString(),
+                Values = entity.ContractTemplate.Values
+                    .Where(it => it.UserType == EnumUserType.Enterprise)
+                    .Select(it => new SendContractInputValue
+                    {
+                        Name = it.Name,
+                    })
+                    .ToList(),
+                UserCount = 2
+            }.SendHttpAsync<SendContractInput, ElectronSignServerResult<SendContractOutput>>(EnumResourceHttpProvider.ElectronSignServerCustomer);
+            if (result?.Success != true)
+            {
+                throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
+            }
+            return result.Result.Adapt<EnterpriseUserElectronSignCommandResult>();
+        }
+
+        /// <summary>
+        /// 鐏靛伐瑙g害
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<Guid> Handle(StopElectronSignCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+            var entity = await rep.AsQueryable()
+                .Where(it => it.EnterpriseId == logier.EnterpriseId && it.Id == request.Id)
+                .FirstOrDefaultAsync();
+            if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐏靛伐");
+            if (entity.UserSignContractStatus != EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, "鏈绾�");
+            entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+            entity.EnterpriseSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+            await rep.UpdateAsync(entity);
+
+            var contract = await repEnterpriseEmployeeContract.AsQueryable()
+                .OrderByDescending(it => it.CreatedTime)
+                .Where(it => it.EnterpriseEmployeeId == entity.Id)
+                .FirstOrDefaultAsync();
+            if (contract == null) throw Oops.Oh(EnumErrorCodeType.s404, "鍚堝悓");
+            contract.UserSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+            contract.EnterpriseSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+            await repEnterpriseEmployeeContract.UpdateAsync(contract);
+
+            var taskUsers = await repTaskInfoUser.AsQueryable()
+                .Where(it => it.EnterpriseEmployeeId == entity.Id && it.HireStatus == EnumTaskUserHireStatus.Pass)
+                .ToListAsync();
+            if (taskUsers.IsNotNull())
+            {
+                foreach (var taskUser in taskUsers)
+                {
+                    taskUser.HireStatus = EnumTaskUserHireStatus.Wait;
+                }
+                await repTaskInfoUser.UpdateAsync(taskUsers);
+            }
+
+            return entity.Id;
+        }
     }
 }

--
Gitblit v1.9.1