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
@@ -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("只有草稿版本可维护变量");
}
}