This commit is contained in:
fuenmao
2026-08-25 20:37:17 +08:00
parent 38801533e9
commit be20a31332
22 changed files with 1090 additions and 336 deletions
@@ -55,6 +55,23 @@ public class OnboardingSaveMaterialInput
public long FileId { get; set; }
}
/// <summary>
/// 删除员工在当前可编辑任务中上传的一条材料。
/// </summary>
public class OnboardingDeleteMaterialInput
{
/// <summary>
/// 员工填写链接中的明文 Token。
/// </summary>
[global::System.ComponentModel.DataAnnotations.Required]
public string Token { get; set; }
/// <summary>
/// 任务材料记录 Id。
/// </summary>
public long TaskMaterialId { get; set; }
}
/// <summary>
/// 员工确认阅读合同参数。
/// </summary>
@@ -9,18 +9,27 @@ public interface IOnboardingPublicSubmissionService : ITransient
/// 保存候选人填写的动态字段值。
/// </summary>
Task SaveDynamicValues(OnboardingSaveDynamicValuesInput input);
/// <summary>
/// 关联候选人已经上传的系统文件与材料类型。
/// </summary>
Task SaveMaterial(OnboardingSaveMaterialInput input);
/// <summary>
/// 删除可编辑任务中的一条已上传材料关联。
/// </summary>
Task DeleteMaterial(OnboardingDeleteMaterialInput input);
/// <summary>
/// 记录候选人已阅读并确认指定任务合同。
/// </summary>
Task ConfirmContract(OnboardingConfirmContractInput input);
/// <summary>
/// 校验全部必填资料后提交入职任务进入审核。
/// </summary>
Task Submit(OnboardingSubmitInput input);
/// <summary>
/// 在保存文件前校验材料适用范围、扩展名、大小和数量。
/// </summary>
@@ -19,37 +19,8 @@ public class OnboardingPublicSubmissionService : IOnboardingPublicSubmissionServ
/// </summary>
public async Task SaveDynamicValues(OnboardingSaveDynamicValuesInput input)
{
var task = await GetEditableTask(input.Token);
var requirements = await GetFormRequirements(task.Id);
var fieldIds = input.Values.Select(item => item.FieldId).Distinct().ToList();
var hasInapplicableField = fieldIds.Any(id => requirements.All(item => item.FieldId != id));
if (hasInapplicableField)
throw Oops.Bah("填写字段不属于当前入职模板");
foreach (var value in input.Values)
{
var requirement = requirements.FirstOrDefault(item => item.FieldId == value.FieldId)
?? throw Oops.Bah("动态补充字段不存在");
var old = await _db.Queryable<ObTaskFormValue>()
.FirstAsync(item => item.TaskId == task.Id && item.FieldId == requirement.FieldId);
var row = new ObTaskFormValue
{
Id = old?.Id ?? global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(),
TaskId = task.Id,
FieldId = requirement.FieldId,
FieldCode = requirement.FieldCode,
FieldName = requirement.FieldName,
FieldValue = value.FieldValue,
SubmitRound = task.SubmitCount + 1
};
if (old == null)
await _db.Insertable(row).ExecuteCommandAsync();
else
await _db.Updateable(row).ExecuteCommandAsync();
}
await _snapshotService.Build(task.Id, invalidateGeneratedPreview: true);
await GetEditableTask(input.Token);
throw Oops.Bah("新版入职登记表不再使用旧动态字段接口,请通过员工基础信息接口保存补充变量");
}
/// <summary>
@@ -96,6 +67,25 @@ public class OnboardingPublicSubmissionService : IOnboardingPublicSubmissionServ
}).ExecuteCommandAsync();
}
/// <summary>
/// 任务仍可编辑时删除一条已上传材料。
/// </summary>
public async Task DeleteMaterial(
OnboardingDeleteMaterialInput input)
{
var task = await GetEditableTask(input.Token);
var material = await _db.Queryable<ObTaskMaterial>()
.FirstAsync(item =>
item.Id == input.TaskMaterialId
&& item.TaskId == task.Id);
if (material == null)
throw Oops.Bah("上传材料不存在");
await _db.Deleteable<ObTaskMaterial>()
.In(material.Id)
.ExecuteCommandAsync();
}
/// <summary>
/// 记录候选人已经查看并确认动态生成的合同。
/// </summary>
@@ -124,24 +114,14 @@ public class OnboardingPublicSubmissionService : IOnboardingPublicSubmissionServ
var basicInfoIncomplete = info == null
|| string.IsNullOrWhiteSpace(info.EmployeeName)
|| string.IsNullOrWhiteSpace(info.Phone)
|| string.IsNullOrWhiteSpace(info.IdCardNumber);
|| string.IsNullOrWhiteSpace(info.IdCardNumber)
|| string.IsNullOrWhiteSpace(info.BankCardNumber)
|| string.IsNullOrWhiteSpace(info.BankName);
if (basicInfoIncomplete)
throw Oops.Bah("请先完整填写基本信息");
await _snapshotService.Build(task.Id, info);
var requiredFields = (await GetFormRequirements(task.Id))
.Where(item => item.Required)
.Select(item => item.FieldId)
.ToList();
var values = await _db.Queryable<ObTaskFormValue>()
.Where(item => item.TaskId == task.Id)
.ToListAsync();
var hasMissingRequiredField = requiredFields.Any(
id => values.All(item => item.FieldId != id || string.IsNullOrWhiteSpace(item.FieldValue)));
if (hasMissingRequiredField)
throw Oops.Bah("仍有必填补充信息未填写");
var requiredMaterials = (await GetMaterialRequirements(task.Id))
.Where(item => item.Required)
.Select(item => item.MaterialTypeId)
@@ -174,7 +154,7 @@ public class OnboardingPublicSubmissionService : IOnboardingPublicSubmissionServ
AuditRound = task.SubmitCount,
AuditAction = OnboardingAuditAction.Submit,
AuditOpinion = "员工提交入职资料",
SnapshotJson = global::System.Text.Json.JsonSerializer.Serialize(new { info, values, materials }),
SnapshotJson = global::System.Text.Json.JsonSerializer.Serialize(new { info, materials }),
AuditedAt = DateTime.Now
}).ExecuteCommandAsync();
}
@@ -235,14 +215,6 @@ public class OnboardingPublicSubmissionService : IOnboardingPublicSubmissionServ
throw Oops.Bah($"合同“{missing.contract.ContractName}”的必填变量“{missing.definition.VariableName}”尚未填写");
}
private Task<List<ObTaskFormRequirement>> GetFormRequirements(long taskId)
{
return _db.Queryable<ObTaskFormRequirement>()
.Where(item => item.TaskId == taskId)
.OrderBy(item => item.SortCode)
.ToListAsync();
}
private Task<List<ObTaskMaterialRequirement>> GetMaterialRequirements(long taskId)
{
return _db.Queryable<ObTaskMaterialRequirement>()