From b495fa9f03462cf6007e1e035a7ed8abe5382c1c Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期四, 14 八月 2025 13:59:36 +0800
Subject: [PATCH] feat:开发

---
 FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs  |   29 ++++
 FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs     |    6 +
 FlexJobApi.Core/FlexJobApi.Core.xml                                                                 |   66 ++++++++++
 FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs                                                 |   27 ++++
 FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs                                                |   16 ++
 FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs |   86 +++++++++++++-
 FlexJobApi.Core/Utils/StringUtils/StringUtils.cs                                                    |   66 ++++++++++
 FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs                               |    5 
 8 files changed, 290 insertions(+), 11 deletions(-)

diff --git a/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs b/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs
index c64dddf..c7d90cd 100644
--- a/FlexJobApi.Core/Entities/UserServer/Enterprises/EnterpriseEmployee.cs
+++ b/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; }
diff --git a/FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs b/FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs
new file mode 100644
index 0000000..7fcede8
--- /dev/null
+++ b/FlexJobApi.Core/Enums/Common/EnumValidationTypes.cs
@@ -0,0 +1,27 @@
+锘縰sing 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}$", "鎵嬫満鍙锋牸寮忎笉姝g‘")]
+        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,
+    }
+}
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 98aeda5..9f0dd5c 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/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>
             寰俊灏忕▼搴忛厤缃�
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs
index d3a4f04..5c5ad77 100644
--- a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs
+++ b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/EditEnterpriseEmployeeCommand.cs
@@ -1,6 +1,7 @@
 锘縰sing 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>
diff --git a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs b/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs
index 713f542..baa4661 100644
--- a/FlexJobApi.Core/Models/UserServer/EnterpriseEmployees/Commands/ImportEnterpriseEmployeesCommand.cs
+++ b/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>
diff --git a/FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs b/FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs
index 82e3848..8ab5d89 100644
--- a/FlexJobApi.Core/Utils/DateTimeUtils/DateTimeUtils.cs
+++ b/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>
diff --git a/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs b/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
index a303260..287d9cf 100644
--- a/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
+++ b/FlexJobApi.Core/Utils/StringUtils/StringUtils.cs
@@ -1,4 +1,5 @@
-锘縰sing Furion.FriendlyException;
+锘縰sing 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;
+            }
+        }
+
     }
 }
diff --git a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
index 575f837..1dea969 100644
--- a/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
+++ b/FlexJobApi.UserServer.Application/EnterpriseEmployees/Commands/EnterpriseEmployeesCommandHandler.cs
@@ -1,6 +1,7 @@
 锘縰sing 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 += "鎵嬫満鍙锋牸寮忎笉姝g‘";
+                    errors.Add("鎵嬫満鍙锋牸寮忎笉姝g‘");
+                }
+                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)

--
Gitblit v1.9.1