namespace SimpleAdmin.Application;
///
/// 合同模板主档案;具体 DOCX 文件、变量与适用范围均挂在此档案下。
///
public class OnboardingContractTemplateService : DbRepository, IOnboardingContractTemplateService
{
private readonly IFileService _fileService;
public OnboardingContractTemplateService(IFileService fileService)
{
_fileService = fileService;
}
///
/// 分页查询合同模板主档案。
///
public async Task> Page(OnboardingContractTemplatePageInput input)
{
return await Context.Queryable()
.WhereIF(
!string.IsNullOrWhiteSpace(input.TemplateName),
it => it.TemplateName.Contains(input.TemplateName) || it.TemplateCode.Contains(input.TemplateName))
.WhereIF(!string.IsNullOrWhiteSpace(input.ContractType), it => it.ContractType == input.ContractType)
.WhereIF(!string.IsNullOrWhiteSpace(input.Status), it => it.Status == input.Status)
.OrderByIF(!string.IsNullOrWhiteSpace(input.SortField), $"{input.SortField} {input.SortOrder}")
.OrderBy(it => it.TemplateName)
.ToPagedListAsync(input.PageNum, input.PageSize);
}
///
/// 查询合同模板详情。
///
public async Task Detail(BaseIdInput input)
{
return await GetByIdAsync(input.Id) ?? throw Oops.Bah("合同模板不存在");
}
///
/// 新增合同模板主档案。
///
public async Task Add(OnboardingContractTemplateAddInput input)
{
await EnsureCodeUnique(input.TemplateCode, 0);
await InsertAsync(input.Adapt());
}
///
/// 编辑合同模板主档案。
///
public async Task Edit(OnboardingContractTemplateEditInput input)
{
await Detail(new BaseIdInput { Id = input.Id });
await EnsureCodeUnique(input.TemplateCode, input.Id);
await UpdateAsync(input.Adapt());
}
///
/// 删除未被入职模板或任务合同引用的模板(级联删除未使用的版本和变量)。
///
public async Task Delete(BaseIdListInput input)
{
if (input.Ids.Count == 0)
return;
var hasOnboardingTemplates = await Context.Queryable()
.AnyAsync(it => input.Ids.Contains(it.ContractTemplateId));
if (hasOnboardingTemplates)
throw Oops.Bah("模板已被入职模板引用,不能删除,请先在入职模板中移除关联");
var hasContracts = await Context.Queryable()
.AnyAsync(it => input.Ids.Contains(it.TemplateId));
if (hasContracts)
throw Oops.Bah("模板已生成入职任务合同,不能删除,可改为停用");
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