代码优化

This commit is contained in:
fuenmao
2026-08-27 11:09:20 +08:00
parent 658869b3a7
commit ae8167a566
46 changed files with 2051 additions and 204 deletions
@@ -15,6 +15,11 @@ public class OnboardingTemplatePageInput : BasePageInput
/// </summary>
public long? CompanyId { get; set; }
/// <summary>
/// 所属部门 Id。
/// </summary>
public long? DepartmentId { get; set; }
/// <summary>
/// 适用岗位 Id。
/// </summary>
@@ -51,6 +56,12 @@ public class OnboardingTemplateSaveInput
/// </summary>
public long CompanyId { get; set; }
/// <summary>
/// 所属部门 Id。
/// </summary>
[IdNotNull(ErrorMessage = "所属部门不能为空")]
public long DepartmentId { get; set; }
/// <summary>
/// 适用岗位 Id 列表。
/// </summary>
@@ -165,6 +176,11 @@ public class OnboardingTemplateOutput : ObOnboardingTemplate
/// </summary>
public string CompanyName { get; set; }
/// <summary>
/// 所属部门名称。
/// </summary>
public string DepartmentName { get; set; }
/// <summary>
/// 适用岗位 Id 列表。
/// </summary>
@@ -210,4 +226,4 @@ public class OnboardingTemplateDetailOutput : OnboardingTemplateOutput
/// 上传材料配置明细。
/// </summary>
public List<ObOnboardingTemplateMaterial> Materials { get; set; } = new();
}
}
@@ -26,7 +26,10 @@ public interface IOnboardingTemplateService : ITransient
Task Delete(BaseIdListInput input);
/// <summary>
/// 查询公司岗位可使用的入职模板。
/// 查询公司、部门和岗位可使用的入职模板。
/// </summary>
Task<List<OnboardingTemplateOutput>> ListEnabled(long companyId, long positionId);
}
Task<List<OnboardingTemplateOutput>> ListEnabled(
long companyId,
long departmentId,
long positionId);
}
@@ -20,6 +20,7 @@ public class OnboardingTemplateService : IOnboardingTemplateService
.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)
.WhereIF(input.DepartmentId.HasValue, item => item.DepartmentId == input.DepartmentId.Value)
.WhereIF(!string.IsNullOrWhiteSpace(input.Status), item => item.Status == input.Status);
if (input.PositionId.HasValue)
@@ -62,6 +63,8 @@ public class OnboardingTemplateService : IOnboardingTemplateService
TemplateName = summary.TemplateName,
CompanyId = summary.CompanyId,
CompanyName = summary.CompanyName,
DepartmentId = summary.DepartmentId,
DepartmentName = summary.DepartmentName,
Description = summary.Description,
Status = summary.Status,
CreateTime = summary.CreateTime,
@@ -101,6 +104,7 @@ public class OnboardingTemplateService : IOnboardingTemplateService
TemplateCode = input.TemplateCode.Trim(),
TemplateName = input.TemplateName.Trim(),
CompanyId = input.CompanyId,
DepartmentId = input.DepartmentId,
Description = input.Description,
Status = input.Status
};
@@ -149,9 +153,6 @@ public class OnboardingTemplateService : IOnboardingTemplateService
foreach (var id in input.Ids)
await DeleteRelations(id);
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))
@@ -167,7 +168,10 @@ public class OnboardingTemplateService : IOnboardingTemplateService
}
/// <inheritdoc />
public async Task<List<OnboardingTemplateOutput>> ListEnabled(long companyId, long positionId)
public async Task<List<OnboardingTemplateOutput>> ListEnabled(
long companyId,
long departmentId,
long positionId)
{
var templateIds = await _db.Queryable<ObOnboardingTemplatePosition>()
.Where(item => item.PositionId == positionId)
@@ -175,6 +179,7 @@ public class OnboardingTemplateService : IOnboardingTemplateService
.ToListAsync();
var templates = await _db.Queryable<ObOnboardingTemplate>()
.Where(item => item.CompanyId == companyId
&& item.DepartmentId == departmentId
&& item.Status == "enable"
&& templateIds.Contains(item.Id))
.OrderBy(item => item.TemplateName)
@@ -187,10 +192,13 @@ public class OnboardingTemplateService : IOnboardingTemplateService
input.TemplateCode = input.TemplateCode?.Trim();
input.TemplateName = input.TemplateName?.Trim();
input.PositionIds = input.PositionIds?.Distinct().ToList() ?? new List<long>();
input.Contracts = input.Contracts?
.GroupBy(item => item.ContractTemplateVersionId)
.Select(group => group.First())
.ToList() ?? new List<OnboardingTemplateContractInput>();
input.Contracts ??= new List<OnboardingTemplateContractInput>();
var duplicateContract = input.Contracts
.GroupBy(item => item.ContractTemplateId)
.FirstOrDefault(group => group.Count() > 1);
if (duplicateContract != null)
throw Oops.Bah("同一份合同模板在入职模板中只能选择一个版本");
input.FormFields = input.FormFields?
.GroupBy(item => item.FieldId)
.Select(group => group.First())
@@ -204,10 +212,19 @@ public class OnboardingTemplateService : IOnboardingTemplateService
throw Oops.Bah("请填写入职模板编码和名称");
if (input.CompanyId <= 0)
throw Oops.Bah("请选择所属公司");
if (input.DepartmentId <= 0)
throw Oops.Bah("请选择所属部门");
if (input.PositionIds.Count == 0)
throw Oops.Bah("请至少选择一个适用岗位");
if (input.PositionIds.Any(positionId => positionId <= 0))
throw Oops.Bah("适用岗位数据不正确");
if (input.Contracts.Count == 0)
throw Oops.Bah("请至少选择一份合同文件");
if (input.Contracts.Any(item => item.ContractTemplateId <= 0
|| item.ContractTemplateVersionId <= 0))
{
throw Oops.Bah("合同模板或版本数据不正确");
}
if (input.Status != "enable" && input.Status != "disable")
throw Oops.Bah("入职模板状态不正确");
if (input.Contracts.Any(item => item.PrintCopies <= 0))
@@ -221,12 +238,20 @@ public class OnboardingTemplateService : IOnboardingTemplateService
if (!companyEnabled)
throw Oops.Bah("所属公司不存在或未启用");
var departmentEnabled = await _db.Queryable<ObDepartment>()
.AnyAsync(item => item.Id == input.DepartmentId
&& item.CompanyId == input.CompanyId
&& item.Status == "enable");
if (!departmentEnabled)
throw Oops.Bah("所属部门不存在、未启用或不属于该公司");
var positionCount = await _db.Queryable<ObPosition>()
.CountAsync(item => input.PositionIds.Contains(item.Id)
&& item.CompanyId == input.CompanyId
&& item.DepartmentId == input.DepartmentId
&& item.Status == "enable");
if (positionCount != input.PositionIds.Count)
throw Oops.Bah("存在不属于该公司或未启用的岗位");
throw Oops.Bah("存在未启用或不属于该公司、部门的岗位");
var versionIds = input.Contracts.Select(item => item.ContractTemplateVersionId).ToList();
var versions = await _db.Queryable<ObContractTemplateVersion>()
@@ -239,8 +264,43 @@ public class OnboardingTemplateService : IOnboardingTemplateService
throw Oops.Bah("合同模板与版本不匹配");
}
var contractTemplateIds = input.Contracts
.Select(item => item.ContractTemplateId)
.Distinct()
.ToList();
var contractTemplates = await _db.Queryable<ObContractTemplate>()
.Where(item => contractTemplateIds.Contains(item.Id))
.ToListAsync();
if (contractTemplates.Count != contractTemplateIds.Count
|| contractTemplates.Any(item => item.CompanyId != input.CompanyId
|| item.DepartmentId != input.DepartmentId))
{
throw Oops.Bah("存在不属于当前公司、部门的合同模板");
}
var contractPositionRelations = await _db.Queryable<ObContractTemplatePosition>()
.Where(item => contractTemplateIds.Contains(item.ContractTemplateId))
.ToListAsync();
var unsupportedContract = contractTemplateIds.FirstOrDefault(contractTemplateId =>
{
var supportedPositionIds = contractPositionRelations
.Where(item => item.ContractTemplateId == contractTemplateId)
.Select(item => item.PositionId)
.ToHashSet();
return input.PositionIds.Any(positionId => !supportedPositionIds.Contains(positionId));
});
if (unsupportedContract > 0)
{
var contractName = contractTemplates
.First(item => item.Id == unsupportedContract)
.TemplateName;
throw Oops.Bah($"合同模板“{contractName}”不能覆盖当前选择的全部岗位");
}
if (input.Status == "enable")
{
if (contractTemplates.Any(item => item.Status != "enable"))
throw Oops.Bah("启用入职模板前,请先启用全部合同模板");
if (versions.Any(item => item.VersionStatus != ContractTemplateVersionStatus.Enabled))
throw Oops.Bah("启用入职模板前,请先启用全部合同版本");
}
@@ -302,6 +362,9 @@ public class OnboardingTemplateService : IOnboardingTemplateService
await _db.Deleteable<ObOnboardingTemplateMaterial>()
.Where(item => item.OnboardingTemplateId == templateId)
.ExecuteCommandAsync();
await _db.Deleteable<ObOnboardingTemplateFormField>()
.Where(item => item.OnboardingTemplateId == templateId)
.ExecuteCommandAsync();
}
private async Task<List<OnboardingTemplateOutput>> BuildOutputs(List<ObOnboardingTemplate> templates)
@@ -311,9 +374,19 @@ public class OnboardingTemplateService : IOnboardingTemplateService
var templateIds = templates.Select(item => item.Id).ToList();
var companyIds = templates.Select(item => item.CompanyId).Distinct().ToList();
var departmentIds = templates
.Where(item => item.DepartmentId.HasValue)
.Select(item => item.DepartmentId.Value)
.Distinct()
.ToList();
var companies = await _db.Queryable<ObCompany>()
.Where(item => companyIds.Contains(item.Id))
.ToListAsync();
var departments = departmentIds.Count == 0
? new List<ObDepartment>()
: await _db.Queryable<ObDepartment>()
.Where(item => departmentIds.Contains(item.Id))
.ToListAsync();
var relations = await _db.Queryable<ObOnboardingTemplatePosition>()
.Where(item => templateIds.Contains(item.OnboardingTemplateId))
.ToListAsync();
@@ -338,6 +411,9 @@ public class OnboardingTemplateService : IOnboardingTemplateService
TemplateName = template.TemplateName,
CompanyId = template.CompanyId,
CompanyName = companies.FirstOrDefault(item => item.Id == template.CompanyId)?.CompanyName,
DepartmentId = template.DepartmentId,
DepartmentName = departments
.FirstOrDefault(item => item.Id == template.DepartmentId)?.DepartmentName,
Description = template.Description,
Status = template.Status,
CreateTime = template.CreateTime,
@@ -353,4 +429,4 @@ public class OnboardingTemplateService : IOnboardingTemplateService
};
}).ToList();
}
}
}