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("仅审核通过任务可归档"); } 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() .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 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("请配置入职审核人"); using var configJson = global::System.Text.Json.JsonDocument.Parse(config.ConfigValue); var reviewerIds = new List(); 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(); } }