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`;