namespace SimpleAdmin.Web.Core; /// /// 提供员工端入职任务访问相关 HTTP 接口。 /// [ApiDescriptionSettings("Application", Tag = "员工入职填写")] [Route("open/onboarding")] [AllowAnonymous] public class OnboardingPublicTaskController { private readonly IOnboardingPublicTaskService _service; private readonly IFileService _fileService; public OnboardingPublicTaskController(IOnboardingPublicTaskService service, IFileService fileService) { _service = service; _fileService = fileService; } /// /// 通过 Token 获取员工端入职任务详情。 /// [HttpPost("detail")] public async Task Detail([FromBody] OnboardingTaskPublicAccessInput input) { return await _service.Detail(input); } /// /// 保存候选人固定基础信息。 /// [HttpPost("save-employee-info")] public async Task SaveEmployeeInfo([FromBody] OnboardingTaskPublicSaveInput input) { await _service.SaveEmployeeInfo(input); } /// /// 校验合同变量并提前生成候选人的合同文件。 /// [HttpPost("prepare-contract")] public async Task PrepareContract( [FromBody] OnboardingPublicContractSourceInput input) { return await _service.PrepareContract(input); } /// /// 下载已经准备完成并替换变量的合同文件。 /// [HttpGet("contract-source")] [ResponseCache(Location = ResponseCacheLocation.None, NoStore = true)] public async Task ContractSource([FromQuery] OnboardingPublicContractSourceInput input) { var fileId = await _service.GetContractSourceFileId(input); return await _fileService.Download(new BaseIdInput { Id = fileId }) ?? throw Oops.Bah("合同文件不存在,请重新准备合同"); } /// /// 通过任务 Token 内联输出候选人已上传的图片材料,供手机端预览。 /// [HttpGet("material-source")] public async Task MaterialSource( [FromQuery] OnboardingPublicMaterialSourceInput input) { var material = await _service.GetMaterialSource(input); var source = await _fileService.Download(new BaseIdInput { Id = material.FileId }) ?? throw Oops.Bah("上传文件不存在"); return new FileStreamResult( source.FileStream, GetImageContentType(material.FileSuffix)); } /// /// 根据图片扩展名设置浏览器可内联展示的响应类型。 /// private static string GetImageContentType(string suffix) { return suffix?.TrimStart('.').ToLowerInvariant() switch { "png" => "image/png", "jpg" or "jpeg" => "image/jpeg", "gif" => "image/gif", "bmp" => "image/bmp", "webp" => "image/webp", _ => "application/octet-stream" }; } }