1
This commit is contained in:
+43
@@ -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; }
|
||||
}
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
public interface IOnboardingTaskContractVariableService : ITransient
|
||||
{
|
||||
Task<List<OnboardingTaskContractVariableOutput>> List(OnboardingTaskContractVariableQueryInput input);
|
||||
Task Save(OnboardingTaskContractVariableSaveInput input);
|
||||
}
|
||||
+139
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user