This commit is contained in:
fuenmao
2026-08-27 16:27:08 +08:00
parent ae8167a566
commit 80940c60a5
22 changed files with 218 additions and 8 deletions
@@ -42,6 +42,11 @@ public class ObTaskContractVariable : BaseEntity
/// </summary> /// </summary>
public string DataType { get; set; } public string DataType { get; set; }
/// <summary>
/// 变量在任务合同中的展示顺序,创建任务时从模板变量复制并固定。
/// </summary>
public int SortCode { get; set; } = 100;
/// <summary> /// <summary>
/// 合同生成时使用的最终变量值。 /// 合同生成时使用的最终变量值。
/// </summary> /// </summary>
@@ -53,6 +53,7 @@ public class OnboardingContractSnapshotService : IOnboardingContractSnapshotServ
VariableName = definition.VariableName, VariableName = definition.VariableName,
VariableType = definition.VariableType, VariableType = definition.VariableType,
DataType = definition.DataType, DataType = definition.DataType,
SortCode = definition.SortCode ?? 100,
VariableValue = preserveManual VariableValue = preserveManual
? old.VariableValue ? old.VariableValue
: ResolveValue(definition, employeeInfo, dynamicValueMap, company, task), : ResolveValue(definition, employeeInfo, dynamicValueMap, company, task),
@@ -411,9 +411,11 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
EmployeeField = variableType is ContractVariableType.Employee or ContractVariableType.Company EmployeeField = variableType is ContractVariableType.Employee or ContractVariableType.Company
? sourceField ? sourceField
: null, : null,
DefaultValue = def?.DefaultValue,
Required = def?.Required ?? true, Required = def?.Required ?? true,
HrEditable = variableType == ContractVariableType.Contract, HrEditable = variableType == ContractVariableType.Contract,
SortCode = (index + 1) * 10, // 合同版本首次识别时继承全局变量字典排序;未登记排序时才使用识别顺序兜底。
SortCode = def?.SortCode ?? (index + 1) * 10,
Remark = def?.Remark Remark = def?.Remark
}; };
} }
@@ -103,6 +103,11 @@ public class OnboardingTaskContractVariableItemOutput
/// </summary> /// </summary>
public string DataType { get; set; } public string DataType { get; set; }
/// <summary>
/// 任务创建时保存的变量展示顺序。
/// </summary>
public int SortCode { get; set; }
/// <summary> /// <summary>
/// 任务合同变量最终值。 /// 任务合同变量最终值。
/// </summary> /// </summary>
@@ -43,7 +43,8 @@ public class OnboardingTaskContractVariableService : IOnboardingTaskContractVari
Variables = variables Variables = variables
.Where(variable => variable.TaskContractId == contract.Id) .Where(variable => variable.TaskContractId == contract.Id)
.OrderBy(variable => variable.VariableCode) .OrderBy(variable => variable.SortCode)
.ThenBy(variable => variable.VariableCode)
.Select(variable => .Select(variable =>
{ {
var definition = definitions.FirstOrDefault(x => var definition = definitions.FirstOrDefault(x =>
@@ -59,6 +60,7 @@ public class OnboardingTaskContractVariableService : IOnboardingTaskContractVari
VariableName = variable.VariableName, VariableName = variable.VariableName,
VariableType = variable.VariableType, VariableType = variable.VariableType,
DataType = variable.DataType, DataType = variable.DataType,
SortCode = variable.SortCode,
VariableValue = variable.VariableValue, VariableValue = variable.VariableValue,
Required = definition?.Required == true, Required = definition?.Required == true,
HrEditable = hrEditable, HrEditable = hrEditable,
@@ -1,4 +1,4 @@
// Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛 // Copyright (c) 2022-Now 少林寺驻北固山办事处大神父王喇嘛
// //
// SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款: // SimpleAdmin 基于 Apache License Version 2.0 协议发布,可用于商业项目,但必须遵守以下补充条款:
// 1.请不要删除和修改根目录下的LICENSE文件。 // 1.请不要删除和修改根目录下的LICENSE文件。
@@ -183,15 +183,18 @@ public class ResourceService : DbRepository<SysResource>, IResourceService
foreach (var controller in controllerTypes) foreach (var controller in controllerTypes)
{ {
var apiAttribute = controller.GetCustomAttribute<ApiDescriptionSettingsAttribute>();//获取接口描述特性 var apiAttribute = controller.GetCustomAttribute<ApiDescriptionSettingsAttribute>();//获取接口描述特性
var tag = apiAttribute.Tag;//获取标签 var tag = apiAttribute?.Tag;//获取标签
//获取数据权限特性 //获取数据权限特性
var routeAttributes = controller.GetCustomAttributes<RouteAttribute>().ToList(); var routeAttributes = controller.GetCustomAttributes<RouteAttribute>().ToList();
if (routeAttributes == null) if (routeAttributes == null || routeAttributes.Count == 0)
continue; continue;
var route = routeAttributes[0];//取第一个值 var route = routeAttributes[0];//取第一个值作为生成接口路由的基础
var routeName = GetRouteName(controller.Name, route.Template);//赋值路由名称 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(); var methods = controller.GetMethods();
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职审核")] [ApiDescriptionSettings("Application", Tag = "入职审核")]
[Route("biz/onboarding/audit")] [Route("biz/onboarding/audit")]
[Route("biz/onboarding/task")]
[RolePermission] [RolePermission]
public class OnboardingAuditController public class OnboardingAuditController
{ {
@@ -19,6 +21,7 @@ public class OnboardingAuditController
/// 审核通过任务并创建正式员工档案。 /// 审核通过任务并创建正式员工档案。
/// </summary> /// </summary>
[HttpPost("approve")] [HttpPost("approve")]
[DisplayName("审核通过入职任务")]
public async Task Approve([FromBody] OnboardingAuditActionInput input) public async Task Approve([FromBody] OnboardingAuditActionInput input)
{ {
await _service.Approve(input); await _service.Approve(input);
@@ -28,6 +31,7 @@ public class OnboardingAuditController
/// 退回任务并要求候选人补充资料。 /// 退回任务并要求候选人补充资料。
/// </summary> /// </summary>
[HttpPost("reject")] [HttpPost("reject")]
[DisplayName("退回修改入职任务")]
public async Task Reject([FromBody] OnboardingAuditActionInput input) public async Task Reject([FromBody] OnboardingAuditActionInput input)
{ {
await _service.Reject(input); await _service.Reject(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职公司管理")] [ApiDescriptionSettings("Application", Tag = "入职公司管理")]
[Route("biz/onboarding/company")] [Route("biz/onboarding/company")]
[Route("biz/onboarding/setup")]
[RolePermission] [RolePermission]
public class OnboardingCompanyController public class OnboardingCompanyController
{ {
@@ -19,6 +21,7 @@ public class OnboardingCompanyController
/// 分页查询入职业务公司。 /// 分页查询入职业务公司。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询入职公司")]
public async Task<dynamic> Page([FromQuery] OnboardingCompanyPageInput input) public async Task<dynamic> Page([FromQuery] OnboardingCompanyPageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +31,7 @@ public class OnboardingCompanyController
/// 查询已启用公司列表。 /// 查询已启用公司列表。
/// </summary> /// </summary>
[HttpGet("list-enabled")] [HttpGet("list-enabled")]
[DisplayName("查询已启用公司列表")]
public async Task<dynamic> ListEnabled() public async Task<dynamic> ListEnabled()
{ {
return await _service.ListEnabled(); return await _service.ListEnabled();
@@ -37,6 +41,7 @@ public class OnboardingCompanyController
/// 查询公司详情。 /// 查询公司详情。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询入职公司详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -46,6 +51,7 @@ public class OnboardingCompanyController
/// 新增入职业务公司。 /// 新增入职业务公司。
/// </summary> /// </summary>
[HttpPost("add")] [HttpPost("add")]
[DisplayName("新增入职业务公司")]
public async Task Add([FromBody] OnboardingCompanyAddInput input) public async Task Add([FromBody] OnboardingCompanyAddInput input)
{ {
await _service.Add(input); await _service.Add(input);
@@ -55,6 +61,7 @@ public class OnboardingCompanyController
/// 编辑入职业务公司。 /// 编辑入职业务公司。
/// </summary> /// </summary>
[HttpPost("edit")] [HttpPost("edit")]
[DisplayName("编辑入职业务公司")]
public async Task Edit([FromBody] OnboardingCompanyEditInput input) public async Task Edit([FromBody] OnboardingCompanyEditInput input)
{ {
await _service.Edit(input); await _service.Edit(input);
@@ -64,6 +71,7 @@ public class OnboardingCompanyController
/// 删除入职业务公司。 /// 删除入职业务公司。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除入职业务公司")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职合同文件")] [ApiDescriptionSettings("Application", Tag = "入职合同文件")]
[Route("biz/onboarding/contract-document")] [Route("biz/onboarding/contract-document")]
[Route("biz/onboarding/task")]
[RolePermission] [RolePermission]
public class OnboardingContractDocumentController public class OnboardingContractDocumentController
{ {
@@ -20,6 +22,7 @@ public class OnboardingContractDocumentController
/// 生成入职合同文件 /// 生成入职合同文件
/// </summary> /// </summary>
[HttpPost("generate")] [HttpPost("generate")]
[DisplayName("手动生成合同文件")]
public async Task<long> Generate( public async Task<long> Generate(
[FromBody] OnboardingGenerateContractInput input) [FromBody] OnboardingGenerateContractInput input)
{ {
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职合同模板")] [ApiDescriptionSettings("Application", Tag = "入职合同模板")]
[Route("biz/onboarding/contract-template")] [Route("biz/onboarding/contract-template")]
[Route("biz/onboarding/contract")]
[RolePermission] [RolePermission]
public class OnboardingContractTemplateController public class OnboardingContractTemplateController
{ {
@@ -25,6 +27,7 @@ public class OnboardingContractTemplateController
[HttpPost("file/upload-docx")] [HttpPost("file/upload-docx")]
[Consumes("multipart/form-data")] [Consumes("multipart/form-data")]
[RequestSizeLimit(20 * 1024 * 1024)] [RequestSizeLimit(20 * 1024 * 1024)]
[DisplayName("上传合同DOCX模板")]
public async Task<long> UploadDocx([FromForm] IFormFile file) public async Task<long> UploadDocx([FromForm] IFormFile file)
{ {
if (file == null || file.Length == 0) if (file == null || file.Length == 0)
@@ -41,6 +44,7 @@ public class OnboardingContractTemplateController
/// 分页查询合同模板。 /// 分页查询合同模板。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询合同模板")]
public async Task<dynamic> Page([FromQuery] OnboardingContractTemplatePageInput input) public async Task<dynamic> Page([FromQuery] OnboardingContractTemplatePageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -50,6 +54,7 @@ public class OnboardingContractTemplateController
/// 查询合同模板详情。 /// 查询合同模板详情。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询合同模板详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -68,6 +73,7 @@ public class OnboardingContractTemplateController
/// 新增合同模板。 /// 新增合同模板。
/// </summary> /// </summary>
[HttpPost("add")] [HttpPost("add")]
[DisplayName("新增合同业务模板")]
public async Task Add([FromBody] OnboardingContractTemplateAddInput input) public async Task Add([FromBody] OnboardingContractTemplateAddInput input)
{ {
await _service.Add(input); await _service.Add(input);
@@ -77,6 +83,7 @@ public class OnboardingContractTemplateController
/// 编辑合同模板。 /// 编辑合同模板。
/// </summary> /// </summary>
[HttpPost("edit")] [HttpPost("edit")]
[DisplayName("编辑合同业务模板")]
public async Task Edit([FromBody] OnboardingContractTemplateEditInput input) public async Task Edit([FromBody] OnboardingContractTemplateEditInput input)
{ {
await _service.Edit(input); await _service.Edit(input);
@@ -86,6 +93,7 @@ public class OnboardingContractTemplateController
/// 删除合同模板。 /// 删除合同模板。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除合同业务模板")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -95,6 +103,7 @@ public class OnboardingContractTemplateController
/// 分页查询合同模板版本。 /// 分页查询合同模板版本。
/// </summary> /// </summary>
[HttpGet("version/page")] [HttpGet("version/page")]
[DisplayName("分页查询合同版本")]
public async Task<dynamic> VersionPage([FromQuery] OnboardingContractVersionPageInput input) public async Task<dynamic> VersionPage([FromQuery] OnboardingContractVersionPageInput input)
{ {
return await _service.VersionPage(input); return await _service.VersionPage(input);
@@ -131,6 +140,7 @@ public class OnboardingContractTemplateController
/// 分页查询模板变量。 /// 分页查询模板变量。
/// </summary> /// </summary>
[HttpGet("variable/page")] [HttpGet("variable/page")]
[DisplayName("分页查询合同变量")]
public async Task<dynamic> VariablePage([FromQuery] OnboardingTemplateVariablePageInput input) public async Task<dynamic> VariablePage([FromQuery] OnboardingTemplateVariablePageInput input)
{ {
return await _service.VariablePage(input); return await _service.VariablePage(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职部门管理")] [ApiDescriptionSettings("Application", Tag = "入职部门管理")]
[Route("biz/onboarding/department")] [Route("biz/onboarding/department")]
[Route("biz/onboarding/setup")]
[RolePermission] [RolePermission]
public class OnboardingDepartmentController public class OnboardingDepartmentController
{ {
@@ -19,6 +21,7 @@ public class OnboardingDepartmentController
/// 分页查询入职业务部门。 /// 分页查询入职业务部门。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询入职部门")]
public async Task<dynamic> Page([FromQuery] OnboardingDepartmentPageInput input) public async Task<dynamic> Page([FromQuery] OnboardingDepartmentPageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +31,7 @@ public class OnboardingDepartmentController
/// 查询指定公司的已启用部门。 /// 查询指定公司的已启用部门。
/// </summary> /// </summary>
[HttpGet("list-enabled")] [HttpGet("list-enabled")]
[DisplayName("查询已启用部门列表")]
public async Task<dynamic> ListEnabled([FromQuery] long companyId) public async Task<dynamic> ListEnabled([FromQuery] long companyId)
{ {
return await _service.ListEnabled(companyId); return await _service.ListEnabled(companyId);
@@ -37,6 +41,7 @@ public class OnboardingDepartmentController
/// 查询部门详情。 /// 查询部门详情。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询入职部门详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -46,6 +51,7 @@ public class OnboardingDepartmentController
/// 新增入职业务部门。 /// 新增入职业务部门。
/// </summary> /// </summary>
[HttpPost("add")] [HttpPost("add")]
[DisplayName("新增入职业务部门")]
public async Task Add([FromBody] OnboardingDepartmentAddInput input) public async Task Add([FromBody] OnboardingDepartmentAddInput input)
{ {
await _service.Add(input); await _service.Add(input);
@@ -55,6 +61,7 @@ public class OnboardingDepartmentController
/// 编辑入职业务部门。 /// 编辑入职业务部门。
/// </summary> /// </summary>
[HttpPost("edit")] [HttpPost("edit")]
[DisplayName("编辑入职业务部门")]
public async Task Edit([FromBody] OnboardingDepartmentEditInput input) public async Task Edit([FromBody] OnboardingDepartmentEditInput input)
{ {
await _service.Edit(input); await _service.Edit(input);
@@ -64,6 +71,7 @@ public class OnboardingDepartmentController
/// 批量删除入职业务部门。 /// 批量删除入职业务部门。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除入职业务部门")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -19,6 +20,7 @@ public class OnboardingEmployeeController
/// 分页查询正式员工档案。 /// 分页查询正式员工档案。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询正式员工档案")]
public async Task<dynamic> Page([FromQuery] OnboardingEmployeePageInput input) public async Task<dynamic> Page([FromQuery] OnboardingEmployeePageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +30,7 @@ public class OnboardingEmployeeController
/// 查询正式员工详情及来源记录。 /// 查询正式员工详情及来源记录。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询正式员工详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -19,6 +20,7 @@ public class OnboardingEntryConfigController
/// 查询动态入职字段。 /// 查询动态入职字段。
/// </summary> /// </summary>
[HttpGet("form-field/list")] [HttpGet("form-field/list")]
[DisplayName("查询动态字段列表")]
public async Task<dynamic> ListFormFields() public async Task<dynamic> ListFormFields()
{ {
return await _service.ListFormFields(); return await _service.ListFormFields();
@@ -28,6 +30,7 @@ public class OnboardingEntryConfigController
/// 保存动态入职字段。 /// 保存动态入职字段。
/// </summary> /// </summary>
[HttpPost("form-field/save")] [HttpPost("form-field/save")]
[DisplayName("保存动态入职字段")]
public async Task SaveFormField([FromBody] OnboardingFormFieldSaveInput input) public async Task SaveFormField([FromBody] OnboardingFormFieldSaveInput input)
{ {
await _service.SaveFormField(input); await _service.SaveFormField(input);
@@ -37,6 +40,7 @@ public class OnboardingEntryConfigController
/// 删除动态入职字段。 /// 删除动态入职字段。
/// </summary> /// </summary>
[HttpPost("form-field/delete")] [HttpPost("form-field/delete")]
[DisplayName("删除动态入职字段")]
public async Task DeleteFormFields([FromBody] BaseIdListInput input) public async Task DeleteFormFields([FromBody] BaseIdListInput input)
{ {
await _service.DeleteFormFields(input); await _service.DeleteFormFields(input);
@@ -46,6 +50,7 @@ public class OnboardingEntryConfigController
/// 查询入职材料类型。 /// 查询入职材料类型。
/// </summary> /// </summary>
[HttpGet("material-type/list")] [HttpGet("material-type/list")]
[DisplayName("查询材料类型列表")]
public async Task<dynamic> ListMaterialTypes() public async Task<dynamic> ListMaterialTypes()
{ {
return await _service.ListMaterialTypes(); return await _service.ListMaterialTypes();
@@ -55,6 +60,7 @@ public class OnboardingEntryConfigController
/// 保存入职材料类型。 /// 保存入职材料类型。
/// </summary> /// </summary>
[HttpPost("material-type/save")] [HttpPost("material-type/save")]
[DisplayName("保存入职材料类型")]
public async Task SaveMaterialType([FromBody] OnboardingMaterialTypeSaveInput input) public async Task SaveMaterialType([FromBody] OnboardingMaterialTypeSaveInput input)
{ {
await _service.SaveMaterialType(input); await _service.SaveMaterialType(input);
@@ -64,6 +70,7 @@ public class OnboardingEntryConfigController
/// 删除入职材料类型。 /// 删除入职材料类型。
/// </summary> /// </summary>
[HttpPost("material-type/delete")] [HttpPost("material-type/delete")]
[DisplayName("删除入职材料类型")]
public async Task DeleteMaterialTypes([FromBody] BaseIdListInput input) public async Task DeleteMaterialTypes([FromBody] BaseIdListInput input)
{ {
await _service.DeleteMaterialTypes(input); await _service.DeleteMaterialTypes(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职资料审核")] [ApiDescriptionSettings("Application", Tag = "入职资料审核")]
[Route("biz/onboarding/material")] [Route("biz/onboarding/material")]
[Route("biz/onboarding/task")]
[RolePermission] [RolePermission]
public class OnboardingMaterialReviewController public class OnboardingMaterialReviewController
{ {
@@ -19,6 +21,7 @@ public class OnboardingMaterialReviewController
/// 审核候选人上传的材料。 /// 审核候选人上传的材料。
/// </summary> /// </summary>
[HttpPost("review")] [HttpPost("review")]
[DisplayName("审核候选人材料")]
public async Task Review([FromBody] OnboardingMaterialReviewInput input) public async Task Review([FromBody] OnboardingMaterialReviewInput input)
{ {
await _service.Review(input); await _service.Review(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职岗位管理")] [ApiDescriptionSettings("Application", Tag = "入职岗位管理")]
[Route("biz/onboarding/position")] [Route("biz/onboarding/position")]
[Route("biz/onboarding/setup")]
[RolePermission] [RolePermission]
public class OnboardingPositionController public class OnboardingPositionController
{ {
@@ -19,6 +21,7 @@ public class OnboardingPositionController
/// 分页查询入职业务岗位。 /// 分页查询入职业务岗位。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询入职岗位")]
public async Task<dynamic> Page([FromQuery] OnboardingPositionPageInput input) public async Task<dynamic> Page([FromQuery] OnboardingPositionPageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +31,7 @@ public class OnboardingPositionController
/// 查询指定公司的已启用岗位。 /// 查询指定公司的已启用岗位。
/// </summary> /// </summary>
[HttpGet("list-enabled")] [HttpGet("list-enabled")]
[DisplayName("查询公司已启用岗位")]
public async Task<dynamic> ListEnabled([FromQuery] long companyId) public async Task<dynamic> ListEnabled([FromQuery] long companyId)
{ {
return await _service.ListEnabled(companyId); return await _service.ListEnabled(companyId);
@@ -37,6 +41,7 @@ public class OnboardingPositionController
/// 查询指定部门的已启用岗位。 /// 查询指定部门的已启用岗位。
/// </summary> /// </summary>
[HttpGet("list-by-department")] [HttpGet("list-by-department")]
[DisplayName("查询部门已启用岗位")]
public async Task<dynamic> ListByDepartment([FromQuery] long departmentId) public async Task<dynamic> ListByDepartment([FromQuery] long departmentId)
{ {
return await _service.ListEnabledByDepartment(departmentId); return await _service.ListEnabledByDepartment(departmentId);
@@ -46,6 +51,7 @@ public class OnboardingPositionController
/// 查询岗位详情。 /// 查询岗位详情。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询入职岗位详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -55,6 +61,7 @@ public class OnboardingPositionController
/// 新增入职业务岗位。 /// 新增入职业务岗位。
/// </summary> /// </summary>
[HttpPost("add")] [HttpPost("add")]
[DisplayName("新增入职业务岗位")]
public async Task Add([FromBody] OnboardingPositionAddInput input) public async Task Add([FromBody] OnboardingPositionAddInput input)
{ {
await _service.Add(input); await _service.Add(input);
@@ -64,6 +71,7 @@ public class OnboardingPositionController
/// 编辑入职业务岗位。 /// 编辑入职业务岗位。
/// </summary> /// </summary>
[HttpPost("edit")] [HttpPost("edit")]
[DisplayName("编辑入职业务岗位")]
public async Task Edit([FromBody] OnboardingPositionEditInput input) public async Task Edit([FromBody] OnboardingPositionEditInput input)
{ {
await _service.Edit(input); await _service.Edit(input);
@@ -73,6 +81,7 @@ public class OnboardingPositionController
/// 批量删除入职业务岗位。 /// 批量删除入职业务岗位。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除入职业务岗位")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职任务合同参数")] [ApiDescriptionSettings("Application", Tag = "入职任务合同参数")]
[Route("biz/onboarding/task-contract-variable")] [Route("biz/onboarding/task-contract-variable")]
[Route("biz/onboarding/task")]
[RolePermission] [RolePermission]
public class OnboardingTaskContractVariableController public class OnboardingTaskContractVariableController
{ {
@@ -19,6 +21,7 @@ public class OnboardingTaskContractVariableController
/// 查询任务合同变量。 /// 查询任务合同变量。
/// </summary> /// </summary>
[HttpGet("list")] [HttpGet("list")]
[DisplayName("查询任务合同变量")]
public async Task<dynamic> List([FromQuery] OnboardingTaskContractVariableQueryInput input) public async Task<dynamic> List([FromQuery] OnboardingTaskContractVariableQueryInput input)
{ {
return await _service.List(input); return await _service.List(input);
@@ -28,6 +31,7 @@ public class OnboardingTaskContractVariableController
/// 保存任务合同变量。 /// 保存任务合同变量。
/// </summary> /// </summary>
[HttpPost("save")] [HttpPost("save")]
[DisplayName("保存任务合同变量")]
public async Task Save([FromBody] OnboardingTaskContractVariableSaveInput input) public async Task Save([FromBody] OnboardingTaskContractVariableSaveInput input)
{ {
await _service.Save(input); await _service.Save(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -19,6 +20,7 @@ public class OnboardingTaskController
/// 创建入职任务并返回员工填写链接。 /// 创建入职任务并返回员工填写链接。
/// </summary> /// </summary>
[HttpPost("create")] [HttpPost("create")]
[DisplayName("发起新员工入职任务")]
public async Task<dynamic> Create([FromBody] OnboardingTaskCreateInput input) public async Task<dynamic> Create([FromBody] OnboardingTaskCreateInput input)
{ {
return await _service.Create(input); return await _service.Create(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -19,6 +20,7 @@ public class OnboardingTaskLifecycleController
/// 归档审核通过的入职任务。 /// 归档审核通过的入职任务。
/// </summary> /// </summary>
[HttpPost("archive")] [HttpPost("archive")]
[DisplayName("归档入职任务")]
public async Task Archive([FromBody] OnboardingAuditActionInput input) public async Task Archive([FromBody] OnboardingAuditActionInput input)
{ {
await _service.Archive(input); await _service.Archive(input);
@@ -28,6 +30,7 @@ public class OnboardingTaskLifecycleController
/// 撤销入职任务及员工填写链接。 /// 撤销入职任务及员工填写链接。
/// </summary> /// </summary>
[HttpPost("revoke")] [HttpPost("revoke")]
[DisplayName("撤销入职任务")]
public async Task Revoke([FromBody] OnboardingAuditActionInput input) public async Task Revoke([FromBody] OnboardingAuditActionInput input)
{ {
await _service.Revoke(input); await _service.Revoke(input);
@@ -37,6 +40,7 @@ public class OnboardingTaskLifecycleController
/// 删除已撤销的入职任务。 /// 删除已撤销的入职任务。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除已撤销入职任务")]
public async Task Delete([FromBody] BaseIdInput input) public async Task Delete([FromBody] BaseIdInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -19,6 +20,7 @@ public class OnboardingTaskQueryController
/// 分页查询入职任务。 /// 分页查询入职任务。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询入职任务")]
public async Task<dynamic> Page([FromQuery] OnboardingTaskPageInput input) public async Task<dynamic> Page([FromQuery] OnboardingTaskPageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +30,7 @@ public class OnboardingTaskQueryController
/// 查询入职任务完整详情。 /// 查询入职任务完整详情。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询入职任务详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -37,6 +40,7 @@ public class OnboardingTaskQueryController
/// 获取或重新生成入职任务专属填写链接。 /// 获取或重新生成入职任务专属填写链接。
/// </summary> /// </summary>
[HttpGet("get-link")] [HttpGet("get-link")]
[DisplayName("获取入职填写链接")]
public async Task<dynamic> GetTaskLink([FromQuery] BaseIdInput input) public async Task<dynamic> GetTaskLink([FromQuery] BaseIdInput input)
{ {
return await _service.GetTaskLink(input); return await _service.GetTaskLink(input);
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@ namespace SimpleAdmin.Web.Core;
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "入职模板")] [ApiDescriptionSettings("Application", Tag = "入职模板")]
[Route("biz/onboarding/template")] [Route("biz/onboarding/template")]
[Route("biz/onboarding/setup")]
[RolePermission] [RolePermission]
public class OnboardingTemplateController public class OnboardingTemplateController
{ {
@@ -19,6 +21,7 @@ public class OnboardingTemplateController
/// 分页查询入职模板。 /// 分页查询入职模板。
/// </summary> /// </summary>
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询入职模板")]
public async Task<dynamic> Page([FromQuery] OnboardingTemplatePageInput input) public async Task<dynamic> Page([FromQuery] OnboardingTemplatePageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
@@ -28,6 +31,7 @@ public class OnboardingTemplateController
/// 查询入职模板详情及全部关联配置。 /// 查询入职模板详情及全部关联配置。
/// </summary> /// </summary>
[HttpGet("detail")] [HttpGet("detail")]
[DisplayName("查询入职模板详情")]
public async Task<dynamic> Detail([FromQuery] BaseIdInput input) public async Task<dynamic> Detail([FromQuery] BaseIdInput input)
{ {
return await _service.Detail(input); return await _service.Detail(input);
@@ -37,6 +41,7 @@ public class OnboardingTemplateController
/// 新增或编辑入职模板。 /// 新增或编辑入职模板。
/// </summary> /// </summary>
[HttpPost("save")] [HttpPost("save")]
[DisplayName("保存入职业务模板")]
public async Task<long> Save([FromBody] OnboardingTemplateSaveInput input) public async Task<long> Save([FromBody] OnboardingTemplateSaveInput input)
{ {
return await _service.Save(input); return await _service.Save(input);
@@ -46,6 +51,7 @@ public class OnboardingTemplateController
/// 删除未被任务使用的入职模板。 /// 删除未被任务使用的入职模板。
/// </summary> /// </summary>
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除入职业务模板")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -55,6 +61,7 @@ public class OnboardingTemplateController
/// 查询指定公司、部门和岗位可使用的入职模板。 /// 查询指定公司、部门和岗位可使用的入职模板。
/// </summary> /// </summary>
[HttpGet("list-enabled")] [HttpGet("list-enabled")]
[DisplayName("查询可用入职模板")]
public async Task<dynamic> ListEnabled( public async Task<dynamic> ListEnabled(
[FromQuery] long companyId, [FromQuery] long companyId,
[FromQuery] long departmentId, [FromQuery] long departmentId,
@@ -1,3 +1,4 @@
using System.ComponentModel;
namespace SimpleAdmin.Web.Core; namespace SimpleAdmin.Web.Core;
/// <summary> /// <summary>
@@ -5,6 +6,7 @@
/// </summary> /// </summary>
[ApiDescriptionSettings("Application", Tag = "合同变量字典")] [ApiDescriptionSettings("Application", Tag = "合同变量字典")]
[Route("biz/onboarding/variable-definition")] [Route("biz/onboarding/variable-definition")]
[Route("biz/onboarding/contract")]
[RolePermission] [RolePermission]
public class OnboardingVariableDefinitionController public class OnboardingVariableDefinitionController
{ {
@@ -16,30 +18,35 @@ public class OnboardingVariableDefinitionController
} }
[HttpGet("page")] [HttpGet("page")]
[DisplayName("分页查询变量字典")]
public async Task<dynamic> Page([FromQuery] OnboardingVariableDefinitionPageInput input) public async Task<dynamic> Page([FromQuery] OnboardingVariableDefinitionPageInput input)
{ {
return await _service.Page(input); return await _service.Page(input);
} }
[HttpGet("list")] [HttpGet("list")]
[DisplayName("查询变量字典列表")]
public async Task<dynamic> List() public async Task<dynamic> List()
{ {
return await _service.ListAll(); return await _service.ListAll();
} }
[HttpPost("add")] [HttpPost("add")]
[DisplayName("新增合同变量字典")]
public async Task Add([FromBody] OnboardingVariableDefinitionAddInput input) public async Task Add([FromBody] OnboardingVariableDefinitionAddInput input)
{ {
await _service.Add(input); await _service.Add(input);
} }
[HttpPost("edit")] [HttpPost("edit")]
[DisplayName("编辑合同变量字典")]
public async Task Edit([FromBody] OnboardingVariableDefinitionEditInput input) public async Task Edit([FromBody] OnboardingVariableDefinitionEditInput input)
{ {
await _service.Edit(input); await _service.Edit(input);
} }
[HttpPost("delete")] [HttpPost("delete")]
[DisplayName("删除合同变量字典")]
public async Task Delete([FromBody] BaseIdListInput input) public async Task Delete([FromBody] BaseIdListInput input)
{ {
await _service.Delete(input); await _service.Delete(input);
@@ -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`;