This commit is contained in:
fuenmao
2026-08-26 18:17:58 +08:00
parent db3d58bc99
commit 9741481a62
8 changed files with 117 additions and 14 deletions
@@ -162,25 +162,71 @@ public class OnboardingPublicTaskService : IOnboardingPublicTaskService
}
/// <summary>
/// 根据员工当前已填写信息生成合同预览,并返回已替换变量的 DOCX 文件 Id。
/// 根据员工当前已填写信息校验变量并提前生成合同 DOCX。
/// </summary>
public async Task<long> GetContractSourceFileId(OnboardingPublicContractSourceInput input)
public async Task<OnboardingPublicContractPrepareOutput> PrepareContract(
OnboardingPublicContractSourceInput input)
{
var link = await GetActiveLink(input.Token);
var contract = await _db.Queryable<ObTaskContract>()
.FirstAsync(item => item.Id == input.TaskContractId && item.TaskId == link.TaskId)
?? throw Oops.Bah("合同不存在");
// 员工资料保存时会清除旧文件 Id;仍有文件 Id 时还需确认文件记录没有被异常删除。
if (contract.GeneratedDocxFileId.HasValue)
{
var generatedFileExists = await _db.Queryable<SysFile>()
.AnyAsync(item => item.Id == contract.GeneratedDocxFileId.Value);
if (!generatedFileExists)
throw Oops.Bah("已生成的合同文件不存在,请联系管理员重新生成");
return new OnboardingPublicContractPrepareOutput
{
FileId = contract.GeneratedDocxFileId.Value,
GeneratedAt = contract.GeneratedAt
};
}
await _snapshotService.Build(link.TaskId);
var fileId = await _contractDocumentService.Generate(new OnboardingGenerateContractInput
{
TaskContractId = contract.Id
});
var generatedAt = await _db.Queryable<ObTaskContract>()
.Where(item => item.Id == contract.Id)
.Select(item => item.GeneratedAt)
.SingleAsync();
return new OnboardingPublicContractPrepareOutput
{
FileId = fileId,
GeneratedAt = generatedAt
};
}
/// <summary>
/// 返回已经准备完成的合同文件,下载阶段不再执行变量校验和文档生成。
/// </summary>
public async Task<long> GetContractSourceFileId(OnboardingPublicContractSourceInput input)
{
var link = await GetActiveLink(input.Token);
var contract = await _db.Queryable<ObTaskContract>()
.FirstAsync(item => item.Id == input.TaskContractId && item.TaskId == link.TaskId)
?? throw Oops.Bah("合同不存在");
var fileId = contract.GeneratedDocxFileId
?? throw Oops.Bah("合同尚未准备完成,请刷新页面后重试");
var fileExists = await _db.Queryable<SysFile>()
.AnyAsync(item => item.Id == fileId);
if (!fileExists)
throw Oops.Bah("合同文件不存在,请重新准备合同");
contract.ReadAt ??= DateTime.Now;
if (contract.ContractStatus == TaskContractStatus.PendingGenerate)
contract.ContractStatus = TaskContractStatus.PendingConfirm;
await _db.Updateable(contract).ExecuteCommandAsync();
await _db.Updateable(contract)
.UpdateColumns(item => new { item.ReadAt, item.ContractStatus })
.ExecuteCommandAsync();
return fileId;
}