Files
OnboardXAdmin/SimpleAdmin.Application/Services/Onboarding/PublicTask/OnboardingEmployeeFieldRequirementSnapshot.cs
T
2026-09-14 15:59:37 +08:00

68 lines
2.4 KiB
C#

namespace SimpleAdmin.Application;
/// <summary>
/// 生成并读取入职登记表内置员工字段的任务级必填快照。
/// </summary>
internal static class OnboardingEmployeeFieldRequirementSnapshot
{
private const string EmployeeVariablePrefix = "employee.";
/// <summary>
/// 根据当前内置员工变量配置创建一份任务快照。
/// </summary>
public static async Task<List<ObTaskFormRequirement>> BuildFromCurrentDefinitions(
SqlSugarScope db,
long taskId)
{
var definitions = await db.Queryable<ObVariableDefinition>()
.Where(item => item.IsBuiltIn
&& item.VariableCategory == ContractVariableType.Employee)
.OrderBy(item => item.SortCode)
.OrderBy(item => item.Id)
.ToListAsync();
return definitions.Select(definition => new ObTaskFormRequirement
{
Id = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(),
TaskId = taskId,
FieldId = definition.Id,
FieldCode = definition.VariableCode,
FieldName = definition.VariableName,
DataType = definition.DataType,
Required = definition.Required,
SortCode = definition.SortCode
}).ToList();
}
/// <summary>
/// 读取任务冻结配置;历史任务没有员工字段快照时使用当前配置兼容。
/// </summary>
public static async Task<List<ObTaskFormRequirement>> GetForTask(
SqlSugarScope db,
long taskId)
{
var snapshots = await db.Queryable<ObTaskFormRequirement>()
.Where(item => item.TaskId == taskId)
.OrderBy(item => item.SortCode)
.ToListAsync();
if (snapshots.Any(IsEmployeeField))
return snapshots;
var compatibilitySnapshots = await BuildFromCurrentDefinitions(db, taskId);
if (snapshots.Count == 0)
return compatibilitySnapshots;
snapshots.AddRange(compatibilitySnapshots);
return snapshots.OrderBy(item => item.SortCode).ToList();
}
/// <summary>
/// 判断快照是否对应入职登记表内置员工字段。
/// </summary>
public static bool IsEmployeeField(ObTaskFormRequirement requirement)
{
return requirement?.FieldCode?.StartsWith(
EmployeeVariablePrefix,
StringComparison.OrdinalIgnoreCase) == true;
}
}