电子签基础功能

This commit is contained in:
fuenmao
2026-09-07 16:17:49 +08:00
parent 384eaff444
commit da777327f5
31 changed files with 3992 additions and 61 deletions
@@ -56,6 +56,17 @@ public class OnboardingEmployeeDetailOutput
/// </summary>
public List<ObTaskContract> Contracts { get; set; } = new List<ObTaskContract>();
/// <summary>
/// 员工入职时上传的身份证、学历证明、体检报告等资料。
/// </summary>
public List<OnboardingTaskMaterialDetailOutput> Materials { get; set; }
= new List<OnboardingTaskMaterialDetailOutput>();
/// <summary>
/// 契约锁签署文件与签署日志组成的完整归档 ZIP 文件 Id。
/// </summary>
public long? ElectronicSignArchiveFileId { get; set; }
/// <summary>
/// 提交与审核记录列表。
/// </summary>
@@ -67,6 +67,13 @@ public class OnboardingEmployeeService : IOnboardingEmployeeService
: await _db.Queryable<ObTaskContract>()
.Where(item => item.TaskId == task.Id)
.ToListAsync();
var materials = await GetEmployeeMaterials(task?.Id);
var electronicSignProcess = task == null
? null
: await _db.Queryable<ObElectronicSignProcess>()
.Where(item => item.TaskId == task.Id && item.ArchiveFileId.HasValue)
.OrderByDescending(item => item.Id)
.FirstAsync();
var audits = task == null
? new List<ObTaskAudit>()
: await _db.Queryable<ObTaskAudit>()
@@ -80,10 +87,60 @@ public class OnboardingEmployeeService : IOnboardingEmployeeService
Task = task,
EmployeeInfo = employeeInfo,
Contracts = contracts,
Materials = materials,
ElectronicSignArchiveFileId = electronicSignProcess?.ArchiveFileId,
Audits = audits
};
}
/// <summary>
/// 查询员工来源任务中上传的全部材料,并补充原始文件名、后缀和文件大小。
/// </summary>
private async Task<List<OnboardingTaskMaterialDetailOutput>> GetEmployeeMaterials(long? taskId)
{
if (!taskId.HasValue)
return new List<OnboardingTaskMaterialDetailOutput>();
var materials = await _db.Queryable<ObTaskMaterial>()
.Where(item => item.TaskId == taskId.Value)
.ToListAsync();
if (materials.Count == 0)
return new List<OnboardingTaskMaterialDetailOutput>();
var fileIds = materials
.Select(item => item.FileId)
.Distinct()
.ToList();
var files = await _db.Queryable<SysFile>()
.Where(item => fileIds.Contains(item.Id))
.ToListAsync();
var fileMap = files.ToDictionary(item => item.Id);
var requirements = await _db.Queryable<ObTaskMaterialRequirement>()
.Where(item => item.TaskId == taskId.Value)
.ToListAsync();
var sortMap = requirements
.GroupBy(item => item.MaterialTypeId)
.ToDictionary(group => group.Key, group => group.Min(item => item.SortCode));
return materials
.Select(material =>
{
var output = material.Adapt<OnboardingTaskMaterialDetailOutput>();
if (fileMap.TryGetValue(material.FileId, out var file))
{
output.FileName = file.Name;
output.FileSuffix = file.Suffix;
output.FileSizeInfo = file.SizeInfo;
}
return output;
})
.OrderBy(item => sortMap.GetValueOrDefault(item.MaterialTypeId, int.MaxValue))
.ThenBy(item => item.UploadedAt)
.ToList();
}
/// <summary>
/// 批量补充员工所属公司、部门和岗位名称,避免列表逐行查询数据库。
/// </summary>