This commit is contained in:
fuenmao
2026-08-24 14:26:11 +08:00
parent 01328d567c
commit a51d45372d
54 changed files with 2607 additions and 119 deletions
@@ -0,0 +1,43 @@
namespace SimpleAdmin.Application;
public class OnboardingTaskContractVariableQueryInput
{
[IdNotNull(ErrorMessage = "入职任务Id不能为空")]
public long TaskId { get; set; }
}
public class OnboardingTaskContractVariableSaveInput
{
[IdNotNull(ErrorMessage = "任务合同Id不能为空")]
public long TaskContractId { get; set; }
[global::System.ComponentModel.DataAnnotations.Required(ErrorMessage = "变量不能为空")]
public List<OnboardingTaskContractVariableValueInput> Values { get; set; } = new List<OnboardingTaskContractVariableValueInput>();
}
public class OnboardingTaskContractVariableValueInput
{
[IdNotNull(ErrorMessage = "变量Id不能为空")]
public long Id { get; set; }
public string VariableValue { get; set; }
}
public class OnboardingTaskContractVariableOutput
{
public long TaskContractId { get; set; }
public string ContractName { get; set; }
public string ContractType { get; set; }
public List<OnboardingTaskContractVariableItemOutput> Variables { get; set; } = new List<OnboardingTaskContractVariableItemOutput>();
}
public class OnboardingTaskContractVariableItemOutput
{
public long Id { get; set; }
public string VariableCode { get; set; }
public string VariableName { get; set; }
public string VariableType { get; set; }
public string DataType { get; set; }
public string VariableValue { get; set; }
public bool Required { get; set; }
public bool HrEditable { get; set; }
public bool Editable { get; set; }
}
@@ -0,0 +1,7 @@
namespace SimpleAdmin.Application;
public interface IOnboardingTaskContractVariableService : ITransient
{
Task<List<OnboardingTaskContractVariableOutput>> List(OnboardingTaskContractVariableQueryInput input);
Task Save(OnboardingTaskContractVariableSaveInput input);
}
@@ -0,0 +1,139 @@
namespace SimpleAdmin.Application;
/// <summary>
/// 管理端在链接发送前填写合同薪资、补贴等人事变量。
/// </summary>
public class OnboardingTaskContractVariableService : IOnboardingTaskContractVariableService
{
private readonly ISqlSugarClient _db;
public OnboardingTaskContractVariableService(ISqlSugarClient db)
=> _db = db;
public async Task<List<OnboardingTaskContractVariableOutput>> List(
OnboardingTaskContractVariableQueryInput input)
{
var task = await _db.Queryable<ObOnboardingTask>()
.InSingleAsync(input.TaskId)
?? throw Oops.Bah("入职任务不存在");
var contracts = await _db.Queryable<ObTaskContract>()
.Where(x => x.TaskId == task.Id)
.ToListAsync();
var contractIds = contracts.Select(x => x.Id).ToList();
var templateVersionIds = contracts.Select(x => x.TemplateVersionId).ToList();
var variables = await _db.Queryable<ObTaskContractVariable>()
.Where(x => contractIds.Contains(x.TaskContractId))
.ToListAsync();
var definitions = await _db.Queryable<ObTemplateVariable>()
.Where(x => templateVersionIds.Contains(x.TemplateVersionId))
.ToListAsync();
return contracts.Select(contract => new OnboardingTaskContractVariableOutput
{
TaskContractId = contract.Id,
ContractName = contract.ContractName,
ContractType = contract.ContractType,
Variables = variables
.Where(variable => variable.TaskContractId == contract.Id)
.OrderBy(variable => variable.VariableCode)
.Select(variable =>
{
var definition = definitions.FirstOrDefault(x =>
x.TemplateVersionId == contract.TemplateVersionId &&
x.VariableCode == variable.VariableCode);
var hrEditable = definition?.HrEditable == true;
return new OnboardingTaskContractVariableItemOutput
{
Id = variable.Id,
VariableCode = variable.VariableCode,
VariableName = variable.VariableName,
VariableType = variable.VariableType,
DataType = variable.DataType,
VariableValue = variable.VariableValue,
Required = definition?.Required == true,
HrEditable = hrEditable,
Editable =
variable.VariableType == ContractVariableType.Contract ||
(variable.VariableType == ContractVariableType.Company && hrEditable)
};
})
.ToList()
}).ToList();
}
public async Task Save(OnboardingTaskContractVariableSaveInput input)
{
var contract = await _db.Queryable<ObTaskContract>()
.InSingleAsync(input.TaskContractId)
?? throw Oops.Bah("任务合同不存在");
var task = await _db.Queryable<ObOnboardingTask>()
.InSingleAsync(contract.TaskId)
?? throw Oops.Bah("入职任务不存在");
if (task.TaskStatus != OnboardingTaskStatus.PendingFill &&
task.TaskStatus != OnboardingTaskStatus.Rejected)
{
throw Oops.Bah("任务已提交审核,不能再修改合同参数");
}
var valueIds = input.Values
.Select(x => x.Id)
.Distinct()
.ToList();
var rows = await _db.Queryable<ObTaskContractVariable>()
.Where(x =>
x.TaskContractId == contract.Id &&
valueIds.Contains(x.Id))
.ToListAsync();
if (rows.Count != valueIds.Count)
{
throw Oops.Bah("包含不属于该合同的变量");
}
var variableCodes = rows
.Select(x => x.VariableCode)
.ToList();
var definitions = await _db.Queryable<ObTemplateVariable>()
.Where(x =>
x.TemplateVersionId == contract.TemplateVersionId &&
variableCodes.Contains(x.VariableCode))
.ToListAsync();
foreach (var row in rows)
{
var definition = definitions.FirstOrDefault(x =>
x.VariableCode == row.VariableCode)
?? throw Oops.Bah("合同变量定义不存在");
if (row.VariableType != ContractVariableType.Contract &&
!(row.VariableType == ContractVariableType.Company &&
definition.HrEditable))
{
throw Oops.Bah($"变量“{row.VariableName}”不允许人事手工修改");
}
var inputValue = input.Values.First(x => x.Id == row.Id);
row.VariableValue = inputValue.VariableValue;
row.SourceType = ContractVariableSourceType.HrInput;
row.IsManualOverride = true;
}
if (rows.Count > 0)
{
await _db.Updateable(rows)
.ExecuteCommandAsync();
}
}
}