namespace SimpleAdmin.Application;
///
/// 实现入职任务生命周期业务能力。
///
public class OnboardingTaskLifecycleService : IOnboardingTaskLifecycleService
{
private readonly SqlSugarScope _db;
private readonly IConfigService _config;
public OnboardingTaskLifecycleService(IConfigService config)
{
_db = DbContext.DB;
_config = config;
}
///
/// 归档已审核通过的入职任务。
///
public async Task Archive(OnboardingAuditActionInput input)
{
var task = await Authorize(input.TaskId);
if (task.TaskStatus != OnboardingTaskStatus.Approved)
{
throw Oops.Bah("仅审核通过任务可归档");
}
await _db.Ado.BeginTranAsync();
try
{
var archivedAt = DateTime.Now;
var updatedRows = await _db.Updateable()
.SetColumns(item => new ObOnboardingTask
{
TaskStatus = OnboardingTaskStatus.Archived,
ArchivedAt = archivedAt
})
.Where(item => item.Id == task.Id
&& item.TaskStatus == OnboardingTaskStatus.Approved)
.ExecuteCommandAsync();
if (updatedRows != 1)
throw Oops.Bah("该入职任务状态已变化,请刷新后重试");
task.TaskStatus = OnboardingTaskStatus.Archived;
task.ArchivedAt = archivedAt;
await Log(task, OnboardingAuditAction.Archive, input.AuditOpinion);
await _db.Ado.CommitTranAsync();
}
catch
{
await _db.Ado.RollbackTranAsync();
throw;
}
}
///
/// 撤销入职任务并同步撤销仍然有效的员工填写链接。
///
public async Task Revoke(OnboardingAuditActionInput input)
{
var task = await Authorize(input.TaskId);
if (task.TaskStatus == OnboardingTaskStatus.Approved
|| task.TaskStatus == OnboardingTaskStatus.Archived
|| task.TaskStatus == OnboardingTaskStatus.Revoked)
{
throw Oops.Bah("已通过、已归档或已撤销任务不能再次撤销");
}
await _db.Ado.BeginTranAsync();
try
{
var originalStatus = task.TaskStatus;
var revokedAt = DateTime.Now;
var updatedRows = await _db.Updateable()
.SetColumns(item => item.TaskStatus == OnboardingTaskStatus.Revoked)
.Where(item => item.Id == task.Id && item.TaskStatus == originalStatus)
.ExecuteCommandAsync();
if (updatedRows != 1)
throw Oops.Bah("该入职任务状态已变化,请刷新后重试");
await _db.Updateable()
.SetColumns(item => new ObTaskLink
{
LinkStatus = OnboardingLinkStatus.Revoked,
RevokedAt = revokedAt
})
.Where(item => item.TaskId == task.Id
&& item.LinkStatus == OnboardingLinkStatus.Active)
.ExecuteCommandAsync();
task.TaskStatus = OnboardingTaskStatus.Revoked;
await Log(task, OnboardingAuditAction.Revoke, input.AuditOpinion);
await _db.Ado.CommitTranAsync();
}
catch
{
await _db.Ado.RollbackTranAsync();
throw;
}
}
///
/// 删除已撤销的入职任务及其全部关联快照数据。
///
public async Task Delete(BaseIdInput input)
{
var task = await Authorize(input.Id);
if (task.TaskStatus != OnboardingTaskStatus.Revoked)
{
throw Oops.Bah("仅已撤销的任务可以删除");
}
await _db.Ado.BeginTranAsync();
try
{
var taskContractIds = await _db.Queryable()
.Where(x => x.TaskId == task.Id)
.Select(x => x.Id)
.ToListAsync();
if (taskContractIds.Count > 0)
{
await _db.Deleteable()
.Where(x => taskContractIds.Contains(x.TaskContractId))
.ExecuteCommandAsync();
}
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().Where(x => x.TaskId == task.Id).ExecuteCommandAsync();
await _db.Deleteable().In(task.Id).ExecuteCommandAsync();
await _db.Ado.CommitTranAsync();
}
catch
{
await _db.Ado.RollbackTranAsync();
throw;
}
}
private async Task Authorize(long taskId)
{
var task = await _db.Queryable().InSingleAsync(taskId)
?? throw Oops.Bah("入职任务不存在");
var config = await _config.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, "onboard.reviewer.userIds")
?? throw Oops.Bah("请配置入职审核人");
var reviewerIds = OnboardingReviewerConfigParser.Parse(config.ConfigValue, task.CompanyId);
if (!reviewerIds.Contains(UserManager.UserId))
{
throw Oops.Bah("您不是该入职任务的审核人");
}
return task;
}
private Task Log(ObOnboardingTask task, string action, string opinion)
{
return _db.Insertable(new ObTaskAudit
{
Id = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(),
TaskId = task.Id,
AuditRound = task.SubmitCount,
AuditAction = action,
AuditorUserId = UserManager.UserId,
AuditOpinion = opinion,
AuditedAt = DateTime.Now
}).ExecuteCommandAsync();
}
}