namespace SimpleAdmin.Application;
///
/// 统一校验候选人身份,避免同一人员通过多个链接重复提交入职资料。
///
public class OnboardingIdentityValidationService : IOnboardingIdentityValidationService
{
private readonly SqlSugarScope _db;
public OnboardingIdentityValidationService()
{
_db = DbContext.DB;
}
///
public async Task EnsureNoDuplicate(
long currentTaskId,
string employeeName,
string idCardNumber)
{
employeeName = employeeName?.Trim();
idCardNumber = idCardNumber?.Trim().ToUpperInvariant();
if (string.IsNullOrWhiteSpace(employeeName) || string.IsNullOrWhiteSpace(idCardNumber))
return;
var formalEmployeeExists = await _db.Queryable()
.AnyAsync(item => item.EmployeeName == employeeName
&& item.IdCardNumber == idCardNumber);
if (formalEmployeeExists)
{
throw Oops.Bah("该姓名和身份证号已完成正式员工建档,请勿重复提交入职资料");
}
// 待填写任务不占用身份,以实际先提交的任务为准;撤销或过期任务允许重新发起。
var duplicateTaskExists = await _db.Queryable()
.InnerJoin((info, task) => info.TaskId == task.Id)
.Where((info, task) => info.TaskId != currentTaskId
&& info.EmployeeName == employeeName
&& info.IdCardNumber == idCardNumber
&& (task.TaskStatus == OnboardingTaskStatus.Reviewing
|| task.TaskStatus == OnboardingTaskStatus.Rejected
|| task.TaskStatus == OnboardingTaskStatus.Approved
|| task.TaskStatus == OnboardingTaskStatus.Archived))
.AnyAsync();
if (!duplicateTaskExists)
return;
throw Oops.Bah("该姓名和身份证号已存在正在办理的入职任务,请勿重复提交;如需补充材料,请联系 HR 继续使用原任务链接");
}
}