namespace SimpleAdmin.Application; /// /// 实现入职任务查询业务能力。 /// public class OnboardingTaskQueryService : IOnboardingTaskQueryService { private readonly SqlSugarScope _db; public OnboardingTaskQueryService() { _db = DbContext.DB; } /// /// 分页查询后台入职任务。 /// public Task> Page(OnboardingTaskPageInput input) { return _db.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.TaskNo), item => item.TaskNo.Contains(input.TaskNo)) .WhereIF(!string.IsNullOrWhiteSpace(input.TaskStatus), item => item.TaskStatus == input.TaskStatus) .WhereIF(input.CompanyId.HasValue, item => item.CompanyId == input.CompanyId.Value) .OrderByDescending(item => item.CreateTime) .ToPagedListAsync(input.PageNum, input.PageSize); } /// /// 查询任务基础信息、人员资料、合同、材料、表单值、链接和审核记录。 /// public async Task Detail(BaseIdInput input) { var task = await _db.Queryable().InSingleAsync(input.Id) ?? throw Oops.Bah("入职任务不存在"); var employeeInfo = await _db.Queryable() .FirstAsync(item => item.TaskId == task.Id); var contracts = await _db.Queryable() .Where(item => item.TaskId == task.Id) .ToListAsync(); var materials = await _db.Queryable() .Where(item => item.TaskId == task.Id) .ToListAsync(); var materialFileIds = materials .Select(item => item.FileId) .Distinct() .ToList(); var materialFiles = await _db.Queryable() .Where(item => materialFileIds.Contains(item.Id)) .ToListAsync(); var materialFileMap = materialFiles.ToDictionary(item => item.Id); var materialOutputs = materials.Select(material => { var output = material.Adapt(); if (materialFileMap.TryGetValue(material.FileId, out var file)) { output.FileName = file.Name; output.FileSuffix = file.Suffix; } return output; }).ToList(); var link = await _db.Queryable() .Where(item => item.TaskId == task.Id && item.LinkStatus == "active") .OrderByDescending(item => item.CreateTime) .FirstAsync(); var audits = await _db.Queryable() .Where(item => item.TaskId == task.Id) .OrderByDescending(item => item.AuditedAt) .ToListAsync(); return new OnboardingTaskDetailOutput { Task = task, EmployeeInfo = employeeInfo, Contracts = contracts, Materials = materialOutputs, Link = link, Audits = audits }; } }