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