51 lines
2.2 KiB
C#
51 lines
2.2 KiB
C#
namespace SimpleAdmin.Application;
|
|
|
|
/// <summary>
|
|
/// 统一校验候选人身份,避免同一人员通过多个链接重复提交入职资料。
|
|
/// </summary>
|
|
public class OnboardingIdentityValidationService : IOnboardingIdentityValidationService
|
|
{
|
|
private readonly SqlSugarScope _db;
|
|
|
|
public OnboardingIdentityValidationService()
|
|
{
|
|
_db = DbContext.DB;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
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<ObEmployee>()
|
|
.AnyAsync(item => item.EmployeeName == employeeName
|
|
&& item.IdCardNumber == idCardNumber);
|
|
if (formalEmployeeExists)
|
|
{
|
|
throw Oops.Bah("该姓名和身份证号已完成正式员工建档,请勿重复提交入职资料");
|
|
}
|
|
|
|
// 待填写任务不占用身份,以实际先提交的任务为准;撤销或过期任务允许重新发起。
|
|
var duplicateTaskExists = await _db.Queryable<ObTaskEmployeeInfo>()
|
|
.InnerJoin<ObOnboardingTask>((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 继续使用原任务链接");
|
|
}
|
|
}
|