111
This commit is contained in:
+5
-3
@@ -61,18 +61,20 @@ public class OnboardingContractDocumentService : IOnboardingContractDocumentServ
|
||||
item => item.VariableCode,
|
||||
item => item.VariableValue ?? string.Empty,
|
||||
StringComparer.OrdinalIgnoreCase));
|
||||
var name = $"{task.TaskNo}_{contract.ContractName}.docx";
|
||||
var generatedAt = DateTime.Now;
|
||||
// 在文件名中加入生成批次,避免手机系统把同名的新合同误认为历史下载文件。
|
||||
var name = $"{task.TaskNo}_{contract.ContractName}_{generatedAt:yyyyMMddHHmmssfff}.docx";
|
||||
var fileId = await _fileService.StoreGeneratedFile(
|
||||
SysDictConst.FILE_ENGINE_ALIYUN_OSS,
|
||||
name,
|
||||
rendered);
|
||||
|
||||
contract.GeneratedDocxFileId = fileId;
|
||||
contract.GeneratedAt = DateTime.Now;
|
||||
contract.GeneratedAt = generatedAt;
|
||||
contract.ContractStatus = task.TaskStatus == OnboardingTaskStatus.Approved
|
||||
? TaskContractStatus.OfflinePendingSign
|
||||
: TaskContractStatus.PendingConfirm;
|
||||
await _db.Updateable(contract).ExecuteCommandAsync();
|
||||
return fileId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
-1
@@ -14,7 +14,13 @@ public interface IOnboardingPublicTaskService : ITransient
|
||||
/// </summary>
|
||||
Task SaveEmployeeInfo(OnboardingTaskPublicSaveInput input);
|
||||
/// <summary>
|
||||
/// 校验任务归属后返回合同模板源文件 Id。
|
||||
/// 校验合同变量并提前生成候选人的合同 DOCX。
|
||||
/// </summary>
|
||||
Task<OnboardingPublicContractPrepareOutput> PrepareContract(
|
||||
OnboardingPublicContractSourceInput input);
|
||||
|
||||
/// <summary>
|
||||
/// 校验任务归属后返回已经准备完成的合同文件 Id。
|
||||
/// </summary>
|
||||
Task<long> GetContractSourceFileId(OnboardingPublicContractSourceInput input);
|
||||
|
||||
|
||||
+49
-3
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,27 @@ public class OnboardingPublicContractSourceInput
|
||||
/// </summary>
|
||||
[IdNotNull(ErrorMessage = "任务合同Id不能为空")]
|
||||
public long TaskContractId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前生成文件的版本标识,仅用于区分手机下载缓存,不参与文件权限判断。
|
||||
/// </summary>
|
||||
public long? Version { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 员工端合同准备结果。
|
||||
/// </summary>
|
||||
public class OnboardingPublicContractPrepareOutput
|
||||
{
|
||||
/// <summary>
|
||||
/// 当前已经生成并可下载的系统文件 Id,同时作为客户端下载版本号。
|
||||
/// </summary>
|
||||
public long FileId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 合同文件生成时间;复用现有文件时返回原生成时间。
|
||||
/// </summary>
|
||||
public DateTime? GeneratedAt { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -3182,9 +3182,14 @@
|
||||
保存候选人固定基础信息并刷新合同变量快照。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.IOnboardingPublicTaskService.PrepareContract(SimpleAdmin.Application.OnboardingPublicContractSourceInput)">
|
||||
<summary>
|
||||
校验合同变量并提前生成候选人的合同 DOCX。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.IOnboardingPublicTaskService.GetContractSourceFileId(SimpleAdmin.Application.OnboardingPublicContractSourceInput)">
|
||||
<summary>
|
||||
校验任务归属后返回合同模板源文件 Id。
|
||||
校验任务归属后返回已经准备完成的合同文件 Id。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.IOnboardingPublicTaskService.GetMaterialSource(SimpleAdmin.Application.OnboardingPublicMaterialSourceInput)">
|
||||
@@ -3207,9 +3212,14 @@
|
||||
保存候选人的固定基础信息并刷新尚未确认的合同变量快照。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.OnboardingPublicTaskService.PrepareContract(SimpleAdmin.Application.OnboardingPublicContractSourceInput)">
|
||||
<summary>
|
||||
根据员工当前已填写信息校验变量并提前生成合同 DOCX。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.OnboardingPublicTaskService.GetContractSourceFileId(SimpleAdmin.Application.OnboardingPublicContractSourceInput)">
|
||||
<summary>
|
||||
根据员工当前已填写信息生成合同预览,并返回已替换变量的 DOCX 文件 Id。
|
||||
返回已经准备完成的合同文件,下载阶段不再执行变量校验和文档生成。
|
||||
</summary>
|
||||
</member>
|
||||
<member name="M:SimpleAdmin.Application.OnboardingPublicTaskService.GetMaterialSource(SimpleAdmin.Application.OnboardingPublicMaterialSourceInput)">
|
||||
|
||||
Reference in New Issue
Block a user