FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Enums/Common/EnumResourceController.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.Core/Utils/StringUtils/StringUtils.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs
New file @@ -0,0 +1,58 @@ using 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; } } } FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs
New file @@ -0,0 +1,43 @@ using 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(); } } } FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs
New file @@ -0,0 +1,34 @@ using 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; } } } FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs
New file @@ -0,0 +1,19 @@ using 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, } } FlexJobApi.Core/Enums/Common/EnumResourceController.cs
@@ -33,6 +33,11 @@ FlexJobServerTaskCheckReceive, /// <summary> /// 编号地址 /// </summary> [ResourceController(EnumResourceService.CommonServer, "CodeUrl")] CommonServerCodeUrls, /// <summary> /// 文件 /// </summary> [ResourceController(EnumResourceService.CommonServer, "FileUtils")] FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs
New file @@ -0,0 +1,31 @@ using 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; } } } FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs
New file @@ -0,0 +1,26 @@ using 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; } } } 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(); } } } 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; }