Prechádzať zdrojové kódy

新增 临床单据导出

18339543638 2 rokov pred
rodič
commit
b2f6720cce

+ 48 - 18
nb-service/web-service/src/main/java/com/nb/web/service/bus/utils/AnalExportUtils.java

@@ -1,7 +1,11 @@
 package com.nb.web.service.bus.utils;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.IoUtil;
 import cn.hutool.core.io.resource.ResourceUtil;
 import cn.hutool.core.map.MapUtil;
+import cn.hutool.core.util.StrUtil;
 import com.deepoove.poi.XWPFTemplate;
 import com.deepoove.poi.config.Configure;
 import com.deepoove.poi.data.PictureType;
@@ -16,7 +20,8 @@ import org.apache.poi.xwpf.usermodel.BreakType;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.*;
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * @ClassName : AnalExportUtils
@@ -27,13 +32,13 @@ import java.util.List;
 
 public class AnalExportUtils {
     //临床信息模板路径
-    private static final String clinic_pattern_path="classpath:"+File.separator+"export"+File.separator+"patientTmp.docx";
+    private static final byte[] clinic_pattern= IoUtil.readBytes(ResourceUtil.getStream("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 byte[] infusion_pattern=IoUtil.readBytes(ResourceUtil.getStream("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 byte[] image_pattern=IoUtil.readBytes(ResourceUtil.getStream("classpath:"+File.separator+"export"+File.separator+"imageTmp.docx"));
     //评价模板路径
-    private static final String eval_pattern_path="classpath:"+File.separator+"export"+File.separator+"evalTmp.docx";
+    private static final byte[] eval_pattern=IoUtil.readBytes(ResourceUtil.getStream("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");
@@ -44,7 +49,7 @@ public class AnalExportUtils {
 
     private  static void export0(OutputStream outputStream,ClinicAnalRecordResult record,String base64) throws Exception {
         NiceXWPFDocument document= XWPFTemplate.compile(
-                ResourceUtil.getStream(clinic_pattern_path))
+                new ByteArrayInputStream(clinic_pattern))
                 .render(record.getClinic())
                 .getXWPFDocument();
         document=exportInfusionInfo(document,record.getInfusionRecords());
@@ -52,10 +57,16 @@ public class AnalExportUtils {
         document=exportImage(document,base64);
         //文件输出流
         BufferedOutputStream bos = new BufferedOutputStream(outputStream);
-        document.write(bos);
-        bos.flush();
-        outputStream.flush();
-        outputStream.close();
+        try {
+            document.write(bos);
+            bos.flush();
+            outputStream.flush();
+        }catch (Exception e){
+            throw e;
+        }finally {
+            outputStream.close();
+            bos.close();
+        }
     }
 
 
@@ -63,14 +74,27 @@ public class AnalExportUtils {
      * 导出输注记录
      */
     private static  NiceXWPFDocument exportInfusionInfo(NiceXWPFDocument xwpfDocument,List<ClinicAnalInfusionRecord> infusions) throws Exception {
+        if(CollUtil.isEmpty(infusions)){
+            return xwpfDocument;
+        }
         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());
+        Map<Date, List<NiceXWPFDocument>> document = infusions.stream()
+                .collect(Collectors.groupingBy(ClinicAnalInfusionRecord::getStartTime, Collectors.collectingAndThen(Collectors.toList(), list -> list
+                                .parallelStream()
+                                .map(infusion -> XWPFTemplate.compile(new ByteArrayInputStream(infusion_pattern), config).render(infusion).getXWPFDocument())
+                                .collect(Collectors.toList())
+                        )
+                ));
+        List<Date> dates = new ArrayList<>(document.keySet());
+        CollectionUtil.sort(dates,(o1,o2)->o1.compareTo(o2));
+        for (Date date : dates) {
+            for (NiceXWPFDocument d : document.get(date)) {
+                xwpfDocument=xwpfDocument.merge(d);
+            }
         }
         return xwpfDocument;
     }
@@ -79,15 +103,18 @@ public class AnalExportUtils {
     /**
      * 导出评价信息
      */
-    private  static NiceXWPFDocument exportEval(NiceXWPFDocument xwpfDocument,   List<BusEvaluationEntity> evals) throws Exception {
+    private  static NiceXWPFDocument exportEval(NiceXWPFDocument xwpfDocument,List<BusEvaluationEntity> evals) throws Exception {
+        if(CollUtil.isEmpty(evals)){
+            return xwpfDocument;
+        }
         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)
+        xwpfDocument = xwpfDocument.merge(XWPFTemplate.compile(
+                new ByteArrayInputStream(eval_pattern), config).render(MapUtil.builder()
+                .put("evals", evals)
                 .build())
                 .getXWPFDocument());
         return xwpfDocument;
@@ -97,9 +124,12 @@ public class AnalExportUtils {
      * 导出统计图片
      */
     private  static NiceXWPFDocument exportImage(NiceXWPFDocument document,String base64) throws Exception {
+        if(StrUtil.isEmpty(base64)){
+            return document;
+        }
         document.createParagraph().createRun().addBreak(BreakType.PAGE);
         document=document.merge(XWPFTemplate.compile(
-                ResourceUtil.getStream(image_pattern_path))
+                new ByteArrayInputStream(image_pattern))
                 .render(MapUtil.builder()
                         . put("image", Pictures.ofBase64(base64, PictureType.PNG)
                                 .size(687, 500).create())