diff --git a/docus-api-common/src/main/java/com/docus/server/common/excel/ExcelExportHandler.java b/docus-api-common/src/main/java/com/docus/server/common/excel/ExcelExportHandler.java new file mode 100644 index 0000000..d22de1a --- /dev/null +++ b/docus-api-common/src/main/java/com/docus/server/common/excel/ExcelExportHandler.java @@ -0,0 +1,79 @@ +package com.docus.server.common.excel; + +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.write.metadata.style.WriteCellStyle; +import com.alibaba.excel.write.metadata.style.WriteFont; +import com.alibaba.excel.write.style.HorizontalCellStyleStrategy; +import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.springframework.http.HttpHeaders; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +/** + * 将数据以Excel的格式写入输出流 + * EasyExcel参考文档:https://easyexcel.opensource.alibaba.com/docs/current/quickstart/write + * + * @author wangrubin + * @date 2022-08-02 + */ +@Slf4j +@Component +public class ExcelExportHandler { + /** + * 下载Excel格式的数据 + * + * @param response response + * @param fileName 文件名(支持中文) + * @param data 待下载的数据 + * @param clazz 封装数据的POJO + * @param 数据泛型 + */ + public void export(HttpServletResponse response, String fileName, + List data, Class clazz) { + try { + response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("utf-8"); + // 这里URLEncoder.encode可以防止中文乱码 + String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.name()).replaceAll("\\+", "%20"); + response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename*=utf-8''" + encodedFileName + ".xlsx"); + // 这里需要设置不关闭流 + EasyExcel.write(response.getOutputStream(), clazz) + .sheet("Sheet1") + // 设置单元格宽度自适应 + .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) + // 设置单元格高度和字体 + .registerWriteHandler(getHeightAndFontStrategy()) + .doWrite(data); + log.info("下载{}条记录到文件{}", data.size(), fileName); + } catch (Exception e) { + // 重置response + log.error("文件下载失败" + e.getMessage()); + throw new RuntimeException("下载文件失败", e); + } + } + + /** + * 自定义Excel导出策略,设置表头和数据行的字体和高度 + * + * @return Excel导出策略 + */ + private HorizontalCellStyleStrategy getHeightAndFontStrategy() { + WriteCellStyle headWriteCellStyle = new WriteCellStyle(); + WriteFont headWriteFont = new WriteFont(); + headWriteFont.setFontHeightInPoints((short) 11); + headWriteFont.setBold(true); + headWriteCellStyle.setWriteFont(headWriteFont); + WriteCellStyle contentWriteCellStyle = new WriteCellStyle(); + WriteFont contentWriteFont = new WriteFont(); + contentWriteFont.setFontHeightInPoints((short) 11); + contentWriteCellStyle.setWriteFont(contentWriteFont); + contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER); + return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle); + } +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/dto/recovery/rcvbasic/RcvBasicExcelDTO.java b/docus-client-interface/src/main/java/com/docus/server/dto/recovery/rcvbasic/RcvBasicExcelDTO.java new file mode 100644 index 0000000..d4214eb --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/dto/recovery/rcvbasic/RcvBasicExcelDTO.java @@ -0,0 +1,54 @@ +package com.docus.server.dto.recovery.rcvbasic; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.metadata.BaseRowModel; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.util.Date; + +@Data +@ApiModel(value = "病案回收基础数据excel导出", description = "病案回收基础数据excel导出") +public class RcvBasicExcelDTO extends BaseRowModel { + + @ExcelProperty(value = {"住院号"}, index = 0) + @ApiModelProperty(value = "住院号") + private String admissId; + + @ExcelProperty(value = {"住院次数"}, index = 1) + @ApiModelProperty(value = "住院次数") + private Integer admissTimes; + + @ExcelProperty(value = {"流水号"}, index = 2) + @ApiModelProperty("流水号") + private String serialNumber; + + @ExcelProperty(value = {"患者姓名"}, index = 3) + @ApiModelProperty(value = "患者姓名") + private String name; + + @ExcelProperty(value = {"住院医师"}, index = 4) + @ApiModelProperty("住院医师") + private String attendingName; + + @ExcelProperty(value = {"出院日期"}, index = 5) + @ApiModelProperty(value = "出院日期") + private Date disDate; + + @ExcelProperty(value = {"出院科室名称"}, index = 6) + @ApiModelProperty("出院科室名称") + private String disDeptName; + + @ExcelProperty(value = {"回收状态"}, index = 7) + @ApiModelProperty("回收状态 0:待回收 1:已回收") + private String recoveryState; + + @ExcelProperty(value = {"回收时间"}, index = 8) + @ApiModelProperty(value = "回收时间") + private Date revoveryTime; + + @ExcelProperty(value = {"回收人"}, index = 9) + @ApiModelProperty("回收人") + private String revoveryUser; +} diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/GenderConverter.java b/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/GenderConverter.java new file mode 100644 index 0000000..e53b03c --- /dev/null +++ b/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/GenderConverter.java @@ -0,0 +1,48 @@ +package com.docus.server.vo.recovery.rcvbasic; + +import com.alibaba.excel.converters.Converter; +import com.alibaba.excel.enums.CellDataTypeEnum; +import com.alibaba.excel.metadata.CellData; +import com.alibaba.excel.metadata.GlobalConfiguration; +import com.alibaba.excel.metadata.property.ExcelContentProperty; +import com.docus.server.enums.RecoveryStateEnum; + +/** + * Excel性别列对应的转换器 + * + * @author wangrubin + * @date 2022-08-02 + */ +public class GenderConverter implements Converter { + @Override + public Class supportJavaTypeKey() { + return RecoveryStateEnum.class; + } + + @Override + public CellDataTypeEnum supportExcelTypeKey() { + return CellDataTypeEnum.STRING; + } + + /** + * 这里读的时候会调用,将Excel中的字段汉字转换成Java的Integer对象 + * + * @return Java中的Integer对象 + */ + @Override + public RecoveryStateEnum convertToJavaData(CellData cellData, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + return "RECYCLED_WAITING".equals(cellData.getStringValue()) ? RecoveryStateEnum.RECYCLED_WAITING : RecoveryStateEnum.RECYCLED_ALREADY; + } + + /** + * 这里是写的时候会调用,将Java的Integer对象转换成Excel中的字符串 + * + * @return Excel中要存储的字符串 + */ + @Override + public CellData convertToExcelData(RecoveryStateEnum recoveryStateEnum, ExcelContentProperty contentProperty, GlobalConfiguration globalConfiguration) throws Exception { + return new CellData(recoveryStateEnum.equals(RecoveryStateEnum.RECYCLED_WAITING) ? "待回收" : "已回收"); + } + + +} \ No newline at end of file diff --git a/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/RcvBasicVO.java b/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/RcvBasicVO.java index ec8fbb7..964303e 100644 --- a/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/RcvBasicVO.java +++ b/docus-client-interface/src/main/java/com/docus/server/vo/recovery/rcvbasic/RcvBasicVO.java @@ -1,96 +1,117 @@ package com.docus.server.vo.recovery.rcvbasic; +import com.alibaba.excel.annotation.ExcelIgnore; +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.metadata.BaseRowModel; +import com.docus.server.enums.RecoveryStateEnum; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import lombok.EqualsAndHashCode; -import lombok.experimental.Accessors; - -import com.docus.server.enums.*; import java.io.Serializable; import java.util.Date; /** -* -* 患者信息表 VO -* -* @author AutoGenerator -* @since 2023-09-13 -*/ + * 患者信息表 VO + * + * @author AutoGenerator + * @since 2023-09-13 + */ @Data @Builder @NoArgsConstructor @AllArgsConstructor -@ApiModel(value="RcvBasicVO对象", description="患者信息表") -public class RcvBasicVO implements Serializable { +@ApiModel(value = "RcvBasicVO对象", description = "患者信息表") +public class RcvBasicVO extends BaseRowModel implements Serializable { + @ExcelIgnore @ApiModelProperty(value = "主键") private Long id; + @ExcelIgnore @ApiModelProperty(value = "病案主键") private String patientId; + @ExcelProperty(value = {"住院次数"}, index = 1) @ApiModelProperty(value = "住院次数") private Integer admissTimes; + @ExcelIgnore @ApiModelProperty(value = "病案号") private String inpatientNo; + @ExcelIgnore @ApiModelProperty(value = "记账号(省中医住院就诊号)") private String jzh; + @ExcelProperty(value = {"住院号"}, index = 0) @ApiModelProperty(value = "住院号") private String admissId; + @ExcelProperty(value = {"患者姓名"}, index = 3) @ApiModelProperty(value = "患者姓名") private String name; + @ExcelProperty(value = {"流水号"}, index = 2) @ApiModelProperty(value = "流水号") private String serialNumber; + @ExcelIgnore @ApiModelProperty(value = "住院日期") private Date admissDate; + @ExcelIgnore @ApiModelProperty(value = "住院科室") private String admissDept; + @ExcelIgnore @ApiModelProperty(value = "住院科室名称") private String admissDeptName; + @ExcelProperty(value = {"出院日期"}, index = 5) @ApiModelProperty(value = "出院日期") private Date disDate; + @ExcelIgnore @ApiModelProperty(value = "出院科室") private String disDept; + @ExcelProperty(value = {"出院科室名称"}, index = 6) @ApiModelProperty(value = "出院科室名称") private String disDeptName; + @ExcelIgnore @ApiModelProperty(value = "实际住院天数") private Integer admissDays; + @ExcelProperty(value = {"住院医师"}, index = 4) @ApiModelProperty(value = "住院医师") private String attendingName; + @ExcelIgnore @ApiModelProperty(value = "1 现场扫描,2 其他来源") private Integer fileSource; + @ExcelProperty(value = {"回收状态"}, index = 7, converter = GenderConverter.class) @ApiModelProperty(value = "回收状态 0:待回收 1:已回收") - private String recoveryState; + private RecoveryStateEnum recoveryState; + @ExcelProperty(value = {"回收时间"}, index = 8) @ApiModelProperty(value = "回收时间") private Date revoveryTime; + @ExcelProperty(value = {"回收人"}, index = 9) @ApiModelProperty(value = "回收人") private String revoveryUser; + @ExcelIgnore @ApiModelProperty(value = "修改时间") private Date updateTime; + @ExcelIgnore @ApiModelProperty(value = "创建时间") private Date createTime; diff --git a/docus-recovery/src/main/java/com/docus/server/controller/RcvBasicController.java b/docus-recovery/src/main/java/com/docus/server/controller/RcvBasicController.java index 153f6d6..5db511d 100644 --- a/docus-recovery/src/main/java/com/docus/server/controller/RcvBasicController.java +++ b/docus-recovery/src/main/java/com/docus/server/controller/RcvBasicController.java @@ -7,6 +7,7 @@ import com.docus.infrastructure.web.request.SearchDTO; import com.docus.infrastructure.web.response.PageResult; import com.docus.server.api.recovery.RcvBasicApi; import com.docus.server.common.IgnoreValidate; +import com.docus.server.common.excel.ExcelExportHandler; import com.docus.server.convert.RcvBasicConvert; import com.docus.server.dto.recovery.rcvbasic.AddRcvBasicDTO; import com.docus.server.dto.recovery.rcvbasic.DeleteRcvBasicDTO; @@ -20,13 +21,16 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -317,4 +321,16 @@ public class RcvBasicController implements RcvBasicApi { List addRcvBasicDTOList = RcvBasicConvert.INSTANCE.convert(excelData); iRcvBasicService.addRecord(addRcvBasicDTOList); } + + @Resource + private ExcelExportHandler excelExportHandler; + + @ApiOperation("病案回收基础数据excel导出") + @PostMapping("/pageExport") + public void pageExport(@RequestBody SearchDTO searchDTO, HttpServletResponse response) { + PageResult pageResult = iRcvBasicService.page(searchDTO); + if (!CollectionUtils.isEmpty(pageResult.getList())) { + excelExportHandler.export(response, "病案回收管理列表", pageResult.getList(), RcvBasicVO.class); + } + } }