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 formalEmployeeIdCardExists = await _db.Queryable() .AnyAsync(item => item.IdCardNumber == idCardNumber); if (formalEmployeeIdCardExists) { throw Oops.Bah("该身份证号码已完成正式员工建档,请核对姓名和身份证号码;如需更正,请联系 HR"); } // 待填写任务不占用身份,以实际先提交的任务为准;撤销或过期任务允许重新发起。 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) { throw Oops.Bah("该姓名和身份证号已存在正在办理的入职任务,请勿重复提交;如需补充材料,请联系 HR 继续使用原任务链接"); } // 再单独按身份证号码校验,防止不同姓名使用同一证件重复提交不同任务。 var duplicateIdCardTaskExists = await _db.Queryable() .InnerJoin((info, task) => info.TaskId == task.Id) .Where((info, task) => info.TaskId != currentTaskId && info.IdCardNumber == idCardNumber && (task.TaskStatus == OnboardingTaskStatus.Reviewing || task.TaskStatus == OnboardingTaskStatus.Rejected || task.TaskStatus == OnboardingTaskStatus.Approved || task.TaskStatus == OnboardingTaskStatus.Archived)) .AnyAsync(); if (duplicateIdCardTaskExists) { throw Oops.Bah("该身份证号码已存在正在办理的入职任务,请核对姓名和身份证号码;如需补充材料,请联系 HR 继续使用原任务链接"); } } }