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