namespace SimpleAdmin.Application; public class OnboardingTaskService : IOnboardingTaskService { private readonly ISqlSugarClient _db; private readonly IConfigService _configService; public OnboardingTaskService(ISqlSugarClient db, IConfigService configService) { _db = db; _configService = configService; } public async Task Create(OnboardingTaskCreateInput input) { if (!await _db.Queryable().AnyAsync(it => it.Id == input.CompanyId && it.Status == "enable")) throw Oops.Bah("公司不存在或未启用"); if (!await _db.Queryable().AnyAsync(it => it.Id == input.PositionId && it.CompanyId == input.CompanyId && it.Status == "enable")) throw Oops.Bah("岗位不存在、未启用或不属于该公司"); var scopes = await _db.Queryable().Where(it => it.CompanyId == input.CompanyId && (it.PositionId == null || it.PositionId == input.PositionId)).ToListAsync(); if (scopes.Count == 0) throw Oops.Bah("该公司和岗位尚未配置合同适用范围"); var taskId = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(); var expiryConfig = await _configService.GetByConfigKey(CateGoryConst.CONFIG_BIZ_DEFINE, "onboard.link.expireHours"); if (expiryConfig == null || !int.TryParse(expiryConfig.ConfigValue, out var expiryHours) || expiryHours <= 0) throw Oops.Bah("请在系统配置中设置 onboard.link.expireHours(正整数小时)"); var expiresAt = DateTime.Now.AddHours(expiryHours); var token = Guid.NewGuid().ToString("N"); var task = new ObOnboardingTask { Id = taskId, TaskNo = $"OB{DateTime.Now:yyyyMMddHHmmss}{taskId.ToString()[^4..]}", CompanyId = input.CompanyId, PositionId = input.PositionId, AssignedReviewerUserId = input.AssignedReviewerUserId, LinkExpireAt = expiresAt, TaskStatus = OnboardingTaskStatus.PendingFill, Remark = input.Remark }; await _db.Ado.BeginTranAsync(); try { await _db.Insertable(task).ExecuteCommandAsync(); await _db.Insertable(new ObTaskLink { Id = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(), TaskId = taskId, TokenHash = Convert.ToHexString(global::System.Security.Cryptography.SHA256.HashData(global::System.Text.Encoding.UTF8.GetBytes(token))), ExpiresAt = expiresAt }).ExecuteCommandAsync(); var templateIds = scopes.Select(it => it.TemplateId).Distinct().ToList(); var templates = await _db.Queryable().Where(it => templateIds.Contains(it.Id)).ToListAsync(); await _db.Insertable(scopes.Select(it => new ObTaskContract { Id = global::SimpleAdmin.Core.Utils.CommonUtils.GetSingleId(), TaskId = taskId, TemplateId = it.TemplateId, TemplateVersionId = it.TemplateVersionId, ContractName = templates.First(x => x.Id == it.TemplateId).TemplateName, ContractType = templates.First(x => x.Id == it.TemplateId).ContractType, Required = it.Required }).ToList()).ExecuteCommandAsync(); await _db.Ado.CommitTranAsync(); } catch { await _db.Ado.RollbackTranAsync(); throw; } return new OnboardingTaskCreatedOutput { TaskId = taskId, TaskNo = task.TaskNo, LinkToken = token, ExpiresAt = expiresAt }; } }