diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractDocument/IOnboardingContractDocumentService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractDocument/IOnboardingContractDocumentService.cs index 3965a58..f283735 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractDocument/IOnboardingContractDocumentService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractDocument/IOnboardingContractDocumentService.cs @@ -21,4 +21,9 @@ public interface IOnboardingContractDocumentService : ITransient /// 根据已审核通过的任务合同生成并保存 DOCX 文件。 /// Task Generate(OnboardingGenerateContractInput input); + + /// + /// 员工公开入口已验证一次性任务链接后,生成该链接所属的合同文件。 + /// + Task GenerateForPublicAccess(long taskContractId, long taskId); } diff --git a/SimpleAdmin.Application/Services/Onboarding/ContractDocument/OnboardingContractDocumentService.cs b/SimpleAdmin.Application/Services/Onboarding/ContractDocument/OnboardingContractDocumentService.cs index 220a35b..2a1b052 100644 --- a/SimpleAdmin.Application/Services/Onboarding/ContractDocument/OnboardingContractDocumentService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/ContractDocument/OnboardingContractDocumentService.cs @@ -306,6 +306,27 @@ public class OnboardingContractDocumentService : IOnboardingContractDocumentServ task.CreateUserId, OnboardingPermissionCodes.TaskManageAll, "入职任务"); + + return await GenerateCore(contract, task); + } + + /// + public async Task GenerateForPublicAccess(long taskContractId, long taskId) + { + var contract = await _db.Queryable() + .FirstAsync(item => item.Id == taskContractId && item.TaskId == taskId) + ?? throw Oops.Bah("合同不存在"); + var task = await _db.Queryable().InSingleAsync(taskId) + ?? throw Oops.Bah("入职任务不存在"); + + return await GenerateCore(contract, task); + } + + /// + /// 执行已经完成调用方权限或公开链接归属校验的合同生成逻辑。 + /// + private async Task GenerateCore(ObTaskContract contract, ObOnboardingTask task) + { var statusAllowsGeneration = task.TaskStatus == OnboardingTaskStatus.PendingFill || task.TaskStatus == OnboardingTaskStatus.Rejected || task.TaskStatus == OnboardingTaskStatus.Reviewing @@ -340,7 +361,7 @@ public class OnboardingContractDocumentService : IOnboardingContractDocumentServ .FirstOrDefault(definition => string.IsNullOrWhiteSpace( variables.FirstOrDefault(variable => variable.VariableCode == definition.VariableCode)?.VariableValue)); if (missing != null) - throw Oops.Bah($"合同变量“{missing.VariableName}”尚未填写,暂时不能预览合同"); + throw Oops.Bah($"合同“{contract.ContractName}”的变量“{missing.VariableName}”尚未填写,暂时不能预览合同"); var sourceResult = await _fileService.Download(new BaseIdInput { Id = source.Id }) ?? throw Oops.Bah("无法读取合同源文件"); diff --git a/SimpleAdmin.Application/Services/Onboarding/PublicTask/OnboardingPublicTaskService.cs b/SimpleAdmin.Application/Services/Onboarding/PublicTask/OnboardingPublicTaskService.cs index db196b4..82e7d1f 100644 --- a/SimpleAdmin.Application/Services/Onboarding/PublicTask/OnboardingPublicTaskService.cs +++ b/SimpleAdmin.Application/Services/Onboarding/PublicTask/OnboardingPublicTaskService.cs @@ -200,10 +200,9 @@ public class OnboardingPublicTaskService : IOnboardingPublicTaskService } await _snapshotService.Build(link.TaskId); - var fileId = await _contractDocumentService.Generate(new OnboardingGenerateContractInput - { - TaskContractId = contract.Id - }); + var fileId = await _contractDocumentService.GenerateForPublicAccess( + contract.Id, + link.TaskId); var generatedAt = await _db.Queryable() .Where(item => item.Id == contract.Id)