Browse Source

新增 临床单据导出

18339543638 2 years ago
parent
commit
061358542d

+ 1 - 0
nb-common/config-common/src/main/java/com/nb/common/config/web/CachingContentFilter.java

@@ -33,6 +33,7 @@ public class CachingContentFilter implements Filter {
             HttpServletRequest requestWrapper = new CacheHttpServletRequestWrapper((HttpServletRequest) servletRequest);
             chain.doFilter(requestWrapper, servletResponse);
         }
+        //todo
 
     }
 

+ 12 - 0
nb-core/pom.xml

@@ -74,9 +74,21 @@
             <groupId>javax.servlet</groupId>
             <artifactId>javax.servlet-api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>easyexcel</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>poi-ooxml</artifactId>
+                    <groupId>org.apache.poi</groupId>
+                </exclusion>
+            </exclusions>
         </dependency>
         <dependency>
             <groupId>org.hibernate.validator</groupId>

+ 2 - 3
nb-oss/src/main/java/com/nb/oss/strategy/FileUtil.java

@@ -22,7 +22,6 @@ import cn.hutool.poi.excel.ExcelUtil;
 import cn.hutool.poi.excel.ExcelWriter;
 import com.nb.core.exception.CustomException;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.poi.util.IOUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.ServletOutputStream;
@@ -303,7 +302,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
         try {
             fis = new FileInputStream(file);
             response.setHeader("Content-Disposition", "attachment; filename="+file.getName());
-            IOUtils.copy(fis,response.getOutputStream());
+            IoUtil.copy(fis,response.getOutputStream());
             response.flushBuffer();
         } catch (Exception e) {
             e.printStackTrace();
@@ -334,7 +333,7 @@ public class FileUtil extends cn.hutool.core.io.FileUtil {
         BufferedInputStream fis = null;
         try {
             response.setHeader("Content-Disposition", "attachment; filename="+filename);
-            IOUtils.copy(in,response.getOutputStream());
+            IoUtil.copy(in,response.getOutputStream());
             response.flushBuffer();
         } catch (Exception e) {
             e.printStackTrace();

+ 12 - 0
nb-service/web-service/pom.xml

@@ -14,6 +14,18 @@
 
     <dependencies>
 
+
+        <dependency>
+            <groupId>com.deepoove</groupId>
+            <artifactId>poi-tl</artifactId>
+            <exclusions>
+                <exclusion>
+                    <artifactId>poi-ooxml</artifactId>
+                    <groupId>org.apache.poi</groupId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
         <dependency>
             <groupId>com.tuoren</groupId>
             <artifactId>app-doctor-api</artifactId>

+ 93 - 72
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/BusClinicController.java

@@ -4,10 +4,12 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.dev33.satoken.annotation.SaMode;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.StrUtil;
+import com.aliyun.oss.ServiceException;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.nb.web.api.entity.*;
+import com.nb.web.service.bus.controller.vo.ClinicExportVo;
 import com.nb.web.service.bus.controller.vo.ClinicStatsVo;
 import com.nb.web.service.bus.controller.vo.ClinicEditVo;
 import com.nb.web.service.bus.controller.vo.VisitRecord;
@@ -18,11 +20,14 @@ import com.nb.core.annotation.Log;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.exception.CustomException;
 import com.nb.core.result.R;
+import com.nb.web.service.bus.utils.AnalExportUtils;
 import io.swagger.annotations.*;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -85,84 +90,27 @@ public class BusClinicController {
         return R.success(clinicService.latestQueryPage(query));
     }
 
+    @ApiOperation("导出镇痛访视记录单")
+    @PostMapping("/export/record")
+    @SaCheckPermission(value = {"bus:clinic:query","device:patient:query"},mode = SaMode.OR)
+    public void exportRecord(HttpServletResponse response, @RequestBody@Validated ClinicExportVo source,@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId) {
+        ClinicAnalRecordResult recordResult = lookAnalRecord(source.getClinicId(), true, tenantId);
+        try {
+            AnalExportUtils.export(response,recordResult,source.getBase64());
+        }catch (Exception e){
+            log.error("[BusClinicController.exportRecord] 镇痛访视单导出失败,clinicId:{},",source.getClinicId());
+            throw new CustomException("系统繁忙,导出失败");
+        }
+
+    }
+
     @Log(title = "查询临床信息的镇痛访视记录单")
     @PostMapping("/anal/record/{clinicId}/{after}")
     @SaCheckPermission(value = {"bus:clinic:query","device:patient:query"},mode = SaMode.OR)
     @ApiOperation(value = "查询临床信息的镇痛访视记录单",notes = "权限【bus:clinic:query】或【device:patient:query】")
     public R<ClinicAnalRecordResult> analRecord(@PathVariable("clinicId") String clinicId,@PathVariable("after")@ApiParam("0、术前 1、术后") Boolean after,@RequestAttribute("tenantId")@ApiParam(hidden = true) String tenantId){
         log.info("查询临床访视单【{}】",clinicId);
-        ClinicAnalRecordResult result = new ClinicAnalRecordResult();
-        BusClinicEntity clinic = clinicService.getById(clinicId);
-        if(clinic==null){
-            throw new CustomException("该临床信息不存在");
-        }
-        if(Boolean.TRUE.equals(clinic.getMonitorType())){
-            clinic.setPatientCode(patientService.getById(clinic.getPatientId()).getCode());
-        }
-        ClinicAnalClinicRecord record = ClinicAnalClinicRecord.parse(clinic);
-        record.setTenantName(hospitalService.getName(tenantId));
-        //填充临床信息
-        result.setClinic(record);
-        if(Boolean.TRUE.equals(after)){
-            //填充评价记录
-            result.setEvaluations(evaluationService.list(new QueryWrapper<BusEvaluationEntity>().lambda().eq(BusEvaluationEntity::getClinicId,clinicId).orderByAsc(BusEvaluationEntity::getEvaluateTime)));
-
-            if(Boolean.TRUE.equals(clinic.getMonitorType())){
-                //填充输注记录
-                List<BusInfusionHistoryEntity> infusionHistories = infusionHistoryService.list(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
-                        .eq(BusInfusionHistoryEntity::getClinicId, clinicId)
-                        .orderByAsc(BusInfusionHistoryEntity::getStartTime));
-                log.debug("《《《《《《《《《《《《《《《《《填充输注记录结束》》》》》》》》》》》》》》》》");
-                if(CollUtil.isNotEmpty(infusionHistories)){
-                    result.fillUndoInfo(infusionHistories);
-                    //添加设备别名
-                    Map<String, List<BusInfusionHistoryEntity>> infusionByDeviceId = infusionHistories.stream().collect(Collectors.groupingBy(BusInfusionHistoryEntity::getDeviceId));
-                    if(CollUtil.isNotEmpty(infusionByDeviceId)){
-                        Set<String> deviceIds = infusionByDeviceId.keySet();
-                        List<BusDeviceEntity> devices
-                                = deviceService.list(new QueryWrapper<BusDeviceEntity>().lambda().select(BusDeviceEntity::getId, BusDeviceEntity::getDeviceId, BusDeviceEntity::getAlias).in(BusDeviceEntity::getId, deviceIds));
-                        Map<String, List<BusDeviceEntity>> aliasByDeviceId = devices.stream().collect(Collectors.groupingBy(BusDeviceEntity::getDeviceId));
-                        if(CollUtil.isNotEmpty(aliasByDeviceId)){
-                            infusionByDeviceId.forEach((deviceId,infusions)->{
-                                aliasByDeviceId.computeIfPresent(deviceId,(k,alias)->{
-                                    infusions.forEach(infusion->infusion.setAlias(alias.get(0).getAlias()));
-                                    return alias;
-                                });
-                            });
-                        }
-                    }
-                    log.debug("《《《《《《《《《《《《《《《《《添加设备别名结束》》》》》》》》》》》》》》》》");
-                    List<String> infusionIds = infusionHistories.stream().map(BusInfusionHistoryEntity::getId).collect(Collectors.toList());
-                    List<BusInfusionModifyEntity> infusionModifies = infusionModifyService.list(new QueryWrapper<BusInfusionModifyEntity>().lambda()
-                            .in(BusInfusionModifyEntity::getInfusionId, infusionIds));
-                    result.fillInfusionRecords(infusionHistories,infusionModifies);
-
-                    List<BusDeviceHistoryEntity> deviceHistories = deviceHistoryService.list(new QueryWrapper<BusDeviceHistoryEntity>()
-                            .lambda()
-                            .select(BusDeviceHistoryEntity::getInfusionId,BusDeviceHistoryEntity::getPcaValidCount,BusDeviceHistoryEntity::getInfusionModifyId,
-                                    BusDeviceHistoryEntity::getPcaInvalidCount,BusDeviceHistoryEntity::getInputDose,BusDeviceHistoryEntity::getUploadTime)
-                            .in(BusDeviceHistoryEntity::getInfusionId, infusionIds)
-                            .eq(BusDeviceHistoryEntity::getMaster, true));
-                    log.debug("《《《《《《《《《《《《《《《《《查询设备历史结束》》》》》》》》》》》》》》》》");
-                    //标记输注
-                    result.markInfusion(deviceHistories);
-                    List<ClinicStatsQueryResult> statsQueryResults = deviceHistories.stream().map(history -> {
-                        ClinicStatsQueryResult statsQueryResult = new ClinicStatsQueryResult();
-                        statsQueryResult.setInputDose(history.getInputDose());
-                        statsQueryResult.setInValidCount(history.getPcaInvalidCount());
-                        statsQueryResult.setValidCount(history.getPcaValidCount());
-                        statsQueryResult.setUploadTime(history.getUploadTime());
-                        return statsQueryResult;
-                    }).collect(Collectors.toList());
-                    //填充统计信息
-                    result.setStats(ClinicStatsReturnResult.of(statsQueryResults));
-                    log.debug("《《《《《《《《《《《《《《《《《填充统计信息结束》》》》》》》》》》》》》》》》");
-
-                }
-            }
-        }
-
-        return R.success(result);
+        return R.success(lookAnalRecord(clinicId,after,tenantId));
     }
 
 
@@ -244,4 +192,77 @@ public class BusClinicController {
         return clinicService.updateById(payload)?R.success(payload):R.fail("更新失败");
     }
 
+    private ClinicAnalRecordResult lookAnalRecord(String clinicId,Boolean after,String tenantId) {
+        ClinicAnalRecordResult result = new ClinicAnalRecordResult();
+        BusClinicEntity clinic = clinicService.getById(clinicId);
+        if (clinic == null) {
+            throw new CustomException("该临床信息不存在");
+        }
+        if (Boolean.TRUE.equals(clinic.getMonitorType())) {
+            clinic.setPatientCode(patientService.getById(clinic.getPatientId()).getCode());
+        }
+        ClinicAnalClinicRecord record = ClinicAnalClinicRecord.parse(clinic);
+        record.setTenantName(hospitalService.getName(tenantId));
+        //填充临床信息
+        result.setClinic(record);
+        if (Boolean.TRUE.equals(after)) {
+            //填充评价记录
+            result.setEvaluations(evaluationService.list(new QueryWrapper<BusEvaluationEntity>().lambda().eq(BusEvaluationEntity::getClinicId, clinicId).orderByAsc(BusEvaluationEntity::getEvaluateTime)));
+
+            if (Boolean.TRUE.equals(clinic.getMonitorType())) {
+                //填充输注记录
+                List<BusInfusionHistoryEntity> infusionHistories = infusionHistoryService.list(new QueryWrapper<BusInfusionHistoryEntity>().lambda()
+                        .eq(BusInfusionHistoryEntity::getClinicId, clinicId)
+                        .orderByAsc(BusInfusionHistoryEntity::getStartTime));
+                log.debug("《《《《《《《《《《《《《《《《《填充输注记录结束》》》》》》》》》》》》》》》》");
+                if (CollUtil.isNotEmpty(infusionHistories)) {
+                    result.fillUndoInfo(infusionHistories);
+                    //添加设备别名
+                    Map<String, List<BusInfusionHistoryEntity>> infusionByDeviceId = infusionHistories.stream().collect(Collectors.groupingBy(BusInfusionHistoryEntity::getDeviceId));
+                    if (CollUtil.isNotEmpty(infusionByDeviceId)) {
+                        Set<String> deviceIds = infusionByDeviceId.keySet();
+                        List<BusDeviceEntity> devices
+                                = deviceService.list(new QueryWrapper<BusDeviceEntity>().lambda().select(BusDeviceEntity::getId, BusDeviceEntity::getDeviceId, BusDeviceEntity::getAlias).in(BusDeviceEntity::getId, deviceIds));
+                        Map<String, List<BusDeviceEntity>> aliasByDeviceId = devices.stream().collect(Collectors.groupingBy(BusDeviceEntity::getDeviceId));
+                        if (CollUtil.isNotEmpty(aliasByDeviceId)) {
+                            infusionByDeviceId.forEach((deviceId, infusions) -> {
+                                aliasByDeviceId.computeIfPresent(deviceId, (k, alias) -> {
+                                    infusions.forEach(infusion -> infusion.setAlias(alias.get(0).getAlias()));
+                                    return alias;
+                                });
+                            });
+                        }
+                    }
+                    log.debug("《《《《《《《《《《《《《《《《《添加设备别名结束》》》》》》》》》》》》》》》》");
+                    List<String> infusionIds = infusionHistories.stream().map(BusInfusionHistoryEntity::getId).collect(Collectors.toList());
+                    List<BusInfusionModifyEntity> infusionModifies = infusionModifyService.list(new QueryWrapper<BusInfusionModifyEntity>().lambda()
+                            .in(BusInfusionModifyEntity::getInfusionId, infusionIds));
+                    result.fillInfusionRecords(infusionHistories, infusionModifies);
+
+                    List<BusDeviceHistoryEntity> deviceHistories = deviceHistoryService.list(new QueryWrapper<BusDeviceHistoryEntity>()
+                            .lambda()
+                            .select(BusDeviceHistoryEntity::getInfusionId, BusDeviceHistoryEntity::getPcaValidCount, BusDeviceHistoryEntity::getInfusionModifyId,
+                                    BusDeviceHistoryEntity::getPcaInvalidCount, BusDeviceHistoryEntity::getInputDose, BusDeviceHistoryEntity::getUploadTime)
+                            .in(BusDeviceHistoryEntity::getInfusionId, infusionIds)
+                            .eq(BusDeviceHistoryEntity::getMaster, true));
+                    log.debug("《《《《《《《《《《《《《《《《《查询设备历史结束》》》》》》》》》》》》》》》》");
+                    //标记输注
+                    result.markInfusion(deviceHistories);
+                    List<ClinicStatsQueryResult> statsQueryResults = deviceHistories.stream().map(history -> {
+                        ClinicStatsQueryResult statsQueryResult = new ClinicStatsQueryResult();
+                        statsQueryResult.setInputDose(history.getInputDose());
+                        statsQueryResult.setInValidCount(history.getPcaInvalidCount());
+                        statsQueryResult.setValidCount(history.getPcaValidCount());
+                        statsQueryResult.setUploadTime(history.getUploadTime());
+                        return statsQueryResult;
+                    }).collect(Collectors.toList());
+                    //填充统计信息
+                    result.setStats(ClinicStatsReturnResult.of(statsQueryResults));
+                    log.debug("《《《《《《《《《《《《《《《《《填充统计信息结束》》》》》》》》》》》》》》》》");
+
+                }
+            }
+        }
+        return result;
+    }
 }

+ 22 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/controller/vo/ClinicExportVo.java

@@ -0,0 +1,22 @@
+package com.nb.web.service.bus.controller.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @ClassName : ClinicExportVO
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+@Data
+public class ClinicExportVo {
+    @ApiModelProperty(value = "临床id",required = true)
+    @NotNull(message = "临床id不能为空")
+    private String clinicId;
+    @ApiModelProperty(value = "图片base64",required = true)
+    @NotNull(message = "图片base64不能为空")
+    private String base64;
+}

+ 110 - 0
nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/AnalExportUtils.java

@@ -0,0 +1,110 @@
+package com.nb.web.service.bus.utils;
+
+import cn.hutool.core.io.resource.ResourceUtil;
+import cn.hutool.core.map.MapUtil;
+import com.deepoove.poi.XWPFTemplate;
+import com.deepoove.poi.config.Configure;
+import com.deepoove.poi.data.PictureType;
+import com.deepoove.poi.data.Pictures;
+import com.deepoove.poi.plugin.table.LoopColumnTableRenderPolicy;
+import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
+import com.deepoove.poi.xwpf.NiceXWPFDocument;
+import com.nb.web.api.entity.BusEvaluationEntity;
+import com.nb.web.service.bus.service.dto.ClinicAnalInfusionRecord;
+import com.nb.web.service.bus.service.dto.ClinicAnalRecordResult;
+import org.apache.poi.xwpf.usermodel.BreakType;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.*;
+import java.util.List;
+
+/**
+ * @ClassName : AnalExportUtils
+ * @Description :
+ * @Author : LF
+ * @Date: 2023年03月28日
+ */
+
+public class AnalExportUtils {
+    //临床信息模板路径
+    private static final String clinic_pattern_path="classpath:"+File.separator+"export"+File.separator+"patientTmp.docx";
+    //输注信息模板路径
+    private static final String infusion_pattern_path="classpath:"+File.separator+"export"+File.separator+"infusionHistoryTmp.docx";
+    //图片模板路径
+    private static final String image_pattern_path="classpath:"+File.separator+"export"+File.separator+"imageTmp.docx";
+    //评价模板路径
+    private static final String eval_pattern_path="classpath:"+File.separator+"export"+File.separator+"evalTmp.docx";
+
+    public static void export(HttpServletResponse response, ClinicAnalRecordResult record,String base64) throws Exception {
+        response.addHeader("Content-Disposition","attachment;filename="+record.getClinic().getPatientCode()+".docx");
+        response.setContentType("application/octet-stream");
+        response.setCharacterEncoding("utf-8");
+        export0(response.getOutputStream(),record,base64);
+    }
+
+    private  static void export0(OutputStream outputStream,ClinicAnalRecordResult record,String base64) throws Exception {
+        NiceXWPFDocument document= XWPFTemplate.compile(
+                ResourceUtil.getStream(clinic_pattern_path))
+                .render(record.getClinic())
+                .getXWPFDocument();
+        document=exportInfusionInfo(document,record.getInfusionRecords());
+        document=exportEval(document,record.getEvaluations());
+        document=exportImage(document,base64);
+        //文件输出流
+        BufferedOutputStream bos = new BufferedOutputStream(outputStream);
+        document.write(bos);
+        bos.flush();
+        outputStream.flush();
+        outputStream.close();
+    }
+
+
+    /**
+     * 导出输注记录
+     */
+    private static  NiceXWPFDocument exportInfusionInfo(NiceXWPFDocument xwpfDocument,List<ClinicAnalInfusionRecord> infusions) throws Exception {
+        xwpfDocument.createParagraph().createRun().addBreak(BreakType.PAGE);
+        LoopRowTableRenderPolicy policy  = new LoopRowTableRenderPolicy();
+        Configure config = Configure.builder()
+                .bind("modifies", policy)
+                .build();
+        for (ClinicAnalInfusionRecord o : infusions) {
+            xwpfDocument=xwpfDocument.merge(XWPFTemplate.compile(
+                    ResourceUtil.getStream(infusion_pattern_path), config).render(o).getXWPFDocument());
+        }
+        return xwpfDocument;
+    }
+
+
+    /**
+     * 导出评价信息
+     */
+    private  static NiceXWPFDocument exportEval(NiceXWPFDocument xwpfDocument,   List<BusEvaluationEntity> evals) throws Exception {
+        xwpfDocument.createParagraph().createRun().addBreak(BreakType.PAGE);
+        LoopColumnTableRenderPolicy  policy  = new LoopColumnTableRenderPolicy();
+        Configure config = Configure.builder()
+                .bind("evals", policy)
+                .build();
+        xwpfDocument=xwpfDocument.merge(XWPFTemplate.compile(
+                ResourceUtil.getStream(eval_pattern_path),config).render(MapUtil.builder()
+                .put("evals",evals)
+                .build())
+                .getXWPFDocument());
+        return xwpfDocument;
+    }
+
+    /**
+     * 导出统计图片
+     */
+    private  static NiceXWPFDocument exportImage(NiceXWPFDocument document,String base64) throws Exception {
+        document.createParagraph().createRun().addBreak(BreakType.PAGE);
+        document=document.merge(XWPFTemplate.compile(
+                ResourceUtil.getStream(image_pattern_path))
+                .render(MapUtil.builder()
+                        . put("image", Pictures.ofBase64(base64, PictureType.PNG)
+                                .size(687, 500).create())
+                        .build())
+                .getXWPFDocument());
+        return document;
+    }
+}

BIN
nb-service/web-service/src/main/resources/export/evalTmp.docx


BIN
nb-service/web-service/src/main/resources/export/imageTmp.docx


BIN
nb-service/web-service/src/main/resources/export/infusionHistoryTmp.docx


BIN
nb-service/web-service/src/main/resources/export/patientTmp.docx


+ 12 - 0
pom.xml

@@ -45,6 +45,8 @@
         <jms.verison>0.56.0</jms.verison>
         <aliyun.sms.version>2.0.16</aliyun.sms.version>
         <aliyun.oss.version>3.15.0</aliyun.oss.version>
+        <poi.tl.verison>1.12.0</poi.tl.verison>
+        <poi.version>5.2.2</poi.version>
     </properties>
 
     <modules>
@@ -73,6 +75,11 @@
     <!-- 依赖管理 -->
     <dependencyManagement>
         <dependencies>
+            <dependency>
+                <groupId>com.deepoove</groupId>
+                <artifactId>poi-tl</artifactId>
+                <version>${poi.tl.verison}</version>
+            </dependency>
             <dependency>
                 <groupId>com.aliyun.oss</groupId>
                 <artifactId>aliyun-sdk-oss</artifactId>
@@ -226,6 +233,11 @@
                 <artifactId>fastjson</artifactId>
                 <version>${fastjson.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.poi</groupId>
+                <artifactId>poi-ooxml</artifactId>
+                <version>${poi.version}</version>
+            </dependency>
             <!-- easyexcel -->
             <dependency>
                 <groupId>com.alibaba</groupId>