From 5262f7b77aea5cf8c1543f48b34f311665d61518 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 05 九月 2025 10:58:51 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs                             |   26 +++++
 FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs                                                    |   34 ++++++
 FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs                      |   58 +++++++++++
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |   49 +++++++++
 FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs                                                    |   19 +++
 FlexJobApi.Core/Enums/Common/EnumResourceController.cs                                              |    5 +
 FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs                         |   31 ++++++
 FlexJobApi.Core/Utils/StringUtils/StringUtils.cs                                                    |   19 +++
 FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs                         |   43 ++++++++
 9 files changed, 283 insertions(+), 1 deletions(-)

diff --git a/FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs b/FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs
new file mode 100644
index 0000000..a3c2a4a
--- /dev/null
+++ b/FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs
@@ -0,0 +1,58 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.CommonServer.Application
+{
+    /// <summary>
+    /// 淇濆瓨缂栧彿鍦板潃
+    /// </summary>
+    /// <param name="rep"></param>
+    public class CodeUrlCommandHandler(
+            IRepository<CodeUrl> rep
+        ) :
+        IRequestHandler<SaveCodeUrlCommand, string>
+    {
+        private readonly IRepository<CodeUrl> rep = rep;
+
+        /// <summary>
+        /// 淇濆瓨缂栧彿鍦板潃
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<string> Handle(SaveCodeUrlCommand request, CancellationToken cancellationToken)
+        {
+            var entity = new CodeUrl
+            {
+                Scene = request.Scene,
+                Url = request.Url,
+                ExpiredTime = request.ExpiredTime
+            };
+            await SetCode(entity);
+            await rep.InsertAsync(entity);
+            return entity.Code;
+        }
+
+        private async Task<string> SetCode(CodeUrl entity)
+        {
+            var now = DateTime.Now;
+            entity.Code = $"{StringUtils.GenerateRandomString(5)}";
+            var exist = await rep.AnyAsync(it =>
+                it.Scene == entity.Scene
+                && it.Code == entity.Code
+                && (it.ExpiredTime == null
+                || it.ExpiredTime > now));
+            if (exist)
+            {
+                await SetCode(entity);
+            }
+            return entity.Code;
+        }
+    }
+}
diff --git a/FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs b/FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs
new file mode 100644
index 0000000..5848b3d
--- /dev/null
+++ b/FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs
@@ -0,0 +1,43 @@
+锘縰sing FlexJobApi.Core;
+using Furion.DatabaseAccessor;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.CommonServer.Application
+{
+    /// <summary>
+    /// 鏌ヨ缂栧彿鍦板潃
+    /// </summary>
+    /// <param name="rep"></param>
+    public class CodeUrlQueryHandler(
+            IRepository<CodeUrl> rep
+        ) :
+        IRequestHandler<GetCodeUrlQuery, string?>
+    {
+        private readonly IRepository<CodeUrl> rep = rep;
+
+        /// <summary>
+        /// 鏌ヨ缂栧彿鍦板潃
+        /// </summary>
+        /// <param name="request"></param>
+        /// <param name="cancellationToken"></param>
+        /// <returns></returns>
+        public async Task<string?> Handle(GetCodeUrlQuery request, CancellationToken cancellationToken)
+        {
+            var now = DateTime.Now;
+            return await rep.AsQueryable().AsNoTracking()
+                .Where(it =>
+                    it.Scene == request.Scene
+                    && it.Code == request.Code
+                    && (it.ExpiredTime == null
+                    || it.ExpiredTime > now))
+                .Select(it => it.Url)
+                .FirstOrDefaultAsync();
+        }
+    }
+}
diff --git a/FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs b/FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs
new file mode 100644
index 0000000..4f706f0
--- /dev/null
+++ b/FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs
@@ -0,0 +1,34 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 缂栧彿鍦板潃
+    /// </summary>
+    public class CodeUrl : CommonEntity
+    {
+        /// <summary>
+        /// 鍦烘櫙
+        /// </summary>
+        public EnumCodeUrlScene Scene { get; set; }
+
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍦板潃
+        /// </summary>
+        public string Url { get; set; }
+
+        /// <summary>
+        /// 杩囨湡鏃堕棿
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs b/FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs
new file mode 100644
index 0000000..ddbae08
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs
@@ -0,0 +1,19 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 缂栧彿鍦板潃鍦烘櫙
+    /// </summary>
+    public enum EnumCodeUrlScene
+    {
+        /// <summary>
+        /// 绛剧害鍦板潃
+        /// </summary>
+        ElectronSignUrl = 10,
+    }
+}
diff --git a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
index 655b7a3..7d6350e 100644
--- a/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
+++ b/FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -33,6 +33,11 @@
         FlexJobServerTaskCheckReceive,
 
         /// <summary>
+        /// 缂栧彿鍦板潃
+        /// </summary>
+        [ResourceController(EnumResourceService.CommonServer, "CodeUrl")]
+        CommonServerCodeUrls,
+        /// <summary>
         /// 鏂囦欢
         /// </summary>
         [ResourceController(EnumResourceService.CommonServer, "FileUtils")]
diff --git a/FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs b/FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs
new file mode 100644
index 0000000..9f495d9
--- /dev/null
+++ b/FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs
@@ -0,0 +1,31 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 淇濆瓨缂栧彿鍦板潃
+    /// </summary>
+    [Resource([EnumResourceController.CommonServerCodeUrls])]
+    public class SaveCodeUrlCommand : IRequest<string>
+    {
+        /// <summary>
+        /// 鍦烘櫙
+        /// </summary>
+        public EnumCodeUrlScene Scene { get; set; }
+
+        /// <summary>
+        /// 鍦板潃
+        /// </summary>
+        public string Url { get; set; }
+
+        /// <summary>
+        /// 杩囨湡鏃堕棿
+        /// </summary>
+        public DateTime? ExpiredTime { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs b/FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs
new file mode 100644
index 0000000..5f89c23
--- /dev/null
+++ b/FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs
@@ -0,0 +1,26 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鏌ヨ缂栧彿鍦板潃
+    /// </summary>
+    [Resource([EnumResourceController.CommonServerCodeUrls])]
+    public class GetCodeUrlQuery : IRequest<string?>
+    {
+        /// <summary>
+        /// 鍦烘櫙
+        /// </summary>
+        public EnumCodeUrlScene Scene { get; set; }
+
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs b/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
index a3ffe82..6a3a4b1 100644
--- a/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
+++ b/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
@@ -147,5 +147,24 @@
             }
         }
 
+        /// <summary>
+        /// 鐢熸垚闅忔満瀛楃涓�
+        /// </summary>
+        /// <param name="length"></param>
+        /// <returns></returns>
+        public static string GenerateRandomString(int length)
+        {
+            if (length <= 0) return null;
+            var random = new Random();
+            var chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+            var result = new StringBuilder(length);
+            for (int i = 0; i < length; i++)
+            {
+                // 浠庡瓧绗﹂泦涓殢鏈洪�夋嫨涓�涓瓧绗�
+                int index = random.Next(chars.Length);
+                result.Append(chars[index]);
+            }
+            return result.ToString();
+        }
     }
 }
diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index e807a1b..3b116af 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -39,7 +39,8 @@
             IRepository<ElectronSignSetting> repElectronSignSetting,
             IRepository<ContractTemplate> repContractTemplate,
             IRepository<EnterpriseCost> repEnterpriseCost,
-            IRepository<TaskInfoUser> repTaskInfoUser
+            IRepository<TaskInfoUser> repTaskInfoUser,
+            IRepository<CodeUrl> repCodeUrl
         ) :
         IRequestHandler<ImportEnterpriseEmployeesCommand, ImportEnterpriseEmployeesCommandResult>,
         IRequestHandler<EditEnterpriseEmployeeCommand, Guid>,
@@ -59,6 +60,7 @@
         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>
         /// 瀵煎叆鐏靛伐淇℃伅
@@ -311,6 +313,7 @@
         {
             var logier = JwtUtils.GetCurrentLogier();
             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)
                 .FirstOrDefaultAsync();
@@ -372,6 +375,28 @@
             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.ContactPhoneNumber,
+                    TemplateCode = EnumSmsTemplateCode.ElectronSignUrl,
+                },
+                new
+                {
+                    name = entity.Enterprise.EnterpriseName,
+                    code = code
+                });
+            }
+
             return model;
         }
 
@@ -427,6 +452,28 @@
             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;
         }
 

--
Gitblit v1.9.1