1
This commit is contained in:
+2
@@ -0,0 +1,2 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
public interface IOnboardingTaskLifecycleService : ITransient { Task Archive(OnboardingAuditActionInput input); Task Revoke(OnboardingAuditActionInput input); }
|
||||
+90
@@ -0,0 +1,90 @@
|
||||
namespace SimpleAdmin.Application;
|
||||
|
||||
public class OnboardingTaskLifecycleService : IOnboardingTaskLifecycleService
|
||||
{
|
||||
private readonly ISqlSugarClient _db;
|
||||
private readonly IConfigService _config;
|
||||
|
||||
public OnboardingTaskLifecycleService(ISqlSugarClient db, IConfigService config)
|
||||
{
|
||||
_db = db;
|
||||
_config = config;
|
||||
}
|
||||
|
||||
public async Task Archive(OnboardingAuditActionInput input)
|
||||
{
|
||||
var task = await Authorize(input.TaskId);
|
||||
if (task.TaskStatus != OnboardingTaskStatus.Approved)
|
||||
{
|
||||
throw Oops.Bah("仅审核通过任务可归档");
|
||||
}
|
||||
|
||||
task.TaskStatus = OnboardingTaskStatus.Archived;
|
||||
task.ArchivedAt = DateTime.Now;
|
||||
await _db.Updateable(task).ExecuteCommandAsync();
|
||||
await Log(task, OnboardingAuditAction.Archive, input.AuditOpinion);
|
||||
}
|
||||
|
||||
public async Task Revoke(OnboardingAuditActionInput input)
|
||||
{
|
||||
var task = await Authorize(input.TaskId);
|
||||
if (task.TaskStatus == OnboardingTaskStatus.Approved || task.TaskStatus == OnboardingTaskStatus.Archived)
|
||||
{
|
||||
throw Oops.Bah("已通过或已归档任务不能撤销");
|
||||
}
|
||||
|
||||
task.TaskStatus = OnboardingTaskStatus.Revoked;
|
||||
await _db.Updateable(task).ExecuteCommandAsync();
|
||||
await _db.Updateable<ObTaskLink>()
|
||||
.SetColumns(item => new ObTaskLink
|
||||
{
|
||||
LinkStatus = OnboardingLinkStatus.Revoked,
|
||||
RevokedAt = DateTime.Now
|
||||
})
|
||||
.Where(item => item.TaskId == task.Id && item.LinkStatus == OnboardingLinkStatus.Active)
|
||||
.ExecuteCommandAsync();
|
||||
await Log(task, OnboardingAuditAction.Revoke, input.AuditOpinion);
|
||||
}
|
||||
|
||||
private async Task<ObOnboardingTask> Authorize(long taskId)
|
||||
{
|
||||
var task = await _db.Queryable<ObOnboardingTask>().InSingleAsync(taskId)
|
||||
?? throw Oops.Bah("入职任务不存在");
|
||||
var config = await _config.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, "onboard.reviewer.userIds")
|
||||
?? throw Oops.Bah("请配置入职审核人");
|
||||
|
||||
using var configJson = global::System.Text.Json.JsonDocument.Parse(config.ConfigValue);
|
||||
var reviewerIds = new List<long>();
|
||||
if (configJson.RootElement.TryGetProperty("all", out var allReviewers))
|
||||
{
|
||||
reviewerIds.AddRange(allReviewers.EnumerateArray().Select(item => item.GetInt64()));
|
||||
}
|
||||
|
||||
if (configJson.RootElement.TryGetProperty("company", out var companyReviewers)
|
||||
&& companyReviewers.TryGetProperty(task.CompanyId.ToString(), out var reviewers))
|
||||
{
|
||||
reviewerIds.AddRange(reviewers.EnumerateArray().Select(item => item.GetInt64()));
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user