This commit is contained in:
fuenmao
2026-08-28 17:33:30 +08:00
parent 58804be611
commit f5b40e5659
10 changed files with 537 additions and 5 deletions
@@ -0,0 +1,15 @@
namespace SimpleAdmin.Application;
/// <summary>
/// 定义候选人身份重复校验能力。
/// </summary>
public interface IOnboardingIdentityValidationService : ITransient
{
/// <summary>
/// 校验姓名和身份证号没有出现在其他有效入职流程或正式员工档案中。
/// </summary>
Task EnsureNoDuplicate(
long currentTaskId,
string employeeName,
string idCardNumber);
}
@@ -0,0 +1,50 @@
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 继续使用原任务链接");
}
}