From 80940c60a5202d48546c68cb7f5685ea5d770a95 Mon Sep 17 00:00:00 2001 From: fuenmao <980740792@qq.com> Date: Thu, 27 Aug 2026 16:27:08 +0800 Subject: [PATCH] 1111 --- .../Onboarding/ObTaskContractVariable.cs | 5 + .../OnboardingContractSnapshotService.cs | 1 + .../OnboardingContractTemplateService.cs | 4 +- .../OnboardingTaskContractVariableInput.cs | 5 + .../OnboardingTaskContractVariableService.cs | 4 +- .../System/Resource/ResourceService.cs | 15 ++- .../Onboarding/OnboardingAuditController.cs | 4 + .../Onboarding/OnboardingCompanyController.cs | 8 ++ .../OnboardingContractDocumentController.cs | 3 + .../OnboardingContractTemplateController.cs | 10 ++ .../OnboardingDepartmentController.cs | 8 ++ .../OnboardingEmployeeController.cs | 3 + .../OnboardingEntryConfigController.cs | 7 ++ .../OnboardingMaterialReviewController.cs | 3 + .../OnboardingPositionController.cs | 9 ++ ...nboardingTaskContractVariableController.cs | 4 + .../Onboarding/OnboardingTaskController.cs | 2 + .../OnboardingTaskLifecycleController.cs | 4 + .../OnboardingTaskQueryController.cs | 4 + .../OnboardingTemplateController.cs | 7 ++ .../OnboardingVariableDefinitionController.cs | 7 ++ ..._task_contract_variable_sort_migration.sql | 109 ++++++++++++++++++ 22 files changed, 218 insertions(+), 8 deletions(-) create mode 100644 database/migrations/20260828_task_contract_variable_sort_migration.sql diff --git a/SimpleAdmin.Application/Entity/Onboarding/ObTaskContractVariable.cs b/SimpleAdmin.Application/Entity/Onboarding/ObTaskContractVariable.cs index 4bf9b21..63ecfea 100644 --- a/SimpleAdmin.Application/Entity/Onboarding/ObTaskContractVariable.cs +++ b/SimpleAdmin.Application/Entity/Onboarding/ObTaskContractVariable.cs @@ -42,6 +42,11 @@ public class ObTaskContractVariable : BaseEntity /// public string DataType { get; set; } + /// + /// 变量在任务合同中的展示顺序,创建任务时从模板变量复制并固定。 + /// + public int SortCode { get; set; } = 100; + /// /// 合同生成时使用的最终变量值。 /// diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractSnapshot/OnboardingContractSnapshotService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractSnapshot/OnboardingContractSnapshotService.cs index dc37328..34d3dfb 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractSnapshot/OnboardingContractSnapshotService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractSnapshot/OnboardingContractSnapshotService.cs @@ -53,6 +53,7 @@ public class OnboardingContractSnapshotService : IOnboardingContractSnapshotServ VariableName = definition.VariableName, VariableType = definition.VariableType, DataType = definition.DataType, + SortCode = definition.SortCode ?? 100, VariableValue = preserveManual ? old.VariableValue : ResolveValue(definition, employeeInfo, dynamicValueMap, company, task), diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs index 4bf1b99..a13599b 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs @@ -411,9 +411,11 @@ public class OnboardingContractTemplateService : DbRepository public string DataType { get; set; } + /// + /// 任务创建时保存的变量展示顺序。 + /// + public int SortCode { get; set; } + /// /// 任务合同变量最终值。 /// diff --git a/SimpleAdmin.Application/Services/Onboarding/TaskContractVariable/OnboardingTaskContractVariableService.cs b/SimpleAdmin.Application/Services/Onboarding/TaskContractVariable/OnboardingTaskContractVariableService.cs index 6bc5c09..78c61ee 100644 --- a/SimpleAdmin.Application/Services/Onboarding/TaskContractVariable/OnboardingTaskContractVariableService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/TaskContractVariable/OnboardingTaskContractVariableService.cs @@ -43,7 +43,8 @@ public class OnboardingTaskContractVariableService : IOnboardingTaskContractVari Variables = variables .Where(variable => variable.TaskContractId == contract.Id) - .OrderBy(variable => variable.VariableCode) + .OrderBy(variable => variable.SortCode) + .ThenBy(variable => variable.VariableCode) .Select(variable => { var definition = definitions.FirstOrDefault(x => @@ -59,6 +60,7 @@ public class OnboardingTaskContractVariableService : IOnboardingTaskContractVari VariableName = variable.VariableName, VariableType = variable.VariableType, DataType = variable.DataType, + SortCode = variable.SortCode, VariableValue = variable.VariableValue, Required = definition?.Required == true, HrEditable = hrEditable, diff --git a/SimpleAdmin.System/Services/System/Resource/ResourceService.cs b/SimpleAdmin.System/Services/System/Resource/ResourceService.cs index ccaf7b3..5655ae9 100644 --- a/SimpleAdmin.System/Services/System/Resource/ResourceService.cs +++ b/SimpleAdmin.System/Services/System/Resource/ResourceService.cs @@ -1,4 +1,4 @@ -// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 +// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 // // SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: // 1.请不要删除和修改根目录下的LICENSE文件。 @@ -183,15 +183,18 @@ public class ResourceService : DbRepository, IResourceService foreach (var controller in controllerTypes) { var apiAttribute = controller.GetCustomAttribute();//获取接口描述特性 - var tag = apiAttribute.Tag;//获取标签 + var tag = apiAttribute?.Tag;//获取标签 //获取数据权限特性 var routeAttributes = controller.GetCustomAttributes().ToList(); - if (routeAttributes == null) + if (routeAttributes == null || routeAttributes.Count == 0) continue; - var route = routeAttributes[0];//取第一个值 + var route = routeAttributes[0];//取第一个值作为生成接口路由的基础 var routeName = GetRouteName(controller.Name, route.Template);//赋值路由名称 - //如果路由包含在路由列表中 - if (routes.Contains(routeName)) + //如果路由包含在路由列表中,或支持前缀/多路由匹配 + var isMatched = routeAttributes.Any(ra => routes.Contains(GetRouteName(controller.Name, ra.Template))) + || routes.Contains(routeName) + || routes.Any(r => !string.IsNullOrEmpty(r) && routeName.StartsWith(r)); + if (isMatched) { //获取所有方法 var methods = controller.GetMethods(); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingAuditController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingAuditController.cs index 004ba88..eacd0c3 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingAuditController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingAuditController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职审核")] [Route("biz/onboarding/audit")] +[Route("biz/onboarding/task")] [RolePermission] public class OnboardingAuditController { @@ -19,6 +21,7 @@ public class OnboardingAuditController /// 审核通过任务并创建正式员工档案。 /// [HttpPost("approve")] + [DisplayName("审核通过入职任务")] public async Task Approve([FromBody] OnboardingAuditActionInput input) { await _service.Approve(input); @@ -28,6 +31,7 @@ public class OnboardingAuditController /// 退回任务并要求候选人补充资料。 /// [HttpPost("reject")] + [DisplayName("退回修改入职任务")] public async Task Reject([FromBody] OnboardingAuditActionInput input) { await _service.Reject(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingCompanyController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingCompanyController.cs index da2b7da..8675f31 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingCompanyController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingCompanyController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职公司管理")] [Route("biz/onboarding/company")] +[Route("biz/onboarding/setup")] [RolePermission] public class OnboardingCompanyController { @@ -19,6 +21,7 @@ public class OnboardingCompanyController /// 分页查询入职业务公司。 /// [HttpGet("page")] + [DisplayName("分页查询入职公司")] public async Task Page([FromQuery] OnboardingCompanyPageInput input) { return await _service.Page(input); @@ -28,6 +31,7 @@ public class OnboardingCompanyController /// 查询已启用公司列表。 /// [HttpGet("list-enabled")] + [DisplayName("查询已启用公司列表")] public async Task ListEnabled() { return await _service.ListEnabled(); @@ -37,6 +41,7 @@ public class OnboardingCompanyController /// 查询公司详情。 /// [HttpGet("detail")] + [DisplayName("查询入职公司详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -46,6 +51,7 @@ public class OnboardingCompanyController /// 新增入职业务公司。 /// [HttpPost("add")] + [DisplayName("新增入职业务公司")] public async Task Add([FromBody] OnboardingCompanyAddInput input) { await _service.Add(input); @@ -55,6 +61,7 @@ public class OnboardingCompanyController /// 编辑入职业务公司。 /// [HttpPost("edit")] + [DisplayName("编辑入职业务公司")] public async Task Edit([FromBody] OnboardingCompanyEditInput input) { await _service.Edit(input); @@ -64,6 +71,7 @@ public class OnboardingCompanyController /// 删除入职业务公司。 /// [HttpPost("delete")] + [DisplayName("删除入职业务公司")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractDocumentController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractDocumentController.cs index d17dbc0..5ccc719 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractDocumentController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractDocumentController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职合同文件")] [Route("biz/onboarding/contract-document")] +[Route("biz/onboarding/task")] [RolePermission] public class OnboardingContractDocumentController { @@ -20,6 +22,7 @@ public class OnboardingContractDocumentController /// 生成入职合同文件 /// [HttpPost("generate")] + [DisplayName("手动生成合同文件")] public async Task Generate( [FromBody] OnboardingGenerateContractInput input) { diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs index 84f7e24..9f9cc83 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职合同模板")] [Route("biz/onboarding/contract-template")] +[Route("biz/onboarding/contract")] [RolePermission] public class OnboardingContractTemplateController { @@ -25,6 +27,7 @@ public class OnboardingContractTemplateController [HttpPost("file/upload-docx")] [Consumes("multipart/form-data")] [RequestSizeLimit(20 * 1024 * 1024)] + [DisplayName("上传合同DOCX模板")] public async Task UploadDocx([FromForm] IFormFile file) { if (file == null || file.Length == 0) @@ -41,6 +44,7 @@ public class OnboardingContractTemplateController /// 分页查询合同模板。 /// [HttpGet("page")] + [DisplayName("分页查询合同模板")] public async Task Page([FromQuery] OnboardingContractTemplatePageInput input) { return await _service.Page(input); @@ -50,6 +54,7 @@ public class OnboardingContractTemplateController /// 查询合同模板详情。 /// [HttpGet("detail")] + [DisplayName("查询合同模板详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -68,6 +73,7 @@ public class OnboardingContractTemplateController /// 新增合同模板。 /// [HttpPost("add")] + [DisplayName("新增合同业务模板")] public async Task Add([FromBody] OnboardingContractTemplateAddInput input) { await _service.Add(input); @@ -77,6 +83,7 @@ public class OnboardingContractTemplateController /// 编辑合同模板。 /// [HttpPost("edit")] + [DisplayName("编辑合同业务模板")] public async Task Edit([FromBody] OnboardingContractTemplateEditInput input) { await _service.Edit(input); @@ -86,6 +93,7 @@ public class OnboardingContractTemplateController /// 删除合同模板。 /// [HttpPost("delete")] + [DisplayName("删除合同业务模板")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); @@ -95,6 +103,7 @@ public class OnboardingContractTemplateController /// 分页查询合同模板版本。 /// [HttpGet("version/page")] + [DisplayName("分页查询合同版本")] public async Task VersionPage([FromQuery] OnboardingContractVersionPageInput input) { return await _service.VersionPage(input); @@ -131,6 +140,7 @@ public class OnboardingContractTemplateController /// 分页查询模板变量。 /// [HttpGet("variable/page")] + [DisplayName("分页查询合同变量")] public async Task VariablePage([FromQuery] OnboardingTemplateVariablePageInput input) { return await _service.VariablePage(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingDepartmentController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingDepartmentController.cs index 5ac31f7..7202774 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingDepartmentController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingDepartmentController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ /// [ApiDescriptionSettings("Application", Tag = "入职部门管理")] [Route("biz/onboarding/department")] +[Route("biz/onboarding/setup")] [RolePermission] public class OnboardingDepartmentController { @@ -19,6 +21,7 @@ public class OnboardingDepartmentController /// 分页查询入职业务部门。 /// [HttpGet("page")] + [DisplayName("分页查询入职部门")] public async Task Page([FromQuery] OnboardingDepartmentPageInput input) { return await _service.Page(input); @@ -28,6 +31,7 @@ public class OnboardingDepartmentController /// 查询指定公司的已启用部门。 /// [HttpGet("list-enabled")] + [DisplayName("查询已启用部门列表")] public async Task ListEnabled([FromQuery] long companyId) { return await _service.ListEnabled(companyId); @@ -37,6 +41,7 @@ public class OnboardingDepartmentController /// 查询部门详情。 /// [HttpGet("detail")] + [DisplayName("查询入职部门详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -46,6 +51,7 @@ public class OnboardingDepartmentController /// 新增入职业务部门。 /// [HttpPost("add")] + [DisplayName("新增入职业务部门")] public async Task Add([FromBody] OnboardingDepartmentAddInput input) { await _service.Add(input); @@ -55,6 +61,7 @@ public class OnboardingDepartmentController /// 编辑入职业务部门。 /// [HttpPost("edit")] + [DisplayName("编辑入职业务部门")] public async Task Edit([FromBody] OnboardingDepartmentEditInput input) { await _service.Edit(input); @@ -64,6 +71,7 @@ public class OnboardingDepartmentController /// 批量删除入职业务部门。 /// [HttpPost("delete")] + [DisplayName("删除入职业务部门")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEmployeeController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEmployeeController.cs index 4261250..6607e33 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEmployeeController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEmployeeController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -19,6 +20,7 @@ public class OnboardingEmployeeController /// 分页查询正式员工档案。 /// [HttpGet("page")] + [DisplayName("分页查询正式员工档案")] public async Task Page([FromQuery] OnboardingEmployeePageInput input) { return await _service.Page(input); @@ -28,6 +30,7 @@ public class OnboardingEmployeeController /// 查询正式员工详情及来源记录。 /// [HttpGet("detail")] + [DisplayName("查询正式员工详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEntryConfigController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEntryConfigController.cs index d1ae1c0..d72c579 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEntryConfigController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingEntryConfigController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -19,6 +20,7 @@ public class OnboardingEntryConfigController /// 查询动态入职字段。 /// [HttpGet("form-field/list")] + [DisplayName("查询动态字段列表")] public async Task ListFormFields() { return await _service.ListFormFields(); @@ -28,6 +30,7 @@ public class OnboardingEntryConfigController /// 保存动态入职字段。 /// [HttpPost("form-field/save")] + [DisplayName("保存动态入职字段")] public async Task SaveFormField([FromBody] OnboardingFormFieldSaveInput input) { await _service.SaveFormField(input); @@ -37,6 +40,7 @@ public class OnboardingEntryConfigController /// 删除动态入职字段。 /// [HttpPost("form-field/delete")] + [DisplayName("删除动态入职字段")] public async Task DeleteFormFields([FromBody] BaseIdListInput input) { await _service.DeleteFormFields(input); @@ -46,6 +50,7 @@ public class OnboardingEntryConfigController /// 查询入职材料类型。 /// [HttpGet("material-type/list")] + [DisplayName("查询材料类型列表")] public async Task ListMaterialTypes() { return await _service.ListMaterialTypes(); @@ -55,6 +60,7 @@ public class OnboardingEntryConfigController /// 保存入职材料类型。 /// [HttpPost("material-type/save")] + [DisplayName("保存入职材料类型")] public async Task SaveMaterialType([FromBody] OnboardingMaterialTypeSaveInput input) { await _service.SaveMaterialType(input); @@ -64,6 +70,7 @@ public class OnboardingEntryConfigController /// 删除入职材料类型。 /// [HttpPost("material-type/delete")] + [DisplayName("删除入职材料类型")] public async Task DeleteMaterialTypes([FromBody] BaseIdListInput input) { await _service.DeleteMaterialTypes(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingMaterialReviewController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingMaterialReviewController.cs index 4229e97..7da86f7 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingMaterialReviewController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingMaterialReviewController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职资料审核")] [Route("biz/onboarding/material")] +[Route("biz/onboarding/task")] [RolePermission] public class OnboardingMaterialReviewController { @@ -19,6 +21,7 @@ public class OnboardingMaterialReviewController /// 审核候选人上传的材料。 /// [HttpPost("review")] + [DisplayName("审核候选人材料")] public async Task Review([FromBody] OnboardingMaterialReviewInput input) { await _service.Review(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingPositionController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingPositionController.cs index c0d3dd3..9b5d5f4 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingPositionController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingPositionController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ /// [ApiDescriptionSettings("Application", Tag = "入职岗位管理")] [Route("biz/onboarding/position")] +[Route("biz/onboarding/setup")] [RolePermission] public class OnboardingPositionController { @@ -19,6 +21,7 @@ public class OnboardingPositionController /// 分页查询入职业务岗位。 /// [HttpGet("page")] + [DisplayName("分页查询入职岗位")] public async Task Page([FromQuery] OnboardingPositionPageInput input) { return await _service.Page(input); @@ -28,6 +31,7 @@ public class OnboardingPositionController /// 查询指定公司的已启用岗位。 /// [HttpGet("list-enabled")] + [DisplayName("查询公司已启用岗位")] public async Task ListEnabled([FromQuery] long companyId) { return await _service.ListEnabled(companyId); @@ -37,6 +41,7 @@ public class OnboardingPositionController /// 查询指定部门的已启用岗位。 /// [HttpGet("list-by-department")] + [DisplayName("查询部门已启用岗位")] public async Task ListByDepartment([FromQuery] long departmentId) { return await _service.ListEnabledByDepartment(departmentId); @@ -46,6 +51,7 @@ public class OnboardingPositionController /// 查询岗位详情。 /// [HttpGet("detail")] + [DisplayName("查询入职岗位详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -55,6 +61,7 @@ public class OnboardingPositionController /// 新增入职业务岗位。 /// [HttpPost("add")] + [DisplayName("新增入职业务岗位")] public async Task Add([FromBody] OnboardingPositionAddInput input) { await _service.Add(input); @@ -64,6 +71,7 @@ public class OnboardingPositionController /// 编辑入职业务岗位。 /// [HttpPost("edit")] + [DisplayName("编辑入职业务岗位")] public async Task Edit([FromBody] OnboardingPositionEditInput input) { await _service.Edit(input); @@ -73,6 +81,7 @@ public class OnboardingPositionController /// 批量删除入职业务岗位。 /// [HttpPost("delete")] + [DisplayName("删除入职业务岗位")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskContractVariableController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskContractVariableController.cs index bb82761..7615ed6 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskContractVariableController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskContractVariableController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职任务合同参数")] [Route("biz/onboarding/task-contract-variable")] +[Route("biz/onboarding/task")] [RolePermission] public class OnboardingTaskContractVariableController { @@ -19,6 +21,7 @@ public class OnboardingTaskContractVariableController /// 查询任务合同变量。 /// [HttpGet("list")] + [DisplayName("查询任务合同变量")] public async Task List([FromQuery] OnboardingTaskContractVariableQueryInput input) { return await _service.List(input); @@ -28,6 +31,7 @@ public class OnboardingTaskContractVariableController /// 保存任务合同变量。 /// [HttpPost("save")] + [DisplayName("保存任务合同变量")] public async Task Save([FromBody] OnboardingTaskContractVariableSaveInput input) { await _service.Save(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskController.cs index bef82fa..6737266 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -19,6 +20,7 @@ public class OnboardingTaskController /// 创建入职任务并返回员工填写链接。 /// [HttpPost("create")] + [DisplayName("发起新员工入职任务")] public async Task Create([FromBody] OnboardingTaskCreateInput input) { return await _service.Create(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs index ed5d3eb..242b203 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -19,6 +20,7 @@ public class OnboardingTaskLifecycleController /// 归档审核通过的入职任务。 /// [HttpPost("archive")] + [DisplayName("归档入职任务")] public async Task Archive([FromBody] OnboardingAuditActionInput input) { await _service.Archive(input); @@ -28,6 +30,7 @@ public class OnboardingTaskLifecycleController /// 撤销入职任务及员工填写链接。 /// [HttpPost("revoke")] + [DisplayName("撤销入职任务")] public async Task Revoke([FromBody] OnboardingAuditActionInput input) { await _service.Revoke(input); @@ -37,6 +40,7 @@ public class OnboardingTaskLifecycleController /// 删除已撤销的入职任务。 /// [HttpPost("delete")] + [DisplayName("删除已撤销入职任务")] public async Task Delete([FromBody] BaseIdInput input) { await _service.Delete(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskQueryController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskQueryController.cs index 5eae2e6..e3438c3 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskQueryController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskQueryController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -19,6 +20,7 @@ public class OnboardingTaskQueryController /// 分页查询入职任务。 /// [HttpGet("page")] + [DisplayName("分页查询入职任务")] public async Task Page([FromQuery] OnboardingTaskPageInput input) { return await _service.Page(input); @@ -28,6 +30,7 @@ public class OnboardingTaskQueryController /// 查询入职任务完整详情。 /// [HttpGet("detail")] + [DisplayName("查询入职任务详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -37,6 +40,7 @@ public class OnboardingTaskQueryController /// 获取或重新生成入职任务专属填写链接。 /// [HttpGet("get-link")] + [DisplayName("获取入职填写链接")] public async Task GetTaskLink([FromQuery] BaseIdInput input) { return await _service.GetTaskLink(input); diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTemplateController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTemplateController.cs index f9f12ea..9d9ad09 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTemplateController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTemplateController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core; /// [ApiDescriptionSettings("Application", Tag = "入职模板")] [Route("biz/onboarding/template")] +[Route("biz/onboarding/setup")] [RolePermission] public class OnboardingTemplateController { @@ -19,6 +21,7 @@ public class OnboardingTemplateController /// 分页查询入职模板。 /// [HttpGet("page")] + [DisplayName("分页查询入职模板")] public async Task Page([FromQuery] OnboardingTemplatePageInput input) { return await _service.Page(input); @@ -28,6 +31,7 @@ public class OnboardingTemplateController /// 查询入职模板详情及全部关联配置。 /// [HttpGet("detail")] + [DisplayName("查询入职模板详情")] public async Task Detail([FromQuery] BaseIdInput input) { return await _service.Detail(input); @@ -37,6 +41,7 @@ public class OnboardingTemplateController /// 新增或编辑入职模板。 /// [HttpPost("save")] + [DisplayName("保存入职业务模板")] public async Task Save([FromBody] OnboardingTemplateSaveInput input) { return await _service.Save(input); @@ -46,6 +51,7 @@ public class OnboardingTemplateController /// 删除未被任务使用的入职模板。 /// [HttpPost("delete")] + [DisplayName("删除入职业务模板")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); @@ -55,6 +61,7 @@ public class OnboardingTemplateController /// 查询指定公司、部门和岗位可使用的入职模板。 /// [HttpGet("list-enabled")] + [DisplayName("查询可用入职模板")] public async Task ListEnabled( [FromQuery] long companyId, [FromQuery] long departmentId, diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingVariableDefinitionController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingVariableDefinitionController.cs index fcfb069..317ff48 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingVariableDefinitionController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingVariableDefinitionController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel; namespace SimpleAdmin.Web.Core; /// @@ -5,6 +6,7 @@ /// [ApiDescriptionSettings("Application", Tag = "合同变量字典")] [Route("biz/onboarding/variable-definition")] +[Route("biz/onboarding/contract")] [RolePermission] public class OnboardingVariableDefinitionController { @@ -16,30 +18,35 @@ public class OnboardingVariableDefinitionController } [HttpGet("page")] + [DisplayName("分页查询变量字典")] public async Task Page([FromQuery] OnboardingVariableDefinitionPageInput input) { return await _service.Page(input); } [HttpGet("list")] + [DisplayName("查询变量字典列表")] public async Task List() { return await _service.ListAll(); } [HttpPost("add")] + [DisplayName("新增合同变量字典")] public async Task Add([FromBody] OnboardingVariableDefinitionAddInput input) { await _service.Add(input); } [HttpPost("edit")] + [DisplayName("编辑合同变量字典")] public async Task Edit([FromBody] OnboardingVariableDefinitionEditInput input) { await _service.Edit(input); } [HttpPost("delete")] + [DisplayName("删除合同变量字典")] public async Task Delete([FromBody] BaseIdListInput input) { await _service.Delete(input); diff --git a/database/migrations/20260828_task_contract_variable_sort_migration.sql b/database/migrations/20260828_task_contract_variable_sort_migration.sql new file mode 100644 index 0000000..6508f4c --- /dev/null +++ b/database/migrations/20260828_task_contract_variable_sort_migration.sql @@ -0,0 +1,109 @@ +-- OnboardX 任务合同变量排序快照升级脚本 +-- 适用数据库:MySQL 8.0+ +-- 说明: +-- 1. 可重复执行。 +-- 2. 已有合同版本变量会同步全局变量字典的排序值。 +-- 3. 新任务会在创建变量快照时固定模板变量的排序值。 +-- 4. 历史任务按照其绑定的合同模板版本安全回填排序值。 + +SET NAMES utf8mb4; + +DROP PROCEDURE IF EXISTS `ob_task_variable_add_column_if_missing`; +DELIMITER $$ +CREATE PROCEDURE `ob_task_variable_add_column_if_missing`( + IN p_table_name VARCHAR(128), + IN p_column_name VARCHAR(128), + IN p_column_definition VARCHAR(1000) +) +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = p_table_name + AND COLUMN_NAME = p_column_name + ) THEN + SET @ddl = CONCAT( + 'ALTER TABLE `', p_table_name, '` ADD COLUMN `', + p_column_name, '` ', p_column_definition + ); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END$$ +DELIMITER ; + +DROP PROCEDURE IF EXISTS `ob_task_variable_add_index_if_missing`; +DELIMITER $$ +CREATE PROCEDURE `ob_task_variable_add_index_if_missing`( + IN p_table_name VARCHAR(128), + IN p_index_name VARCHAR(128), + IN p_index_definition VARCHAR(1000) +) +BEGIN + IF NOT EXISTS ( + SELECT 1 + FROM information_schema.STATISTICS + WHERE TABLE_SCHEMA = DATABASE() + AND TABLE_NAME = p_table_name + AND INDEX_NAME = p_index_name + ) THEN + SET @ddl = CONCAT( + 'ALTER TABLE `', p_table_name, '` ADD ', p_index_definition + ); + PREPARE stmt FROM @ddl; + EXECUTE stmt; + DEALLOCATE PREPARE stmt; + END IF; +END$$ +DELIMITER ; + +CALL `ob_task_variable_add_column_if_missing`( + 'ob_task_contract_variable', + 'SortCode', + 'INT NOT NULL DEFAULT 100 COMMENT ''任务变量展示排序'' AFTER `DataType`' +); + +-- 修复旧代码导入 DOCX 时没有继承全局变量字典排序的问题。 +-- 模板变量编码创建后不可修改,因此可以按完整变量编码安全匹配。 +UPDATE `ob_template_variable` template_variable +INNER JOIN `ob_variable_definition` variable_definition + ON CONVERT(variable_definition.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci + = CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci +SET template_variable.`SortCode` = COALESCE(variable_definition.`SortCode`, 100); + +-- 使用任务锁定的合同版本回填历史变量排序;找不到模板定义的数据保留默认值 100。 +UPDATE `ob_task_contract_variable` task_variable +INNER JOIN `ob_task_contract` task_contract + ON task_contract.`Id` = task_variable.`TaskContractId` +INNER JOIN `ob_template_variable` template_variable + ON template_variable.`TemplateVersionId` = task_contract.`TemplateVersionId` + AND CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci + = CONVERT(task_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci +SET task_variable.`SortCode` = COALESCE(template_variable.`SortCode`, 100); + +CALL `ob_task_variable_add_index_if_missing`( + 'ob_task_contract_variable', + 'idx_ob_task_contract_variable_sort', + 'INDEX `idx_ob_task_contract_variable_sort` (`TaskContractId`, `SortCode`, `VariableCode`)' +); + +DROP PROCEDURE IF EXISTS `ob_task_variable_add_index_if_missing`; +DROP PROCEDURE IF EXISTS `ob_task_variable_add_column_if_missing`; + +-- 诊断仍未匹配到模板变量定义的历史数据。这些数据会使用默认排序值 100,并按变量编码稳定排序。 +SELECT + task_variable.`Id`, + task_variable.`TaskContractId`, + task_variable.`VariableCode`, + task_variable.`SortCode` +FROM `ob_task_contract_variable` task_variable +LEFT JOIN `ob_task_contract` task_contract + ON task_contract.`Id` = task_variable.`TaskContractId` +LEFT JOIN `ob_template_variable` template_variable + ON template_variable.`TemplateVersionId` = task_contract.`TemplateVersionId` + AND CONVERT(template_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci + = CONVERT(task_variable.`VariableCode` USING utf8mb4) COLLATE utf8mb4_unicode_ci +WHERE template_variable.`Id` IS NULL +ORDER BY task_variable.`TaskContractId`, task_variable.`VariableCode`;