Pārlūkot izejas kodu

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

chengyao 3 gadi atpakaļ
vecāks
revīzija
5a9e0ab207
74 mainītis faili ar 4663 papildinājumiem un 595 dzēšanām
  1. 7 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0163.java
  2. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0166.java
  3. 31 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0184.java
  4. 11 12
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0193.java
  5. 1 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0196.java
  6. 6 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0255.java
  7. 10 9
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03038.java
  8. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03200.java
  9. 40 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03201.java
  10. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03202.java
  11. 37 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03203.java
  12. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03204.java
  13. 34 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03205.java
  14. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03206.java
  15. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03207.java
  16. 40 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03208.java
  17. 40 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03209.java
  18. 39 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03210.java
  19. 51 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03211.java
  20. 40 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03212.java
  21. 80 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03213.java
  22. 55 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0571.java
  23. 111 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR0144.java
  24. 43 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0400.java
  25. 5 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/firstpagerecord/FIRP0163.java
  26. 66 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/operationdiscussion/OPE0326.java
  27. 47 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0123.java
  28. 203 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0127.java
  29. 229 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0128.java
  30. 91 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0140.java
  31. 508 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR02985.java
  32. 157 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03014.java
  33. 157 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03016.java
  34. 57 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03020.java
  35. 67 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03021.java
  36. 342 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03076.java
  37. 598 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03077.java
  38. 8 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03090.java
  39. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0439.java
  40. 81 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/firstpagerecord/FIRP0250.java
  41. 3 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR0125.java
  42. 4 6
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR0126.java
  43. 508 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR02985.java
  44. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR03090.java
  45. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0369.java
  46. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0328.java
  47. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0335.java
  48. 79 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03135.java
  49. 398 395
      public/src/main/java/com/lantone/qc/pub/Content.java
  50. 4 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOperationDocTrans.java
  51. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NinghaifuyaoDocTrans.java
  52. 5 5
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicBloodEffectHtmlAnalysis.java
  53. 5 5
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicalBloodHtmlAnalysis.java
  54. 5 5
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationRecordHtmlAnalysis.java
  55. 4 4
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java
  56. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoHtmlAnalysis.java
  57. 121 65
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoOperationRecordHtmlAnalysis.java
  58. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoRescueHtmlAnalysis.java
  59. 2 11
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiOperationDocTrans.java
  60. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiStagesSummaryDocTrans.java
  61. 27 35
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiBeHospitalizedHtmlAnalysis.java
  62. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiClinicBloodEffectHtmlAnalysis.java
  63. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiClinicalBloodHtmlAnalysis.java
  64. 2 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiConsultationHtmlAnalysis.java
  65. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiConsultationRecordHtmlAnalysis.java
  66. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCrisisValueReportHtmlAnalysis.java
  67. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCriticallyIllNoticeHtmlAnalysis.java
  68. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDeathCaseDiscussHtmlAnalysis.java
  69. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDeathRecordHtmlAnalysis.java
  70. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDifficultCaseDiscussHtmlAnalysis.java
  71. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDutyShiftSystemHtmlAnalysis.java
  72. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiHtmlAnalysis.java
  73. 1 1
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiRescueHtmlAnalysis.java
  74. 2 2
      trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiTransferOutHtmlAnalysis.java

+ 7 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0163.java

@@ -5,6 +5,7 @@ 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.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -18,12 +19,17 @@ import java.util.Map;
 @Component
 public class FIRP0163 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if (inputInfo.getFirstPageRecordDoc() == null){
+        if (inputInfo.getFirstPageRecordDoc() == null) {
             status.set("0");
             return;
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String nationality = firstpageStructureMap.get(Content.nationality);
+            if (StringUtil.isNotBlank(nationality) && !"中国".equals(nationality)) {
+                status.set("0");
+                return;
+            }
             String idNumber = firstpageStructureMap.get(Content.idNumber);
             if (!CatalogueUtil.isEmpty(idNumber)) {
                 status.set("0");

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0166.java

@@ -31,6 +31,9 @@ public class FIRP0166 extends QCCatalogue {
             }
             firstAdmissionMarry = firstAdmissionMarry.replace("离异","离婚");
             admissionMarry = admissionMarry.replace("离异","离婚");
+            if (firstAdmissionMarry.equals("丧偶") && admissionMarry.contains("已故")) {
+                return;
+            }
             if (!CatalogueUtil.compareToken(firstAdmissionMarry, admissionMarry)) {
                 status.set("-1");
             }

+ 31 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0184.java

@@ -5,8 +5,13 @@ 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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.entity.AllergyMedicine;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -18,16 +23,35 @@ import java.util.Map;
 @Component
 public class FIRP0184 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if (inputInfo.getFirstPageRecordDoc() == null){
-            status.set("0");
+        status.set("0");
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (inputInfo.getFirstPageRecordDoc() == null || beHospitalizedDoc == null) {
             return;
         }
-        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
-            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+        Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+        PastLabel pastLabel = beHospitalizedDoc.getPastLabel();
+        if (pastLabel == null) {
+            return;
+        }
+        List<AllergyMedicine> allergyMedicines = pastLabel.getAllergyMedicines();
+        if (allergyMedicines == null) {
+            return;
+        }
+
+        long count = allergyMedicines.stream().filter(allergyMedicine -> {
+            boolean flag = false;
+            if (allergyMedicine.getNegative() == null
+                    && StringUtil.isNotBlank(allergyMedicine.getName())) {
+                flag = true;
+            }
+            return flag;
+        }).count();
+
+        if (count > 0 && firstpageStructureMap != null) {
             String drugAllergy = firstpageStructureMap.get(Content.drugAllergy);
-//            String allergyDrug = firstpageStructureMap.get(Content.allergyDrug);
-            if (!CatalogueUtil.isEmpty(drugAllergy)) {
-                status.set("0");
+            if (CatalogueUtil.isEmpty(drugAllergy)) {
+                status.set("-1");
+                return;
             }
         }
     }

+ 11 - 12
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0193.java

@@ -33,19 +33,18 @@ public class FIRP0193 extends QCCatalogue {
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         List<String> operations = new ArrayList<>();
         List<String> operations_first = new ArrayList<>();
-        if (operationDocs == null) {
-            return;
-        }
-        for (OperationDoc opd : operationDocs) {
-            OperationDiscussionDoc operationDiscussionDoc = opd.getOperationDiscussionDoc();
-            if (operationDiscussionDoc == null) {
-                continue;
-            }
-            String operativeMethod = operationDiscussionDoc.getStructureMap().get("手术方式");
-            if (StringUtil.isBlank(operativeMethod)) {
-                continue;
+        if (ListUtil.isNotEmpty(operationDocs)) {
+            for (OperationDoc opd : operationDocs) {
+                OperationDiscussionDoc operationDiscussionDoc = opd.getOperationDiscussionDoc();
+                if (operationDiscussionDoc == null) {
+                    continue;
+                }
+                String operativeMethod = operationDiscussionDoc.getStructureMap().get("手术方式");
+                if (StringUtil.isBlank(operativeMethod)) {
+                    continue;
+                }
+                operations.add(operativeMethod);
             }
-            operations.add(operativeMethod);
         }
         Map<String, Object> firstPageRecordDocStructureMap = firstPageRecordDoc.getStructureExtMap();
         List<Map<String, String>> mapList = (List<Map<String, String>>) firstPageRecordDocStructureMap.get(Content.operative_information);

+ 1 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0196.java

@@ -19,6 +19,7 @@ import java.util.Map;
 public class FIRP0196 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         /**
+         * 入院记录中现病史未描述昏迷,不提示规则
          * 如果入院前天数和入院后天数不为空,且不是数字,例如是“-”,就不报错
          * 如果天数是数字,那么小时和分都不能为空
          */

+ 6 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0255.java

@@ -5,6 +5,8 @@ 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.LeaveHospitalDoc;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -19,10 +21,12 @@ import java.util.Map;
 public class FIRP0255 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null && leaveHospitalDoc != null) {
+            Map<String, String> leaveHospitalStructureMap = leaveHospitalDoc.getStructureMap();
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String name = firstpageStructureMap.get(Content.outcome);
-            if (CatalogueUtil.isEmpty(name)){
+            if (CatalogueUtil.isEmpty(name) && StringUtil.isNotBlank(leaveHospitalStructureMap.get("治疗结果"))) {
                 status.set("-1");
             }
         }

+ 10 - 9
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03038.java

@@ -23,27 +23,28 @@ import java.util.Map;
 public class FIRP03038 extends QCCatalogue {
     @Autowired
     private SpecialStorageUtil specialStorageUtil;
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         if (inputInfo.getFirstPageRecordDoc() == null) {
             return;
         }
-        Map<String, Map<String,String>> hostpital_standDiag = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DIAG_MAP);
+        Map<String, Map<String, String>> hostpital_standDiag = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DIAG_MAP);
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
-            JSONArray out_diag = (JSONArray)firstpageStructureMap.get("出院诊断");
+            JSONArray out_diag = (JSONArray) firstpageStructureMap.get("出院诊断");
             if (out_diag.size() > 0) {
-                for (int i=0;i<out_diag.size();i++) {
+                for (int i = 0; i < out_diag.size(); i++) {
                     JSONObject jsonObject = out_diag.getJSONObject(i);
-                    String diag_code = (String)jsonObject.get("诊断编码");
+                    String diag_code = (String) jsonObject.get("诊断编码");
                     String diag_name = (String) jsonObject.get("诊断名称");
-                    if(StringUtils.isNotBlank(diag_code) && hostpital_standDiag.containsKey(diag_name)){
-                        Map<String,String> s = hostpital_standDiag.get(diag_name);
-                        if(s != null){
+                    if (StringUtils.isNotBlank(diag_code) && hostpital_standDiag.containsKey(diag_name)) {
+                        Map<String, String> s = hostpital_standDiag.get(diag_name);
+                        if (s != null) {
                             String icd10 = s.get("icd10");
-                            if(StringUtils.isNotBlank(icd10) && icd10.equals(diag_code)){
+                            if (StringUtils.isNotBlank(icd10) && icd10.equals(diag_code)) {
                                 status.set("0");
-                            }else {
+                            } else {
                                 status.set("-1");
                                 return;
                             }

+ 33 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03200.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03200
+ * @Description :治疗类别未填写
+ * @Author : wsy
+ * @Date: 2022-03-16 20:11
+ */
+@Component
+public class FIRP03200 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String treatmentType = firstPageStructureMap.get(Content.treatmentType);//治疗类别
+            if (StringUtil.isNotBlank(treatmentType)) {
+                status.set("0");
+            }
+        }
+    }
+}

+ 40 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03201.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03201
+ * @Description : 治疗类别填写错误
+ * @Author : wsy
+ * @Date: 2022-03-15 16:13
+ */
+@Component
+public class FIRP03201 extends QCCatalogue {
+    public List<String> wordList = Arrays.asList("中医", "民族医", "中西医", "西医");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String treatmentType = firstPageStructureMap.get(Content.treatmentType);//治疗类别
+            if (StringUtil.isBlank(treatmentType)) {
+                return;
+            }
+            if (!wordList.contains(treatmentType)) {
+                status.set("-1");
+            }
+        }
+    }
+}

+ 33 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03202.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03202
+ * @Description :门(急)诊诊断(中医)未填写
+ * @Author : wsy
+ * @Date: 2022-03-16 20:11
+ */
+@Component
+public class FIRP03202 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String outpatientEmrChDiagnose = firstPageStructureMap.get(Content.outpatientEmrChDiagnose);//门急诊诊断(中医)
+            if (StringUtil.isNotBlank(outpatientEmrChDiagnose)) {
+                status.set("0");
+            }
+        }
+    }
+}

+ 37 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03203.java

@@ -0,0 +1,37 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03203
+ * @Description : 门(急)诊诊断(中医)填写不标准
+ * @Author : wsy
+ * @Date: 2022-03-15 16:13
+ */
+@Component
+public class FIRP03203 extends QCCatalogue {
+    public List<String> wordlist = Arrays.asList("中医", "民族医", "中西医", "西医");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+//        if (inputInfo.getFirstPageRecordDoc() == null) {
+//            return;
+//        }
+//        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+//            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+//            String outpatientEmrChDiagnose = firstPageStructureMap.get(Content.outpatientEmrChDiagnose);//门急诊诊断(中医)
+//            if (StringUtil.isBlank(treatmentType)) {
+                return;
+//            }
+//        }
+    }
+}

+ 33 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03204.java

@@ -0,0 +1,33 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03204
+ * @Description :门(急)诊诊断(中医)疾病编码未填写
+ * @Author : wsy
+ * @Date: 2022-03-16 20:11
+ */
+@Component
+public class FIRP03204 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String outpatientEmrChDiagnoseCode = firstPageStructureMap.get(Content.outpatientEmrChDiagnoseCode);//门急诊诊断编码(中医)
+            if (StringUtil.isNotBlank(outpatientEmrChDiagnoseCode)) {
+                status.set("0");
+            }
+        }
+    }
+}

+ 34 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03205.java

@@ -0,0 +1,34 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @ClassName : FIRP03205
+ * @Description : 门(急)诊诊断(中医)疾病编码填写不标准
+ * @Author : wsy
+ * @Date: 2022-03-15 16:13
+ */
+@Component
+public class FIRP03205 extends QCCatalogue {
+    public List<String> wordlist = Arrays.asList("中医", "民族医", "中西医", "西医");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+//        if (inputInfo.getFirstPageRecordDoc() == null) {
+//            return;
+//        }
+//        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+//            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+//            String outpatientEmrChDiagnose = firstPageStructureMap.get(Content.outpatientEmrChDiagnose);//门急诊诊断(中医)
+//            if (StringUtil.isBlank(treatmentType)) {
+                return;
+//            }
+//        }
+    }
+}

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03206.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03206
+ * @Description : 出院中医主病名称未填写
+ * @Author : wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03206 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            for (Map<String, String> stringStringMap : dischargeDiag) {
+                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+                    if ("主病".equals(stringStringMap.get(Content.diagnose_type)) && CatalogueUtil.isEmpty(stringStringMap.get(Content.diagnose_name))) {
+                        status.set("-1");
+                    }
+                }
+            }
+        }
+    }
+}

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03207.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03207
+ * @Description : 出院中医主病名称填写不标准
+ * @Author : wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03207 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+//        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+//            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+//            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+//            if (ListUtil.isEmpty(dischargeDiag)) {
+//                return;
+//            }
+//            for (Map<String, String> stringStringMap : dischargeDiag) {
+//                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+//                    if ("主病".equals(stringStringMap.get(Content.diagnose_type)) && CatalogueUtil.isEmpty(stringStringMap.get(Content.diagnose_name))) {
+//
+//                    }
+//                }
+//            }
+//        }
+    }
+}

+ 40 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03208.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03208
+ * @Description : 出院中医主病编码未填写
+ * @Author : wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03208 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            for (Map<String, String> stringStringMap : dischargeDiag) {
+                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+                    if ("主病".equals(stringStringMap.get(Content.diagnose_type)) && !CatalogueUtil.isEmpty(stringStringMap.get(Content.diagnose_name))
+                            && CatalogueUtil.isEmpty(stringStringMap.get(Content.icd_code))) {
+                        status.set("-1");
+                    }
+                }
+            }
+        }
+    }
+}

+ 40 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03209.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03209
+ * @Description : 出院中医主病编码填写不标准
+ * @Author : wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03209 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+//        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+//            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+//            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+//            if (ListUtil.isEmpty(dischargeDiag)) {
+//                return;
+//            }
+//            for (Map<String, String> stringStringMap : dischargeDiag) {
+//                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+//                    if ("主病".equals(stringStringMap.get(Content.diagnose_type)) && !CatalogueUtil.isEmpty(stringStringMap.get(Content.diagnose_name))
+//                            && CatalogueUtil.isEmpty(stringStringMap.get(Content.icd_code))) {
+//
+//                    }
+//                }
+//            }
+//        }
+    }
+}

+ 39 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03210.java

@@ -0,0 +1,39 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03210
+ * @Description : 出院主病入院病情未填写
+ * @Author : wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03210 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            for (Map<String, String> stringStringMap : dischargeDiag) {
+                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+                    if ("主病".equals(stringStringMap.get(Content.diagnose_type)) && CatalogueUtil.isEmpty(stringStringMap.get(Content.inStatus))) {
+                        status.set("-1");
+                    }
+                }
+            }
+        }
+    }
+}

+ 51 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03211.java

@@ -0,0 +1,51 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+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.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03211
+ * @Description : 主病“入院病情”不在编码范围内
+ * @Author : wsy
+ * @Date: 2022-03-15 16:13
+ */
+@Component
+public class FIRP03211 extends QCCatalogue {
+    public List<String> wordList = Arrays.asList("有", "临床未确定", "情况不明", "无");
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        String inStatus = "";
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            for (Map<String, String> stringStringMap : dischargeDiag) {
+                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+                    if ("主病".equals(stringStringMap.get(Content.diagnose_type))) {
+                        inStatus = stringStringMap.get(Content.inStatus);
+                    }
+                }
+            }
+
+            if (StringUtil.isNotBlank(inStatus) && !wordList.contains(inStatus)) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 40 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03212.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+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.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03212
+ * @Description : 出院中医主证名称未填写
+ * @Author : Wsy
+ * @Date: 2022-03-06 17:28
+ */
+@Component
+public class FIRP03212 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMapExt = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMapExt.get(Content.dischargeDiag);
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+            for (Map<String, String> stringStringMap : dischargeDiag) {
+                if ("中医".equals(stringStringMap.get(Content.chinese_western_type))) {
+                    if ("主症".equals(stringStringMap.get(Content.diagnose_type)) && CatalogueUtil.isEmpty(stringStringMap.get(Content.diagnose_name))) {
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 80 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03213.java

@@ -0,0 +1,80 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+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.FirstPageRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03213
+ * @Description :  出院中医主病诊断编码与性别不符
+ * @Author : Wsy
+ * @Date: 2022-3-13 15:51
+ */
+@Component
+public class FIRP03213 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (firstPageRecordDoc == null) {
+            return;
+        }
+        Map<String, Object> structureExtMap = firstPageRecordDoc.getStructureExtMap();
+        if (structureExtMap == null) {
+            return;
+        }
+        String icdCode = "";
+        List<Map<String, String>> outpatientEmergencyDiag = (List) structureExtMap.get(Content.dischargeDiag);
+        if (outpatientEmergencyDiag == null || outpatientEmergencyDiag.size() == 0) {
+            return;
+        }
+
+        for (Map<String, String> map : outpatientEmergencyDiag) {
+            if (StringUtil.isNotBlank(map.get(Content.diagnose_type)) && "主病".equals(map.get(Content.diagnose_type))) {
+                icdCode = map.get(Content.icd_code);
+            }
+        }
+
+        if (StringUtil.isBlank(icdCode)) {
+            return;
+        }
+
+        String gender = (String) structureExtMap.get("性别");
+        if (StringUtil.isBlank(gender)) {
+            return;
+        }
+        List<String> noMatchWords = null;
+        if (gender.contains("男")) {
+            /* 男性不合理诊断编码 */
+            noMatchWords = Lists.newArrayList("BF", "BFY", "BFY010", "BFY020", "BFY030", "BFY040", "BFY050", "BFY060", "BFY080", "BFY090", "BFY100", "BFY110", "BFY120", "BFY130", "BFY140",
+                    "BFY150", "BFY160", "BFY170", "BFY180", "BFY190", "BFY200", "BFY210", "BFY220", "BFY70", "BFD", "BFD010", "BFR", "BFR010", "BFR020", "BFR030", "BFR040", "BFR050", "BFR051", "BFR052",
+                    "BFR060", "BFR070", "BFR080", "BFR090", "BFR100", "BFR110", "BFR120", "BFR130", "BFR140", "BFR150", "BFR160", "BFR170", "BFR180", "BFR190", "BFR200", "BFC", "BFC010", "BFC011", "BFC020",
+                    "BFC030", "BFC040", "BFC050", "BFC060", "BFC070", "BFC080", "BFC081", "BFC090", "BFC091", "BFC100", "BFC110", "BFC120", "BFC130", "BFC140", "BFC150", "BFC160", "BFC170", "BFC180", "BFL",
+                    "BFL000", "BFA", "BFA000", "BFZ", "BFZ010", "BFZ020", "BFZ030", "BFZ040", "BFZ050", "BFZ060", "BFZ070", "BFZ080");
+        } else if (gender.contains("女")) {
+            /* 女性不合理诊断编码 */
+            noMatchWords = Lists.newArrayList("BNS160", "BNS161", "BNS162", "BNS170", "BNS180", "BWN", "BWN050", "BWN010", "BWN020", "BWN030", "BWN040",
+                    "BWN060", "BWN070", "BWN080", "ZBMRD1", "ZBRS20", "ZYV071", "ZYV231", "ZYV252", "ZYX111", "ZZPF11", "ZZS110", "ZZS120", "ZZSM20", "ZLHR20");
+        }
+        if (noMatchWords == null || noMatchWords.size() == 0) {
+            return;
+        }
+
+        for (String noMatchWord : noMatchWords) {
+            if (icdCode.contains(noMatchWord)) {
+                status.set("-1");
+                info.set(noMatchWord);
+                return;
+            }
+        }
+    }
+}

+ 55 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/clinicalblood/CLI0571.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 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 : CLI0571
+ * @Description :  输血记录Rh血型未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CLI0571 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 (StringUtils.isNotEmpty(cliBStructureMap.get("Rh血型"))) {
+                    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("Rh") || bloodType.contains("RH")
+                                || bloodType.contains("血蛋白")) {
+                            status.set("0");
+                            return;
+                        }
+                    }
+                }
+            }
+        }
+    }
+}

+ 111 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ningbozhongyi/threelevelward/THR0144.java

@@ -0,0 +1,111 @@
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.threelevelward;
+
+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.*;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0144
+ * @Description : 患者出院前无上级医师(主治及以上)同意出院的病程记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 17:20
+ */
+@Component
+public class THR0144 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        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) || CatalogueUtil.isEmpty(dischargeTime)) {
+                status.set("0");
+                return;
+            }
+
+            if (!CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisTime),
+                    StringUtil.parseDateTime(DateUtil.nowString()),
+                    Long.valueOf(48 * 60))) {//如果入院未超过48小时,规则不判断
+                status.set("0");
+                return;
+            }
+            //如果住院天数小于2天则不判断该条规则
+            if (DateUtil.parseDate(dischargeTime) != null &&
+                    !CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (48 * 60))) {
+                status.set("0");
+                return;
+            } else {
+                if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        DeathCaseDiscussDoc deathCaseDiscussDoc = inputInfo.getDeathCaseDiscussDoc();
+        /* 如果没有出院小结,就不报         如果有死亡记录、死亡讨论记录,也不报 */
+        if (leaveHospitalDoc == null || deathRecordDoc != null || deathCaseDiscussDoc != null) {
+            status.set("0");
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
+        if (allDoctorWradDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        int j = 0; //最后二次查房记录
+        Boolean lastFlag = true;
+        for (int i = allDoctorWradDocs.size() - 1; i >= 0 && j < 2; i--) {
+            j++;
+            ThreeLevelWardDoc lastWardDoc = allDoctorWradDocs.get(i);
+            Map<String, String> structureMap = lastWardDoc.getStructureMap();
+            String conditionRecord = structureMap.get("病情记录");
+            String treatmentPlan = structureMap.get("治疗计划和措施");
+            String title = structureMap.get("查房标题");
+            //|| title.contains("病理记录") || title.contains("病理诊断")
+            if (StringUtil.isBlank(title) || title.contains("病理报告") || title.contains("化验记录")) {
+                continue;
+            }
+            conditionRecord = StringUtil.isBlank(conditionRecord) ? "" : conditionRecord;
+            conditionRecord = conditionRecord.replace(" ", "");
+            treatmentPlan = StringUtil.isBlank(treatmentPlan) ? "" : treatmentPlan;
+            //主任或主治查房 标题需要包含“主任”或“主治”,内容需要包含“出院”
+            if ((conditionRecord.contains("出院") || conditionRecord.contains("转上级医院") || treatmentPlan.contains("出院"))
+                    && (CatalogueUtil.subTitle(title).contains(Content.attend)
+                    || CatalogueUtil.subTitle(title).contains(Content.director)
+                    || CatalogueUtil.subTitle(title).contains("主刀"))) {
+                status.set("0");
+                return;
+            }
+            //普通查房 内容需要包含“上级”和“出院”
+            if (StringUtil.isBlank(title)
+                    || (title.contains("日常查房记录") || title.contains("普通查房记录") || title.contains("日常病程记录"))
+                    && (title.contains("上级") || conditionRecord.contains("上级"))
+                    && (conditionRecord.contains("出院") || treatmentPlan.contains("出院"))) {
+                status.set("0");
+                return;
+            }
+            // 添加硬规则,最后一个记录包含“医院”或 “离院”就不报错  || conditionRecord.contains("出院")
+            if (lastFlag==true) {
+                if (conditionRecord.contains("医院") || conditionRecord.contains("离院")) {
+                    status.set("0");
+                    return;
+                }
+                lastFlag = false;
+            }
+        }
+    }
+}

+ 43 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/behospitalized/BEH0400.java

@@ -0,0 +1,43 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.behospitalized;
+
+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.label.PastLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 既往史未填写
+ * @author: rengb
+ * @time: 2020/3/10 14:02
+ */
+@Component
+public class BEH0400 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        List<String> Str =  Arrays.asList("咳嗽气喘史","胸闷心悸史","腹痛腹泻史","多饮多尿史","浮肿少尿史","尿频尿痛史","抽搐史","出血史","过敏史","药物过敏史","传染病史","外伤手术史","输血史","重大疾病史和治疗史");
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        for(String s : Str){
+            if(structureMap!=null &&structureMap.containsKey(s)){
+                status.set("0");
+                return;
+            }
+        }
+
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        if (pastLabel != null && StringUtil.isNotBlank(pastLabel.getText())) {
+            status.set("0");
+        }
+    }
+
+}

+ 5 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/firstpagerecord/FIRP0163.java

@@ -25,6 +25,11 @@ public class FIRP0163 extends QCCatalogue {
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String nationality = firstpageStructureMap.get(Content.nationality);
+            if (StringUtil.isNotBlank(nationality) && !"中国".equals(nationality)) {
+                status.set("0");
+                return;
+            }
             String idNumber = firstpageStructureMap.get(Content.idNumber);
             String dept = firstpageStructureMap.get("入院科别");
             if (StringUtil.isNotBlank(dept) && "NICU".equals(dept)) {

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

@@ -0,0 +1,66 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.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.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+/**
+ * @ClassName : OPE0326
+ * @Description : 无术后首程
+ * @Author : kwz
+ * @Date: 2020-05-30 17:07
+ */
+@Component
+public class OPE0326 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        long count_oper = 0;
+        long count_discuss = 0;
+        if (operationDocs != null && operationDocs.size() > 0) {
+            //宁海妇幼引道助产手术记录(模板名852)不需要术后首程
+            long count = operationDocs.stream().filter(operationDoc -> {
+                boolean flag = false;
+                if (operationDoc.getOperationRecordDoc() != null
+                        && StringUtil.isNotBlank(operationDoc.getOperationRecordDoc().getStructureMap().get("mode_id"))
+                        && "852".equals(operationDoc.getOperationRecordDoc().getStructureMap().get("mode_id"))) {
+                    flag = true;
+                }
+                return flag;
+            }).count();
+            if (count > 0) {
+                return;
+            }
+
+            count_oper = operationDocs.stream().map(i -> i.getOperationRecordDoc()).filter(i -> i != null).count();
+
+            count_discuss = operationDocs.stream().map(i -> i.getOperationDiscussionDoc()).filter(i -> i != null).count();
+            if (count_oper > 0 && count_discuss == 0) {
+                status.set("-1");
+            }
+        }
+            /*List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (operationDocs.size() == 0 || operationDocs == null) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+                if (operationDiscussionDoc == null) {
+                    continue;
+                }
+                Map<String, String> operationDiscussionStructureMap = operationDiscussionDoc.getStructureMap();
+                if (CatalogueUtil.isEmpty(operationDiscussionStructureMap.get("患方签名"))) {
+                    status.set("-1");
+                    return;
+                }
+            }*/
+
+
+    }
+}

+ 47 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0123.java

@@ -0,0 +1,47 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : THR0123
+ * @Description : 入院记录未在患者入院24小时内完成
+ * @Author : 胡敬
+ * @Date: 2020-03-19 13:51
+ */
+@Component
+public class THR0123 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisDate = beHospitalStructureMap.get(Content.admisDate);
+            String recordTime = beHospitalStructureMap.get("记录日期");
+            if (CatalogueUtil.isEmpty(admisDate) || CatalogueUtil.isEmpty(recordTime)) {
+                return;
+            }
+            if(!CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(DateUtil.nowString()),
+                    Long.valueOf(24 * 60))){//如果入院还未过24小时规则不判断
+                return;
+            }
+
+            if (CatalogueUtil.compareTime(
+                    StringUtil.parseDateTime(admisDate),
+                    StringUtil.parseDateTime(recordTime),
+                    Long.valueOf(24 * 60))) {
+                status.set("-1");
+            }
+        }
+    }
+
+}

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

@@ -0,0 +1,203 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.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 {
+    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(sixDate);
+                    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++) {
+                    int directorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.director);
+                    int dept_doctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.dept_doctor);
+                    //三级医师查房算一次主任查房
+                    int threeDoctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), "三级");
+                    //北仑内分泌科(主任携主任代主治)
+                    int endocrinologyTitleNum = endocrinologyTitleNum(roundRecordEveryWeek.get(j).split(","));
+                    if (directorNum + dept_doctorNum + threeDoctorNum + endocrinologyTitleNum < 2) {
+                        //每周无2次主任医师查房记录/科主任查房记录
+                        status.set("-1");
+                        resultInfos.add(lastWardDateRangeList.get(j));
+                    }
+                }
+                if (resultInfos.size() > 0) {
+                    info.set(StringUtils.join(resultInfos.toArray(), ";"));
+                }
+            }
+        }
+    }
+
+    /**
+     * 北仑内分泌科主任主治处理
+     *
+     * @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, DateUtil.dateZeroClear(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 "";
+    }
+}

+ 229 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0128.java

@@ -0,0 +1,229 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.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.FirstCourseRecordDoc;
+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.ward.AttendingDoctorWardDoc;
+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 : THR0128
+ * @Description : 每周无3次主治医师查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 16:52
+ */
+@Component
+public class THR0128 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;
+                //长兴首次病程算一次主治查房,所以第一周只需要两次主治查房就可以
+                int rounds = 0;//主治查房次数
+                Date firstWeek = DateUtil.addDate(beginDate, 7);
+                for (AttendingDoctorWardDoc attendingDoctorWardDoc : threeLevelWardDoc.getAttendingDoctorWardDocs()) {//循环筛选主治,找出地日在第一周的个数
+                    String recordTime = attendingDoctorWardDoc.getStructureMap().get("查房日期");
+                    Date recordDate = StringUtil.parseDateTime(recordTime);
+                    if (recordDate.before(firstWeek)) {
+                        rounds = rounds + 1;
+                    }
+                }
+                if (rounds >= 2) {
+                    return;
+                }
+                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(sixDate);
+                    lastWardDateRangeList.add(lastWardDateRange);
+                    roundRecordEveryWeek.add(roundRecordThisWeek);
+                    beginDate = DateUtil.addDate(beginDate, 7);
+                    i++;
+                }
+                if (roundRecordEveryWeek.size() == 0) {
+                    status.set("0");
+                    return;
+                }
+                boolean firstRecordAttendExist = findfirstRecordAttend(inputInfo);
+                List<String> resultInfos = new ArrayList<>();
+                for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
+                    int indicationsNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.attend);
+                    //三级医师查房算一次主治查房
+                    int threeDoctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), "三级");
+                    if (j == 0 && firstRecordAttendExist) { //如果首程中医师签名为主治医师,第一周查房记录也要加上
+                        indicationsNum += 1;
+                    }
+                    if (indicationsNum + threeDoctorNum < 3) {
+                        //每周无3次主治医师查房记录
+                        status.set("-1");
+                        resultInfos.add(lastWardDateRangeList.get(j));
+                    }
+                }
+
+                if (resultInfos.size() > 0) {
+                    info.set(StringUtils.join(resultInfos.toArray(), ";"));
+                }
+            }
+        }
+    }
+
+    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, DateUtil.dateZeroClear(recordDate), (long) 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 findfirstRecordAttend(InputInfo inputInfo) {
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        if (firstCourseRecordDoc == null) {
+            return false;
+        }
+        Map<String, Map<String, Object>> hospitalDoctorMap = specialStorageUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        String doctorSign = firstCourseRecordDoc.getStructureMap().get("医师签名");
+        if (hospitalDoctorMap == null || StringUtil.isBlank(doctorSign)) {
+            return false;
+        }
+        if (hospitalDoctorMap.containsKey(doctorSign)) {
+            Object professor = hospitalDoctorMap.get(doctorSign).get("professor");
+            if (professor != null) {
+                return professor.toString().contains("主治") || professor.toString().contains("主任");
+            }
+        }
+        return false;
+    }
+}

+ 91 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR0140.java

@@ -0,0 +1,91 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : THR0140
+ * @Description : 查房记录无医师签名
+ * @Author : 胡敬
+ * @Date: 2020-03-19 19:20
+ */
+@Component
+public class THR0140 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if (threeLevelWardDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        if (allDoctorWradDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        List<ThreeLevelWardDoc> recordDoctorList = allDoctorWradDocs
+                .stream()
+                .filter(doc -> StringUtil.isBlank(doc.getStructureMap().get("记录医生")))
+                .collect(Collectors.toList());
+        if (recordDoctorList.size() == 0) {
+            status.set("0");
+            return;
+        }
+
+        StringBuffer message = new StringBuffer();
+        //长兴:返回所有医师未签名的记录日期
+        int i = 0;
+        for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
+            if (StringUtil.isBlank(threeLevelWardDoc.getStructureMap().get("记录医生"))) {
+                if (threeLevelWardDoc.getStructureMap() != null && threeLevelWardDoc.getStructureMap().get("查房日期") != null) {
+                    if (i > 1) {
+                        break;
+                    }
+                    if (message.toString().length() == 0) {
+                        message.append(threeLevelWardDoc.getStructureMap().get("查房日期"));
+                    } else {
+                        message.append(",").append(threeLevelWardDoc.getStructureMap().get("查房日期"));
+                    }
+                    i++;
+                }
+            }
+        }
+        info.set(message.append("...").toString());
+        //        if (inputInfo.getDifficultCaseDiscussDocs().size() > 0) {
+        //            processSign(inputInfo, "疑难患者");
+        //        }
+        //        if (inputInfo.getRescueDocs().size() > 0) {
+        //            processSign(inputInfo, "抢救患者");
+        //        }
+    }
+
+    private void processSign(InputInfo inputInfo, String message) {
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
+            Map<String, String> threeLevelWardDocStructureMap = threeLevelWardDoc.getStructureMap();
+            String title = threeLevelWardDocStructureMap.get("查房标题");
+            String recordDoctor = threeLevelWardDocStructureMap.get("记录医师");
+            if (CatalogueUtil.isEmpty(title)) {
+                continue;
+            }
+            if (CatalogueUtil.subTitle(title).contains(Content.director) && CatalogueUtil.isEmpty(recordDoctor)) {
+                status.set("-1");
+                if (StringUtil.isBlank(message)) {
+                    info.set(message);
+                } else {
+                    info.set(info.get() + "," + message);
+                }
+                break;
+            }
+        }
+    }
+}

+ 508 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR02985.java

@@ -0,0 +1,508 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.SimilarityUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.*;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+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.Drug;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : THR02985
+ * @Description : 医嘱有抗生素使用病程无记录
+ * 药品类型(0.普药 1.抗生素 2.激素)
+ * @Author : 胡敬
+ * @Date: 2020-06-23 10:04
+ */
+@Component
+public class THR02985 extends QCCatalogue {
+    @Autowired
+    SimilarityUtil similarityUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        if (doctorAdviceDocs.size() == 0) {
+            return;
+        }
+
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .map(DoctorAdviceDoc::getStructureMap)
+                .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("抗生素"))
+//                .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
+                .collect(Collectors.toList());
+
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+        //记录同一天内是否开过多次同一抗生素
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        //记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
+        Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
+        Date startDate = null;
+        for (Map<String, String> adviceDoc : docAdvStruct) {
+            String drugName = adviceDoc.get("医嘱项目名称");
+            String startDateStr = adviceDoc.get("医嘱开始时间");
+            if (StringUtil.isNotBlank(drugName)) {
+                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//                startDate = StringUtil.parseDateTime(startDateStr);
+                if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                    continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+                }
+                drugName = removeBracket(drugName).replaceAll("[^\u4e00-\u9fa5]", "");
+                String drugStandardWord = similarityUtil.getDrugStandardWord(drugName);
+                if (StringUtil.isNotBlank(drugStandardWord)) {
+                    drugName = drugStandardWord;
+                }
+                if (Arrays.asList(KSS).contains(drugName)) {
+                    doctorAdviceDrugMap.put(startDate, adviceDoc.get("医嘱项目名称"));
+                }
+            }
+        }
+
+        Map<String, Date> info = Maps.newLinkedHashMap();
+        Map<String, List<Drug>> infoModel = Maps.newLinkedHashMap();
+        String dateStr = null;
+        //入院记录中获取信息
+        /*if (beHospitalizedDoc != null) {
+            Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
+            getInfo(info, structureMap, "入院记录", "入院日期", "治疗计划");
+        }*/
+        //从首程治疗计划中获取信息
+        if (firstCourseRecordDoc != null) {
+            getInfo(info, firstCourseRecordDoc.getStructureMap(), "首次病程录", "病历日期", "诊疗计划");
+            if (firstCourseRecordDoc.getDrugLabel() != null) {
+                List<Drug> drugs = firstCourseRecordDoc.getDrugLabel().getDrugs();
+                dateStr = firstCourseRecordDoc.getStructureMap().get("病历日期");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
+        }
+
+        //从查房记录中获取信息
+        if (threeLevelWardDocs.size() > 0) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            List<ThreeLevelWardDoc> wardDocs = allDoctorWradDocs
+                    .stream()
+                    .filter(x -> StringUtil.isNotBlank(x.getStructureMap().get("查房日期")) && x.getThreeLevelWardLabel().size() > 0)
+                    .collect(Collectors.toList());
+            wardDocs.forEach(x -> getInfo(info, x.getStructureMap(), "查房记录", "查房日期", "病情记录", "治疗计划和措施"));
+            wardDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("查房日期"), x.getThreeLevelWardLabel().get(x.getThreeLevelWardLabel().size() - 1).getDrugs()));
+        }
+        //从手术记录中获取信息
+        if (operationDocs.size() > 0) {
+            //手术记录
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationRecordDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("手术时间")))
+                    .collect(Collectors.toList());
+            operationRecordDocs.forEach(x -> getInfo(info, x.getStructureMap(), "手术记录", "手术时间", "手术经过及处理"));
+            operationRecordDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("手术时间"), x.getOperationRecordLabel().getDrugs()));
+            //术后首程
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationDiscussionDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
+                    .collect(Collectors.toList());
+            operationDiscussionDocs.forEach(x -> getInfo(info, x.getStructureMap(), "术后首程", "病历日期", "手术简要经过", "术后处理措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("病历日期"), x.getOperationDiscussionLabel().getDrugs()));
+        }
+
+        //从会诊记录中获取信息
+        /*if (consultationDocs.size() > 0) {
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
+                    .stream()
+                    .map(ConsultationDoc::getConsultationResultsDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
+                    .collect(Collectors.toList());
+            consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
+        }*/
+
+        //从出院小结中获取信息
+        if (leaveHospitalDoc != null) {
+            if (inputInfo.getMedicalRecordInfoDoc() != null) {
+                Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+                dateStr = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+                //如果存在出院小结,出院日期为空,存储系统当前时间
+                if (StringUtil.isBlank(dateStr)) {
+                    dateStr = DateUtil.formatDateTime(new Date());
+                }
+            }
+            if (StringUtil.isNotBlank(dateStr)) {
+                if (leaveHospitalDoc.getLeaveHospitalLabel() != null) {
+                    List<Drug> drugs = leaveHospitalDoc.getLeaveHospitalLabel().getDrugs();
+                    getDischargeInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", dateStr, "诊治经过");
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
+        }
+
+        StringBuffer sb = new StringBuffer();
+        Map<Object, Object> data = Maps.newHashMap();
+        Set<String> existDrug = Sets.newHashSet();
+        String infoStr = "";
+        for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
+            Date doctorAdviceDate = doctorAdviceDrug.getKey();
+            String drugs = doctorAdviceDrug.getValue();
+            if (drugs.contains(" ")) {
+                drugs = drugs.split(" ")[0];
+            }
+//            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
+            Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
+                    .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
+            /**********************************************先文本匹配************************************************/
+            String missDrug = "";
+            for (Map.Entry<String, Date> map : info.entrySet()) {
+                missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug, existDrug);
+                //当前抗生素药(drugs)在info中已找到,直接跳出当前循环
+                if (StringUtil.isBlank(missDrug)) {
+                    break;
+                }
+            }
+            if (StringUtil.isBlank(missDrug)) {
+                continue;
+            }
+            /**********************************************文本匹配没有找到药,再走模型************************************************/
+            boolean modelFind = false;
+            for (Map.Entry<String, List<Drug>> modelMap : infoModel.entrySet()) {
+                dateStr = modelMap.getKey();
+                List<Drug> diags = modelMap.getValue();
+                Date date = StringUtil.parseDateTime(dateStr);
+                //医嘱开始时间往后2天或往前一天找药
+                if ((doctorAdviceDate.before(date) && !CatalogueUtil.compareTime(doctorAdviceDate, date, 48 * 60L))
+                        || (date.before(doctorAdviceDate) && !CatalogueUtil.compareTime(date, doctorAdviceDate, 24 * 60L))) {
+                    for (String adDrug : splitDrugs) {
+                        for (Drug courseDrug : diags) {
+                            if (compareStandard(courseDrug.getName(), adDrug)) {
+                                modelFind = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                if (modelFind) {
+                    break;
+                }
+            }
+
+            if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
+                infoAppend(sb, drugs, DateUtil.formatDateTime(doctorAdviceDate));
+                data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
+            }
+        }
+        if (StringUtil.isNotBlank(sb.toString())) {
+            this.status.set("-1");
+            this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+            extData.set(data);
+        }
+    }
+
+    /**
+     * 记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+     *
+     * @param docAdvStruct
+     * @param antibioticDateTimes
+     */
+    private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
+        String drugName;
+        String startDateStr;
+        Date startDate;
+        Map<Date, Integer> antibioticDateTime;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = StringUtil.parseDateTime(startDateStr);
+            if (antibioticDateTimes.containsKey(drugName)) {
+                Map<Date, Integer> map = antibioticDateTimes.get(drugName);
+                if (map.containsKey(startDate)) {
+                    map.put(startDate, map.get(startDate) + 1);
+                } else {
+                    map.put(startDate, 0);
+                }
+            } else {
+                antibioticDateTime = Maps.newHashMap();
+                antibioticDateTime.put(startDate, 0);
+                antibioticDateTimes.put(drugName, antibioticDateTime);
+            }
+        }
+    }
+
+    /**
+     * 获取各模块信息<入院记录、首次病程录、手术记录、术后首程、会诊结果单、查房记录>
+     *
+     * @param structureMap
+     * @param info
+     */
+    private void getInfo(Map<String, Date> info, Map<String, String> structureMap, String modelType, String dateKey, String... contentKey) {
+        String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList(contentKey));
+        String recordDateStr = structureMap.get(dateKey);
+        if (StringUtil.isNotBlank(recordDateStr)) {
+            Date date = StringUtil.parseDateTime(recordDateStr);
+            if (StringUtil.isNotBlank(content) && date != null) {
+                info.put(modelType + "->" + content, date);
+            }
+        }
+    }
+
+    /**
+     * 获取出院小结模块信息
+     *
+     * @param structureMap
+     * @param info
+     */
+    private void getDischargeInfo(Map<String, Date> info, Map<String, String> structureMap, String modelType, String dateStr, String... contentKey) {
+        String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList(contentKey));
+        if (StringUtil.isNotBlank(dateStr)) {
+            Date date = StringUtil.parseDateTime(dateStr);
+            if (StringUtil.isNotBlank(content) && date != null) {
+                info.put(modelType + "->" + content, date);
+            }
+        }
+    }
+
+    private void getInfo(Map<String, List<Drug>> info, String dateKey, List<Drug> drugs) {
+        List<Drug> tempDrugs = new ArrayList<>();
+        if (null != drugs && drugs.size() > 0) {
+            for (Drug drug : drugs) {
+                if (null != drug.getConsumption() && !drug.getConsumption().getName().contains("mg/Kg")) {
+                    tempDrugs.add(drug);
+                }
+            }
+        }
+        if (info.containsKey(dateKey)) {
+            info.get(dateKey).addAll(tempDrugs);
+        } else {
+            info.put(dateKey, tempDrugs);
+        }
+    }
+
+    /**
+     * 核心:从文本中找药
+     *
+     * @param content          文本
+     * @param wardDate
+     * @param doctorAdviceDate
+     * @param drugs
+     * @param days
+     * @return 如果文本中找到该药,则返回空字符串
+     */
+    private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug, Set<String> existDrug) {
+        if ("时间不匹配".equals(missDrug)) {
+            missDrug = "";//初始化缺失药物
+        }
+        //开医嘱时间起,昨天今天明天记录内查找药
+        if ((doctorAdviceDate.before(wardDate) && !CatalogueUtil.compareTime(doctorAdviceDate, wardDate, days * 24 * 60L))
+                || (wardDate.before(doctorAdviceDate) && !CatalogueUtil.compareTime(wardDate, doctorAdviceDate, 24 * 60L)) ||
+                DateUtils.isSameDay(wardDate, doctorAdviceDate)) {
+            boolean findDrug = false;
+            String standardDrug = null;
+            for (String drug : drugs) {
+                if (StringUtil.isBlank(drug)) {
+                    continue;
+                }
+                drug = drug.replaceAll("[^\\u4e00-\\u9fa5]", "");
+                standardDrug = similarityUtil.getDrugStandardWord(drug);
+                if (content.contains(drug) || (StringUtil.isNotBlank(content) && StringUtil.isNotBlank(standardDrug) && content.contains(standardDrug))
+                        || (existDrug.contains(drug) && (regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
+                        || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前") || regexFind(content, "治疗同前")))) {
+                    findDrug = true;
+                    existDrug.add(drug);
+                    break;
+                } else {
+                    missDrug = concatInfo(missDrug, drug);
+                }
+            }
+            if (findDrug) {
+                missDrug = "";//如果找到一种抗生素药,就把报错信息置为空
+            }
+        } else {
+            if (StringUtil.isBlank(missDrug)) {
+                missDrug = "时间不匹配";
+            }
+        }
+        return missDrug;
+    }
+
+    private String concatInfo(String infoStr, String content) {
+        if (StringUtil.isBlank(infoStr)) {
+            infoStr += content;
+        } else {
+            if (!infoStr.contains(content)) {
+                infoStr += "或" + content;
+            }
+        }
+        return infoStr;
+    }
+
+    private boolean regexFind(String content, String... str) {
+        String s = "";
+        for (String word : str) {
+            s += word + ".*";
+        }
+        s = s.substring(0, s.lastIndexOf(".*"));
+        Pattern p = Pattern.compile(s);
+        Matcher m = p.matcher(content);
+        return m.find();
+    }
+
+    /**
+     * 比较两个抗生素标准词是否一致
+     *
+     * @param firstWord
+     * @param secordWord
+     * @return
+     */
+    private boolean compareStandard(String firstWord, String secordWord) {
+        if (StringUtil.isBlank(firstWord) || StringUtil.isBlank(secordWord)) {
+            return false;
+        }
+        String drugStandardWord1 = similarityUtil.getDrugStandardWord(firstWord);
+        String drugStandardWord2 = similarityUtil.getDrugStandardWord(secordWord);
+        if (drugStandardWord1 == null || drugStandardWord2 == null) {
+            return firstWord.equals(secordWord) || firstWord.contains(secordWord) || secordWord.contains(firstWord);
+        }
+        return drugStandardWord1.equals(drugStandardWord2);
+    }
+
+    /**
+     * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
+     *
+     * @param str
+     * @return
+     */
+    private String removeBracket(String str) {
+        if (str.contains("]") && str.indexOf("]") != str.length() - 1) {
+            return str.substring(str.indexOf("]") + 1);
+        }
+        return str;
+    }
+
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date) {
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
+    }
+
+    private static final List<String> filterKey = Lists.newArrayList("ACF", "ID", "IG", "IM", "IP", "IV",
+            "关节腔注射", "宫颈注射", "皮下注射", "皮下注射(儿童)", "皮下注射(免费)", "皮下注射(成人)", "皮内", "皮内注射",
+            "结膜下注射", "肌注", "肌肉注射(儿童)", "肌肉注射(公卫专用)", "肌肉注射(成人)", "胸腔注射", "腹腔内注射", "腹腔注射",
+            "静滴(儿童)", "静滴(成人)", "静脉注射", "静脉注射(儿童)", "静脉注射(免费)", "静脉注射(成人)", "静脉注射(泵)",
+            "静脉滴注", "静脉滴注(泵)", "鞘内注射", "微泵");
+
+    private static final String[] KSS = {
+            "万古霉素",
+            "两性霉素B",
+            "亚胺培南西司他丁",
+            "伊曲康唑",
+            "伏立康唑",
+            "依替米星",
+            "克拉霉素",
+            "克林霉素",
+            "利奈唑胺",
+            "利奈唑胺葡萄糖",
+            "利福昔明",
+            "制霉菌素",
+            "卡泊芬净",
+            "厄他培南",
+            "吗啉硝唑",
+            "呋喃唑酮",
+            "哌拉西林他唑巴坦",
+            "磺胺甲恶唑",
+            "多粘菌素B",
+            "多西环素",
+            "夫西地酸",
+            "头孢丙烯",
+            "头孢他啶",
+            "头孢他啶阿维巴坦",
+            "头孢他美酯",
+            "头孢克洛",
+            "头孢克肟",
+            "头孢吡肟",
+            "头孢呋辛",
+            "头孢哌酮舒巴坦",
+            "头孢唑林",
+            "头孢噻肟",
+            "头孢地嗪",
+            "头孢地尼",
+            "头孢拉定",
+            "头孢曲松",
+            "头孢替安",
+            "头孢美唑",
+            "头孢西丁",
+            "奥硝唑",
+            "妥布霉素",
+            "妥布霉素地塞米松",
+            "左氧氟沙星",
+            "左氧氟沙星",
+            "庆大霉素",
+            "异帕米星",
+            "拉氧头孢",
+            "替加环素",
+            "替硝唑",
+            "替考拉宁",
+            "比阿培南",
+            "氟康唑",
+            "氟康唑",
+            "氟胞嘧啶",
+            "氨曲南",
+            "氨苄西林",
+            "泊沙康唑",
+            "特比萘芬",
+            "甲硝唑",
+            "甲硝唑",
+            "磷霉素",
+            "磷霉素氨丁三醇",
+            "米卡芬净",
+            "米诺环素",
+            "红霉素",
+            "美罗培南",
+            "苄星青霉素",
+            "莫西沙星",
+            "莫西沙星",
+            "达托霉素",
+            "阿奇霉素",
+            "阿奇霉素枸橼酸二氢钠",
+            "阿洛西林",
+            "阿米卡星",
+            "阿莫西林",
+            "阿莫西林克拉维酸",
+            "青霉素"
+    };
+}

+ 157 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03014.java

@@ -0,0 +1,157 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.ThreeLevelWardDoc;
+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.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03014
+ * @Description : 每周无1次主任医师查房记录(Attending少于每周一次查房记录)
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:52
+ */
+@Component
+public class THR03014 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getLeaveHospitalDoc() != null) {
+            Map<String, String> leaveHospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+            String admisTime = leaveHospitalStructureMap.get(Content.admisTime);
+            String dischargeTime = leaveHospitalStructureMap.get(Content.dischargeTime);
+            //如果住院天数小于7天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(dischargeTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (7 * 24 * 60))) {
+                    return;
+                }
+            }
+        }
+
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get("入院日期");
+            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<>();
+            //每7天的病历记录
+            while (i >= 1) {
+                roundRecordThisWeek = extractWardRecord(inputInfo, allDoctorWradDocs, beginDate, hoursPerWeek, lastRecordDate);
+                if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                    break;
+                }
+                lastWardDateRange = DateUtil.formatDate(beginDate) + "    ->    " + DateUtil.formatDate(DateUtil.addDate(beginDate, 6));
+                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++) {
+                int attendNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.director);
+                if (attendNum == 0) {
+                    //每7天无1次主治医师查房记录
+                    status.set("-1");
+                    resultInfos.add(lastWardDateRangeList.get(j));
+                }
+            }
+            if (resultInfos.size() > 0) {
+                info.set(StringUtils.join(resultInfos.toArray(), ";"));
+            }
+        }
+    }
+
+    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("主刀")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.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 "";
+    }
+
+}

+ 157 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03016.java

@@ -0,0 +1,157 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.ThreeLevelWardDoc;
+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.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03016
+ * @Description : 每3天无1次主治医师查房记录(Fellow查房记录每3天1次)
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:52
+ */
+@Component
+public class THR03016 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getLeaveHospitalDoc() != null) {
+            Map<String, String> leaveHospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+            String admisTime = leaveHospitalStructureMap.get(Content.admisTime);
+            String dischargeTime = leaveHospitalStructureMap.get(Content.dischargeTime);
+            //如果住院天数小于3天则不判断该条规则
+            if (!CatalogueUtil.isEmpty(admisTime) && !CatalogueUtil.isEmpty(dischargeTime)) {
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (3 * 24 * 60))) {
+                    return;
+                }
+            }
+        }
+
+        if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String admisTime = beHospitalStructureMap.get("入院日期");
+            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 = 3 * 24 * 60;
+            String roundRecordThisWeek = "";
+            List<String> roundRecordEveryWeek = new ArrayList<>();
+            beginDate = DateUtil.dateZeroClear(DateUtil.addDate(beginDate, 1));//从入院时间第二天0点开始算
+            int i = 1;
+            String lastWardDateRange = "";
+            List<String> lastWardDateRangeList = new ArrayList<>();
+            //每3天的病历记录
+            while (i >= 1) {
+                roundRecordThisWeek = extractWardRecord(inputInfo, allDoctorWradDocs, beginDate, hoursPerWeek, lastRecordDate);
+                if (CatalogueUtil.isEmpty(roundRecordThisWeek)) {
+                    break;
+                }
+                lastWardDateRange = DateUtil.formatDate(beginDate) + "    ->    " + DateUtil.formatDate(DateUtil.addDate(beginDate, 2));
+                lastWardDateRangeList.add(lastWardDateRange);
+                roundRecordEveryWeek.add(roundRecordThisWeek);
+                beginDate = DateUtil.addDate(beginDate, 3);
+                i++;
+            }
+            if (roundRecordEveryWeek.size() == 0) {
+                status.set("0");
+                return;
+            }
+            List<String> resultInfos = new ArrayList<>();
+            for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
+                int attendNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.attend);
+                if (attendNum == 0) {
+                    //每3天无1次主治医师查房记录
+                    status.set("-1");
+                    resultInfos.add(lastWardDateRangeList.get(j));
+                }
+            }
+            if (resultInfos.size() > 0) {
+                info.set(StringUtils.join(resultInfos.toArray(), ";"));
+            }
+        }
+    }
+
+    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分钟内所有查房标题
+     * 抽取一周内所有查房标题,若一周内记录少于2天,则返回""
+     *
+     * @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("主刀")) {
+                String doctorTitle = CatalogueUtil.getDoctorTitle(operationDocs, recordDate, "主刀医师");
+                title = title.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(2 * 24 * 60))) {
+                return recordTitle;
+            }
+        }
+        return "";
+    }
+
+}

+ 57 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03020.java

@@ -0,0 +1,57 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03020
+ * @Description : 入院72小时内无Attending查房记录(要有Attending标示) 首次查房时间最早,如果不在72小时之内,那么所有查房肯定都不在
+ * @Author : 胡敬
+ * @Date: 2020-03-19 13:51
+ */
+@Component
+public class THR03020 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getLeaveHospitalDoc() != null && inputInfo.getLeaveHospitalDoc().getStructureMap() != null) {
+            Map<String, String> leaveHospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+            String admisTime = leaveHospitalStructureMap.get(Content.admisTime);
+            String dischargeTime = leaveHospitalStructureMap.get(Content.dischargeTime);
+            if (CatalogueUtil.isEmpty(admisTime) || CatalogueUtil.isEmpty(dischargeTime)) {
+                status.set("0");
+                return;
+            }
+            //如果住院天数小于3天则不判断该条规则
+            if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (72 * 60))) {
+                status.set("0");
+                return;
+            }
+            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+            List<DirectorDoctorWardDoc> directorDoctorWardDocs = threeLevelWardDoc.getDirectorDoctorWardDocs();
+            if (directorDoctorWardDocs.size() > 0) {
+                DirectorDoctorWardDoc firstDirectorg = directorDoctorWardDocs.get(0);
+                String wardDateStr = firstDirectorg.getStructureMap().get("查房日期");
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(wardDateStr), 72 * 60L)) {
+                    status.set("0");
+                }
+            }
+        } else {
+            //没有出院小结,这条直接不报错
+            status.set("0");
+        }
+    }
+
+}

+ 67 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03021.java

@@ -0,0 +1,67 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.ward.AttendingDoctorWardDoc;
+import com.lantone.qc.pub.model.doc.ward.DirectorDoctorWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03021
+ * @Description : 入院48小时内无Fellow以上的医生查房记录
+ * @Author : 胡敬
+ * @Date: 2020-03-19 15:50
+ */
+@Component
+public class THR03021 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getThreeLevelWardDocs().size() == 0) {
+            status.set("0");
+            return;
+        }
+        if (inputInfo.getLeaveHospitalDoc() != null && inputInfo.getLeaveHospitalDoc().getStructureMap() != null
+                && inputInfo.getThreeLevelWardDocs().size() > 0) {
+            Map<String, String> getLeaveHospitalStructureMap = inputInfo.getLeaveHospitalDoc().getStructureMap();
+            String admisTime = getLeaveHospitalStructureMap.get(Content.admisTime);
+            String dischargeTime = getLeaveHospitalStructureMap.get(Content.dischargeTime);
+            if (CatalogueUtil.isEmpty(admisTime) || CatalogueUtil.isEmpty(dischargeTime)) {
+                status.set("0");
+                return;
+            }
+            //如果住院天数小于2天则不判断该条规则
+            if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(dischargeTime), (long) (48 * 60))) {
+                status.set("0");
+                return;
+            }
+            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
+            List<AttendingDoctorWardDoc> attendingDoctorWardDocs = threeLevelWardDoc.getAttendingDoctorWardDocs();
+            List<DirectorDoctorWardDoc> directorDoctorWardDocs = threeLevelWardDoc.getDirectorDoctorWardDocs();
+            if (attendingDoctorWardDocs.size() > 0) {
+                AttendingDoctorWardDoc firstAttending = attendingDoctorWardDocs.get(0);
+                String wardDateStr = firstAttending.getStructureMap().get("查房日期");
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(wardDateStr), 48 * 60L)) {
+                    status.set("0");
+                }
+            }
+            if (directorDoctorWardDocs.size() > 0) {
+                DirectorDoctorWardDoc firstDirector = directorDoctorWardDocs.get(0);
+                String wardDateStr = firstDirector.getStructureMap().get("查房日期");
+                if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime), StringUtil.parseDateTime(wardDateStr), 48 * 60L)) {
+                    status.set("0");
+                }
+            }
+        } else {
+            //没有出院小结,这条直接不报错
+            status.set("0");
+        }
+    }
+
+}

+ 342 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03076.java

@@ -0,0 +1,342 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.SimilarityUtil;
+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.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+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.Drug;
+import com.lantone.qc.pub.model.label.DrugLabel;
+import com.lantone.qc.pub.model.label.LeaveHospitalLabel;
+import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+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;
+import java.util.Map;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @author HUJING
+ * @create 2020-08-26 10:51
+ * @desc 医嘱与病程记录抗生素剂量不一致
+ **/
+@Component
+public class THR03076 extends QCCatalogue {
+    @Autowired
+    SimilarityUtil similarityUtil;
+
+    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;
+        }
+
+        Map<Date, String> extData = null;
+        if (outputInfo.getResult().get("THR02985") != null) {
+            extData = (Map<Date, String>) outputInfo.getResult().get("THR02985").get("extData");
+        }
+
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .map(DoctorAdviceDoc::getStructureMap)
+                .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("抗生素") && StringUtil.isNotBlank(x.get("医嘱单次剂量")))
+//                .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
+                .collect(Collectors.toList());
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+
+        //抗生素及开医嘱时间 <抗生素名,<抗生素用量,[抗生素使用时间...]>>
+        Map<String, Map<String, List<Double>>> antibioticInfo = Maps.newLinkedHashMap();
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        //记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
+        String drugName = null, value = null, startDateStr = null;
+        Date startDate = null;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            value = structMap.get("医嘱单次剂量");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = StringUtil.parseDateTime(startDateStr);
+            if (extData != null && extData.containsKey(startDate) && extData.get(startDate).equals(drugName)) {
+                continue;   //THR02985  医嘱有抗生素使用病程无记录,规则中没报未记录的抗生素继续走这条规则,报未记录的抗生素过滤
+            }
+            if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+            }
+            collectAntibioticInfo(antibioticInfo, drugName, value, startDateStr);
+        }
+
+        //抗生素及开医嘱时间 <抗生素名,<抗生素用量,[抗生素使用时间...]>>
+        Map<String, Map<String, List<Double>>> antibioticWardInfo = Maps.newLinkedHashMap();
+        String dateStr = null;
+        /*********************************************首程治疗计划********************************************************/
+        if (firstCourseRecordDoc != null) {
+            DrugLabel drugLabel = firstCourseRecordDoc.getDrugLabel();
+            dateStr = firstCourseRecordDoc.getStructureMap().get("病历日期");
+            if (drugLabel != null && StringUtil.isNotBlank(dateStr)) {
+                List<Drug> drugs = drugLabel.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+        /*********************************************查房记录********************************************************/
+        if (threeLevelWardDocs.size() > 0) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            for (ThreeLevelWardDoc doc : allDoctorWradDocs) {
+                if (doc.getThreeLevelWardLabel().size() == 0) {
+                    continue;
+                }
+                dateStr = doc.getStructureMap().get("查房日期");
+                ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
+                List<Drug> drugs = label.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+        /**********************************************手术记录、术后首程************************************************/
+        if (operationDocs.size() > 0) {
+            //手术记录
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationRecordDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("手术时间")))
+                    .collect(Collectors.toList());
+            operationRecordDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getOperationRecordLabel().getDrugs(), x.getStructureMap().get("手术时间")));
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationDiscussionDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
+                    .collect(Collectors.toList());
+            operationDiscussionDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getOperationDiscussionLabel().getDrugs(), x.getStructureMap().get("病历日期")));
+        }
+        /*********************************************会诊结果单********************************************************/
+        /*if (consultationDocs.size() > 0) {
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
+                    .stream()
+                    .map(ConsultationDoc::getConsultationResultsDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
+                    .collect(Collectors.toList());
+            consultationResultsDocs.forEach(x -> getCourseDrugInfo(antibioticWardInfo, x.getConsultationResultLabel().getDrugs(), x.getStructureMap().get("会诊日期及时间")));
+        }*/
+        /*********************************************出院小结********************************************************/
+        if (leaveHospitalDoc != null) {
+            LeaveHospitalLabel leaveHospitalLabel = leaveHospitalDoc.getLeaveHospitalLabel();
+            if (inputInfo.getMedicalRecordInfoDoc() != null) {
+                Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+                dateStr = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+                //如果存在出院小结,出院日期为空,存储系统当前时间
+                if (StringUtil.isBlank(dateStr)) {
+                    dateStr = DateUtil.formatDateTime(new Date());
+                }
+            }
+            if (leaveHospitalLabel != null && StringUtil.isNotBlank(dateStr)) {
+                List<Drug> drugs = leaveHospitalLabel.getDrugs();
+                getCourseDrugInfo(antibioticWardInfo, drugs, dateStr);
+            }
+        }
+
+        /**
+         * 1.医嘱中开了抗生素,查房记录中没有该抗生素,则医嘱中该抗生素出现过的所有时间都会提示出来
+         * 2.医嘱中开了抗生素,查房记录中有该抗生素:
+         *      2.1 医嘱中该抗生素某使用量(如50),查房记录中没有该使用量(如只有100),则医嘱中该抗生素使用量出现过的所有时间都会提示出来
+         *      2.2 医嘱中该抗生素某使用量(如50),查房记录中也有该使用量,对比这两个时间,若医嘱时间两天内的查房记录没有该使用量,则该医嘱时间会提示出来
+         */
+        StringBuffer sb = new StringBuffer();
+        String drugKey = null;
+        for (Map.Entry<String, Map<String, List<Double>>> ai : antibioticInfo.entrySet()) {
+            drugKey = ai.getKey();
+            drugKey = removeBracket(drugKey).replaceAll("[^\u4e00-\u9fa5]", "");
+            String drugStandardWord = similarityUtil.getDrugStandardWord(drugKey);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                drugKey = drugStandardWord;
+            }
+            if (antibioticWardInfo.containsKey(drugKey)) {
+                Map<String, List<Double>> adDateValue = ai.getValue();
+                Map<String, List<Double>> wardDateValue = antibioticWardInfo.get(drugKey);
+                for (Map.Entry<String, List<Double>> adMap : adDateValue.entrySet()) {
+                    String adDateStr = adMap.getKey();
+                    Date adDate = StringUtil.parseDateTime(adDateStr);
+                    List<Double> adUsage = adMap.getValue();
+                    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();
+                        if ((adDate.before(wardDate) && !CatalogueUtil.compareTime(adDate, wardDate, 48 * 60L))
+                                || (wardDate.before(adDate) && !CatalogueUtil.compareTime(wardDate, adDate, 24 * 60L)) ||
+                                DateUtils.isSameDay(wardDate, adDate)) {
+                            wardUsage.removeAll(adUsage);//比如adUsage有1.0、2.0,wardUsage中有2.0、3.0,removeAll之后wardUsage只剩3.0
+                            adDateStr = DateUtil.formatDateTime(adDate);
+                            if (wardUsage.size() > 0 && !sb.toString().contains(ai.getKey() + "(" + adDateStr + ")")) {
+                                infoAppend(innersb, ai.getKey(), adDateStr);
+                            }
+                            if(wardUsage.size() == 0){
+                                innersb.delete(0,innersb.length());
+                                break;
+                            }
+                        }
+                        sb.append(innersb);
+                    }
+                }
+            }
+        }
+
+        if (sb.toString().length() > 0) {
+            status.set("-1");
+            info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+        }
+    }
+
+    /**
+     * 记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+     *
+     * @param docAdvStruct
+     * @param antibioticDateTimes
+     */
+    private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
+        String drugName;
+        String startDateStr;
+        Date startDate;
+        Map<Date, Integer> antibioticDateTime;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = StringUtil.parseDateTime(startDateStr);
+            if (antibioticDateTimes.containsKey(drugName)) {
+                Map<Date, Integer> map = antibioticDateTimes.get(drugName);
+                if (map.containsKey(startDate)) {
+                    map.put(startDate, map.get(startDate) + 1);
+                } else {
+                    map.put(startDate, 0);
+                }
+            } else {
+                antibioticDateTime = Maps.newHashMap();
+                antibioticDateTime.put(startDate, 0);
+                antibioticDateTimes.put(drugName, antibioticDateTime);
+            }
+        }
+    }
+
+    private void getCourseDrugInfo(Map<String, Map<String, List<Double>>> antibioticWardInfo, List<Drug> drugs, String dateStr) {
+        for (Drug drug : drugs) {
+            String wardDrug = drug.getName();
+            wardDrug = removeBracket(wardDrug);
+            String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                wardDrug = drugStandardWord;
+            }
+            if (drug.getConsumption() != null) {
+                String consumption = drug.getConsumption().getName();
+                collectAntibioticInfo(antibioticWardInfo, wardDrug, consumption, dateStr);
+            }
+        }
+    }
+
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date) {
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
+    }
+
+    /**
+     * 收集抗生素各种信息
+     *
+     * @param antibioticInfo 抗生素使用量及所有时间
+     * @param drugName       抗生素名称
+     * @param value          抗生素用量
+     * @param startDateStr   抗生素使用时间(医嘱开始时间或查房时间)
+     */
+    private void collectAntibioticInfo(Map<String, Map<String, List<Double>>> antibioticInfo, String drugName, String value, String startDateStr) {
+        Map<String, List<Double>> antibioticValueList = null;
+        double v = -1;
+        try {
+            v = Double.parseDouble(getNumber(value));
+        } catch (Exception e) {
+            System.out.println("THR03076:       " + drugName + ":" + value + "解析异常");
+        }
+        if (v < 0) {
+            return;
+        }
+        if (v > 100) {
+            v = v / 1000;
+        }
+        if (!antibioticInfo.containsKey(drugName)) {
+            //存该抗生素使用第1个值
+            antibioticValueList = Maps.newLinkedHashMap();
+            antibioticValueList.put(startDateStr, Lists.newArrayList(v));
+            antibioticInfo.put(drugName, antibioticValueList);
+        } else {
+            antibioticValueList = antibioticInfo.get(drugName);
+            //存该抗生素使用时间时第n个量
+            if (antibioticValueList.containsKey(startDateStr)) {
+                antibioticValueList.get(startDateStr).add(v);
+            } else {
+                //存该抗生素使用时间时第1个量
+                antibioticValueList.put(startDateStr, Lists.newArrayList(v));
+            }
+        }
+    }
+
+    public static String getNumber(String content) {
+        String group = "";
+        String compile = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9]|\\.\\d*[1-9]|0)";
+        Pattern p = Pattern.compile(compile);
+        Matcher matcher = p.matcher(content);
+        if (matcher.find()) {
+            group = matcher.group(0);
+        }
+        return group;
+    }
+
+    /**
+     * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
+     *
+     * @param str
+     * @return
+     */
+    private String removeBracket(String str) {
+        if (str.contains("]") && str.indexOf("]") != str.length() - 1) {
+            return str.substring(str.indexOf("]") + 1);
+        }
+        return str;
+    }
+
+    private static final List<String> filterKey = Lists.newArrayList("ACF", "ID", "IG", "IM", "IP", "IV",
+            "关节腔注射", "宫颈注射", "皮下注射", "皮下注射(儿童)", "皮下注射(免费)", "皮下注射(成人)", "皮内", "皮内注射",
+            "结膜下注射", "肌注", "肌肉注射(儿童)", "肌肉注射(公卫专用)", "肌肉注射(成人)", "胸腔注射", "腹腔内注射", "腹腔注射",
+            "静滴(儿童)", "静滴(成人)", "静脉注射", "静脉注射(儿童)", "静脉注射(免费)", "静脉注射(成人)", "静脉注射(泵)",
+            "静脉滴注", "静脉滴注(泵)", "鞘内注射", "微泵");
+
+}

+ 598 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03077.java

@@ -0,0 +1,598 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaifuyou.threelevelward;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.SimilarityUtil;
+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.FirstCourseRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+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.Drug;
+import com.lantone.qc.pub.model.label.DrugLabel;
+import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @author HUJING
+ * @create 2020-08-28 14:10
+ * @desc 病程中抗生素记录不规范
+ **/
+@Component
+public class THR03077 extends QCCatalogue {
+    @Autowired
+    SimilarityUtil similarityUtil;
+
+    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;
+        }
+        Map<Date, String> extData = null;
+        if (outputInfo.getResult().get("THR02985") != null) {
+            extData = (Map<Date, String>) outputInfo.getResult().get("THR02985").get("extData");
+        }
+
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .map(DoctorAdviceDoc::getStructureMap)
+                .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("抗生素") && StringUtil.isNotBlank(x.get("医嘱单次剂量")))
+//                .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
+                .collect(Collectors.toList());
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+
+        //抗生素及开医嘱时间(包括加用过抗生素的时间)     key:抗生素名    "2020-08-20,2020-08-21 ..."
+        Map<String, List<String>> antibioticDate = Maps.newHashMap();
+        //抗生素加用集合   key:抗生素名    value:  0:未加用,1及以上:加用次数
+        Map<String, Integer> antibioticStatus = Maps.newHashMap();
+        //抗生素及各初始剂量     key:抗生素名    value:抗生素第一次使用时剂量
+        Map<String, List<Double>> antibioticValue = Maps.newHashMap();
+        //记录同一天内是否开过多次同一抗生素
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        String drugName = null, value = null, startDateStr = null;
+        Date startDate = null;
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            value = structMap.get("医嘱单次剂量");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            if (StringUtil.isNotBlank(drugName)) {
+                if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                    continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+                }
+                drugName = removeBracket(drugName).replaceAll("[^\u4e00-\u9fa5]", "");
+                //相似度标准词抓取失败,增加暂时处理
+                if (drugName.equals("克林霉素磷酸酯注射液特丽仙")) {
+                    drugName = drugName.replace("特丽仙", "");
+                }
+                String drugStandardWord = similarityUtil.getDrugStandardWord(drugName);
+                if (StringUtil.isNotBlank(drugStandardWord)) {
+                    drugName = drugStandardWord;
+                }
+
+                if (extData != null && extData.containsKey(startDate) && extData.get(startDate).equals(drugName)) {
+                    continue;   //THR02985  医嘱有抗生素使用病程无记录,规则中没报未记录的抗生素继续走这条规则,报未记录的抗生素过滤
+                }
+
+                if (Arrays.asList(KSS).contains(drugName)) {
+                    collectAntibioticInfo(antibioticDate, antibioticStatus, antibioticValue, drugName, value, startDateStr);
+                }
+            }
+        }
+
+        //把抗生素使用剂量没变化过的抗生素删除
+//        antibioticStatus.forEach((x, y) -> {
+//            if (y == 0) {
+//                antibioticDate.remove(x);
+//                antibioticValue.remove(x);
+//            }
+//        });
+        //把同一天内同一个抗生素开过多次的抗生素删除
+//        antibioticDateTimes.forEach((x, y) -> {
+//            if (y > 0) {
+//                antibioticDate.remove(x);
+//                antibioticValue.remove(x);
+//            }
+//        });
+        //抗生素加用过的集合如果为空,则一个抗生素都没有加用过,直接返回0
+        if (antibioticDate.size() == 0) {
+            return;
+        }
+
+        //病程记录中没有用量的抗生素及查房时间       key:抗生素名    "2020-08-20,2020-08-21 ..."
+        Map<String, List<String>> antibioticDateCourse = Maps.newHashMap();
+        String dateStr = null;
+        /*********************************************首程治疗计划********************************************************/
+        if (firstCourseRecordDoc != null) {
+            DrugLabel drugLabel = firstCourseRecordDoc.getDrugLabel();
+            dateStr = firstCourseRecordDoc.getStructureMap().get("病历日期");
+            if (drugLabel != null && StringUtil.isNotBlank(dateStr)) {
+                List<Drug> drugs = drugLabel.getDrugs();
+                getCourseDrugInfo(antibioticDateCourse, dateStr, drugs,
+                        CatalogueUtil.structureMapJoin(firstCourseRecordDoc.getStructureMap(), Lists.newArrayList("诊疗计划")));
+            }
+        }
+        /*********************************************查房记录********************************************************/
+        if (threeLevelWardDocs.size() > 0) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            for (ThreeLevelWardDoc doc : allDoctorWradDocs) {
+                if (doc.getThreeLevelWardLabel().size() == 0) {
+                    continue;
+                }
+                dateStr = doc.getStructureMap().get("查房日期");
+                ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
+                List<Drug> drugs = label.getDrugs();
+                getCourseDrugInfo(antibioticDateCourse, dateStr, drugs,
+                        CatalogueUtil.structureMapJoin(doc.getStructureMap(), Lists.newArrayList("病情记录", "治疗计划和措施")));
+            }
+        }
+        /*********************************************手术记录、术后首程************************************************/
+        if (operationDocs.size() > 0) {
+            //手术记录
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationRecordDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("手术时间")))
+                    .collect(Collectors.toList());
+            operationRecordDocs.forEach(x -> getCourseDrugInfo(antibioticDateCourse, x.getStructureMap().get("手术时间"), x.getOperationRecordLabel().getDrugs()
+                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术经过及处理"))));
+            //术后首程
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationDiscussionDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationDiscussionLabel().getOperativeFindings() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
+                    .collect(Collectors.toList());
+            operationDiscussionDocs.forEach(x -> getCourseDrugInfo(antibioticDateCourse, x.getStructureMap().get("病历日期"), x.getOperationDiscussionLabel().getDrugs()
+                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("手术简要经过", "术后处理措施"))));
+        }
+        /*********************************************会诊结果单********************************************************/
+        /*if (consultationDocs.size() > 0) {
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
+                    .stream()
+                    .map(ConsultationDoc::getConsultationResultsDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
+                    .collect(Collectors.toList());
+            consultationResultsDocs.forEach(x -> getCourseDrugInfo(antibioticDateCourse, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()
+                    , CatalogueUtil.structureMapJoin(x.getStructureMap(), Lists.newArrayList("会诊意见"))));
+        }*/
+        /*********************************************出院小结********************************************************/
+//        if (leaveHospitalDoc != null) {
+//            LeaveHospitalLabel leaveHospitalLabel = leaveHospitalDoc.getLeaveHospitalLabel();
+//            if (inputInfo.getMedicalRecordInfoDoc() != null) {
+//                Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+//                dateStr = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+//                //如果存在出院小结,出院日期为空,存储系统当前时间
+//                if (StringUtil.isBlank(dateStr)) {
+//                    dateStr = DateUtil.formatDateTime(new Date());
+//                }
+//            }
+//            if (leaveHospitalLabel != null && StringUtil.isNotBlank(dateStr)) {
+//                List<Drug> drugs = leaveHospitalLabel.getDrugs();
+//                getCourseDrugInfo(antibioticDateCourse, dateStr, drugs
+//                        , CatalogueUtil.structureMapJoin(leaveHospitalDoc.getStructureMap(), Lists.newArrayList("诊治经过")));
+//            }
+//        }
+        //将病程日期排序
+        antibioticDateCourse.forEach((x, y) -> y.sort(Comparator.naturalOrder()));
+
+        /**
+         * 1.antibioticDate:从医嘱中取   key:抗生素名    value:医嘱中该抗生素所有剂量变化的时间(包括初始使用时间)
+         * 2.antibioticDateWard:从查房记录中取     key:抗生素名    value:病程记录中该抗生素所有没有用量时的查房时间(包括初始使用时间)
+         * 3.医嘱中该抗生素初始使用时间往后两天内,查房记录中出现该抗生素并且该抗生素没有用量,报出该抗生素
+         */
+        StringBuffer sb = new StringBuffer();
+        String drugKey = null, start = null, change = null, wardStartStr = null, wardChangeStr = null;
+        List<String> dateList = null;
+        for (Map.Entry<String, List<String>> ad : antibioticDate.entrySet()) {
+            drugKey = ad.getKey();
+            drugKey = removeBracket(drugKey).replaceAll("[^\u4e00-\u9fa5]", "");
+            String drugStandardWord = similarityUtil.getDrugStandardWord(drugKey);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                drugKey = drugStandardWord;
+            }
+            if (antibioticDateCourse.containsKey(drugKey)) {
+                dateList = ad.getValue();
+                List<String> wardDateStr = antibioticDateCourse.get(drugKey);
+                for (int i = 0; i < dateList.size(); i++) {
+                    start = dateList.get(i);        //抗生素开医嘱时间
+                    Date adStart = DateUtil.dateZeroClear(StringUtil.parseDateTime(start));
+                    for (int j = 0; j < wardDateStr.size(); j++) {
+                        wardStartStr = wardDateStr.get(j);         //查房记录开抗生素时间
+                        wardStartStr = wardStartStr.split("=")[0];
+                        Date wardStart = StringUtil.parseDateTime(wardStartStr);
+                        if ((adStart.before(wardStart) && !CatalogueUtil.compareTime(adStart, wardStart, 48 * 60L))
+                                || (wardStart.before(adStart) && !CatalogueUtil.compareTime(wardStart, adStart, 24 * 60L)) ||
+                                DateUtils.isSameDay(wardStart, adStart)) {
+                            infoAppend(sb, ad.getKey(), start, wardDateStr.get(j).split("=")[1]);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+        if (sb.toString().length() > 0) {
+            status.set("-1");
+            info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+        }
+    }
+
+    /**
+     * 记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+     *
+     * @param docAdvStruct
+     * @param antibioticDateTimes
+     */
+    private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
+        String drugName;
+        String startDateStr;
+        Date startDate;
+        Map<Date, Integer> antibioticDateTime;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+            if (antibioticDateTimes.containsKey(drugName)) {
+                Map<Date, Integer> map = antibioticDateTimes.get(drugName);
+                if (map.containsKey(startDate)) {
+                    map.put(startDate, map.get(startDate) + 1);
+                } else {
+                    map.put(startDate, 0);
+                }
+            } else {
+                antibioticDateTime = Maps.newHashMap();
+                antibioticDateTime.put(startDate, 0);
+                antibioticDateTimes.put(drugName, antibioticDateTime);
+            }
+        }
+    }
+
+    List<String> usageWords = Lists.newArrayList("WB", "wb", "泵", "静滴");
+
+    /**
+     * 收集各模块药品信息
+     *
+     * @param antibioticDateWard 病程中没有用量+用法+频率的抗生素使用所有时间
+     * @param dateStr            记录日期
+     * @param drugs              模型提取出的药品列表
+     */
+    private void getCourseDrugInfo(Map<String, List<String>> antibioticDateWard, String dateStr, List<Drug> drugs, String content) {
+        StringBuffer sb = null;
+        for (Drug drug : drugs) {
+            sb = new StringBuffer();
+            String behindWord = "";
+            String lastBehindWord = "";
+            String keyword = "";
+            String lastKeyword = "";
+            String wardDrug = drug.getName();
+            boolean front = false;
+            boolean latter = false;
+            int position = content.indexOf(wardDrug);
+            int lastPosition = content.lastIndexOf(wardDrug);
+            if (position != -1 && lastPosition != -1) {
+                keyword = content.substring(Math.max(0, position - 10), position);
+                lastKeyword = content.substring(Math.max(0, lastPosition - 10), lastPosition);
+                if (position != lastPosition) {
+                    if (lastKeyword.contains("继续") || lastKeyword.contains("停")) {
+                        continue;
+                    }
+                }
+                if (keyword.contains("继续") || keyword.contains("停")) {
+                    continue;
+                }
+                if (frequencyDispose(keyword) || frequencyDispose(lastKeyword)) {
+                    front = true;
+                }
+
+                behindWord = content.substring(position, Math.min(position + 20, content.toCharArray().length));
+                lastBehindWord = content.substring(lastPosition, Math.min(lastPosition + 20, content.toCharArray().length));
+                if (behindWord != lastBehindWord) {
+                    if (lastBehindWord.contains("阴性")) {
+                        continue;
+                    }
+                }
+                if (behindWord.contains("阴性")) {
+                    continue;
+                }
+                if (frequencyDispose(behindWord) || frequencyDispose(lastBehindWord)) {
+                    latter = true;
+                }
+            }
+            wardDrug = removeBracket(wardDrug);
+            String drugUsageWard = wardDrug;
+            String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
+            if (StringUtil.isNotBlank(drugStandardWord)) {
+                wardDrug = drugStandardWord;
+            }
+            if (drug.getConsumption() == null) {
+                if (StringUtil.isBlank(behindWord)) {
+                    concatInfo(dateStr, sb, "用量");
+                } else {
+                    if (!hasDigit(behindWord) && !hasDigit(lastBehindWord)) {
+                        concatInfo(dateStr, sb, "用量");
+                    }
+                }
+            }
+
+            int index = content.indexOf(drugUsageWard);
+            String drugContent = content.substring(Math.max(0, index));
+            boolean isUsage = true;
+            if (drug.getUsageWardRound() == null) {
+                for (String word : usageWords) {
+                    if (drugContent.contains(word)) {
+                        isUsage = false;
+                        break;
+                    }
+                }
+                if (isUsage) {
+                    concatInfo(dateStr, sb, "用法");
+                }
+            }
+            if (drug.getFrequency() == null) {
+                if (!front && !latter) {
+                    concatInfo(dateStr, sb, "频率");
+                }
+            }
+            if (sb.toString().length() > 0) {
+                if (antibioticDateWard.containsKey(wardDrug)) {
+                    antibioticDateWard.get(wardDrug).add(sb.toString());
+                } else {
+                    antibioticDateWard.put(wardDrug, Lists.newArrayList(sb.toString()));
+                }
+            } else {
+                if (antibioticDateWard.containsKey(wardDrug)) {
+                    for (String wardDate : antibioticDateWard.get(wardDrug)) {
+                        wardDate = wardDate.substring(0, wardDate.indexOf("="));
+                        if (wardDate.equals(dateStr)) {
+                            antibioticDateWard.remove(wardDrug);
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 判断一个字符串是否含有数字
+     *
+     * @param content
+     */
+    public boolean hasDigit(String content) {
+        boolean flag = false;
+        Pattern p = Pattern.compile(".*\\d+.*");
+        Matcher m = p.matcher(content);
+        if (m.matches()) {
+            flag = true;
+        }
+        return flag;
+    }
+
+    /**
+     * 增加频率的处理
+     *
+     * @param content
+     */
+    public boolean frequencyDispose(String content) {
+        if (StringUtil.isNotBlank(content) &&
+                (content.contains("术前") || content.contains("术后") || content.contains("围手术期"))) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 拼接抗生素缺失信息
+     *
+     * @param dateStr
+     * @param sb
+     */
+    private void concatInfo(String dateStr, StringBuffer sb, String missType) {
+        if (sb.toString().contains("=")) {
+            sb.append(",").append(missType);
+        } else {
+            sb.append(dateStr).append("=").append(missType);
+        }
+    }
+
+    /**
+     * 收集抗生素各种信息
+     *
+     * @param antibioticDate   抗生素使用所有时间
+     * @param antibioticStatus 抗生素用量改变状态
+     * @param antibioticValue  抗生素及用量
+     * @param drugName         抗生素名称
+     * @param value            抗生素用量
+     * @param startDateStr     抗生素使用时间(医嘱开始时间或查房时间)
+     */
+    private void collectAntibioticInfo(Map<String, List<String>> antibioticDate, Map<String, Integer> antibioticStatus,
+                                       Map<String, List<Double>> antibioticValue, String drugName, String value, String startDateStr) {
+        double v = -1;
+        try {
+            v = Double.parseDouble(getNumber(value));
+        } catch (Exception e) {
+            System.out.println("THR03077:       " + drugName + ":" + value + "解析异常");
+        }
+        if (v < 0) {
+            return;
+        }
+        if (v > 100) {
+            v = v / 1000;
+        }
+        if (!antibioticValue.containsKey(drugName)) {
+            antibioticValue.put(drugName, Lists.newArrayList(v));
+            antibioticDate.put(drugName, Lists.newArrayList(startDateStr));
+            antibioticStatus.put(drugName, 0);
+        } else {
+            //1.如果抗生素剂量有变化,则记录该抗生素开始时间
+            List<Double> beforeValue = antibioticValue.get(drugName);
+            if (beforeValue.get(beforeValue.size() - 1) != v) {
+                beforeValue.add(v);
+                antibioticValue.put(drugName, beforeValue);//添加该抗生素更大的值
+                antibioticStatus.put(drugName, antibioticStatus.get(drugName) + 1);
+                antibioticDate.get(drugName).add(startDateStr);
+                return;
+            }
+            //2.如果抗生素剂量两次开启的时间间隔相差3天,也记录该抗生素开始时间
+            List<String> currentAntibioticDate = antibioticDate.get(drugName);
+            if (currentAntibioticDate.size() > 0) {
+                String lastDate = currentAntibioticDate.get(currentAntibioticDate.size() - 1);
+                if (CatalogueUtil.compareTime(StringUtil.parseDateTime(lastDate), StringUtil.parseDateTime(startDateStr), 72 * 60L)) {
+                    beforeValue.add(v);
+                    antibioticValue.put(drugName, beforeValue);//添加该抗生素值
+                    antibioticStatus.put(drugName, antibioticStatus.get(drugName) + 1);
+                    antibioticDate.get(drugName).add(startDateStr);
+                }
+            }
+        }
+    }
+
+    public static String getNumber(String content) {
+        String group = "";
+        String compile = "([1-9]\\d*\\.?\\d*)|(0\\.\\d*[1-9]|\\.\\d*[1-9]|0)";
+        Pattern p = Pattern.compile(compile);
+        Matcher matcher = p.matcher(content);
+        if (matcher.find()) {
+            group = matcher.group(0);
+        }
+        return group;
+    }
+
+    /**
+     * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
+     *
+     * @param str
+     * @return
+     */
+    private String removeBracket(String str) {
+        if (str.contains("]") && str.indexOf("]") != str.length() - 1) {
+            return str.substring(str.indexOf("]") + 1);
+        }
+        return str;
+    }
+
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date, String missType) {
+        sb.append(drugKey).append("(").append(DateUtil.formatDate(StringUtil.parseDateTime(date)))
+                .append(",").append(missType).append(")").append("、");
+    }
+
+    private static final String[] KSS = {
+            "万古霉素",
+            "两性霉素B",
+            "亚胺培南西司他丁",
+            "伊曲康唑",
+            "伏立康唑",
+            "依替米星氯化钠",
+            "克拉霉素",
+            "克林霉素",
+            "利奈唑胺",
+            "利奈唑胺葡萄糖",
+            "利福昔明",
+            "制霉菌素",
+            "卡泊芬净",
+            "厄他培南",
+            "吗啉硝唑氯化钠",
+            "呋喃唑酮",
+            "哌拉西林他唑巴坦",
+            "复方磺胺甲噁唑",
+            "多粘菌素B",
+            "多西环素",
+            "夫西地酸",
+            "头孢丙烯",
+            "头孢他啶",
+            "头孢他啶阿维巴坦",
+            "头孢他美酯",
+            "头孢克洛",
+            "头孢克肟",
+            "头孢吡肟",
+            "头孢呋辛",
+            "头孢哌酮舒巴坦",
+            "头孢唑林",
+            "头孢噻肟",
+            "头孢地嗪",
+            "头孢地尼",
+            "头孢拉定",
+            "头孢曲松",
+            "头孢替安",
+            "头孢美唑",
+            "头孢西丁",
+            "奥硝唑",
+            "妥布霉素",
+            "妥布霉素地塞米松",
+            "左氧氟沙星",
+            "左氧氟沙星氯化钠",
+            "庆大霉素",
+            "异帕米星",
+            "拉氧头孢",
+            "替加环素",
+            "替硝唑",
+            "替考拉宁",
+            "比阿培南",
+            "氟康唑",
+            "氟康唑氯化钠",
+            "氟胞嘧啶",
+            "氨曲南",
+            "氨苄西林",
+            "泊沙康唑",
+            "特比萘芬",
+            "甲硝唑",
+            "甲硝唑氯化钠",
+            "磷霉素",
+            "磷霉素氨丁三醇",
+            "米卡芬净",
+            "米诺环素",
+            "红霉素",
+            "美罗培南",
+            "苄星青霉素",
+            "莫西沙星",
+            "莫西沙星氯化钠",
+            "达托霉素",
+            "阿奇霉素",
+            "阿奇霉素枸橼酸二氢钠",
+            "阿洛西林",
+            "阿米卡星",
+            "阿莫西林",
+            "阿莫西林克拉维酸",
+            "青霉素"
+    };
+
+    private static final List<String> filterKey = Lists.newArrayList("ACF", "ID", "IG", "IM", "IP", "IV",
+            "关节腔注射", "宫颈注射", "皮下注射", "皮下注射(儿童)", "皮下注射(免费)", "皮下注射(成人)", "皮内", "皮内注射",
+            "结膜下注射", "肌注", "肌肉注射(儿童)", "肌肉注射(公卫专用)", "肌肉注射(成人)", "胸腔注射", "腹腔内注射", "腹腔注射",
+            "静滴(儿童)", "静滴(成人)", "静脉注射", "静脉注射(儿童)", "静脉注射(免费)", "静脉注射(成人)", "静脉注射(泵)",
+            "静脉滴注", "静脉滴注(泵)", "鞘内注射", "微泵");
+
+}

+ 8 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaifuyou/threelevelward/THR03090.java

@@ -6,8 +6,8 @@ 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.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -41,6 +41,13 @@ public class THR03090 extends QCCatalogue {
         if (operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc() != null) {
             Map<String, String> operationDocStructureMap = operationDocs.get(operationDocs.size() - 1).getOperationRecordDoc().getStructureMap();
             operationStartDate = operationDocStructureMap.get("手术开始时间");
+            if (StringUtil.isBlank(operationStartDate) && StringUtil.isNotBlank(operationDocStructureMap.get("胎儿娩出"))) {
+                operationStartDate = CommonAnalysisUtil.NHExtractDate(operationDocStructureMap.get("胎儿娩出").replace(".", "-"));
+            }
+        }
+        //手术时间为空,则不质控
+        if (StringUtil.isBlank(operationStartDate)) {
+            return;
         }
 
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/behospitalized/BEH0439.java

@@ -33,7 +33,7 @@ public class BEH0439 extends QCCatalogue {
             if (birthDate_bh != null && birthDate_fpr != null) {
                 if (!CatalogueUtil.isEmpty(birthDate_bh) && !CatalogueUtil.isEmpty(birthDate_fpr)) {
                     if(!DateUtils.isSameInstant(StringUtil.parseDateTime(birthDate_bh, dateFormats)
-                            ,StringUtil.parseDateTime(birthDate_fpr, dateFormats)))
+                            , StringUtil.parseDateTime(birthDate_fpr, dateFormats)))
                     {
                         status.set("-1");
                     }

+ 81 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/firstpagerecord/FIRP0250.java

@@ -0,0 +1,81 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaiyiyi.firstpagerecord;
+
+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.RescueDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : FIRP0250
+ * @Description : 抢救成功次数填写错误
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28ss
+ */
+@Component
+public class FIRP0250 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getRescueDocs().size() > 0) {
+            List<RescueDoc> rescueDocs = inputInfo.getRescueDocs();
+            int rescueNum = getRescueNum(rescueDocs);/* 抢救记录中抢救成功次数 */
+            boolean match = false;
+
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String successfulRescueTimes = firstpageStructureMap.get("病人抢救成功次数");
+            int successfulRescueTimesTZ = 0;
+            if (StringUtil.isNotBlank(successfulRescueTimes) && CatalogueUtil.numbersOnly(successfulRescueTimes)) {
+                successfulRescueTimesTZ = Integer.parseInt(successfulRescueTimes);
+            }
+            if (rescueNum == successfulRescueTimesTZ) {
+                match = true;
+            }
+            String saveNum = firstpageStructureMap.get("病人抢救次数");
+            if (successfulRescueTimes == saveNum) {
+                match = true;
+            }
+            String name = firstpageStructureMap.get(Content.rescue_condition);
+            if (StringUtil.isNotBlank(name)) {
+                String[] split = name.split("\\s+");
+                Pattern compile = Pattern.compile("(?<=成功).*(?=次)");
+                Matcher matcher = compile.matcher(split[0]);
+                while (matcher.find()) {
+                    try {
+                        String number = matcher.group(0);
+                        int num = Integer.parseInt(number);
+                        if (num == rescueNum) {
+                            match = true;
+                        }
+                    } catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+
+            if (!match) {
+                status.set("-1");
+            }
+        }
+    }
+
+    private int getRescueNum(List<RescueDoc> rescueDocs) {
+        int i = 0;
+        for (RescueDoc re : rescueDocs) {
+            Map<String, String> structureMap = re.getStructureMap();
+            // 跟医学部确认,从抢救措施中读取数据
+            String qjgc = structureMap.get("抢救内容");
+            if (StringUtil.isNotBlank(qjgc) && !qjgc.contains("死亡")) {
+                i++;
+            }
+        }
+        return i;
+    }
+}

+ 3 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR0125.java

@@ -89,15 +89,13 @@ public class THR0125 extends QCCatalogue {
             }
 
             //===========三级医师相当于主治医生==========
-            List<ThreeLevelWardDoc>  allDoctorWradDocs =  threeLevelWardDoc.getAllDoctorWradDocs();
-            if(allDoctorWradDocs.size()>0)
-            {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+            if (allDoctorWradDocs.size() > 0) {
 
                 for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
                     Map<String, String> structureMap = threeLevelWard.getStructureMap();
                     String makeTitle = structureMap.get("查房标题");
-                    if(StringUtil.isNotBlank(makeTitle)&&makeTitle.contains("三级"))
-                    {
+                    if (StringUtil.isNotBlank(makeTitle) && makeTitle.contains("三级")) {
                         String recordDateStr = structureMap.get("查房日期");
                         if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime),
                                 StringUtil.parseDateTime(recordDateStr), 72 * 60L)) {

+ 4 - 6
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR0126.java

@@ -107,15 +107,13 @@ public class THR0126 extends QCCatalogue {
                 return;
             }
             //===========三级医师相当于主治医生==========
-            List<ThreeLevelWardDoc>  allDoctorWradDocs =  threeLevelWardDoc.getAllDoctorWradDocs();
-            if(allDoctorWradDocs.size()>0)
-            {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
+            if (allDoctorWradDocs.size() > 0) {
 
                 for (ThreeLevelWardDoc threeLevelWard : allDoctorWradDocs) {
                     Map<String, String> structureMap = threeLevelWard.getStructureMap();
                     String makeTitle = structureMap.get("查房标题");
-                    if(StringUtil.isNotBlank(makeTitle)&&makeTitle.contains("三级"))
-                    {
+                    if (StringUtil.isNotBlank(makeTitle) && makeTitle.contains("三级")) {
                         String recordDateStr = structureMap.get("查房日期");
                         if (!CatalogueUtil.compareTime(StringUtil.parseDateTime(admisTime),
                                 StringUtil.parseDateTime(recordDateStr), 48 * 60L)) {
@@ -164,7 +162,7 @@ public class THR0126 extends QCCatalogue {
         }
     }
 
-//    /**
+    //    /**
 //     * 判断查房记录是否含有主治医师查房
 //     *
 //     * @param operatorName     主刀医师

+ 508 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR02985.java

@@ -0,0 +1,508 @@
+package com.lantone.qc.kernel.catalogue.hospital.ninghaiyiyi.threelevelward;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.kernel.util.SimilarityUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.*;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+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.Drug;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.time.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : THR02985
+ * @Description : 医嘱有抗生素使用病程无记录
+ * 药品类型(0.普药 1.抗生素 2.激素)
+ * @Author : 胡敬
+ * @Date: 2020-06-23 10:04
+ */
+@Component
+public class THR02985 extends QCCatalogue {
+    @Autowired
+    SimilarityUtil similarityUtil;
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        if (doctorAdviceDocs.size() == 0) {
+            return;
+        }
+
+        List<Map<String, String>> docAdvStruct = doctorAdviceDocs
+                .stream()
+                .filter(Objects::nonNull)
+                .map(DoctorAdviceDoc::getStructureMap)
+                .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("抗生素"))
+//                .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
+                .collect(Collectors.toList());
+
+        docAdvStruct.removeIf(x -> StringUtil.isNotBlank(x.get("给药方式")) && !filterKey.contains(x.get("给药方式")));
+        //记录同一天内是否开过多次同一抗生素
+        Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
+        //记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+        getAntibioticTimes(docAdvStruct, antibioticDateTimes);
+        Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
+        Date startDate = null;
+        for (Map<String, String> adviceDoc : docAdvStruct) {
+            String drugName = adviceDoc.get("医嘱项目名称");
+            String startDateStr = adviceDoc.get("医嘱开始时间");
+            if (StringUtil.isNotBlank(drugName)) {
+                startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//                startDate = StringUtil.parseDateTime(startDateStr);
+                if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
+                    continue;   //一天内同一抗生素开过多次的抗生素直接过滤
+                }
+                drugName = removeBracket(drugName).replaceAll("[^\u4e00-\u9fa5]", "");
+                String drugStandardWord = similarityUtil.getDrugStandardWord(drugName);
+                if (StringUtil.isNotBlank(drugStandardWord)) {
+                    drugName = drugStandardWord;
+                }
+                if (Arrays.asList(KSS).contains(drugName)) {
+                    doctorAdviceDrugMap.put(startDate, adviceDoc.get("医嘱项目名称"));
+                }
+            }
+        }
+
+        Map<String, Date> info = Maps.newLinkedHashMap();
+        Map<String, List<Drug>> infoModel = Maps.newLinkedHashMap();
+        String dateStr = null;
+        //入院记录中获取信息
+        /*if (beHospitalizedDoc != null) {
+            Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
+            getInfo(info, structureMap, "入院记录", "入院日期", "治疗计划");
+        }*/
+        //从首程治疗计划中获取信息
+        if (firstCourseRecordDoc != null) {
+            getInfo(info, firstCourseRecordDoc.getStructureMap(), "首次病程录", "病历日期", "诊疗计划");
+            if (firstCourseRecordDoc.getDrugLabel() != null) {
+                List<Drug> drugs = firstCourseRecordDoc.getDrugLabel().getDrugs();
+                dateStr = firstCourseRecordDoc.getStructureMap().get("病历日期");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
+        }
+
+        //从查房记录中获取信息
+        if (threeLevelWardDocs.size() > 0) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+            List<ThreeLevelWardDoc> wardDocs = allDoctorWradDocs
+                    .stream()
+                    .filter(x -> StringUtil.isNotBlank(x.getStructureMap().get("查房日期")) && x.getThreeLevelWardLabel().size() > 0)
+                    .collect(Collectors.toList());
+            wardDocs.forEach(x -> getInfo(info, x.getStructureMap(), "查房记录", "查房日期", "病情记录", "治疗计划和措施"));
+            wardDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("查房日期"), x.getThreeLevelWardLabel().get(x.getThreeLevelWardLabel().size() - 1).getDrugs()));
+        }
+        //从手术记录中获取信息
+        if (operationDocs.size() > 0) {
+            //手术记录
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationRecordDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("手术时间")))
+                    .collect(Collectors.toList());
+            operationRecordDocs.forEach(x -> getInfo(info, x.getStructureMap(), "手术记录", "手术时间", "手术经过及处理"));
+            operationRecordDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("手术时间"), x.getOperationRecordLabel().getDrugs()));
+            //术后首程
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
+                    .stream()
+                    .map(OperationDoc::getOperationDiscussionDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
+                    .collect(Collectors.toList());
+            operationDiscussionDocs.forEach(x -> getInfo(info, x.getStructureMap(), "术后首程", "病历日期", "手术简要经过", "术后处理措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("病历日期"), x.getOperationDiscussionLabel().getDrugs()));
+        }
+
+        //从会诊记录中获取信息
+        /*if (consultationDocs.size() > 0) {
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
+                    .stream()
+                    .map(ConsultationDoc::getConsultationResultsDoc)
+                    .filter(Objects::nonNull)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
+                    .collect(Collectors.toList());
+            consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
+        }*/
+
+        //从出院小结中获取信息
+        if (leaveHospitalDoc != null) {
+            if (inputInfo.getMedicalRecordInfoDoc() != null) {
+                Map<String, String> medicalRecordInfoStructureMap = inputInfo.getMedicalRecordInfoDoc().getStructureMap();
+                dateStr = medicalRecordInfoStructureMap.get("leaveHospitalDate");
+                //如果存在出院小结,出院日期为空,存储系统当前时间
+                if (StringUtil.isBlank(dateStr)) {
+                    dateStr = DateUtil.formatDateTime(new Date());
+                }
+            }
+            if (StringUtil.isNotBlank(dateStr)) {
+                if (leaveHospitalDoc.getLeaveHospitalLabel() != null) {
+                    List<Drug> drugs = leaveHospitalDoc.getLeaveHospitalLabel().getDrugs();
+                    getDischargeInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", dateStr, "诊治经过");
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
+        }
+
+        StringBuffer sb = new StringBuffer();
+        Map<Object, Object> data = Maps.newHashMap();
+        Set<String> existDrug = Sets.newHashSet();
+        String infoStr = "";
+        for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
+            Date doctorAdviceDate = doctorAdviceDrug.getKey();
+            String drugs = doctorAdviceDrug.getValue();
+            if (drugs.contains(" ")) {
+                drugs = drugs.split(" ")[0];
+            }
+//            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
+            Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
+                    .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
+            /**********************************************先文本匹配************************************************/
+            String missDrug = "";
+            for (Map.Entry<String, Date> map : info.entrySet()) {
+                missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug, existDrug);
+                //当前抗生素药(drugs)在info中已找到,直接跳出当前循环
+                if (StringUtil.isBlank(missDrug)) {
+                    break;
+                }
+            }
+            if (StringUtil.isBlank(missDrug)) {
+                continue;
+            }
+            /**********************************************文本匹配没有找到药,再走模型************************************************/
+            boolean modelFind = false;
+            for (Map.Entry<String, List<Drug>> modelMap : infoModel.entrySet()) {
+                dateStr = modelMap.getKey();
+                List<Drug> diags = modelMap.getValue();
+                Date date = StringUtil.parseDateTime(dateStr);
+                //医嘱开始时间往后2天或往前一天找药
+                if ((doctorAdviceDate.before(date) && !CatalogueUtil.compareTime(doctorAdviceDate, date, 48 * 60L))
+                        || (date.before(doctorAdviceDate) && !CatalogueUtil.compareTime(date, doctorAdviceDate, 24 * 60L))) {
+                    for (String adDrug : splitDrugs) {
+                        for (Drug courseDrug : diags) {
+                            if (compareStandard(courseDrug.getName(), adDrug)) {
+                                modelFind = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+                if (modelFind) {
+                    break;
+                }
+            }
+
+            if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
+                infoAppend(sb, drugs, DateUtil.formatDateTime(doctorAdviceDate));
+                data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
+            }
+        }
+        if (StringUtil.isNotBlank(sb.toString())) {
+            this.status.set("-1");
+            this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
+            extData.set(data);
+        }
+    }
+
+    /**
+     * 记录同一抗生素同一天内是否开过多次,用于医嘱中需要处理的抗生素过滤(一天内同一抗生素开过多次的抗生素直接过滤)
+     *
+     * @param docAdvStruct
+     * @param antibioticDateTimes
+     */
+    private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
+        String drugName;
+        String startDateStr;
+        Date startDate;
+        Map<Date, Integer> antibioticDateTime;
+        for (Map<String, String> structMap : docAdvStruct) {
+            drugName = structMap.get("医嘱项目名称");
+            startDateStr = structMap.get("医嘱开始时间");
+            startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
+//            startDate = StringUtil.parseDateTime(startDateStr);
+            if (antibioticDateTimes.containsKey(drugName)) {
+                Map<Date, Integer> map = antibioticDateTimes.get(drugName);
+                if (map.containsKey(startDate)) {
+                    map.put(startDate, map.get(startDate) + 1);
+                } else {
+                    map.put(startDate, 0);
+                }
+            } else {
+                antibioticDateTime = Maps.newHashMap();
+                antibioticDateTime.put(startDate, 0);
+                antibioticDateTimes.put(drugName, antibioticDateTime);
+            }
+        }
+    }
+
+    /**
+     * 获取各模块信息<入院记录、首次病程录、手术记录、术后首程、会诊结果单、查房记录>
+     *
+     * @param structureMap
+     * @param info
+     */
+    private void getInfo(Map<String, Date> info, Map<String, String> structureMap, String modelType, String dateKey, String... contentKey) {
+        String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList(contentKey));
+        String recordDateStr = structureMap.get(dateKey);
+        if (StringUtil.isNotBlank(recordDateStr)) {
+            Date date = StringUtil.parseDateTime(recordDateStr);
+            if (StringUtil.isNotBlank(content) && date != null) {
+                info.put(modelType + "->" + content, date);
+            }
+        }
+    }
+
+    /**
+     * 获取出院小结模块信息
+     *
+     * @param structureMap
+     * @param info
+     */
+    private void getDischargeInfo(Map<String, Date> info, Map<String, String> structureMap, String modelType, String dateStr, String... contentKey) {
+        String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList(contentKey));
+        if (StringUtil.isNotBlank(dateStr)) {
+            Date date = StringUtil.parseDateTime(dateStr);
+            if (StringUtil.isNotBlank(content) && date != null) {
+                info.put(modelType + "->" + content, date);
+            }
+        }
+    }
+
+    private void getInfo(Map<String, List<Drug>> info, String dateKey, List<Drug> drugs) {
+        List<Drug> tempDrugs = new ArrayList<>();
+        if (null != drugs && drugs.size() > 0) {
+            for (Drug drug : drugs) {
+                if (null != drug.getConsumption() && !drug.getConsumption().getName().contains("mg/Kg")) {
+                    tempDrugs.add(drug);
+                }
+            }
+        }
+        if (info.containsKey(dateKey)) {
+            info.get(dateKey).addAll(tempDrugs);
+        } else {
+            info.put(dateKey, tempDrugs);
+        }
+    }
+
+    /**
+     * 核心:从文本中找药
+     *
+     * @param content          文本
+     * @param wardDate
+     * @param doctorAdviceDate
+     * @param drugs
+     * @param days
+     * @return 如果文本中找到该药,则返回空字符串
+     */
+    private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug, Set<String> existDrug) {
+        if ("时间不匹配".equals(missDrug)) {
+            missDrug = "";//初始化缺失药物
+        }
+        //开医嘱时间起,昨天今天明天记录内查找药
+        if ((doctorAdviceDate.before(wardDate) && !CatalogueUtil.compareTime(doctorAdviceDate, wardDate, days * 24 * 60L))
+                || (wardDate.before(doctorAdviceDate) && !CatalogueUtil.compareTime(wardDate, doctorAdviceDate, 24 * 60L)) ||
+                DateUtils.isSameDay(wardDate, doctorAdviceDate)) {
+            boolean findDrug = false;
+            String standardDrug = null;
+            for (String drug : drugs) {
+                if (StringUtil.isBlank(drug)) {
+                    continue;
+                }
+                drug = drug.replaceAll("[^\\u4e00-\\u9fa5]", "");
+                standardDrug = similarityUtil.getDrugStandardWord(drug);
+                if (content.contains(drug) || (StringUtil.isNotBlank(content) && StringUtil.isNotBlank(standardDrug) && content.contains(standardDrug))
+                        || (existDrug.contains(drug) && (regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
+                        || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前") || regexFind(content, "治疗同前")))) {
+                    findDrug = true;
+                    existDrug.add(drug);
+                    break;
+                } else {
+                    missDrug = concatInfo(missDrug, drug);
+                }
+            }
+            if (findDrug) {
+                missDrug = "";//如果找到一种抗生素药,就把报错信息置为空
+            }
+        } else {
+            if (StringUtil.isBlank(missDrug)) {
+                missDrug = "时间不匹配";
+            }
+        }
+        return missDrug;
+    }
+
+    private String concatInfo(String infoStr, String content) {
+        if (StringUtil.isBlank(infoStr)) {
+            infoStr += content;
+        } else {
+            if (!infoStr.contains(content)) {
+                infoStr += "或" + content;
+            }
+        }
+        return infoStr;
+    }
+
+    private boolean regexFind(String content, String... str) {
+        String s = "";
+        for (String word : str) {
+            s += word + ".*";
+        }
+        s = s.substring(0, s.lastIndexOf(".*"));
+        Pattern p = Pattern.compile(s);
+        Matcher m = p.matcher(content);
+        return m.find();
+    }
+
+    /**
+     * 比较两个抗生素标准词是否一致
+     *
+     * @param firstWord
+     * @param secordWord
+     * @return
+     */
+    private boolean compareStandard(String firstWord, String secordWord) {
+        if (StringUtil.isBlank(firstWord) || StringUtil.isBlank(secordWord)) {
+            return false;
+        }
+        String drugStandardWord1 = similarityUtil.getDrugStandardWord(firstWord);
+        String drugStandardWord2 = similarityUtil.getDrugStandardWord(secordWord);
+        if (drugStandardWord1 == null || drugStandardWord2 == null) {
+            return firstWord.equals(secordWord) || firstWord.contains(secordWord) || secordWord.contains(firstWord);
+        }
+        return drugStandardWord1.equals(drugStandardWord2);
+    }
+
+    /**
+     * 如果文本包含中括号([海正]美罗培南针),取括号之后的文字
+     *
+     * @param str
+     * @return
+     */
+    private String removeBracket(String str) {
+        if (str.contains("]") && str.indexOf("]") != str.length() - 1) {
+            return str.substring(str.indexOf("]") + 1);
+        }
+        return str;
+    }
+
+    /**
+     * 拼接提示信息
+     *
+     * @param sb
+     * @param drugKey
+     * @param date
+     */
+    private void infoAppend(StringBuffer sb, String drugKey, String date) {
+        sb.append(drugKey).append("(").append(date).append(")").append("_");
+    }
+
+    private static final List<String> filterKey = Lists.newArrayList("ACF", "ID", "IG", "IM", "IP", "IV",
+            "关节腔注射", "宫颈注射", "皮下注射", "皮下注射(儿童)", "皮下注射(免费)", "皮下注射(成人)", "皮内", "皮内注射",
+            "结膜下注射", "肌注", "肌肉注射(儿童)", "肌肉注射(公卫专用)", "肌肉注射(成人)", "胸腔注射", "腹腔内注射", "腹腔注射",
+            "静滴(儿童)", "静滴(成人)", "静脉注射", "静脉注射(儿童)", "静脉注射(免费)", "静脉注射(成人)", "静脉注射(泵)",
+            "静脉滴注", "静脉滴注(泵)", "鞘内注射", "微泵");
+
+    private static final String[] KSS = {
+            "万古霉素",
+            "两性霉素B",
+            "亚胺培南西司他丁",
+            "伊曲康唑",
+            "伏立康唑",
+            "依替米星",
+            "克拉霉素",
+            "克林霉素",
+            "利奈唑胺",
+            "利奈唑胺葡萄糖",
+            "利福昔明",
+            "制霉菌素",
+            "卡泊芬净",
+            "厄他培南",
+            "吗啉硝唑",
+            "呋喃唑酮",
+            "哌拉西林他唑巴坦",
+            "磺胺甲恶唑",
+            "多粘菌素B",
+            "多西环素",
+            "夫西地酸",
+            "头孢丙烯",
+            "头孢他啶",
+            "头孢他啶阿维巴坦",
+            "头孢他美酯",
+            "头孢克洛",
+            "头孢克肟",
+            "头孢吡肟",
+            "头孢呋辛",
+            "头孢哌酮舒巴坦",
+            "头孢唑林",
+            "头孢噻肟",
+            "头孢地嗪",
+            "头孢地尼",
+            "头孢拉定",
+            "头孢曲松",
+            "头孢替安",
+            "头孢美唑",
+            "头孢西丁",
+            "奥硝唑",
+            "妥布霉素",
+            "妥布霉素地塞米松",
+            "左氧氟沙星",
+            "左氧氟沙星",
+            "庆大霉素",
+            "异帕米星",
+            "拉氧头孢",
+            "替加环素",
+            "替硝唑",
+            "替考拉宁",
+            "比阿培南",
+            "氟康唑",
+            "氟康唑",
+            "氟胞嘧啶",
+            "氨曲南",
+            "氨苄西林",
+            "泊沙康唑",
+            "特比萘芬",
+            "甲硝唑",
+            "甲硝唑",
+            "磷霉素",
+            "磷霉素氨丁三醇",
+            "米卡芬净",
+            "米诺环素",
+            "红霉素",
+            "美罗培南",
+            "苄星青霉素",
+            "莫西沙星",
+            "莫西沙星",
+            "达托霉素",
+            "阿奇霉素",
+            "阿奇霉素枸橼酸二氢钠",
+            "阿洛西林",
+            "阿米卡星",
+            "阿莫西林",
+            "阿莫西林克拉维酸",
+            "青霉素"
+    };
+}

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/ninghaiyiyi/threelevelward/THR03090.java

@@ -45,7 +45,7 @@ public class THR03090 extends QCCatalogue {
                 if (operationStartDate.contains("结束")) {
                     operationStartDate = operationStartDate.substring(0, operationStartDate.indexOf("结束")).replace("开始:", "");
                 }
-                if (operationStartDate.contains("年月日")) {
+                if (StringUtil.parseDateTime(operationStartDate) == null) {
                     operationStartDate = DateUtil.nowString();
                 }
                 //取不到时间不判断规则

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

@@ -69,7 +69,7 @@ public class OPE0369 extends QCCatalogue {
                 if (operationDoc.getOperationRecordDoc() != null) {
                     Map<String, String> operationDocStructureMap = operationDoc.getOperationRecordDoc().getStructureMap();
                     operationStartDate = operationDocStructureMap.get("手术开始时间");
-                    if (operationStartDate.contains("年月日")) {
+                    if (StringUtil.parseDateTime(operationStartDate) == null) {
                         continue;
                     }
                     if (StringUtil.isNotBlank(operationStartDate)) {
@@ -144,7 +144,7 @@ public class OPE0369 extends QCCatalogue {
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
             String operationStartDateStr = structureMap.get("手术开始时间");
-            if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+            if (StringUtil.isNotBlank(operationStartDateStr) && StringUtil.parseDateTime(operationStartDateStr) != null) {
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {

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

@@ -50,7 +50,7 @@ public class PRE0328 extends QCCatalogue {
                 startTime = operationRecordDoc.getStructureMap().get("手术开始时间");
             }
             if (StringUtil.isNotBlank(startTime) && StringUtil.isNotBlank(admisTime) &&
-                    !startTime.contains("年月日")) {
+                    StringUtil.parseDateTime(startTime) != null) {
                 if (!CatalogueUtil.compareTime(
                         StringUtil.parseDateTime(admisTime),
                         StringUtil.parseDateTime(startTime),
@@ -105,7 +105,7 @@ public class PRE0328 extends QCCatalogue {
             }
             Map<String, String> structureMap = operationRecordDoc.getStructureMap();
             String operationStartDateStr = structureMap.get("手术开始时间");
-            if (StringUtil.isNotBlank(operationStartDateStr) && !operationStartDateStr.contains("年月日")) {
+            if (StringUtil.isNotBlank(operationStartDateStr) && StringUtil.parseDateTime(operationStartDateStr) != null) {
                 Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
                 operationStartDate = DateUtil.dateZeroClear(operationStartDate);
                 if (operationStartDate != null) {

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0335.java

@@ -11,7 +11,7 @@ import java.text.ParseException;
 import java.util.List;
 
 /**
- * @Description: 术前讨论或术前小结主刀医师未审核签字
+ * @Description: 术前讨论是无主刀医师签字
  * @author: rengb
  * @time: 2020/3/23 15:09
  */

+ 79 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR03135.java

@@ -0,0 +1,79 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+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.ThreeLevelWardDoc;
+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 com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR03135
+ * @Description :胎盘娩出后两小时内无病程记录
+ * @Author : wsy
+ * @Date: 2021-07-09 17:27
+ */
+@Component
+public class THR03135 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        /**
+         * 1.模板名称为阴道助产手术记录
+         * 2.胎盘娩出时间2小时内要存在查房记录
+         */
+        //胎盘娩出时间
+        String date = "";
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
+        if (operationDocs == null || operationDocs.size() == 0 || threeLevelWardDocs == null || threeLevelWardDocs.size() == 0) {
+            status.set("0");
+            return;
+        }
+        //取手术记录胎盘娩出时间
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                status.set("0");
+                return;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            //只判断引道助产手术记录(模板名852)
+            if (StringUtil.isNotBlank(structureMap.get("mode_id")) && !structureMap.get("mode_id").equals("852")) {
+                status.set("0");
+                return;
+            }
+            date = operationDoc.getOperationRecordDoc().getStructureMap().get("胎盘娩出");
+            if (StringUtil.isBlank(date)) {
+                status.set("0");
+                return;
+            }
+            date = CommonAnalysisUtil.NHExtractDate(date.replace(".", "-"));
+            if (StringUtil.parseDateTime(date) == null) {
+                status.set("0");
+                return;
+            }
+        }
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
+            String recordDateStr = threeLevelWardDoc.getStructureMap().get("查房日期");
+            //娩出时间比查房
+            if (StringUtil.isNotBlank(recordDateStr) && StringUtil.parseDateTime(recordDateStr) != null) {
+                if (StringUtil.parseDateTime(date).before(StringUtil.parseDateTime(recordDateStr)) &&
+                        !CatalogueUtil.compareTime(StringUtil.parseDateTime(date), StringUtil.parseDateTime(recordDateStr), Long.valueOf(2 * 60))) {
+                    status.set("0");
+                    return;
+                }
+            }
+        }
+
+    }
+}

+ 398 - 395
public/src/main/java/com/lantone/qc/pub/Content.java

@@ -1,9 +1,9 @@
 /**
- *	Content.java
- *	医学病案质控病历内容标签
+ * Content.java
+ * 医学病案质控病历内容标签
  *
- *	@author Mark Huang
- *	@since 8/1/2020
+ * @author Mark Huang
+ * @since 8/1/2020
  **/
 package com.lantone.qc.pub;
 
@@ -16,85 +16,85 @@ public class Content {
 
     public static String title = "病历";
     public static String header = "标题";
-    public static String content_lbl="内容";
+    public static String content_lbl = "内容";
     public static String hospital_Id = "";
 
     public static String label = "content";
 
-    public static String[] docname = {"病案首页","入院记录","首次病程录","病程","医嘱","出院小结"};
+    public static String[] docname = {"病案首页", "入院记录", "首次病程录", "病程", "医嘱", "出院小结"};
 
-    public static List<String> title_homepage = Arrays.asList("医疗机构","医疗付费方式","健康卡号","住院次数"
-            ,"病案号","姓名","性别","出生日期","年龄","国籍","(年龄不足1周岁的)年龄","新生儿出生体重","新生儿入院体重"
-            ,"出生地","籍贯","民族","身份证号","职业","婚姻","现住址","户口地址","工作单位及地址"
-            ,"联系人姓名","入院途径","入院时间","出院时间","门(急)诊诊断","疾病编码","出院诊断","主要诊断","其他诊断"
-            ,"入院病情","损伤、中毒的外部因素"
-            ,"疾病代码","病理诊断","病理号","药物过敏","过敏药物","死亡患者尸检","血型","Rh","科主任","主任(副主任)医生"
-            ,"主治医师","住院医师","责任护士","进修医师","实习医师","编码员","病案质量","质控医师","质控护士","质控日期"
-            ,"手术操作码","手术操作日期","手术级别","手术及操作名称","手术及操作医师","术者"
-            ,"I助","II助","切口愈合等级","麻醉方式","麻醉医师","离院方式","拟接收医疗机构名称","是否有出院31天内再住院计划"
-            ,"目的","颅脑损伤患者昏迷时间","入院前天","入院后天","住院费用(元) : 总费用"
-            ,"1.综合医疗服务类","2.诊断类","3.治疗类", "4.康复类","5.中医类","6.西药类","7.中药类","8.血液和血液制品类",
-            "9.耗材类","10.其他类","单病种管理","临床路径管理","诊断符合情况","抢救情况","主要诊断治愈好转情况");
+    public static List<String> title_homepage = Arrays.asList("医疗机构", "医疗付费方式", "健康卡号", "住院次数"
+            , "病案号", "姓名", "性别", "出生日期", "年龄", "国籍", "(年龄不足1周岁的)年龄", "新生儿出生体重", "新生儿入院体重"
+            , "出生地", "籍贯", "民族", "身份证号", "职业", "婚姻", "现住址", "户口地址", "工作单位及地址"
+            , "联系人姓名", "入院途径", "入院时间", "出院时间", "门(急)诊诊断", "疾病编码", "出院诊断", "主要诊断", "其他诊断"
+            , "入院病情", "损伤、中毒的外部因素"
+            , "疾病代码", "病理诊断", "病理号", "药物过敏", "过敏药物", "死亡患者尸检", "血型", "Rh", "科主任", "主任(副主任)医生"
+            , "主治医师", "住院医师", "责任护士", "进修医师", "实习医师", "编码员", "病案质量", "质控医师", "质控护士", "质控日期"
+            , "手术操作码", "手术操作日期", "手术级别", "手术及操作名称", "手术及操作医师", "术者"
+            , "I助", "II助", "切口愈合等级", "麻醉方式", "麻醉医师", "离院方式", "拟接收医疗机构名称", "是否有出院31天内再住院计划"
+            , "目的", "颅脑损伤患者昏迷时间", "入院前天", "入院后天", "住院费用(元) : 总费用"
+            , "1.综合医疗服务类", "2.诊断类", "3.治疗类", "4.康复类", "5.中医类", "6.西药类", "7.中药类", "8.血液和血液制品类",
+            "9.耗材类", "10.其他类", "单病种管理", "临床路径管理", "诊断符合情况", "抢救情况", "主要诊断治愈好转情况");
 
-    public static List<String> title_admit = Arrays.asList("姓名","性别","年龄","民族",
-            "职业","出生地","婚姻","联系地址","病史陈述者","入院日期","记录日期",
-            "主诉","现病史","既往史","个人史","月经史","婚育史","家族史","体格检查(一)",
-            "体格检查(二)","辅助检查","初步诊断","修正诊断","医师签名","补充诊断");
+    public static List<String> title_admit = Arrays.asList("姓名", "性别", "年龄", "民族",
+            "职业", "出生地", "婚姻", "联系地址", "病史陈述者", "入院日期", "记录日期",
+            "主诉", "现病史", "既往史", "个人史", "月经史", "婚育史", "家族史", "体格检查(一)",
+            "体格检查(二)", "辅助检查", "初步诊断", "修正诊断", "医师签名", "补充诊断");
 
-    public static List<String> admit_basic = Arrays.asList("姓名","性别","年龄","民族",
-            "职业","出生地","婚姻","联系地址","病史陈述者","入院日期","记录日期");
+    public static List<String> admit_basic = Arrays.asList("姓名", "性别", "年龄", "民族",
+            "职业", "出生地", "婚姻", "联系地址", "病史陈述者", "入院日期", "记录日期");
 
 
-    public static List<String> title_progress = Arrays.asList("记录","记录医师");
+    public static List<String> title_progress = Arrays.asList("记录", "记录医师");
 
-    public static List<String> title_first_progress = Arrays.asList("首次病程录","一、病例特点","二、初步诊断",
-            "三、诊断依据","四、鉴别诊断","五、诊疗计划","记录医师");
+    public static List<String> title_first_progress = Arrays.asList("首次病程录", "一、病例特点", "二、初步诊断",
+            "三、诊断依据", "四、鉴别诊断", "五、诊疗计划", "记录医师");
 
-    public static List<String> title_round = Arrays.asList("查房记录","记录医师");
+    public static List<String> title_round = Arrays.asList("查房记录", "记录医师");
 
     public static List<String> title_critical_rec = Arrays.asList("危急值记录", "患者临床诊断", "危急值记录内容",
-            "报告部门","报告人姓名","报告时间","接收人姓名","接收时间","病情分析及处理","医生姓名","签名时间","记录医师");
+            "报告部门", "报告人姓名", "报告时间", "接收人姓名", "接收时间", "病情分析及处理", "医生姓名", "签名时间", "记录医师");
 
-    public static List<String> title_transfusion = Arrays.asList("输血/血制品病程记录","输注原因","输注开始",
-            "输注结束","输注方式","输注种类、血型、数量","输注过程","输注后效果评价","记录医师");
+    public static List<String> title_transfusion = Arrays.asList("输血/血制品病程记录", "输注原因", "输注开始",
+            "输注结束", "输注方式", "输注种类、血型、数量", "输注过程", "输注后效果评价", "记录医师");
 
-    public static List<String> title_preop_summary = Arrays.asList("术前讨论、术前小结","讨论方式","参加人员","简要病情",
-            "术前诊断","手术指征与禁忌征","可替代方案","拟施手术方式、名称及可能的变更","计划性多次手术","拟施麻醉方式"
-            ,"术前特殊准备","主要术中、术后风险及防范措施","术中、术后注意事项","经治医师签名","主刀医师签名");
+    public static List<String> title_preop_summary = Arrays.asList("术前讨论、术前小结", "讨论方式", "参加人员", "简要病情",
+            "术前诊断", "手术指征与禁忌征", "可替代方案", "拟施手术方式、名称及可能的变更", "计划性多次手术", "拟施麻醉方式"
+            , "术前特殊准备", "主要术中、术后风险及防范措施", "术中、术后注意事项", "经治医师签名", "主刀医师签名");
 
-    public static List<String> title_operator_record = Arrays.asList("手术记录","手术时间","术前诊断","手术名称","手术中诊断",
-            "手术者","Ⅰ助","Ⅱ助","Ⅲ助","麻醉方式","麻醉人员","手术经过","手术者签字","记录时间");
+    public static List<String> title_operator_record = Arrays.asList("手术记录", "手术时间", "术前诊断", "手术名称", "手术中诊断",
+            "手术者", "Ⅰ助", "Ⅱ助", "Ⅲ助", "麻醉方式", "麻醉人员", "手术经过", "手术者签字", "记录时间");
 
-    public static List<String> title_postop_session = Arrays.asList("术后首次病程及谈话记录","手术时间","麻醉方式",
-            "手术名称","术中诊断","手术简要经过","患者术后情况","术后处理措施","术后可能出现的并发症及预防措施",
-            "术后注意事项","谈话医师签字","患者签名","被授权人/代理人签名");
+    public static List<String> title_postop_session = Arrays.asList("术后首次病程及谈话记录", "手术时间", "麻醉方式",
+            "手术名称", "术中诊断", "手术简要经过", "患者术后情况", "术后处理措施", "术后可能出现的并发症及预防措施",
+            "术后注意事项", "谈话医师签字", "患者签名", "被授权人/代理人签名");
 
-    public static List<String> title_decease_discuss = Arrays.asList("死亡病例讨论记录","入院时间","死亡时间","入院诊断",
-            "死亡诊断","讨论时间","讨论地点","参加讨论人员","讨论主持人","讨论内容","结论","记录医师");
+    public static List<String> title_decease_discuss = Arrays.asList("死亡病例讨论记录", "入院时间", "死亡时间", "入院诊断",
+            "死亡诊断", "讨论时间", "讨论地点", "参加讨论人员", "讨论主持人", "讨论内容", "结论", "记录医师");
 
-    public static List<String> title_decease_record = Arrays.asList("死亡记录","姓名","性别","科别","床号"
-            ,"病案号","年龄","入院时间","死亡时间","入院情况","入院诊断","诊疗经过","死亡原因","死亡诊断","记录医师"
-            ,"记录时间");
+    public static List<String> title_decease_record = Arrays.asList("死亡记录", "姓名", "性别", "科别", "床号"
+            , "病案号", "年龄", "入院时间", "死亡时间", "入院情况", "入院诊断", "诊疗经过", "死亡原因", "死亡诊断", "记录医师"
+            , "记录时间");
 
-    public static List<String> title_rescue = Arrays.asList("抢救记录","抢救时间","参加现场抢救的医师及护理人员",
-            "抢救过程","记录医师");
+    public static List<String> title_rescue = Arrays.asList("抢救记录", "抢救时间", "参加现场抢救的医师及护理人员",
+            "抢救过程", "记录医师");
 
-    public static List<String> title_intractable_rec = Arrays.asList("疑难病例讨论记录","入院时间","入院诊断",
-            "讨论时间","讨论地点","讨论目的","主持人","参加讨论者(包括职称及姓名)","讨论内容","结论","记录医师");
+    public static List<String> title_intractable_rec = Arrays.asList("疑难病例讨论记录", "入院时间", "入院诊断",
+            "讨论时间", "讨论地点", "讨论目的", "主持人", "参加讨论者(包括职称及姓名)", "讨论内容", "结论", "记录医师");
 
-    public static List<String> title_phase_summary = Arrays.asList("阶段小结","入院日期","患者","入院情况","入院诊断",
-            "诊疗经过","目前情况","目前诊断","记录医师");
+    public static List<String> title_phase_summary = Arrays.asList("阶段小结", "入院日期", "患者", "入院情况", "入院诊断",
+            "诊疗经过", "目前情况", "目前诊断", "记录医师");
 
-    public static List<String> title_order = Arrays.asList("开始日期","开始时间","医嘱",
-            "结束日期","结束时间","医师签名","护士签名");
+    public static List<String> title_order = Arrays.asList("开始日期", "开始时间", "医嘱",
+            "结束日期", "结束时间", "医师签名", "护士签名");
 
-    public static List<String> title_consultant = Arrays.asList("会诊记录","记录医师");
+    public static List<String> title_consultant = Arrays.asList("会诊记录", "记录医师");
 
-    public static List<String> title_discharge = Arrays.asList("姓名","性别","年龄","床号",
-            "入院时间","出院时间","入院诊断","出院诊断","住院天数","入院情况", "诊治经过",
-            "出院情况","出院医嘱","健康教育","随访计划","温馨提示","医师签名","签名时间");
+    public static List<String> title_discharge = Arrays.asList("姓名", "性别", "年龄", "床号",
+            "入院时间", "出院时间", "入院诊断", "出院诊断", "住院天数", "入院情况", "诊治经过",
+            "出院情况", "出院医嘱", "健康教育", "随访计划", "温馨提示", "医师签名", "签名时间");
 
-    public static List<String> progress_type = Arrays.asList("查房记录","会诊记录","危急值记录","病重通知记录");
+    public static List<String> progress_type = Arrays.asList("查房记录", "会诊记录", "危急值记录", "病重通知记录");
 
 
     public static final String chief = "主诉";
@@ -163,12 +163,12 @@ public class Content {
     public static final String radiation_pathology = "放射与病理";
 
     public static final String medical_classification = "病历分型";
-//    public static final String inStatus = "入院病情";
-public static final String implementation_clinical_pathway = "实施临床路径";
-public static final String is_chinese_medicine_preparation = "使用医疗机构中药制剂";
-public static final String is_chinese_diagnose_equipment = "使用中医诊疗设备";
-public static final String is_chinese_diagnose_technology = "使用中医诊疗技术";
-public static final String dialectical_nursing = "辩证施护";
+    //    public static final String inStatus = "入院病情";
+    public static final String implementation_clinical_pathway = "实施临床路径";
+    public static final String is_chinese_medicine_preparation = "使用医疗机构中药制剂";
+    public static final String is_chinese_diagnose_equipment = "使用中医诊疗设备";
+    public static final String is_chinese_diagnose_technology = "使用中医诊疗技术";
+    public static final String dialectical_nursing = "辩证施护";
 
     public static final String outpatientEmergencyDiag = "门急诊诊断";
     public static final String diagCode = "诊断编码";
@@ -199,59 +199,59 @@ public static final String dialectical_nursing = "辩证施护";
     public static final String drugAllergy = "药物过敏";
     public static final String allergyDrug = "过敏药物";
     public static final String deadAutopsy = "死亡患者尸检";
-    public static final String bloodType="血型";
-    public static final String rhFactor="Rh";
-    public static final String qc_quality="病案质量";
-    public static final String qc_date="质控日期";
-    public static final String qc_nurse="质控护士";
-    public static final String qc_doctor="质控医师";
-    public static final String ncoding_staff="编码员";
-    public static final String internship_doctor="实习医师";
-    public static final String engage_doctor="进修医师";
-    public static final String duty_nurse="责任护士";
-    public static final String hospitalization_doctor="住院医师";
-    public static final String indications_doctor="主治医师";
-    public static final String director_doctor="主任医师";
-    public static final String dept_doctor="科主任";
-
-    public static final String attend ="主治";
-    public static final String director="主任";
-
-    public static final String criticallyIllPatients="危重患者";
-    public static final String difficultPatients="疑难患者";
-    public static final String rescuingPatients="抢救患者";
-
-    public static final String operative_information="手术信息";
-    public static final String operative_code="手术编码";
-    public static final String operative_date="手术日期";
-    public static final String operative_degree="手术级别";
-    public static final String operative_name="手术名称";
-    public static final String operative_user="术者";
-    public static final String operative_assistant_first="一助";
-    public static final String operative_assistant_second="二助";
-    public static final String notch_grade="切口等级";
-    public static final String healing_level="愈合等级";
-    public static final String anesthesia_mode="麻醉方式";
-    public static final String anesthesia_doctor="麻醉医师";
-    public static final String operation_Discussion="术后首次病程及谈话记录";
-
-    public static final String outWay="离院方式";
-    public static final String brainInjuryComaBeforeDays="颅脑损伤患者昏迷前天数";
-    public static final String brainInjuryComaBeforeHours="颅脑损伤患者昏迷前小时";
-    public static final String brainInjuryComaBeforeMins="颅脑损伤患者昏迷前分钟";
-    public static final String brainInjuryComaAfterDays="颅脑损伤患者昏迷后天数";
-    public static final String brainInjuryComaAfterHours="颅脑损伤患者昏迷后小时";
-    public static final String brainInjuryComaAfterMins="颅脑损伤患者昏迷后分钟";
-    public static final String daCode="医嘱转院机构名称";
-    public static final String reHospitalization="三十一天内再住院计划";
+    public static final String bloodType = "血型";
+    public static final String rhFactor = "Rh";
+    public static final String qc_quality = "病案质量";
+    public static final String qc_date = "质控日期";
+    public static final String qc_nurse = "质控护士";
+    public static final String qc_doctor = "质控医师";
+    public static final String ncoding_staff = "编码员";
+    public static final String internship_doctor = "实习医师";
+    public static final String engage_doctor = "进修医师";
+    public static final String duty_nurse = "责任护士";
+    public static final String hospitalization_doctor = "住院医师";
+    public static final String indications_doctor = "主治医师";
+    public static final String director_doctor = "主任医师";
+    public static final String dept_doctor = "科主任";
+
+    public static final String attend = "主治";
+    public static final String director = "主任";
+
+    public static final String criticallyIllPatients = "危重患者";
+    public static final String difficultPatients = "疑难患者";
+    public static final String rescuingPatients = "抢救患者";
+
+    public static final String operative_information = "手术信息";
+    public static final String operative_code = "手术编码";
+    public static final String operative_date = "手术日期";
+    public static final String operative_degree = "手术级别";
+    public static final String operative_name = "手术名称";
+    public static final String operative_user = "术者";
+    public static final String operative_assistant_first = "一助";
+    public static final String operative_assistant_second = "二助";
+    public static final String notch_grade = "切口等级";
+    public static final String healing_level = "愈合等级";
+    public static final String anesthesia_mode = "麻醉方式";
+    public static final String anesthesia_doctor = "麻醉医师";
+    public static final String operation_Discussion = "术后首次病程及谈话记录";
+
+    public static final String outWay = "离院方式";
+    public static final String brainInjuryComaBeforeDays = "颅脑损伤患者昏迷前天数";
+    public static final String brainInjuryComaBeforeHours = "颅脑损伤患者昏迷前小时";
+    public static final String brainInjuryComaBeforeMins = "颅脑损伤患者昏迷前分钟";
+    public static final String brainInjuryComaAfterDays = "颅脑损伤患者昏迷后天数";
+    public static final String brainInjuryComaAfterHours = "颅脑损伤患者昏迷后小时";
+    public static final String brainInjuryComaAfterMins = "颅脑损伤患者昏迷后分钟";
+    public static final String daCode = "医嘱转院机构名称";
+    public static final String reHospitalization = "三十一天内再住院计划";
     //判断
     public static final String cancellationOrder = "作废";
 
     //病理诊疗最低费用
-    public static final double pathologicalFee= 68.00;
+    public static final double pathologicalFee = 68.00;
 
-    public static final String chn_med_fee= "中成药费";
-    public static final String chn_herb_fee= "中草药费";
+    public static final String chn_med_fee = "中成药费";
+    public static final String chn_herb_fee = "中草药费";
 
 
     public static final String type = "性";
@@ -261,6 +261,9 @@ public static final String dialectical_nursing = "辩证施护";
     public static final String clinical_pathway_management = "临床路径管理";
     public static final String single_disease_management = "单病种管理";
     public static final String rescue_condition = "抢救情况";
+    public static final String treatmentType = "治疗类别";
+    public static final String outpatientEmrChDiagnose = "中医门急诊诊断";
+    public static final String outpatientEmrChDiagnoseCode = "中医疾病编码";
 
 
     public static final String doctor_rank = "医师等级";
@@ -346,340 +349,340 @@ public static final String dialectical_nursing = "辩证施护";
     public static final String adl_grade_time = "日期";//ADL评分时间
 
     //指标所用常量类
-    public static final String doctorAdviceState= "医嘱状态判别";
-    public static final String doctorAdviceType= "医嘱类型判别";
-    public static final String medicalOrderName= "医嘱项目名称";
-    public static final String statOrder= "临时医嘱";
-    public static final String standingOrder= "长期医嘱";
-    public static final String reportName= "报告名称";
-    public static final String SurgicalProcessTreatment= "手术经过及处理";
-    public static final String illnessRecords= "病情记录";
+    public static final String doctorAdviceState = "医嘱状态判别";
+    public static final String doctorAdviceType = "医嘱类型判别";
+    public static final String medicalOrderName = "医嘱项目名称";
+    public static final String statOrder = "临时医嘱";
+    public static final String standingOrder = "长期医嘱";
+    public static final String reportName = "报告名称";
+    public static final String SurgicalProcessTreatment = "手术经过及处理";
+    public static final String illnessRecords = "病情记录";
     public static final String operationOrder = "手术";
-    public static final String operationFee= "手术费";
-    public static final String pathologyFee= "病理诊断费";
-    public static final String bacterialCulture= "细菌培养";
-    public static final String drugType= "药品类型";
+    public static final String operationFee = "手术费";
+    public static final String pathologyFee = "病理诊断费";
+    public static final String bacterialCulture = "细菌培养";
+    public static final String drugType = "药品类型";
     //判断
-    public static final String pathological= "病理";
-    public static final String pathologicalReport= "病理报告";
-    public static final String specimen= "标本";
+    public static final String pathological = "病理";
+    public static final String pathologicalReport = "病理报告";
+    public static final String specimen = "标本";
     //医嘱状态
-    public static List<String> cancellationOrderList= Arrays.asList(
+    public static List<String> cancellationOrderList = Arrays.asList(
             "作废", "删除", "取消"
     );
     //医嘱中处方类型判断是否为手术
-    public static List<String> operationList= Arrays.asList(
+    public static List<String> operationList = Arrays.asList(
             "手术"
     );
     //非CT情况
-    public static List<String> notCTList= Arrays.asList(
-            "ACTH", "TCT", "HCT","OCT","NCT","LCT","ACT","PET"
+    public static List<String> notCTList = Arrays.asList(
+            "ACTH", "TCT", "HCT", "OCT", "NCT", "LCT", "ACT", "PET"
     );
     //含冰冻非病理情况
-    public static List<String> notBDBLList= Arrays.asList(
+    public static List<String> notBDBLList = Arrays.asList(
             "冰冻血浆", "冰冻红细胞", "冰冻血小板"
     );
     //含病理非病理情况
-    public static List<String> notBLList= Arrays.asList(
+    public static List<String> notBLList = Arrays.asList(
             "病理性", "病理征"
     );
     //非MR情况
-    public static List<String> notMRList= Arrays.asList(
-            "IMRT", "mrs评分","PET"
+    public static List<String> notMRList = Arrays.asList(
+            "IMRT", "mrs评分", "PET"
     );
     //植入物
-    public static List<String> theImplantsList= Arrays.asList(
-            "植入","心脏支架","假体","螺钉","融合器","钢板","钛网","弹簧圈","硅胶","神经鞘管",
-            "钢钉","锚钉","铆钉","骨圆针","克氏针","钢丝",
-            "人工心脏瓣膜","骨水泥","动脉支架","血管瘤夹","哈姆洛克夹",
-            "钛夹","吻合器","神经刺激器","人工耳蜗","皮耐克","人工晶体"
+    public static List<String> theImplantsList = Arrays.asList(
+            "植入", "心脏支架", "假体", "螺钉", "融合器", "钢板", "钛网", "弹簧圈", "硅胶", "神经鞘管",
+            "钢钉", "锚钉", "铆钉", "骨圆针", "克氏针", "钢丝",
+            "人工心脏瓣膜", "骨水泥", "动脉支架", "血管瘤夹", "哈姆洛克夹",
+            "钛夹", "吻合器", "神经刺激器", "人工耳蜗", "皮耐克", "人工晶体"
     );
     //手术病理检查存在手术记录中无病理相关记录中手术病理
-    public static List<String> surgeryPathologyList= Arrays.asList(
-            "病理","免疫组化","原位癌","送检","标本","病切","石蜡","切片","病检"
+    public static List<String> surgeryPathologyList = Arrays.asList(
+            "病理", "免疫组化", "原位癌", "送检", "标本", "病切", "石蜡", "切片", "病检"
     );
     //病理检查缺少病理检查报告单中手术病理
-    public static List<String> surgeryPathologyTwoList= Arrays.asList(
-            "病理","免疫组化","送检","病切","石蜡","切片","病检"
+    public static List<String> surgeryPathologyTwoList = Arrays.asList(
+            "病理", "免疫组化", "送检", "病切", "石蜡", "切片", "病检"
     );
     //医嘱病理
-    public static List<String>  doctorAdvicePathologyList= Arrays.asList(
-            "病检","石蜡","病切","蜡块","切片","流式细胞术","送检","免疫组化","病理"
+    public static List<String> doctorAdvicePathologyList = Arrays.asList(
+            "病检", "石蜡", "病切", "蜡块", "切片", "流式细胞术", "送检", "免疫组化", "病理"
     );
     //报告单病理
-    public static List<String>  reportCardPathologyList= Arrays.asList(
-            "病理","免疫组化","原位癌","送检","石蜡","冰冻","标本","病切","切片","病检"
+    public static List<String> reportCardPathologyList = Arrays.asList(
+            "病理", "免疫组化", "原位癌", "送检", "石蜡", "冰冻", "标本", "病切", "切片", "病检"
     );
     //查房病理
-    public static List<String>  cfPathologyList= Arrays.asList(
-            "免疫组化","原位癌","标本","病切","病检"
+    public static List<String> cfPathologyList = Arrays.asList(
+            "免疫组化", "原位癌", "标本", "病切", "病检"
     );
     //查房抗菌
-    public static List<String>  cfAntibacterialList= Arrays.asList(
-            "抗菌","抗生素","消炎","抗感染","抗炎","预防感染"
+    public static List<String> cfAntibacterialList = Arrays.asList(
+            "抗菌", "抗生素", "消炎", "抗感染", "抗炎", "预防感染"
     );
     //主刀查房是否有意见
-    public static List<String>  cfButcherOpinionList= Arrays.asList(
-            "主刀","分析","指出","认为","指示"
+    public static List<String> cfButcherOpinionList = Arrays.asList(
+            "主刀", "分析", "指出", "认为", "指示"
     );
     //判断手术是否有出血记录
-    public static List<String>  bleedingRecordList= Arrays.asList(
-            "失血","出血"
+    public static List<String> bleedingRecordList = Arrays.asList(
+            "失血", "出血"
     );
     //术前讨论记录未记录讨论者的姓名及职称中对标点符号切割
-    public static List<String>  punctuationList= Arrays.asList(
-            ",",";",",",";"
+    public static List<String> punctuationList = Arrays.asList(
+            ",", ";", ",", ";"
     );
     //查房记录标题或查房记录内容或医生签字包含【上级/主任/主治】所用
-    public static List<String>  superiorList= Arrays.asList(
-            "主任","主治"
+    public static List<String> superiorList = Arrays.asList(
+            "主任", "主治"
     );
     //主治及以上
-    public static List<String>  indicationsAboveList= Arrays.asList(
-            "主任","主治","副主任"
+    public static List<String> indicationsAboveList = Arrays.asList(
+            "主任", "主治", "副主任"
     );
     //病例特点病史
-    public static List<String>  medicalHistoryList= Arrays.asList(
-            "病史","既往","发病经过"
+    public static List<String> medicalHistoryList = Arrays.asList(
+            "病史", "既往", "发病经过"
     );
     //病例特点体格检查
-    public static List<String>  physicalCheckList= Arrays.asList(
-            "专科检查","查体","体温","脉搏","呼吸","血压"
+    public static List<String> physicalCheckList = Arrays.asList(
+            "专科检查", "查体", "体温", "脉搏", "呼吸", "血压"
     );
     //病例特点体格检查
-    public static List<String>  physicalCheckBTList= Arrays.asList(
-            "专科检查","查体"
+    public static List<String> physicalCheckBTList = Arrays.asList(
+            "专科检查", "查体"
     );
     //病例特点辅助检查
-    public static List<String>  auxiliaryExaminationList= Arrays.asList(
-            "实验室检查","影像学检查"
+    public static List<String> auxiliaryExaminationList = Arrays.asList(
+            "实验室检查", "影像学检查"
     );
     //包含死亡但非死亡情况
-    public static List<String>  noDeathList= Arrays.asList(
+    public static List<String> noDeathList = Arrays.asList(
             "死亡蛋白"
     );
     //台州有创目录
-    public static List<String>  haveOperationList= Arrays.asList(
-            "腰椎穿刺术","胸膜腔穿刺术","腹膜腔穿刺术","肝脏穿刺活体组织检查术","肝脏抽脓术","肺脏穿刺活体组织检查术",
-            "肾脏穿刺活体组织检查术","心包穿刺术","骨髓穿刺术","鼻窦置换疗法","中心静脉穿刺导管置入术","淋巴结穿刺术及活组织检查术",
-            "骨组织穿刺活检术","胃肠镜检查","胸腔闭式引流术","气管切开术","气管内插管术","支气管镜检查术","子宫镜检查术","诊断性刮宫术",
-            "膀胱镜检查术","体外震波碎石","尿道扩张术","腹水超滤回输","血液透析","食道电生理检查","食道静脉曲张硬化剂注射治疗","急性心梗急症溶栓治疗",
-            "胃底静脉曲张组织胶注射","内镜下食道静脉曲张套扎术","乳头切开手术(EST)","逆行胰导管造影(ERCP)","内镜下肉毒碱注射治疗",
-            "食道狭窄内镜下气囊扩张术","经窦道胆道镜取石","三腔两囊管压迫止血","内镜下高频电射频微波息肉切除术",
-            "血管造影","深静脉造影","经食道超声心动图","运动平板试验","化学治疗"
+    public static List<String> haveOperationList = Arrays.asList(
+            "腰椎穿刺术", "胸膜腔穿刺术", "腹膜腔穿刺术", "肝脏穿刺活体组织检查术", "肝脏抽脓术", "肺脏穿刺活体组织检查术",
+            "肾脏穿刺活体组织检查术", "心包穿刺术", "骨髓穿刺术", "鼻窦置换疗法", "中心静脉穿刺导管置入术", "淋巴结穿刺术及活组织检查术",
+            "骨组织穿刺活检术", "胃肠镜检查", "胸腔闭式引流术", "气管切开术", "气管内插管术", "支气管镜检查术", "子宫镜检查术", "诊断性刮宫术",
+            "膀胱镜检查术", "体外震波碎石", "尿道扩张术", "腹水超滤回输", "血液透析", "食道电生理检查", "食道静脉曲张硬化剂注射治疗", "急性心梗急症溶栓治疗",
+            "胃底静脉曲张组织胶注射", "内镜下食道静脉曲张套扎术", "乳头切开手术(EST)", "逆行胰导管造影(ERCP)", "内镜下肉毒碱注射治疗",
+            "食道狭窄内镜下气囊扩张术", "经窦道胆道镜取石", "三腔两囊管压迫止血", "内镜下高频电射频微波息肉切除术",
+            "血管造影", "深静脉造影", "经食道超声心动图", "运动平板试验", "化学治疗"
     );
     //台州职务目录
-    public static List<String> positionArrayList= Arrays.asList(
-                "王昌明","赵淑清","蔡仙丽","朱雄文","陈方虎","郎伯旭","陈晨","徐浩","梁斌","杨敏","陶宝鸿","聂寒秋","陈滔",
-               "李隆祥","刘晟","吕静瑶","徐传华","夏发明","伍海建","夏贤武","李皖生","金小福","金茜","周健",
-               "徐小辉","郑文标","陈华彬","张强","管青聪","徐丹蕾","林爱琳","王晨","金涌","王国祥","花京剩",
-               "何婓","程茹","刘治慧"
+    public static List<String> positionArrayList = Arrays.asList(
+            "王昌明", "赵淑清", "蔡仙丽", "朱雄文", "陈方虎", "郎伯旭", "陈晨", "徐浩", "梁斌", "杨敏", "陶宝鸿", "聂寒秋", "陈滔",
+            "李隆祥", "刘晟", "吕静瑶", "徐传华", "夏发明", "伍海建", "夏贤武", "李皖生", "金小福", "金茜", "周健",
+            "徐小辉", "郑文标", "陈华彬", "张强", "管青聪", "徐丹蕾", "林爱琳", "王晨", "金涌", "王国祥", "花京剩",
+            "何婓", "程茹", "刘治慧"
     );
     //抗菌药物目录
     public static List<String> antimicrobialDrugList = Arrays.asList(
-            "多西环素","二维四环素甲氧苄啶","复方四环素","复方四环素泼尼松","胍甲环素","美他环素","米诺环素","四环素","替加环素","土霉素","琥珀氯霉素","甲砜霉素","甲砜霉素甘氨酸酯","氯霉素",
-            "棕榈氯霉素","棕榈氯霉素(B型)","阿洛西林","阿莫西林","氨苄西林","氨苄西林丙磺舒","巴氨西林","呋苄西林","呋布西林","磺苄西林","仑氨西林","美洛西林","哌拉西林","双氯青霉素","羧苄西林",
-            "苄星青霉素","普鲁卡因青霉素","青霉素","青霉素V","青霉素V钾","苯唑西林","氟氯西林","氯唑西林","萘夫西林","舒巴坦","阿莫西林氟氯西林","阿莫西林克拉维酸","阿莫西林舒巴坦","阿莫西林舒巴坦匹酸",
-            "阿莫西林双氯西林","氨苄西林氯唑西林","氨苄西林舒巴坦","美洛西林舒巴坦","哌拉西林舒巴坦","哌拉西林他唑巴坦","舒他西林","舒他西林甲苯磺酸盐","替卡西林克拉维酸","头孢氨苄","头孢氨苄甲氧苄啶",
-            "头孢拉定","头孢硫脒","头孢羟氨苄","头孢羟氨苄甲氧苄啶","头孢羟氢苄","头孢噻吩","头孢替唑","头孢西酮","头孢唑林","五水头孢唑林","复方头孢克洛","克洛己新","头孢丙烯","头孢呋辛","头孢呋辛酯",
-            "头孢克洛","头孢克洛Ⅱ","头孢美唑","头孢孟多酯","头孢尼西","头孢替安","头孢西丁","氟氧头孢","拉氧头孢","头孢泊肟匹酯","头孢泊肟酯","头孢布烯","头孢地尼","头孢地嗪","头孢甲肟","头孢卡品",
-            "头孢克肟","头孢米诺","头孢哌酮","头孢哌酮舒巴坦","头孢哌酮他唑巴坦","头孢匹胺","头孢曲松","头孢曲松他唑巴坦","头孢噻肟","头孢噻肟舒巴坦","头孢他啶","头孢他啶他唑巴坦","头孢他美酯",
-            "头孢特仑新戊酯","头孢妥仑匹酯","头孢唑肟","头孢曲松舒巴坦","头孢吡肟","头孢匹罗","氨曲南","比阿培南","厄他培南","法罗培南","美罗培南","帕尼培南倍他米隆","亚胺培南西司他丁","头孢噻利",
-            "甲氧苄啶","磷酸素钠甲氧苄啶","磺胺二甲嘧啶","小儿复方磺胺二甲嘧啶","复方磺胺嘧啶","磺胺甲恶唑","磺胺嘧啶","磺胺索嘧啶","磺胺对甲氧嘧啶","磺胺多辛","磺胺间甲氧嘧啶","磺胺林","颠茄黄苄啶",
-            "复方磺胺对甲氧嘧啶","复方磺胺甲噁唑","复方磺胺间甲氧嘧啶","磺啶冰黄","联磺甲氧苄啶","小儿复方磺胺甲噁唑","小儿复方磺胺嘧啶","小儿双磺甲氧苄啶","小儿双嘧啶","阿奇霉素","阿奇霉素Ⅱ",
-            "阿奇霉素枸橼酸二氢钠","阿奇霉素磷酸二氢钠","阿奇霉素氯化钠","阿奇霉素葡萄糖","地红霉素","红霉素","琥乙红霉素","环酯红霉素","吉他霉素","交沙霉素","克拉霉素","罗红霉素","罗红霉素Ⅱ",
-            "螺旋霉素","麦白霉素","美欧卡霉素","依托红霉素","乙酰吉他霉素","乙酰螺旋霉素","乙酰麦迪霉素","克林霉素","克林霉素氯化钠","克林霉素葡萄糖","克林霉素磷酸酯","克林霉素棕榈酸酯","林可霉素",
-            "林可霉素氯化钠","林可霉素葡萄糖","链霉素","阿米卡星","阿米卡星氯化钠","丁胺卡那霉素","复方庆大霉素普鲁卡因","复方庆大霉素普鲁卡因维生素B12","核糖霉素","卡那霉素","奈替米星","奈替米星葡萄糖",
-            "庆大霉素","庆大霉素甲氧苄啶","庆大霉素氯化钠","庆大霉素碳酸铋","庆大霉素硝酸铋","妥布霉素","妥布霉素氯化钠","西索米星","西索米星氯化钠","小儿庆大霉素","小诺霉素","依替米星","依替米星氯化钠",
-            "异帕米星","安妥沙星","巴洛沙星","氟罗沙星","氟罗沙星甘露醇","氟罗沙星葡萄糖","氟哌酸","谷氨酸诺氟沙星","谷氨酸诺氟沙星氯化钠","环丙沙星","环丙沙星氯化钠","环丙沙星葡萄糖","吉米沙星",
-            "加替沙星","加替沙星氯化钠","加替沙星葡萄糖","芦氟沙星","洛美沙星","洛美沙星氯化钠","洛美沙星葡萄糖","莫西沙星","莫西沙星氯化钠","诺氟沙星","诺氟沙星葡萄糖","帕珠沙星","帕珠沙星氯化钠",
-            "培氟沙星","培氟沙星葡萄糖","普卢利沙星","司氟沙星","司帕沙星","托氟沙星","氧氟沙星","氧氟沙星甘露醇","氧氟沙星氯化钠","氧氟沙星葡萄糖","依诺沙星","左氧氟沙星","左氧氟沙星氯化钠",
-            "左氧氟沙星葡萄糖","吡哌酸","萘啶酸","罗红霉素氨溴索","庆大霉素二氧化锆","去甲万古霉素","替考拉宁","万古霉素","多粘菌素","多粘菌素B","夫西地酸","奥硝唑","奥硝唑氯化钠","奥硝唑葡萄糖",
-            "苯酰甲硝唑","甲硝唑","甲硝唑芬布芬","甲硝唑呋喃唑酮","甲硝唑氯化钠","甲硝唑氯己定","甲硝唑葡萄糖","甲硝唑葡萄糖氯化钠","甲硝唑维B6","咪唑酸乙酯","人工牛黄甲硝唑","替硝唑","替硝唑氯化钠",
-            "替硝唑葡萄糖","左奥硝唑","左奥硝唑氯化钠","二维呋喃唑酮","呋喃妥因","呋喃唑酮","复方雪胆呋喃唑酮","达托霉素","大观霉素","复方磷霉素","抗敌素","利奈唑胺","利奈唑胺葡萄糖","磷霉素","磷霉素氨丁三醇",
-            "磷霉素钙甲氧苄啶","黏菌素","乌洛托品","粘菌素","鱼腥草素","大蒜素","两性霉素B","咪康唑","酮康唑","伏立康唑","氟康唑","氟康唑氯化钠","氟康唑葡萄糖","伊曲康唑","制霉素","氟胞嘧啶",
-            "氟胞嘧啶氯化钠","卡泊芬净","米卡芬净","对氨基水杨酸钙","对氨基水杨酸钠","卷曲霉素","利福布汀","利福定","利福霉素","利福霉素钠氯化钠","利福喷丁","利福平","利福平(Ⅱ)","环丝氨酸",
-            "对氨基水杨酸异烟肼","帕司烟肼(对氨基水杨酸异烟肼)","帕司烟肼","异烟肼","异烟肼氯化钠","异烟肼维B6","异烟腙","丙硫异烟胺","氨硫脲","吡嗪酰胺","母牛分枝杆菌","乙胺丁醇","烟肼丁醇",
-            "乙胺吡嗪利福异烟","乙胺吡嗪利福异烟(Ⅱ)","乙胺吡嗪利福异烟Ⅱ","乙胺利福异烟","异福(利福平异烟肼)","异福","异福酰胺","氨苯砜","醋氨苯砜","氯法齐明","头孢他定","利福昔明","特比萘芬"
+            "多西环素", "二维四环素甲氧苄啶", "复方四环素", "复方四环素泼尼松", "胍甲环素", "美他环素", "米诺环素", "四环素", "替加环素", "土霉素", "琥珀氯霉素", "甲砜霉素", "甲砜霉素甘氨酸酯", "氯霉素",
+            "棕榈氯霉素", "棕榈氯霉素(B型)", "阿洛西林", "阿莫西林", "氨苄西林", "氨苄西林丙磺舒", "巴氨西林", "呋苄西林", "呋布西林", "磺苄西林", "仑氨西林", "美洛西林", "哌拉西林", "双氯青霉素", "羧苄西林",
+            "苄星青霉素", "普鲁卡因青霉素", "青霉素", "青霉素V", "青霉素V钾", "苯唑西林", "氟氯西林", "氯唑西林", "萘夫西林", "舒巴坦", "阿莫西林氟氯西林", "阿莫西林克拉维酸", "阿莫西林舒巴坦", "阿莫西林舒巴坦匹酸",
+            "阿莫西林双氯西林", "氨苄西林氯唑西林", "氨苄西林舒巴坦", "美洛西林舒巴坦", "哌拉西林舒巴坦", "哌拉西林他唑巴坦", "舒他西林", "舒他西林甲苯磺酸盐", "替卡西林克拉维酸", "头孢氨苄", "头孢氨苄甲氧苄啶",
+            "头孢拉定", "头孢硫脒", "头孢羟氨苄", "头孢羟氨苄甲氧苄啶", "头孢羟氢苄", "头孢噻吩", "头孢替唑", "头孢西酮", "头孢唑林", "五水头孢唑林", "复方头孢克洛", "克洛己新", "头孢丙烯", "头孢呋辛", "头孢呋辛酯",
+            "头孢克洛", "头孢克洛Ⅱ", "头孢美唑", "头孢孟多酯", "头孢尼西", "头孢替安", "头孢西丁", "氟氧头孢", "拉氧头孢", "头孢泊肟匹酯", "头孢泊肟酯", "头孢布烯", "头孢地尼", "头孢地嗪", "头孢甲肟", "头孢卡品",
+            "头孢克肟", "头孢米诺", "头孢哌酮", "头孢哌酮舒巴坦", "头孢哌酮他唑巴坦", "头孢匹胺", "头孢曲松", "头孢曲松他唑巴坦", "头孢噻肟", "头孢噻肟舒巴坦", "头孢他啶", "头孢他啶他唑巴坦", "头孢他美酯",
+            "头孢特仑新戊酯", "头孢妥仑匹酯", "头孢唑肟", "头孢曲松舒巴坦", "头孢吡肟", "头孢匹罗", "氨曲南", "比阿培南", "厄他培南", "法罗培南", "美罗培南", "帕尼培南倍他米隆", "亚胺培南西司他丁", "头孢噻利",
+            "甲氧苄啶", "磷酸素钠甲氧苄啶", "磺胺二甲嘧啶", "小儿复方磺胺二甲嘧啶", "复方磺胺嘧啶", "磺胺甲恶唑", "磺胺嘧啶", "磺胺索嘧啶", "磺胺对甲氧嘧啶", "磺胺多辛", "磺胺间甲氧嘧啶", "磺胺林", "颠茄黄苄啶",
+            "复方磺胺对甲氧嘧啶", "复方磺胺甲噁唑", "复方磺胺间甲氧嘧啶", "磺啶冰黄", "联磺甲氧苄啶", "小儿复方磺胺甲噁唑", "小儿复方磺胺嘧啶", "小儿双磺甲氧苄啶", "小儿双嘧啶", "阿奇霉素", "阿奇霉素Ⅱ",
+            "阿奇霉素枸橼酸二氢钠", "阿奇霉素磷酸二氢钠", "阿奇霉素氯化钠", "阿奇霉素葡萄糖", "地红霉素", "红霉素", "琥乙红霉素", "环酯红霉素", "吉他霉素", "交沙霉素", "克拉霉素", "罗红霉素", "罗红霉素Ⅱ",
+            "螺旋霉素", "麦白霉素", "美欧卡霉素", "依托红霉素", "乙酰吉他霉素", "乙酰螺旋霉素", "乙酰麦迪霉素", "克林霉素", "克林霉素氯化钠", "克林霉素葡萄糖", "克林霉素磷酸酯", "克林霉素棕榈酸酯", "林可霉素",
+            "林可霉素氯化钠", "林可霉素葡萄糖", "链霉素", "阿米卡星", "阿米卡星氯化钠", "丁胺卡那霉素", "复方庆大霉素普鲁卡因", "复方庆大霉素普鲁卡因维生素B12", "核糖霉素", "卡那霉素", "奈替米星", "奈替米星葡萄糖",
+            "庆大霉素", "庆大霉素甲氧苄啶", "庆大霉素氯化钠", "庆大霉素碳酸铋", "庆大霉素硝酸铋", "妥布霉素", "妥布霉素氯化钠", "西索米星", "西索米星氯化钠", "小儿庆大霉素", "小诺霉素", "依替米星", "依替米星氯化钠",
+            "异帕米星", "安妥沙星", "巴洛沙星", "氟罗沙星", "氟罗沙星甘露醇", "氟罗沙星葡萄糖", "氟哌酸", "谷氨酸诺氟沙星", "谷氨酸诺氟沙星氯化钠", "环丙沙星", "环丙沙星氯化钠", "环丙沙星葡萄糖", "吉米沙星",
+            "加替沙星", "加替沙星氯化钠", "加替沙星葡萄糖", "芦氟沙星", "洛美沙星", "洛美沙星氯化钠", "洛美沙星葡萄糖", "莫西沙星", "莫西沙星氯化钠", "诺氟沙星", "诺氟沙星葡萄糖", "帕珠沙星", "帕珠沙星氯化钠",
+            "培氟沙星", "培氟沙星葡萄糖", "普卢利沙星", "司氟沙星", "司帕沙星", "托氟沙星", "氧氟沙星", "氧氟沙星甘露醇", "氧氟沙星氯化钠", "氧氟沙星葡萄糖", "依诺沙星", "左氧氟沙星", "左氧氟沙星氯化钠",
+            "左氧氟沙星葡萄糖", "吡哌酸", "萘啶酸", "罗红霉素氨溴索", "庆大霉素二氧化锆", "去甲万古霉素", "替考拉宁", "万古霉素", "多粘菌素", "多粘菌素B", "夫西地酸", "奥硝唑", "奥硝唑氯化钠", "奥硝唑葡萄糖",
+            "苯酰甲硝唑", "甲硝唑", "甲硝唑芬布芬", "甲硝唑呋喃唑酮", "甲硝唑氯化钠", "甲硝唑氯己定", "甲硝唑葡萄糖", "甲硝唑葡萄糖氯化钠", "甲硝唑维B6", "咪唑酸乙酯", "人工牛黄甲硝唑", "替硝唑", "替硝唑氯化钠",
+            "替硝唑葡萄糖", "左奥硝唑", "左奥硝唑氯化钠", "二维呋喃唑酮", "呋喃妥因", "呋喃唑酮", "复方雪胆呋喃唑酮", "达托霉素", "大观霉素", "复方磷霉素", "抗敌素", "利奈唑胺", "利奈唑胺葡萄糖", "磷霉素", "磷霉素氨丁三醇",
+            "磷霉素钙甲氧苄啶", "黏菌素", "乌洛托品", "粘菌素", "鱼腥草素", "大蒜素", "两性霉素B", "咪康唑", "酮康唑", "伏立康唑", "氟康唑", "氟康唑氯化钠", "氟康唑葡萄糖", "伊曲康唑", "制霉素", "氟胞嘧啶",
+            "氟胞嘧啶氯化钠", "卡泊芬净", "米卡芬净", "对氨基水杨酸钙", "对氨基水杨酸钠", "卷曲霉素", "利福布汀", "利福定", "利福霉素", "利福霉素钠氯化钠", "利福喷丁", "利福平", "利福平(Ⅱ)", "环丝氨酸",
+            "对氨基水杨酸异烟肼", "帕司烟肼(对氨基水杨酸异烟肼)", "帕司烟肼", "异烟肼", "异烟肼氯化钠", "异烟肼维B6", "异烟腙", "丙硫异烟胺", "氨硫脲", "吡嗪酰胺", "母牛分枝杆菌", "乙胺丁醇", "烟肼丁醇",
+            "乙胺吡嗪利福异烟", "乙胺吡嗪利福异烟(Ⅱ)", "乙胺吡嗪利福异烟Ⅱ", "乙胺利福异烟", "异福(利福平异烟肼)", "异福", "异福酰胺", "氨苯砜", "醋氨苯砜", "氯法齐明", "头孢他定", "利福昔明", "特比萘芬"
     );
     // 化疗药物目录
     public static List<String> chemotherapyDrugList = Arrays.asList(
-            "苯丁酸氮芥","氮芥","复方环磷酰胺","甘磷酰芥","环磷酰胺","美法仑","硝卡芥","异环磷酰胺","白消安","福莫司汀","卡莫司汀","洛莫司汀","尼莫司汀","司莫司汀","达卡巴嗪",
-            "氮甲","二溴甘露醇","塞替派","替莫唑胺","氨基蝶呤","甲氨蝶呤","雷替曲塞","培美曲塞","氟达拉滨","复方氨基嘌呤","克拉屈滨","硫鸟嘌呤","巯嘌呤","阿糖胞苷","地西他滨",
-            "氟尿嘧啶","氟尿嘧啶氯化钠","氟尿嘧啶葡萄糖","氟脲苷","复方氟尿嘧啶","吉西他滨","卡莫氟","卡培他滨","尿嘧啶替加氟","去氧氟尿苷","替吉奥","替加氟","替加氟氯化钠","长春地辛",
-            "长春碱","长春瑞滨","长春新碱","替尼泊苷","依托泊苷","托泊替康","伊立替康","多西他赛","紫杉醇","紫杉醇(白蛋白结合型)","斑蝥酸钠","斑蝥酸钠维生素B6","草乌甲素","高三尖杉酯碱",
-            "高三尖杉酯碱氯化钠","甲基斑蝥胺","榄香烯","羟基喜树碱","羟基喜树碱氯化钠","羟喜树碱","去甲斑蝥素","去甲斑蝥酸钠","去甲斑蝥酸钠氯化钠","三尖杉酯碱","放线菌素D","新福菌素",
-            "阿霉素","阿柔比星","吡柔比星","表柔比星","多柔比星","米托蒽醌","柔红霉素","米托蒽醌葡萄糖","盐酸米托蒽醌葡萄糖","伊达比星","博来霉素","平阳霉素","丝裂霉素","奥沙利铂","奥沙利铂甘露醇",
-            "卡铂","洛铂","奈达铂","顺铂","顺铂氯化钠","丙卡巴肼","贝伐珠单抗","利妥昔单抗","曲妥珠单抗","西妥昔单抗","英夫利昔单抗","重组抗CD25人源化单克隆抗体","甘氨双唑","马蔺子素",
-            "达沙替尼","厄洛替尼","吉非替尼","尼洛替尼","舒尼替尼","索拉非尼","伊马替尼","埃克替尼","A群链球菌","安吖啶","博安霉素","雌莫司汀","红色诺卡氏菌细胞壁骨架","甲异靛","六甲蜜胺",
-            "绿脓杆菌","氯氧喹","门冬酰胺酶","尿多酸肽","培门冬酶","硼替佐米","羟基脲","去水卫矛醇","拓扑替康","小牛脾提取物","血卟啉","亚砷酸(三氧化二砷)","亚砷酸氯化钠","因卡膦酸二钠",
-            "重组改构人肿瘤坏死因子","重组人5型腺病毒","重组人p53腺病毒","重组人血管内皮抑制素","左旋门冬酰胺酶","甘氨双唑钠","尼妥珠单抗","阿帕替尼","阿比特龙","阿法替尼","阿那曲唑","阿昔替尼",
-            "阿扎胞苷","阿扎司琼","安多霖","安罗替尼","安替可","氨磷汀","巴利昔单抗","斑蝥素","贝伐珠","比卡鲁胺","单磷酸阿糖腺苷","氟他胺","氟维司群","戈舍瑞林","格拉司琼","华蟾素","金葡素",
-            "聚乙二醇化重组人粒细胞刺激因子","克唑替尼","拉帕替尼","来那度胺","来曲唑","芦可替尼","美司钠","培美曲塞二钠","培唑帕尼","苹果酸舒尼替尼","瑞戈非尼","塞瑞替尼","他莫昔芬","托瑞米芬",
-            "托烷司琼","西达本胺","伊布替尼","伊沙佐米","依维莫司","依西美坦","重组人白介素","紫杉醇脂质体","左亚叶酸钙","亮丙瑞林",
-            "硫唑嘌呤","紫杉醇注射液","紫杉醇(脂质体)","紫杉醇(白蛋白结合型)","帕妥珠单抗","吡咯替尼","奥拉帕利","尼拉帕利","奥希替尼","阿来替尼","卡瑞利珠单抗","信迪利单抗","特瑞普利单抗",
-            "度伐利尤单抗","曲普瑞林","三氧化二砷","甲磺酸伊马替尼胶囊","甲磺酸伊马替尼片","注射用恩美曲妥珠单抗","帕妥珠单抗注射液","贝伐珠单抗注射液","马来酸吡咯替尼片","奥拉帕利片","甲苯磺酸尼拉帕利胶囊",
-            "达沙替尼片","盐酸安罗替尼胶囊","吉非替尼片","马来酸阿法替尼片","甲磺酸奥希替尼片","克唑替尼胶囊","盐酸阿来替尼胶囊","西妥昔单抗注射液","甲苯磺酸索拉非尼片","瑞戈非尼片",
-            "注射用卡瑞利珠单抗","信迪利单抗注射液","特瑞普利单抗注射液","度伐利尤单抗注射液","替雷利珠单抗注射液","替雷利珠"
+            "苯丁酸氮芥", "氮芥", "复方环磷酰胺", "甘磷酰芥", "环磷酰胺", "美法仑", "硝卡芥", "异环磷酰胺", "白消安", "福莫司汀", "卡莫司汀", "洛莫司汀", "尼莫司汀", "司莫司汀", "达卡巴嗪",
+            "氮甲", "二溴甘露醇", "塞替派", "替莫唑胺", "氨基蝶呤", "甲氨蝶呤", "雷替曲塞", "培美曲塞", "氟达拉滨", "复方氨基嘌呤", "克拉屈滨", "硫鸟嘌呤", "巯嘌呤", "阿糖胞苷", "地西他滨",
+            "氟尿嘧啶", "氟尿嘧啶氯化钠", "氟尿嘧啶葡萄糖", "氟脲苷", "复方氟尿嘧啶", "吉西他滨", "卡莫氟", "卡培他滨", "尿嘧啶替加氟", "去氧氟尿苷", "替吉奥", "替加氟", "替加氟氯化钠", "长春地辛",
+            "长春碱", "长春瑞滨", "长春新碱", "替尼泊苷", "依托泊苷", "托泊替康", "伊立替康", "多西他赛", "紫杉醇", "紫杉醇(白蛋白结合型)", "斑蝥酸钠", "斑蝥酸钠维生素B6", "草乌甲素", "高三尖杉酯碱",
+            "高三尖杉酯碱氯化钠", "甲基斑蝥胺", "榄香烯", "羟基喜树碱", "羟基喜树碱氯化钠", "羟喜树碱", "去甲斑蝥素", "去甲斑蝥酸钠", "去甲斑蝥酸钠氯化钠", "三尖杉酯碱", "放线菌素D", "新福菌素",
+            "阿霉素", "阿柔比星", "吡柔比星", "表柔比星", "多柔比星", "米托蒽醌", "柔红霉素", "米托蒽醌葡萄糖", "盐酸米托蒽醌葡萄糖", "伊达比星", "博来霉素", "平阳霉素", "丝裂霉素", "奥沙利铂", "奥沙利铂甘露醇",
+            "卡铂", "洛铂", "奈达铂", "顺铂", "顺铂氯化钠", "丙卡巴肼", "贝伐珠单抗", "利妥昔单抗", "曲妥珠单抗", "西妥昔单抗", "英夫利昔单抗", "重组抗CD25人源化单克隆抗体", "甘氨双唑", "马蔺子素",
+            "达沙替尼", "厄洛替尼", "吉非替尼", "尼洛替尼", "舒尼替尼", "索拉非尼", "伊马替尼", "埃克替尼", "A群链球菌", "安吖啶", "博安霉素", "雌莫司汀", "红色诺卡氏菌细胞壁骨架", "甲异靛", "六甲蜜胺",
+            "绿脓杆菌", "氯氧喹", "门冬酰胺酶", "尿多酸肽", "培门冬酶", "硼替佐米", "羟基脲", "去水卫矛醇", "拓扑替康", "小牛脾提取物", "血卟啉", "亚砷酸(三氧化二砷)", "亚砷酸氯化钠", "因卡膦酸二钠",
+            "重组改构人肿瘤坏死因子", "重组人5型腺病毒", "重组人p53腺病毒", "重组人血管内皮抑制素", "左旋门冬酰胺酶", "甘氨双唑钠", "尼妥珠单抗", "阿帕替尼", "阿比特龙", "阿法替尼", "阿那曲唑", "阿昔替尼",
+            "阿扎胞苷", "阿扎司琼", "安多霖", "安罗替尼", "安替可", "氨磷汀", "巴利昔单抗", "斑蝥素", "贝伐珠", "比卡鲁胺", "单磷酸阿糖腺苷", "氟他胺", "氟维司群", "戈舍瑞林", "格拉司琼", "华蟾素", "金葡素",
+            "聚乙二醇化重组人粒细胞刺激因子", "克唑替尼", "拉帕替尼", "来那度胺", "来曲唑", "芦可替尼", "美司钠", "培美曲塞二钠", "培唑帕尼", "苹果酸舒尼替尼", "瑞戈非尼", "塞瑞替尼", "他莫昔芬", "托瑞米芬",
+            "托烷司琼", "西达本胺", "伊布替尼", "伊沙佐米", "依维莫司", "依西美坦", "重组人白介素", "紫杉醇脂质体", "左亚叶酸钙", "亮丙瑞林",
+            "硫唑嘌呤", "紫杉醇注射液", "紫杉醇(脂质体)", "紫杉醇(白蛋白结合型)", "帕妥珠单抗", "吡咯替尼", "奥拉帕利", "尼拉帕利", "奥希替尼", "阿来替尼", "卡瑞利珠单抗", "信迪利单抗", "特瑞普利单抗",
+            "度伐利尤单抗", "曲普瑞林", "三氧化二砷", "甲磺酸伊马替尼胶囊", "甲磺酸伊马替尼片", "注射用恩美曲妥珠单抗", "帕妥珠单抗注射液", "贝伐珠单抗注射液", "马来酸吡咯替尼片", "奥拉帕利片", "甲苯磺酸尼拉帕利胶囊",
+            "达沙替尼片", "盐酸安罗替尼胶囊", "吉非替尼片", "马来酸阿法替尼片", "甲磺酸奥希替尼片", "克唑替尼胶囊", "盐酸阿来替尼胶囊", "西妥昔单抗注射液", "甲苯磺酸索拉非尼片", "瑞戈非尼片",
+            "注射用卡瑞利珠单抗", "信迪利单抗注射液", "特瑞普利单抗注射液", "度伐利尤单抗注射液", "替雷利珠单抗注射液", "替雷利珠"
     );
     //恶性肿瘤疾病
     public static List<String> tumorDiseaseList = Arrays.asList(
-            "动态未定肿瘤","恶性肿瘤","转移性肿瘤","溃疡恶变","息肉恶变","恶性瘤细胞","小细胞型恶性肿瘤","巨细胞型恶性肿瘤","梭形细胞型恶性肿瘤","转移性梭形细胞型恶性肿瘤","原位癌","癌",
-            "转移性癌","上皮内癌","恶性上皮瘤","大细胞癌","转移性大细胞癌","大细胞神经内分泌癌","转移性大细胞神经内分泌癌","具有杆状显型大细胞癌","玻璃状细胞癌","未分化型癌","转移性未分化癌",
-            "癌,间变","多形性癌","转移性多形性癌","多形性肉瘤样癌","巨细胞和梭型细胞癌","巨细胞癌","转移性巨细胞癌","梭形细胞癌","转移性梭形细胞癌","假肉瘤性癌","转移性假肉瘤性癌","肉瘤样癌",
-            "转移性肉瘤样癌","多角细胞癌","转移性多角细胞癌","破骨细胞样巨细胞癌","微小瘤","小细胞癌","转移性小细胞癌","小细胞神经内分泌癌","圆形细胞癌","储备细胞癌","燕麦细胞癌","小细胞癌,梭形细胞",
-            "小细胞癌,中间细胞","小细胞-大细胞癌","转移性小细胞-腺癌","小细胞-腺癌","小细胞-鳞状细胞癌","混合小细胞癌","非小细胞癌","转移性非小细胞癌","乳头状瘤","乳头状原位癌","乳头状癌",
-            "转移性乳头状癌","疣状乳头状瘤","疣状癌","转移性疣状癌","疣状鳞状细胞癌","鳞状细胞乳头状瘤","乳头状鳞状细胞原位癌","乳头状鳞状细胞癌","转移性乳头状鳞状细胞癌","内翻性乳头状瘤",
-            "内翻性乳头状瘤癌变","转移性内翻性乳头状瘤癌变","乳头状瘤病","鳞状细胞原位癌","鳞状细胞癌","转移性鳞状细胞癌","角化性鳞状细胞癌","转移性角化性鳞状细胞癌","角化性大细胞鳞状细胞癌",
-            "非角化性大细胞鳞状细胞癌","转移性非角化性大细胞鳞状细胞癌","非角化性小细胞鳞状细胞癌","梭形细胞鳞状细胞癌","腺样鳞状细胞癌","转移性腺样鳞状细胞癌","鳞状细胞原位癌,伴可疑间质侵袭",
-            "微小侵袭性鳞状细胞癌","鳞状上皮内肿瘤,3级","宫颈上皮内肿瘤,Ⅲ级","阴道上皮内肿瘤,Ⅲ级","外阴上皮内肿瘤,Ⅲ级","肛门上皮内肿瘤,Ⅲ级","鳞状细胞癌,伴角质形成","凯拉增殖性红斑","鲍恩病",
-            "淋巴上皮癌","转移性淋巴上皮癌","淋巴上皮瘤样癌","基底样鳞状细胞癌","鳞状细胞癌,明细胞型","基底细胞瘤","基底细胞癌","转移性基底细胞癌","多中心性基底细胞癌","硬斑性基底细胞癌",
-            "纤维上皮性基底细胞癌","基底鳞状细胞癌","转移性基底鳞状细胞癌","异型癌","转移性异型癌","雅达逊表皮内上皮瘤","基底细胞癌,结节性","转移性基底细胞癌,结节性","腺样基底癌","转移性腺样基底癌",
-            "毛发上皮瘤","毛囊瘤","毛根鞘瘤","毛根鞘瘤,交界性","毛鞘癌","转移性毛根鞘癌","毛发瘤","增生性毛鞘囊肿","增生性毛鞘囊肿恶变","毛基质瘤","毛基质癌","移行细胞乳头状瘤",
-            "膀胱上皮乳头状瘤","移行细胞原位癌","移行细胞癌","转移性移行细胞癌","膀胱息肉","施奈德乳头状瘤","翻转型移行细胞乳头状瘤","施奈德癌","梭形细胞移行细胞癌","基底细胞样癌","转移性基底细胞样腺癌",
-            "泄殖腔源性癌","潜在低度恶性乳头状尿路上皮肿瘤","非侵袭性乳头状移行细胞癌","乳头状移行细胞癌","转移性乳头状移行细胞癌","非浸润性乳头状尿路上皮癌","微乳头状移行细胞癌","转移性微乳头状移行细胞癌",
-            "腺瘤","支气管腺瘤","原位腺癌","腺癌","转移性腺癌","非典型腺瘤","硬腺癌","转移性硬腺癌","皮革状胃","表面扩散性腺癌","肠型腺癌","弥漫型癌","单形性腺瘤","基底细胞腺瘤","基底细胞腺癌",
-            "腺状上皮内肿瘤,3级","前列腺上皮内肿瘤,3级","胰岛细胞腺瘤","胰岛细胞瘤","胰岛细胞癌","转移性胰岛细胞癌","胰岛素瘤","恶性胰岛素瘤","转移性胰岛素瘤","恶性高血糖素瘤","转移性高血糖素瘤",
-            "胃泌素瘤","恶性胃泌素瘤","转移性胃泌素瘤","混合性导管-内分泌癌","混合性胰岛细胞和外分泌腺癌","胰腺瘤","恶性胰腺瘤","转移性胰腺瘤","生长抑素瘤","恶性生长抑素瘤","转移性生长抑素瘤",
-            "肠高血糖素瘤","恶性肠高血糖素瘤","转移性肠高血糖素瘤","胆管腺瘤","胆管原位癌","胆管癌","转移性胆管癌","胆管囊腺瘤","胆管囊腺癌","克拉特斯金瘤","肝细胞腺瘤","肝细胞癌","转移性肝细胞癌",
-            "纤维板状肝细胞癌","硬癌性肝细胞癌","肝细胞癌,梭型细胞变体","肝细胞癌,明细胞型","多形型肝细胞癌","混合性肝细胞癌和胆管癌","转移性混合性肝细胞癌和胆管癌","小梁性腺瘤","小梁性腺癌",
-            "胚胎性腺瘤","外分泌性皮肤圆柱瘤","腺样囊性癌","转移性腺样囊性癌","筛状原位癌","筛状癌","转移性筛状癌","微小囊性腺瘤","泌乳腺瘤","腺瘤样息肉","腺瘤样息肉内原位腺癌","腺瘤样息肉内腺癌",
-            "管状腺瘤内的原位腺癌","腺瘤样息肉,癌变","腺瘤样息肉内的原位癌","管状腺瘤内的腺癌","管状腺瘤","管状腺瘤内原位癌","管状腺癌","转移性管状腺癌","扁平腺瘤","锯齿状腺瘤","壁细胞癌","肛门腺腺癌",
-            "结肠腺瘤样息肉病","结肠腺瘤样息肉病内腺癌","家族性结肠息肉病","家族性息肉病,癌变","腺瘤病","腺瘤病癌变","多发性腺瘤样息肉","多发性腺瘤样息肉内腺癌","实体型导管原位癌","实性癌",
-            "转移性实性癌","单纯癌","转移性单纯癌","阑尾类癌","恶性类癌","转移性类癌","嗜银细胞瘤","神经内分泌肿瘤","嗜银性类癌","恶性嗜银性类癌","肠嗜铬样细胞类癌","恶性肠嗜铬样细胞类癌","杯形细胞类癌",
-            "黏液性类癌","复合性类癌","混合性类癌和腺癌","混合性腺神经内分泌癌","混合性腺鳞癌和神经内分泌癌","管状类癌","腺类癌瘤","神经内分泌癌","转移性神经内分泌癌","梅克尔细胞癌",
-            "原发性皮肤神经内分泌癌","APUD瘤","非典型类癌性瘤","转移性非典型类癌性瘤","肺腺瘤病","细支气管-肺泡腺癌","转移性细支气管-肺泡腺癌","肺泡腺瘤","肺泡腺癌","转移性肺泡腺癌",
-            "细支气管肺泡癌,非黏蛋白性","细支气管肺泡癌,黏蛋白性","细支气管肺泡癌,黏蛋白性和非黏蛋白性","腺癌,伴混合性亚型","乳头状腺瘤","乳头状腺癌","转移性乳头状腺癌","绒毛状腺瘤","绒毛状腺瘤内原位腺癌",
-            "绒毛状腺瘤内腺癌","绒毛状腺癌","转移性绒毛状腺癌","管状绒毛状腺瘤","管状绒毛状腺瘤内原位腺癌","管状绒毛状腺瘤内腺癌","绒毛腺性腺瘤","管状绒毛状腺癌","腺状乳头状瘤病","嫌色细胞腺瘤","嫌色细胞癌",
-            "转移性嫌色细胞癌","催乳素瘤","垂体腺瘤","侵袭性垂体腺瘤","垂体癌","嗜酸细胞腺瘤","嗜酸细胞癌","转移性嗜酸细胞癌","混合性嗜酸-嗜碱细胞腺瘤","混合性嗜酸-嗜碱细胞癌","转移性混合性嗜酸-嗜碱细胞癌",
-            "嗜酸性腺瘤","嗜酸性腺癌","转移性嗜酸性腺癌","嗜碱细胞腺瘤","嗜碱细胞癌","转移性嗜碱细胞癌","黏液样细胞腺癌","透明细胞腺瘤","透明细胞腺癌","转移性透明细胞腺癌","中肾样型透明细胞癌","肾上腺样瘤",
-            "肾细胞癌","转移性肾细胞癌","乳头状肾细胞癌","明细胞腺纤维瘤","交界恶性明细胞腺纤维瘤","富脂质癌","富糖原癌","囊性相关肾细胞癌","嫌色细胞型肾细胞癌","肉瘤样肾细胞癌","集合管癌","颗粒细胞癌",
-            "转移性颗粒细胞癌","主细胞腺瘤","水样明细胞腺瘤","水样明细胞腺癌","转移性水样明细胞腺癌","混合细胞腺瘤","混合细胞腺癌","转移性混合细胞腺癌","混合性管状腺癌和黏液腺癌",
-            "混合性宫内膜样腺癌和黏液性腺癌","混合性宫内膜样腺癌和透明细胞癌","脂肪腺瘤","后肾腺瘤","滤泡性腺瘤","非典型滤泡性腺瘤","滤泡性腺癌","转移性滤泡性腺癌","高分化滤泡性腺癌",
-            "小梁性滤泡性腺癌","胎儿腺瘤","胎儿腺癌","微滤泡性腺瘤","胶样腺瘤","巨滤泡性腺瘤","微侵袭性滤泡性腺癌","透明小梁性腺瘤","岛回癌","乳头状滤泡性腺癌","转移性乳头状滤泡性腺癌",
-            "乳头状微小癌","转移性乳头状微小癌","嗜酸细胞乳头状癌","包膜性乳头状癌","柱状细胞乳头状癌","髓样癌,伴淀粉样基质","混合性髓样-滤泡性癌","混合性髓样-乳头状癌","无包膜硬化性癌",
-            "多发性内分泌腺瘤","多发性内分泌腺瘤,1型","多发性内分泌腺瘤,2a型","多发性内分泌腺瘤,2b型","球旁细胞瘤","肾上腺皮质腺瘤","肾上腺皮质腺癌","转移性肾上腺皮质细胞癌",
-            "肾上腺皮质腺瘤,致密细胞","肾上腺皮质腺瘤,富色素变异","肾上腺皮质腺瘤,明细胞","肾上腺皮质腺瘤,小球细胞","肾上腺皮质腺瘤,混合细胞","子宫内膜样腺瘤","交界恶性子宫内膜样腺瘤",
-            "子宫内膜样腺癌","转移性子宫内膜样腺癌","子宫内膜样腺纤维瘤","交界恶性子宫内膜样腺纤维瘤","恶性子宫内膜样腺纤维瘤","转移性子宫内膜样腺纤维瘤","分泌变异性子宫内膜样腺癌",
-            "纤毛细胞变异性子宫内膜样腺癌","宫颈内膜型腺癌","皮肤附属器腺瘤","皮肤附属器癌","毛囊周纤维瘤","汗管纤维腺瘤","汗腺腺瘤","汗腺瘤","汗腺腺癌","转移性汗腺腺癌","顶泌性腺瘤",
-            "顶泌性腺癌","透明细胞汗腺腺瘤","外分泌性汗腺腺瘤","汗腺囊瘤","乳头状汗腺腺瘤","乳头状汗管腺瘤","汗管瘤","外分泌性乳头状腺瘤","侵袭性指[趾]乳头状腺瘤","外分泌性乳头状腺癌",
-            "汗腺汗孔瘤","汗孔癌","皮脂腺腺瘤","皮脂腺腺癌","外分泌性腺癌","耵聍腺瘤","耵聍腺癌","黏液表皮样瘤","黏液表皮样癌","转移性黏液表皮样癌","囊腺瘤","囊腺癌","转移性囊腺癌",
-            "浆液性囊腺瘤","浆液性囊腺癌","转移性浆液性囊腺癌","交界性浆液性囊腺瘤","交界恶性浆液性囊腺瘤","交界转移性浆液性囊腺瘤","交界性浆液性肿瘤","明细胞囊腺瘤","交界恶性明细胞囊性瘤",
-            "乳头状囊腺瘤","乳头状囊腺癌","转移性乳头状囊腺癌","交界恶性乳头状囊腺瘤","实性假乳头状瘤","实性假乳头状癌","转移性实性假乳头状癌","乳头状囊性瘤","导管内乳头状黏液腺瘤",
-            "导管内乳头状黏液瘤伴有发育不良","导管内乳头状黏液癌,非侵袭性","导管内乳头状黏液癌,侵袭性","房室结囊性瘤","乳头状浆液性囊腺瘤","乳头状浆液性囊腺癌","转移性乳头状浆液性囊腺癌",
-            "浆液性表面乳头状瘤","浆液性表面乳头状癌","交界恶性乳头状浆液性囊腺瘤","交界恶性表面乳头状浆液性囊腺瘤","黏液性囊腺瘤","黏液性囊腺瘤伴有中度发育不良","黏液性囊腺癌",
-            "转移性黏液性囊腺癌","交界性粘液性囊腺瘤","假黏液性腺癌","乳头状黏液性囊腺瘤","乳头状黏液性囊腺癌","转移性乳头状黏液性囊腺癌","交界粘液性肿瘤","交界恶性黏液性囊腺瘤",
-            "交界恶性乳头状黏液性囊腺瘤","黏液腺瘤","黏液腺癌","转移性黏液腺癌","乳头状黏液腺癌","腹膜假黏液瘤","产黏液性腺癌","宫颈内型黏液腺癌","印戒细胞癌","转移性印戒细胞癌",
-            "克鲁肯贝格瘤","导管内癌","浸润性导管癌","转移性导管癌","导管腺癌","非浸润性粉刺癌","粉刺癌","转移性粉刺癌","乳房幼年型癌","导管内乳头状瘤","导管内乳头状癌","导管内乳头状腺癌伴侵袭",
-            "非浸润性导管内乳头状癌","囊内乳头状腺瘤","非浸润性囊内癌","囊内癌","转移性囊内癌","导管内乳头状瘤病","乳头的腺瘤 ","导管内微乳头状癌","囊性分泌亢进性癌","实性乳头状癌","髓样癌","转移性髓样癌",
-            "髓样癌伴淀粉样间质","髓样癌伴淋巴样间质","非典型性髓样癌","促结缔组织增生型导管癌","小叶原位癌","浸润性小叶癌","转移性小叶浸润性癌","浸润性小管癌","导管内癌和小叶原位癌","浸润性导管和小叶癌",
-            "浸润性导管和黏液癌","转移性浸润性导管和粘液癌","浸润性导管和筛状癌","浸润性导管和管状癌","浸润性导管和胶样癌","浸润性导管癌和微乳头状癌","浸润性小叶癌和其他类型癌","多形性低度腺癌","炎性癌",
-            "转移性炎性癌","乳房佩吉特病","转移性乳房佩吉特病","乳房佩吉特病和浸润性导管癌","转移性乳房佩吉特病和浸润性导管癌","乳房外佩吉特病","转移性乳房外佩吉特病","乳房佩吉特病和导管内癌",
-            "转移性乳房佩吉特病和导管内癌","腺泡细胞腺瘤","腺泡细胞瘤","腺泡细胞癌","转移性腺泡细胞癌","腺泡细胞囊腺癌","腺鳞癌","转移性腺鳞癌","腺淋巴瘤","上皮-肌上皮癌","转移性上皮-肌上皮癌",
-            "腺棘皮癌","转移性腺棘皮癌","腺癌,伴鳞状化生","腺癌,伴软骨和骨化生","腺癌,伴梭形细胞化生","腺癌,伴顶泌性汗腺化生","腺癌,伴神经内分泌分化","化生性癌","上皮/间叶混合性化生性癌","肝样腺癌",
-            "胸腺瘤","恶性胸腺瘤","转移性胸腺瘤","化生型胸腺瘤","胸腺瘤,A型","恶性胸腺瘤,A型","胸腺瘤,AB型","恶性胸腺瘤,AB型","胸腺瘤,B1型","恶性胸腺瘤,B1型","胸腺瘤,B2型","恶性胸腺瘤,B2型",
-            "胸腺瘤,B3型","恶性胸腺瘤,B3型","转移性恶性胸腺瘤,B3型","胸腺瘤,C型","异位错构瘤性胸腺瘤","梭形上皮性瘤,伴胸腺样成分","癌,表现出胸腺样成分","性索-性腺间质瘤","卵巢间质瘤",
-            "性索-性腺间质瘤,不完全分化","性索-性腺间质瘤,混合形式","混合性颗粒细胞瘤","间质瘤,伴小性索成分","泡膜细胞瘤","恶性泡膜细胞瘤","转移性泡膜细胞瘤","黄体化泡膜细胞瘤","硬化性间质瘤","黄体瘤",
-            "卵泡细胞瘤","恶性卵泡细胞瘤","转移性卵泡细胞瘤","卵泡细胞-膜细胞瘤","幼年型卵泡细胞瘤","性索瘤伴环状小管","男性母细胞瘤","恶性男性母细胞瘤","转移性男性母细胞瘤","塞尔托利-莱迪细胞瘤",
-            "塞尔托利-莱迪细胞瘤,中分化","塞尔托利-莱迪细胞瘤,低分化","两性母细胞瘤","塞尔托利-莱迪细胞瘤,网状","塞尔托利-莱迪细胞瘤,中分化,伴异种成分","塞尔托利-莱迪细胞瘤,低分化,伴异种成分",
-            "塞尔托利细胞瘤","塞尔托利细胞癌","塞托利细胞瘤,伴脂质贮积","莱迪细胞瘤","恶性莱迪细胞瘤","转移性莱迪细胞瘤","卵巢门细胞瘤","卵巢脂质细胞瘤","肾上腺剩余瘤","节旁体瘤","恶性节旁体瘤",
-            "转移性节旁体瘤","交感神经节旁体瘤","副交感神经节旁体瘤","神经节细胞性节旁体瘤","颈静脉血管球瘤","主动脉体瘤","颈动脉体瘤","化学感受器瘤","恶性化学感受器瘤","转移性化学感受器瘤",
-            "肾上腺外节旁体瘤","恶性肾上腺外节旁体瘤","嗜铬细胞瘤","恶性嗜铬细胞瘤","转移性嗜铬细胞瘤","嗜铬母细胞瘤","血管球肉瘤","血管球瘤","交界性血管球瘤","血管球性血管瘤","血管球肌瘤","血管肌周细胞瘤",
-            "血管周上皮样细胞分化肿瘤","色素痣","原位黑色素瘤","恶性黑色素瘤","转移性黑色素瘤","毛痣","结节性黑色素瘤","气球细胞痣","气球细胞黑色素瘤","晕样痣","退行性恶性黑色素瘤","鼻纤维性丘疹","神经痣",
-            "巨细胞痣","发育不良痣","脑膜黑色素细胞瘤","无色素痣","无色素性黑色素瘤","交界痣","交界痣内恶性黑色素瘤","癌前黑素沉着病","癌前黑素沉着病内恶性黑色素瘤","哈奇森黑素雀斑",
-            "哈奇森黑素雀斑内恶性黑色素瘤","表面扩散性黑色素瘤","恶性肢端着色斑性黑色素瘤","恶性促结缔组织增生性黑色素瘤","皮内痣","复合痣","巨大色素痣","巨大色素痣内恶性黑色素瘤",
-            "先天性痣内增生型皮肤损害","上皮样细胞和梭形细胞痣","混合性上皮样和梭状细胞黑色素瘤","上皮样细胞痣","上皮样细胞黑色素瘤","梭形细胞痣","梭形细胞黑色素瘤","梭形细胞黑色素瘤,A型",
-            "梭形细胞黑色素瘤,B型","蓝痣","恶性蓝痣","雅达松蓝痣","细胞性蓝痣","巨蓝痣","肉瘤","转移性肉瘤","肉瘤病","梭形细胞肉瘤","转移性梭形细胞肉瘤","巨细胞肉瘤(除外骨 M9250/3)",
-            "转移性巨细胞肉瘤","小细胞肉瘤","上皮样细胞肉瘤","未分化肉瘤","促结缔组织增生性小圆细胞瘤","转移性促结缔组织增生性小圆细胞瘤","纤维瘤","细胞性纤维瘤","纤维肉瘤","转移性纤维肉瘤",
-            "真皮纤维瘤","骨纤维瘤","纤维黏液瘤","黏液炎性纤维母细胞肿瘤","纤维黏液肉瘤","骨膜纤维瘤","骨膜纤维肉瘤","筋膜纤维瘤","掌(跖)纤维瘤病","筋膜纤维肉瘤","婴儿性纤维肉瘤","孤立性纤维性瘤",
-            "孤立性纤维性肿瘤","恶性孤立性纤维性瘤","转移性恶性孤立性纤维性瘤","交界性孤立性纤维性瘤","孤立性纤维性瘤,恶性","弹力纤维瘤","硬纤维瘤","侵蚀性纤维瘤病","腹部纤维瘤病","骨韧带状瘤",
-            "促结缔组织增生性纤维瘤","肌纤维瘤","肌纤维瘤病","先天性全身性纤维瘤病","肌纤维母细胞瘤","炎性肌纤维母细胞瘤","肌纤维母细胞肉瘤","血管肌纤维母细胞瘤","支气管周肌纤维母细胞性瘤",
-            "纤维组织细胞瘤","非典型性纤维组织细胞瘤","恶性纤维组织细胞瘤","转移性纤维组织细胞瘤","纤维黄色瘤","组织细胞瘤","皮肤纤维瘤","皮肤纤维肉瘤","硬化性血管瘤","色素沉着性隆凸性皮肤纤维肉瘤",
-            "巨细胞纤维母细胞瘤","丛状纤维组织细胞性瘤","血管瘤样纤维组织细胞瘤","黏液瘤","低级别黏液性肿瘤","黏液肉瘤","转移性黏液肉瘤","肌内黏液瘤","血管黏液瘤","脂肪瘤","非典型脂肪瘤","脂肪肉瘤",
-            "转移性脂肪肉瘤","纤维脂肪肉瘤","纤维脂肪瘤","高分化型脂肪肉瘤","软纤维瘤","黏液脂肪瘤","黏液样脂肪肉瘤","纤维黏液脂肪瘤","圆细胞脂肪肉瘤","多形性脂肪瘤","多形性脂肪肉瘤","混合型脂肪肉瘤",
-            "肌内脂肪瘤","浸润性脂肪瘤","梭形细胞脂肪瘤","梭型细胞脂肪肉瘤","去分化型脂肪肉瘤","血管肌脂肪瘤","血管肌脂肪瘤,恶变","血管脂肪瘤","软骨样脂肪瘤","骨髓脂肪瘤","蛰伏脂瘤","脂肪母细胞瘤病",
-            "脂肪母细胞瘤","平滑肌瘤","平滑肌瘤病","平滑肌肉瘤","转移性平滑肌肉瘤","血管平滑肌瘤病","上皮样平滑肌瘤","上皮样平滑肌肉瘤","平滑肌母细胞瘤","细胞性平滑肌瘤","奇异性平滑肌瘤","血管肌瘤",
-            "血管肌肉瘤","肌瘤","黏液样平滑肌肉瘤","平滑肌肿瘤","横纹肌瘤","横纹肌肉瘤","转移性横纹肌肉瘤","多形型横纹肌肉瘤","混合型横纹肌肉瘤","胎儿横纹肌瘤","成人横纹肌瘤","生殖器横纹肌瘤",
-            "胚胎型横纹肌肉瘤","转移性胚胎性横纹肌肉瘤","葡萄样肉瘤","梭形细胞横纹肌肉瘤","小泡型横纹肌肉瘤","横纹肌肉瘤伴神经节分化","子宫内膜间质结节","子宫内膜间质肉瘤","转移性子宫内膜间质肉瘤",
-            "淋巴管内性间质异位症","腺肌瘤","非典型性息肉样腺肌瘤","腺肉瘤","转移性腺肉瘤","癌性纤维瘤","转移性癌性纤维瘤","间质性瘤","间质性肉瘤","转移性间质性肉瘤","胃肠道间质性瘤,潜在恶性未肯定",
-            "恶性胃肠道间质性瘤","转移性胃肠道间质性瘤","胃肠道间质肉瘤","多形性腺瘤","恶性混合瘤","转移性混合瘤","软骨样汗管瘤","涎腺型混合瘤","多形性腺瘤内癌","苗勒混合瘤","中胚层混合瘤","转移性中胚层混合瘤",
-            "囊性部分分化性肾母细胞瘤","恶性囊性肾瘤","转移性囊性肾瘤","中胚层性肾瘤","肾母细胞瘤","转移性肾母细胞瘤","杆状肉瘤","肾明细胞肉瘤","转移性肾明细胞肉瘤","肾源性腺纤维瘤","肾髓性间质细胞瘤",
-            "骨化性肾瘤","肝母细胞瘤","转移性肝母细胞瘤","胰母细胞瘤","转移性胰母细胞瘤","肺母细胞瘤","转移性肺母细胞瘤","胸膜肺母细胞瘤","涎母细胞瘤","癌肉瘤","转移性癌肉瘤","胚胎性癌肉瘤","肌上皮瘤",
-            "肌上皮性癌","转移性肌上皮样癌","腺肌上皮瘤","间叶瘤","恶性间叶瘤","转移性间叶瘤","混合性间叶瘤","胚胎性肉瘤","转移性胚胎性肉瘤","布伦纳瘤","交界恶性布伦纳瘤","恶性布伦纳瘤",
-            "转移性恶性布伦纳瘤","纤维腺瘤","小管内纤维腺瘤","小管周纤维腺瘤","腺纤维瘤","腺纤维瘤,癌变","乳头状腺纤维瘤","浆液性腺纤维瘤","交界恶性浆液性腺纤维瘤","浆液性腺癌性纤维瘤",
-            "交界恶性浆液性囊性腺纤维瘤","黏液性腺纤维瘤","交界性黏液性腺纤维瘤","巨大纤维腺瘤","叶状囊肉瘤","恶性叶状囊肉瘤","转移性叶状囊肉瘤","幼年型纤维腺瘤","滑膜肉瘤","转移性滑膜肉瘤",
-            "梭形细胞滑膜肉瘤","上皮样细胞滑膜肉瘤","双相分化滑膜肉瘤","透明细胞肉瘤(除外肾的M8964/3)","转移性透明细胞肉瘤","恶性间皮瘤","转移性间皮瘤","恶性纤维性间皮瘤","恶性上皮样间皮瘤",
-            "恶性双相分化间皮瘤","腺瘤样瘤","囊性间皮瘤","无性细胞瘤","转移性无性细胞瘤","精原细胞瘤","转移性精原细胞瘤","间变精原细胞瘤","精母细胞性精原细胞瘤","转移性精母细胞性精原细胞瘤",
-            "生殖细胞瘤","转移性生殖细胞瘤","非精原细胞瘤样生殖细胞瘤","胚胎性癌","转移性胚胎性癌","内胚窦瘤","转移性内胚窦瘤","睾丸母细胞瘤","多胚瘤","性腺母细胞瘤","畸胎瘤","恶性畸胎瘤",
-            "转移性畸胎瘤","畸胎癌","未分化恶性畸胎瘤","中分化恶性畸胎瘤","皮样囊肿","皮样囊肿恶变","畸胎瘤伴恶性变","混合性生殖细胞瘤","转移性混合性生殖细胞瘤","混合型畸胎瘤和精原细胞瘤",
-            "卵巢甲状腺肿","恶性卵巢甲状腺肿","转移性恶性卵巢甲状腺肿","甲状腺肿性类癌","葡萄胎","侵袭性葡萄胎","绒毛膜癌","转移性绒毛膜癌","绒毛膜癌伴畸胎瘤","滋养细胞恶性畸胎瘤","部分性葡萄胎",
-            "胎盘部位滋养细胞瘤","上皮样滋养层肿瘤","中肾性瘤","恶性中肾瘤","转移性中肾瘤","血管瘤","血管肉瘤","转移性血管肉瘤","海绵状血管瘤","海绵状痣","静脉血管瘤","葡萄状血管瘤","动静脉血管瘤",
-            "库普弗细胞肉瘤","上皮样血管瘤","组织细胞样血管瘤","血管内皮瘤","恶性血管内皮瘤","转移性血管内皮瘤","毛细血管瘤","丛状血管瘤","肌内血管瘤","上皮样血管内皮瘤","恶性上皮样血管内皮瘤",
-            "血管内支气管肺泡瘤","血管内乳头状血管内皮瘤","梭形细胞血管内皮瘤","卡波西肉瘤","血管角质瘤","疣性角化性血管瘤","血管外皮细胞瘤","恶性血管外皮细胞瘤","转移性血管外皮细胞瘤",
-            "血管纤维瘤","巨细胞血管纤维瘤","成血管细胞瘤","淋巴管瘤","淋巴管肉瘤","转移性淋巴管肉瘤","毛细淋巴管瘤","海绵状淋巴管瘤","囊性淋巴管瘤","淋巴管肌瘤","淋巴管肌瘤病","血管淋巴管瘤",
-            "骨瘤","骨肉瘤","转移性骨肉瘤","成软骨细胞性骨肉瘤","成纤维细胞性骨肉瘤","转移性成纤维细胞性骨肉瘤","毛细血管扩张性骨肉瘤","骨佩吉特病骨肉瘤","小细胞骨肉瘤","中心骨肉瘤",
-            "骨内高分化骨肉瘤","骨旁骨肉瘤","骨样骨瘤","骨膜外骨肉瘤","骨膜骨肉瘤","高等级表面骨肉瘤","皮质内骨肉瘤","成骨细胞瘤","侵袭性成骨细胞瘤","骨软骨瘤","骨软骨瘤病","骨软骨瘤恶变",
-            "奇异性骨旁骨软骨瘤样增生","软骨瘤","软骨瘤病","软骨肉瘤","转移性软骨肉瘤","软骨黏液肉瘤","近皮质软骨瘤","近皮质软骨肉瘤","滑膜软骨瘤病","成软骨细胞瘤","恶性成软骨细胞瘤",
-            "转移性成软骨细胞瘤","黏液样软骨肉瘤","转移性黏液性软骨肉瘤","间质性软骨肉瘤","转移性间质性软骨肉瘤","软骨黏液样纤维瘤","明细胞软骨肉瘤","去分化软骨肉瘤","骨巨细胞瘤","恶性骨巨细胞瘤",
-            "转移性骨巨细胞瘤","软组织巨细胞瘤","恶性软组织巨细胞瘤","转移性软组织巨细胞瘤","腱鞘巨细胞瘤","弥漫性腱鞘巨细胞瘤","尤因肉瘤","转移性尤因肉瘤","长骨釉质瘤","转移性长骨釉质瘤","骨化性纤维瘤",
-            "纤维骨瘤","牙源性瘤","恶性牙源性瘤","转移性牙源性瘤","牙本质瘤","牙骨质瘤","牙骨质化性纤维瘤","巨形牙骨质瘤","牙瘤","混合性牙瘤","复合性牙瘤","成釉细胞纤维牙瘤","成釉细胞牙肉瘤",
-            "转移性成釉细胞牙肉瘤","腺瘤样牙源性瘤","腺性成釉细胞瘤","钙化性牙源性囊肿","牙源性形骸细胞瘤","成釉细胞瘤","恶性成釉细胞瘤","转移性成釉细胞瘤","牙成釉细胞瘤","鳞状牙源性瘤","牙源性黏液瘤",
-            "中心牙源性纤维瘤","周围牙源性纤维瘤","成釉细胞纤维瘤","成釉细胞纤维肉瘤","钙化上皮性牙源性瘤","牙源性明细胞瘤","牙源性癌肉瘤","颅咽管瘤","釉质上皮瘤样颅咽管瘤","乳头状颅咽管瘤",
-            "松果体瘤","松果体细胞瘤","成松果体细胞瘤","转移性成松果体细胞瘤","黑变病神经外胚瘤","周围性神经外胚瘤","转移性周围性神经外胚瘤","阿斯金瘤","脊索瘤","转移性脊索瘤","软骨样脊索瘤",
-            "去分化脊索瘤","旁脊索瘤","神经胶质瘤","转移性神经胶质瘤","大脑神经胶质瘤病","混合性神经胶质瘤","室管膜下神经胶质瘤","室管膜下巨细胞星形细胞瘤","弥漫性中线胶质瘤","脉络丛乳头状瘤",
-            "非典型性脉络丛乳头状瘤","恶性脉络丛乳头状瘤","转移性脉络丛乳头状瘤","室管膜瘤","转移性室管膜瘤","间变室管膜瘤","成室管膜细胞瘤","乳头状室管膜瘤","黏液乳头状室管膜瘤","星形细胞瘤",
-            "转移性星形细胞瘤","间变性星形细胞瘤","转移性间变性星形细胞瘤","原浆性星形细胞瘤","大圆细胞性星形细胞瘤","促结缔组织增生性婴儿星形细胞瘤","纤维性星形细胞瘤","毛细胞性星形细胞瘤,交界恶性",
-            "毛细胞性星形细胞瘤","幼年型星形细胞瘤","成胶质细胞瘤","转移性成胶质细胞瘤","极性成胶质细胞瘤","多形性黄色星形细胞瘤","成星形细胞瘤","成神经胶质细胞瘤","转移性成(神经)胶质细胞瘤",
-            "巨细胞成(神经)胶质细胞瘤","神经胶质纤维瘤","神经胶质肉瘤","原始极性成胶质细胞瘤","脊索状神经胶质瘤","少突神经胶质细胞瘤","转移性少突神经胶质细胞瘤","间变型少突神经胶质细胞瘤",
-            "成少突神经胶质细胞瘤","成神经管细胞瘤","转移性成神经管细胞瘤","促结缔组织增生性成神经管细胞瘤","成髓样肌细胞瘤","原始神经外胚瘤","转移性原始神经外胚瘤","大细胞髓母细胞瘤",
-            "转移性大细胞髓母细胞瘤","小脑肉瘤","转移性小脑肉瘤","畸形细胞性肉瘤","神经节瘤","神经节神经母细胞瘤","转移性神经节神经母细胞瘤","神经节瘤病","神经节细胞瘤","成神经细胞瘤",
-            "转移性成神经细胞瘤","髓上皮瘤","转移性髓上皮瘤","畸胎样髓上皮瘤","神经上皮瘤","转移性神经上皮瘤","海绵状成神经细胞瘤","神经节神经胶质瘤","神经细胞瘤","神经细胞瘤(中央型)",
-            "中枢神经细胞瘤,恶性","中枢神经细胞瘤","帕西尼瘤","非典型性胚胎样/杆状瘤","乳头状胶质神经元肿瘤","成视网膜细胞瘤","转移性视网膜母细胞瘤","已分化成视网膜细胞瘤","未分化成视网膜细胞瘤",
-            "视网膜母细胞瘤,弥漫性","视网膜母细胞瘤,自然消退","嗅神经源性瘤","转移性嗅神经源性瘤","感觉神经细胞瘤","成感觉神经细胞瘤","转移性成感觉神经细胞瘤","感觉神经上皮瘤","脑(脊)膜瘤",
-            "脑(脊)膜瘤病","恶性脑膜瘤","转移性脑膜瘤","恶性脊膜瘤","转移性脊膜瘤","脑膜性脑(脊)膜瘤","纤维性脑(脊)膜瘤","沙粒体性脑(脊)膜瘤","血管瘤性脑(脊)膜瘤","成血管细胞性脑(脊)膜瘤",
-            "血管外皮细胞性脑(脊)膜瘤","移行细胞性脑(脊)膜瘤","乳头状脑(脊)膜瘤","透明细胞脑(脊)膜瘤","非典型脑膜瘤","脑(脊)膜肉瘤病","神经纤维瘤","神经纤维瘤病","神经纤维肉瘤","转移性神经纤维肉瘤",
-            "环层小体神经纤维瘤","黑变病神经纤维瘤","丛状神经纤维瘤","神经鞘瘤","神经鞘瘤病","恶性神经鞘瘤","转移性神经鞘瘤","恶性蝾螈瘤","神经鞘黏液瘤","神经瘤","神经束瘤","恶性神经束瘤","转移性神经束瘤",
-            "颗粒细胞瘤","恶性颗粒细胞瘤","转移性颗粒细胞瘤","颗粒细胞肌母细胞瘤","软组织腺泡状肉瘤","转移性软组织腺泡状肉瘤","鞍区颗粒细胞瘤","恶性淋巴瘤","T-细胞淋巴瘤","B-细胞淋巴瘤","非霍奇金淋巴瘤",
-            "淋巴肉瘤","网状细胞肉瘤","小神经胶质细胞瘤","弥漫性淋巴瘤","复合性霍奇金和非霍奇金淋巴瘤","原发性皮肤毛囊中心淋巴瘤","霍奇金病","霍奇金淋巴瘤,富淋巴细胞性","混合细胞型霍奇金病",
-            "混合细胞型霍奇金病,经典型","淋巴细胞减少型霍奇金病","淋巴细胞减少型霍奇金病,经典型","淋巴细胞减少型霍奇金病,弥漫性纤维化","淋巴细胞减少型霍奇金病,弥漫性纤维化,经典型","网状淋巴细胞减少型霍奇金病",
-            "网状淋巴细胞减少型霍奇金病,经典型","淋巴细胞为主型霍奇金病","弥漫性淋巴细胞为主型霍奇金病","结节性淋巴细胞为主型霍奇金病","霍奇金副肉芽肿","霍奇金肉芽肿","霍奇金肉瘤",
-            "结节硬化型霍奇金病","结节硬化富细胞相霍奇金病","结节硬化淋巴细胞为主型霍奇金病","结节硬化混合细胞性霍奇金病","结节硬化淋巴细胞减少性霍奇金病","弥漫性小细胞型淋巴瘤","小淋巴细胞性淋巴瘤",
-            "淋巴浆细胞性淋巴瘤","弥漫性小核裂细胞性淋巴瘤","恶性淋巴瘤,淋巴细胞性,中分化,弥漫性","中心细胞性淋巴瘤","小细胞和大细胞混合型弥漫性恶性淋巴瘤","弥漫性中心母细胞-中心细胞性恶性淋巴瘤",
-            "恶性淋巴瘤性息肉病","原发渗出性淋巴瘤","纵隔大B细胞淋巴瘤","胸腺大B细胞淋巴瘤","大细胞淋巴瘤","弥漫性大细胞淋巴瘤","血管内大B细胞淋巴瘤","弥漫大B细胞淋巴瘤","T细胞组织细胞丰富型大B细胞淋巴瘤",
-            "间变性大B细胞淋巴瘤","弥漫性大细胞核裂淋巴瘤","弥漫性大细胞无核裂淋巴瘤","弥漫性中心母细胞性淋巴瘤","免疫母细胞性淋巴瘤","浆母细胞淋巴瘤","恶性淋巴瘤,大B细胞,弥漫性,免疫母细胞性",
-            "原淋巴细胞性淋巴瘤","弥漫性小细胞无核裂淋巴瘤","伯基特淋巴瘤","伯基特淋巴瘤NOS","脾缘区B细胞淋巴瘤","脾边缘带淋巴瘤","滤泡性淋巴瘤","混合细胞型滤泡性淋巴肉瘤","滤泡性中心母细胞-中心细胞性淋巴瘤",
-            "结节性淋巴细胞性高分化淋巴瘤","结节性淋巴细胞性中分化淋巴瘤","小核裂细胞滤泡性淋巴瘤","结节性淋巴细胞性低分化淋巴瘤","中心母细胞性滤泡性淋巴瘤","滤泡性大细胞淋巴瘤","边缘区B细胞淋巴瘤",
-            "结内边缘带B细胞淋巴瘤","结外边缘带B细胞淋巴瘤","与黏膜有关的淋巴样组织淋巴瘤","与支气管有关的淋巴样组织淋巴瘤","与皮肤有关的淋巴样组织淋巴瘤","蕈样真菌病","塞扎里病","外周T细胞淋巴瘤",
-            "大细胞外周T-细胞淋巴瘤","间变大细胞T-细胞淋巴瘤,ALK阴性","T-区恶性淋巴瘤","淋巴上皮样淋巴瘤","伦纳特淋巴瘤","外周T-细胞淋巴瘤,AILD","血管免疫母细胞性T细胞淋巴瘤","血管免疫母细胞性淋巴瘤",
-            "外周T细胞淋巴瘤,多形性小细胞","外周T细胞淋巴瘤,多形性中等细胞和大细胞","皮下脂膜炎样T细胞淋巴瘤","皮肤淋巴瘤","肉芽肿性皮肤松弛症","皮肤T细胞淋巴瘤","单核细胞样B细胞淋巴瘤","血管内皮瘤病",
-            "血管中心性T-细胞淋巴瘤","恶性网状细胞增多症","大细胞(ki-1+)淋巴瘤","间变性大细胞淋巴瘤,ALK阳性","间变性大细胞淋巴瘤","肝脾T细胞淋巴瘤","肝脾γ-δ细胞淋巴瘤","肠T细胞淋巴瘤",
-            "与肠病相关的T-细胞淋巴瘤","原发皮肤CD30+T细胞淋巴瘤","原发皮肤间变性大细胞淋巴瘤","自然杀伤/T细胞淋巴瘤","恶性组织细胞增多症","急性分化性进行性组织细胞增多症","急性婴儿期网状内皮细胞增多症",
-            "真性组织细胞淋巴瘤","全身EBV阳性T细胞淋巴增生疾病,童年","EB病毒相关性NK细胞增生症","种痘样水疱病样淋巴瘤","原发皮肤γδ-T细胞淋巴瘤","前体细胞淋巴母细胞性淋巴瘤","淋巴母细胞瘤",
-            "前体B细胞淋巴母细胞性淋巴瘤","前体T细胞淋巴母细胞性淋巴瘤","浆细胞瘤","孤立性骨髓瘤","浆细胞肉瘤","骨的孤立性浆细胞瘤","多发性骨髓瘤","多发性浆细胞骨髓瘤","骨髓瘤病","浆细胞白血病",
-            "髓外浆细胞瘤","ALK阳性大B细胞淋巴瘤","起源于HHV8相关多中心性Castleman病的大B细胞淋巴瘤","肥大细胞瘤","肥大细胞肉瘤","恶性肥大细胞增多症","恶性组织细胞增生症","朗格汉斯细胞组织细胞增生症",
-            "朗格汉斯细胞组织细胞增生症,单病灶","朗格汉斯细胞组织细胞增生症,多病灶","朗格汉斯细胞组织细胞增生症,播散性","组织细胞肉瘤","朗格汉斯细胞肉瘤","交错树突细胞肉瘤","小结滤泡树突细胞瘤",
-            "小结树突细胞肉瘤","纤维母细胞网状细胞肿瘤","免疫增生性疾病","瓦尔登斯特伦巨球蛋白血症","淋巴浆细胞淋巴瘤","沃尔丹斯特伦巨球蛋白血症","重链病","免疫增生性小肠病","单克隆丙种球蛋白病",
-            "血管中心性免疫增生性损害","血管中心性免疫增生性病变,恶性","血管免疫母细胞淋巴结病","T-γ淋巴组织增生性疾病","免疫球蛋白沉积病","免疫球蛋白沉积病,恶性","白血病","急性白血病","未分化细胞白血病",
-            "干细胞白血病","亚急性白血病","慢性白血病","非白血性白血病","急性混合细胞性白血病","混合表型急性白血病,伴t(9;22)(q34;q11.2);BCR-ABL1","混合表型急性白血病,伴t(v;11q23); MLL重排",
-            "混合表型急性白血病,伴B/髓样","混合表型急性白血病,伴T/髓样","B淋巴母细胞白血病/淋巴瘤,NOS","B淋巴母细胞白血病/淋巴瘤,t(9;22)(q34;q11.2);BCR-ABL1",
-            "B淋巴母细胞白血病/淋巴瘤,t(v;11q23); MLL 重排","B淋巴母细胞白血病/淋巴瘤,t(12;21)(p13;q22); TEL-AML1(ETV6-RUNX1)","B淋巴母细胞白血病/淋巴瘤,超二倍性",
-            "B淋巴母细胞白血病/淋巴瘤,亚二倍性(亚二倍性ALL)","B淋巴母细胞白血病/淋巴瘤,t(5;14)(q31;q32);IL3-IGH","B淋巴母细胞白血病/淋巴瘤,t(1;19)(q23;p13.3);E2A-PBX1(TCF3-PBX1)",
-            "淋巴样白血病","淋巴细胞性白血病","急性淋巴细胞性白血病","急性淋巴细胞性白血病,L1型","急性淋巴细胞性白血病,L2型","急性淋巴细胞性白血病,L3型","慢性粒细胞性白血病,急淋变",
-            "亚急性淋巴细胞性白血病","慢性淋巴细胞性白血病","非白血性淋巴细胞性白血病","幼淋巴细胞白血病","伯基特细胞白血病","成人T细胞白血病","浆细胞性白血病","T-细胞大颗粒淋巴细胞白血病",
-            "T细胞大颗粒淋巴细胞白血病","幼淋巴细胞白血病","幼淋巴细胞白血病,B细胞型","B-前淋巴细胞性白血病","幼淋巴细胞白血病,T细胞型","前体细胞淋巴细胞白血病","前体B细胞淋巴细胞白血病",
-            "前体T细胞淋巴细胞白血病","红白血病","急性红细胞增多症","慢性红细胞增多症","海尔迈尔-舍纳病","淋巴肉瘤细胞白血病","髓系白血病","急性髓系白血病","亚急性髓系白血病","慢性髓系白血病",
-            "慢性髓系白血病,急性发作","慢性中幼粒细胞性白血病","非白血性髓系白血病","急性髓系白血病,t(6;9)(p23;q34);DEK-NUP214","急性早幼粒细胞性白血病","复发性急性早幼粒细胞性白血病",
-            "急性粒单核细胞白血病","慢性粒单核细胞白血病","嗜碱细胞白血病","急性髓系白血病,伴异常骨髓嗜酸粒细胞","急性髓系白血病,最低分化","急性髓系白血病,不伴成熟","急性髓系白血病,伴成熟",
-            "慢性髓系白血病,BCR/ABL阳性","非典型性慢性髓系白血病,BCR/ABL阴性","嗜酸细胞白血病","单核细胞白血病","组织细胞白血病","急性单核细胞白血病","亚急性单核细胞白血病","慢性单核细胞白血病",
-            "慢性单核细胞白血病,急性加重","非白血性单核细胞白血病","急性髓系白血病,伴有多谱系发育不良","急性髓系白血病,t(8;21)(q22;q22);RUNX1-RUNX1T1","急性髓样白血病,11q23异常",
-            "髓样白血病伴唐氏综合征","肥大细胞白血病","急性原巨核细胞白血病","急性髓系白血病(巨核母细胞性),t(1;22)(p13;q13); RBM15-MKL1","髓样肉瘤","急性全骨髓增殖症","急性骨髓纤维化",
-            "多毛细胞白血病","白血病性网状内皮细胞增殖","幼年粒单核细胞白血病","侵袭性NK细胞白血病","真性红细胞增多症","慢性骨髓增殖性疾病","骨髓纤维化伴髓样化生","巨核细胞性骨髓硬化","特发性血小板增多症",
-            "慢性中性粒细胞白血病","慢性嗜酸性细胞白血病","髓样和淋巴样肿瘤,伴PDGFRA重排","髓样肿瘤伴PDGFRB重排","髓样和淋巴样肿瘤,FGFR1","淋巴组织增生性疾病","淋巴增生性疾病,恶性","难治性贫血",
-            "难治性贫血,单系病态造血","难治性贫血,伴环形铁粒幼细胞","难治性贫血,多系病态造血","难治性贫血,伴原始细胞增多","骨髓增生异常综合征"
+            "动态未定肿瘤", "恶性肿瘤", "转移性肿瘤", "溃疡恶变", "息肉恶变", "恶性瘤细胞", "小细胞型恶性肿瘤", "巨细胞型恶性肿瘤", "梭形细胞型恶性肿瘤", "转移性梭形细胞型恶性肿瘤", "原位癌", "癌",
+            "转移性癌", "上皮内癌", "恶性上皮瘤", "大细胞癌", "转移性大细胞癌", "大细胞神经内分泌癌", "转移性大细胞神经内分泌癌", "具有杆状显型大细胞癌", "玻璃状细胞癌", "未分化型癌", "转移性未分化癌",
+            "癌,间变", "多形性癌", "转移性多形性癌", "多形性肉瘤样癌", "巨细胞和梭型细胞癌", "巨细胞癌", "转移性巨细胞癌", "梭形细胞癌", "转移性梭形细胞癌", "假肉瘤性癌", "转移性假肉瘤性癌", "肉瘤样癌",
+            "转移性肉瘤样癌", "多角细胞癌", "转移性多角细胞癌", "破骨细胞样巨细胞癌", "微小瘤", "小细胞癌", "转移性小细胞癌", "小细胞神经内分泌癌", "圆形细胞癌", "储备细胞癌", "燕麦细胞癌", "小细胞癌,梭形细胞",
+            "小细胞癌,中间细胞", "小细胞-大细胞癌", "转移性小细胞-腺癌", "小细胞-腺癌", "小细胞-鳞状细胞癌", "混合小细胞癌", "非小细胞癌", "转移性非小细胞癌", "乳头状瘤", "乳头状原位癌", "乳头状癌",
+            "转移性乳头状癌", "疣状乳头状瘤", "疣状癌", "转移性疣状癌", "疣状鳞状细胞癌", "鳞状细胞乳头状瘤", "乳头状鳞状细胞原位癌", "乳头状鳞状细胞癌", "转移性乳头状鳞状细胞癌", "内翻性乳头状瘤",
+            "内翻性乳头状瘤癌变", "转移性内翻性乳头状瘤癌变", "乳头状瘤病", "鳞状细胞原位癌", "鳞状细胞癌", "转移性鳞状细胞癌", "角化性鳞状细胞癌", "转移性角化性鳞状细胞癌", "角化性大细胞鳞状细胞癌",
+            "非角化性大细胞鳞状细胞癌", "转移性非角化性大细胞鳞状细胞癌", "非角化性小细胞鳞状细胞癌", "梭形细胞鳞状细胞癌", "腺样鳞状细胞癌", "转移性腺样鳞状细胞癌", "鳞状细胞原位癌,伴可疑间质侵袭",
+            "微小侵袭性鳞状细胞癌", "鳞状上皮内肿瘤,3级", "宫颈上皮内肿瘤,Ⅲ级", "阴道上皮内肿瘤,Ⅲ级", "外阴上皮内肿瘤,Ⅲ级", "肛门上皮内肿瘤,Ⅲ级", "鳞状细胞癌,伴角质形成", "凯拉增殖性红斑", "鲍恩病",
+            "淋巴上皮癌", "转移性淋巴上皮癌", "淋巴上皮瘤样癌", "基底样鳞状细胞癌", "鳞状细胞癌,明细胞型", "基底细胞瘤", "基底细胞癌", "转移性基底细胞癌", "多中心性基底细胞癌", "硬斑性基底细胞癌",
+            "纤维上皮性基底细胞癌", "基底鳞状细胞癌", "转移性基底鳞状细胞癌", "异型癌", "转移性异型癌", "雅达逊表皮内上皮瘤", "基底细胞癌,结节性", "转移性基底细胞癌,结节性", "腺样基底癌", "转移性腺样基底癌",
+            "毛发上皮瘤", "毛囊瘤", "毛根鞘瘤", "毛根鞘瘤,交界性", "毛鞘癌", "转移性毛根鞘癌", "毛发瘤", "增生性毛鞘囊肿", "增生性毛鞘囊肿恶变", "毛基质瘤", "毛基质癌", "移行细胞乳头状瘤",
+            "膀胱上皮乳头状瘤", "移行细胞原位癌", "移行细胞癌", "转移性移行细胞癌", "膀胱息肉", "施奈德乳头状瘤", "翻转型移行细胞乳头状瘤", "施奈德癌", "梭形细胞移行细胞癌", "基底细胞样癌", "转移性基底细胞样腺癌",
+            "泄殖腔源性癌", "潜在低度恶性乳头状尿路上皮肿瘤", "非侵袭性乳头状移行细胞癌", "乳头状移行细胞癌", "转移性乳头状移行细胞癌", "非浸润性乳头状尿路上皮癌", "微乳头状移行细胞癌", "转移性微乳头状移行细胞癌",
+            "腺瘤", "支气管腺瘤", "原位腺癌", "腺癌", "转移性腺癌", "非典型腺瘤", "硬腺癌", "转移性硬腺癌", "皮革状胃", "表面扩散性腺癌", "肠型腺癌", "弥漫型癌", "单形性腺瘤", "基底细胞腺瘤", "基底细胞腺癌",
+            "腺状上皮内肿瘤,3级", "前列腺上皮内肿瘤,3级", "胰岛细胞腺瘤", "胰岛细胞瘤", "胰岛细胞癌", "转移性胰岛细胞癌", "胰岛素瘤", "恶性胰岛素瘤", "转移性胰岛素瘤", "恶性高血糖素瘤", "转移性高血糖素瘤",
+            "胃泌素瘤", "恶性胃泌素瘤", "转移性胃泌素瘤", "混合性导管-内分泌癌", "混合性胰岛细胞和外分泌腺癌", "胰腺瘤", "恶性胰腺瘤", "转移性胰腺瘤", "生长抑素瘤", "恶性生长抑素瘤", "转移性生长抑素瘤",
+            "肠高血糖素瘤", "恶性肠高血糖素瘤", "转移性肠高血糖素瘤", "胆管腺瘤", "胆管原位癌", "胆管癌", "转移性胆管癌", "胆管囊腺瘤", "胆管囊腺癌", "克拉特斯金瘤", "肝细胞腺瘤", "肝细胞癌", "转移性肝细胞癌",
+            "纤维板状肝细胞癌", "硬癌性肝细胞癌", "肝细胞癌,梭型细胞变体", "肝细胞癌,明细胞型", "多形型肝细胞癌", "混合性肝细胞癌和胆管癌", "转移性混合性肝细胞癌和胆管癌", "小梁性腺瘤", "小梁性腺癌",
+            "胚胎性腺瘤", "外分泌性皮肤圆柱瘤", "腺样囊性癌", "转移性腺样囊性癌", "筛状原位癌", "筛状癌", "转移性筛状癌", "微小囊性腺瘤", "泌乳腺瘤", "腺瘤样息肉", "腺瘤样息肉内原位腺癌", "腺瘤样息肉内腺癌",
+            "管状腺瘤内的原位腺癌", "腺瘤样息肉,癌变", "腺瘤样息肉内的原位癌", "管状腺瘤内的腺癌", "管状腺瘤", "管状腺瘤内原位癌", "管状腺癌", "转移性管状腺癌", "扁平腺瘤", "锯齿状腺瘤", "壁细胞癌", "肛门腺腺癌",
+            "结肠腺瘤样息肉病", "结肠腺瘤样息肉病内腺癌", "家族性结肠息肉病", "家族性息肉病,癌变", "腺瘤病", "腺瘤病癌变", "多发性腺瘤样息肉", "多发性腺瘤样息肉内腺癌", "实体型导管原位癌", "实性癌",
+            "转移性实性癌", "单纯癌", "转移性单纯癌", "阑尾类癌", "恶性类癌", "转移性类癌", "嗜银细胞瘤", "神经内分泌肿瘤", "嗜银性类癌", "恶性嗜银性类癌", "肠嗜铬样细胞类癌", "恶性肠嗜铬样细胞类癌", "杯形细胞类癌",
+            "黏液性类癌", "复合性类癌", "混合性类癌和腺癌", "混合性腺神经内分泌癌", "混合性腺鳞癌和神经内分泌癌", "管状类癌", "腺类癌瘤", "神经内分泌癌", "转移性神经内分泌癌", "梅克尔细胞癌",
+            "原发性皮肤神经内分泌癌", "APUD瘤", "非典型类癌性瘤", "转移性非典型类癌性瘤", "肺腺瘤病", "细支气管-肺泡腺癌", "转移性细支气管-肺泡腺癌", "肺泡腺瘤", "肺泡腺癌", "转移性肺泡腺癌",
+            "细支气管肺泡癌,非黏蛋白性", "细支气管肺泡癌,黏蛋白性", "细支气管肺泡癌,黏蛋白性和非黏蛋白性", "腺癌,伴混合性亚型", "乳头状腺瘤", "乳头状腺癌", "转移性乳头状腺癌", "绒毛状腺瘤", "绒毛状腺瘤内原位腺癌",
+            "绒毛状腺瘤内腺癌", "绒毛状腺癌", "转移性绒毛状腺癌", "管状绒毛状腺瘤", "管状绒毛状腺瘤内原位腺癌", "管状绒毛状腺瘤内腺癌", "绒毛腺性腺瘤", "管状绒毛状腺癌", "腺状乳头状瘤病", "嫌色细胞腺瘤", "嫌色细胞癌",
+            "转移性嫌色细胞癌", "催乳素瘤", "垂体腺瘤", "侵袭性垂体腺瘤", "垂体癌", "嗜酸细胞腺瘤", "嗜酸细胞癌", "转移性嗜酸细胞癌", "混合性嗜酸-嗜碱细胞腺瘤", "混合性嗜酸-嗜碱细胞癌", "转移性混合性嗜酸-嗜碱细胞癌",
+            "嗜酸性腺瘤", "嗜酸性腺癌", "转移性嗜酸性腺癌", "嗜碱细胞腺瘤", "嗜碱细胞癌", "转移性嗜碱细胞癌", "黏液样细胞腺癌", "透明细胞腺瘤", "透明细胞腺癌", "转移性透明细胞腺癌", "中肾样型透明细胞癌", "肾上腺样瘤",
+            "肾细胞癌", "转移性肾细胞癌", "乳头状肾细胞癌", "明细胞腺纤维瘤", "交界恶性明细胞腺纤维瘤", "富脂质癌", "富糖原癌", "囊性相关肾细胞癌", "嫌色细胞型肾细胞癌", "肉瘤样肾细胞癌", "集合管癌", "颗粒细胞癌",
+            "转移性颗粒细胞癌", "主细胞腺瘤", "水样明细胞腺瘤", "水样明细胞腺癌", "转移性水样明细胞腺癌", "混合细胞腺瘤", "混合细胞腺癌", "转移性混合细胞腺癌", "混合性管状腺癌和黏液腺癌",
+            "混合性宫内膜样腺癌和黏液性腺癌", "混合性宫内膜样腺癌和透明细胞癌", "脂肪腺瘤", "后肾腺瘤", "滤泡性腺瘤", "非典型滤泡性腺瘤", "滤泡性腺癌", "转移性滤泡性腺癌", "高分化滤泡性腺癌",
+            "小梁性滤泡性腺癌", "胎儿腺瘤", "胎儿腺癌", "微滤泡性腺瘤", "胶样腺瘤", "巨滤泡性腺瘤", "微侵袭性滤泡性腺癌", "透明小梁性腺瘤", "岛回癌", "乳头状滤泡性腺癌", "转移性乳头状滤泡性腺癌",
+            "乳头状微小癌", "转移性乳头状微小癌", "嗜酸细胞乳头状癌", "包膜性乳头状癌", "柱状细胞乳头状癌", "髓样癌,伴淀粉样基质", "混合性髓样-滤泡性癌", "混合性髓样-乳头状癌", "无包膜硬化性癌",
+            "多发性内分泌腺瘤", "多发性内分泌腺瘤,1型", "多发性内分泌腺瘤,2a型", "多发性内分泌腺瘤,2b型", "球旁细胞瘤", "肾上腺皮质腺瘤", "肾上腺皮质腺癌", "转移性肾上腺皮质细胞癌",
+            "肾上腺皮质腺瘤,致密细胞", "肾上腺皮质腺瘤,富色素变异", "肾上腺皮质腺瘤,明细胞", "肾上腺皮质腺瘤,小球细胞", "肾上腺皮质腺瘤,混合细胞", "子宫内膜样腺瘤", "交界恶性子宫内膜样腺瘤",
+            "子宫内膜样腺癌", "转移性子宫内膜样腺癌", "子宫内膜样腺纤维瘤", "交界恶性子宫内膜样腺纤维瘤", "恶性子宫内膜样腺纤维瘤", "转移性子宫内膜样腺纤维瘤", "分泌变异性子宫内膜样腺癌",
+            "纤毛细胞变异性子宫内膜样腺癌", "宫颈内膜型腺癌", "皮肤附属器腺瘤", "皮肤附属器癌", "毛囊周纤维瘤", "汗管纤维腺瘤", "汗腺腺瘤", "汗腺瘤", "汗腺腺癌", "转移性汗腺腺癌", "顶泌性腺瘤",
+            "顶泌性腺癌", "透明细胞汗腺腺瘤", "外分泌性汗腺腺瘤", "汗腺囊瘤", "乳头状汗腺腺瘤", "乳头状汗管腺瘤", "汗管瘤", "外分泌性乳头状腺瘤", "侵袭性指[趾]乳头状腺瘤", "外分泌性乳头状腺癌",
+            "汗腺汗孔瘤", "汗孔癌", "皮脂腺腺瘤", "皮脂腺腺癌", "外分泌性腺癌", "耵聍腺瘤", "耵聍腺癌", "黏液表皮样瘤", "黏液表皮样癌", "转移性黏液表皮样癌", "囊腺瘤", "囊腺癌", "转移性囊腺癌",
+            "浆液性囊腺瘤", "浆液性囊腺癌", "转移性浆液性囊腺癌", "交界性浆液性囊腺瘤", "交界恶性浆液性囊腺瘤", "交界转移性浆液性囊腺瘤", "交界性浆液性肿瘤", "明细胞囊腺瘤", "交界恶性明细胞囊性瘤",
+            "乳头状囊腺瘤", "乳头状囊腺癌", "转移性乳头状囊腺癌", "交界恶性乳头状囊腺瘤", "实性假乳头状瘤", "实性假乳头状癌", "转移性实性假乳头状癌", "乳头状囊性瘤", "导管内乳头状黏液腺瘤",
+            "导管内乳头状黏液瘤伴有发育不良", "导管内乳头状黏液癌,非侵袭性", "导管内乳头状黏液癌,侵袭性", "房室结囊性瘤", "乳头状浆液性囊腺瘤", "乳头状浆液性囊腺癌", "转移性乳头状浆液性囊腺癌",
+            "浆液性表面乳头状瘤", "浆液性表面乳头状癌", "交界恶性乳头状浆液性囊腺瘤", "交界恶性表面乳头状浆液性囊腺瘤", "黏液性囊腺瘤", "黏液性囊腺瘤伴有中度发育不良", "黏液性囊腺癌",
+            "转移性黏液性囊腺癌", "交界性粘液性囊腺瘤", "假黏液性腺癌", "乳头状黏液性囊腺瘤", "乳头状黏液性囊腺癌", "转移性乳头状黏液性囊腺癌", "交界粘液性肿瘤", "交界恶性黏液性囊腺瘤",
+            "交界恶性乳头状黏液性囊腺瘤", "黏液腺瘤", "黏液腺癌", "转移性黏液腺癌", "乳头状黏液腺癌", "腹膜假黏液瘤", "产黏液性腺癌", "宫颈内型黏液腺癌", "印戒细胞癌", "转移性印戒细胞癌",
+            "克鲁肯贝格瘤", "导管内癌", "浸润性导管癌", "转移性导管癌", "导管腺癌", "非浸润性粉刺癌", "粉刺癌", "转移性粉刺癌", "乳房幼年型癌", "导管内乳头状瘤", "导管内乳头状癌", "导管内乳头状腺癌伴侵袭",
+            "非浸润性导管内乳头状癌", "囊内乳头状腺瘤", "非浸润性囊内癌", "囊内癌", "转移性囊内癌", "导管内乳头状瘤病", "乳头的腺瘤 ", "导管内微乳头状癌", "囊性分泌亢进性癌", "实性乳头状癌", "髓样癌", "转移性髓样癌",
+            "髓样癌伴淀粉样间质", "髓样癌伴淋巴样间质", "非典型性髓样癌", "促结缔组织增生型导管癌", "小叶原位癌", "浸润性小叶癌", "转移性小叶浸润性癌", "浸润性小管癌", "导管内癌和小叶原位癌", "浸润性导管和小叶癌",
+            "浸润性导管和黏液癌", "转移性浸润性导管和粘液癌", "浸润性导管和筛状癌", "浸润性导管和管状癌", "浸润性导管和胶样癌", "浸润性导管癌和微乳头状癌", "浸润性小叶癌和其他类型癌", "多形性低度腺癌", "炎性癌",
+            "转移性炎性癌", "乳房佩吉特病", "转移性乳房佩吉特病", "乳房佩吉特病和浸润性导管癌", "转移性乳房佩吉特病和浸润性导管癌", "乳房外佩吉特病", "转移性乳房外佩吉特病", "乳房佩吉特病和导管内癌",
+            "转移性乳房佩吉特病和导管内癌", "腺泡细胞腺瘤", "腺泡细胞瘤", "腺泡细胞癌", "转移性腺泡细胞癌", "腺泡细胞囊腺癌", "腺鳞癌", "转移性腺鳞癌", "腺淋巴瘤", "上皮-肌上皮癌", "转移性上皮-肌上皮癌",
+            "腺棘皮癌", "转移性腺棘皮癌", "腺癌,伴鳞状化生", "腺癌,伴软骨和骨化生", "腺癌,伴梭形细胞化生", "腺癌,伴顶泌性汗腺化生", "腺癌,伴神经内分泌分化", "化生性癌", "上皮/间叶混合性化生性癌", "肝样腺癌",
+            "胸腺瘤", "恶性胸腺瘤", "转移性胸腺瘤", "化生型胸腺瘤", "胸腺瘤,A型", "恶性胸腺瘤,A型", "胸腺瘤,AB型", "恶性胸腺瘤,AB型", "胸腺瘤,B1型", "恶性胸腺瘤,B1型", "胸腺瘤,B2型", "恶性胸腺瘤,B2型",
+            "胸腺瘤,B3型", "恶性胸腺瘤,B3型", "转移性恶性胸腺瘤,B3型", "胸腺瘤,C型", "异位错构瘤性胸腺瘤", "梭形上皮性瘤,伴胸腺样成分", "癌,表现出胸腺样成分", "性索-性腺间质瘤", "卵巢间质瘤",
+            "性索-性腺间质瘤,不完全分化", "性索-性腺间质瘤,混合形式", "混合性颗粒细胞瘤", "间质瘤,伴小性索成分", "泡膜细胞瘤", "恶性泡膜细胞瘤", "转移性泡膜细胞瘤", "黄体化泡膜细胞瘤", "硬化性间质瘤", "黄体瘤",
+            "卵泡细胞瘤", "恶性卵泡细胞瘤", "转移性卵泡细胞瘤", "卵泡细胞-膜细胞瘤", "幼年型卵泡细胞瘤", "性索瘤伴环状小管", "男性母细胞瘤", "恶性男性母细胞瘤", "转移性男性母细胞瘤", "塞尔托利-莱迪细胞瘤",
+            "塞尔托利-莱迪细胞瘤,中分化", "塞尔托利-莱迪细胞瘤,低分化", "两性母细胞瘤", "塞尔托利-莱迪细胞瘤,网状", "塞尔托利-莱迪细胞瘤,中分化,伴异种成分", "塞尔托利-莱迪细胞瘤,低分化,伴异种成分",
+            "塞尔托利细胞瘤", "塞尔托利细胞癌", "塞托利细胞瘤,伴脂质贮积", "莱迪细胞瘤", "恶性莱迪细胞瘤", "转移性莱迪细胞瘤", "卵巢门细胞瘤", "卵巢脂质细胞瘤", "肾上腺剩余瘤", "节旁体瘤", "恶性节旁体瘤",
+            "转移性节旁体瘤", "交感神经节旁体瘤", "副交感神经节旁体瘤", "神经节细胞性节旁体瘤", "颈静脉血管球瘤", "主动脉体瘤", "颈动脉体瘤", "化学感受器瘤", "恶性化学感受器瘤", "转移性化学感受器瘤",
+            "肾上腺外节旁体瘤", "恶性肾上腺外节旁体瘤", "嗜铬细胞瘤", "恶性嗜铬细胞瘤", "转移性嗜铬细胞瘤", "嗜铬母细胞瘤", "血管球肉瘤", "血管球瘤", "交界性血管球瘤", "血管球性血管瘤", "血管球肌瘤", "血管肌周细胞瘤",
+            "血管周上皮样细胞分化肿瘤", "色素痣", "原位黑色素瘤", "恶性黑色素瘤", "转移性黑色素瘤", "毛痣", "结节性黑色素瘤", "气球细胞痣", "气球细胞黑色素瘤", "晕样痣", "退行性恶性黑色素瘤", "鼻纤维性丘疹", "神经痣",
+            "巨细胞痣", "发育不良痣", "脑膜黑色素细胞瘤", "无色素痣", "无色素性黑色素瘤", "交界痣", "交界痣内恶性黑色素瘤", "癌前黑素沉着病", "癌前黑素沉着病内恶性黑色素瘤", "哈奇森黑素雀斑",
+            "哈奇森黑素雀斑内恶性黑色素瘤", "表面扩散性黑色素瘤", "恶性肢端着色斑性黑色素瘤", "恶性促结缔组织增生性黑色素瘤", "皮内痣", "复合痣", "巨大色素痣", "巨大色素痣内恶性黑色素瘤",
+            "先天性痣内增生型皮肤损害", "上皮样细胞和梭形细胞痣", "混合性上皮样和梭状细胞黑色素瘤", "上皮样细胞痣", "上皮样细胞黑色素瘤", "梭形细胞痣", "梭形细胞黑色素瘤", "梭形细胞黑色素瘤,A型",
+            "梭形细胞黑色素瘤,B型", "蓝痣", "恶性蓝痣", "雅达松蓝痣", "细胞性蓝痣", "巨蓝痣", "肉瘤", "转移性肉瘤", "肉瘤病", "梭形细胞肉瘤", "转移性梭形细胞肉瘤", "巨细胞肉瘤(除外骨 M9250/3)",
+            "转移性巨细胞肉瘤", "小细胞肉瘤", "上皮样细胞肉瘤", "未分化肉瘤", "促结缔组织增生性小圆细胞瘤", "转移性促结缔组织增生性小圆细胞瘤", "纤维瘤", "细胞性纤维瘤", "纤维肉瘤", "转移性纤维肉瘤",
+            "真皮纤维瘤", "骨纤维瘤", "纤维黏液瘤", "黏液炎性纤维母细胞肿瘤", "纤维黏液肉瘤", "骨膜纤维瘤", "骨膜纤维肉瘤", "筋膜纤维瘤", "掌(跖)纤维瘤病", "筋膜纤维肉瘤", "婴儿性纤维肉瘤", "孤立性纤维性瘤",
+            "孤立性纤维性肿瘤", "恶性孤立性纤维性瘤", "转移性恶性孤立性纤维性瘤", "交界性孤立性纤维性瘤", "孤立性纤维性瘤,恶性", "弹力纤维瘤", "硬纤维瘤", "侵蚀性纤维瘤病", "腹部纤维瘤病", "骨韧带状瘤",
+            "促结缔组织增生性纤维瘤", "肌纤维瘤", "肌纤维瘤病", "先天性全身性纤维瘤病", "肌纤维母细胞瘤", "炎性肌纤维母细胞瘤", "肌纤维母细胞肉瘤", "血管肌纤维母细胞瘤", "支气管周肌纤维母细胞性瘤",
+            "纤维组织细胞瘤", "非典型性纤维组织细胞瘤", "恶性纤维组织细胞瘤", "转移性纤维组织细胞瘤", "纤维黄色瘤", "组织细胞瘤", "皮肤纤维瘤", "皮肤纤维肉瘤", "硬化性血管瘤", "色素沉着性隆凸性皮肤纤维肉瘤",
+            "巨细胞纤维母细胞瘤", "丛状纤维组织细胞性瘤", "血管瘤样纤维组织细胞瘤", "黏液瘤", "低级别黏液性肿瘤", "黏液肉瘤", "转移性黏液肉瘤", "肌内黏液瘤", "血管黏液瘤", "脂肪瘤", "非典型脂肪瘤", "脂肪肉瘤",
+            "转移性脂肪肉瘤", "纤维脂肪肉瘤", "纤维脂肪瘤", "高分化型脂肪肉瘤", "软纤维瘤", "黏液脂肪瘤", "黏液样脂肪肉瘤", "纤维黏液脂肪瘤", "圆细胞脂肪肉瘤", "多形性脂肪瘤", "多形性脂肪肉瘤", "混合型脂肪肉瘤",
+            "肌内脂肪瘤", "浸润性脂肪瘤", "梭形细胞脂肪瘤", "梭型细胞脂肪肉瘤", "去分化型脂肪肉瘤", "血管肌脂肪瘤", "血管肌脂肪瘤,恶变", "血管脂肪瘤", "软骨样脂肪瘤", "骨髓脂肪瘤", "蛰伏脂瘤", "脂肪母细胞瘤病",
+            "脂肪母细胞瘤", "平滑肌瘤", "平滑肌瘤病", "平滑肌肉瘤", "转移性平滑肌肉瘤", "血管平滑肌瘤病", "上皮样平滑肌瘤", "上皮样平滑肌肉瘤", "平滑肌母细胞瘤", "细胞性平滑肌瘤", "奇异性平滑肌瘤", "血管肌瘤",
+            "血管肌肉瘤", "肌瘤", "黏液样平滑肌肉瘤", "平滑肌肿瘤", "横纹肌瘤", "横纹肌肉瘤", "转移性横纹肌肉瘤", "多形型横纹肌肉瘤", "混合型横纹肌肉瘤", "胎儿横纹肌瘤", "成人横纹肌瘤", "生殖器横纹肌瘤",
+            "胚胎型横纹肌肉瘤", "转移性胚胎性横纹肌肉瘤", "葡萄样肉瘤", "梭形细胞横纹肌肉瘤", "小泡型横纹肌肉瘤", "横纹肌肉瘤伴神经节分化", "子宫内膜间质结节", "子宫内膜间质肉瘤", "转移性子宫内膜间质肉瘤",
+            "淋巴管内性间质异位症", "腺肌瘤", "非典型性息肉样腺肌瘤", "腺肉瘤", "转移性腺肉瘤", "癌性纤维瘤", "转移性癌性纤维瘤", "间质性瘤", "间质性肉瘤", "转移性间质性肉瘤", "胃肠道间质性瘤,潜在恶性未肯定",
+            "恶性胃肠道间质性瘤", "转移性胃肠道间质性瘤", "胃肠道间质肉瘤", "多形性腺瘤", "恶性混合瘤", "转移性混合瘤", "软骨样汗管瘤", "涎腺型混合瘤", "多形性腺瘤内癌", "苗勒混合瘤", "中胚层混合瘤", "转移性中胚层混合瘤",
+            "囊性部分分化性肾母细胞瘤", "恶性囊性肾瘤", "转移性囊性肾瘤", "中胚层性肾瘤", "肾母细胞瘤", "转移性肾母细胞瘤", "杆状肉瘤", "肾明细胞肉瘤", "转移性肾明细胞肉瘤", "肾源性腺纤维瘤", "肾髓性间质细胞瘤",
+            "骨化性肾瘤", "肝母细胞瘤", "转移性肝母细胞瘤", "胰母细胞瘤", "转移性胰母细胞瘤", "肺母细胞瘤", "转移性肺母细胞瘤", "胸膜肺母细胞瘤", "涎母细胞瘤", "癌肉瘤", "转移性癌肉瘤", "胚胎性癌肉瘤", "肌上皮瘤",
+            "肌上皮性癌", "转移性肌上皮样癌", "腺肌上皮瘤", "间叶瘤", "恶性间叶瘤", "转移性间叶瘤", "混合性间叶瘤", "胚胎性肉瘤", "转移性胚胎性肉瘤", "布伦纳瘤", "交界恶性布伦纳瘤", "恶性布伦纳瘤",
+            "转移性恶性布伦纳瘤", "纤维腺瘤", "小管内纤维腺瘤", "小管周纤维腺瘤", "腺纤维瘤", "腺纤维瘤,癌变", "乳头状腺纤维瘤", "浆液性腺纤维瘤", "交界恶性浆液性腺纤维瘤", "浆液性腺癌性纤维瘤",
+            "交界恶性浆液性囊性腺纤维瘤", "黏液性腺纤维瘤", "交界性黏液性腺纤维瘤", "巨大纤维腺瘤", "叶状囊肉瘤", "恶性叶状囊肉瘤", "转移性叶状囊肉瘤", "幼年型纤维腺瘤", "滑膜肉瘤", "转移性滑膜肉瘤",
+            "梭形细胞滑膜肉瘤", "上皮样细胞滑膜肉瘤", "双相分化滑膜肉瘤", "透明细胞肉瘤(除外肾的M8964/3)", "转移性透明细胞肉瘤", "恶性间皮瘤", "转移性间皮瘤", "恶性纤维性间皮瘤", "恶性上皮样间皮瘤",
+            "恶性双相分化间皮瘤", "腺瘤样瘤", "囊性间皮瘤", "无性细胞瘤", "转移性无性细胞瘤", "精原细胞瘤", "转移性精原细胞瘤", "间变精原细胞瘤", "精母细胞性精原细胞瘤", "转移性精母细胞性精原细胞瘤",
+            "生殖细胞瘤", "转移性生殖细胞瘤", "非精原细胞瘤样生殖细胞瘤", "胚胎性癌", "转移性胚胎性癌", "内胚窦瘤", "转移性内胚窦瘤", "睾丸母细胞瘤", "多胚瘤", "性腺母细胞瘤", "畸胎瘤", "恶性畸胎瘤",
+            "转移性畸胎瘤", "畸胎癌", "未分化恶性畸胎瘤", "中分化恶性畸胎瘤", "皮样囊肿", "皮样囊肿恶变", "畸胎瘤伴恶性变", "混合性生殖细胞瘤", "转移性混合性生殖细胞瘤", "混合型畸胎瘤和精原细胞瘤",
+            "卵巢甲状腺肿", "恶性卵巢甲状腺肿", "转移性恶性卵巢甲状腺肿", "甲状腺肿性类癌", "葡萄胎", "侵袭性葡萄胎", "绒毛膜癌", "转移性绒毛膜癌", "绒毛膜癌伴畸胎瘤", "滋养细胞恶性畸胎瘤", "部分性葡萄胎",
+            "胎盘部位滋养细胞瘤", "上皮样滋养层肿瘤", "中肾性瘤", "恶性中肾瘤", "转移性中肾瘤", "血管瘤", "血管肉瘤", "转移性血管肉瘤", "海绵状血管瘤", "海绵状痣", "静脉血管瘤", "葡萄状血管瘤", "动静脉血管瘤",
+            "库普弗细胞肉瘤", "上皮样血管瘤", "组织细胞样血管瘤", "血管内皮瘤", "恶性血管内皮瘤", "转移性血管内皮瘤", "毛细血管瘤", "丛状血管瘤", "肌内血管瘤", "上皮样血管内皮瘤", "恶性上皮样血管内皮瘤",
+            "血管内支气管肺泡瘤", "血管内乳头状血管内皮瘤", "梭形细胞血管内皮瘤", "卡波西肉瘤", "血管角质瘤", "疣性角化性血管瘤", "血管外皮细胞瘤", "恶性血管外皮细胞瘤", "转移性血管外皮细胞瘤",
+            "血管纤维瘤", "巨细胞血管纤维瘤", "成血管细胞瘤", "淋巴管瘤", "淋巴管肉瘤", "转移性淋巴管肉瘤", "毛细淋巴管瘤", "海绵状淋巴管瘤", "囊性淋巴管瘤", "淋巴管肌瘤", "淋巴管肌瘤病", "血管淋巴管瘤",
+            "骨瘤", "骨肉瘤", "转移性骨肉瘤", "成软骨细胞性骨肉瘤", "成纤维细胞性骨肉瘤", "转移性成纤维细胞性骨肉瘤", "毛细血管扩张性骨肉瘤", "骨佩吉特病骨肉瘤", "小细胞骨肉瘤", "中心骨肉瘤",
+            "骨内高分化骨肉瘤", "骨旁骨肉瘤", "骨样骨瘤", "骨膜外骨肉瘤", "骨膜骨肉瘤", "高等级表面骨肉瘤", "皮质内骨肉瘤", "成骨细胞瘤", "侵袭性成骨细胞瘤", "骨软骨瘤", "骨软骨瘤病", "骨软骨瘤恶变",
+            "奇异性骨旁骨软骨瘤样增生", "软骨瘤", "软骨瘤病", "软骨肉瘤", "转移性软骨肉瘤", "软骨黏液肉瘤", "近皮质软骨瘤", "近皮质软骨肉瘤", "滑膜软骨瘤病", "成软骨细胞瘤", "恶性成软骨细胞瘤",
+            "转移性成软骨细胞瘤", "黏液样软骨肉瘤", "转移性黏液性软骨肉瘤", "间质性软骨肉瘤", "转移性间质性软骨肉瘤", "软骨黏液样纤维瘤", "明细胞软骨肉瘤", "去分化软骨肉瘤", "骨巨细胞瘤", "恶性骨巨细胞瘤",
+            "转移性骨巨细胞瘤", "软组织巨细胞瘤", "恶性软组织巨细胞瘤", "转移性软组织巨细胞瘤", "腱鞘巨细胞瘤", "弥漫性腱鞘巨细胞瘤", "尤因肉瘤", "转移性尤因肉瘤", "长骨釉质瘤", "转移性长骨釉质瘤", "骨化性纤维瘤",
+            "纤维骨瘤", "牙源性瘤", "恶性牙源性瘤", "转移性牙源性瘤", "牙本质瘤", "牙骨质瘤", "牙骨质化性纤维瘤", "巨形牙骨质瘤", "牙瘤", "混合性牙瘤", "复合性牙瘤", "成釉细胞纤维牙瘤", "成釉细胞牙肉瘤",
+            "转移性成釉细胞牙肉瘤", "腺瘤样牙源性瘤", "腺性成釉细胞瘤", "钙化性牙源性囊肿", "牙源性形骸细胞瘤", "成釉细胞瘤", "恶性成釉细胞瘤", "转移性成釉细胞瘤", "牙成釉细胞瘤", "鳞状牙源性瘤", "牙源性黏液瘤",
+            "中心牙源性纤维瘤", "周围牙源性纤维瘤", "成釉细胞纤维瘤", "成釉细胞纤维肉瘤", "钙化上皮性牙源性瘤", "牙源性明细胞瘤", "牙源性癌肉瘤", "颅咽管瘤", "釉质上皮瘤样颅咽管瘤", "乳头状颅咽管瘤",
+            "松果体瘤", "松果体细胞瘤", "成松果体细胞瘤", "转移性成松果体细胞瘤", "黑变病神经外胚瘤", "周围性神经外胚瘤", "转移性周围性神经外胚瘤", "阿斯金瘤", "脊索瘤", "转移性脊索瘤", "软骨样脊索瘤",
+            "去分化脊索瘤", "旁脊索瘤", "神经胶质瘤", "转移性神经胶质瘤", "大脑神经胶质瘤病", "混合性神经胶质瘤", "室管膜下神经胶质瘤", "室管膜下巨细胞星形细胞瘤", "弥漫性中线胶质瘤", "脉络丛乳头状瘤",
+            "非典型性脉络丛乳头状瘤", "恶性脉络丛乳头状瘤", "转移性脉络丛乳头状瘤", "室管膜瘤", "转移性室管膜瘤", "间变室管膜瘤", "成室管膜细胞瘤", "乳头状室管膜瘤", "黏液乳头状室管膜瘤", "星形细胞瘤",
+            "转移性星形细胞瘤", "间变性星形细胞瘤", "转移性间变性星形细胞瘤", "原浆性星形细胞瘤", "大圆细胞性星形细胞瘤", "促结缔组织增生性婴儿星形细胞瘤", "纤维性星形细胞瘤", "毛细胞性星形细胞瘤,交界恶性",
+            "毛细胞性星形细胞瘤", "幼年型星形细胞瘤", "成胶质细胞瘤", "转移性成胶质细胞瘤", "极性成胶质细胞瘤", "多形性黄色星形细胞瘤", "成星形细胞瘤", "成神经胶质细胞瘤", "转移性成(神经)胶质细胞瘤",
+            "巨细胞成(神经)胶质细胞瘤", "神经胶质纤维瘤", "神经胶质肉瘤", "原始极性成胶质细胞瘤", "脊索状神经胶质瘤", "少突神经胶质细胞瘤", "转移性少突神经胶质细胞瘤", "间变型少突神经胶质细胞瘤",
+            "成少突神经胶质细胞瘤", "成神经管细胞瘤", "转移性成神经管细胞瘤", "促结缔组织增生性成神经管细胞瘤", "成髓样肌细胞瘤", "原始神经外胚瘤", "转移性原始神经外胚瘤", "大细胞髓母细胞瘤",
+            "转移性大细胞髓母细胞瘤", "小脑肉瘤", "转移性小脑肉瘤", "畸形细胞性肉瘤", "神经节瘤", "神经节神经母细胞瘤", "转移性神经节神经母细胞瘤", "神经节瘤病", "神经节细胞瘤", "成神经细胞瘤",
+            "转移性成神经细胞瘤", "髓上皮瘤", "转移性髓上皮瘤", "畸胎样髓上皮瘤", "神经上皮瘤", "转移性神经上皮瘤", "海绵状成神经细胞瘤", "神经节神经胶质瘤", "神经细胞瘤", "神经细胞瘤(中央型)",
+            "中枢神经细胞瘤,恶性", "中枢神经细胞瘤", "帕西尼瘤", "非典型性胚胎样/杆状瘤", "乳头状胶质神经元肿瘤", "成视网膜细胞瘤", "转移性视网膜母细胞瘤", "已分化成视网膜细胞瘤", "未分化成视网膜细胞瘤",
+            "视网膜母细胞瘤,弥漫性", "视网膜母细胞瘤,自然消退", "嗅神经源性瘤", "转移性嗅神经源性瘤", "感觉神经细胞瘤", "成感觉神经细胞瘤", "转移性成感觉神经细胞瘤", "感觉神经上皮瘤", "脑(脊)膜瘤",
+            "脑(脊)膜瘤病", "恶性脑膜瘤", "转移性脑膜瘤", "恶性脊膜瘤", "转移性脊膜瘤", "脑膜性脑(脊)膜瘤", "纤维性脑(脊)膜瘤", "沙粒体性脑(脊)膜瘤", "血管瘤性脑(脊)膜瘤", "成血管细胞性脑(脊)膜瘤",
+            "血管外皮细胞性脑(脊)膜瘤", "移行细胞性脑(脊)膜瘤", "乳头状脑(脊)膜瘤", "透明细胞脑(脊)膜瘤", "非典型脑膜瘤", "脑(脊)膜肉瘤病", "神经纤维瘤", "神经纤维瘤病", "神经纤维肉瘤", "转移性神经纤维肉瘤",
+            "环层小体神经纤维瘤", "黑变病神经纤维瘤", "丛状神经纤维瘤", "神经鞘瘤", "神经鞘瘤病", "恶性神经鞘瘤", "转移性神经鞘瘤", "恶性蝾螈瘤", "神经鞘黏液瘤", "神经瘤", "神经束瘤", "恶性神经束瘤", "转移性神经束瘤",
+            "颗粒细胞瘤", "恶性颗粒细胞瘤", "转移性颗粒细胞瘤", "颗粒细胞肌母细胞瘤", "软组织腺泡状肉瘤", "转移性软组织腺泡状肉瘤", "鞍区颗粒细胞瘤", "恶性淋巴瘤", "T-细胞淋巴瘤", "B-细胞淋巴瘤", "非霍奇金淋巴瘤",
+            "淋巴肉瘤", "网状细胞肉瘤", "小神经胶质细胞瘤", "弥漫性淋巴瘤", "复合性霍奇金和非霍奇金淋巴瘤", "原发性皮肤毛囊中心淋巴瘤", "霍奇金病", "霍奇金淋巴瘤,富淋巴细胞性", "混合细胞型霍奇金病",
+            "混合细胞型霍奇金病,经典型", "淋巴细胞减少型霍奇金病", "淋巴细胞减少型霍奇金病,经典型", "淋巴细胞减少型霍奇金病,弥漫性纤维化", "淋巴细胞减少型霍奇金病,弥漫性纤维化,经典型", "网状淋巴细胞减少型霍奇金病",
+            "网状淋巴细胞减少型霍奇金病,经典型", "淋巴细胞为主型霍奇金病", "弥漫性淋巴细胞为主型霍奇金病", "结节性淋巴细胞为主型霍奇金病", "霍奇金副肉芽肿", "霍奇金肉芽肿", "霍奇金肉瘤",
+            "结节硬化型霍奇金病", "结节硬化富细胞相霍奇金病", "结节硬化淋巴细胞为主型霍奇金病", "结节硬化混合细胞性霍奇金病", "结节硬化淋巴细胞减少性霍奇金病", "弥漫性小细胞型淋巴瘤", "小淋巴细胞性淋巴瘤",
+            "淋巴浆细胞性淋巴瘤", "弥漫性小核裂细胞性淋巴瘤", "恶性淋巴瘤,淋巴细胞性,中分化,弥漫性", "中心细胞性淋巴瘤", "小细胞和大细胞混合型弥漫性恶性淋巴瘤", "弥漫性中心母细胞-中心细胞性恶性淋巴瘤",
+            "恶性淋巴瘤性息肉病", "原发渗出性淋巴瘤", "纵隔大B细胞淋巴瘤", "胸腺大B细胞淋巴瘤", "大细胞淋巴瘤", "弥漫性大细胞淋巴瘤", "血管内大B细胞淋巴瘤", "弥漫大B细胞淋巴瘤", "T细胞组织细胞丰富型大B细胞淋巴瘤",
+            "间变性大B细胞淋巴瘤", "弥漫性大细胞核裂淋巴瘤", "弥漫性大细胞无核裂淋巴瘤", "弥漫性中心母细胞性淋巴瘤", "免疫母细胞性淋巴瘤", "浆母细胞淋巴瘤", "恶性淋巴瘤,大B细胞,弥漫性,免疫母细胞性",
+            "原淋巴细胞性淋巴瘤", "弥漫性小细胞无核裂淋巴瘤", "伯基特淋巴瘤", "伯基特淋巴瘤NOS", "脾缘区B细胞淋巴瘤", "脾边缘带淋巴瘤", "滤泡性淋巴瘤", "混合细胞型滤泡性淋巴肉瘤", "滤泡性中心母细胞-中心细胞性淋巴瘤",
+            "结节性淋巴细胞性高分化淋巴瘤", "结节性淋巴细胞性中分化淋巴瘤", "小核裂细胞滤泡性淋巴瘤", "结节性淋巴细胞性低分化淋巴瘤", "中心母细胞性滤泡性淋巴瘤", "滤泡性大细胞淋巴瘤", "边缘区B细胞淋巴瘤",
+            "结内边缘带B细胞淋巴瘤", "结外边缘带B细胞淋巴瘤", "与黏膜有关的淋巴样组织淋巴瘤", "与支气管有关的淋巴样组织淋巴瘤", "与皮肤有关的淋巴样组织淋巴瘤", "蕈样真菌病", "塞扎里病", "外周T细胞淋巴瘤",
+            "大细胞外周T-细胞淋巴瘤", "间变大细胞T-细胞淋巴瘤,ALK阴性", "T-区恶性淋巴瘤", "淋巴上皮样淋巴瘤", "伦纳特淋巴瘤", "外周T-细胞淋巴瘤,AILD", "血管免疫母细胞性T细胞淋巴瘤", "血管免疫母细胞性淋巴瘤",
+            "外周T细胞淋巴瘤,多形性小细胞", "外周T细胞淋巴瘤,多形性中等细胞和大细胞", "皮下脂膜炎样T细胞淋巴瘤", "皮肤淋巴瘤", "肉芽肿性皮肤松弛症", "皮肤T细胞淋巴瘤", "单核细胞样B细胞淋巴瘤", "血管内皮瘤病",
+            "血管中心性T-细胞淋巴瘤", "恶性网状细胞增多症", "大细胞(ki-1+)淋巴瘤", "间变性大细胞淋巴瘤,ALK阳性", "间变性大细胞淋巴瘤", "肝脾T细胞淋巴瘤", "肝脾γ-δ细胞淋巴瘤", "肠T细胞淋巴瘤",
+            "与肠病相关的T-细胞淋巴瘤", "原发皮肤CD30+T细胞淋巴瘤", "原发皮肤间变性大细胞淋巴瘤", "自然杀伤/T细胞淋巴瘤", "恶性组织细胞增多症", "急性分化性进行性组织细胞增多症", "急性婴儿期网状内皮细胞增多症",
+            "真性组织细胞淋巴瘤", "全身EBV阳性T细胞淋巴增生疾病,童年", "EB病毒相关性NK细胞增生症", "种痘样水疱病样淋巴瘤", "原发皮肤γδ-T细胞淋巴瘤", "前体细胞淋巴母细胞性淋巴瘤", "淋巴母细胞瘤",
+            "前体B细胞淋巴母细胞性淋巴瘤", "前体T细胞淋巴母细胞性淋巴瘤", "浆细胞瘤", "孤立性骨髓瘤", "浆细胞肉瘤", "骨的孤立性浆细胞瘤", "多发性骨髓瘤", "多发性浆细胞骨髓瘤", "骨髓瘤病", "浆细胞白血病",
+            "髓外浆细胞瘤", "ALK阳性大B细胞淋巴瘤", "起源于HHV8相关多中心性Castleman病的大B细胞淋巴瘤", "肥大细胞瘤", "肥大细胞肉瘤", "恶性肥大细胞增多症", "恶性组织细胞增生症", "朗格汉斯细胞组织细胞增生症",
+            "朗格汉斯细胞组织细胞增生症,单病灶", "朗格汉斯细胞组织细胞增生症,多病灶", "朗格汉斯细胞组织细胞增生症,播散性", "组织细胞肉瘤", "朗格汉斯细胞肉瘤", "交错树突细胞肉瘤", "小结滤泡树突细胞瘤",
+            "小结树突细胞肉瘤", "纤维母细胞网状细胞肿瘤", "免疫增生性疾病", "瓦尔登斯特伦巨球蛋白血症", "淋巴浆细胞淋巴瘤", "沃尔丹斯特伦巨球蛋白血症", "重链病", "免疫增生性小肠病", "单克隆丙种球蛋白病",
+            "血管中心性免疫增生性损害", "血管中心性免疫增生性病变,恶性", "血管免疫母细胞淋巴结病", "T-γ淋巴组织增生性疾病", "免疫球蛋白沉积病", "免疫球蛋白沉积病,恶性", "白血病", "急性白血病", "未分化细胞白血病",
+            "干细胞白血病", "亚急性白血病", "慢性白血病", "非白血性白血病", "急性混合细胞性白血病", "混合表型急性白血病,伴t(9;22)(q34;q11.2);BCR-ABL1", "混合表型急性白血病,伴t(v;11q23); MLL重排",
+            "混合表型急性白血病,伴B/髓样", "混合表型急性白血病,伴T/髓样", "B淋巴母细胞白血病/淋巴瘤,NOS", "B淋巴母细胞白血病/淋巴瘤,t(9;22)(q34;q11.2);BCR-ABL1",
+            "B淋巴母细胞白血病/淋巴瘤,t(v;11q23); MLL 重排", "B淋巴母细胞白血病/淋巴瘤,t(12;21)(p13;q22); TEL-AML1(ETV6-RUNX1)", "B淋巴母细胞白血病/淋巴瘤,超二倍性",
+            "B淋巴母细胞白血病/淋巴瘤,亚二倍性(亚二倍性ALL)", "B淋巴母细胞白血病/淋巴瘤,t(5;14)(q31;q32);IL3-IGH", "B淋巴母细胞白血病/淋巴瘤,t(1;19)(q23;p13.3);E2A-PBX1(TCF3-PBX1)",
+            "淋巴样白血病", "淋巴细胞性白血病", "急性淋巴细胞性白血病", "急性淋巴细胞性白血病,L1型", "急性淋巴细胞性白血病,L2型", "急性淋巴细胞性白血病,L3型", "慢性粒细胞性白血病,急淋变",
+            "亚急性淋巴细胞性白血病", "慢性淋巴细胞性白血病", "非白血性淋巴细胞性白血病", "幼淋巴细胞白血病", "伯基特细胞白血病", "成人T细胞白血病", "浆细胞性白血病", "T-细胞大颗粒淋巴细胞白血病",
+            "T细胞大颗粒淋巴细胞白血病", "幼淋巴细胞白血病", "幼淋巴细胞白血病,B细胞型", "B-前淋巴细胞性白血病", "幼淋巴细胞白血病,T细胞型", "前体细胞淋巴细胞白血病", "前体B细胞淋巴细胞白血病",
+            "前体T细胞淋巴细胞白血病", "红白血病", "急性红细胞增多症", "慢性红细胞增多症", "海尔迈尔-舍纳病", "淋巴肉瘤细胞白血病", "髓系白血病", "急性髓系白血病", "亚急性髓系白血病", "慢性髓系白血病",
+            "慢性髓系白血病,急性发作", "慢性中幼粒细胞性白血病", "非白血性髓系白血病", "急性髓系白血病,t(6;9)(p23;q34);DEK-NUP214", "急性早幼粒细胞性白血病", "复发性急性早幼粒细胞性白血病",
+            "急性粒单核细胞白血病", "慢性粒单核细胞白血病", "嗜碱细胞白血病", "急性髓系白血病,伴异常骨髓嗜酸粒细胞", "急性髓系白血病,最低分化", "急性髓系白血病,不伴成熟", "急性髓系白血病,伴成熟",
+            "慢性髓系白血病,BCR/ABL阳性", "非典型性慢性髓系白血病,BCR/ABL阴性", "嗜酸细胞白血病", "单核细胞白血病", "组织细胞白血病", "急性单核细胞白血病", "亚急性单核细胞白血病", "慢性单核细胞白血病",
+            "慢性单核细胞白血病,急性加重", "非白血性单核细胞白血病", "急性髓系白血病,伴有多谱系发育不良", "急性髓系白血病,t(8;21)(q22;q22);RUNX1-RUNX1T1", "急性髓样白血病,11q23异常",
+            "髓样白血病伴唐氏综合征", "肥大细胞白血病", "急性原巨核细胞白血病", "急性髓系白血病(巨核母细胞性),t(1;22)(p13;q13); RBM15-MKL1", "髓样肉瘤", "急性全骨髓增殖症", "急性骨髓纤维化",
+            "多毛细胞白血病", "白血病性网状内皮细胞增殖", "幼年粒单核细胞白血病", "侵袭性NK细胞白血病", "真性红细胞增多症", "慢性骨髓增殖性疾病", "骨髓纤维化伴髓样化生", "巨核细胞性骨髓硬化", "特发性血小板增多症",
+            "慢性中性粒细胞白血病", "慢性嗜酸性细胞白血病", "髓样和淋巴样肿瘤,伴PDGFRA重排", "髓样肿瘤伴PDGFRB重排", "髓样和淋巴样肿瘤,FGFR1", "淋巴组织增生性疾病", "淋巴增生性疾病,恶性", "难治性贫血",
+            "难治性贫血,单系病态造血", "难治性贫血,伴环形铁粒幼细胞", "难治性贫血,多系病态造血", "难治性贫血,伴原始细胞增多", "骨髓增生异常综合征"
     );
     // 放疗药物目录
     public static List<String> radiotherapyDrugList = Arrays.asList(
-            "放射性胶体金[198Au]","来昔决南钐[153Sm]","氯化锶[89Sr]","锶[89Sr]二氯化锶","碘[125I]密封籽源","胶体磷[32P]酸铬","磷[32P]酸钠","钯[103Pd]种籽"
+            "放射性胶体金[198Au]", "来昔决南钐[153Sm]", "氯化锶[89Sr]", "锶[89Sr]二氯化锶", "碘[125I]密封籽源", "胶体磷[32P]酸铬", "磷[32P]酸钠", "钯[103Pd]种籽"
     );
 
     /**
@@ -687,49 +690,49 @@ public static final String dialectical_nursing = "辩证施护";
      */
 
     public static List<String> RESCUEDRUGLIST = Arrays.asList(
-            "尼可刹米","可拉明","盐酸洛贝林","山梗菜碱","肾上腺素","阿拉明", "重酒石酸间羟胺", "多巴胺", "利血平", "25%硫酸镁注射液", "垂体后叶素","注射用血凝酶", "阿托品","氯解磷定注射液","盐酸纳洛酮","异丙嗪", "非那更","地西泮", "安定","20%甘露醇");
+            "尼可刹米", "可拉明", "盐酸洛贝林", "山梗菜碱", "肾上腺素", "阿拉明", "重酒石酸间羟胺", "多巴胺", "利血平", "25%硫酸镁注射液", "垂体后叶素", "注射用血凝酶", "阿托品", "氯解磷定注射液", "盐酸纳洛酮", "异丙嗪", "非那更", "地西泮", "安定", "20%甘露醇");
 
     /**
-     *   临床用血
+     * 临床用血
      */
     public static List<String> BLOODRECORDLIST = Arrays.asList(
-           "血制品","血液制品", "输血/成份血知情同意书","成份血知情同意书","输血知情同意书","输血治疗知情同意书","输血治疗同意书","临床输血治疗知情同意书");
+            "血制品", "血液制品", "输血/成份血知情同意书", "成份血知情同意书", "输血知情同意书", "输血治疗知情同意书", "输血治疗同意书", "临床输血治疗知情同意书");
 
     /**
-     *   植入物
+     * 植入物
      */
     public static List<String> IMPLANTSLIST = Arrays.asList(
-            "植入物","支架植入术");
+            "植入物", "支架植入术");
 
     /**
-     *   种类
+     * 种类
      */
     public static List<String> MODELIST = Arrays.asList(
-            "国产","进口");
+            "国产", "进口");
 
     /**
-     *   数量单位
+     * 数量单位
      */
     public static List<String> NUMBERLIST = Arrays.asList(
-            "枚","支","块","个");
+            "枚", "支", "块", "个");
 
     /**
-     *   入院病情代码表
+     * 入院病情代码表
      */
-    public static List<String> ADMISSIONCONDITION= Arrays.asList(
-            "有","临床未确定","情况不明","无");
+    public static List<String> ADMISSIONCONDITION = Arrays.asList(
+            "有", "临床未确定", "情况不明", "无");
 
     /**
-     *   实施临床路径字典
+     * 实施临床路径字典
      */
-    public static List<String> CLINICALPATHWAY= Arrays.asList(
-            "中医","西医","否");
+    public static List<String> CLINICALPATHWAY = Arrays.asList(
+            "中医", "西医", "否");
 
     /**
-     *   是否
+     * 是否
      */
-    public static List<String> MARK= Arrays.asList(
-            "是","否");
+    public static List<String> MARK = Arrays.asList(
+            "是", "否");
 
 
 }

+ 4 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NingHaiFuYaoOperationDocTrans.java

@@ -218,7 +218,9 @@ public class NingHaiFuYaoOperationDocTrans extends ModelDocTrans {
             "时间=记录时间",
             "手术前诊断=术前诊断",
             "手术中诊断=术中后诊断",
-            "手术后诊断=术中后诊断"
+            "手术后诊断=术中后诊断",
+            "胎盘胎儿娩出=胎儿娩出",
+            "产程(时、分)=产程"
     );
 
 
@@ -309,6 +311,7 @@ public class NingHaiFuYaoOperationDocTrans extends ModelDocTrans {
             "一、简要病情=简要病情",
             "1.术前诊断=术前诊断",
             "2.手术指征与禁忌征=手术指征与禁忌",
+            "2.手术指征与禁忌症=手术指征与禁忌",
             "3.可替代方案=可替代的方案",
             "4.拟施手术方式、名称及可能的变更=拟施手术方式名称及可能的变更与禁忌症",
             "5.计划性多次手术=计划性多次手术",

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/NinghaifuyaoDocTrans.java

@@ -15,7 +15,7 @@ import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
- * @ClassName : BeiLunDocTrans
+ * @ClassName : NinghaifuyaoDocTrans
  * @Description :
  * @Author : 楼辉荣
  * @Date: 2020-03-03 19:47

+ 5 - 5
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicBloodEffectHtmlAnalysis.java

@@ -26,11 +26,11 @@ public class NingHaiFuYaoClinicBloodEffectHtmlAnalysis implements NingHaiFuYaoHt
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(recTitle,bigDivElement, map);
+            analysisGeneral(recTitle, bigDivElement, map);
             if (map.containsKey("病情记录")) {
                 String content = map.get("病情记录");
                 CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
@@ -51,7 +51,7 @@ public class NingHaiFuYaoClinicBloodEffectHtmlAnalysis implements NingHaiFuYaoHt
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }
@@ -59,10 +59,10 @@ public class NingHaiFuYaoClinicBloodEffectHtmlAnalysis implements NingHaiFuYaoHt
             bigDivElement.selectFirst("hr").previousElementSiblings().remove();
         }
         String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        CommonAnalysisUtil.NHExtractWardInfo(recTitle,text, map);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
         String bqjlText = "病情记录" + map.get("病情记录");
         List<String> titles = Lists.newArrayList(
-                "病情记录","医生签名","医师签名"
+                "病情记录", "医生签名", "医师签名"
         );
         titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
         CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);

+ 5 - 5
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoClinicalBloodHtmlAnalysis.java

@@ -27,11 +27,11 @@ public class NingHaiFuYaoClinicalBloodHtmlAnalysis implements NingHaiFuYaoHtmlAn
                 "开始时间", "结束时间", "输血过程");
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(recTitle,bigDivElement, map);
+            analysisGeneral(recTitle, bigDivElement, map);
             if (map.containsKey("病情记录")) {
                 String content = map.get("病情记录");
                 CommonAnalysisUtil.cutByTitles(content, titles, 0, map);
@@ -52,7 +52,7 @@ public class NingHaiFuYaoClinicalBloodHtmlAnalysis implements NingHaiFuYaoHtmlAn
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }
@@ -60,10 +60,10 @@ public class NingHaiFuYaoClinicalBloodHtmlAnalysis implements NingHaiFuYaoHtmlAn
             bigDivElement.selectFirst("hr").previousElementSiblings().remove();
         }
         String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        CommonAnalysisUtil.NHExtractWardInfo(recTitle,text, map);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
         String bqjlText = "病情记录" + map.get("病情记录");
         List<String> titles = Lists.newArrayList(
-                "病情记录","医生签名","医师签名"
+                "病情记录", "医生签名", "医师签名"
         );
         titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
         CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);

+ 5 - 5
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoConsultationRecordHtmlAnalysis.java

@@ -24,11 +24,11 @@ public class NingHaiFuYaoConsultationRecordHtmlAnalysis implements NingHaiFuYaoH
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(recTitle,bigDivElement, map);
+            analysisGeneral(recTitle, bigDivElement, map);
             NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -36,7 +36,7 @@ public class NingHaiFuYaoConsultationRecordHtmlAnalysis implements NingHaiFuYaoH
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }
@@ -44,10 +44,10 @@ public class NingHaiFuYaoConsultationRecordHtmlAnalysis implements NingHaiFuYaoH
             bigDivElement.selectFirst("hr").previousElementSiblings().remove();
         }
         String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        CommonAnalysisUtil.NHExtractWardInfo(recTitle,text, map);
+        CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
         String bqjlText = "病情记录" + map.get("病情记录");
         List<String> titles = Lists.newArrayList(
-                "病情记录","医生签名","医师签名"
+                "病情记录", "医生签名", "医师签名"
         );
         titles = CommonAnalysisUtil.sortTitlesNoColon(titles, bqjlText);
         CommonAnalysisUtil.cutByTitlesNoColon(bqjlText, titles, 0, map);

+ 4 - 4
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoDutyShiftSystemHtmlAnalysis.java

@@ -24,11 +24,11 @@ public class NingHaiFuYaoDutyShiftSystemHtmlAnalysis implements NingHaiFuYaoHtml
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(recTitle,bigDivElement, map);
+            analysisGeneral(recTitle, bigDivElement, map);
             NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
         } catch (Exception e) {
             log.error(e.getMessage(), e);
@@ -36,7 +36,7 @@ public class NingHaiFuYaoDutyShiftSystemHtmlAnalysis implements NingHaiFuYaoHtml
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }
@@ -44,7 +44,7 @@ public class NingHaiFuYaoDutyShiftSystemHtmlAnalysis implements NingHaiFuYaoHtml
             bigDivElement.selectFirst("hr").previousElementSiblings().remove();
         }
         String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
-        CommonAnalysisUtil.extractWardInfo(recTitle,text, map);
+        CommonAnalysisUtil.extractWardInfo(recTitle, text, map);
         String bqjlText = "病情记录" + map.get("病情记录");
         List<String> titles = Lists.newArrayList(
                 "病情记录"

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoHtmlAnalysis.java

@@ -9,6 +9,6 @@ import java.util.Map;
  */
 public interface NingHaiFuYaoHtmlAnalysis {
 
-    Map<String,String> analysis(String... args);
+    Map<String, String> analysis(String... args);
 
 }

+ 121 - 65
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoOperationRecordHtmlAnalysis.java

@@ -3,6 +3,7 @@ package com.lantone.qc.trans.ninghaifuyao.util;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.util.MapUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -39,89 +40,144 @@ public class NingHaiFuYaoOperationRecordHtmlAnalysis implements NingHaiFuYaoHtml
                 NingHaiFuYaoHtmlAnalysisUtil.tableStyle1InsertMap(Jsoup.parse(html).selectFirst("body").child(0).getElementById("header"), map);
             }
             map.forEach((key, value) -> map.put(key, value.replace("\n", "")));
-            Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
-            analysisGeneral(bigDivElement, map);
-            NingHaiFuYaoHtmlAnalysisUtil.mapValueRemoveStartColon(map);
-            String operatingCrew = null;
-            if (map.containsKey("手术人员")) {
-                operatingCrew = map.get("手术人员");
-            } else if (map.containsKey("手术者及助手名称")) {
-                operatingCrew = map.get("手术者及助手名称");
-            }
-            if (StringUtil.isNotBlank(operatingCrew)) {
-                CommonAnalysisUtil.cutByTitles(operatingCrew, Lists.newArrayList("主刀", "一助", "二助", "助手", "洗手护士"), 0, map);
-            }
-            if (map.containsKey("主刀")) {
-                map.put("主刀", map.get("主刀").replaceAll("[^\u4E00-\u9FA5]", ""));
-            }
-            if (map.containsKey("麻醉者")) {
-                String anesthetist = map.get("麻醉者").replace("麻醉医生:", "");
-                map.put("麻醉医师", anesthetist);
-                if (anesthetist.contains("1.")) {
-                    int index = anesthetist.indexOf("1.");
-                    map.put("麻醉医师", anesthetist.substring(0, index));
-                    map.put("手术经过", anesthetist.substring(index));
+            if (!"10011600".equals(recTypeId)) {
+                Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
+                analysisGeneral(bigDivElement, map);
+                NingHaiFuYaoHtmlAnalysisUtil.mapValueRemoveStartColon(map);
+                String operatingCrew = null;
+                if (map.containsKey("手术人员")) {
+                    operatingCrew = map.get("手术人员");
+                } else if (map.containsKey("手术者及助手名称")) {
+                    operatingCrew = map.get("手术者及助手名称");
                 }
-            }
-            if (map.containsKey("手术日期")) {
-                String operatorDateStr = map.get("手术日期");
-                if (operatorDateStr.contains("--")) {
-                    String[] operatorDate = operatorDateStr.split("--");
-                    map.put("手术开始时间", operatorDate[0].replaceAll(":", ":")
-                            .replaceAll(": ", ":")
-                            .replaceAll(": ", ":"));
-                    map.put("手术结束时间", operatorDate[1].replaceAll(":", ":")
-                            .replaceAll(": ", ":")
-                            .replaceAll(": ", ":"));
+                if (StringUtil.isNotBlank(operatingCrew)) {
+                    CommonAnalysisUtil.cutByTitles(operatingCrew, Lists.newArrayList("主刀", "一助", "二助", "助手", "洗手护士"), 0, map);
                 }
-            }
-            //宁海产科手术记录处理
-            if (map.containsKey("开始") && map.containsKey("结束")
-                    && !map.containsKey("手术开始时间") && !map.containsKey("手术结束时间")
-                    && !map.containsKey("手术日期")) {
-                map.put("手术开始时间", map.get("开始"));
-                String endTime = map.get("结束");
-                if (endTime.contains("手术名称")) {
-                    CommonAnalysisUtil.html2StructureMapNoColon
-                            (Lists.newArrayList("手术名称", "术前诊断", "手术指征", "术后诊断"), endTime, map);
-                    endTime = endTime.split("手术名称")[0].trim();
+                if (map.containsKey("主刀")) {
+                    map.put("主刀", map.get("主刀").replaceAll("[^\u4E00-\u9FA5]", ""));
+                }
+                if (map.containsKey("麻醉者")) {
+                    String anesthetist = map.get("麻醉者").replace("麻醉医生:", "");
+                    map.put("麻醉医师", anesthetist);
+                    if (anesthetist.contains("1.")) {
+                        int index = anesthetist.indexOf("1.");
+                        map.put("麻醉医师", anesthetist.substring(0, index));
+                        map.put("手术经过", anesthetist.substring(index));
+                    }
+                }
+                if (map.containsKey("手术日期")) {
+                    String operatorDateStr = map.get("手术日期");
+                    if (operatorDateStr.contains("--")) {
+                        String[] operatorDate = operatorDateStr.split("--");
+                        map.put("手术开始时间", operatorDate[0].replaceAll(":", ":")
+                                .replaceAll(": ", ":")
+                                .replaceAll(": ", ":"));
+                        map.put("手术结束时间", operatorDate[1].replaceAll(":", ":")
+                                .replaceAll(": ", ":")
+                                .replaceAll(": ", ":"));
+                    }
                 }
-                map.put("手术结束时间", endTime);
-                map.put("手术日期", map.get("手术开始时间"));
+                //宁海产科手术记录处理
+                if (map.containsKey("开始") && map.containsKey("结束")
+                        && !map.containsKey("手术开始时间") && !map.containsKey("手术结束时间")
+                        && !map.containsKey("手术日期")) {
+                    map.put("手术开始时间", map.get("开始"));
+                    String endTime = map.get("结束");
+                    if (endTime.contains("手术名称")) {
+                        CommonAnalysisUtil.html2StructureMapNoColon
+                                (Lists.newArrayList("手术名称", "术前诊断", "手术指征", "术后诊断"), endTime, map);
+                        endTime = endTime.split("手术名称")[0].trim();
+                    }
+                    map.put("手术结束时间", endTime);
+                    map.put("手术日期", map.get("手术开始时间"));
 
-            }
+                }
 
-            if (map.containsKey("手术开始时间") && map.containsKey("手术结束时间")) {
-                map.put("手术日期", map.get("手术开始时间") + "-" + map.get("手术结束时间"));
-            }
-            if (map.containsKey("手术时间")) {
-                if (map.get("手术时间").contains("--")) {
+                if (map.containsKey("手术开始时间") && map.containsKey("手术结束时间")) {
+                    map.put("手术日期", map.get("手术开始时间") + "-" + map.get("手术结束时间"));
+                }
+                if (map.containsKey("手术时间")) {
+                    if (map.get("手术时间").contains("--")) {
 
-                } else if (map.get("手术时间").contains("-")) {
-                    map.put("手术开始时间", map.get("手术时间").split("-")[0].replaceAll(":", ":")
-                            .replaceAll(": ", ":")
-                            .replaceAll(": ", ":"));
-                    map.put("手术结束时间", map.get("手术时间").split("-")[1].replaceAll(":", ":")
-                            .replaceAll(": ", ":")
-                            .replaceAll(": ", ":"));
+                    } else if (map.get("手术时间").contains("-")) {
+                        map.put("手术开始时间", map.get("手术时间").split("-")[0].replaceAll(":", ":")
+                                .replaceAll(": ", ":")
+                                .replaceAll(": ", ":"));
+                        map.put("手术结束时间", map.get("手术时间").split("-")[1].replaceAll(":", ":")
+                                .replaceAll(": ", ":")
+                                .replaceAll(": ", ":"));
+                    }
                 }
-            }
 
-            if (map.containsKey("手术时间") && map.get("手术时间").contains("-")) {
+                if (map.containsKey("手术时间") && map.get("手术时间").contains("-")) {
 
-            }
+                }
 
-            //这些科室的手术时间写了好几种格式分别处理
+                //这些科室的手术时间写了好几种格式分别处理
 //           List<String> departmentList =  Lists.newArrayList("妇科","十六病区VIP");
-            getOperaTime(map, null);
-            CommonAnalysisUtil.makeEmpty(map, "医生签名");
+                getOperaTime(map, null);
+                CommonAnalysisUtil.makeEmpty(map, "医生签名");
+            } else {
+                String headerText = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(Jsoup.parse(html).getElementById("header"), true);
+                cutHeader(map, headerText);
+                Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
+                String text = NingHaiFuYaoHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
+                text = text.replaceAll("第1页", "")
+                        .replace("水肿:□ 外阴□ 阴道□ 宫颈 ", "")
+                        .replace("畸形:□ {畸形} □ 死胎 □ 死产", "")
+                        .replace("臀位 □ 臀牵□ 臀助□ 顺利□ 困难 吸氧□ 正压给氧□ 气管插管□ 胸外心脏按压", "");
+                List<String> titles = Lists.newArrayList(
+                        "产程开始", "羊水", "宫口开全", "量", "胎 盘 胎儿娩出", "胎盘娩出", "产程 (时、分)", "脐带", "手术指征", "附着",
+                        "阴 道 检 查 骨盆情况", "新 生儿", "产钳", "新 生 儿 处理", "胎吸", "气管插管吸出 {数字} ml 性状", "会阴切开", "抢救药物", "麻醉", "产后即刻生命体征及出血",
+                        "术前胎心", "手术名称", "术后诊断", "手术者及助手名称", "术中取病理标本", "麻醉方法", "宫颈裂伤", "血压", "阴道裂伤", "产时用药", "宫 缩", "新 生 儿 评 分",
+                        "特殊情况记录", "项目", "心率", "喉反射", "肌张力", "诊断", "肤色", "总分", "接生者", "记录者"
+                );
+                titles = CommonAnalysisUtil.sortTitlesNoColon(titles, text);
+                CommonAnalysisUtil.cutByTitlesNoColon(text, titles, 0, map);
+                cutWord(map);
+            }
             NingHaiFuYaoHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+
         } catch (Exception e) {
             log.error(e.getMessage(), e);
         }
         return map;
     }
 
+    private void cutHeader(Map<String, String> map, String text) {
+        List<String> titles = Lists.newArrayList(
+                "姓名", "病区", "床号", "住院号"
+        );
+        CommonAnalysisUtil.html2StructureMap(titles, text, map);
+    }
+
+    private void cutWord(Map<String, String> map) {
+        disData(map, "产时用药", "抢救药品");
+        disData(map, "心率", "呼吸");
+        StringBuffer sb = new StringBuffer();
+        sb.append("项目").append(map.get("项目"))
+                .append("心率").append(map.get("心率"))
+                .append("呼吸").append(map.get("呼吸"))
+                .append("喉反射").append(map.get("喉反射"))
+                .append("肌张力").append(map.get("肌张力"))
+                .append("肤色").append(map.get("肤色"))
+                .append("总分").append(map.get("总分"));
+        map.put("新生儿评分", sb.toString());
+        map.put("羊水", map.get("羊水") + "量" + map.get("量"));
+    }
+
+    /**
+     * 将args[0]中args[1]截取出来
+     */
+    private void disData(Map sourceMap, String... args) {
+        Map<String, String> sourceMap_ = MapUtil.copyMap(sourceMap);
+        if (sourceMap.containsKey(args[0]) && sourceMap_.get(args[0]).contains(args[1])) {
+            int index = sourceMap_.get(args[0]).indexOf(args[1]);
+            sourceMap.put(args[0], sourceMap_.get(args[0]).substring(0, index));
+            sourceMap.put(args[1], sourceMap_.get(args[0]).substring(index).replace(args[1], "").replaceAll("[::]", ""));
+        }
+    }
+
     private void getOperaTime(Map<String, String> map, List<String> departmentList) {
 //        if(map.containsKey("病区")&&departmentList.contains(map.get("病区")))
         if (map.containsKey("病区")) {

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaifuyao/util/NingHaiFuYaoRescueHtmlAnalysis.java

@@ -36,7 +36,7 @@ public class NingHaiFuYaoRescueHtmlAnalysis implements NingHaiFuYaoHtmlAnalysis
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 2 - 11
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiOperationDocTrans.java

@@ -3,12 +3,7 @@ package com.lantone.qc.trans.ninghaiyiyi;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
-import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
-import com.lantone.qc.pub.model.doc.operation.OperationDoc;
-import com.lantone.qc.pub.model.doc.operation.OperationInformedConsentDoc;
-import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
-import com.lantone.qc.pub.model.doc.operation.OperationSafetyChecklistDoc;
-import com.lantone.qc.pub.model.doc.operation.PreoperativeDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.*;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.pub.util.ListUtil;
@@ -16,11 +11,7 @@ import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.ModelDocTrans;
 import com.lantone.qc.trans.comsis.ModelDocGenerate;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
-import com.lantone.qc.trans.ninghaiyiyi.util.NingHaiYiYiHtmlAnalysis;
-import com.lantone.qc.trans.ninghaiyiyi.util.NingHaiYiYiHtmlAnalysisUtil;
-import com.lantone.qc.trans.ninghaiyiyi.util.NingHaiYiYiOperationHtmlAnalysis;
-import com.lantone.qc.trans.ninghaiyiyi.util.NingHaiYiYiOperationRecordHtmlAnalysis;
-import com.lantone.qc.trans.ninghaiyiyi.util.NingHaiYiYiPreoperativeHtmlAnalysis;
+import com.lantone.qc.trans.ninghaiyiyi.util.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
 import org.jsoup.Jsoup;

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/NingHaiYiYiStagesSummaryDocTrans.java

@@ -72,4 +72,4 @@ public class NingHaiYiYiStagesSummaryDocTrans extends ModelDocTrans {
             "医师签名=记录医生"
     );
 
-}
+}

+ 27 - 35
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiBeHospitalizedHtmlAnalysis.java

@@ -5,7 +5,6 @@ import com.google.common.collect.Maps;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import lombok.extern.slf4j.Slf4j;
-import lombok.val;
 import org.jsoup.Jsoup;
 import org.jsoup.nodes.Document;
 import org.jsoup.nodes.Element;
@@ -28,7 +27,7 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
@@ -52,10 +51,10 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
     private void analysisBeHospitalized(Document doc, Map<String, String> map) {
         NingHaiYiYiHtmlAnalysisUtil.tableStyle1InsertMap(doc.getElementById("header"), map);
         map.forEach((key, value) -> map.put(key, value.replace("\n", "")));
-        List<String> titles = Lists.newArrayList("姓 名", "入院时间", "出生日期", "性 别", "性别", "记录时间","年 龄", "出 生 地", "职 业", "职业", "入院时间", "民 族", "民族",
-                "联系地址", "婚 姻", "婚姻", "病史陈述者", "病史可靠度", "家长姓名","住 址","联系电话", "主诉", "主 诉", "现 病 史","现病史", "既 往 史", "个 人 史", "母 孕 史", "出 生 史", "喂 养 史",
-                "既往史", "个人史", "母孕史", "出生史", "喂养史","婚育史","家族史","年龄","姓名","出生地","住址",
-                "末次月经","身份证号","户籍地址","联 系 人","孕/产 次","预 产 期","产前检查","籍贯",
+        List<String> titles = Lists.newArrayList("姓 名", "入院时间", "出生日期", "性 别", "性别", "记录时间", "年 龄", "出 生 地", "职 业", "职业", "入院时间", "民 族", "民族",
+                "联系地址", "婚 姻", "婚姻", "病史陈述者", "病史可靠度", "家长姓名", "住 址", "联系电话", "主诉", "主 诉", "现 病 史", "现病史", "既 往 史", "个 人 史", "母 孕 史", "出 生 史", "喂 养 史",
+                "既往史", "个人史", "母孕史", "出生史", "喂养史", "婚育史", "家族史", "年龄", "姓名", "出生地", "住址",
+                "末次月经", "身份证号", "户籍地址", "联 系 人", "孕/产 次", "预 产 期", "产前检查", "籍贯",
                 "生长发育史", "预防接种史", "生活习惯史", "婚 育 史", "月经婚育史", "家 族 史", "辅助检查", "记录医生", "初步诊断", "补充诊断");
         String htmlContent = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0).getElementById("main"), true);
         if (StringUtil.isNotBlank(htmlContent)) {
@@ -64,35 +63,30 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
             disDiagnose(map, Lists.newArrayList("初步诊断"), "医师签名:");
             disDiagnose(map, Lists.newArrayList("初步诊断医师签名:"), "时 间:");
             //入院记录 体格检查、补充及专科情况里获取辅助检查提取
-            getAuxiliary(map,Lists.newArrayList("体格检查","补充及专科情况","补充及专科情况"),htmlContent);
+            getAuxiliary(map, Lists.newArrayList("体格检查", "补充及专科情况", "补充及专科情况"), htmlContent);
             //婚育史特殊符号处理
 //            removeSymbol(map,"□","婚育史");
         }
     }
 
-    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList,String htmlContent) {
+    private void getAuxiliary(Map<String, String> map, ArrayList<String> newArrayList, String htmlContent) {
         CommonAnalysisUtil.html2StructureMapNoColon(newArrayList, htmlContent, map);
         //家族史其他内容清理
-        if(map.keySet().contains("家族史"))
-        {
+        if (map.keySet().contains("家族史")) {
             String fimaly = map.get("家族史");
-            if(map.keySet().contains("体格检查"))
-            {
-                removeMapVal(map,fimaly,"体格检查","家族史");
-                if(map.keySet().contains("补充及专科情况")&&StringUtil.isBlank(map.get("辅助检查")))
-                {
+            if (map.keySet().contains("体格检查")) {
+                removeMapVal(map, fimaly, "体格检查", "家族史");
+                if (map.keySet().contains("补充及专科情况") && StringUtil.isBlank(map.get("辅助检查"))) {
                     String auxiliary = map.get("补充及专科情况");
                     CommonAnalysisUtil.html2StructureMapNoColon(
-                            Lists.newArrayList("辅助检查"),auxiliary, map);
-                    if(map.get("辅助检查").contains("初步诊断")&&StringUtil.isNotBlank(map.get("初步诊断"))
-                            &&map.get("辅助检查").contains(map.get("初步诊断")))
-                    {
+                            Lists.newArrayList("辅助检查"), auxiliary, map);
+                    if (map.get("辅助检查").contains("初步诊断") && StringUtil.isNotBlank(map.get("初步诊断"))
+                            && map.get("辅助检查").contains(map.get("初步诊断"))) {
                         String val = map.get("辅助检查");
-                        if(val.contains(map.get("初步诊断")))
-                        {
-                            val = val.split("初步诊断")[0].replaceAll("初步诊断","")
-                                    .replaceAll(":","").trim();
-                            map.put("辅助检查",val);
+                        if (val.contains(map.get("初步诊断"))) {
+                            val = val.split("初步诊断")[0].replaceAll("初步诊断", "")
+                                    .replaceAll(":", "").trim();
+                            map.put("辅助检查", val);
 
                         }
                     }
@@ -102,26 +96,24 @@ public class NingHaiYiYiBeHospitalizedHtmlAnalysis implements NingHaiYiYiHtmlAna
         }
     }
 
-    private void removeMapVal(Map<String, String> map, String val,String mapkey,String changeKey) {
-        if(val.contains(map.get(mapkey)))
-        {
-            val = val.split(map.get(mapkey))[0].replaceAll(mapkey,"").trim();
-            map.put(changeKey,val);
+    private void removeMapVal(Map<String, String> map, String val, String mapkey, String changeKey) {
+        if (val.contains(map.get(mapkey))) {
+            val = val.split(map.get(mapkey))[0].replaceAll(mapkey, "").trim();
+            map.put(changeKey, val);
         }
     }
 
     /**
      * @Author songxl
      * @Description map中特殊符号处理
-     * @Date  2021/4/8
-     * @Param [map,symbol,key]
+     * @Date 2021/4/8
+     * @Param [map, symbol, key]
      * @Return void
      * @MethodName removeSymbol
      */
-    private void removeSymbol(Map<String, String> map,String symbol,String key) {
-        if(map.keySet().contains(key))
-        {
-            map.put(key,map.get(key).replaceAll(symbol,"").trim());
+    private void removeSymbol(Map<String, String> map, String symbol, String key) {
+        if (map.keySet().contains(key)) {
+            map.put(key, map.get(key).replaceAll(symbol, "").trim());
         }
     }
 

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiClinicBloodEffectHtmlAnalysis.java

@@ -51,7 +51,7 @@ public class NingHaiYiYiClinicBloodEffectHtmlAnalysis implements NingHaiYiYiHtml
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiClinicalBloodHtmlAnalysis.java

@@ -52,7 +52,7 @@ public class NingHaiYiYiClinicalBloodHtmlAnalysis implements NingHaiYiYiHtmlAnal
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiConsultationHtmlAnalysis.java

@@ -30,8 +30,8 @@ public class NingHaiYiYiConsultationHtmlAnalysis implements NingHaiYiYiHtmlAnaly
             List<String> titles = Lists.newArrayList("姓名", "性别", "出生日期", "科别", "病区", "床号", "住院号",
                     "会诊类型", "被邀医院", "被邀科室", "被邀医师", "申请时间", "患者病情及诊疗经过、申请会诊的理由及目的", "申请会诊科别",
                     "被邀会诊科别", "申请会诊医师", "会诊意见", "会诊时间", "科主任", "会诊到达时间", "查体", "会诊建议",
-                    "会诊诊断", "由受邀医生填写,本次会诊是否必要","会诊科室", "会诊医师", "外院会诊医师所在医疗机构名称", "会诊医师所在医疗机构名称");
-            String html = args[0].replace("&nbsp;"," ");
+                    "会诊诊断", "由受邀医生填写,本次会诊是否必要", "会诊科室", "会诊医师", "外院会诊医师所在医疗机构名称", "会诊医师所在医疗机构名称");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             String htmlContent = null;

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiConsultationRecordHtmlAnalysis.java

@@ -36,7 +36,7 @@ public class NingHaiYiYiConsultationRecordHtmlAnalysis implements NingHaiYiYiHtm
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCrisisValueReportHtmlAnalysis.java

@@ -24,7 +24,7 @@ public class NingHaiYiYiCrisisValueReportHtmlAnalysis implements NingHaiYiYiHtml
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiCriticallyIllNoticeHtmlAnalysis.java

@@ -29,7 +29,7 @@ public class NingHaiYiYiCriticallyIllNoticeHtmlAnalysis implements NingHaiYiYiHt
             List<String> titles = Lists.newArrayList("姓名", "性别", "年龄", "出生日期", "科室", "科别", "病区", "床号", "住院号",
                     "单位或地址", "联系电话", "初步诊断", "临床诊断", "病情摘要", "主要症状", "体格检查", "辅助检查", "告知医师签名",
                     "告知时间", "患方意见", "患方签名", "手印说明", "与患者关系", "患者(或被授权人)签名与患方关系", "医师签名", "时间", "签字时间");
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDeathCaseDiscussHtmlAnalysis.java

@@ -25,7 +25,7 @@ public class NingHaiYiYiDeathCaseDiscussHtmlAnalysis implements NingHaiYiYiHtmlA
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
             Element bigDivElement = doc.selectFirst("body").child(0).getElementById("main");

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDeathRecordHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiYiYiDeathRecordHtmlAnalysis implements NingHaiYiYiHtmlAnalys
         try {
             List<String> titles = Lists.newArrayList("入院日期", "入院时间", "死亡时间", "记录时间", "入院诊断", "入院情况",
                     "诊疗经过(重点记录病情演变、抢救经过)", "诊治经过", "死亡原因", "死亡诊断", "医师签字");
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDifficultCaseDiscussHtmlAnalysis.java

@@ -27,7 +27,7 @@ public class NingHaiYiYiDifficultCaseDiscussHtmlAnalysis implements NingHaiYiYiH
         try {
             List<String> titles = Lists.newArrayList("姓名", "性别", "年龄", "出生日期", "科别", "住址(或单位)", "讨论日期",
                     "讨论主持人", "参加讨论人", "发言记录(包括病历简要、讨论意见及结论)", "病史简介", "讨论意见", "主持人小结意见", "记录者(签名)", "科主任(签名)");
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiDutyShiftSystemHtmlAnalysis.java

@@ -36,7 +36,7 @@ public class NingHaiYiYiDutyShiftSystemHtmlAnalysis implements NingHaiYiYiHtmlAn
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiHtmlAnalysis.java

@@ -9,6 +9,6 @@ import java.util.Map;
  */
 public interface NingHaiYiYiHtmlAnalysis {
 
-    Map<String,String> analysis(String... args);
+    Map<String, String> analysis(String... args);
 
 }

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiRescueHtmlAnalysis.java

@@ -36,7 +36,7 @@ public class NingHaiYiYiRescueHtmlAnalysis implements NingHaiYiYiHtmlAnalysis {
         return map;
     }
 
-    private void analysisGeneral(String recTitle,Element bigDivElement, Map<String, String> map) {
+    private void analysisGeneral(String recTitle, Element bigDivElement, Map<String, String> map) {
         if (bigDivElement.childNodeSize() == 1) {
             bigDivElement = bigDivElement.child(0);
         }

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/ninghaiyiyi/util/NingHaiYiYiTransferOutHtmlAnalysis.java

@@ -24,7 +24,7 @@ public class NingHaiYiYiTransferOutHtmlAnalysis implements NingHaiYiYiHtmlAnalys
     public Map<String, String> analysis(String... args) {
         Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            String html = args[0].replace("&nbsp;"," ");
+            String html = args[0].replace("&nbsp;", " ");
             String recTitle = args[1];
             String recTypeId = args[2];
             Element bigDivElement = Jsoup.parse(html).selectFirst("body").child(0).getElementById("main");
@@ -45,7 +45,7 @@ public class NingHaiYiYiTransferOutHtmlAnalysis implements NingHaiYiYiHtmlAnalys
         }
         String text = NingHaiYiYiHtmlAnalysisUtil.blockDivToStr(bigDivElement, true);
         CommonAnalysisUtil.NHExtractWardInfo(recTitle, text, map);
-        String bqjlText = "病情记录" + map.get("病情记录").replace("年   月   日   时   分 ","");
+        String bqjlText = "病情记录" + map.get("病情记录").replace("年   月   日   时   分 ", "");
         List<String> titles = Lists.newArrayList(
                 "病情记录",
                 "医师签名",