FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs
@@ -1,5 +1,6 @@ using FlexJobApi.Core; using Furion.DatabaseAccessor; using Mapster; using MediatR; using System; using System.Collections.Generic; @@ -28,12 +29,8 @@ /// <returns></returns> public async Task<string> Handle(SaveCodeUrlCommand request, CancellationToken cancellationToken) { var entity = new CodeUrl { Scene = request.Scene, Url = request.Url, ExpiredTime = request.ExpiredTime }; var entity = new CodeUrl(); request.Adapt(entity); await SetCode(entity); await rep.InsertAsync(entity); return entity.Code; FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs
@@ -1,5 +1,6 @@ using FlexJobApi.Core; using Furion.DatabaseAccessor; using Mapster; using MediatR; using Microsoft.EntityFrameworkCore; using System; @@ -17,7 +18,7 @@ public class CodeUrlQueryHandler( IRepository<CodeUrl> rep ) : IRequestHandler<GetCodeUrlQuery, string?> IRequestHandler<GetCodeUrlQuery, GetCodeUrlQueryResult> { private readonly IRepository<CodeUrl> rep = rep; @@ -27,7 +28,7 @@ /// <param name="request"></param> /// <param name="cancellationToken"></param> /// <returns></returns> public async Task<string?> Handle(GetCodeUrlQuery request, CancellationToken cancellationToken) public async Task<GetCodeUrlQueryResult> Handle(GetCodeUrlQuery request, CancellationToken cancellationToken) { var now = DateTime.Now; return await rep.AsQueryable().AsNoTracking() @@ -36,8 +37,7 @@ && it.Code == request.Code && (it.ExpiredTime == null || it.ExpiredTime > now)) .Select(it => it.Url) .FirstOrDefaultAsync(); .GetDetail<CodeUrl, GetCodeUrlQueryResult>(); } } } FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs
@@ -28,6 +28,31 @@ public string Url { get; set; } /// <summary> /// 参数1 /// </summary> public string ParamValue1 { get; set; } /// <summary> /// 参数2 /// </summary> public string ParamValue2 { get; set; } /// <summary> /// 参数3 /// </summary> public string ParamValue3 { get; set; } /// <summary> /// 参数4 /// </summary> public string ParamValue4 { get; set; } /// <summary> /// 参数5 /// </summary> public string ParamValue5 { get; set; } /// <summary> /// 过期时间 /// </summary> public DateTime? ExpiredTime { get; set; } FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs
@@ -12,6 +12,10 @@ public enum EnumCodeUrlScene { /// <summary> /// 邀请签约 /// </summary> InviteElectronSign = 1, /// <summary> /// 签约地址 /// </summary> ElectronSignUrl = 10, FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs
@@ -24,6 +24,31 @@ public string Url { get; set; } /// <summary> /// 参数1 /// </summary> public string ParamValue1 { get; set; } /// <summary> /// 参数2 /// </summary> public string ParamValue2 { get; set; } /// <summary> /// 参数3 /// </summary> public string ParamValue3 { get; set; } /// <summary> /// 参数4 /// </summary> public string ParamValue4 { get; set; } /// <summary> /// 参数5 /// </summary> public string ParamValue5 { get; set; } /// <summary> /// 过期时间 /// </summary> public DateTime? ExpiredTime { get; set; } FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs
@@ -11,7 +11,7 @@ /// 查询编号地址 /// </summary> [Resource([EnumResourceController.CommonServerCodeUrls])] public class GetCodeUrlQuery : IRequest<string?> public class GetCodeUrlQuery : IRequest<GetCodeUrlQueryResult> { /// <summary> /// 场景 @@ -23,4 +23,41 @@ /// </summary> public string Code { get; set; } } /// <summary> /// 查询编号地址 /// </summary> public class GetCodeUrlQueryResult { /// <summary> /// 地址 /// </summary> public string Url { get; set; } /// <summary> /// 参数1 /// </summary> public string ParamValue1 { get; set; } /// <summary> /// 参数2 /// </summary> public string ParamValue2 { get; set; } /// <summary> /// 参数3 /// </summary> public string ParamValue3 { get; set; } /// <summary> /// 参数4 /// </summary> public string ParamValue4 { get; set; } /// <summary> /// 参数5 /// </summary> public string ParamValue5 { get; set; } } } FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/PersonalUserElectronSignCommand.cs
@@ -10,13 +10,18 @@ /// <summary> /// 个人用户签约 /// </summary> [Resource([EnumResourceController.UserServerEnterpriseEmployee])] [Resource([EnumResourceController.UserServerEnterpriseEmployee], AllowAnonymous = true)] public class PersonalUserElectronSignCommand : IRequest<PersonalUserElectronSignCommandResult> { /// <summary> /// 灵工Id /// 灵工Id(二选一) /// </summary> public Guid Id { get; set; } public Guid? Id { get; set; } /// <summary> /// 邀约短信编号(二选一) /// </summary> public string SmsCode { get; set; } } FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -291,6 +291,13 @@ .ToListAsync(); foreach (var entity in entities) { 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, @@ -299,7 +306,7 @@ new { name = entity.Enterprise.EnterpriseName, code = entity.ContractTemplate.Code code = code }); } return entities.Count; @@ -314,10 +321,31 @@ public async Task<PersonalUserElectronSignCommandResult> Handle(PersonalUserElectronSignCommand request, CancellationToken cancellationToken) { var logier = JwtUtils.GetCurrentLogier(); Guid userId; if (logier != null) { userId = logier.Id; } 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, "请填写灵工Id或短信编号"); } } 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, "企业未发起签约"); @@ -331,7 +359,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, "请先实名"); @@ -340,7 +368,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 =>