sunpengfei
2025-08-14 b495fa9f03462cf6007e1e035a7ed8abe5382c1c
feat:开发
1个文件已添加
7个文件已修改
301 ■■■■■ 已修改文件
FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/FlexJobApi.Core.xml 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Utils/StringUtils/StringUtils.cs 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs
@@ -61,6 +61,11 @@
        public EnumUserGender? Gender { get; set; }
        /// <summary>
        /// 生日
        /// </summary>
        public DateTime? Birthday { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        public int? Age { get; set; }
FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs
New file
@@ -0,0 +1,27 @@
using Furion.DataValidation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FlexJobApi.Core
{
    /// <summary>
    /// 验证类型
    /// </summary>
    [ValidationType]
    public enum EnumValidationTypes
    {
        /// <summary>
        /// 手机号
        /// </summary>
        [ValidationItemMetadata(@"^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$", "手机号格式不正确")]
        PhoneNumber,
        /// <summary>
        /// 身份证号
        /// </summary>
        [ValidationItemMetadata(@"^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])\d{3}(\d|X|x)$", "身份证号格式不正确")]
        Identity,
    }
}
FlexJobApi.Core/FlexJobApi.Core.xml
@@ -1460,6 +1460,11 @@
            性别
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.EnterpriseEmployee.Birthday">
            <summary>
            生日
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.EnterpriseEmployee.Age">
            <summary>
            年龄
@@ -2635,6 +2640,21 @@
            <summary>
            818钱包开通 
            验证码${code},用户您好,您正在进行平台钱包开通,该验证码5分钟内有效,请勿泄露于他人。
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumValidationTypes">
            <summary>
            验证类型
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumValidationTypes.PhoneNumber">
            <summary>
            手机号
            </summary>
        </member>
        <member name="F:FlexJobApi.Core.EnumValidationTypes.Identity">
            <summary>
            身份证号
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.EnumBillingMethod">
@@ -5802,11 +5822,25 @@
            <summary>
            手机号
            </summary>
            <remarks>联系电话</remarks>
        </member>
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandModel.Identity">
            <summary>
            身份证号
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandModel.Birthday">
            <summary>
            生日
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandModel.Age">
            <summary>
            年龄
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandModel.Gender">
            <summary>
            性别
            </summary>
        </member>
        <member name="T:FlexJobApi.Core.ImportEnterpriseEmployeesCommandResult">
@@ -5829,7 +5863,7 @@
            失败数量
            </summary>
        </member>
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandResult.MyProperty">
        <member name="P:FlexJobApi.Core.ImportEnterpriseEmployeesCommandResult.Errors">
            <summary>
            错误信息
            </summary>
@@ -8815,6 +8849,13 @@
            <param name="date">时间</param>
            <returns>日期</returns>
        </member>
        <member name="M:FlexJobApi.Core.DateTimeUtils.GetAge(System.Nullable{System.DateTime})">
            <summary>
            获取年龄
            </summary>
            <param name="birthday"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.DateTimeUtils.TryToDateTimeRange(System.String,FlexJobApi.Core.DateTimeRange@)">
            <summary>
            获取时间范围选择器
@@ -9816,6 +9857,27 @@
            <param name="singularName"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.StringUtils.GetGender(System.String)">
            <summary>
            获取性别
            </summary>
            <param name="identity"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.StringUtils.GetBirthday(System.String)">
            <summary>
            获取生日
            </summary>
            <param name="identity"></param>
            <returns></returns>
        </member>
        <member name="M:FlexJobApi.Core.StringUtils.GetAge(System.String)">
            <summary>
            获取年龄
            </summary>
            <param name="identity"></param>
            <returns></returns>
        </member>
        <member name="T:FlexJobApi.Core.WxmpOptions">
            <summary>
            微信小程序配置
FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs
@@ -1,6 +1,7 @@
using MediatR;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -16,17 +17,22 @@
        /// <summary>
        /// 姓名
        /// </summary>
        [Required]
        public string Name { get; set; }
        /// <summary>
        /// 身份证号
        /// </summary>
        [Required]
        [DataValidation(EnumValidationTypes.Identity)]
        public string Identity { get; set; }
        /// <summary>
        /// 手机号
        /// </summary>
        /// <remarks>联系电话</remarks>
        [Required]
        [DataValidation(EnumValidationTypes.PhoneNumber)]
        public string ContactPhoneNumber { get; set; }
        /// <summary>
FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs
@@ -36,13 +36,30 @@
        /// <summary>
        /// 手机号
        /// </summary>
        /// <remarks>联系电话</remarks>
        public string ContactPhoneNumber { get; set; }
        /// <summary>
        /// 身份证号
        /// </summary>
        public string Identity { get; set; }
        /// <summary>
        /// 生日
        /// </summary>
        [JsonIgnore]
        public DateTime? Birthday { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        [JsonIgnore]
        public int? Age { get; set; }
        /// <summary>
        /// 性别
        /// </summary>
        [JsonIgnore]
        public EnumUserGender? Gender { get; set; }
    }
    /// <summary>
@@ -50,22 +67,30 @@
    /// </summary>
    public class ImportEnterpriseEmployeesCommandResult
    {
        public ImportEnterpriseEmployeesCommandResult()
        {
            Errors = [];
        }
        /// <summary>
        /// 总数
        /// </summary>
        public int TotalCount { get; set; }
        /// <summary>
        /// 成功数量
        /// </summary>
        public int SuccessCount { get; set; }
        /// <summary>
        /// 失败数量
        /// </summary>
        public int FailCount { get; set; }
        /// <summary>
        /// 错误信息
        /// </summary>
        public List<ImportEnterpriseEmployeesCommandResultError> MyProperty { get; set; }
        public List<ImportEnterpriseEmployeesCommandResultError> Errors { get; set; }
    }
    /// <summary>
FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs
@@ -83,6 +83,22 @@
        }
        /// <summary>
        /// 获取年龄
        /// </summary>
        /// <param name="birthday"></param>
        /// <returns></returns>
        public static int? GetAge(this DateTime? birthday)
        {
            if (birthday == null) return null;
            var age = DateTime.Now.Year - birthday.Value.Year;
            if (birthday.Value.Date > DateTime.Today.AddYears(-age))
            {
                age--;
            }
            return age;
        }
        /// <summary>
        /// 获取时间范围选择器
        /// </summary>
        /// <param name="str"></param>
FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
@@ -1,4 +1,5 @@
using Furion.FriendlyException;
using Furion.DataValidation;
using Furion.FriendlyException;
using Mapster.Utils;
using System;
using System.Collections.Generic;
@@ -77,5 +78,68 @@
                return singularName + "s";
            }
        }
        public static bool CheckIsIdentityNumber18(this string identity)
        {
            return identity.IsNotNull() && identity.TryValidate(EnumValidationTypes.Identity).IsValid && identity.Length == 18;
        }
        /// <summary>
        /// 获取性别
        /// </summary>
        /// <param name="identity"></param>
        /// <returns></returns>
        public static EnumUserGender? GetGender(this string identity)
        {
            if (identity.CheckIsIdentityNumber18())
            {
                return identity[16] % 2 == 0
                    ? EnumUserGender.Female
                    : EnumUserGender.Male;
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 获取生日
        /// </summary>
        /// <param name="identity"></param>
        /// <returns></returns>
        public static DateTime? GetBirthday(this string identity)
        {
            if (identity.CheckIsIdentityNumber18())
            {
                return new DateTime(
                    identity.Substring(6, 4).ToInt()!.Value,
                    identity.Substring(10, 2).ToInt()!.Value,
                    identity.Substring(12, 2).ToInt()!.Value);
            }
            else
            {
                return null;
            }
        }
        /// <summary>
        /// 获取年龄
        /// </summary>
        /// <param name="identity"></param>
        /// <returns></returns>
        public static int? GetAge(this string identity)
        {
            if (identity.CheckIsIdentityNumber18())
            {
                var birthday = identity.GetBirthday();
                return birthday.GetAge();
            }
            else
            {
                return null;
            }
        }
    }
}
FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -1,6 +1,7 @@
using FlexJobApi.Core;
using Furion;
using Furion.DatabaseAccessor;
using Furion.DataValidation;
using Furion.FriendlyException;
using Furion.HttpRemote;
using Mapster;
@@ -11,6 +12,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Principal;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
@@ -36,20 +38,91 @@
        /// <returns></returns>
        public async Task<ImportEnterpriseEmployeesCommandResult> Handle(ImportEnterpriseEmployeesCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            var result = new ImportEnterpriseEmployeesCommandResult();
            var models = await request.ExcelUrl.ImportExcelFromOSS<ImportEnterpriseEmployeesCommandModel>();
            var identities = models.DistinctSelect(it => it.Identity);
            var enterpriseEmployees = await rep.AsQueryable()
                .Where(it => it.EnterpriseId == logier.EnterpriseId && identities.Contains(it.Identity))
                .ToListAsync();
            foreach (var model in models)
            {
                var error = new ImportEnterpriseEmployeesCommandResultError();
                var errors = new List<string>();
                if (model.Name.IsNull())
                {
                    errors.Add("请填写姓名");
                }
                if (model.ContactPhoneNumber.IsNull())
                {
                    error.ErrorMessage += "请填写手机号";
                    errors.Add("请填写手机号");
                }
                else if (!Regex.IsMatch(model.ContactPhoneNumber, @"^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$"))
                else if (!model.ContactPhoneNumber.TryValidate(EnumValidationTypes.PhoneNumber).IsValid)
                {
                    error.ErrorMessage += "手机号格式不正确";
                    errors.Add("手机号格式不正确");
                }
                if (model.Identity.IsNull())
                {
                    errors.Add("请填写身份证号");
                }
                else if (!model.Identity.TryValidate(EnumValidationTypes.Identity).IsValid)
                {
                    errors.Add("身份证号格式不正确");
                }
                else if (models.Any(it => it.Identity == model.Identity))
                {
                    errors.Add("身份证号重复");
                }
                else
                {
                    model.Gender = model.Identity.GetGender();
                    model.Birthday = model.Identity.GetBirthday();
                    model.Age = model.Identity.GetAge();
                }
                if (errors.IsNull())
                {
                    var enterpriseEmployee = enterpriseEmployees.FirstOrDefault(it => it.Identity == model.Identity);
                    if (enterpriseEmployee == null)
                    {
                        enterpriseEmployee = new EnterpriseEmployee
                        {
                            EnterpriseId = logier.EnterpriseId!.Value,
                            Name = model.Name,
                            Identity = model.Identity,
                            ContactPhoneNumber = model.ContactPhoneNumber,
                            Gender = model.Gender,
                            Birthday = model.Birthday,
                            Age = model.Age,
                        };
                        await rep.InsertAsync(enterpriseEmployee);
                    }
                    else
                    {
                        if (enterpriseEmployee.UserId.HasValue)
                        {
                            errors.Add("该灵工已报名无法修改信息");
                        }
                        else
                        {
                            enterpriseEmployee.Name = model.Name;
                            enterpriseEmployee.ContactPhoneNumber = model.ContactPhoneNumber;
                            enterpriseEmployee.Gender = model.Gender;
                            enterpriseEmployee.Birthday = model.Birthday;
                            enterpriseEmployee.Age = model.Age;
                            await rep.UpdateAsync(enterpriseEmployee);
                        }
                    }
                }
                if (errors.IsNotNull())
                {
                    var error = model.Adapt<ImportEnterpriseEmployeesCommandResultError>();
                    error.ErrorMessage = errors.SplitJoin(",");
                    result.Errors.Add(error);
                }
            }
            result.TotalCount = models.Count;
            result.FailCount = result.Errors.Count;
            result.SuccessCount = result.TotalCount - result.FailCount;
            return result;
        }
@@ -61,9 +134,10 @@
        /// <returns></returns>
        public Task<Guid> Handle(EditEnterpriseEmployeeCommand request, CancellationToken cancellationToken)
        {
            var logier = JwtUtils.GetCurrentLogier();
            return request.SaveData<EnterpriseEmployee, EditEnterpriseEmployeeCommand>(
                null,
                null,
                q => q.Where(it => it.EnterpriseId == logier.EnterpriseId),
                it => it.EnterpriseId == logier.EnterpriseId && it.Id != request.Id && it.Identity == request.Identity,
                (entity) =>
                {
                    if (request.Id.HasValue && entity.UserId.HasValue)