This commit is contained in:
fuenmao
2026-08-25 13:54:16 +08:00
parent 085bf5e2ab
commit 38801533e9
10 changed files with 196 additions and 30 deletions
@@ -45,13 +45,18 @@ public interface IOnboardingContractTemplateService : ITransient
/// </summary>
Task SetVersionStatus(OnboardingContractVersionStatusInput input);
/// <summary>
/// 删除未被入职模板或任务使用的合同版本。
/// </summary>
Task DeleteVersion(BaseIdInput input);
/// <summary>
/// 分页查询指定模板版本自动识别出的变量。
/// </summary>
Task<SqlSugarPagedList<ObTemplateVariable>> VariablePage(OnboardingTemplateVariablePageInput input);
/// <summary>
/// 编辑并确认草稿模板版本中的变量定义。
/// 编辑并确认模板版本中的变量定义。
/// </summary>
Task EditVariable(OnboardingTemplateVariableEditInput input);
}
@@ -11,6 +11,7 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
{
_fileService = fileService;
}
/// <summary>
/// 分页查询合同模板主档案。
/// </summary>
@@ -55,34 +56,92 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
}
/// <summary>
/// 删除未被版本、适用范围或任务合同引用的模板。
/// 删除未被入职模板或任务合同引用的模板(级联删除未使用的版本和变量)。
/// </summary>
public async Task Delete(BaseIdListInput input)
{
if (input.Ids.Count == 0)
return;
var hasVersions = await Context.Queryable<ObContractTemplateVersion>()
.AnyAsync(it => input.Ids.Contains(it.TemplateId));
if (hasVersions)
throw Oops.Bah("模板已有版本,不能删除");
var hasScopes = await Context.Queryable<ObContractScope>()
.AnyAsync(it => input.Ids.Contains(it.TemplateId));
if (hasScopes)
throw Oops.Bah("模板已配置旧版适用范围,不能删除");
var hasOnboardingTemplates = await Context.Queryable<ObOnboardingTemplateContract>()
.AnyAsync(it => input.Ids.Contains(it.ContractTemplateId));
if (hasOnboardingTemplates)
throw Oops.Bah("模板已被入职模板引用,不能删除");
throw Oops.Bah("模板已被入职模板引用,不能删除,请先在入职模板中移除关联");
var hasContracts = await Context.Queryable<ObTaskContract>()
.AnyAsync(it => input.Ids.Contains(it.TemplateId));
if (hasContracts)
throw Oops.Bah("模板已生成入职合同,不能删除");
throw Oops.Bah("模板已生成入职任务合同,不能删除,可改为停用");
await DeleteByIdsAsync(input.Ids.Cast<object>().ToArray());
var versionIds = await Context.Queryable<ObContractTemplateVersion>()
.Where(it => input.Ids.Contains(it.TemplateId))
.Select(it => it.Id)
.ToListAsync();
await Context.Ado.BeginTranAsync();
try
{
if (versionIds.Count > 0)
{
await Context.Deleteable<ObTemplateVariable>()
.Where(it => versionIds.Contains(it.TemplateVersionId))
.ExecuteCommandAsync();
await Context.Deleteable<ObContractTemplateVersion>()
.In(versionIds)
.ExecuteCommandAsync();
}
await Context.Deleteable<ObContractScope>()
.Where(it => input.Ids.Contains(it.TemplateId))
.ExecuteCommandAsync();
await DeleteByIdsAsync(input.Ids.Cast<object>().ToArray());
await Context.Ado.CommitTranAsync();
}
catch
{
await Context.Ado.RollbackTranAsync();
throw;
}
}
/// <summary>
/// 删除未被入职模板或任务使用的合同版本。
/// </summary>
public async Task DeleteVersion(BaseIdInput input)
{
var version = await Context.Queryable<ObContractTemplateVersion>().InSingleAsync(input.Id)
?? throw Oops.Bah("合同版本不存在");
var isUsedInOnboardingTemplate = await Context.Queryable<ObOnboardingTemplateContract>()
.AnyAsync(it => it.ContractTemplateVersionId == version.Id);
if (isUsedInOnboardingTemplate)
throw Oops.Bah("该版本已被入职模板引用,不能删除,请先在入职模板中移除关联");
var isUsedInTask = await Context.Queryable<ObTaskContract>()
.AnyAsync(it => it.TemplateVersionId == version.Id);
if (isUsedInTask)
throw Oops.Bah("该版本已用于实际入职任务,不能删除,可改为停用");
await Context.Ado.BeginTranAsync();
try
{
await Context.Deleteable<ObTemplateVariable>()
.Where(it => it.TemplateVersionId == version.Id)
.ExecuteCommandAsync();
await Context.Deleteable<ObContractScope>()
.Where(it => it.TemplateVersionId == version.Id)
.ExecuteCommandAsync();
await Context.Deleteable<ObContractTemplateVersion>()
.In(version.Id)
.ExecuteCommandAsync();
await Context.Ado.CommitTranAsync();
}
catch
{
await Context.Ado.RollbackTranAsync();
throw;
}
}
/// <summary>
@@ -183,7 +242,7 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
.ToPagedListAsync(input.PageNum, input.PageSize);
}
/// <summary>
/// 编辑草稿模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。
/// 编辑模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。
/// </summary>
public async Task EditVariable(OnboardingTemplateVariableEditInput input)
{
@@ -194,7 +253,11 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
if (!string.Equals(variable.VariableCode, input.VariableCode, StringComparison.Ordinal))
throw Oops.Bah("DOCX 占位符编码由系统识别,不能修改");
await EnsureVersionDraft(input.TemplateVersionId);
var isUsedInTask = await Context.Queryable<ObTaskContract>()
.AnyAsync(it => it.TemplateVersionId == input.TemplateVersionId);
if (isUsedInTask)
throw Oops.Bah("该版本已生成实际入职任务合同,变量配置已锁定");
var entity = input.Adapt<ObTemplateVariable>();
entity.VariableCode = variable.VariableCode;
await Context.Updateable(entity).ExecuteCommandAsync();
@@ -255,12 +318,4 @@ public class OnboardingContractTemplateService : DbRepository<ObContractTemplate
if (exists)
throw Oops.Bah("模板编码已存在");
}
private async Task EnsureVersionDraft(long versionId)
{
var version = await Context.Queryable<ObContractTemplateVersion>().InSingleAsync(versionId)
?? throw Oops.Bah("模板版本不存在");
if (version.VersionStatus != ContractTemplateVersionStatus.Draft)
throw Oops.Bah("只有草稿版本可维护变量");
}
}
@@ -14,4 +14,9 @@ public interface IOnboardingTaskLifecycleService : ITransient
/// 撤销尚未归档的入职任务并使员工链接失效。
/// </summary>
Task Revoke(OnboardingAuditActionInput input);
/// <summary>
/// 删除已撤销的入职任务及其全部关联快照数据。
/// </summary>
Task Delete(BaseIdInput input);
}
@@ -55,6 +55,50 @@ public class OnboardingTaskLifecycleService : IOnboardingTaskLifecycleService
await Log(task, OnboardingAuditAction.Revoke, input.AuditOpinion);
}
/// <summary>
/// 删除已撤销的入职任务及其全部关联快照数据。
/// </summary>
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<ObTaskContract>()
.Where(x => x.TaskId == task.Id)
.Select(x => x.Id)
.ToListAsync();
if (taskContractIds.Count > 0)
{
await _db.Deleteable<ObTaskContractVariable>()
.Where(x => taskContractIds.Contains(x.TaskContractId))
.ExecuteCommandAsync();
}
await _db.Deleteable<ObTaskContract>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskLink>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskFormRequirement>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskMaterialRequirement>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskMaterial>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskFormValue>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskEmployeeInfo>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObTaskAudit>().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable<ObOnboardingTask>().In(task.Id).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch
{
await _db.Ado.RollbackTranAsync();
throw;
}
}
private async Task<ObOnboardingTask> Authorize(long taskId)
{
var task = await _db.Queryable<ObOnboardingTask>().InSingleAsync(taskId)
@@ -3,7 +3,7 @@ namespace SimpleAdmin.Application;
/// <summary>
/// 入职模板聚合配置服务。
/// </summary>
public interface IOnboardingTemplateService
public interface IOnboardingTemplateService : ITransient
{
/// <summary>
/// 分页查询入职模板。
@@ -16,6 +16,7 @@ public class OnboardingTemplateService : IOnboardingTemplateService
public async Task<SqlSugarPagedList<OnboardingTemplateOutput>> Page(OnboardingTemplatePageInput input)
{
var query = _db.Queryable<ObOnboardingTemplate>()
.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<ObOnboardingTemplate>().In(input.Ids).ExecuteCommandAsync();
await _db.Deleteable<ObOnboardingTemplate>()
.Where(it => input.Ids.Contains(it.Id))
.ExecuteCommandAsync();
await _db.Updateable<ObOnboardingTemplate>()
.SetColumns(it => it.IsDelete == true)
.Where(it => input.Ids.Contains(it.Id))
.ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch
@@ -2080,6 +2080,11 @@
启用或停用合同模板版本。
</summary>
</member>
<member name="M:SimpleAdmin.Application.IOnboardingContractTemplateService.DeleteVersion(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除未被入职模板或任务使用的合同版本。
</summary>
</member>
<member name="M:SimpleAdmin.Application.IOnboardingContractTemplateService.VariablePage(SimpleAdmin.Application.OnboardingTemplateVariablePageInput)">
<summary>
分页查询指定模板版本自动识别出的变量。
@@ -2087,7 +2092,7 @@
</member>
<member name="M:SimpleAdmin.Application.IOnboardingContractTemplateService.EditVariable(SimpleAdmin.Application.OnboardingTemplateVariableEditInput)">
<summary>
编辑并确认草稿模板版本中的变量定义。
编辑并确认模板版本中的变量定义。
</summary>
</member>
<member name="T:SimpleAdmin.Application.OnboardingContractTemplateService">
@@ -2117,7 +2122,12 @@
</member>
<member name="M:SimpleAdmin.Application.OnboardingContractTemplateService.Delete(SimpleAdmin.Core.BaseIdListInput)">
<summary>
删除未被版本、适用范围或任务合同引用的模板。
删除未被入职模板或任务合同引用的模板(级联删除未使用的版本和变量)。
</summary>
</member>
<member name="M:SimpleAdmin.Application.OnboardingContractTemplateService.DeleteVersion(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除未被入职模板或任务使用的合同版本。
</summary>
</member>
<member name="M:SimpleAdmin.Application.OnboardingContractTemplateService.VersionPage(SimpleAdmin.Application.OnboardingContractVersionPageInput)">
@@ -2142,7 +2152,7 @@
</member>
<member name="M:SimpleAdmin.Application.OnboardingContractTemplateService.EditVariable(SimpleAdmin.Application.OnboardingTemplateVariableEditInput)">
<summary>
编辑草稿模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。
编辑模板版本中自动识别出的变量,不允许修改 DOCX 占位符编码。
</summary>
</member>
<member name="T:SimpleAdmin.Application.OnboardingEmployeePageInput">
@@ -2401,6 +2411,11 @@
撤销尚未归档的入职任务并使员工链接失效。
</summary>
</member>
<member name="M:SimpleAdmin.Application.IOnboardingTaskLifecycleService.Delete(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除已撤销的入职任务及其全部关联快照数据。
</summary>
</member>
<member name="T:SimpleAdmin.Application.OnboardingTaskLifecycleService">
<summary>
实现入职任务生命周期业务能力。
@@ -2416,6 +2431,11 @@
撤销入职任务并同步撤销仍然有效的员工填写链接。
</summary>
</member>
<member name="M:SimpleAdmin.Application.OnboardingTaskLifecycleService.Delete(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除已撤销的入职任务及其全部关联快照数据。
</summary>
</member>
<member name="T:SimpleAdmin.Application.OnboardingMaterialReviewInput">
<summary>
审核候选人上传材料参数。
@@ -109,6 +109,15 @@ public class OnboardingContractTemplateController
await _service.SetVersionStatus(input);
}
/// <summary>
/// 删除未被入职模板或任务使用的合同模板版本。
/// </summary>
[HttpPost("version/delete")]
public async Task DeleteVersion([FromBody] BaseIdInput input)
{
await _service.DeleteVersion(input);
}
/// <summary>
/// 分页查询模板变量。
/// </summary>
@@ -32,4 +32,13 @@ public class OnboardingTaskLifecycleController
{
await _service.Revoke(input);
}
/// <summary>
/// 删除已撤销的入职任务。
/// </summary>
[HttpPost("delete")]
public async Task Delete([FromBody] BaseIdInput input)
{
await _service.Delete(input);
}
}
@@ -136,6 +136,11 @@
设置合同模板版本状态。
</summary>
</member>
<member name="M:SimpleAdmin.Web.Core.OnboardingContractTemplateController.DeleteVersion(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除未被入职模板或任务使用的合同模板版本。
</summary>
</member>
<member name="M:SimpleAdmin.Web.Core.OnboardingContractTemplateController.VariablePage(SimpleAdmin.Application.OnboardingTemplateVariablePageInput)">
<summary>
分页查询模板变量。
@@ -331,6 +336,11 @@
撤销入职任务及员工填写链接。
</summary>
</member>
<member name="M:SimpleAdmin.Web.Core.OnboardingTaskLifecycleController.Delete(SimpleAdmin.Core.BaseIdInput)">
<summary>
删除已撤销的入职任务。
</summary>
</member>
<member name="T:SimpleAdmin.Web.Core.OnboardingTaskQueryController">
<summary>
提供入职任务查询相关 HTTP 接口。