sunpengfei
6 天以前 5262f7b77aea5cf8c1543f48b34f311665d61518
feat:开发
6个文件已添加
3个文件已修改
284 ■■■■■ 已修改文件
FlexJobApi.CommonServer.Application/CodeUrls/Commands/CodeUrlCommandHandler.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.CommonServer.Application/CodeUrls/Queries/CodeUrlQueryHandler.cs 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/CommonServer/CodeUrl.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumCodeUrlScene.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumResourceController.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/CommonServer/CodeUrls/Commands/SaveCodeUrlCommand.cs 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/CommonServer/CodeUrls/Queries/GetCodeUrlQuery.cs 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/StringUtils/StringUtils.cs 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs 49 ●●●●● 补丁 | 查看 | 原始文档 | 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;
        }