From ab0248d73d7faef3c8e1a07f766ebbc23f995631 Mon Sep 17 00:00:00 2001 From: fuenmao <980740792@qq.com> Date: Fri, 18 Sep 2026 10:53:46 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=9B=B8=E5=85=B3=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Audit/OnboardingAuditService.cs | 16 ++++ .../Employee/OnboardingEmployeeService.cs | 75 +++++++++++++++++- SimpleAdmin.Web.Core/Upload/员工导出模版.xlsx | Bin 6188 -> 6139 bytes 3 files changed, 90 insertions(+), 1 deletion(-) diff --git a/SimpleAdmin.Application/Services/Onboarding/Audit/OnboardingAuditService.cs b/SimpleAdmin.Application/Services/Onboarding/Audit/OnboardingAuditService.cs index 2db0711..68a4909 100644 --- a/SimpleAdmin.Application/Services/Onboarding/Audit/OnboardingAuditService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/Audit/OnboardingAuditService.cs @@ -58,6 +58,22 @@ public class OnboardingAuditService : IOnboardingAuditService var contractStartDate = await ResolveContractStartDate(task.Id); var employee = employeeInfo.Adapt(); + if (string.IsNullOrWhiteSpace(employee.EmployeeNo)) + { + var taskContractIds = await _db.Queryable() + .Where(item => item.TaskId == task.Id) + .Select(item => item.Id) + .ToListAsync(); + + if (taskContractIds.Count > 0) + { + employee.EmployeeNo = await _db.Queryable() + .Where(item => taskContractIds.Contains(item.TaskContractId) && item.VariableCode == "hr.EmployeeNo" && item.VariableValue != null && item.VariableValue != "") + .OrderBy(item => item.SortCode) + .Select(item => item.VariableValue) + .FirstAsync(); + } + } employee.Id = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(); employee.CompanyId = task.CompanyId; employee.DepartmentId = task.DepartmentId; diff --git a/SimpleAdmin.Application/Services/Onboarding/Employee/OnboardingEmployeeService.cs b/SimpleAdmin.Application/Services/Onboarding/Employee/OnboardingEmployeeService.cs index ea2e11f..fc50873 100644 --- a/SimpleAdmin.Application/Services/Onboarding/Employee/OnboardingEmployeeService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/Employee/OnboardingEmployeeService.cs @@ -167,6 +167,40 @@ public class OnboardingEmployeeService : IOnboardingEmployeeService .OrderBy(item => item.CreateTime) .OrderBy(item => item.Id) .ToListAsync(); + + if (string.IsNullOrWhiteSpace(employee.EmployeeNo)) + { + var snapshotEmployeeNo = contractSnapshots + .Select(item => item.EmployeeNo) + .FirstOrDefault(val => !string.IsNullOrWhiteSpace(val)); + + if (string.IsNullOrWhiteSpace(snapshotEmployeeNo)) + { + snapshotEmployeeNo = contractSnapshots + .Select(item => ExtractEmployeeNoFromVariables(item.VariablesJson)) + .FirstOrDefault(val => !string.IsNullOrWhiteSpace(val)); + } + + if (string.IsNullOrWhiteSpace(snapshotEmployeeNo) && contracts.Count > 0) + { + var contractIds = contracts.Select(c => c.Id).ToList(); + snapshotEmployeeNo = await _db.Queryable() + .Where(item => contractIds.Contains(item.TaskContractId) && item.VariableCode == "hr.EmployeeNo" && item.VariableValue != null && item.VariableValue != "") + .OrderBy(item => item.SortCode) + .Select(item => item.VariableValue) + .FirstAsync(); + } + + if (!string.IsNullOrWhiteSpace(snapshotEmployeeNo)) + { + employee.EmployeeNo = snapshotEmployeeNo; + await _db.Updateable() + .SetColumns(item => new ObEmployee { EmployeeNo = snapshotEmployeeNo }) + .Where(item => item.Id == employee.Id && (item.EmployeeNo == null || item.EmployeeNo == "")) + .ExecuteCommandAsync(); + } + } + var materials = await GetEmployeeMaterials(task?.Id); var electronicSignProcess = task == null ? null @@ -858,7 +892,9 @@ public class OnboardingEmployeeService : IOnboardingEmployeeService if (value != null) cell.Value = value; - var templateNumberFormat = worksheet.Cells[1, templateColumn.Index] + // 表头可能因复制粘贴带有日期等显示格式;数据格式应读取模板数据行, + // 未配置时再使用字段类型定义的默认格式,避免薪资数值显示成日期。 + var templateNumberFormat = worksheet.Cells[2, templateColumn.Index] .Style.Numberformat.Format; cell.Style.Numberformat.Format = string.IsNullOrWhiteSpace(templateNumberFormat) || string.Equals( @@ -1113,6 +1149,43 @@ public class OnboardingEmployeeService : IOnboardingEmployeeService } } + private static string ExtractEmployeeNoFromVariables(string variablesJson) + { + if (string.IsNullOrWhiteSpace(variablesJson)) + return null; + + try + { + using var doc = global::System.Text.Json.JsonDocument.Parse(variablesJson); + var root = doc.RootElement; + if (root.ValueKind == global::System.Text.Json.JsonValueKind.Object) + { + foreach (var prop in root.EnumerateObject()) + { + if (string.Equals(prop.Name, "hr.EmployeeNo", StringComparison.OrdinalIgnoreCase)) + { + if (prop.Value.ValueKind == global::System.Text.Json.JsonValueKind.Object + && prop.Value.TryGetProperty("variableValue", out var valProp) + && valProp.ValueKind == global::System.Text.Json.JsonValueKind.String) + { + return valProp.GetString(); + } + if (prop.Value.ValueKind == global::System.Text.Json.JsonValueKind.String) + { + return prop.Value.GetString(); + } + } + } + } + } + catch + { + // 忽略异常 JSON + } + + return null; + } + private static DateTime? ParseDate(string value) { return DateTime.TryParse(value, out var date) ? date.Date : null; diff --git a/SimpleAdmin.Web.Core/Upload/员工导出模版.xlsx b/SimpleAdmin.Web.Core/Upload/员工导出模版.xlsx index 08b352cc48b0e1fccedc349d820f6488be7c7b9b..ef16bc6ec3b55b4b164bb7589e50270ed4be8575 100644 GIT binary patch delta 1915 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