package com.epmet.controller; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.epmet.commons.tools.annotation.LoginUser; import com.epmet.commons.tools.aop.NoRepeatSubmit; import com.epmet.commons.tools.constant.AppClientConstant; import com.epmet.commons.tools.constant.NumConstant; import com.epmet.commons.tools.constant.ServiceConstant; import com.epmet.commons.tools.exception.EpmetErrorCode; import com.epmet.commons.tools.exception.EpmetException; import com.epmet.commons.tools.exception.ExceptionUtils; import com.epmet.commons.tools.feign.ResultDataResolver; import com.epmet.commons.tools.page.PageData; import com.epmet.commons.tools.security.dto.TokenDto; import com.epmet.commons.tools.utils.EpmetRequestHolder; import com.epmet.commons.tools.utils.ExcelUtils; import com.epmet.commons.tools.utils.FileUtils; import com.epmet.commons.tools.utils.Result; import com.epmet.commons.tools.validator.ValidatorUtils; import com.epmet.constants.ImportTaskConstants; import com.epmet.dto.IcNatDTO; import com.epmet.dto.form.AddIcNatFormDTO; import com.epmet.dto.form.ImportTaskCommonFormDTO; import com.epmet.dto.form.MyNatListFormDTO; import com.epmet.dto.result.ImportTaskCommonResultDTO; import com.epmet.dto.result.MyNatListResultDTO; import com.epmet.dto.result.NatListResultDTO; import com.epmet.feign.EpmetCommonServiceOpenFeignClient; import com.epmet.service.IcNatService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.io.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.URLEncoder; import java.nio.file.Path; import java.util.List; import java.util.UUID; /** * 核酸上报记录 * * @author generator generator@elink-cn.com * @since v1.0.0 2022-03-25 */ @Slf4j @RestController @RequestMapping("icNat") public class IcNatController implements ResultDataResolver { @Autowired private IcNatService icNucleinService; @Autowired private EpmetCommonServiceOpenFeignClient commonServiceOpenFeignClient; /** * @Author sun * @Description 核酸检测-上报核酸记录 **/ //@NoRepeatSubmit @PostMapping("add") public Result add(@LoginUser TokenDto tokenDto, @RequestBody AddIcNatFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, AddIcNatFormDTO.Nat.class); formDTO.setCustomerId(tokenDto.getCustomerId()); formDTO.setStaffId(tokenDto.getUserId()); icNucleinService.add(formDTO); return new Result(); } /** * @Author sun * @Description 核酸检测-居民端我的上报 **/ @NoRepeatSubmit @PostMapping("mynatlist") public Result> myNatList(@LoginUser TokenDto tokenDto, @RequestBody MyNatListFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, MyNatListFormDTO.MyNat.class); formDTO.setCustomerId(tokenDto.getCustomerId()); return new Result>().ok(icNucleinService.myNatList(formDTO)); } /** * @Author sun * @Description 【核酸】核酸检测信息列表 **/ @NoRepeatSubmit @PostMapping("natlist") public Result> natList(@LoginUser TokenDto tokenDto, @RequestBody MyNatListFormDTO formDTO) { formDTO.setCustomerId(tokenDto.getCustomerId()); formDTO.setUserId(tokenDto.getUserId()); return new Result>().ok(icNucleinService.natList(formDTO)); } /** * @Author sun * @Description 【核酸】核酸检测信息详情 **/ @NoRepeatSubmit @PostMapping("detail") public Result detail(@RequestBody MyNatListFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, MyNatListFormDTO.Detail.class); return new Result().ok(icNucleinService.detail(formDTO)); } /** * @Author sun * @Description 【核酸】核酸检测信息修改 **/ @NoRepeatSubmit @PostMapping("edit") public Result edit(@LoginUser TokenDto tokenDto, @RequestBody AddIcNatFormDTO formDTO) { formDTO.setCustomerId(tokenDto.getCustomerId()); formDTO.setStaffId(tokenDto.getUserId()); icNucleinService.edit(formDTO); return new Result(); } /** * @Author sun * @Description 【核酸】核酸检测信息删除/取消同步 **/ @NoRepeatSubmit @PostMapping("del") public Result del(@RequestBody MyNatListFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, MyNatListFormDTO.Del.class); icNucleinService.del(formDTO); return new Result<>(); } /** * @Author sun * @Description 【核酸】核酸检测信息同步 **/ @NoRepeatSubmit @PostMapping("synchro") public Result synchro(@LoginUser TokenDto tokenDto, @RequestBody MyNatListFormDTO formDTO) { ValidatorUtils.validateEntity(formDTO, MyNatListFormDTO.Synchro.class); formDTO.setCustomerId(tokenDto.getCustomerId()); formDTO.setUserId(tokenDto.getUserId()); icNucleinService.synchro(formDTO); return new Result(); } /** * 导入excel * @return */ @PostMapping("import") public Result importExcel(MultipartFile file) { String userId = EpmetRequestHolder.getHeader(AppClientConstant.USER_ID); // 1.暂存文件 String originalFilename = file.getOriginalFilename(); String extName = originalFilename.substring(originalFilename.lastIndexOf(".")); Path fileSavePath; try { Path importPath = FileUtils.getAndCreateDirUnderEpmetFilesDir("ic_nat", "import"); fileSavePath = importPath.resolve(UUID.randomUUID().toString().concat(extName)); } catch (IOException e) { String errorMsg = ExceptionUtils.getErrorStackTrace(e); log.error("【核酸检测导入】创建临时存储文件失败:{}", errorMsg); throw new EpmetException(EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "文件上传失败", "文件上传失败"); } InputStream is = null; FileOutputStream os = null; try { is = file.getInputStream(); os = new FileOutputStream(fileSavePath.toString()); IOUtils.copy(is, os); } catch (Exception e) { e.printStackTrace(); } finally { org.apache.poi.util.IOUtils.closeQuietly(is); org.apache.poi.util.IOUtils.closeQuietly(os); } // 2.生成导入任务记录 ImportTaskCommonFormDTO importTaskForm = new ImportTaskCommonFormDTO(); importTaskForm.setOperatorId(userId); importTaskForm.setBizType(ImportTaskConstants.BIZ_TYPE_IC_NAT); importTaskForm.setOriginFileName(originalFilename); ImportTaskCommonResultDTO rstData = getResultDataOrThrowsException(commonServiceOpenFeignClient.createImportTask(importTaskForm), ServiceConstant.EPMET_COMMON_SERVICE, EpmetErrorCode.EPMET_COMMON_OPERATION_FAIL.getCode(), "excel导入核酸检测信息错误", "导入居民核酸检测信息失败"); // 3.执行导入 icNucleinService.execAsyncExcelImport(fileSavePath, rstData.getTaskId()); return new Result(); } /** * @Author sun * @Description 【核酸】核酸检测信息下载模板 **/ @RequestMapping(value = "import-template-download", method = {RequestMethod.GET, RequestMethod.POST}) public void downloadTemplate(HttpServletResponse response) throws IOException { response.setCharacterEncoding("UTF-8"); response.addHeader(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS, "Content-Disposition"); //response.setHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.ms-excel"); response.setHeader(HttpHeaders.CONTENT_TYPE, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("社区自组织导入模板", "UTF-8") + ".xlsx"); InputStream is = this.getClass().getClassLoader().getResourceAsStream("excel/ic_nat.xlsx"); try { ServletOutputStream os = response.getOutputStream(); IOUtils.copy(is, os); } finally { if (is != null) { is.close(); } } } /** * @Author sun * @Description 【核酸】核酸检测信息列表 **/ @NoRepeatSubmit @PostMapping("export") public void export(@LoginUser TokenDto tokenDto, @RequestBody MyNatListFormDTO formDTO, HttpServletResponse response) { formDTO.setCustomerId(tokenDto.getCustomerId()); formDTO.setUserId(tokenDto.getUserId()); //formDTO.setCustomerId("45687aa479955f9d06204d415238f7cc"); //formDTO.setUserId("73ae6280e46a6653a5605d51d5462725"); formDTO.setPage(false); ExcelWriter excelWriter = null; formDTO.setPageSize(NumConstant.TEN_THOUSAND); int pageNo = formDTO.getPageNo(); try { // 这里 需要指定写用哪个class去写 String fileName = "核酸检测信息.xlsx"; excelWriter = EasyExcel.write(ExcelUtils.getOutputStreamForExcel(fileName, response),NatListResultDTO.class).build(); WriteSheet writeSheet = EasyExcel.writerSheet("Sheet1").build(); PageData data = null; do { data = icNucleinService.natList(formDTO); data.getList().forEach(o->o.setNatResult(NumConstant.ONE_STR.equals(o.getNatResult())?"阳性":"阴性")); formDTO.setPageNo(++pageNo); excelWriter.write(data.getList(), writeSheet); } while (CollectionUtils.isNotEmpty(data.getList()) && data.getList().size()==formDTO.getPageSize()); }catch (Exception e){ log.error("export exception", e); }finally { // 千万别忘记finish 会帮忙关闭流 if (excelWriter != null) { excelWriter.finish(); } } } }