From 38801533e9b0c40e05b459d768060c22397c253b Mon Sep 17 00:00:00 2001 From: fuenmao <980740792@qq.com> Date: Tue, 25 Aug 2026 13:54:16 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IOnboardingContractTemplateService.cs | 7 +- .../OnboardingContractTemplateService.cs | 103 ++++++++++++++---- .../IOnboardingTaskLifecycleService.cs | 5 + .../OnboardingTaskLifecycleService.cs | 44 ++++++++ .../IOnboardingTemplateService.cs | 2 +- .../OnboardingTemplateService.cs | 11 +- .../SimpleAdmin.Application.xml | 26 ++++- .../OnboardingContractTemplateController.cs | 9 ++ .../OnboardingTaskLifecycleController.cs | 9 ++ SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml | 10 ++ 10 files changed, 196 insertions(+), 30 deletions(-) diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/IOnboardingContractTemplateService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/IOnboardingContractTemplateService.cs index e3d32dd..0b457b7 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/IOnboardingContractTemplateService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/IOnboardingContractTemplateService.cs @@ -45,13 +45,18 @@ public interface IOnboardingContractTemplateService : ITransient /// Task SetVersionStatus(OnboardingContractVersionStatusInput input); + /// + /// 删除未被入职模板或任务使用的合同版本。 + /// + Task DeleteVersion(BaseIdInput input); + /// /// 分页查询指定模板版本自动识别出的变量。 /// Task> VariablePage(OnboardingTemplateVariablePageInput input); /// - /// 编辑并确认草稿模板版本中的变量定义。 + /// 编辑并确认模板版本中的变量定义。 /// Task EditVariable(OnboardingTemplateVariableEditInput input); } \ No newline at end of file diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs index 9ce9d7b..f2c5cc4 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractTemplate/OnboardingContractTemplateService.cs @@ -11,6 +11,7 @@ public class OnboardingContractTemplateService : DbRepository /// 分页查询合同模板主档案。 /// @@ -55,34 +56,92 @@ public class OnboardingContractTemplateService : DbRepository - /// 删除未被版本、适用范围或任务合同引用的模板。 + /// 删除未被入职模板或任务合同引用的模板(级联删除未使用的版本和变量)。 /// public async Task Delete(BaseIdListInput input) { if (input.Ids.Count == 0) return; - var hasVersions = await Context.Queryable() - .AnyAsync(it => input.Ids.Contains(it.TemplateId)); - if (hasVersions) - throw Oops.Bah("模板已有版本,不能删除"); - - var hasScopes = await Context.Queryable() - .AnyAsync(it => input.Ids.Contains(it.TemplateId)); - if (hasScopes) - throw Oops.Bah("模板已配置旧版适用范围,不能删除"); - var hasOnboardingTemplates = await Context.Queryable() .AnyAsync(it => input.Ids.Contains(it.ContractTemplateId)); if (hasOnboardingTemplates) - throw Oops.Bah("模板已被入职模板引用,不能删除"); + throw Oops.Bah("模板已被入职模板引用,不能删除,请先在入职模板中移除关联"); var hasContracts = await Context.Queryable() .AnyAsync(it => input.Ids.Contains(it.TemplateId)); if (hasContracts) - throw Oops.Bah("模板已生成入职合同,不能删除"); + throw Oops.Bah("模板已生成入职任务合同,不能删除,可改为停用"); - await DeleteByIdsAsync(input.Ids.Cast().ToArray()); + var versionIds = await Context.Queryable() + .Where(it => input.Ids.Contains(it.TemplateId)) + .Select(it => it.Id) + .ToListAsync(); + + await Context.Ado.BeginTranAsync(); + try + { + if (versionIds.Count > 0) + { + await Context.Deleteable() + .Where(it => versionIds.Contains(it.TemplateVersionId)) + .ExecuteCommandAsync(); + await Context.Deleteable() + .In(versionIds) + .ExecuteCommandAsync(); + } + + await Context.Deleteable() + .Where(it => input.Ids.Contains(it.TemplateId)) + .ExecuteCommandAsync(); + + await DeleteByIdsAsync(input.Ids.Cast().ToArray()); + await Context.Ado.CommitTranAsync(); + } + catch + { + await Context.Ado.RollbackTranAsync(); + throw; + } + } + + /// + /// 删除未被入职模板或任务使用的合同版本。 + /// + public async Task DeleteVersion(BaseIdInput input) + { + var version = await Context.Queryable().InSingleAsync(input.Id) + ?? throw Oops.Bah("合同版本不存在"); + + var isUsedInOnboardingTemplate = await Context.Queryable() + .AnyAsync(it => it.ContractTemplateVersionId == version.Id); + if (isUsedInOnboardingTemplate) + throw Oops.Bah("该版本已被入职模板引用,不能删除,请先在入职模板中移除关联"); + + var isUsedInTask = await Context.Queryable() + .AnyAsync(it => it.TemplateVersionId == version.Id); + if (isUsedInTask) + throw Oops.Bah("该版本已用于实际入职任务,不能删除,可改为停用"); + + await Context.Ado.BeginTranAsync(); + try + { + await Context.Deleteable() + .Where(it => it.TemplateVersionId == version.Id) + .ExecuteCommandAsync(); + await Context.Deleteable() + .Where(it => it.TemplateVersionId == version.Id) + .ExecuteCommandAsync(); + await Context.Deleteable() + .In(version.Id) + .ExecuteCommandAsync(); + await Context.Ado.CommitTranAsync(); + } + catch + { + await Context.Ado.RollbackTranAsync(); + throw; + } } /// @@ -183,7 +242,7 @@ public class OnboardingContractTemplateService : DbRepository - /// 编辑草稿模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。 + /// 编辑模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。 /// public async Task EditVariable(OnboardingTemplateVariableEditInput input) { @@ -194,7 +253,11 @@ public class OnboardingContractTemplateService : DbRepository() + .AnyAsync(it => it.TemplateVersionId == input.TemplateVersionId); + if (isUsedInTask) + throw Oops.Bah("该版本已生成实际入职任务合同,变量配置已锁定"); + var entity = input.Adapt(); entity.VariableCode = variable.VariableCode; await Context.Updateable(entity).ExecuteCommandAsync(); @@ -255,12 +318,4 @@ public class OnboardingContractTemplateService : DbRepository().InSingleAsync(versionId) - ?? throw Oops.Bah("模板版本不存在"); - if (version.VersionStatus != ContractTemplateVersionStatus.Draft) - throw Oops.Bah("只有草稿版本可维护变量"); - } } diff --git a/SimpleAdmin.Application/Services/Onboarding/Lifecycle/IOnboardingTaskLifecycleService.cs b/SimpleAdmin.Application/Services/Onboarding/Lifecycle/IOnboardingTaskLifecycleService.cs index 853c3fd..247ccb3 100644 --- a/SimpleAdmin.Application/Services/Onboarding/Lifecycle/IOnboardingTaskLifecycleService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/Lifecycle/IOnboardingTaskLifecycleService.cs @@ -14,4 +14,9 @@ public interface IOnboardingTaskLifecycleService : ITransient /// 撤销尚未归档的入职任务并使员工链接失效。 /// Task Revoke(OnboardingAuditActionInput input); + + /// + /// 删除已撤销的入职任务及其全部关联快照数据。 + /// + Task Delete(BaseIdInput input); } diff --git a/SimpleAdmin.Application/Services/Onboarding/Lifecycle/OnboardingTaskLifecycleService.cs b/SimpleAdmin.Application/Services/Onboarding/Lifecycle/OnboardingTaskLifecycleService.cs index f7733d6..b90f482 100644 --- a/SimpleAdmin.Application/Services/Onboarding/Lifecycle/OnboardingTaskLifecycleService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/Lifecycle/OnboardingTaskLifecycleService.cs @@ -55,6 +55,50 @@ public class OnboardingTaskLifecycleService : IOnboardingTaskLifecycleService await Log(task, OnboardingAuditAction.Revoke, input.AuditOpinion); } + /// + /// 删除已撤销的入职任务及其全部关联快照数据。 + /// + public async Task Delete(BaseIdInput input) + { + var task = await Authorize(input.Id); + if (task.TaskStatus != OnboardingTaskStatus.Revoked) + { + throw Oops.Bah("仅已撤销的任务可以删除"); + } + + await _db.Ado.BeginTranAsync(); + try + { + var taskContractIds = await _db.Queryable() + .Where(x => x.TaskId == task.Id) + .Select(x => x.Id) + .ToListAsync(); + + if (taskContractIds.Count > 0) + { + await _db.Deleteable() + .Where(x => taskContractIds.Contains(x.TaskContractId)) + .ExecuteCommandAsync(); + } + + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync(); + await _db.Deleteable().In(task.Id).ExecuteCommandAsync(); + await _db.Ado.CommitTranAsync(); + } + catch + { + await _db.Ado.RollbackTranAsync(); + throw; + } + } + private async Task Authorize(long taskId) { var task = await _db.Queryable().InSingleAsync(taskId) diff --git a/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/IOnboardingTemplateService.cs b/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/IOnboardingTemplateService.cs index c148d40..24f9c4a 100644 --- a/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/IOnboardingTemplateService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/IOnboardingTemplateService.cs @@ -3,7 +3,7 @@ namespace SimpleAdmin.Application; /// /// 入职模板聚合配置服务。 /// -public interface IOnboardingTemplateService +public interface IOnboardingTemplateService : ITransient { /// /// 分页查询入职模板。 diff --git a/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/OnboardingTemplateService.cs b/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/OnboardingTemplateService.cs index 8cedffa..ef92726 100644 --- a/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/OnboardingTemplateService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/OnboardingTemplate/OnboardingTemplateService.cs @@ -16,6 +16,7 @@ public class OnboardingTemplateService : IOnboardingTemplateService public async Task> Page(OnboardingTemplatePageInput input) { var query = _db.Queryable() + .Where(item => !item.IsDelete) .WhereIF(!string.IsNullOrWhiteSpace(input.Keyword), item => item.TemplateCode.Contains(input.Keyword) || item.TemplateName.Contains(input.Keyword)) .WhereIF(input.CompanyId.HasValue, item => item.CompanyId == input.CompanyId.Value) @@ -150,7 +151,15 @@ public class OnboardingTemplateService : IOnboardingTemplateService { foreach (var id in input.Ids) await DeleteRelations(id); - await _db.Deleteable().In(input.Ids).ExecuteCommandAsync(); + + await _db.Deleteable() + .Where(it => input.Ids.Contains(it.Id)) + .ExecuteCommandAsync(); + await _db.Updateable() + .SetColumns(it => it.IsDelete == true) + .Where(it => input.Ids.Contains(it.Id)) + .ExecuteCommandAsync(); + await _db.Ado.CommitTranAsync(); } catch diff --git a/SimpleAdmin.Application/SimpleAdmin.Application.xml b/SimpleAdmin.Application/SimpleAdmin.Application.xml index 925de83..fcbb97d 100644 --- a/SimpleAdmin.Application/SimpleAdmin.Application.xml +++ b/SimpleAdmin.Application/SimpleAdmin.Application.xml @@ -2080,6 +2080,11 @@ 启用或停用合同模板版本。 + + + 删除未被入职模板或任务使用的合同版本。 + + 分页查询指定模板版本自动识别出的变量。 @@ -2087,7 +2092,7 @@ - 编辑并确认草稿模板版本中的变量定义。 + 编辑并确认模板版本中的变量定义。 @@ -2117,7 +2122,12 @@ - 删除未被版本、适用范围或任务合同引用的模板。 + 删除未被入职模板或任务合同引用的模板(级联删除未使用的版本和变量)。 + + + + + 删除未被入职模板或任务使用的合同版本。 @@ -2142,7 +2152,7 @@ - 编辑草稿模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。 + 编辑模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。 @@ -2401,6 +2411,11 @@ 撤销尚未归档的入职任务并使员工链接失效。 + + + 删除已撤销的入职任务及其全部关联快照数据。 + + 实现入职任务生命周期业务能力。 @@ -2416,6 +2431,11 @@ 撤销入职任务并同步撤销仍然有效的员工填写链接。 + + + 删除已撤销的入职任务及其全部关联快照数据。 + + 审核候选人上传材料参数。 diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs index 0080abc..c8dd429 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingContractTemplateController.cs @@ -109,6 +109,15 @@ public class OnboardingContractTemplateController await _service.SetVersionStatus(input); } + /// + /// 删除未被入职模板或任务使用的合同模板版本。 + /// + [HttpPost("version/delete")] + public async Task DeleteVersion([FromBody] BaseIdInput input) + { + await _service.DeleteVersion(input); + } + /// /// 分页查询模板变量。 /// diff --git a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs index 462843a..ed5d3eb 100644 --- a/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs +++ b/SimpleAdmin.Web.Core/Controllers/Application/Onboarding/OnboardingTaskLifecycleController.cs @@ -32,4 +32,13 @@ public class OnboardingTaskLifecycleController { await _service.Revoke(input); } + + /// + /// 删除已撤销的入职任务。 + /// + [HttpPost("delete")] + public async Task Delete([FromBody] BaseIdInput input) + { + await _service.Delete(input); + } } diff --git a/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml b/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml index 7385258..bd5baa1 100644 --- a/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml +++ b/SimpleAdmin.Web.Core/SimpleAdmin.Web.Core.xml @@ -136,6 +136,11 @@ 设置合同模板版本状态。 + + + 删除未被入职模板或任务使用的合同模板版本。 + + 分页查询模板变量。 @@ -331,6 +336,11 @@ 撤销入职任务及员工填写链接。 + + + 删除已撤销的入职任务。 + + 提供入职任务查询相关 HTTP 接口。