247 lines
11 KiB
C#
247 lines
11 KiB
C#
namespace SimpleAdmin.Application;
|
|
|
|
/// <summary>
|
|
/// 合同模板主档案;具体 DOCX 文件、变量与适用范围均挂在此档案下。
|
|
/// </summary>
|
|
public class OnboardingContractTemplateService : DbRepository<ObContractTemplate>, IOnboardingContractTemplateService
|
|
{
|
|
public async Task<SqlSugarPagedList<ObContractTemplate>> Page(OnboardingContractTemplatePageInput input)
|
|
{
|
|
return await Context.Queryable<ObContractTemplate>()
|
|
.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<ObContractTemplate> 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<ObContractTemplate>());
|
|
}
|
|
|
|
public async Task Edit(OnboardingContractTemplateEditInput input)
|
|
{
|
|
await Detail(new BaseIdInput { Id = input.Id });
|
|
await EnsureCodeUnique(input.TemplateCode, input.Id);
|
|
await UpdateAsync(input.Adapt<ObContractTemplate>());
|
|
}
|
|
|
|
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 hasContracts = await Context.Queryable<ObTaskContract>()
|
|
.AnyAsync(it => input.Ids.Contains(it.TemplateId));
|
|
if (hasContracts)
|
|
throw Oops.Bah("模板已生成入职合同,不能删除");
|
|
|
|
await DeleteByIdsAsync(input.Ids.Cast<object>().ToArray());
|
|
}
|
|
|
|
public async Task<SqlSugarPagedList<ObContractTemplateVersion>> VersionPage(OnboardingContractVersionPageInput input)
|
|
{
|
|
return await Context.Queryable<ObContractTemplateVersion>()
|
|
.Where(it => it.TemplateId == input.TemplateId)
|
|
.WhereIF(!string.IsNullOrWhiteSpace(input.VersionStatus), it => it.VersionStatus == input.VersionStatus)
|
|
.OrderByDescending(it => it.CreateTime)
|
|
.ToPagedListAsync(input.PageNum, input.PageSize);
|
|
}
|
|
|
|
public async Task AddVersion(OnboardingContractVersionAddInput input)
|
|
{
|
|
await Detail(new BaseIdInput { Id = input.TemplateId });
|
|
|
|
var file = await Context.Queryable<SysFile>().InSingleAsync(input.SourceDocxFileId)
|
|
?? throw Oops.Bah("DOCX源文件不存在");
|
|
if (!string.Equals(file.Suffix, "docx", StringComparison.OrdinalIgnoreCase))
|
|
throw Oops.Bah("合同模板仅支持DOCX文件");
|
|
|
|
var versionExists = await Context.Queryable<ObContractTemplateVersion>()
|
|
.AnyAsync(it => it.TemplateId == input.TemplateId && it.VersionNo == input.VersionNo);
|
|
if (versionExists)
|
|
throw Oops.Bah("该模板版本号已存在");
|
|
|
|
await Context.Insertable(input.Adapt<ObContractTemplateVersion>()).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task SetVersionStatus(OnboardingContractVersionStatusInput input)
|
|
{
|
|
if (input.VersionStatus != ContractTemplateVersionStatus.Enabled
|
|
&& input.VersionStatus != ContractTemplateVersionStatus.Disabled)
|
|
{
|
|
throw Oops.Bah("版本状态仅支持启用或停用");
|
|
}
|
|
|
|
var version = await Context.Queryable<ObContractTemplateVersion>().InSingleAsync(input.Id)
|
|
?? throw Oops.Bah("模板版本不存在");
|
|
|
|
if (input.VersionStatus == ContractTemplateVersionStatus.Enabled)
|
|
{
|
|
var hasVariables = await Context.Queryable<ObTemplateVariable>()
|
|
.AnyAsync(it => it.TemplateVersionId == input.Id);
|
|
if (!hasVariables)
|
|
throw Oops.Bah("请先配置模板变量后再启用");
|
|
}
|
|
|
|
version.VersionStatus = input.VersionStatus;
|
|
await Context.Updateable(version).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task<SqlSugarPagedList<ObTemplateVariable>> VariablePage(OnboardingTemplateVariablePageInput input)
|
|
{
|
|
return await Context.Queryable<ObTemplateVariable>()
|
|
.Where(it => it.TemplateVersionId == input.TemplateVersionId)
|
|
.OrderBy(it => it.SortCode)
|
|
.OrderBy(it => it.VariableCode)
|
|
.ToPagedListAsync(input.PageNum, input.PageSize);
|
|
}
|
|
|
|
public async Task AddVariable(OnboardingTemplateVariableAddInput input)
|
|
{
|
|
await EnsureVersionDraft(input.TemplateVersionId);
|
|
await EnsureVariableUnique(input.TemplateVersionId, input.VariableCode, 0);
|
|
await Context.Insertable(input.Adapt<ObTemplateVariable>()).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task EditVariable(OnboardingTemplateVariableEditInput input)
|
|
{
|
|
var variable = await Context.Queryable<ObTemplateVariable>().InSingleAsync(input.Id)
|
|
?? throw Oops.Bah("模板变量不存在");
|
|
if (variable.TemplateVersionId != input.TemplateVersionId)
|
|
throw Oops.Bah("不允许变更变量所属版本");
|
|
|
|
await EnsureVersionDraft(input.TemplateVersionId);
|
|
await EnsureVariableUnique(input.TemplateVersionId, input.VariableCode, input.Id);
|
|
await Context.Updateable(input.Adapt<ObTemplateVariable>()).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task DeleteVariable(BaseIdListInput input)
|
|
{
|
|
if (input.Ids.Count == 0)
|
|
return;
|
|
|
|
var versionIds = await Context.Queryable<ObTemplateVariable>()
|
|
.Where(it => input.Ids.Contains(it.Id))
|
|
.Select(it => it.TemplateVersionId)
|
|
.ToListAsync();
|
|
|
|
foreach (var versionId in versionIds.Distinct())
|
|
await EnsureVersionDraft(versionId);
|
|
|
|
await Context.Deleteable<ObTemplateVariable>().In(input.Ids).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task<SqlSugarPagedList<ObContractScope>> ScopePage(OnboardingContractScopePageInput input)
|
|
{
|
|
return await Context.Queryable<ObContractScope>()
|
|
.WhereIF(input.CompanyId.HasValue, it => it.CompanyId == input.CompanyId.Value)
|
|
.WhereIF(input.PositionId.HasValue, it => it.PositionId == input.PositionId.Value)
|
|
.WhereIF(input.TemplateId.HasValue, it => it.TemplateId == input.TemplateId.Value)
|
|
.OrderBy(it => it.SortCode)
|
|
.ToPagedListAsync(input.PageNum, input.PageSize);
|
|
}
|
|
|
|
public async Task AddScope(OnboardingContractScopeAddInput input)
|
|
{
|
|
await EnsureScopeValid(input.CompanyId, input.PositionId, input.TemplateId, input.TemplateVersionId);
|
|
await EnsureScopeUnique(input.CompanyId, input.PositionId, input.TemplateVersionId, 0);
|
|
await Context.Insertable(input.Adapt<ObContractScope>()).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task EditScope(OnboardingContractScopeEditInput input)
|
|
{
|
|
var scopeExists = await Context.Queryable<ObContractScope>().AnyAsync(it => it.Id == input.Id);
|
|
if (!scopeExists)
|
|
throw Oops.Bah("合同适用范围不存在");
|
|
|
|
await EnsureScopeValid(input.CompanyId, input.PositionId, input.TemplateId, input.TemplateVersionId);
|
|
await EnsureScopeUnique(input.CompanyId, input.PositionId, input.TemplateVersionId, input.Id);
|
|
await Context.Updateable(input.Adapt<ObContractScope>()).ExecuteCommandAsync();
|
|
}
|
|
|
|
public async Task DeleteScope(BaseIdListInput input)
|
|
{
|
|
if (input.Ids.Count == 0)
|
|
return;
|
|
|
|
await Context.Deleteable<ObContractScope>().In(input.Ids).ExecuteCommandAsync();
|
|
}
|
|
|
|
private async Task EnsureCodeUnique(string code, long id)
|
|
{
|
|
var exists = await Context.Queryable<ObContractTemplate>()
|
|
.AnyAsync(it => it.TemplateCode == code && it.Id != id);
|
|
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("只有草稿版本可维护变量");
|
|
}
|
|
|
|
private async Task EnsureVariableUnique(long versionId, string code, long id)
|
|
{
|
|
var exists = await Context.Queryable<ObTemplateVariable>()
|
|
.AnyAsync(it => it.TemplateVersionId == versionId && it.VariableCode == code && it.Id != id);
|
|
if (exists)
|
|
throw Oops.Bah("该版本变量编码已存在");
|
|
}
|
|
|
|
private async Task EnsureScopeValid(long companyId, long? positionId, long templateId, long versionId)
|
|
{
|
|
var companyExists = await Context.Queryable<ObCompany>()
|
|
.AnyAsync(it => it.Id == companyId && it.Status == "enable");
|
|
if (!companyExists)
|
|
throw Oops.Bah("所属公司不存在或未启用");
|
|
|
|
if (positionId.HasValue)
|
|
{
|
|
var positionExists = await Context.Queryable<ObPosition>()
|
|
.AnyAsync(it => it.Id == positionId.Value && it.CompanyId == companyId && it.Status == "enable");
|
|
if (!positionExists)
|
|
throw Oops.Bah("岗位不存在、未启用或不属于该公司");
|
|
}
|
|
|
|
var version = await Context.Queryable<ObContractTemplateVersion>().InSingleAsync(versionId)
|
|
?? throw Oops.Bah("合同版本不存在");
|
|
if (version.TemplateId != templateId || version.VersionStatus != ContractTemplateVersionStatus.Enabled)
|
|
throw Oops.Bah("只能配置该模板的已启用合同版本");
|
|
}
|
|
|
|
private async Task EnsureScopeUnique(long companyId, long? positionId, long versionId, long id)
|
|
{
|
|
var exists = await Context.Queryable<ObContractScope>()
|
|
.AnyAsync(it => it.CompanyId == companyId
|
|
&& it.PositionId == positionId
|
|
&& it.TemplateVersionId == versionId
|
|
&& it.Id != id);
|
|
if (exists)
|
|
throw Oops.Bah("该公司、岗位和合同版本的适用范围已存在");
|
|
}
|
|
}
|