From 5c45bc53e2c18e45130c21048df4af4896455c6d Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 12 九月 2025 15:58:48 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |  298 +++++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 235 insertions(+), 63 deletions(-)

diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index ecd94d1..71584e7 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -30,6 +30,8 @@
     /// 鐏靛伐鍛戒护澶勭悊鍣�
     /// </summary>
     public class EnterpriseEmployeesCommandHandler(
+            SmsUtils smsUtils,
+            WxmpUtils wxmpUtils,
             IMediator mediator,
             IRepository<EnterpriseEmployee> rep,
             IRepository<User> repUser,
@@ -37,15 +39,20 @@
             IRepository<EnterpriseEmployeeContract> repEnterpriseEmployeeContract,
             IRepository<ElectronSignSetting> repElectronSignSetting,
             IRepository<ContractTemplate> repContractTemplate,
-            IRepository<EnterpriseCost> repEnterpriseCost
+            IRepository<EnterpriseCost> repEnterpriseCost,
+            IRepository<TaskInfoUser> repTaskInfoUser,
+            IRepository<CodeUrl> repCodeUrl
         ) :
         IRequestHandler<ImportEnterpriseEmployeesCommand, ImportEnterpriseEmployeesCommandResult>,
         IRequestHandler<EditEnterpriseEmployeeCommand, Guid>,
-        IRequestHandler<InviteElectronSignCommand, Guid>,
+        IRequestHandler<InviteElectronSignCommand, int>,
         IRequestHandler<PersonalUserElectronSignCommand, PersonalUserElectronSignCommandResult>,
         IRequestHandler<EnterpriseUserElectronSignCommand, EnterpriseUserElectronSignCommandResult>,
-        IRequestHandler<StopElectronSignCommand, Guid>
+        IRequestHandler<StopElectronSignCommand, int>,
+        IRequestHandler<SendInviteElectronSignSmsCommand, int>
     {
+        private readonly SmsUtils smsUtils = smsUtils;
+        private readonly WxmpUtils wxmpUtils = wxmpUtils;
         private readonly IMediator mediator = mediator;
         private readonly IRepository<EnterpriseEmployee> rep = rep;
         private readonly IRepository<User> repUser = repUser;
@@ -54,6 +61,8 @@
         private readonly IRepository<ElectronSignSetting> repElectronSignSetting = repElectronSignSetting;
         private readonly IRepository<ContractTemplate> repContractTemplate = repContractTemplate;
         private readonly IRepository<EnterpriseCost> repEnterpriseCost = repEnterpriseCost;
+        private readonly IRepository<TaskInfoUser> repTaskInfoUser = repTaskInfoUser;
+        private readonly IRepository<CodeUrl> repCodeUrl = repCodeUrl;
 
         /// <summary>
         /// 瀵煎叆鐏靛伐淇℃伅
@@ -94,7 +103,7 @@
                 {
                     errors.Add("璇峰~鍐欒韩浠借瘉鍙�");
                 }
-                else if (!model.Identity.TryValidate(EnumValidationTypes.ValiIdentity).IsValid)
+                else if (!model.Identity.TryValidate(EnumValidationTypes.ValidIdentity).IsValid)
                 {
                     errors.Add("韬唤璇佸彿鏍煎紡涓嶆纭�");
                 }
@@ -161,7 +170,7 @@
                         }
                     }
                 }
-                if (errors.IsNotNull())
+                else
                 {
                     var error = model.Adapt<ImportEnterpriseEmployeesCommandResultError>();
                     error.ErrorMessage = errors.SplitJoin("锛�");
@@ -185,8 +194,13 @@
             var logier = JwtUtils.GetCurrentLogier();
             var entity = await request.SaveData<EnterpriseEmployee, EditEnterpriseEmployeeCommand>(
                 q => q.Where(it => it.EnterpriseId == logier.EnterpriseId),
-                it => it.EnterpriseId == logier.EnterpriseId && it.Id != request.Id && it.Identity == request.Identity,
-                 (entity) =>
+                it => 
+                    it.EnterpriseId == logier.EnterpriseId 
+                    && it.Id != request.Id 
+                    && it.Name == request.Name 
+                    && it.Identity == request.Identity 
+                    && it.ContactPhoneNumber == request.ContactPhoneNumber,
+                (entity) =>
                 {
                     if (request.Id.HasValue && entity.UserId.HasValue)
                     {
@@ -218,43 +232,115 @@
         /// <param name="request"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<Guid> Handle(InviteElectronSignCommand request, CancellationToken cancellationToken)
+        public async Task<int> Handle(InviteElectronSignCommand 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.Wait) throw Oops.Oh(EnumErrorCodeType.s400, "宸查個璇�");
-            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, "宸茬绾�");
-            if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Effect) throw Oops.Oh(EnumErrorCodeType.s400, "宸茬敓鏁�");
+
             await mediator.Send(new CheckContractTemplateCommand
             {
                 Id = request.ContractTemplateId
             }, cancellationToken);
-            entity.ContractTemplateId = request.ContractTemplateId;
-            entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Wait;
-            entity.UserSignContractTime = null;
-            entity.EnterpriseSignContractStatus = null;
-            entity.EnterpriseSignContractTime = null;
-            entity.ContractCode = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
-            var contract = new EnterpriseEmployeeContract
+
+            var entities = await rep.AsQueryable()
+                .Where(it => it.EnterpriseId == logier.EnterpriseId && request.Ids.Contains(it.Id))
+                .ToListAsync();
+            foreach (var id in request.Ids)
             {
-                EnterpriseEmployeeId = entity.Id,
-                ContractTemplateId = entity.ContractTemplateId,
-                ContractCode = entity.ContractCode,
-                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;
+                var entity = entities.FirstOrDefault(it => it.Id == id);
+                if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐏靛伐");
+                if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait) throw Oops.Oh(EnumErrorCodeType.s400, $"宸查個璇穥entity.Name}");
+                if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, $"宸茬绾entity.Name}");
+                entity.ContractTemplateId = request.ContractTemplateId;
+                entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Wait;
+                entity.UserSignContractTime = null;
+                entity.EnterpriseSignContractStatus = null;
+                entity.EnterpriseSignContractTime = null;
+                entity.ContractCode = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
+                entity.ContractUrl = null;
+                var contract = new EnterpriseEmployeeContract
+                {
+                    EnterpriseEmployeeId = entity.Id,
+                    ContractTemplateId = entity.ContractTemplateId,
+                    ContractCode = entity.ContractCode,
+                    UserSignContractStatus = entity.UserSignContractStatus,
+                };
+                await repEnterpriseEmployeeContract.InsertAsync(contract);
+                await rep.UpdateAsync(entity);
+            }
+            return entities.Count;
+        }
+
+        /// <summary>
+        /// 鍙戦�侀個璇风绾︾煭淇�
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<int> Handle(SendInviteElectronSignSmsCommand request, CancellationToken cancellationToken)
+        {
+            var logier = JwtUtils.GetCurrentLogier();
+
+            await mediator.Send(new CheckContractTemplateCommand
+            {
+                Id = request.ContractTemplateId
+            }, cancellationToken);
+
+            var entities = await rep.AsQueryable()
+                .Include(it => it.Enterprise)
+                .Include(it => it.ContractTemplate)
+                .Where(it =>
+                    it.EnterpriseId == logier.EnterpriseId
+                    && request.Ids.Contains(it.Id))
+                .ToListAsync();
+
+            foreach (var id in request.Ids)
+            {
+                var entity = entities.FirstOrDefault(it => it.Id == id);
+                if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐏靛伐");
+                if (entity.UserSignContractStatus == null
+                    || entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Refuse
+                    || entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Stop)
+                {
+                    entity.ContractTemplateId = request.ContractTemplateId;
+                    entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Wait;
+                    entity.UserSignContractTime = null;
+                    entity.EnterpriseSignContractStatus = null;
+                    entity.EnterpriseSignContractTime = null;
+                    entity.ContractCode = $"{DateTime.Now:yyyyMMddHHmmss}{new Random(IDGen.NextID().GetHashCode()).Next(1000, 9999)}";
+                    entity.ContractUrl = null;
+                    var contract = new EnterpriseEmployeeContract
+                    {
+                        EnterpriseEmployeeId = entity.Id,
+                        ContractTemplateId = entity.ContractTemplateId,
+                        ContractCode = entity.ContractCode,
+                        UserSignContractStatus = entity.UserSignContractStatus,
+                    };
+                    await repEnterpriseEmployeeContract.InsertAsync(contract);
+                    await rep.UpdateAsync(entity);
+                }
+                if (entity.UserSignContractStatus == EnumTaskUserSignContractStatus.Wait)
+                {
+                    var codeUrl = new SaveCodeUrlCommand
+                    {
+                        Scene = EnumCodeUrlScene.InviteElectronSign,
+                        ParamValue1 = entity.Id.ToString(),
+                        ExpiredTime = DateTime.Now.AddMonths(1)
+                    };
+                    var code = await mediator.Send(codeUrl);
+                    await smsUtils.Send(new SendSmsModel
+                    {
+                        PhoneNumber = entity.ContactPhoneNumber,
+                        TemplateCode = EnumSmsTemplateCode.InviteElectronSign,
+                    },
+                    new
+                    {
+                        name = entity.Enterprise.EnterpriseName,
+                        code = code
+                    });
+                }
+            }
+
+            return entities.Count;
         }
 
         /// <summary>
@@ -265,15 +351,30 @@
         /// <returns></returns>
         public async Task<PersonalUserElectronSignCommandResult> Handle(PersonalUserElectronSignCommand request, CancellationToken cancellationToken)
         {
-            var logier = JwtUtils.GetCurrentLogier();
+            if (request.Id == null)
+            {
+                if (request.SmsCode.IsNotNull())
+                {
+                    var codeUrl = await mediator.Send(new GetCodeUrlQuery
+                    {
+                        Code = request.SmsCode,
+                        Scene = EnumCodeUrlScene.InviteElectronSign
+                    });
+                    request.Id = codeUrl.ParamValue1.ToGuid()!;
+                }
+                else
+                {
+                    throw Oops.Oh(EnumErrorCodeType.s400, "璇峰~鍐欑伒宸d鎴栫煭淇$紪鍙�");
+                }
+            }
             var entity = await rep.AsQueryable()
+                .Include(it => it.Enterprise)
                 .Include(it => it.ContractTemplate).ThenInclude(it => it.Values)
-                .Where(it => it.UserId == logier.Id && it.Id == request.Id)
+                .Where(it => 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.Effect) 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()
@@ -283,7 +384,7 @@
             if (contract == null) throw Oops.Oh(EnumErrorCodeType.s404, "鍚堝悓");
             var user = await repUser.AsQueryable().AsNoTracking()
                 .Include(it => it.UserAuth)
-                .Where(it => it.Id == logier.Id)
+                .Where(it => it.Id == entity.UserId)
                 .FirstOrDefaultAsync();
             if (user == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐢ㄦ埛");
             if (entity.ContractTemplate.Access == EnumElectronSignAccess.BestSign && !user.IsReal) throw Oops.Oh(EnumErrorCodeType.s510, "璇峰厛瀹炲悕");
@@ -292,7 +393,7 @@
                 OutContractId = contract.Id.ToString(),
                 TemplateId = entity.ContractTemplate.ElectronSignContractTemplateId!.Value,
                 Title = entity.ContractTemplate.Name,
-                OutUserId = logier.Id.ToString(),
+                OutUserId = entity.UserId.ToString(),
                 Values = entity.ContractTemplate.Values
                     .Where(it => it.UserType == EnumUserType.Personal)
                     .Select(it =>
@@ -325,7 +426,33 @@
             {
                 throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
             }
-            return result.Result.Adapt<PersonalUserElectronSignCommandResult>();
+            var model = result.Result.Adapt<PersonalUserElectronSignCommandResult>();
+            model.SignContractLongUrl = model.SignContractLongUrl
+                .Replace("https://openapi.bestsign.info:443", "https://wx115.bestsign.info")
+                .Replace("https://openapi.bestsign.cn:443", "https://wx115.bestsign.cn");
+
+            if (request.SmsCode.IsNull() && entity.ContractTemplate.Access == EnumElectronSignAccess.AlipaySign)
+            {
+                var codeUrl = new SaveCodeUrlCommand
+                {
+                    Scene = EnumCodeUrlScene.ElectronSignUrl,
+                    Url = model.SignContractLongUrl,
+                    ExpiredTime = DateTime.Now.AddMonths(1)
+                };
+                var code = await mediator.Send(codeUrl);
+                await smsUtils.Send(new SendSmsModel
+                {
+                    PhoneNumber = entity.ContactPhoneNumber,
+                    TemplateCode = EnumSmsTemplateCode.ElectronSignUrl,
+                },
+                new
+                {
+                    name = entity.Enterprise.EnterpriseName,
+                    code = code
+                });
+            }
+
+            return model;
         }
 
         /// <summary>
@@ -344,7 +471,6 @@
             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.Effect) 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()
@@ -377,7 +503,33 @@
             {
                 throw Oops.Oh(EnumErrorCodeType.s510, result?.Message ?? "绛剧害澶辫触");
             }
-            return result.Result.Adapt<EnterpriseUserElectronSignCommandResult>();
+            var model = result.Result.Adapt<EnterpriseUserElectronSignCommandResult>();
+            model.SignContractLongUrl = model.SignContractLongUrl
+                .Replace("https://openapi.bestsign.info:443", "https://wx115.bestsign.info")
+                .Replace("https://openapi.bestsign.cn:443", "https://wx115.bestsign.cn");
+
+            if (entity.ContractTemplate.Access == EnumElectronSignAccess.AlipaySign)
+            {
+                var codeUrl = new SaveCodeUrlCommand
+                {
+                    Scene = EnumCodeUrlScene.ElectronSignUrl,
+                    Url = model.SignContractLongUrl,
+                    ExpiredTime = DateTime.Now.AddMonths(1)
+                };
+                var code = await mediator.Send(codeUrl);
+                await smsUtils.Send(new SendSmsModel
+                {
+                    PhoneNumber = entity.Enterprise.ContactPhoneNumber,
+                    TemplateCode = EnumSmsTemplateCode.ElectronSignUrl,
+                },
+                new
+                {
+                    name = entity.Name,
+                    code = code
+                });
+            }
+
+            return model;
         }
 
         /// <summary>
@@ -386,27 +538,47 @@
         /// <param name="request"></param>
         /// <param name="cancellationToken"></param>
         /// <returns></returns>
-        public async Task<Guid> Handle(StopElectronSignCommand request, CancellationToken cancellationToken)
+        public async Task<int> 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.Effect) throw Oops.Oh(EnumErrorCodeType.s400, "鏈敓鏁�");
-            entity.UserSignContractStatus = EnumTaskUserSignContractStatus.Stop;
-            entity.EnterpriseSignContractStatus = EnumTaskUserSignContractStatus.Stop;
-            await rep.UpdateAsync(entity);
+            var entities = await rep.AsQueryable()
+                .Include(it => it.Contracts)
+                .Where(it => it.EnterpriseId == logier.EnterpriseId && request.Ids.Contains(it.Id))
+                .ToListAsync();
+            foreach (var id in request.Ids)
+            {
+                var entity = entities.FirstOrDefault(it => it.Id == id);
+                if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鐏靛伐");
+                if (entity.UserSignContractStatus != EnumTaskUserSignContractStatus.Pass) throw Oops.Oh(EnumErrorCodeType.s400, $"鏈绾entity.Name}");
+                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 (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, "鍚堝悓");
-            contract.UserSignContractStatus = EnumTaskUserSignContractStatus.Stop;
-            contract.EnterpriseSignContractStatus = EnumTaskUserSignContractStatus.Stop;
-            await repEnterpriseEmployeeContract.UpdateAsync(contract);
-            return entity.Id;
+                var contract = entity.Contracts
+                    .OrderByDescending(it => it.CreatedTime)
+                    .FirstOrDefault();
+                if (contract == null) throw Oops.Oh(EnumErrorCodeType.s404, $"涓巤entity.Name}鐨勫悎鍚�");
+                contract.UserSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+                contract.EnterpriseSignContractStatus = EnumTaskUserSignContractStatus.Stop;
+                await repEnterpriseEmployeeContract.UpdateAsync(contract);
+            }
+
+            var taskUsers = await repTaskInfoUser.AsQueryable()
+                .Where(it =>
+                    it.HireStatus == EnumTaskUserHireStatus.Pass
+                    && request.Ids.Contains(it.EnterpriseEmployeeId))
+                .ToListAsync();
+            if (taskUsers.IsNotNull())
+            {
+                foreach (var taskUser in taskUsers)
+                {
+                    taskUser.HireStatus = EnumTaskUserHireStatus.Wait;
+                }
+                await repTaskInfoUser.UpdateAsync(taskUsers);
+            }
+
+            return entities.Count;
         }
+
     }
 }

--
Gitblit v1.9.1