Browse Source

Merge remote-tracking branch 'origin/hb/beilun' into his/xszyy

# Conflicts:
#	dbanaly/src/main/resources/application-local.yml
#	kernel/src/main/resources/bootstrap.yml
Gaozk 3 years ago
parent
commit
049dd57b78
40 changed files with 1184 additions and 108 deletions
  1. 3 3
      dbanaly/src/main/resources/application-test.yml
  2. 47 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0306.java
  3. 54 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0307.java
  4. 55 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0308.java
  5. 44 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0562.java
  6. 46 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0564.java
  7. 72 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0569.java
  8. 14 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/operationdiscussion/OPE0369.java
  9. 17 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR03090.java
  10. 92 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/firstcourserecord/FIRC0087.java
  11. 132 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/firstpagerecord/FIRP0178.java
  12. 0 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE03143.java
  13. 68 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE03144.java
  14. 66 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0323.java
  15. 45 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0636.java
  16. 45 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0640.java
  17. 250 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/threelevelward/THR0127.java
  18. 31 30
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03107.java
  19. 2 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0330.java
  20. 1 0
      trans/src/main/java/com/lantone/qc/trans/hangzhoufubao/HangzhoufubaoDocTrans.java
  21. 5 5
      trans/src/main/java/com/lantone/qc/trans/ningbozhenhai/util/OperationRecordHtmlAnalysis.java
  22. 1 0
      trans/src/main/java/com/lantone/qc/trans/ningbozhongyi/NingBoZhongYiOperationDocTrans.java
  23. 9 5
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java
  24. 2 3
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java
  25. 3 2
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java
  26. 3 2
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java
  27. 2 2
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java
  28. 0 2
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/OperationDocTrans.java
  29. 20 9
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/BeHospitalizedHtmlAnalysis.java
  30. 2 11
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicBloodEffectHtmlAnalysis.java
  31. 7 3
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicalBloodHtmlAnalysis.java
  32. 4 1
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationRecordHtmlAnalysis.java
  33. 4 3
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DifficultCaseDiscussHtmlAnalysis.java
  34. 9 3
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/FirstCourseRecordHtmlAnalysis.java
  35. 8 2
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/LeaveHospitalHtmlAnalysis.java
  36. 7 5
      trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationRecordHtmlAnalysis.java
  37. 1 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunBeHospitalizedDocTrans.java
  38. 2 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstCourseRecordDocTrans.java
  39. 4 4
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunBeHospitalizedHtmlAnalysis.java
  40. 7 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java

+ 3 - 3
dbanaly/src/main/resources/application-test.yml

@@ -5,9 +5,9 @@ spring:
     druid:
       lantone:
         driver-class-name: com.mysql.jdbc.Driver
-        url: jdbc:mysql://192.168.2.126:3307/qc?useUnicode=true&characterEncoding=utf8&useSSL=false
+        url: jdbc:mysql://192.168.2.237:3307/qc_wenfuyi_20220510?useUnicode=true&characterEncoding=utf8&useSSL=false
         username: root
-        password: Lat0ne@tesT
+        password: lantone
         initial-size: 8
         min-idle: 1
         max-active: 20
@@ -54,4 +54,4 @@ NewBatchSimilarity:
   url: http://192.168.2.234:23232/api/similarity_batch
 
 ChiefPresentSimilarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity
+  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity

+ 47 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0306.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CLI0306
+ * @Description : 输血记录中无输血指征
+ * CRF缺少足够标注数据,使用规则判断输血原因是否有数字
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0306 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if (ListUtil.isEmpty(clinicalBloodDocs)) {
+            status.set("0");
+            return;
+        }
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                if (cliBStructureMap.containsKey("病历内容")) {
+                    String bloodType = cliBStructureMap.get("病历内容");
+                    if (StringUtil.isNotBlank(bloodType)) {
+                        if (bloodType.contains("血常规")) {
+                            status.set("0");
+                            return;
+                        }
+                    }
+                }
+            }
+        } else {
+            status.set("0");
+        }
+    }
+}

+ 54 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0307.java

@@ -0,0 +1,54 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CLI0307
+ * @Description : 输血记录中无血液制品种类及量
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0307 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if (ListUtil.isEmpty(clinicalBloodDocs)) {
+            status.set("0");
+            return;
+        }
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            int matchSum = 0;
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                //台州
+                if (StringUtils.isNotEmpty(cliBStructureMap.get("输血计划"))) {
+                    matchSum++;
+                    continue;
+                }
+                if (cliBStructureMap.containsKey("病历内容")){
+                    String bloodType = cliBStructureMap.get("病历内容");
+                    if (StringUtil.isNotBlank(bloodType)) {
+                        if (bloodType.contains("今日予")) {
+                            matchSum++;
+                        }
+                    }
+                }
+            }
+            if (matchSum == clinicalBloodDocs.size()) {
+                status.set("0");
+            }
+        }
+
+    }
+}

+ 55 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0308.java

@@ -0,0 +1,55 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CLI0308
+ * @Description :  输血记录中未记录是否有不良反应
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0308 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if (ListUtil.isEmpty(clinicalBloodDocs)) {
+            status.set("0");
+            return;
+        }
+
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            String regex = ".*(未.*|无.*|否.*).*(输血反应|不良反应).*";
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                if (StringUtils.isNotEmpty(cliBStructureMap.get("输注后效果评价")) && (cliBStructureMap.get("输注后效果评价").contains("不良反应")
+                        || cliBStructureMap.get("输注后效果评价").contains("不适") || cliBStructureMap.get("输注后效果评价").contains("未见"))) {
+                    status.set("0");
+                    break;
+                }
+
+                String infusion_process = cliBStructureMap.get("病历内容");
+                if (StringUtils.isNotEmpty(infusion_process)) {
+                    if (infusion_process.matches(regex) || infusion_process.contains("无") || infusion_process.contains("未见")
+                            || infusion_process.contains("未觉")) {
+                        status.set("0");
+                    } else {
+                        status.set("-1");
+                    }
+                }
+
+            }
+        } else {
+            status.set("0");
+        }
+    }
+}
+

+ 44 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0562.java

@@ -0,0 +1,44 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CLI0562
+ * @Description : 输血记录开始输血时间未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0562 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if(ListUtil.isEmpty(clinicalBloodDocs)){
+            return;
+        }
+
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                String start = cliBStructureMap.get("输注开始");
+                String record = cliBStructureMap.get("病历内容");
+                if(StringUtil.isNotBlank(start) || StringUtil.isNotBlank(cliBStructureMap.get("输血开始日期"))) break;
+                if (StringUtil.isBlank(start) && !record.contains("开始")) {
+                    status.set("-1");
+                    break;
+                }
+            }
+        }
+
+    }
+}

+ 46 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0564.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CLI0564
+ * @Description : 输血记录输血结束时间未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0564 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if(ListUtil.isEmpty(clinicalBloodDocs)){
+            return;
+        }
+
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+//            List<ClinicalBloodDoc> bloodDocs = clinicalBloodDocs.stream().filter(bloodDoc -> bloodDoc.getStructureMap().get("输血后效果评价") == null).collect(Collectors.toList());
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                String start = cliBStructureMap.get("输注结束");
+                String record = cliBStructureMap.get("病历内容");
+                if(StringUtil.isNotBlank(start) || StringUtil.isNotBlank(cliBStructureMap.get("输血结束日期"))) break;
+                if (StringUtil.isBlank(start) && !record.contains("输注结束")&& !record.contains("完毕")
+                        && !record.contains("输血结束")) {
+                    status.set("-1");
+                    break;
+                }
+            }
+        }
+
+    }
+}

+ 72 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0569.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.clinicalblood;
+
+
+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.ClinicalBloodDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : CLI0569
+ * @Description :  输血记录血型未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0569 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        if (ListUtil.isEmpty(clinicalBloodDocs)) {
+            return;
+        }
+        if (clinicalBloodDocs != null && clinicalBloodDocs.size() > 0) {
+            int matchSum = 0;
+            for (ClinicalBloodDoc cliB : clinicalBloodDocs) {
+                Map<String, String> cliBStructureMap = cliB.getStructureMap();
+                //台州
+                if (StringUtils.isNotEmpty(cliBStructureMap.get("血型"))) {
+                    matchSum++;
+                    continue;
+                }
+                String title = cliBStructureMap.get("标题");
+                if (StringUtil.isNotBlank(title) && title.contains("蛋白")){
+                    matchSum++;
+                    continue;
+                }
+                String record = cliBStructureMap.get("病历内容");
+                if (record.contains("A型") || record.contains("AB型") || record.contains("B型") || record.contains("O型")) {
+                    matchSum++;
+                    continue;
+                }
+                Pattern compile = Pattern.compile("[a-zA-Z]+型");
+                Matcher matcher = compile.matcher(StringUtil.removeBlank(cliBStructureMap.get("输注种类、血型、数量")));
+                if (matcher.find()) {
+                    matchSum++;
+                }
+                if (cliBStructureMap.containsKey("输注种类、血型、数量")) {
+                    String bloodType = cliBStructureMap.get("输注种类、血型、数量");
+                    if (StringUtils.isNotEmpty(bloodType) &&
+                            (bloodType.contains("白蛋白") || bloodType.contains("凝血酶原复合物")
+                                    || bloodType.contains("血浆"))) {
+                        matchSum++;
+                        continue;
+                    }
+                }
+            }
+            if (matchSum != clinicalBloodDocs.size()) {
+                status.set("-1");
+            }
+        }
+
+    }
+}

+ 14 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/operationdiscussion/OPE0369.java

@@ -8,9 +8,11 @@ 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;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
@@ -92,7 +94,18 @@ public class OPE0369 extends QCCatalogue {
                     }
                 }
             }
-
+            if (operationDocs!=null || operationDocs.size()>0){
+                PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDocs.get(0).getPreoperativeDiscussionDoc();
+                if(preoperativeDiscussionDoc != null){
+                    Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+                    String recTitle = structureMap.get("标题");
+                    if (StringUtils.isNotBlank(recTitle)){
+                        if (recTitle.contains("术前")) {
+                            return;
+                        }
+                    }
+                }
+            }
             ThreeLevelWardDoc threeLevelWardDoc = threeLevelWardDocs.get(0);
             List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
             for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {

+ 17 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR03090.java

@@ -6,8 +6,10 @@ import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
 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.PreoperativeDiscussionDoc;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -45,16 +47,27 @@ public class THR03090 extends QCCatalogue {
                 return;
             }
         }
-
+        if (operationDocs!=null || operationDocs.size()>0){
+            PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDocs.get(0).getPreoperativeDiscussionDoc();
+            if(preoperativeDiscussionDoc != null){
+                Map<String, String> structureMap = preoperativeDiscussionDoc.getStructureMap();
+                String recTitle = structureMap.get("标题");
+                if (StringUtils.isNotBlank(recTitle)){
+                    if (recTitle.contains("术前")) {
+                        return;
+                    }
+                }
+            }
+        }
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
         for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
             Map<String, String> structureMap = threeLevelWard.getStructureMap();
             String makeTitle = structureMap.get("查房标题");
-            String writTitle = structureMap.get("文书标题");
+            String witeTitle = structureMap.get("文书标题");
             String makeDate = structureMap.get("查房日期");
             if (StringUtil.isNotBlank(makeDate) && StringUtil.parseDateTime(makeDate).before(StringUtil.parseDateTime(operationStartDate))) {
-                if (((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主刀")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("主刀"))
-                        || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前")) || (StringUtil.isNotBlank(writTitle) && writTitle.contains("术前"))))) {
+                if (((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("主刀")) || (StringUtil.isNotBlank(witeTitle) && witeTitle.contains("主刀"))
+                        || ((StringUtil.isNotBlank(makeTitle) && makeTitle.contains("术前")) || (StringUtil.isNotBlank(witeTitle) && witeTitle.contains("术前"))))) {
                     return;
                 }
             }

+ 92 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/firstcourserecord/FIRC0087.java

@@ -0,0 +1,92 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.firstcourserecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.ChiefPresentSimilarityServiceClient;
+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.label.CaseCharacteristicLabel;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRC0087
+ * @Description : 无鉴别诊断
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class FIRC0087 extends QCCatalogue {
+    @Autowired
+    ChiefPresentSimilarityServiceClient chiefPresentSimilarityServiceClient;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        if (firstCourseRecordDoc != null) {
+            DiagLabel differentialDiagLabel = firstCourseRecordDoc.getDifferentialDiagLabel();
+            CaseCharacteristicLabel casecharLabel = firstCourseRecordDoc.getCaseCharacteristicLabel();
+            DiagLabel initDiagLabel = firstCourseRecordDoc.getInitialDiagLabel();
+            Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
+            //若拟诊讨论中记录鉴别诊断,则返回
+            String exToDiscuss = structureMap.get("拟诊讨论");
+            if (StringUtil.isNotBlank(exToDiscuss) && exToDiscuss.contains("鉴别诊断")) {
+                return;
+            }
+            if (differentialDiagLabel != null) {
+                String diffDiagStruct = structureMap.get("鉴别诊断");
+                if (StringUtils.isNotEmpty(diffDiagStruct)) {
+                    return;
+                }
+                /*if (StringUtil.isNotBlank(diffDiagStruct) && (diffDiagStruct.contains("诊断明确") || diffDiagStruct.contains("无需鉴别")
+                        || diffDiagStruct.contains("明确诊断"))) {
+                    return;
+                }*/
+
+                //List<Diag> diags = differentialDiagLabel.getDiags();
+                if (initDiagLabel.getDiags().size() > 0) {
+                    String diag = initDiagLabel.getDiags().get(0).getHospitalDiagName();
+                    String casechar = casecharLabel.getText();
+                    String chief = "";
+                    String present = "";
+                    if (casechar.contains("主诉") && casechar.contains("现病史")) {
+                        chief = casechar.substring(casechar.indexOf("主诉") + 2, casechar.indexOf("现病史"));
+                        present = casechar.substring(casechar.indexOf("现病史") + 3, casechar.indexOf("既往史"));
+                    }
+                    if (StringUtils.isNotEmpty(differentialDiagLabel.getText())) {
+                        if (differentialDiagLabel.getText().contains("诊断明确")
+                                || differentialDiagLabel.getText().contains("无需鉴别")) {
+                            if (chief.contains("术后") || chief.contains("孕") || chief.contains("化疗")
+                                    || chief.contains("肿瘤") || chief.contains("癌") || chief.contains("确诊")
+                                    || chief.contains("外伤") || chief.contains("摔伤")) {
+                                status.set("0");
+                            } else if (present.contains(diag)) {
+                                status.set("0");
+                            } else {
+                                status.set("-1");
+                            }
+                        }
+                    } else if (StringUtils.isEmpty(differentialDiagLabel.getText())) {
+                        status.set("-1");
+                    }
+                /*
+                if(diags == null || diags.size()<1){
+                    status.set("-1");
+                }
+
+                if (StringUtils.isNotEmpty(differentialDiagLabel.getText())
+                        && (differentialDiagLabel.getText().contains("暂缺")
+                            || differentialDiagLabel.getText().contains("无") || differentialDiagLabel.getText().contains("诊断"))) {
+                    status.set("0");
+                }
+                */
+                }
+            }
+        }
+    }
+}

+ 132 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/firstpagerecord/FIRP0178.java

@@ -0,0 +1,132 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.firstpagerecord;
+
+import com.alibaba.fastjson.JSONArray;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.ChiefPresentSimilarityServiceClient;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+import com.lantone.qc.kernel.structure.ai.ModelAI;
+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.entity.Lis;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0178
+ * @Description :出院其他诊断不完全
+ * @Author : 贺聪聪
+ * @Date: 2022-05-12 9:44
+ */
+@Component
+public class FIRP0178 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+    @Autowired
+    ChiefPresentSimilarityServiceClient chiefPresentSimilarityServiceClient;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getLeaveHospitalDoc() != null) {
+            String mainDiagnosis = "";
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            if (dischargeDiag.get(0) != null) {
+                mainDiagnosis = dischargeDiag.get(0).get("诊断名称");
+            }
+
+            /* 病案首页出院小结诊断 除去主诊断*/
+            List<String> firstpageLeaveDiags = getFirstPageDiag(dischargeDiag);
+            if (ListUtil.isEmpty(firstpageLeaveDiags)) {
+                return;
+            }
+
+            //出院小结得出院诊断,模型提取出现问题,需要手动以1.2.3.为界限切开
+            Map<String, String> leavehospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+
+            String leaveStr = leavehospitalStructureMap.get("出院诊断");
+            //出院小结诊断 除去中医出院诊断
+            if (StringUtil.isNotBlank(leaveStr)) {
+                leaveStr = leaveStr.substring(Math.max(0, leaveStr.indexOf("西医诊断")));
+            }
+            List<String> leaveDiagsStr = cut(leaveStr, mainDiagnosis);
+
+            /* 修改为疾病相似度模型 */
+            ModelAI modelAI = new ModelAI();
+            String infoStr = "";
+            //最主要是给医生提醒,看是否有出院诊断漏写
+            for (int i = 1; i < leaveDiagsStr.size(); i++) {
+                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(leaveDiagsStr.get(i), firstpageLeaveDiags, false
+                        , "diagnose", chiefPresentSimilarityServiceClient);
+                if (jsonArray.size() == 2) {
+                    /* 相似度分数 */
+                    double likeRate = jsonArray.getDoubleValue(1);
+                    if (likeRate < 0.9) {
+                        infoStr = CatalogueUtil.concatInfo(infoStr, leaveDiagsStr.get(i));
+                    }
+                } else if (jsonArray.size() == 0) {
+                    infoStr = CatalogueUtil.concatInfo(infoStr, leaveDiagsStr.get(i));
+                }
+            }
+            if (StringUtil.isNotBlank(infoStr)) {
+                status.set("-1");
+                info.set(infoStr);
+            }
+        }
+    }
+
+    //除去首页中的主诊断方法、中医出院诊断、去掉西医字段
+    private List<String> getFirstPageDiag(List<Map<String, String>> dischargeDiag) {
+        List<String> firstpageDiag = new ArrayList<>();
+        for (int i = 0; i < dischargeDiag.size(); i++) {
+            if ("主要诊断".equals(dischargeDiag.get(i).get("诊断类别")) || "主病".equals(dischargeDiag.get(i).get("诊断类别"))
+                    || "主症".equals(dischargeDiag.get(i).get("诊断类别"))) {
+                continue;
+            }
+            String diagnoseName = dischargeDiag.get(i).get(Content.diagnoseName);
+            if (StringUtil.isBlank(diagnoseName) || "-".equals(diagnoseName)) { // 诊断名称为空不算
+                continue;
+            }
+            //删除诊断名称中带有西医
+            diagnoseName = diagnoseName.replace("(西医)", "");
+            if (StringUtil.isNotBlank(diagnoseName)) {
+                firstpageDiag.add(diagnoseName);
+            }
+            // 去重
+            if (!firstpageDiag.contains(diagnoseName)) {
+                firstpageDiag.add(diagnoseName);
+            }
+        }
+        return firstpageDiag;
+    }
+
+    private List<String> cut(String leaveDiag, String mainDiagnosis) {
+        List<String> diags = new ArrayList<>();
+        if (leaveDiag != null) {
+            String[] leaveDiags = leaveDiag.split(",?,?[0-9]\\.");
+            for (String string : leaveDiags) {
+                if (!string.isEmpty()) {
+                    if (string.equals(mainDiagnosis)) {
+                        diags.add(0, string);
+                    } else {
+                        // 去重
+                        if (!diags.contains(string)) {
+                            diags.add(string);
+                        }
+                    }
+                }
+            }
+        }
+        return diags;
+    }
+}

+ 0 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE03143.java

@@ -34,11 +34,6 @@ public class OPE03143 extends QCCatalogue {
         if (operationDocs == null || operationDocs.size() == 0) {
             return;
         }
-        //先判断有无输血记录
-        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
-        if (clinicalBloodDocs == null) {
-            return;
-        }
         for (OperationDoc operationDoc : operationDocs) {
             if (operationDoc == null) {
                 continue;

+ 68 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE03144.java

@@ -0,0 +1,68 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.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.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录无主刀医师签字
+ * @author: kwz
+ * @time: 2020/06/29 11:22
+ */
+@Component
+public class OPE03144 extends QCCatalogue {
+    /**
+     * 手术记录【主刀医师签名/记录医师签名】判断是否为空,任意一处和【手术人员】相同既为符合
+     * @param inputInfo
+     * @param outputInfo
+     */
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo){
+        status.set("0");
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs != null && operationDocs.size()>0){
+            for (OperationDoc operationDoc : operationDocs) {
+                if(operationDoc==null){
+                    continue;
+                }
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if(operationRecordDoc!=null){
+                    Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                    if(structureMap==null){
+                        continue;
+                    }
+                    //获取手术人员
+                    String surgeryName = structureMap.get("手术人员");
+                    //获取【主刀医师、记录医师】
+                    String physiciansName = structureMap.get("主刀医师");
+                    String reviewerName = structureMap.get("记录医师");
+                    if((StringUtil.isNotBlank(physiciansName)||StringUtil.isNotBlank(reviewerName)) && StringUtil.isNotBlank(surgeryName)){
+                        //主刀医师签名 与【手术人员】比较
+                        status.set("-1");
+                        if(StringUtil.isNotBlank(physiciansName)) {
+                            if (surgeryName.equals(physiciansName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        //记录医师签名与【手术人员】比较
+                        if(StringUtil.isNotBlank(reviewerName)) {
+                            if (surgeryName.contains(reviewerName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 66 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0323.java

@@ -0,0 +1,66 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.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.operation.OperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @Description: 手术记录未由主刀或一助书写
+ * @author: Mark
+ * @time: 2020/04/04 11:22
+ */
+@Component
+public class OPE0323 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //医嘱
+        //        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        //        if (ListUtil.isEmpty(doctorAdviceDocs)) {
+        //            return;
+        //        }
+        //        boolean isOperativePatient = CatalogueUtil.isOperativePatients(doctorAdviceDocs);
+        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+//        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs != null && operationDocs.size() > 0) {
+            if (ListUtil.isNotEmpty(operationDocs)) {
+                long count = operationDocs.stream().filter(operationDoc -> {
+                    boolean flag = false;
+                    if (operationDoc.getOperationRecordDoc() != null) {
+                        String surgeon = operationDoc.getOperationRecordDoc().getStructureMap().get("主刀医师");
+                        String assist1 = operationDoc.getOperationRecordDoc().getStructureMap().get("一助");
+                        String assist2 = operationDoc.getOperationRecordDoc().getStructureMap().get("二助");
+                        String assist3 = operationDoc.getOperationRecordDoc().getStructureMap().get("三助");
+                        String assist4 = operationDoc.getOperationRecordDoc().getStructureMap().get("手术人员");
+                        String signature = operationDoc.getOperationRecordDoc().getStructureMap().get("主刀医师签名");
+                        if (StringUtil.isBlank(signature)) {
+                            return flag;
+                        }
+                        if (StringUtil.isNotBlank(surgeon) || StringUtil.isNotBlank(assist1) || StringUtil.isNotBlank(assist2) || StringUtil.isNotBlank(assist3) || StringUtil.isNotBlank(assist4)) {
+                            String operator = surgeon + ", " + assist1 + "," + assist2 + "," + assist3 + "," + assist4;
+                            if (!operator.contains(signature)) {
+                                flag = true;
+                            }
+                        }
+                    }
+                    return flag;
+                }).count();
+                if (count > 0) {
+                    status.set("-1");
+                }
+            }
+        }
+
+//        }
+    }
+
+}

+ 45 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0636.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.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.operation.OperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @Description: 手术医师未填写
+ * @author: 贺聪聪
+ * @time: 2022/5/11 15:00
+ */
+@Component
+public class OPE0636 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs == null || operationDocs.size() == 0){
+            status.set("0");
+            return;
+        }
+        if (ListUtil.isNotEmpty(operationDocs)) {
+            long count = operationDocs.stream().filter(operationDoc -> {
+                boolean flag = false;
+                if (operationDoc.getOperationRecordDoc() != null
+                        && StringUtil.isBlank(operationDoc.getOperationRecordDoc().getStructureMap().get("手术人员"))) {
+                    flag = true;
+                }
+                return flag;
+            }).count();
+            if (count > 0) {
+                status.set("-1");
+            }
+        }
+    }
+
+}

+ 45 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/operationdiscussion/OPE0640.java

@@ -0,0 +1,45 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.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.operation.OperationDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+
+/**
+ * @Description: 麻醉医师未填写
+ * @author: 贺聪聪
+ * @time: 2022/5/11 15:14
+ */
+@Component
+public class OPE0640 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if(operationDocs == null || operationDocs.size() == 0){
+            status.set("0");
+            return;
+        }
+        if (ListUtil.isNotEmpty(operationDocs)) {
+            long count = operationDocs.stream().filter(operationDoc -> {
+                boolean flag = false;
+                if (operationDoc.getOperationRecordDoc() != null
+                        && StringUtil.isBlank(operationDoc.getOperationRecordDoc().getStructureMap().get("麻醉人员"))) {
+                    flag = true;
+                }
+                return flag;
+            }).count();
+            if (count > 0) {
+                status.set("-1");
+            }
+        }
+    }
+
+}

+ 250 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/threelevelward/THR0127.java

@@ -0,0 +1,250 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.threelevelward;
+
+import com.lantone.qc.dbanaly.util.KernelConstants;
+import com.lantone.qc.dbanaly.util.SpecialStorageUtil;
+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.MedicalRecordInfoDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0127
+ * @Description : 每周无2次副主任医师/主任医师查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:52
+ */
+@Component
+public class THR0127 extends QCCatalogue {
+    @Autowired
+    private SpecialStorageUtil specialStorageUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        MedicalRecordInfoDoc medicalRecordInfoDoc = inputInfo.getMedicalRecordInfoDoc();
+        if (medicalRecordInfoDoc != null && medicalRecordInfoDoc.getStructureMap() != null) {
+            //入院日期
+            String admisTime = medicalRecordInfoDoc.getStructureMap().get("behospitalDate");
+            //出院日期
+            String dischargeTime = medicalRecordInfoDoc.getStructureMap().get("leaveHospitalDate");
+            if (CatalogueUtil.isEmpty(admisTime)) {
+                return;
+            }
+            String presentTime = DateUtil.nowString();
+            //如果如果入院未超过7天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(presentTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(presentTime), (long) (7 * 24 * 60))) {
+                    return;
+                }
+            }
+            //如果住院天数小于7天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(dischargeTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (7 * 24 * 60))) {
+                    return;
+                }
+            } else {
+                if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+                    status.set("-1");
+                    return;
+                }
+            }
+
+            if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getThreeLevelWardDocs().size() > 0) {
+                if (CatalogueUtil.isEmpty(admisTime)) {
+                    return;
+                }
+                //开始时间(入院时间)
+                Date beginDate = StringUtil.parseDateTime(admisTime);
+                if (beginDate == null) {
+                    return;
+                }
+
+                ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+                List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+                if (allDoctorWradDocs.size() == 0) {
+                    status.set("0");
+                    return;
+                }
+                Date lastRecordDate = getLastRecordDate(allDoctorWradDocs);
+                if (lastRecordDate == null) {
+                    return;
+                }
+                int hoursPerWeek = 7 * 24 * 60;
+                String roundRecordThisWeek = "";
+                List<String> roundRecordEveryWeek = new ArrayList<>();
+                beginDate = DateUtil.dateZeroClear(beginDate);//从入院记录当天0点开始算
+                int i = 1;
+                String lastWardDateRange = "";
+                List<String> lastWardDateRangeList = new ArrayList<>();
+                //每周的病历记录
+                while (i >= 1) {
+                    roundRecordThisWeek = extractWardRecord(inputInfo, allDoctorWradDocs, beginDate, hoursPerWeek, lastRecordDate);
+                    if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                        break;
+                    }
+                    //如果6天后日期大于出院日期,跳过
+                    if (StringUtil.isBlank(dischargeTime)) {
+                        dischargeTime = presentTime;
+                    }
+                    Date sixDate = DateUtil.addDate(beginDate, 7);
+                    if (StringUtil.parseDateTime(dischargeTime).before(sixDate)) {
+                        break;
+                    }
+                    lastWardDateRange = DateUtil.formatDate(beginDate) + "    ->    " + DateUtil.formatDate(DateUtil.addDay(sixDate, -1));
+                    lastWardDateRangeList.add(lastWardDateRange);
+                    roundRecordEveryWeek.add(roundRecordThisWeek);
+                    beginDate = DateUtil.addDate(beginDate, 7);
+                    i++;
+                }
+                if (roundRecordEveryWeek.size() == 0) {
+                    status.set("0");
+                    return;
+                }
+                List<String> resultInfos = new ArrayList<>();
+                for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
+                    //获取标题中主任的名字
+                    String directorName = roundRecordEveryWeek.get(j);
+                    int directorNameNum = 0;
+                    if (judgeContainsDoctor(directorName)) {//判断标题中是否含有主任医师姓名
+                        directorNameNum++;
+                    }
+                    int directorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.director);
+                    int dept_doctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.dept_doctor);
+                    //三级医师查房算一次主任查房
+                    String key = getKeyByHospitalId();
+                    int threeDoctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), key);
+                    //北仑内分泌科(主任携主任代主治)
+                    int endocrinologyTitleNum = endocrinologyTitleNum(roundRecordEveryWeek.get(j).split(","));
+                    int num = 2;
+                    if ("7".equals(Content.hospital_Id)) {
+                        num = 1;
+                    }
+                    if (directorNum + dept_doctorNum + threeDoctorNum + endocrinologyTitleNum + directorNameNum < num) {
+                        //每周无2次主任医师查房记录/科主任查房记录
+                        status.set("-1");
+                        resultInfos.add(lastWardDateRangeList.get(j));
+                    }
+                }
+                if (resultInfos.size() > 0) {
+                    info.set(StringUtils.join(resultInfos.toArray(), ";"));
+                }
+            }
+        }
+    }
+
+    private String getKeyByHospitalId() {
+        switch (Content.hospital_Id) {
+            case "7":               //厦门
+                return "多学科联合";
+            case "35":               //长沙湘雅
+                return "上级";
+            default:
+                return "三级";
+        }
+    }
+
+    /**
+     * 北仑内分泌科主任主治处理
+     *
+     * @param srcText
+     * @return
+     */
+    private int endocrinologyTitleNum(String[] srcText) {
+        int count = 0;
+        for (String title : srcText) {
+            String regex = ".*主任.*主任.*主治.*";
+            if (title.matches(regex)) {
+                count++;
+            }
+        }
+        return count;
+    }
+
+    private Date getLastRecordDate(List<ThreeLevelWardDoc> allDoctorWradDocs) {
+        ThreeLevelWardDoc threeLevelWardDoc = allDoctorWradDocs.get(allDoctorWradDocs.size() - 1);
+        Map<String, String> lastWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+        String wardDateStr = lastWardDocStructureMap.get("查房日期");
+        if (StringUtil.isNotBlank(wardDateStr)) {
+            return StringUtil.parseDateTime(wardDateStr);
+        }
+        return null;
+    }
+
+    /**
+     * 抽取duration分钟内所有查房标题
+     * 抽取一周内所有查房标题,若一周内记录少于6天,则返回""
+     *
+     * @param threeLevelWardDocs
+     * @param admisDate
+     * @param duration
+     * @return
+     */
+    private static String extractWardRecord(InputInfo inputInfo, List<ThreeLevelWardDoc> threeLevelWardDocs, Date admisDate, int duration, Date maxRecordDate) {
+        String recordTime = "", recordTitle = "", title = "";
+        List<Date> dateList = new ArrayList();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardStructureMap = threeLevelWardDoc.getStructureMap();
+            recordTime = threeLevelWardStructureMap.get("查房日期");
+            title = threeLevelWardStructureMap.get("查房标题");
+            if (StringUtil.isBlank(recordTime) || StringUtil.isBlank(title)) {
+                continue;
+            }
+            Date recordDate = StringUtil.parseDateTime(recordTime);
+            if (recordDate == null) {
+                continue;
+            }
+            /* 替换查房标题中主刀/一助的职称 */
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (title.contains("主刀") || title.contains("术后第")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.replace("主刀", doctorTitle).replace("术后第", doctorTitle);
+            } else if (title.contains("一助")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "一助");
+                title = title.replace("一助", doctorTitle);
+            }
+            if (admisDate.before(recordDate) && !CatalogueUtil.compareTime(admisDate, recordDate, Long.valueOf(duration))) {
+                recordTitle += title + ",";
+                dateList.add(recordDate);
+            }
+        }
+        if (dateList.size() > 0) {
+            //dateList.sort(Date::compareTo);
+            if (!maxRecordDate.equals(dateList.get(dateList.size() - 1)) || CatalogueUtil.compareTime(admisDate, dateList.get(dateList.size() - 1), Long.valueOf(6 * 24 * 60))) {
+                return recordTitle;
+            }
+        }
+        return "";
+    }
+
+    //判断是否含有主任医师姓名
+    private boolean judgeContainsDoctor(String string) {
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (hospitalDoctorMap == null) {
+            return false;
+        }
+        for (String keyStr : hospitalDoctorMap.keySet()) {
+            if (string.contains(keyStr)) {
+                Object professor = hospitalDoctorMap.get(keyStr).get("professor");
+                if (professor != null) {
+                    if (professor.toString().contains("主任")) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+}

+ 31 - 30
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03107.java

@@ -1,6 +1,5 @@
 package com.lantone.qc.kernel.catalogue.operationdiscussion;
 
-import com.alibaba.fastjson.JSONArray;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
@@ -10,9 +9,8 @@ import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
 import com.lantone.qc.pub.model.doc.operation.*;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
-import org.apache.commons.collections.MapUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
+
 import java.text.ParseException;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -26,45 +24,47 @@ import java.util.regex.Pattern;
 @Component
 public class OPE03107 extends QCCatalogue {
 
+    /**
+     * 首先病历中所有【手术记录】份数相加,无手术记录单则通过
+     * 然后查找手术次数,以下规则以数量多的一条为准:
+     * 1.【临时医嘱内(医嘱处方类型)为“手术”且医嘱状态不为“作废”、“删除”、“取消”任一】将所有出现的“手术”次数相加,再排除医嘱内相同时间行手术次数(如拟明日10点行*术)(台州市立)
+     * 2.或【术后*记录】次数相加
+     * 3.或【手术知情同意书】次数相加
+     * 最后判断查找到的手术次数跟手术记录的份数跟是否一致,手术记录仅有一份时,手术次数少于手术记录不报,手术记录有多份时,手术次数和手术记录不一致则报出
+     */
     @Override
     protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
         status.set("0");
-        int opeCount=0;
-        int opePreCount=0;
-        int opeThrCount=0;
-        int opeRecordCount=0;
-        int opeDisCount=0;
-        int opeFormCount=0;
+        int opeCount = 0;
+        int opeThrCount = 0;
+        int opeRecordCount = 0;
+        int opeDisCount = 0;
+        int opeFormCount = 0;
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         List<String> listTime = new ArrayList<>();
         //手术记录次数
-        if(ListUtil.isNotEmpty(operationDocs)){
+        if (ListUtil.isNotEmpty(operationDocs)) {
             for (OperationDoc operationDoc : operationDocs) {
                 OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
                 //手术记录次数
-                if(operationRecordDoc!=null){
+                if (operationRecordDoc != null) {
                     opeRecordCount++;
-                }else {
+                } else {
                     return;
                 }
-                //术前讨论,小结次数
-                PreoperativeDiscussionDoc preoperativeDiscussionDoc = operationDoc.getPreoperativeDiscussionDoc();
-                if(preoperativeDiscussionDoc!=null){
-                    opePreCount++;
-                }
                 //术后首程次数
                 OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
-                if(operationDiscussionDoc!=null){
+                if (operationDiscussionDoc != null) {
                     opeDisCount++;
                 }
                 //知情同意书次数
                 OperationInformedConsentDoc operationInformedConsentDoc = operationDoc.getOperationInformedConsentDoc();
-                if(operationInformedConsentDoc!=null){
+                if (operationInformedConsentDoc != null) {
                     opeFormCount++;
                 }
             }
-        }else {
+        } else {
             return;
         }
         //医嘱判断手术
@@ -99,15 +99,15 @@ public class OPE03107 extends QCCatalogue {
         }
         //查房
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
-        if(ListUtil.isNotEmpty(threeLevelWardDocs)){
+        if (ListUtil.isNotEmpty(threeLevelWardDocs)) {
             List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
-            if(allDoctorWradDocs!=null){
+            if (allDoctorWradDocs != null) {
                 for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
                     Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
                     String thrName = structureMap.get("查房标题");
                     if (StringUtil.isNotEmpty(thrName)) {
                         String substring = thrName.substring(0, 2);
-                        if (substring.equals("术前")){
+                        if (substring.equals("术前")) {
                             opeThrCount++;
                         }
                     }
@@ -116,14 +116,15 @@ public class OPE03107 extends QCCatalogue {
         }
 
         //获取手术最多的次数
-        opeCount=listTime.size();
-        int max = opeCount>opePreCount?opeCount: opePreCount;
-        max=max>opeThrCount?max:opeThrCount;
-        max=max>opeDisCount?max:opeDisCount;
-        max=max>opeFormCount?max:opeFormCount;
-        if(max==opeRecordCount){
+        opeCount = listTime.size();
+        int max = opeCount > opeThrCount ? opeCount : opeThrCount;
+        max = max > opeDisCount ? max : opeDisCount;
+        max = max > opeFormCount ? max : opeFormCount;
+
+        if (opeRecordCount == 1 && max < opeRecordCount) {
             return;
-        }else{
+        }
+        if (max != opeRecordCount) {
             status.set("-1");
             return;
         }

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

@@ -47,6 +47,8 @@ public class PRE0330 extends QCCatalogue {
         {
             case "2":
                 return "拟施手术方式名称及可能的变更与禁忌症";
+            case "11":
+                return "拟施手术名称及方式";
             default:
                 return "拟施手术方式、名称及可能的变更与禁忌症";
         }

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/hangzhoufubao/HangzhoufubaoDocTrans.java

@@ -30,6 +30,7 @@ public class HangzhoufubaoDocTrans extends com.lantone.qc.trans.DocTrans {
                 if (i.getTitle().equals("会诊")) {
                     ConsultationDocTrans consultationDocTrans = new ConsultationDocTrans();
                     inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
+
                 }
                 if (i.getTitle().equals("手术")) {
                     OperationDocTrans operationDocTrans = new OperationDocTrans();

+ 5 - 5
trans/src/main/java/com/lantone/qc/trans/ningbozhenhai/util/OperationRecordHtmlAnalysis.java

@@ -31,7 +31,7 @@ public class OperationRecordHtmlAnalysis implements HtmlAnalysis {
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
             analysisGeneral(bigDivElement, map);
             HtmlAnalysisUtil.mapValueRemoveStartColon(map);
-            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            //CommonAnalysisUtil.makeEmpty(map, "主刀医师签名");
             HtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -46,7 +46,7 @@ public class OperationRecordHtmlAnalysis implements HtmlAnalysis {
         List<String> titles = Lists.newArrayList(
                 "姓名", "病区", "科室", "床号", "床位", "住院号", "手术开始时间", "手术结束时间", "术前诊断", "术 前 诊  断",
                 "手术名称", "手 术 名  称", "术中诊断", "术(中)后诊断", "手术人员", "手术主刀医师", "手 术 主 刀 医 师", "一助", "二助", "麻醉方式",
-                "麻 醉 方  式", "麻醉人员", "麻 醉 医  师", "手术风险评估(可选)", "NNIS分级", "手术类别(可选)", "手术标本", "冰冻切片结果",
+                "麻 醉 方  式", "麻醉人员", "麻醉医师", "麻 醉 医  师", "手术风险评估(可选)", "NNIS分级", "手术类别(可选)", "手术标本", "冰冻切片结果",
                 "术中并发症", "术中失血量", "手术经过", "手术经过及处理(包括患者的体位、切口处理、病灶所见及手术步骤等)", "记录者签字", "主刀签字", "主刀医师签名",
                 "记录日期", "日期", "时间"
         );
@@ -63,11 +63,11 @@ public class OperationRecordHtmlAnalysis implements HtmlAnalysis {
             StringBuffer sb = new StringBuffer();
             sb.append(map.get("记录日期"));
             if (map.containsKey("时间") && StringUtil.isNotBlank(map.get("时间"))) {
-                sb.append(map.get("时间"));
+                sb.append(" " + map.get("时间"));
             }
             map.put("日期", sb.toString());
         }
-        /*if (map.containsKey("手术主刀医师") && StringUtil.isNotBlank(map.get("手术主刀医师"))) {
+        if (map.containsKey("手术主刀医师") && StringUtil.isNotBlank(map.get("手术主刀医师"))) {
             StringBuffer sb1 = new StringBuffer();
             sb1.append("手术主刀医师:" + map.get("手术主刀医师"));
             if (map.containsKey("一助") && StringUtil.isNotBlank(map.get("一助"))) {
@@ -77,7 +77,7 @@ public class OperationRecordHtmlAnalysis implements HtmlAnalysis {
                 sb1.append(" 二助:" + map.get("二助"));
             }
             map.put("手术人员", sb1.toString());
-        }*/
+        }
     }
 
 }

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/ningbozhongyi/NingBoZhongYiOperationDocTrans.java

@@ -260,6 +260,7 @@ public class NingBoZhongYiOperationDocTrans extends ModelDocTrans {
                 structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts);
                 structureMap.put("记录编号", contentMap.get("recId").toString());
                 structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                structureMap.put("标题",contentMap.get("recTitle")==null? null : contentMap.get("recTitle").toString());
             }
         }
         List<String> titles = Lists.newArrayList("讨论时间", "手术指征", "注意事项", "术前诊断", "医生签名", "风险及防范措施", "可替代方案", "术前准备", "参加人员");

+ 9 - 5
trans/src/main/java/com/lantone/qc/trans/wenfuyi/BeHospitalizedDocTrans.java

@@ -11,6 +11,7 @@ import com.lantone.qc.trans.wenfuyi.util.BeHospitalizedHtmlAnalysis;
 import com.lantone.qc.trans.wenfuyi.util.WenFuYiHtmlAnalysis;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.List;
 import java.util.Map;
@@ -50,7 +51,12 @@ public class BeHospitalizedDocTrans extends ModelDocTrans {
                 String recTitle = contentMap.get("recTitle").toString();
                 String recTypeId = contentMap.get("recTypeId").toString();
                 WenFuYiHtmlAnalysis wenFuYiHtmlAnalysis = new BeHospitalizedHtmlAnalysis();
-                Map<String, String> sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                Map<String, String> sourceMap;
+                if (StringUtils.isNotBlank(content)) {
+                    sourceMap = wenFuYiHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                } else{
+                    sourceMap = wenFuYiHtmlAnalysis.analysis(contentMap.get("htmlText").toString(), recTitle, recTypeId);
+                }
                 if (MapUtils.isNotEmpty(sourceMap)) {
                     structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
                     structureMap.put("记录编号", contentMap.get("recId").toString());
@@ -68,10 +74,8 @@ public class BeHospitalizedDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "单位=工作单位",
-            "过去史=既往史",
-            "户口地址=籍贯"
+
 
     );
 
-}
+}

+ 2 - 3
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ClinicBloodEffectDocTrans.java

@@ -66,8 +66,7 @@ public class ClinicBloodEffectDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "病历标题=标题",
-            "病情记录=病历内容"
+
     );
 
-}
+}

+ 3 - 2
trans/src/main/java/com/lantone/qc/trans/wenfuyi/ConsultationDocTrans.java

@@ -116,7 +116,8 @@ public class ConsultationDocTrans extends ModelDocTrans {
     }
 
     private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
-            "执行情况=会诊情况"
+            "执行情况=会诊情况",
+            "到达时间=会诊时间"
     );
 
 
@@ -271,4 +272,4 @@ public class ConsultationDocTrans extends ModelDocTrans {
             "++++会诊医师=会诊医师"
     );
 
-}
+}

+ 3 - 2
trans/src/main/java/com/lantone/qc/trans/wenfuyi/DifficultCaseDiscussDocTrans.java

@@ -67,7 +67,8 @@ public class DifficultCaseDiscussDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "主持人(科主任或科主任授权的科室副主任)签名=主持人签名"
+            "主持人(科主任或科主任授权的科室副主任)签名=主持人签名",
+            "主持人(科主任)签名=主持人签名"
     );
 
-}
+}

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/wenfuyi/FirstCourseRecordDocTrans.java

@@ -66,7 +66,7 @@ public class FirstCourseRecordDocTrans extends ModelDocTrans {
 
     private Map<String, String> removeSerialNumber(Map<String, String> sourceMap) {
         Map<String, String> structureMap = Maps.newLinkedHashMap();
-        sourceMap.forEach((key, value) -> structureMap.put(key.replaceAll("[一二三四五六()().123456]", ""), value));
+        sourceMap.forEach((key, value) -> structureMap.put(key.replaceAll("[一二三四五六()().123456]", ""), value));
         return structureMap;
     }
 
@@ -74,4 +74,4 @@ public class FirstCourseRecordDocTrans extends ModelDocTrans {
             "拟诊讨论诊断依据及鉴别诊断=诊断依据及鉴别诊断"
     );
 
-}
+}

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

@@ -187,8 +187,6 @@ public class OperationDocTrans extends ModelDocTrans {
     }
 
     private List<String> operationRecord_keyContrasts = Lists.newArrayList(
-            "术后诊断=术中后诊断",
-            "术中诊断=术中后诊断",
             "手术开始时间=开始时间",
             "手术结束时间=结束时间",
             "探查(术中所见)=探查术中所见",

+ 20 - 9
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/BeHospitalizedHtmlAnalysis.java

@@ -55,23 +55,34 @@ public class BeHospitalizedHtmlAnalysis implements WenFuYiHtmlAnalysis {
                 .replace("(外院检查注明该医院名称、日期!)", "");
 
         List<String> titles = Lists.newArrayList("姓 名", "邮 编", "性 别", "单位", "年 龄", "身份证号码", "婚 姻", "户口地址", "民 族", "联系电话", "出生地",
-                "入院日期", "职 业", "病史陈述者", "主诉", "现病史", "过去史", "既往史", "系统回顾", "个人史", "婚育史", "家族史", "一般情况", "特殊检查", "实验室检查", "初步诊断", "修正诊断");
+                "入院日期", "职 业", "病史陈述者", "主诉", "现病史", "过去史", "既往史", "系统回顾", "个人史", "婚育史", "家族史", "专项评估", "一般情况", "特殊检查", "实验室检查", "初步诊断", "修正诊断");
 
         titles = CommonAnalysisUtil.sortTitles(titles, htmlContent);
         CommonAnalysisUtil.cutByTitles(htmlContent, titles, 0, map);
-        if (map.get("初步诊断").contains("医师签名")) {
-            map.put("初步诊断医师签名", map.get("初步诊断").substring(map.get("初步诊断").indexOf("医师签名") + 5));
-            map.put("初步诊断", map.get("初步诊断").substring(0, map.get("初步诊断").indexOf("医师签名")));
-            if (map.get("初步诊断医师签名").contains("日期")) {
-                map.put("初步诊断日期", map.get("初步诊断医师签名").substring(map.get("初步诊断医师签名").indexOf("日期") + 3));
-                map.put("初步诊断医师签名", map.get("初步诊断医师签名").substring(0, map.get("初步诊断医师签名").indexOf("日期")).replace("医师签名: ", ""));
+        if (map.get("初步诊断").contains("日期")) {
+            map.put("初步诊断医师签名日期", CommonAnalysisUtil.extractDate(map.get("初步诊断")));
+
+            if (map.get("初步诊断").contains("上级医师签名")) {
+                map.put("上级医师签名", map.get("初步诊断").substring(map.get("初步诊断").indexOf("医师签名") + 5));
+                map.put("初步诊断", map.get("初步诊断").substring(0, map.get("初步诊断").indexOf("上级医师签名")));
+            }
+            if (map.get("上级医师签名").contains("医师签名")) {
+                map.put("初步诊断医师签名", map.get("上级医师签名").substring(map.get("上级医师签名").indexOf("医师签名") + 5)
+                        .replace("日期:", "").replace(map.get("初步诊断医师签名日期"), ""));
+                map.put("上级医师签名", map.get("上级医师签名")
+                        .replace(map.get("初步诊断医师签名"), "")
+                        .replace("医师签名:", "")
+                        .replace(map.get("初步诊断医师签名日期"), "")
+                        .replace("日期:", ""));
             }
+
+
         }
         if (map.get("修正诊断").contains("医师签名")) {
             map.put("修正诊断医师签名", map.get("修正诊断").substring(map.get("修正诊断").indexOf("医师签名") + 5));
             map.put("修正诊断", map.get("修正诊断").substring(0, map.get("修正诊断").indexOf("医师签名")));
             if (map.get("修正诊断医师签名").contains("日期")) {
-                map.put("修正诊断日期", map.get("修正诊断医师签名").substring(map.get("修正诊断医师签名").indexOf("日期") + 3));
+                map.put("修正诊断医师签名日期", CommonAnalysisUtil.extractDate(map.get("修正诊断医师签名")));
                 map.put("修正诊断医师签名", map.get("修正诊断医师签名").substring(0, map.get("修正诊断医师签名").indexOf("日期")));
             }
         }
@@ -135,4 +146,4 @@ public class BeHospitalizedHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
     }
 
-}
+}

+ 2 - 11
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicBloodEffectHtmlAnalysis.java

@@ -29,21 +29,12 @@ public class ClinicBloodEffectHtmlAnalysis implements WenFuYiHtmlAnalysis {
             String html = args[0];
             String recTitle = args[1];
             String recTypeId = args[2];
-            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0);
+            Element bigDivElement = Jsoup.parse(html).selectFirst("body");
             analysisGeneral(recTitle,bigDivElement, map);
             if (map.containsKey("病情记录")) {
                 String content = map.get("病情记录");
                 CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
             }
-        /*titles.remove(5);
-        titles.forEach(i -> {
-                    if (map.get(i).length() > 2) {
-                        map.put(i, map.get(i).substring(0, map.get(i).length() - 2));
-                    }
-                }
-        );
-
-         */
             WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -68,4 +59,4 @@ public class ClinicBloodEffectHtmlAnalysis implements WenFuYiHtmlAnalysis {
         CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);
     }
 
-}
+}

+ 7 - 3
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ClinicalBloodHtmlAnalysis.java

@@ -39,13 +39,17 @@ public class ClinicalBloodHtmlAnalysis implements WenFuYiHtmlAnalysis {
 
     private void analysisGeneral(String recTitle, String content, Map<String, String> map) {
         CommonAnalysisUtil.extractWardInfo(recTitle, content, map);
-        String bqjlText = "病情记录:" + map.get("病情记录");
+        String bqjlText = "病情记录:" + map.get("病情记录")
+                .replace("输血原因应包括患者病情及实验室检测结果", " ")
+                .replace("注:请与护理记录时间保持一致", " ");
+
         map.remove("病情记录");
         List<String> titles = Lists.newArrayList(
-                "病情记录", "输血制品原因", "输血制品日期", "输血制品种类及量", "输血制品反应", "输血制品效果评价"
+                "病情记录", "输血原因", "输血制品原因", "输血开始时间", "输血结束时间", "输血方式", "输注种类及量",
+                "输血制品日期", "输血制品种类及量", "输血制品反应", "输血制品效果评价", "输血过程观察及输血反应处理"
         );
         titles = CommonAnalysisUtil.sortTitles(titles, bqjlText);
         CommonAnalysisUtil.cutByTitles(bqjlText, titles, 0, map);
     }
 
-}
+}

+ 4 - 1
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/ConsultationRecordHtmlAnalysis.java

@@ -45,6 +45,9 @@ public class ConsultationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
         String text = WenFuYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true).replace("(记录会诊意见执行情况)", "");
         CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
+/*        List<String> titles = Lists.newArrayList(
+                "会诊记录", "会诊专科", "邀请医师", "接受医师", "会诊医师", "联系电话", "到达时间", "会诊时间", "到场时间", "其他参加人员", "会诊建议", "执行情况"
+        );*/
         List<String> titles = Lists.newArrayList(
                 "会诊记录"
         );
@@ -52,4 +55,4 @@ public class ConsultationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
         CommonAnalysisUtil.cutByTitles(text, titles, 0, map);
     }
 
-}
+}

+ 4 - 3
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/DifficultCaseDiscussHtmlAnalysis.java

@@ -26,14 +26,15 @@ public class DifficultCaseDiscussHtmlAnalysis implements WenFuYiHtmlAnalysis {
         Map<String, String> structureMap = Maps.newLinkedHashMap();
         try {
             List<String> titles = Lists.newArrayList("病例类别", "文书类别", "讨论时间", "讨论地点", "主持人", "病例报告人",
-                    "参加人员", "临床诊断", "汇报病史", "具体讨论意见", "主持人小结意见", "主持人(科主任或科主任授权的科室副主任)签名", "记录医师", "记录日期");
+                    "参加人员", "参加人员姓名及专业技术职务", "临床诊断", "患者病情", "汇报病史", "具体讨论意见", "主持人小结意见", "主持人(科主任)签名",
+                    "主持人(科主任或科主任授权的科室副主任)签名", "记录医师", "记录日期");
             String html = args[0];
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
             String htmlContent = doc.selectFirst("body").children().text();
             if (StringUtil.isNotBlank(htmlContent)) {
-                CommonAnalysisUtil.extractWardInfo(recTitle,htmlContent, structureMap);
+                CommonAnalysisUtil.extractWardInfo(recTitle, htmlContent, structureMap);
                 CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
             }
             CommonAnalysisUtil.extractDateByTitle(structureMap, "告知时间");
@@ -65,4 +66,4 @@ public class DifficultCaseDiscussHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
         return value;
     }
-}
+}

+ 9 - 3
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/FirstCourseRecordHtmlAnalysis.java

@@ -25,7 +25,8 @@ public class FirstCourseRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
     public Map<String, String> analysis(String... args) {
         Map<String, String> structureMap = Maps.newLinkedHashMap();
         try {
-            List<String> titles = Lists.newArrayList("一.病例特点", "二.拟诊讨论(诊断依据及鉴别诊断)", "三.初步诊断", "四.诊疗计划");
+            List<String> titles = Lists.newArrayList("一.病例特点", "二.中医辨病辨证依据及鉴别诊断", "二.拟诊讨论(诊断依据及鉴别诊断)",
+                    "三、西医诊断依据及鉴别诊断", "三.初步诊断", "四.初步诊断", "四.诊疗计划", "五.治则治法", "六.诊疗计划");
             String html = args[0];
             String recTitle = args[1];
             Document doc = Jsoup.parse(html);
@@ -35,7 +36,12 @@ public class FirstCourseRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
                 titles = CommonAnalysisUtil.sortTitlesNoColon(titles, htmlContent);
                 CommonAnalysisUtil.cutByTitlesNoColon(htmlContent, titles, 0, structureMap);
             }
-
+            if (structureMap.containsKey("二.中医辨病辨证依据及鉴别诊断")) {
+                structureMap.put("拟诊讨论(诊断依据及鉴别诊断)", structureMap.get("拟诊讨论(诊断依据及鉴别诊断)") + "," + "中医辨病辨证依据及鉴别诊断:" + structureMap.get("二.中医辨病辨证依据及鉴别诊断"));
+            }
+            if (structureMap.containsKey("三、西医诊断依据及鉴别诊断")) {
+                structureMap.put("拟诊讨论(诊断依据及鉴别诊断)", structureMap.get("拟诊讨论(诊断依据及鉴别诊断)") + "," + "西医诊断依据及鉴别诊断:" + structureMap.get("三、西医诊断依据及鉴别诊断"));
+            }
             WenFuYiHtmlAnalysisUtil.insertModuleId(modeId, recTitle, structureMap);
             //        CommonAnalysisUtil.extractDateByTitle(structureMap, "时间");
             //        structureMap.forEach((k,v)-> System.out.println(k + "------" + v));
@@ -47,4 +53,4 @@ public class FirstCourseRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
         return structureMap;
     }
 
-}
+}

+ 8 - 2
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/LeaveHospitalHtmlAnalysis.java

@@ -26,12 +26,18 @@ public class LeaveHospitalHtmlAnalysis implements WenFuYiHtmlAnalysis {
         Map<String, String> structureMap = Maps.newLinkedHashMap();
         try {
             List<String> titles = Lists.newArrayList(
-                    "入院诊断(Admitting diagnosis)", "出院诊断(Discharge diagnosis)", "入院情况(Admission status)", "诊疗经过(Hospital course)", "出院情况(Discharge status)", "疗效评定(Curative effect)",
+                    "入院诊断(Admitting diagnosis)", "出院诊断(Discharge diagnosis)", "出院诊断依据(Diagnostic Evidence)", "入院情况(Admission status)", "诊疗经过(Hospital course)", "出院情况(Discharge status)", "疗效评定(Curative effect)",
                     "出院医嘱(Discharge instructions)", "患者/法定监护人/委托代理人签名", "签名时间");
             String html = args[0];
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
+            if (doc.selectFirst("body").children().last().getElementsByTag("img") != null) {
+                structureMap.put("上级医师签名", "-");
+                structureMap.put("医师签名", "-");
+                structureMap.put("记录时间", "-");
+
+            }
             String htmlContent = WenFuYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body"), true);
             if (StringUtil.isNotBlank(htmlContent)) {
                 htmlContent = htmlContent.replace("医务人员已告知出院录中主要内容。", "")
@@ -49,4 +55,4 @@ public class LeaveHospitalHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
         return structureMap;
     }
-}
+}

+ 7 - 5
trans/src/main/java/com/lantone/qc/trans/wenfuyi/util/OperationRecordHtmlAnalysis.java

@@ -8,8 +8,10 @@ import lombok.extern.slf4j.Slf4j;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Element;
 
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @Description:
@@ -54,10 +56,10 @@ public class OperationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
 
         List<String> titles = Lists.newArrayList(
-                "手术开始时间", "手术结束时间", "手术日期", "术前诊断", "术中诊断", "手术名称", "主刀医师", "一助", "二助", "麻醉方式", "麻醉者", "手术经过", "体位及手术径路", "探查(术中所见)",
-                "操作步骤", "手术经过(手术小结)", "主刀签名", "记录者", "记录时间", "记录日期", "术后诊断", "手术者", "助者", "麻醉", "手术经过", "术者/操作者签名",
-                "破膜", "破膜方式", "娩出胎位", "第一产程", "宫缩开始", "第二产程", "宫口开全", "第三产程", "胎儿娩出", "胎盘娩出", "总产程", "胎盘其他", "脐带", "清后羊水性状", "羊水数量", "会阴", "会阴裂伤", "产时用药", "麻醉方式",
-                "产后出血", "出血原因", "产后其他", "新生儿", "胎数", "分娩概况", "手术指征", "手术方式", "诊断", "阴道分娩纱布清点", "送休养室时间", "接生者", "记录者", "记录时间", "术中特殊情况");
+                "手术开始时间", "手术结束时间", "手术日期", "术前诊断", "术中诊断", "手术名称", "手术方式", "主刀医师", "一助", "二助", "麻醉方式", "麻醉者", "手术经过", "体位及手术径路", "探查(术中所见)",
+                "操作步骤", "手术经过(手术小结)", "主刀签名", "记录者", "记录时间", "记录日期", "术后诊断", "手术者", "助者", "麻醉", "术者/操作者签名",
+                "破膜", "破膜方式", "娩出胎位", "第一产程", "宫缩开始", "第二产程", "宫口开全", "第三产程", "胎儿娩出", "胎盘娩出", "总产程", "胎盘其他", "脐带", "清后羊水性状", "羊水数量", "会阴", "会阴裂伤", "产时用药",
+                "产后出血", "出血原因", "产后其他", "新生儿", "胎数", "分娩概况", "手术指征", "阴道分娩纱布清点", "送休养室时间", "接生者",  "术中特殊情况");
         titles = CommonAnalysisUtil.sortTitles(titles, content);
         CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
         if (StringUtil.isNotBlank(map.get("送休养室时间"))) {
@@ -80,4 +82,4 @@ public class OperationRecordHtmlAnalysis implements WenFuYiHtmlAnalysis {
         }
     }
 
-}
+}

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunBeHospitalizedDocTrans.java

@@ -74,7 +74,7 @@ public class BeiLunBeHospitalizedDocTrans extends ModelDocTrans {
             "体 格 检 查 表 ( 一 )=体格检查",
             "补充及专科检查=专科检查",
             "辅 助 检 查=辅助检查",
-            "入 院 诊 断=入院诊断",
+            "入 院 诊 断=初步诊断","入院诊断=初步诊断",
             "初步诊断=入院诊断",
             "住址=单位或住址",
             "住院号=住院号码"

+ 2 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstCourseRecordDocTrans.java

@@ -74,7 +74,8 @@ public class BeiLunFirstCourseRecordDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "诊疗方案=诊疗计划",
+            "诊疗方案=诊疗计划","病历特点=病例特点",
+            "西医诊断依据=诊断依据","西医鉴别诊断=鉴别诊断",
             "医师签名=记录医生"
     );
 

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

@@ -49,16 +49,16 @@ public class BeiLunBeHospitalizedHtmlAnalysis implements BeiLunHtmlAnalysis {
         List<String> titles = Lists.newArrayList("家长姓名","病区","床号","住院号码","病案号","住院号","入 院 记 录","住 院 大 病 历",
                 "姓 名","职业", "职 业", "性 别", "入院日期","年 龄", "记录日期", "婚 姻","病史陈述者", "出生地","可靠程度",
                 "民 族","身份证号码","发病节气","病案号","单位或住址","主 诉","现病史","既往史","个人史","婚育史","家族史",
-                "专项 评估","专项评估",
-                "体 格 检 查","体 格 检 查 表 ( 一 )","补充及专科检查","辅 助 检 查","辅助检查", "入 院 诊 断","初步诊断",
+                "入 院 诊 断","专项 评估","专项评估",
+                "体 格 检 查","体 格 检 查 表 ( 一 )","补充及专科检查","辅 助 检 查","辅助检查", "初步诊断",
                 "书写医生","医师签名","书写医师","修正诊断","家长电话","出生年月","住 址"
         );
         String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
         if (StringUtil.isNotBlank(htmlContent)) {
-            //有冒号版本
-            XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
             //无冒号版本
             XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+            //有冒号版本
+            XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
         }
         //书写医生中包含书写时间
         if(map.containsKey("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医生"))!=null){

+ 7 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java

@@ -29,13 +29,19 @@ public class BeiLunFirstCourseRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
-            List<String> titles = Lists.newArrayList("病例特点","拟诊讨论","初步诊断","诊疗方案",
+            List<String> titles = Lists.newArrayList("病例特点","病历特点","中医辨病辩证依据及鉴别诊断",
+                    "西医诊断依据及鉴别诊断","西医诊断依据","西医鉴别诊断","拟诊讨论","初步诊断","诊疗方案",
                     "医师签名","诊疗计划"
             );
             String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
             if (StringUtil.isNotBlank(htmlContent)) {
                 //无冒号版本
                 XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,structureMap);
+                if(htmlContent.contains("病历特点")){
+                    structureMap.put("病历内容",htmlContent.substring(0,htmlContent.indexOf("病历特点")));
+                }else if(htmlContent.contains("病例特点")){
+                    structureMap.put("病历内容",htmlContent.substring(0,htmlContent.indexOf("出院记录内容缺诊疗经过")));
+                }
                 if(XszyyCommonAnalysisUtil.extractDate(htmlContent)!=null){
                     structureMap.put("病历日期",XszyyCommonAnalysisUtil.extractDate(htmlContent));
                 }