Browse Source

Merge remote-tracking branch 'origin/beilun/dev-fqw' into beilun/dev

# Conflicts:
#	kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR03090.java
rengb 4 years atrás
parent
commit
fe35dc568c
45 changed files with 1721 additions and 57 deletions
  1. 9 1
      kernel/src/main/java/com/lantone/qc/kernel/analysis/QCAnalysis.java
  2. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/QCCatalogue.java
  3. 41 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH03093.java
  4. 42 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH03095.java
  5. 41 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstcourserecord/FIRC03094.java
  6. 95 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstpagerecord/FIRP03104.java
  7. 92 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstpagerecord/FIRP03105.java
  8. 90 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03096.java
  9. 85 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03097.java
  10. 79 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03098.java
  11. 91 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03099.java
  12. 79 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03100.java
  13. 73 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03101.java
  14. 79 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03102.java
  15. 129 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03103.java
  16. 80 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03106.java
  17. 21 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE0369.java
  18. 20 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/preoperativediscussion/PRE0328.java
  19. 8 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR03076.java
  20. 19 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/xiamen/operationdiscussion/OPE0587.java
  21. 61 26
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/xiamen/threelevelward/THR03010.java
  22. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/AIAnalyze.java
  23. 12 11
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/model/Lemma.java
  24. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcess.java
  25. 19 1
      kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java
  26. 1 1
      kernel/src/main/resources/bootstrap.yml
  27. 3 0
      public/src/main/java/com/lantone/qc/pub/Content.java
  28. 7 0
      public/src/main/java/com/lantone/qc/pub/model/InputInfo.java
  29. 17 0
      public/src/main/java/com/lantone/qc/pub/model/doc/ADLGradeDoc.java
  30. 33 0
      public/src/main/java/com/lantone/qc/pub/model/doc/AnesthesiaRecordDoc.java
  31. 15 0
      public/src/main/java/com/lantone/qc/pub/model/doc/VTEGradeDoc.java
  32. 4 4
      public/src/main/java/com/lantone/qc/pub/model/entity/Diag.java
  33. 2 2
      public/src/main/java/com/lantone/qc/pub/model/entity/PD.java
  34. 2 2
      public/src/main/java/com/lantone/qc/pub/model/label/ChiefLabel.java
  35. 1 1
      public/src/main/java/com/lantone/qc/pub/model/label/PastLabel.java
  36. 82 0
      public/src/main/java/com/lantone/qc/pub/util/DateUtil.java
  37. 2 0
      trans/src/main/java/com/lantone/qc/trans/TransDispatch.java
  38. 46 0
      trans/src/main/java/com/lantone/qc/trans/beilun/AnesthesiaRecordDocTrans.java
  39. 52 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunADLGradeDocTrans.java
  40. 55 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunVTEGradeDocTrans.java
  41. 15 0
      trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java
  42. 42 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunADLGradeHtmlAnalysis.java
  43. 4 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunBeHospitalizedHtmlAnalysis.java
  44. 41 0
      trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunVTEGradeHtmlAnalysis.java
  45. 23 0
      trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java

+ 9 - 1
kernel/src/main/java/com/lantone/qc/kernel/analysis/QCAnalysis.java

@@ -35,17 +35,22 @@ public class QCAnalysis {
     @Autowired
     SimilarityServiceClient similarityServiceClient;
 
+    //质控分析接口
     public OutputInfo anlysis(QueryVo queryVo) throws AIException, CatalogueException, Exception {
-        log.error("json:"+ FastJsonUtils.getBeanToJson(queryVo));
+        //1.创建两个ThreadLocal存储数据
         specialStorageUtil.getHospitalIdThreadLocal().set(queryVo.getHospitalId());
         specialStorageUtil.getBehospitalInfoThreadLocal().set(queryVo.getBehospitalInfo());
+        //2.创建输出结果集
         OutputInfo outputInfo = new OutputInfo();
         long t1 = System.currentTimeMillis();
+        //3.得到质控病历录入对象
         InputInfo inputInfo = TransDispatch.trans(queryVo);
         long t2 = System.currentTimeMillis();
+        //4.设置质控病历录入对象缓存、
         inputInfo.setUseCrfCache(queryVo.isUseCrfCache());
         inputInfo.setInputCatalogueMap(queryVo.getInputCatalogueMap());
         AIAnalyze aiAnalyze = new AIAnalyze(crfServiceClient, similarityServiceClient);
+        //5.质控录入数据过CRF ai模型(完善InputInfo用户相关信息)
         try {
             aiAnalyze.aiProcess(inputInfo);
         } catch (Exception e) {
@@ -54,6 +59,8 @@ public class QCAnalysis {
             throw new AIException("AI模型执行错误:" + e.getMessage());
         }
         long t3 = System.currentTimeMillis();
+        //6.遍历所有质控条目集合id,获取指定质控条目执行
+        log.error("json"+FastJsonUtils.getBeanToJson(inputInfo));
         for (Map.Entry<String, Map<String, String>> entry : inputInfo.getInputCatalogueMap().entrySet()) {
             if (CatalogueUtil.qcCatalogueMap.get(queryVo.getCid() + "." + entry.getKey()) == null) {
                 continue;
@@ -94,4 +101,5 @@ public class QCAnalysis {
         return outputInfo;
     }
 
+
 }

+ 2 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/QCCatalogue.java

@@ -19,7 +19,9 @@ import java.util.Map;
 @Slf4j
 public class QCCatalogue {
 
+    //质控状态 0成功 -1失败 -2?
     protected ThreadLocal<String> status = new ThreadLocal<String>();
+    //质控结果信息
     protected ThreadLocal<String> info = new ThreadLocal<String>();
     protected ThreadLocal<String> id = new ThreadLocal<String>();
     protected ThreadLocal<Map<Object, Object>> extData = new ThreadLocal<Map<Object, Object>>();

+ 41 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH03093.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.kernel.catalogue.beilun.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.VTEGradeDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+/**
+ * @ClassName : BEH03095
+ * @Description : 入院记录的VTE评分时间早于VTE评分表生成时间
+ * @Author : sxl
+ * @Date: 2021-03-10 10:08
+ */
+@Component
+public class BEH03093 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        //1.判断是否有VTE评分
+        VTEGradeDoc vteGradeDoc = inputInfo.getVteGradeDoc();
+        if(vteGradeDoc!= null&& StringUtil.isNotBlank(vteGradeDoc.getStructureMap().get("评估日期")))
+        {
+            //2.获取入院记录时间
+            BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+            if(beHospitalizedDoc!=null&&StringUtil.isNotBlank(beHospitalizedDoc.getStructureMap().get("入院日期")))
+            {
+                String beHospitalizeTime =  beHospitalizedDoc.getStructureMap().get("入院日期");
+                //3.获取vte评分时间
+                String vteGradeTime = vteGradeDoc.getStructureMap().get("评估日期");
+                if(CatalogueUtil.compareDate(beHospitalizeTime, vteGradeTime,1))
+                {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 42 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/behospitalized/BEH03095.java

@@ -0,0 +1,42 @@
+package com.lantone.qc.kernel.catalogue.beilun.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.ADLGradeDoc;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+/**
+ * @ClassName : BEH03095
+ * @Description : ADL评分未在病程记录之前完成
+ * @Author : sxl
+ * @Date: 2021-03-10 10:08
+ */
+@Component
+public class BEH03095 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        //1.判断是否有adl评分
+        ADLGradeDoc adlGradeDoc = inputInfo.getAdlGradeDoc();
+        if(adlGradeDoc!= null&& StringUtil.isNotBlank(adlGradeDoc.getStructureMap().get(Content.adl_grade_time)))
+        {
+            //2.获取首次病程记录时间
+            FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+            if(firstCourseRecordDoc!=null&&StringUtil.isNotBlank(firstCourseRecordDoc.getStructureMap().get("病历日期")))
+            {
+                String firstCourseRecorTime =  firstCourseRecordDoc.getStructureMap().get("病历日期");
+                //3.获取adl评分时间
+                String adlGradeTime = adlGradeDoc.getStructureMap().get(Content.adl_grade_time);
+                if(CatalogueUtil.compareDate(firstCourseRecorTime, adlGradeTime,1))
+                {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 41 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstcourserecord/FIRC03094.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.kernel.catalogue.beilun.firstcourserecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.doc.VTEGradeDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+/**
+ * @ClassName : FIRC03094
+ * @Description : 首次病程记录的VTE评分时间早于VTE评分表生成时间
+ * @Author : sxl
+ * @Date: 2021-03-10 10:08
+ */
+@Component
+public class FIRC03094 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        //1.判断是否有VTE评分
+        VTEGradeDoc vteGradeDoc = inputInfo.getVteGradeDoc();
+        if(vteGradeDoc!= null&& StringUtil.isNotBlank(vteGradeDoc.getStructureMap().get("评估日期")))
+        {
+            //2.获取首次病程记录时间
+            FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+            if(firstCourseRecordDoc!=null&&StringUtil.isNotBlank(firstCourseRecordDoc.getStructureMap().get("病历日期")))
+            {
+                String firstCourseRecorTime =  firstCourseRecordDoc.getStructureMap().get("病历日期");
+                //3.获取vte评分时间
+                String vteGradeTime = vteGradeDoc.getStructureMap().get("评估日期");
+                if(CatalogueUtil.compareDate(firstCourseRecorTime, vteGradeTime,1))
+                {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 95 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstpagerecord/FIRP03104.java

@@ -0,0 +1,95 @@
+package com.lantone.qc.kernel.catalogue.beilun.firstpagerecord;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.gson.JsonObject;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Pattern;
+
+
+/**
+ * @ClassName: FIRP03104
+ * @Description: 麻醉医师与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class FIRP03104 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录麻醉医师 判断麻醉医师是否相同
+         */
+        status.set("0");
+        //1.获取患者的病案首页相关文档,手麻记录
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if(firstPageRecordDoc==null||firstPageRecordDoc.getStructureExtMap().isEmpty()
+            ||firstPageRecordDoc.getStructureExtMap().get("手术信息")==null
+        ||(JSONArray.parseArray(""+firstPageRecordDoc.getStructureExtMap().get("手术信息"))).isEmpty())//无病案首页相关记录或者病案首页无手术记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.获取手术信息
+       try{
+           JSONArray  operationArr = JSONArray.parseArray(""+firstPageRecordDoc.getStructureExtMap().get("手术信息"));
+           for(Object operationOBJ:operationArr)
+           {
+               JSONObject operationJson = JSONObject.parseObject(operationOBJ+"");
+                  if(operationJson!=null)
+                  {
+                      //2.1获取手术麻醉医师
+                      String anesthesiaDoctor = operationJson.getString("麻醉医师");
+                      //通过手术时间判断是否是同一个手术
+                      Date operationStartTime = DateUtil.newParseDateTime(operationJson.getString("手术日期"));
+                      if(StringUtil.isBlank(anesthesiaDoctor)) {
+                          status.set("-1");
+                          return;
+                      }
+                      if(operationStartTime ==null) {continue;}
+                      anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                          //2.2遍历手麻记录,对比手术名称(如果手麻开始时间和病案首页记录时间在3个小时以内则判定为同一台手术)
+                          if (CatalogueUtil.compareTime(operationStartTime,
+                                  anesthesiaRecordDoc.getAnesStartTime(),
+                                  Long.valueOf(2 * 60)))
+                          {
+                              if(StringUtil.isNotBlank(anesthesiaRecordDoc.getAnesthesiaDoctor()))
+                              {
+                                  if(!StringUtil.equals(anesthesiaDoctor,anesthesiaRecordDoc.getAnesthesiaDoctor()))
+                                  {
+                                      status.set("-1");
+                                      return;
+                                  }
+                              }
+                          }
+
+                      });
+                  }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 92 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/firstpagerecord/FIRP03105.java

@@ -0,0 +1,92 @@
+package com.lantone.qc.kernel.catalogue.beilun.firstpagerecord;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: FIRP03105
+ * @Description: 麻醉方式与麻醉记录不一致(病案首页)
+ * @Author songxl
+ * @Date 2021/3/22
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class FIRP03105 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录麻醉方式 判断麻醉方式是否相同
+         */
+        status.set("0");
+        //1.获取患者的病案首页相关文档,手麻记录
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if(firstPageRecordDoc==null||firstPageRecordDoc.getStructureExtMap().isEmpty()
+                ||firstPageRecordDoc.getStructureExtMap().get("手术信息")==null
+                ||(JSONArray.parseArray(""+firstPageRecordDoc.getStructureExtMap().get("手术信息"))).isEmpty())//无病案首页相关记录或者病案首页无手术记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.获取手术信息
+        try{
+            JSONArray  operationArr = JSONArray.parseArray(""+firstPageRecordDoc.getStructureExtMap().get("手术信息"));
+            for(Object operationOBJ:operationArr)
+            {
+                JSONObject operationJson = JSONObject.parseObject(operationOBJ+"");
+                if(operationJson!=null)
+                {
+                    //2.1获取手术麻醉方式
+                    String anesthesiaMethod = operationJson.getString("麻醉方式");
+                    //通过手术时间判断是否是同一个手术
+                    Date operationStartTime = DateUtil.newParseDateTime(operationJson.getString("手术日期"));
+                    if(StringUtil.isBlank(anesthesiaMethod)) {
+                        status.set("-1");
+                        return;
+                    }
+                    if(operationStartTime ==null) {continue;}
+                    anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                        //2.2遍历手麻记录,对比手术名称(如果手麻开始时间和病案首页记录时间在3个小时以内则判定为同一台手术)
+                        if (CatalogueUtil.compareTime(operationStartTime,
+                                anesthesiaRecordDoc.getAnesStartTime(),
+                                Long.valueOf(2 * 60)))
+                        {
+                            if(StringUtil.isNotBlank(anesthesiaRecordDoc.getAnesthesiaMethod()))
+                            {
+                                if(!StringUtil.equals(anesthesiaMethod,anesthesiaRecordDoc.getAnesthesiaMethod()))
+                                {
+                                    status.set("-1");
+                                    return;
+                                }
+                            }
+                        }
+
+                    });
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            log.error(e.getMessage(),e);
+        }
+
+    }
+}

+ 90 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03096.java

@@ -0,0 +1,90 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.alibaba.fastjson.JSONArray;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+import com.lantone.qc.kernel.structure.ai.ModelAI;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03096
+ * @Description: 术后诊断与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03096 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录的术后诊断和麻醉记录的术后诊断进行相似度对比
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术记录术后诊断、手术时间
+                   String diagAfterOperation = operationDoc.getOperationRecordDoc().getStructureMap().get("术中后诊断");
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                                    .getStructureMap().get("手术开始时间"));
+                   if(operationStartTime==null || StringUtil.isBlank(diagAfterOperation)) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       //2.2遍历手麻记录,找到该手术时间的手麻记录
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null)
+                       {
+                           if(DateUtils.isSameInstant(operationStartTime,anesthesiaRecordDoc.getAnesStartTime()))
+                           {
+                               String anesDiagAfterOperation = anesthesiaRecordDoc.getDiagAfterOperation();
+                               //相似度对比
+                               /* 文本相似度模型 */
+                               ModelAI modelAI = new ModelAI();
+                               JSONArray similarContent = new JSONArray();
+                               modelAI.putContent(similarContent,diagAfterOperation,anesDiagAfterOperation);
+                               double likeRate = modelAI.loadSimilarAI(similarContent, similarityServiceClient);
+                               if (likeRate < 0.9) {
+                                   status.set("-1");
+                                   return;
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 85 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03097.java

@@ -0,0 +1,85 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.alibaba.fastjson.JSONArray;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.ChiefPresentSimilarityServiceClient;
+import com.lantone.qc.kernel.structure.ai.ModelAI;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03097
+ * @Description: 手术开始时间与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03097 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录手术开始时间 判断时间是否相同
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术时间
+                   Date operationEndTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术结束时间"));
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(operationStartTime==null||operationEndTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesEndTime()!=null) {
+                           if (DateUtils.isSameInstant(operationEndTime, anesthesiaRecordDoc.getAnesEndTime())) {
+                               //2.2遍历手麻记录,对比手术时间开始时间
+                               if(anesthesiaRecordDoc.getAnesStartTime()!=null)
+                               {
+                                   if(!DateUtils.isSameInstant(operationStartTime,anesthesiaRecordDoc.getAnesStartTime()))
+                                   {
+                                       status.set("-1");
+                                       return;
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 79 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03098.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03098
+ * @Description: 手术名称与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03098 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录手术名称 判断手术名称是否相同
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术名称
+                   String operationName = operationDoc.getOperationRecordDoc().getStructureMap().get("手术名称");
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(StringUtil.isBlank(operationName)||operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null) {
+                           if (DateUtils.isSameInstant(operationStartTime, anesthesiaRecordDoc.getAnesStartTime())) {
+                               //2.2遍历手麻记录,对比手术名称
+                               if(StringUtil.isNotBlank(anesthesiaRecordDoc.getOperationName()))
+                               {
+                                   if(!StringUtil.equals(operationName,anesthesiaRecordDoc.getOperationName()))
+                                   {
+                                       status.set("-1");
+                                       return;
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 91 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03099.java

@@ -0,0 +1,91 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.alibaba.fastjson.JSONArray;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+import com.lantone.qc.kernel.structure.ai.ModelAI;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03099
+ * @Description: 术前诊断与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03099 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录的术后诊断和麻醉记录的术前诊断进行相似度对比
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术记录术前诊断、手术时间
+                   String diagBeforeOperation = operationDoc.getOperationRecordDoc().getStructureMap().get("术前诊断");
+                   Date operationStartTime = DateUtil.parseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"),"yyyy年MM月dd日HH时mm分");
+                   if(operationStartTime==null || StringUtil.isBlank(diagBeforeOperation)) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       //2.2遍历手麻记录,找到该手术时间的手麻记录
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null)
+                       {
+                           if(DateUtils.isSameInstant(operationStartTime,anesthesiaRecordDoc.getAnesStartTime()))
+                           {
+                               String anesDiagBeforeOperation = anesthesiaRecordDoc.getDiagBeforeOperation();
+                               //相似度对比
+                               /* 文本相似度模型 */
+                               ModelAI modelAI = new ModelAI();
+                               JSONArray similarContent = new JSONArray();
+                               modelAI.putContent(similarContent,diagBeforeOperation,anesDiagBeforeOperation);
+                               double likeRate = modelAI.loadSimilarAI(similarContent, similarityServiceClient);
+                               if (likeRate < 0.9) {
+                                   status.set("-1");
+                                   return;
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 79 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03100.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03100
+ * @Description: 麻醉医师与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03100 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录的麻醉医师和麻醉记录判断麻醉医师是否相同
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术名称
+                   String anesthesiaDoctor = operationDoc.getOperationRecordDoc().getStructureMap().get("麻醉医师");
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(StringUtil.isBlank(anesthesiaDoctor)||operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null) {
+                           if (DateUtils.isSameInstant(operationStartTime, anesthesiaRecordDoc.getAnesStartTime())) {
+                               //2.2遍历手麻记录,对比麻醉医师
+                               if(StringUtil.isNotBlank(anesthesiaRecordDoc.getAnesthesiaDoctor()))
+                               {
+                                   if(!StringUtil.equals(anesthesiaDoctor,anesthesiaRecordDoc.getAnesthesiaDoctor()))
+                                   {
+                                       status.set("-1");
+                                       return;
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 73 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03101.java

@@ -0,0 +1,73 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03101
+ * @Description: 出血量与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03101 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录的出血量和麻醉记录出血量比较
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术时间
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       //2.2遍历手麻记录,对比手术时间开始时间
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null)
+                       {
+                           if(!DateUtils.isSameInstant(operationStartTime,anesthesiaRecordDoc.getAnesStartTime()))
+                           {
+                               status.set("-1");
+                               return;
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 79 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03102.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03102
+ * @Description: 麻醉方式与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/22
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03102 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录麻醉方式 判断麻醉方式是否相同
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术麻醉方式
+                   String anesthesiaDoctor = operationDoc.getOperationRecordDoc().getStructureMap().get("麻醉方式");
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(StringUtil.isBlank(anesthesiaDoctor)||operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null) {
+                           if (DateUtils.isSameInstant(operationStartTime, anesthesiaRecordDoc.getAnesStartTime())) {
+                               //2.2遍历手麻记录,对比麻醉方式
+                               if(StringUtil.isNotBlank(anesthesiaRecordDoc.getAnesthesiaMethod()))
+                               {
+                                   if(!StringUtil.equals(anesthesiaDoctor,anesthesiaRecordDoc.getAnesthesiaMethod()))
+                                   {
+                                       status.set("-1");
+                                       return;
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 129 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03103.java

@@ -0,0 +1,129 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03103
+ * @Description: 主刀医师与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/22
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03103 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 1.先去判断手术记录和麻醉记录的主刀医师,如果不一致就直接抛出错误
+         * 2.手术记录和麻醉记录的主刀医师一致,再去和病案首页主刀医师进行比对不一致抛出错误
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术主刀医师
+                   String doctorName = operationDoc.getOperationRecordDoc().getStructureMap().get("主刀医师");
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(StringUtil.isBlank(doctorName)||operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null) {
+                           if (DateUtils.isSameInstant(operationStartTime, anesthesiaRecordDoc.getAnesStartTime())) {
+                               //2.2遍历手麻记录,对比主刀医师
+                               if (StringUtil.isNotBlank(anesthesiaRecordDoc.getDoctorName())) {
+                                   if (!StringUtil.equals(doctorName, anesthesiaRecordDoc.getDoctorName())) {
+                                       status.set("-1");
+                                       return;
+                                   }
+                                   //2.3 手术记录和麻醉记录如果一致判断是否和病案首页是否一致
+                                   //2.3.1.获取患者的病案首页相关文档,手麻记录
+                                   FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+                                   if(firstPageRecordDoc==null||firstPageRecordDoc.getStructureExtMap().isEmpty()
+                                           ||firstPageRecordDoc.getStructureExtMap().get("手术信息")==null
+                                           ||(JSONArray.parseArray(""+firstPageRecordDoc.getStructureExtMap().get("手术信息"))).isEmpty())//无病案首页相关记录或者病案首页无手术记录
+                                   {
+                                       return;
+                                   }
+                                   else {
+                                       //2.3.2.获取手术信息
+                                       try {
+                                           JSONArray operationArr = JSONArray.parseArray("" + firstPageRecordDoc.getStructureExtMap().get("手术信息"));
+                                           for (Object operationOBJ : operationArr) {
+                                               JSONObject operationJson = JSONObject.parseObject(operationOBJ + "");
+                                               if (operationJson != null) {
+                                                   //2.1获取手术麻醉方式
+                                                   Long doctorID = operationJson.getLong("手术医生ID");
+                                                   //通过手术时间判断是否是同一个手术
+                                                   Date firOperationStartTime = DateUtil.newParseDateTime(operationJson.getString("手术日期"));
+                                                   if (doctorID == null) {
+                                                       status.set("-1");
+                                                       return;
+                                                   }
+                                                   if (operationStartTime == null) {
+                                                       continue;
+                                                   }
+
+                                                   //2.2遍历手麻记录,对比手术名称(如果手麻开始时间和病案首页记录时间在3个小时以内则判定为同一台手术)
+                                                   if (CatalogueUtil.compareTime(firOperationStartTime,
+                                                           anesthesiaRecordDoc.getAnesStartTime(),
+                                                           Long.valueOf(2 * 60)))
+                                                   {
+                                                       if(!doctorID.equals(anesthesiaRecordDoc.getDid()))
+                                                       {
+                                                           status.set("-1");
+                                                           return;
+                                                       }
+                                                   }
+                                               }
+                                           }
+                                       }
+                                       catch (Exception e)
+                                       {
+                                           log.error(e.getMessage(),e);
+                                       }
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 80 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE03106.java

@@ -0,0 +1,80 @@
+package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * @ClassName: OPE03103
+ * @Description: 手术结束时间与麻醉记录不一致
+ * @Author songxl
+ * @Date 2021/3/22
+ * @Version 1.0
+ */
+@Component
+@Slf4j
+public class OPE03106 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         * 获取手术记录和麻醉记录手术结束时间 判断手术结束时间是否相同
+         */
+        status.set("0");
+        //1.获取患者的手术相关文档,手麻记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs==null||operationDocs.isEmpty())//无手术相关记录
+        {
+            return;
+        }
+        List<AnesthesiaRecordDoc> anesthesiaDocs  = inputInfo.getAnesthesiaRecordDocs();
+        if(anesthesiaDocs==null|| anesthesiaDocs.isEmpty())//无手麻相关记录
+        {
+            return;
+        }
+        //2.遍历获取手术记录
+       try{
+           for(OperationDoc operationDoc:operationDocs)
+           {
+               if(operationDoc.getOperationRecordDoc()!=null)
+               {
+                   //2.1获取手术主刀医师
+                   Date operationEndTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术结束时间"));
+                   Date operationStartTime = DateUtil.newParseDateTime(operationDoc.getOperationRecordDoc()
+                           .getStructureMap().get("手术开始时间"));
+                   if(operationEndTime==null||operationStartTime==null) {continue;}
+                   anesthesiaDocs.forEach(anesthesiaRecordDoc -> {
+                       if(anesthesiaRecordDoc.getAnesStartTime()!=null) {
+                           if (DateUtils.isSameInstant(operationStartTime, anesthesiaRecordDoc.getAnesStartTime())) {
+                               //2.2遍历手麻记录,对比手术结束时间
+                               if(anesthesiaRecordDoc.getAnesStartTime()!=null)
+                               {
+                                   if(!DateUtils.isSameInstant(operationEndTime,anesthesiaRecordDoc.getAnesEndTime()))
+                                   {
+                                       status.set("-1");
+                                       return;
+                                   }
+                               }
+                           }
+                       }
+                   });
+               }
+           }
+       }
+       catch (Exception e)
+       {
+           log.error(e.getMessage(),e);
+       }
+
+    }
+}

+ 21 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/operationdiscussion/OPE0369.java

@@ -1,9 +1,11 @@
 package com.lantone.qc.kernel.catalogue.beilun.operationdiscussion;
 
+import com.alibaba.druid.support.json.JSONUtils;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
 import com.lantone.qc.pub.model.doc.MedicalRecordInfoDoc;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
@@ -17,7 +19,7 @@ import java.text.ParseException;
 import java.util.*;
 
 /**
- * @Description: 手术患者缺术前主刀医师查房记录
+ * @Description: 主刀医师术前查房未在术前24小时内完成
  * @author: WANGSY
  * @time: 2020/11/11 11:22
  */
@@ -28,7 +30,9 @@ public class OPE0369 extends QCCatalogue {
     protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
         status.set("0");
         if (outputInfo.getResult() != null) {
+            //1.获取查房记录
             Map<String, Object> thr03090 = outputInfo.getResult().get("THR03090");
+            //2.如果查房记录不为空且大于零且状态是-1(查房记录报错)
             if (thr03090 != null && thr03090.size() > 0 && thr03090.get("status").equals("-1")) {
                 return;
             }
@@ -43,6 +47,9 @@ public class OPE0369 extends QCCatalogue {
                 return;
             }
         }
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        System.out.println(JSONUtils.toJSONString(firstPageRecordDoc));
+        String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
         //先判断是否有手术记录
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         if (operationDocs == null || operationDocs.size() == 0) {
@@ -68,7 +75,7 @@ public class OPE0369 extends QCCatalogue {
                 return;
             }
             String operationStartDate = "";
-            List<Date> operDateList = new ArrayList<>();
+            List<Date> operDateList = new ArrayList<>(); //手术时间
             for (OperationDoc operationDoc : operationDocs) {
                 if (operationDoc.getOperationRecordDoc() != null) {
                     Map<String, String> operationDocStructureMap = operationDoc.getOperationRecordDoc().getStructureMap();
@@ -83,6 +90,16 @@ public class OPE0369 extends QCCatalogue {
                                 Long.valueOf(30))) {
                             continue;
                         }
+
+                        //急诊手术处理【入院途径:急诊,且第一次手术时间和入院时间相差1小时】
+                        if(StringUtil.isNotBlank(behospitalWay)&&"急诊".equals(behospitalWay)
+                        &&!CatalogueUtil.compareTime(
+                                StringUtil.parseDateTime(admisTime),
+                                StringUtil.parseDateTime(operationStartDate),
+                                Long.valueOf(60)))
+                        {
+                            continue;
+                        }
                         operDateList.add(StringUtil.parseDateTime(operationStartDate));
                     } else {//取不到手术时间
                         return;
@@ -142,10 +159,12 @@ public class OPE0369 extends QCCatalogue {
         List<Map<String, Date>> operationDateList = new ArrayList<>();
         Map<String, Date> operationDate = null;
         for (OperationDoc operationDoc : operationDocs) {
+            //获取手术记录对象
             OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
             if (operationRecordDoc == null) {
                 continue;
             }
+            //获取手术记录文档
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
             String operationStartDateStr = structureMap.get("手术开始时间");
             if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {

+ 20 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/preoperativediscussion/PRE0328.java

@@ -5,10 +5,13 @@ import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.beilun.BeiLunFirstPageRecordDocTrans;
 import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
@@ -28,6 +31,9 @@ public class PRE0328 extends QCCatalogue {
          * 1:如果急诊手术【入院时间-手术开始时间小于30分钟】则可不用写术前小结。
          * 2:如果入院时间-手术开始时间小于30分钟,则术前讨论、术前小结次数+1。
          * 3:如果手术记录次数(第一次手术的日期内有其他手术不算次数) 大于 术前讨论、术前小结次数,则出错
+         * 4:患者从抢救/急救室转手术室,到手术开始时间不超过30分钟不用写术前讨论
+         * 5、判断是否是急诊手术;[判断入院途径:急诊、入院时间和手术时间接近这种情况不用术前讨论]
+         * 6、获取急诊手术申请标识,从哪取值需要和院方及his讨论。
          */
         status.set("0");
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
@@ -36,6 +42,9 @@ public class PRE0328 extends QCCatalogue {
             return;
         }
         boolean emergencyOperation = false;
+
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        String behospitalWay = firstPageRecordDoc.getStructureMap().get("入院途径");
         if (inputInfo.getBeHospitalizedDoc() != null) {
             Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
             String admisTime = beHospitalStructureMap.get("入院日期");
@@ -53,6 +62,17 @@ public class PRE0328 extends QCCatalogue {
                         Long.valueOf(30))) {//入院到手术未超过30分钟,则可不用写术前小结
                     emergencyOperation = true;
                 }
+
+                //判断是否是急诊手术;[判断入院途径:急诊,这种情况不用术前讨论]
+                if(StringUtil.isNotBlank(behospitalWay)&&"急诊".equals(behospitalWay)
+                        &&!CatalogueUtil.compareTime(
+                        StringUtil.parseDateTime(admisTime),
+                        StringUtil.parseDateTime(startTime),
+                        Long.valueOf(60)))
+                {
+                    emergencyOperation = true;
+
+                }
             }
         }
         //北仑传入急诊标志,在首次病程录中

+ 8 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/threelevelward/THR03076.java

@@ -45,11 +45,17 @@ public class THR03076 extends QCCatalogue {
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        //获取医嘱信息
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        //获取查房记录
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        //获取首次查房记录
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        //获取会诊信息
         List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        //获取手术记录
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        //获取出院小结
         LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
         if (doctorAdviceDocs.size() == 0) {
             return;
@@ -183,8 +189,8 @@ public class THR03076 extends QCCatalogue {
                     String adDateStr = adMap.getKey();
                     Date adDate = StringUtil.parseDateTime(adDateStr);
                     List<Double> adUsage = adMap.getValue();
+                    StringBuffer innersb = new StringBuffer();
                     for (Map.Entry<String, List<Double>> wdvMap : wardDateValue.entrySet()) {
-                        StringBuffer innersb = new StringBuffer();
                         String wardDateStr = wdvMap.getKey();
                         Date wardDate = StringUtil.parseDateTime(wardDateStr);
                         List<Double> wardUsage = wdvMap.getValue();
@@ -201,8 +207,8 @@ public class THR03076 extends QCCatalogue {
                                 break;
                             }
                         }
-                        sb.append(innersb);
                     }
+                    sb.append(innersb);
                 }
             }
         }

+ 19 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/xiamen/operationdiscussion/OPE0587.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.entity.Operation;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
@@ -38,9 +39,24 @@ public class OPE0587 extends QCCatalogue {
         if (inputInfo.getMedicalRecordInfoDoc() == null || inputInfo.getMedicalRecordInfoDoc().getStructureMap().size() == 0) {
             return;
         }
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy/MM/dd");
         //取出所有查房时间
         List<String> roundsDate = new ArrayList<>();
+
+        //获取术后首次病程及谈话记录时间
+        if(inputInfo.getOperationDocs()!=null&&inputInfo.getOperationDocs().size()>0)  //有手术记录
+        {
+            for(OperationDoc operationDoc:inputInfo.getOperationDocs())
+            {
+                if(operationDoc.getOperationDiscussionDoc()!=null&&
+                    StringUtil.isNotBlank(operationDoc.getOperationDiscussionDoc().getStructureMap().get("记录时间")))
+                {
+                    Date threeLevelDate = StringUtil.parseDateTime
+                            (operationDoc.getOperationDiscussionDoc().getStructureMap().get("记录时间"));
+                    roundsDate.add(formatter.format(threeLevelDate));
+                }
+            }
+        }
         for (ThreeLevelWardDoc t : threeLevelWardDocs) {
             Date threeLevelDate = StringUtil.parseDateTime(t.getStructureMap().get("查房日期"));
             roundsDate.add(formatter.format(threeLevelDate));
@@ -69,7 +85,7 @@ public class OPE0587 extends QCCatalogue {
         for (OperationDoc opera : operationDocs) {
             OperationRecordDoc operationRecordDoc = opera.getOperationRecordDoc();
             if (operationRecordDoc != null) {
-                String operDate = operationRecordDoc.getStructureMap().get("手术日期") == null ? null : operationRecordDoc.getStructureMap().get("手术日期");
+                String operDate = operationRecordDoc.getStructureMap().get("手术日期");
                 if (StringUtil.isNotBlank(operDate)) {
                     operDateList.add(operDate);
                 }
@@ -85,7 +101,7 @@ public class OPE0587 extends QCCatalogue {
                 if (day > 3) {
                     List<String> operDatesNew = new ArrayList<>();
                     //用手术时间加三天
-                    for (int i = 1; i < 4; i++) {
+                    for (int i = 0; i < 4; i++) {
                         Date firstTimeOfDay = DateUtil.getFirstTimeOfDay(DateUtil.addDay(oper, i));
                         operDatesNew.add(formatter.format(firstTimeOfDay));
                     }

+ 61 - 26
kernel/src/main/java/com/lantone/qc/kernel/catalogue/xiamen/threelevelward/THR03010.java

@@ -3,9 +3,11 @@ package com.lantone.qc.kernel.catalogue.xiamen.threelevelward;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
 import org.springframework.stereotype.Component;
 
 import java.text.SimpleDateFormat;
@@ -17,6 +19,7 @@ import java.util.Map;
 /**
  * @author wangfeng
  * @Description:入院后没有连续记录3天
+ * 记录分为:首次病程记录+查房记录
  * @date 2020-06-29 17:16
  */
 @Component
@@ -33,48 +36,80 @@ public class THR03010 extends QCCatalogue {
         String behospitalDate = structureMap.get("入院日期") == null ? null : structureMap.get("入院日期");
         //String leaveHospitalDate = structureMap.get("leaveHospitalDate") == null ? null : structureMap.get("leaveHospitalDate");
         Map<String, String> structureMaps = inputInfo.getFirstPageRecordDoc().getStructureMap();
-        String leaveHospitalDate = structureMaps.get("出院时间")== null ? null : structureMap.get("leaveHospitalDate");
+        String leaveHospitalDate = structureMaps.get("出院时间")!= null ?
+                structureMaps.get("出院时间") :inputInfo.getMedicalRecordInfoDoc().getStructureMap().get("leaveHospitalDate");
         if (behospitalDate != null && leaveHospitalDate != null) {
             Date beDate = StringUtil.parseDateTime(behospitalDate);
             Date leaveDate = StringUtil.parseDateTime(leaveHospitalDate);
             long l = (leaveDate.getTime() - beDate.getTime()) / (24 * 60 * 60 * 1000);
+            //如果入院时间和出院时间相差3天以上
             if (l > 3) {
-                List<String> stringDate = new ArrayList<>();
+                /*****从住院当天算起 首次病程记录时间+查房时间连续时间>=3天*/
 
-                SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
-                for (int i = 1; i < 4; i++) {
-                    Date firstTimeOfDay = DateUtil.getFirstTimeOfDay(DateUtil.addDay(beDate, i));
-                    stringDate.add(formatter.format(firstTimeOfDay));
+                //从住院开始连续的时间列表
+                List<Date> stringDate = new ArrayList<>();
+                //当天算进去所以从零开始
+                for (int i = 0; i < 4; i++) {
+                    stringDate.add(DateUtil.getFirstTimeOfDay(DateUtil.addDay(beDate, i)));
                 }
-                List<String> stringList = new ArrayList<>();
+
+                //获取首次病程记录的时间+查房时间
+                List<Date> wordDateList = new ArrayList<>();
+                //获取首次病程记录时间
+                FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+                if(firstCourseRecordDoc!=null
+                        &&StringUtil.isNotBlank(firstCourseRecordDoc.getStructureMap().get("病历日期"))) {
+                    String firstCourseRecorTime = firstCourseRecordDoc.getStructureMap().get("病历日期");
+                    if(StringUtil.isNotBlank(firstCourseRecorTime))
+                    {
+                        wordDateList.add(StringUtil.parseDateTime(firstCourseRecorTime));
+                    }
+                }
+                //获取查房时间
                 List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
                 for (ThreeLevelWardDoc t : threeLevelWardDocs) {
                     Date threeLevelDate = StringUtil.parseDateTime(t.getStructureMap().get("查房日期"));
-                    stringList.add(formatter.format(threeLevelDate));
+                    //去重,同一天就存一次
+                    if(threeLevelDate!=null&&wordDateList.get(wordDateList.size()-1)!=null
+                            &&!DateUtils.isSameDay(wordDateList.get(wordDateList.size()-1),threeLevelDate))
+                    {
+                        wordDateList.add(threeLevelDate);
+                    }
+                }
+                //如果记录时间没有3天
+                if(wordDateList.size()<3)
+                {
+                    status.set("-1");
+                    return;
                 }
-                if (stringList.size() > 2) {//查房日期取出没有3天时间, 直接报错
-                    //去重
-                    List<String> listTemp = new ArrayList<String>();
-                    for (int i = 0; i < stringList.size(); i++) {
-                        if (!listTemp.contains(stringList.get(i))) {
-                            listTemp.add(stringList.get(i));
+                //如果住院当天开始做记录
+                if(DateUtils.isSameDay(stringDate.get(0),wordDateList.get(0)))
+                {
+                    for(int i = 1;i<=2;i++)
+                    {
+                        //如果时间不相等则时间不连续
+                        if(!DateUtils.isSameDay(stringDate.get(i),wordDateList.get(i)))
+                        {
+                            status.set("-1");
+                            return;
                         }
                     }
-                    int i = 0;
-                    for (String str : stringDate) {
-                        for (String s : listTemp) {
-                            if (str.equals(s)) {
-                                i++;
-                            }
+                    return;
+                }
+                //如果是住院后第二天开始
+                else
+                {
+                    for(int i = 0;i<=3;i++)
+                    {
+                        //如果时间不相等则时间不连续
+                        if(!DateUtils.isSameDay(stringDate.get(i+1),wordDateList.get(i)))
+                        {
+                            status.set("-1");
+                            return;
                         }
                     }
-                    if (i < 3) {
-                        status.set("-1");
-                    }
-                } else {
-                    status.set("-1");
+                    return;
                 }
-
             }
         }
 

+ 6 - 0
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/AIAnalyze.java

@@ -23,11 +23,17 @@ public class AIAnalyze {
     }
 
     public void aiProcess(InputInfo inputInfo) {
+        //入院记录
         beHospitalizedAI.medrec(inputInfo, crfServiceClient);
+        //首次病程录
         firstCourseRecordAI.medrec(inputInfo, crfServiceClient, similarityServiceClient);
+        //出院小结
         leaveHospitalAI.medrec(inputInfo, crfServiceClient);
+        //查房记录
         threeLevelWardAI.medrec(inputInfo, crfServiceClient);
+        //手术记录,术后首次病程及谈话记录
         operationAI.medrec(inputInfo, crfServiceClient);
+        //会诊记录
         consultationAI.medrec(inputInfo, crfServiceClient);
     }
 

+ 12 - 11
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/model/Lemma.java

@@ -16,17 +16,18 @@ import java.util.List;
 @Getter
 @Setter
 public class Lemma {
-    private int id;
-    private String text;
-    private String position;
-    private int from;
-    private int to;
-    private int len;
-    private String property;
-    private String relationName;
-    private Lemma parent;
-    private boolean haveChildren = false;
-    private List<Lemma> relationLemmas = new ArrayList<>();
+    private int id;		                                    //实体id
+    private String text;		                            //实体内容文本
+    private String position;	                            //实体位置
+    private int from;		                                //实体起始位置
+    private int to;		                                    //实体终止位置
+    private int len;		                                //实体文本长度
+    private String property;	                            //实体类别,如疾病名称、身体部位
+    private String relationName;                            //关系名称
+    private Lemma parent;		                            //父类实体信息,如头痛三天,头痛为临床表现实体,是三天(时间)实体的父实体
+    private boolean haveChildren = false;                   //是否包含子实体信息,与上述逻辑一致
+    private List<Lemma> relationLemmas = new ArrayList<>(); //与该实体有关系的所有实体列表
+
 
     public void addRelationLemmas(Lemma lemma) {
         this.relationLemmas.add(lemma);

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcess.java

@@ -284,7 +284,7 @@ public class EntityProcess {
             if (lemma.getProperty().equals(EntityEnum.TIME.toString())) {
                 PD pd = new PD();
                 value = lemma.getText();
-                String[] valUnit = new String[2];;
+                String[] valUnit = new String[2];
                 if (value.trim().length() > 0) {
                     valUnit = CatalogueUtil.extractDigit(value);
                 }

+ 19 - 1
kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java

@@ -31,11 +31,18 @@ import java.util.regex.Pattern;
 @Getter
 @Setter
 public class CatalogueUtil {
+    //初始化加载的所有的质控条目分析对象
     public static Map<String, QCCatalogue> qcCatalogueMap = new HashMap<>();
     public static Map<Integer, String> intMapString =
             ImmutableMap.<Integer, String>builder().put(1, "一").put(2, "二").put(3, "三").put(4, "四").put(5, "五")
                     .put(6, "六").put(7, "七").put(8, "八").put(9, "九").put(0, "零").build();
 
+    /**
+     * 去除特殊字符,判断字符串否未空
+     *
+     * @param content
+     * @return
+     */
     public static boolean isEmpty(String content) {
         return StringUtil.isBlank(removeSpecialChar(content));
     }
@@ -366,7 +373,12 @@ public class CatalogueUtil {
         }
         return false;
     }
-
+    /**
+     * 将阿拉伯数字字符串变成汉字字符串
+     *
+     * @param content
+     * @return
+     */
     public static String int2ChineseNum(String content) {
         StringBuffer sb = new StringBuffer();
         char[] contentArr = content.toCharArray();
@@ -617,4 +629,10 @@ public class CatalogueUtil {
         return "";
     }
 
+
+    public static void main(String args[])
+    {
+
+    }
+
 }

+ 1 - 1
kernel/src/main/resources/bootstrap.yml

@@ -12,7 +12,7 @@ spring:
       charset: UTF-8
       enabled: true
   profiles:
-    active: local
+    active: debug
 
 qc:
   hospital_id: 4,5,6,7,8,10

+ 3 - 0
public/src/main/java/com/lantone/qc/pub/Content.java

@@ -323,4 +323,7 @@ public class Content {
             "yyyy-MM-dd'T'HH:mm:ss",
             "yyyy-MM-ddTHH:mm:ss",
     };
+
+    public static final String adl_grade_time = "日期";//ADL评分时间
+
 }

+ 7 - 0
public/src/main/java/com/lantone/qc/pub/model/InputInfo.java

@@ -97,6 +97,13 @@ public class InputInfo {
     private List<DailyCourseRecordDoc> dailyCourseRecordDocs = Lists.newArrayList();
     //住院病历信息
     private MedicalRecordInfoDoc medicalRecordInfoDoc;
+    //VTE评分
+    private VTEGradeDoc vteGradeDoc;
+    //ADL评分
+    private ADLGradeDoc adlGradeDoc;
+
+    //手麻信息
+    private List<AnesthesiaRecordDoc> anesthesiaRecordDocs = new ArrayList<>();
     private boolean useCrfCache;
 
     //新增记录

+ 17 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/ADLGradeDoc.java

@@ -0,0 +1,17 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName: ADLGradeDoc
+ * @Description: ADL评分信息
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Getter
+@Setter
+public class ADLGradeDoc extends ModelDoc {
+
+}

+ 33 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/AnesthesiaRecordDoc.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @ClassName: AnesthesiaRecordDoc
+ * @Description: 手麻记录文档
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Getter
+@Setter
+public class AnesthesiaRecordDoc extends ModelDoc{
+    private Long id;
+    private Long hospitalId;                        //医院ID
+    private String behospitalCode;                  //病历号
+    private Date anesStartTime;                     //开始时间
+    private String diagBeforeOperation;             //术前诊断
+    private String diagAfterOperation;              //术后诊断
+    private String operationName;                   //手术名称
+    private String anesthesiaDoctor;                //麻醉医师
+    private String bleedingAmount;                  //出血量
+    private Long did;                        //主刀医师ID
+    private String doctorName;                      //主刀医师
+    private String anesthesiaMethod;                //麻醉方式
+    private Date anesEndTime;                       //手术结束时间
+    private Date inAnesStartTime;                   //入手术时间(进入手术室时间,早于手术时间,用于术前准备)
+    private String is_deleted;                      //是否删除
+}

+ 15 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/VTEGradeDoc.java

@@ -0,0 +1,15 @@
+package com.lantone.qc.pub.model.doc;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : VTEGradeDoc
+ * @Description : VTE评分信息
+ * @Author : sxl
+ * @Date: 2021-03-09 15:00
+ */
+@Getter
+@Setter
+public class VTEGradeDoc extends ModelDoc {
+}

+ 4 - 4
public/src/main/java/com/lantone/qc/pub/model/entity/Diag.java

@@ -14,8 +14,8 @@ import lombok.Setter;
 @Setter
 public class Diag extends General {
     private String hospitalDiagName;    //医院疾病名称
-    private Possible possible;
-    private Negative negative;
-    private PD pd;
-    private String ICD;
+    private Possible possible;          //可能性
+    private Negative negative;          //阴性
+    private PD pd;                      //疾病进展
+    private String ICD;                 //疾病编码
 }

+ 2 - 2
public/src/main/java/com/lantone/qc/pub/model/entity/PD.java

@@ -6,6 +6,6 @@ import lombok.Setter;
 @Setter
 @Getter
 public class PD extends General {
-    private String value;
-    private String unit;
+    private String value; //值
+    private String unit;  //单位
 }

+ 2 - 2
public/src/main/java/com/lantone/qc/pub/model/label/ChiefLabel.java

@@ -18,8 +18,8 @@ import java.util.List;
 @Setter
 @Getter
 public class ChiefLabel extends GeneralLabel {
-    private List<Clinical> clinicals;
-    private List<Diag> diags;
+    private List<Clinical> clinicals; //临床表现
+    private List<Diag> diags;         //诊断
     //现病史中所有时间实体存入
     private List<PD> pds = new ArrayList<>();
 }

+ 1 - 1
public/src/main/java/com/lantone/qc/pub/model/label/PastLabel.java

@@ -22,7 +22,7 @@ public class PastLabel extends GeneralLabel{
     private List<Allergy> allergies = new ArrayList<>();//过敏史
     private List<AllergyFood> allergyFoods = new ArrayList<>();//食物过敏史
     private List<AllergyMedicine> allergyMedicines = new ArrayList<>();//药物过敏史
-    private List<AllergyDesc> allergyDescs = new ArrayList<>();
+    private List<AllergyDesc> allergyDescs = new ArrayList<>();//过敏表现
     private List<BloodTransfusion> bloodTransfusions = new ArrayList<>();//输血史
     private List<Operation> operations = new ArrayList<>();//手术史
     private List<Vaccinate> vaccinates = new ArrayList<>();//预防接种史

+ 82 - 0
public/src/main/java/com/lantone/qc/pub/util/DateUtil.java

@@ -4,6 +4,7 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.regex.Pattern;
 
 /**
  * @Description: 日期工具类
@@ -38,6 +39,10 @@ public class DateUtil {
      * 日期格式:yyyy-MM-dd HH:mm:ss
      */
     public static final String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    /**
+     * 日期格式:yyyy/MM/dd HH:mm:ss
+     */
+    public static final String DATE_TIME_SG_FORMAT = "yyyy/MM/dd HH:mm:ss";
     /**
      * 日期格式:yyyy-MM-dd HH:mm:ss.SSS
      */
@@ -321,7 +326,28 @@ public class DateUtil {
     public static Date parseDateTime(String dateString) {
         return parseDate(dateString, DATE_TIME_FORMAT);
     }
+    /**
+     * 将字符(yyyy-MM-dd HH:mm:ss)转换为日期
+     *
+     * @param dateString
+     * @return 将字符(yyyy-MM-dd HH:mm:ss)转换为日期
+     */
+    public static Date parseDateTime(String dateString,String format) {
+        return parseDate(dateString, format);
+    }
 
+    /**
+     * 将字符(yyyy-MM-dd HH:mm:ss)转换为日期
+     *
+     * @param time
+     * @return 将字符时间转换为日期
+     */
+    public static Date newParseDateTime(String time) {
+        if(StringUtil.isBlank(time)){return null;}
+        String format = getTimeFormat(time);
+        if(StringUtil.isBlank(format)){return null;}
+        return parseDate(time, format);
+    }
     /**
      * milliseconds 转化为日期
      *
@@ -819,6 +845,62 @@ public class DateUtil {
     }
 
 
+
+    /**
+     * 获取字符串时间的format
+     * @param time
+     * @return
+     */
+    public static String getTimeFormat(String time)
+    {
+        if(StringUtil.isBlank(time))
+        {
+            return null;
+        }
+        String regex = "\\d+";
+        time = time.replaceAll(regex,"");
+        switch (time)
+        {
+            //===========yyyy年MM月dd日HH时mm分ss秒============
+            case "年月日 时分秒":
+                return "yyyy年MM月dd日 HH时mm分ss秒";
+            case "年月日时分秒":
+                return "yyyy年MM月dd日HH时mm分ss秒";
+            case "年月日 时分":
+                return "yyyy年MM月dd日HH时mm分";
+            case "年月日时分":
+                return "yyyy年MM月dd日HH时mm分";
+            case "年月日 时":
+                return "yyyy年MM月dd日 HH时";
+            case "年月日时":
+                return "yyyy年MM月dd日HH时";
+            case "年月日":
+                return "yyyy年MM月dd日";
+            //===========yyyy-MM-dd HH:mm:ss============
+            case "-- ::":
+                return "yyyy-MM-dd HH:mm:ss";
+            case "-- :":
+                return "yyyy-MM-dd HH:mm";
+            case "-- ":
+                return "yyyy-MM-dd HH";
+            case "--":
+                return "yyyy-MM-dd";
+            //===========yyyy/MM/dd HH:mm:ss============
+            case "// ::":
+                return "yyyy/MM/dd HH:mm:ss";
+            case "// :":
+                return "yyyy/MM/dd HH:mm";
+            case "// ":
+                return "yyyy/MM/dd HH";
+            case "//":
+                return "yyyy/MM/dd";
+            default:
+                break;
+        }
+        return null;
+    }
+
+
     //计算时间差,以天数为单位。如:2018-08-08 和 2018-08-05 相差3天
     public static int getDistanceTime(Date startTime, Date endTime) {
         int days = 0;

+ 2 - 0
trans/src/main/java/com/lantone/qc/trans/TransDispatch.java

@@ -19,6 +19,7 @@ public class TransDispatch {
 
     public static InputInfo trans(QueryVo queryVo) {
         try {
+//            com.lantone.qc.trans.beilun.BeilunDocTrans
             String classPath = "com.lantone.qc.trans."
                     + queryVo.getCid()
                     + "."
@@ -26,6 +27,7 @@ public class TransDispatch {
                     + queryVo.getCid().substring(1)
                     + "DocTrans";
             DocTrans docTrans = (DocTrans) Class.forName(classPath).newInstance();
+            //将大标题里面的内容取出封装成小标题:MedrecVo装进MedrecVo
             queryDeal(queryVo, "会诊", "会诊申请单", "会诊结果单", "会诊记录");
             queryDeal(queryVo, "手术", "术前讨论、术前小结", "手术记录", "术后首次病程及谈话记录");
             queryDeal(queryVo, "转科", "转入记录", "转出记录", "转科记录");

+ 46 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/AnesthesiaRecordDocTrans.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.trans.beilun;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.ADLGradeDoc;
+import com.lantone.qc.pub.model.doc.AnesthesiaRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.beilun.util.BeiLunADLGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: AnesthesiaRecordDocTrans
+ * @Description: 手麻记录解析
+ * @Author songxl
+ * @Date 2021/3/19
+ * @Version 1.0
+ */
+@Slf4j
+public class AnesthesiaRecordDocTrans extends ModelDocTrans {
+    @Override
+    public List<AnesthesiaRecordDoc> extract(MedrecVo medrecVo) {
+        List<AnesthesiaRecordDoc> anesList = Lists.newArrayList();
+        try {
+            //1.获取mrqc medrecVo content数据
+            List<String> anesthesiaList = (List<String>)medrecVo.getContent().get("content");
+            //2.装载到AnesthesiaRecordDoc
+            anesthesiaList.forEach(anesthesiaStr->{
+                AnesthesiaRecordDoc anesthesiaTemp =JSONObject.parseObject
+                        (anesthesiaStr,AnesthesiaRecordDoc.class);
+                anesList.add(anesthesiaTemp);
+            });
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return anesList;
+    }
+}

+ 52 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunADLGradeDocTrans.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.trans.beilun;
+
+import com.lantone.qc.pub.model.doc.ADLGradeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.beilun.util.BeiLunADLGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunADLGradeDocTrans
+ * @Description: ADL评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunADLGradeDocTrans extends ModelDocTrans {
+    @Override
+    public ADLGradeDoc extract(MedrecVo medrecVo) {
+        ADLGradeDoc adlGradeDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunADLGradeHtmlAnalysis adlGradeHtmlAnalysis = new BeiLunADLGradeHtmlAnalysis();
+                Map<String, String> sourceMap = adlGradeHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap.putAll(sourceMap);
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                              ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                adlGradeDoc = ModelDocGenerate.adlGradeDocGen(structureMap);
+                adlGradeDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return adlGradeDoc;
+    }
+}

+ 55 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunVTEGradeDocTrans.java

@@ -0,0 +1,55 @@
+package com.lantone.qc.trans.beilun;
+
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.VTEGradeDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.beilun.util.BeiLunBeHospitalizedHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunVTEGradeHtmlAnalysis;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunVTEGradeDocTrans
+ * @Description: VTE评分
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunVTEGradeDocTrans extends ModelDocTrans {
+    @Override
+    public VTEGradeDoc extract(MedrecVo medrecVo) {
+        VTEGradeDoc vteGradeDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunVTEGradeHtmlAnalysis vteGradeHtmlAnalysis = new BeiLunVTEGradeHtmlAnalysis();
+                Map<String, String> sourceMap = vteGradeHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap.putAll(sourceMap);
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                              ModelDocGenerate.beHospitalizedDocGen(structureMap);
+                vteGradeDoc = ModelDocGenerate.vteGradeDocGen(structureMap);
+                vteGradeDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return vteGradeDoc;
+    }
+}

+ 15 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java

@@ -124,6 +124,21 @@ public class BeilunDocTrans extends DocTrans {
                     BeiLunOutDepDocTrans outDepDocTrans = new BeiLunOutDepDocTrans();
                     inputInfo.setBeHospitalizedDoc(outDepDocTrans.extract(i));
                 }
+                /*******************************VTE评分 trans解析*****************************************/
+                if (i.getTitle().equals("VTE评分")) {
+                    BeiLunVTEGradeDocTrans vteGradeDocTrans = new BeiLunVTEGradeDocTrans();
+                    inputInfo.setVteGradeDoc(vteGradeDocTrans.extract(i));
+                }
+                /*******************************ADL评分 trans解析*****************************************/
+                if (i.getTitle().equals("ADL评分")) {
+                    BeiLunADLGradeDocTrans adlGradeDocTrans = new BeiLunADLGradeDocTrans();
+                    inputInfo.setAdlGradeDoc(adlGradeDocTrans.extract(i));
+                }
+                /*******************************手麻记录 trans解析*****************************************/
+                if (i.getTitle().equals("手麻记录")) {
+                    AnesthesiaRecordDocTrans anesthesiaRecordDocTrans= new AnesthesiaRecordDocTrans();
+                    inputInfo.setAnesthesiaRecordDocs(anesthesiaRecordDocTrans.extract(i));
+                }
             }
         }
         pageDataHandle(inputInfo);

+ 42 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunADLGradeHtmlAnalysis.java

@@ -0,0 +1,42 @@
+package com.lantone.qc.trans.beilun.util;
+
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.Content;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunADLGradeHtmlAnalysis
+ * @Description: ADL评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunADLGradeHtmlAnalysis implements BeiLunHtmlAnalysis{
+    private String modeId = "0";//模块id待定
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+
+            Document doc = Jsoup.parse(html);
+            //评估日期
+            Elements spanES = doc.getElementById("table2").nextElementSiblings().get(1).getElementsByTag("span");
+            String time = spanES.text().split(Content.adl_grade_time)[1]
+                    .replaceAll(":","").trim();
+            map.put(Content.adl_grade_time,time);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 4 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunBeHospitalizedHtmlAnalysis.java

@@ -8,7 +8,11 @@ import lombok.extern.slf4j.Slf4j;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
 
+import java.awt.*;
+import java.io.File;
+import java.io.IOException;
 import java.util.List;
 import java.util.Map;
 

+ 41 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunVTEGradeHtmlAnalysis.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.trans.beilun.util;
+
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+import java.util.Map;
+
+/**
+ * @ClassName: BeiLunVTEGradeHtmlAnalysis
+ * @Description: VTE评分HTML解析
+ * @Author songxl
+ * @Date 2021/3/9
+ * @Version 1.0
+ */
+@Slf4j
+public class BeiLunVTEGradeHtmlAnalysis implements BeiLunHtmlAnalysis{
+    private String modeId = "0";//模块id待定
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> map = Maps.newLinkedHashMap();
+        try {
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+
+            Document doc = Jsoup.parse(html);
+            //评估日期
+            Element valuationName = doc.getElementById("table4").getElementsByTag("tr").get(2)
+                    .getElementsByTag("span").get(0);
+            Element valuationTime = doc.getElementById("table4").getElementsByTag("tr").get(2)
+                    .getElementsByTag("span").get(1);
+            map.put(valuationName.text().replaceAll(":",""),valuationTime.text());
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return map;
+    }
+}

+ 23 - 0
trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java

@@ -453,6 +453,28 @@ public class ModelDocGenerate {
         threeLevelWardDoc.setStructureMap(structureMap);
         return threeLevelWardDoc;
     }
+    /**
+     * VTE评分
+     *
+     * @param structureMap
+     * @return
+     */
+    public static VTEGradeDoc vteGradeDocGen(Map<String, String> structureMap) {
+        VTEGradeDoc vteGradeDoc = new VTEGradeDoc();
+        vteGradeDoc.setStructureMap(structureMap);
+        return vteGradeDoc;
+    }
+    /**
+     * ADL评分
+     *
+     * @param structureMap
+     * @return
+     */
+    public static ADLGradeDoc adlGradeDocGen(Map<String, String> structureMap) {
+        ADLGradeDoc adlGradeDoc = new ADLGradeDoc();
+        adlGradeDoc.setStructureMap(structureMap);
+        return adlGradeDoc;
+    }
 
     /**
      * 拼接结构化数据
@@ -467,4 +489,5 @@ public class ModelDocGenerate {
         return textJoin;
     }
 
+
 }