Bladeren bron

Merge remote-tracking branch 'origin/master' into dev-template

louhr 5 jaren geleden
bovenliggende
commit
3e79f0d8f4
65 gewijzigde bestanden met toevoegingen van 1920 en 367 verwijderingen
  1. 4 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0002.java
  2. 7 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0014.java
  3. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0053.java
  4. 8 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0054.java
  5. 6 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0056.java
  6. 10 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0058.java
  7. 19 12
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0065.java
  8. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0067.java
  9. 4 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0072.java
  10. 53 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02860.java
  11. 109 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02887.java
  12. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0375.java
  13. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0376.java
  14. 12 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0398.java
  15. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0309.java
  16. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0569.java
  17. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0571.java
  18. 33 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0280.java
  19. 72 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0281.java
  20. 30 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0528.java
  21. 40 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF02899.java
  22. 116 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0296.java
  23. 5 8
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0597.java
  24. 8 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0598.java
  25. 18 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0599.java
  26. 50 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02859.java
  27. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02883.java
  28. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02885.java
  29. 33 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02886.java
  30. 13 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0148.java
  31. 41 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/medicalwriting/MEDI02882.java
  32. 8 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0720.java
  33. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0719.java
  34. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0718.java
  35. 130 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02891.java
  36. 130 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02892.java
  37. 130 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02897.java
  38. 130 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02898.java
  39. 26 25
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0647.java
  40. 4 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0330.java
  41. 6 5
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0094.java
  42. 10 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0140.java
  43. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0144.java
  44. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0702.java
  45. 20 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02881.java
  46. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0595.java
  47. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0596.java
  48. 8 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0700.java
  49. 48 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0725.java
  50. 2 2
      kernel/src/main/resources/application.yml
  51. 2 0
      public/src/main/java/com/lantone/qc/pub/Content.java
  52. 1 1
      public/src/main/java/com/lantone/qc/pub/model/InputInfo.java
  53. 8 0
      public/src/main/java/com/lantone/qc/pub/model/doc/NoticeOfConversationDoc.java
  54. 11 3
      public/src/main/java/com/lantone/qc/pub/model/doc/transferrecord/TransferRecordDoc.java
  55. 40 0
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxAnesthesiaRelatedDocTrans.java
  56. 2 1
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxBeHospitalizedDocTrans.java
  57. 65 0
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxClinicBloodEffectDocTrans.java
  58. 16 27
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxConsultationDocTrans.java
  59. 13 5
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxDocTrans.java
  60. 5 0
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxNoticeOfConversationDocTrans.java
  61. 9 2
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxOperationDocTrans.java
  62. 133 94
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxTransferRecordDocTrans.java
  63. 24 42
      trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java
  64. 120 24
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouTransferRecordDocTrans.java
  65. 2 2
      trans/src/main/java/com/lantone/qc/trans/taizhou/TaizhouDocTrans.java

+ 4 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0002.java

@@ -10,6 +10,7 @@ import com.lantone.qc.pub.model.entity.Clinical;
 import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.model.label.ChiefLabel;
 import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -60,7 +61,9 @@ public class BEH0002 extends QCCatalogue {
             bool = true;
         }
         if (bool) {
-            String mainDiag = diags.get(0).getName();
+            String firstDiag = diags.get(0).getName();
+            String firstHDiag = diags.get(0).getHospitalDiagName();
+            String mainDiag = StringUtil.isBlank(firstHDiag) ? firstDiag : firstHDiag;
             List<String> symptoms = null;
             Map<String, Map<String, Object>> diagMap = redisUtil.getJsonStringValue(KernelConstants.CONCEPT_DIAG_PROPERTY_MAP);
             Map<String, Object> map = (Map<String, Object>) diagMap.get(mainDiag);

+ 7 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0014.java

@@ -21,7 +21,7 @@ import java.util.List;
 @Component
 public class BEH0014 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if(inputInfo.getBeHospitalizedDoc() == null){
+        if (inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
             return;
         }
@@ -37,26 +37,23 @@ public class BEH0014 extends QCCatalogue {
             }
         }*/
         //硬规则匹配 前30个字有"体检"或"发现"或"检查"字样
-        if(inputInfo.getBeHospitalizedDoc() != null){
+        if (inputInfo.getBeHospitalizedDoc() != null) {
             String present = inputInfo.getBeHospitalizedDoc().getPresentLabel().getText();
             if (StringUtils.isNotEmpty(present)) {
-                if (present.length() > 30) present = present.substring(0, 30);
+                if (present.length() > 30) {
+                    present = present.substring(0, 30);
+                }
                 if (present.contains("体检") || present.contains("发现") || present.contains("检查")) {
                     status.set("0");
                     return;
                 }
             }
             List<Cause> causes = inputInfo.getBeHospitalizedDoc().getPresentLabel().getCauses();
-            if(causes != null && causes.size()>0){
+            if (causes != null && causes.size() > 0) {
                 status.set("0");
-                return;
             }
-        }else {
+        } else {
             status.set("0");
         }
-
-
-
-
     }
 }

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0053.java

@@ -5,6 +5,7 @@ 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.Marryiage;
+import com.lantone.qc.pub.model.label.MaritalLabel;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
@@ -25,6 +26,12 @@ public class BEH0053 extends QCCatalogue {
             status.set("0");
             return;
         }
+        //硬规则 匹配未婚
+        MaritalLabel maritalLabel = beHospitalizedDoc.getMaritalLabel();
+        if (maritalLabel != null && maritalLabel.getText().contains("未婚")) {
+            status.set("0");
+            return;
+        }
         //先取一次结构化数据
         Map<String, String> beHospitalizedStructureMap = beHospitalizedDoc.getStructureMap();
         String marryiAgeStr = beHospitalizedStructureMap.get("结婚年龄");

+ 8 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0054.java

@@ -4,6 +4,7 @@ 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.entity.Consanguineous;
+import com.lantone.qc.pub.model.label.MaritalLabel;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
@@ -17,7 +18,13 @@ public class BEH0054 extends QCCatalogue {
 
     @Override
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if(inputInfo.getBeHospitalizedDoc() == null){
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        //硬规则 未婚
+        MaritalLabel maritalLabel = inputInfo.getBeHospitalizedDoc().getMaritalLabel();
+        if (maritalLabel != null && maritalLabel.getText().contains("未婚")) {
             status.set("0");
             return;
         }

+ 6 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0056.java

@@ -3,6 +3,7 @@ package com.lantone.qc.kernel.catalogue.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.doc.BeHospitalizedDoc;
 import com.lantone.qc.pub.model.entity.ConjugalRelation;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -20,18 +21,19 @@ public class BEH0056 extends QCCatalogue {
 
     @Override
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if(inputInfo.getBeHospitalizedDoc() == null){
+        if (inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
             return;
         }
-        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
         if (StringUtils.isNotEmpty(structureMap.get("夫妻关系"))) {
             status.set("0");
             return;
         }
         //婚育史未填写,直接返回;
-        if (inputInfo.getBeHospitalizedDoc().getMaritalLabel() == null
-                || StringUtils.isEmpty(inputInfo.getBeHospitalizedDoc().getMaritalLabel().getText())) {
+        if (beHospitalizedDoc.getMaritalLabel() == null
+                || StringUtils.isEmpty(beHospitalizedDoc.getMaritalLabel().getText())) {
             status.set("0");
             return;
         }

+ 10 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0058.java

@@ -6,6 +6,7 @@ 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.Family;
+import com.lantone.qc.pub.model.label.MaritalLabel;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
@@ -29,6 +30,15 @@ public class BEH0058 extends QCCatalogue {
             return;
         }
         BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //硬规则 匹配未育
+        MaritalLabel maritalLabel = beHospitalizedDoc.getMaritalLabel();
+        if (maritalLabel != null){
+            String maritalLabelText = maritalLabel.getText();
+            if (maritalLabelText.contains("未育")){
+                status.set("0");
+                return;
+            }
+        }
         Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
         String familyMembersHealth = structureMap.get("家庭成员健康情况");
         List<Family> familyList = Lists.newArrayList();
@@ -40,7 +50,6 @@ public class BEH0058 extends QCCatalogue {
         if (ListUtil.isNotEmpty(familiesMl)) {
             familyList.addAll(familiesMl);
         }
-
         Pattern p = Pattern.compile("[儿子女]");
         if (StringUtil.isNotBlank(familyMembersHealth)){
             if (p.matcher(familyMembersHealth).find()){

+ 19 - 12
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0065.java

@@ -7,6 +7,7 @@ import com.lantone.qc.pub.model.entity.Clinical;
 import com.lantone.qc.pub.model.entity.Menses;
 import com.lantone.qc.pub.model.label.MenstrualLabel;
 import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -28,19 +29,25 @@ public class BEH0065 extends QCCatalogue {
                 status.set("0"); //如果性别是男,就不报错
             } else if (inputInfo.getBeHospitalizedDoc().getMenstrualLabel() != null) {
                 MenstrualLabel menstrualLabel = inputInfo.getBeHospitalizedDoc().getMenstrualLabel();
-                List<Menses> mensesList = menstrualLabel.getMensesList();
-                if (ListUtil.isEmpty(mensesList)) {
-                    return;
-                }
-                for (Menses menses : mensesList) {
-                    if (menses.getClinicals() == null) {
-                        continue;
+                if (menstrualLabel != null) {
+                    if (StringUtil.isNotBlank(menstrualLabel.getText()) && menstrualLabel.getText().contains("颜色")){
+                        status.set("0");
+                        return;
+                    }
+                    List<Menses> mensesList = menstrualLabel.getMensesList();
+                    if (ListUtil.isEmpty(mensesList)) {
+                        return;
                     }
-                    List<Clinical> clinicals = menses.getClinicals();
-                    for (Clinical clinical : clinicals) {
-                        if (clinical.getName().contains("颜色")) {
-                            status.set("0");
-                            return;
+                    for (Menses menses : mensesList) {
+                        if (menses.getClinicals() == null) {
+                            continue;
+                        }
+                        List<Clinical> clinicals = menses.getClinicals();
+                        for (Clinical clinical : clinicals) {
+                            if (clinical.getName().contains("颜色")) {
+                                status.set("0");
+                                return;
+                            }
                         }
                     }
                 }

+ 6 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0067.java

@@ -36,6 +36,12 @@ public class BEH0067 extends QCCatalogue {
                 }
                 if (inputInfo.getBeHospitalizedDoc().getMenstrualLabel() != null) {
                     MenstrualLabel menstrualLabel = inputInfo.getBeHospitalizedDoc().getMenstrualLabel();
+                    String labelText = menstrualLabel.getText();
+                    if (StringUtil.isNotBlank(labelText) && labelText.contains("痛经")) {
+                        status.set("0");
+                        return;
+                    }
+
                     if (menstrualLabel == null || ListUtil.isEmpty(menstrualLabel.getMensesList())) {
                         return;
                     }

+ 4 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0072.java

@@ -14,7 +14,7 @@ import java.util.List;
 
 /**
  * @ClassName : BEH0072
- * @Description : 家属有死亡者,未记录死亡原因及年龄
+ * @Description : 家属有死亡者,未记录死亡原因
  * @Author : 胡敬
  * @Date: 2020-03-11 16:44
  */
@@ -32,6 +32,9 @@ public class BEH0072 extends QCCatalogue {
             for (Family family : families) {
                 if (family.getDead() != null) {
                     Dead dead = family.getDead();
+                    if(family.getName().contains("年迈")){
+                        continue;
+                    }
                     if (dead.getDeadReason() != null || dead.getUnknow() != null) {
                         return;
                     } else {

+ 53 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02860.java

@@ -0,0 +1,53 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.entity.Clinical;
+import com.lantone.qc.pub.model.entity.PD;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.regex.Pattern;
+
+
+/**
+ * @ClassName : BEH02860
+ * @Description :主诉时间应该为阿拉伯数字
+ * @Author : 胡敬
+ * @Date: 2020-04-29 09:57
+ */
+@Component
+public class BEH02860 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            status.set("0");
+            return;
+        }
+        ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
+        if (chiefLabel == null) {
+            status.set("0");
+            return;
+        }
+        String regex = "[零一二三四五六七八九十百千]";
+        List<PD> pds = chiefLabel.getPds();
+        if (ListUtil.isNotEmpty(pds)) {
+            String name = null, value = null;
+            for (PD pd : pds) {
+                name = pd.getName();
+                value = pd.getValue();
+                if (value != null && Pattern.matches(regex, value)) {
+                    status.set("-1");
+                    return;
+                }
+                if (name != null && Pattern.matches(regex, name)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 109 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02887.java

@@ -0,0 +1,109 @@
+package com.lantone.qc.kernel.catalogue.behospitalized;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : BEH0738
+ * @Description: 患者病情前后描述不一致
+ * @author: 胡敬
+ * @time: 2020-05-08 16:45
+ */
+@Component
+public class BEH02887 extends QCCatalogue {
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getBeHospitalizedDoc() == null) {
+            return;
+        }
+        List<Diag> presentDiags = null;
+        List<Diag> pastDiags = null;
+        List<Diag> initialDiags = null;
+        PresentLabel presentLabel = inputInfo.getBeHospitalizedDoc().getPresentLabel();
+        PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
+        DiagLabel initialDiagLabel = inputInfo.getBeHospitalizedDoc().getInitialDiagLabel();
+        if (presentLabel != null) {
+            presentDiags = presentLabel.getDiags();
+        }
+        if (pastLabel != null) {
+            pastDiags = pastLabel.getDiags();
+        }
+        if (initialDiagLabel != null) {
+            initialDiags = initialDiagLabel.getDiags();
+        }
+
+        if (presentDiags != null && pastDiags != null){
+            if (checkDiagDiff(presentDiags,pastDiags)){
+                status.set("-1");
+                return;
+            }
+        }
+
+        if (presentDiags != null && initialDiags != null){
+            if (checkDiagDiff(presentDiags,initialDiags)){
+                status.set("-1");
+                return;
+            }
+        }
+
+        if (pastDiags != null && initialDiags != null){
+            if (checkDiagDiff(pastDiags,initialDiags)){
+                status.set("-1");
+            }
+        }
+    }
+
+    /**
+     * 检查两个Diag列表是否前后描述不一致
+     * @param firstDiags
+     * @param secondDiags
+     * @return
+     */
+    private boolean checkDiagDiff(List<Diag> firstDiags, List<Diag> secondDiags) {
+        String firstDiagName = null, secondDiagName = null;
+        for (Diag firstDiag : firstDiags) {
+            firstDiagName = firstDiag.getHospitalDiagName();
+            if (StringUtil.isBlank(firstDiagName)) {
+                continue;
+            }
+            for (Diag secondDiag : secondDiags) {
+                secondDiagName = secondDiag.getHospitalDiagName();
+                if (StringUtil.isBlank(secondDiagName)) {
+                    continue;
+                }
+                if (firstDiagName.equals(secondDiagName)) {
+                    boolean checkNeg = checkNeg(firstDiag, secondDiag);
+                    if (!checkNeg) {
+                        //如果两个Diag一个为否定,一个不为否定,返回true
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    private boolean checkNeg(Diag firstDiag, Diag secondDiag) {
+        if (firstDiag.getNegative() == null && secondDiag.getNegative() == null) {
+            return true;
+        } else {
+            return firstDiag.getNegative() != null && secondDiag.getNegative() != null;
+        }
+    }
+
+
+}

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0375.java

@@ -5,6 +5,7 @@ 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.entity.Family;
+import com.lantone.qc.pub.model.label.MaritalLabel;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -29,6 +30,12 @@ public class BEH0375 extends QCCatalogue {
             status.set("0");
             return;
         }
+        //硬规则 匹配未婚
+        MaritalLabel maritalLabel = inputInfo.getBeHospitalizedDoc().getMaritalLabel();
+        if (maritalLabel != null && maritalLabel.getText().contains("未婚")) {
+            status.set("0");
+            return;
+        }
         //台州市结构化的
         Map<String, String> structureMap_beh = inputInfo.getBeHospitalizedDoc().getStructureMap();
         if(StringUtils.isNotEmpty(structureMap_beh.get("配偶健康状况"))){

+ 6 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0376.java

@@ -43,6 +43,12 @@ public class BEH0376 extends QCCatalogue {
             status.set("0");
             return;
         }
+        //硬规则 匹配未育
+        String maritalLabelText = maritalLabel.getText();
+        if (maritalLabelText.contains("未育")) {
+            status.set("0");
+            return;
+        }
         //未婚 无子女
         if (maritalLabel.getMaritalStatus() != null && maritalLabel.getMaritalStatus().getName().contains("未婚")) {
             status.set("0");

+ 12 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0398.java

@@ -5,6 +5,8 @@ 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.entity.Family;
+import com.lantone.qc.pub.model.label.FamilyLabel;
+import com.lantone.qc.pub.model.label.MaritalLabel;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -29,12 +31,21 @@ public class BEH0398 extends QCCatalogue {
             status.set("0");
             return;
         }
+        //硬规则 匹配独生子 独生女
+        FamilyLabel familyLabel = inputInfo.getBeHospitalizedDoc().getFamilyLabel();
+        if (familyLabel != null) {
+            String familyLabelText = familyLabel.getText();
+            if (familyLabelText.contains("独生子") || familyLabelText.contains("独生女")
+                    || familyLabelText.contains("独子") || familyLabelText.contains("独女")) {
+                status.set("0");
+                return;
+            }
+        }
         Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
         if (StringUtils.isNotEmpty(structureMap.get("家庭成员健康情况"))) {
             status.set("0");
             return;
         }
-
         List<Family> familyList = Lists.newArrayList();
         List<Family> familiesFl = inputInfo.getBeHospitalizedDoc().getFamilyLabel().getFamilies();
         List<Family> familiesMl = inputInfo.getBeHospitalizedDoc().getMaritalLabel().getFamily();

+ 4 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0309.java

@@ -3,6 +3,7 @@ package com.lantone.qc.kernel.catalogue.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.ClinicBloodEffectDoc;
 import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
 import com.lantone.qc.pub.util.ListUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -21,13 +22,13 @@ import java.util.Map;
 public class CLI0309 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();
+        List<ClinicalBloodDoc> clinicalBloodDocs = inputInfo.getClinicalBloodDocs();//输血记录
         if(ListUtil.isEmpty(clinicalBloodDocs)){
             return;
         }
-
+        List<ClinicBloodEffectDoc> clinicBloodEffectDocs = inputInfo.getClinicBloodEffectDocs();//输血效果评价
         if(clinicalBloodDocs != null && clinicalBloodDocs.size()>0){
-            for (ClinicalBloodDoc cliB:clinicalBloodDocs) {
+            for (ClinicBloodEffectDoc cliB:clinicBloodEffectDocs) {
                 Map<String, String> cliBStructureMap = cliB.getStructureMap();
                 if(StringUtils.isEmpty(cliBStructureMap.get("输注后效果评价"))){
                     status.set("-1");
@@ -35,6 +36,5 @@ public class CLI0309 extends QCCatalogue {
                 }
             }
         }
-
     }
 }

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0569.java

@@ -10,6 +10,8 @@ import org.springframework.stereotype.Component;
 
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @ClassName : CLI0569
@@ -38,6 +40,11 @@ public class CLI0569 extends QCCatalogue {
                         status.set("-1");
                         break;
                     }
+                    Pattern compile = Pattern.compile("[a-zA-Z]+型");
+                    Matcher matcher = compile.matcher(cliBStructureMap.get("输注种类、血型、数量"));
+                    if(matcher.find()){
+                        status.set("0");
+                    }
                 }
             }
         }

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0571.java

@@ -35,7 +35,8 @@ public class CLI0571 extends QCCatalogue {
                 }
                 //长兴
                 if(cliBStructureMap != null && cliBStructureMap.containsKey("输注种类、血型、数量")){
-                    if(cliBStructureMap.get("输注种类、血型、数量").contains("Rh")){
+                    if(cliBStructureMap.get("输注种类、血型、数量").contains("Rh")
+                            || cliBStructureMap.get("输注种类、血型、数量").contains("RH")){
                         status.set("0");
                         return;
                     }

+ 33 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0280.java

@@ -4,11 +4,14 @@ 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.DoctorAdviceDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -23,30 +26,45 @@ import java.util.Map;
 public class CON0280 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getConsultationDocs() == null) {
+        if (inputInfo.getConsultationDocs() == null || inputInfo.getDoctorAdviceDocs().size() == 0) {
             return;
         }
         List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        //医嘱按照医嘱开始时间排序
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        Collections.sort(doctorAdviceDocs, new Comparator<DoctorAdviceDoc>() {
+            public int compare(DoctorAdviceDoc o1, DoctorAdviceDoc o2) {
+                return o1.getStructureMap().get("医嘱开始时间")
+                        .compareTo(o2.getStructureMap().get("医嘱开始时间"));
+            }
+        });
         for (ConsultationDoc consultationDoc : consultationDocs) {
             ConsultationResultsDoc consultationResultsDoc = consultationDoc.getConsultationResultsDoc();
             if (consultationResultsDoc == null) {
                 continue;
             }
-            Map<String, String> structureMap = consultationResultsDoc.getStructureMap();
-            String applicationDateStr = structureMap.get("会诊申请日期");
-            String arrivalDateStr = structureMap.get("会诊到达时间");
-            if (StringUtil.isBlank(applicationDateStr) || StringUtil.isBlank(arrivalDateStr)) {
-                continue;
-            }
-            Date applicationDate = StringUtil.parseDateTime(applicationDateStr);
-            Date arrivalDate = StringUtil.parseDateTime(arrivalDateStr);
-            if (applicationDate == null || arrivalDate == null) {
-                continue;
-            }
-            if (CatalogueUtil.compareTime(applicationDate, arrivalDate, (long) (24 * 60))) {
-                status.set("-1");
-                return;
+            Map<String, String> conStructureMap = consultationResultsDoc.getStructureMap();
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {//循环取最近一条医嘱和会诊申请单中的急会诊比较
+                Map<String, String> docStructureMap = doctorAdviceDoc.getStructureMap();
+                if (docStructureMap.get("医嘱项目名称") != null && docStructureMap.get("医嘱项目名称").contains("会诊")) {
+                    String applicationDateStr = docStructureMap.get("医嘱开始时间");
+                    String arrivalDateStr = conStructureMap.get("会诊时间");
+                    if (StringUtil.isBlank(applicationDateStr) || StringUtil.isBlank(arrivalDateStr)) {
+                        continue;
+                    }
+                    Date applicationDate = StringUtil.parseDateTime(applicationDateStr);
+                    Date arrivalDate = StringUtil.parseDateTime(arrivalDateStr);
+                    if (applicationDate == null || arrivalDate == null) {
+                        continue;
+                    }
+                    if (CatalogueUtil.compareTime(applicationDate, arrivalDate, (long) (24 * 60))) {
+                        status.set("-1");
+                        return;
+                    }
+                }
             }
+            //            String applicationDateStr = structureMap.get("会诊申请日期");
+            //            String arrivalDateStr = structureMap.get("会诊到达时间");
         }
     }
 }

+ 72 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0281.java

@@ -0,0 +1,72 @@
+package com.lantone.qc.kernel.catalogue.consultation;
+
+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.DoctorAdviceDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : CON0281
+ * @Description : 急会诊未在十分钟内到达
+ * @Author : 王宇
+ * @Date: 2020-03-06 17:28
+ */
+@Component
+public class CON0281 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getConsultationDocs() == null) {
+            return;
+        }
+        //会诊单按日会诊申请日期排序
+        List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
+        //医嘱按照医嘱开始时间排序
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        Collections.sort(doctorAdviceDocs, new Comparator<DoctorAdviceDoc>() {
+            public int compare(DoctorAdviceDoc o1, DoctorAdviceDoc o2) {
+                return o1.getStructureMap().get("医嘱开始时间")
+                        .compareTo(o2.getStructureMap().get("医嘱开始时间"));
+            }
+        });
+        for (ConsultationDoc consultationDoc : consultationDocs) {
+            ConsultationRecordDoc consultationRecordDoc = consultationDoc.getConsultationRecordDoc();
+            if (consultationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> conStructureMap = consultationRecordDoc.getStructureMap();
+            if (conStructureMap.get("会诊分类") == null || !conStructureMap.get("会诊分类").contains("急会诊")) {
+                continue;
+            }
+            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {//循环取最近一条医嘱和会诊申请单中的急会诊比较
+                Map<String, String> docStructureMap = doctorAdviceDoc.getStructureMap();
+                if (docStructureMap.get("医嘱项目名称") != null && docStructureMap.get("医嘱项目名称").contains("会诊")) {
+                    String applicationDateStr = docStructureMap.get("医嘱开始时间");
+                    String arrivalDateStr = conStructureMap.get("会诊时间");
+                    if (StringUtil.isBlank(applicationDateStr) || StringUtil.isBlank(arrivalDateStr)) {
+                        continue;
+                    }
+                    Date applicationDate = StringUtil.parseDateTime(applicationDateStr);//医嘱开始时间
+                    Date arrivalDate = StringUtil.parseDateTime(arrivalDateStr);//会诊时间
+                    if (applicationDate == null || arrivalDate == null) {
+                        continue;
+                    }
+                    if (CatalogueUtil.compareTime(applicationDate, arrivalDate, 10L)) {
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 30 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/consultation/CON0528.java

@@ -3,12 +3,14 @@ package com.lantone.qc.kernel.catalogue.consultation;
 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.DoctorAdviceDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
 import org.springframework.stereotype.Component;
 
 import java.text.ParseException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @ClassName : CON0528
@@ -22,15 +24,36 @@ public class CON0528 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
         status.set("0");
         List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
-        if (consultationDocs.size() > 0) {
-            for (ConsultationDoc consulation : consultationDocs) {
-                ConsultationRecordDoc consultationRecordDoc = consulation.getConsultationRecordDoc();
-                if (consultationRecordDoc == null) {
-                    status.set("-1");
-                    break;
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        if (doctorAdviceDocs.size() == 0) {
+            return;
+        }
+        boolean findConsultation = false, findConsultationRemove = false;
+        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
+            Map<String, String> doctStructureMap = doctorAdviceDoc.getStructureMap();
+            if (doctStructureMap.get("医嘱项目名称") != null) {
+                if (doctStructureMap.get("医嘱项目名称").contains("会诊")) {
+                    findConsultation = true;
+                }
+                if (doctStructureMap.get("医嘱项目名称").contains("会诊")
+                        && doctStructureMap.get("医嘱项目名称").contains("取消")) {
+                    findConsultationRemove = true;
                 }
             }
         }
-
+        //医嘱有会诊但没有取消会诊
+        if (findConsultation && !findConsultationRemove) {
+            if (consultationDocs.size() > 0) {
+                for (ConsultationDoc consulation : consultationDocs) {
+                    ConsultationRecordDoc consultationRecordDoc = consulation.getConsultationRecordDoc();
+                    if (consultationRecordDoc == null) {
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        } else {
+            status.set("0");
+        }
     }
 }

+ 40 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/difficultcasediscuss/DIF02899.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.kernel.catalogue.difficultcasediscuss;
+
+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.DifficultCaseDiscussDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : DIF0116
+ * @Description : 	疑难病例讨论记录结论未填写
+ * @Author : 楼辉荣
+ * @Date: 2020-03-06 17:28
+ * 什么样的病历是疑难病例
+ */
+@Component
+public class DIF02899 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<DifficultCaseDiscussDoc> difficultCaseDiscussDocs = inputInfo.getDifficultCaseDiscussDocs();
+        if(ListUtil.isEmpty(difficultCaseDiscussDocs)){
+            return;
+        }
+        if(difficultCaseDiscussDocs != null && difficultCaseDiscussDocs.size()>0){
+            for (DifficultCaseDiscussDoc dcdd:difficultCaseDiscussDocs) {
+                Map<String, String> dcddStructureMap = dcdd.getStructureMap();
+                String diisDate = dcddStructureMap.get("结论");
+                if(CatalogueUtil.isEmpty(diisDate)){
+                    status.set("-1");
+                    break;
+                }
+            }
+        }
+    }
+}

+ 116 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0296.java

@@ -5,9 +5,11 @@ 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.model.doc.StagesSummaryDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
 import java.util.List;
@@ -17,6 +19,7 @@ import java.util.Map;
  * @ClassName : DUT0296
  * @Description : 无阶段小结
  * 住院时间超过1个月需要阶段小结, 出院时间和入院时间做比较,超过一个月查找阶段小结
+ * 住院30天患者需写“阶段小结”,但在住院期间转科的患者,时间应该是从转科那天算起。
  * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28
  */
@@ -24,35 +27,133 @@ import java.util.Map;
 public class DUT0296 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-
         LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (leaveHospitalDoc == null) {
+            return;
+        }
+        Map<String, String> structureMap_leave = leaveHospitalDoc.getStructureMap();
+        String beDate = structureMap_leave.get("入院时间"); //2019-12-07 08:48
+        String leaveDate = structureMap_leave.get("出院时间");//2019-12-10 10:49
+        if (StringUtil.isBlank(beDate) || StringUtil.isBlank(leaveDate)) {
+            return;
+        }
         List<StagesSummaryDoc> stagesSummaryDocs = inputInfo.getStagesSummaryDocs();
-        if (leaveHospitalDoc != null) {
-            Map<String, String> structureMap_leave = leaveHospitalDoc.getStructureMap();
-            String be_date = structureMap_leave.get("入院时间"); //2019-12-07 08:48
-            String leave_date = structureMap_leave.get("出院时间");//2019-12-10 10:49
-            if (StringUtil.isNotBlank(be_date) && StringUtil.isNotBlank(leave_date)) {
-                int ffr = ffr(be_date, leave_date);
-                if(ffr >= 31 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)){
+
+        TransferRecordDoc transferRecordDoc = inputInfo.getTransferRecordDocs();//转科记录
+        if (transferRecordDoc != null) {
+            List<TransferRecordDoc> allTransferDocs = transferRecordDoc.getAllTransferDocs();
+            String firstOutRecordDate = getFirstOutRecordDate(allTransferDocs);
+            if (StringUtil.isNotBlank(firstOutRecordDate)) {
+                //入院时间到第一次转出时间,大于30天则报错
+                int dateDifference = dateDifference(beDate, firstOutRecordDate);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+            String lastInrecordDate = getLastInrecordDate(allTransferDocs);
+            if (StringUtil.isNotBlank(lastInrecordDate)) {
+                //最后一次转入时间到出院时间,大于30天则报错
+                int dateDifference = dateDifference(lastInrecordDate, leaveDate);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
                     status.set("-1");
+                    return;
                 }
             }
+            List<String> allRecordPairs = getAllRecordPairs(allTransferDocs);
+            for (String recordPair : allRecordPairs) {
+                String[] recordPairSplit = recordPair.split(",");
+                int dateDifference = dateDifference(recordPairSplit[0], recordPairSplit[1]);
+                if (dateDifference > 30 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        } else {
+            //没有转科记录,直接入院时间和出院时间比
+            int dateDifference = dateDifference(beDate, leaveDate);
+            if (dateDifference >= 31 && (stagesSummaryDocs == null || stagesSummaryDocs.size() == 0)) {
+                status.set("-1");
+            }
         }
     }
 
-    private int ffr(String be_date, String leave_date) {
-        int day=0;
+    /**
+     * 获取第一条转出记录时间
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private String getFirstOutRecordDate(List<TransferRecordDoc> allTransferDocs) {
+        for (TransferRecordDoc transferDoc : allTransferDocs) {
+            Map<String, String> structureMap = transferDoc.getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isBlank(outDepartment)) {
+                //如果转出科室为空,则为转出记录
+                return structureMap.get("转科日期");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取最后一条转入记录
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private String getLastInrecordDate(List<TransferRecordDoc> allTransferDocs) {
+        for (int i = allTransferDocs.size() - 1; i > 0; i--) {
+            Map<String, String> structureMap = allTransferDocs.get(i).getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isNotBlank(outDepartment)) {
+                //如果转出科室不为空,则为转入记录
+                return structureMap.get("转科日期");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 获取所有转入时间-转出时间 pair
+     *
+     * @param allTransferDocs
+     * @return
+     */
+    private List<String> getAllRecordPairs(List<TransferRecordDoc> allTransferDocs) {
+        List<String> allRecordPairs = new ArrayList<>();
+        for (int i = 0; i < allTransferDocs.size(); i++) {
+            Map<String, String> structureMap = allTransferDocs.get(i).getStructureMap();
+            String outDepartment = structureMap.get("转出科室");
+            if (StringUtil.isNotBlank(outDepartment)) {
+                //如果转出科室不为空,则为转入记录
+                String transferDateInStr = structureMap.get("转科日期");
+                if (i + 1 < allTransferDocs.size()) {
+                    //如果转入记录下一条是转出记录
+                    Map<String, String> nextStructureMap = allTransferDocs.get(i + 1).getStructureMap();
+                    if (StringUtil.isBlank(nextStructureMap.get("转出科室"))) {
+                        //如果转出科室为空,则为转出记录
+                        String transferDateOutStr = nextStructureMap.get("转科日期");
+                        allRecordPairs.add(transferDateInStr + "," + transferDateOutStr);
+                    }
+                }
+            }
+        }
+        return allRecordPairs;
+    }
+
+    private int dateDifference(String beDate, String leaveDate) {
+        int day = 0;
         try {
-            Date date_in = StringUtil.parseDateTime(be_date);
-            Date date_out = StringUtil.parseDateTime(leave_date);
+            Date dateIn = StringUtil.parseDateTime(beDate);
+            Date dateOut = StringUtil.parseDateTime(leaveDate);
             Calendar from = Calendar.getInstance();
-            from.setTime(date_in);
+            from.setTime(dateIn);
             Calendar to = Calendar.getInstance();
-            to.setTime(date_out);
+            to.setTime(dateOut);
             int fromMonth = from.get(Calendar.DAY_OF_YEAR);
             int toMonth = to.get(Calendar.DAY_OF_YEAR);
             day = toMonth - fromMonth;
-
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 5 - 8
kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0597.java

@@ -24,19 +24,16 @@ import java.util.Map;
 public class DUT0597 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        List<TransferRecordDoc> transferRecordDocs = inputInfo.getTransferRecordDocs();
-        if (ListUtil.isEmpty(transferRecordDocs)) {
+        TransferRecordDoc transferRecordDoc = inputInfo.getTransferRecordDocs();
+        if (transferRecordDoc == null) {
             return;
         }
         String rollOutRecordDateStr = "", recordDateStr = "";
-        for (TransferRecordDoc transferRecordDoc : transferRecordDocs) {
-            TransferOutDoc transferOutDoc = transferRecordDoc.getTransferOutDoc();
-            if (transferOutDoc == null) {
-                continue;
-            }
+        List<TransferOutDoc> transferOutDocs = transferRecordDoc.getTransferOutDocs();
+        for (TransferOutDoc transferOutDoc : transferOutDocs) {
             Map<String, String> transferOutStructureMap = transferOutDoc.getStructureMap();
             rollOutRecordDateStr = transferOutStructureMap.get("转科日期");
-            recordDateStr = transferOutStructureMap.get("书写时间");
+            recordDateStr = transferOutStructureMap.get("记录日期");
             if (CatalogueUtil.isEmpty(rollOutRecordDateStr) || CatalogueUtil.isEmpty(recordDateStr)) {
                 continue;
             }

+ 8 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0598.java

@@ -4,6 +4,7 @@ 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.transferrecord.TransferIntoDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
 import com.lantone.qc.pub.util.ListUtil;
@@ -24,19 +25,16 @@ import java.util.Map;
 public class DUT0598 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        List<TransferRecordDoc> transferRecordDocs = inputInfo.getTransferRecordDocs();
-        if (ListUtil.isEmpty(transferRecordDocs)) {
+        TransferRecordDoc transferRecordDoc = inputInfo.getTransferRecordDocs();
+        if (transferRecordDoc == null) {
             return;
         }
+        List<TransferIntoDoc> transferIntoDocs = transferRecordDoc.getTransferIntoDocs();
         String rollInRecordDateStr = "", recordDateStr = "";
-        for (TransferRecordDoc transferRecordDoc : transferRecordDocs) {
-            TransferOutDoc transferOutDoc = transferRecordDoc.getTransferOutDoc();
-            if (transferOutDoc == null) {
-                continue;
-            }
-            Map<String, String> transferOutStructureMap = transferOutDoc.getStructureMap();
-            rollInRecordDateStr = transferOutStructureMap.get("患者于");
-            recordDateStr = transferOutStructureMap.get("书写时间");
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocs) {
+            Map<String, String> transferOutStructureMap = transferIntoDoc.getStructureMap();
+            rollInRecordDateStr = transferOutStructureMap.get("转科日期");
+            recordDateStr = transferOutStructureMap.get("记录日期");
             if (CatalogueUtil.isEmpty(rollInRecordDateStr) || CatalogueUtil.isEmpty(recordDateStr)) {
                 continue;
             }

+ 18 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/dutyshiftsystem/DUT0599.java

@@ -5,6 +5,7 @@ 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.transferrecord.TransferIntoDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
 import com.lantone.qc.pub.util.DateUtil;
@@ -12,6 +13,7 @@ import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -27,30 +29,28 @@ import java.util.Map;
 public class DUT0599 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        List<TransferRecordDoc> transferRecordDocs = inputInfo.getTransferRecordDocs();
+        TransferRecordDoc transferRecordDoc = inputInfo.getTransferRecordDocs();
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
-        if (ListUtil.isEmpty(transferRecordDocs) || ListUtil.isEmpty(threeLevelWardDocs)) {
+        if (transferRecordDoc == null || ListUtil.isEmpty(threeLevelWardDocs)) {
             return;
         }
         //所有查房记录的日期天
-        List<Integer> wardRecordDayList = getWardRecordDay(threeLevelWardDocs);
+        List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
+        List<Date> wardRecordDayList = getWardRecordDay(allDoctorWradDocs);
         String rollInRecordDateStr = "";
         //转入日期后应该有的查房记录的日期天
-        List<Integer> rollInDay = null;
-        for (TransferRecordDoc transferRecordDoc : transferRecordDocs) {
-            TransferOutDoc transferOutDoc = transferRecordDoc.getTransferOutDoc();
-            if (transferOutDoc == null) {
-                continue;
-            }
-            Map<String, String> transferOutStructureMap = transferOutDoc.getStructureMap();
-            rollInRecordDateStr = transferOutStructureMap.get("患者于");
+        List<Date> rollInDay = null;
+        List<TransferIntoDoc> transferIntoDocs = transferRecordDoc.getTransferIntoDocs();
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocs) {
+            Map<String, String> transferOutStructureMap = transferIntoDoc.getStructureMap();
+            rollInRecordDateStr = transferOutStructureMap.get("转科日期");
             if (CatalogueUtil.isEmpty(rollInRecordDateStr)) {
                 continue;
             }
             Date rollInRecordDate = StringUtil.parseDateTime(rollInRecordDateStr);
             rollInDay = new ArrayList<>();
             for (int i = 1; i <= 3; i++) {
-                int wardRecordDay = DateUtil.getDay(DateUtil.addDate(rollInRecordDate, i));
+                Date wardRecordDay = DateUtil.dateZeroClear(DateUtil.addDate(rollInRecordDate, i));
                 rollInDay.add(wardRecordDay);
             }
             if (!wardRecordDayList.containsAll(rollInDay)) {
@@ -65,17 +65,20 @@ public class DUT0599 extends QCCatalogue {
      *
      * @param threeLevelWardDocs
      */
-    private List<Integer> getWardRecordDay(List<ThreeLevelWardDoc> threeLevelWardDocs) {
-        List<Integer> dateRecordDay = new ArrayList<>();
+    private List<Date> getWardRecordDay(List<ThreeLevelWardDoc> threeLevelWardDocs) {
+        List<Date> dateRecordDay = new ArrayList<>();
         String recordTime = "";
         for (ThreeLevelWardDoc threeLevelWardDoc : threeLevelWardDocs) {
             Map<String, String> rescueStructureMap = threeLevelWardDoc.getStructureMap();
             recordTime = rescueStructureMap.get("查房日期");
+            if (StringUtil.isBlank(recordTime)){
+                continue;
+            }
             Date recordDate = StringUtil.parseDateTime(recordTime);
             if (recordDate == null) {
                 continue;
             }
-            dateRecordDay.add(DateUtil.getDay(recordDate));
+            dateRecordDay.add(DateUtil.dateZeroClear(recordDate));
         }
         return dateRecordDay;
     }

+ 50 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02859.java

@@ -0,0 +1,50 @@
+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.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP02859
+ * @Description :质控未在出院三天内完成
+ * @Author : 胡敬
+ * @Date: 2020-04-29 09:43
+ */
+@Component
+public class FIRP02859 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (firstPageRecordDoc == null || leaveHospitalDoc == null) {
+            status.set("0");
+            return;
+        }
+        Map<String, String> firstStructureMap = firstPageRecordDoc.getStructureMap();
+        String qcDateStr = firstStructureMap.get("质控日期");
+        Map<String, String> leaveStructureMap = leaveHospitalDoc.getStructureMap();
+        String leaveDateStr = leaveStructureMap.get("出院时间");
+        if (StringUtil.isBlank(qcDateStr) || StringUtil.isBlank(leaveDateStr)) {
+            status.set("0");
+            return;
+        }
+        Date qcDate = StringUtil.parseDateTime(qcDateStr);
+        Date leaveDate = StringUtil.parseDateTime(leaveDateStr);
+        if (qcDate == null || leaveDate == null) {
+            status.set("0");
+            return;
+        }
+        boolean overTime = CatalogueUtil.compareTime(leaveDate, qcDate, 72 * 60L);
+        if (!overTime) {
+            //质控日期在出院时间三天内完成
+            status.set("0");
+        }
+    }
+}

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

@@ -0,0 +1,33 @@
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0737
+ * @Description : 现住址邮编信息错误
+ * @Author : 胡敬
+ * @Date: 2020-05-08 16:00
+ */
+@Component
+public class FIRP02883 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String zipcode = firstpageStructureMap.get(Content.current_address_zipcode);
+            if (!CatalogueUtil.isEmpty(zipcode)) {
+                String regex = "^\\d{6}$";
+                if (!zipcode.matches(regex)) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,33 @@
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP02885
+ * @Description : 户口地址邮编信息错误
+ * @Author : 胡敬
+ * @Date: 2020-05-08 16:00
+ */
+@Component
+public class FIRP02885 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String zipcode = firstpageStructureMap.get(Content.household_address);
+            if (!CatalogueUtil.isEmpty(zipcode)) {
+                String regex = "^\\d{6}$";
+                if (!zipcode.matches(regex)) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

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

@@ -0,0 +1,33 @@
+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 org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP02886
+ * @Description : 工作单位邮编信息错误
+ * @Author : 胡敬
+ * @Date: 2020-05-08 16:00
+ */
+@Component
+public class FIRP02886 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String zipcode = firstpageStructureMap.get(Content.work_unit_zipcode);
+            if (!CatalogueUtil.isEmpty(zipcode)) {
+                String regex = "^\\d{6}$";
+                if (!zipcode.matches(regex)) {
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

+ 13 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0148.java

@@ -1,6 +1,7 @@
 package com.lantone.qc.kernel.catalogue.leavehospital;
 
 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.DeathRecordDoc;
@@ -9,6 +10,8 @@ import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
+
 /**
  * @Description: 出院记录未在患者出院前完成
  * @author: rengb
@@ -29,12 +32,17 @@ public class LEA0148 extends QCCatalogue {
         } else {
             String timeQm = leaveHospitalDoc.getStructureMap().get("签名时间");
             String timeCy = leaveHospitalDoc.getStructureMap().get("出院时间");
-            if (StringUtil.isNotBlank(timeQm)
-                    && StringUtil.isNotBlank(timeCy)
-                    && DateUtil.parseDate(timeQm).getTime() <= DateUtil.parseDate(timeCy).getTime()) {
-                status.set("0");
+            if (StringUtil.isNotBlank(timeQm) && StringUtil.isNotBlank(timeCy)) {
+                Date timeQmDate = StringUtil.parseDateTime(timeQm);
+                Date timeCyDate = StringUtil.parseDateTime(timeCy);
+                if (timeQmDate == null && timeCyDate == null) {
+                    status.set("0");
+                    return;
+                }
+                if (!CatalogueUtil.compareTime(timeCyDate, timeQmDate, 24 * 60L)) {
+                    status.set("0");
+                }
             }
         }
     }
-
 }

+ 41 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/medicalwriting/MEDI02882.java

@@ -0,0 +1,41 @@
+package com.lantone.qc.kernel.catalogue.medicalwriting;
+
+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.ThreeLevelWardDoc;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 王宇
+ * @create 2020-05-09 10:12
+ * @desc 患者拒绝治疗,缺少相关告知书
+ **/
+@Component
+public class MEDI02882 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        Boolean ref = false;
+        if(inputInfo.getBeHospitalizedDoc().getText().contains("拒绝")){//入院记录是否有拒绝
+            ref = true;
+        }
+        if(inputInfo.getLeaveHospitalDoc().getText().contains("拒绝")){//出院记录是否有拒绝
+            ref = true;
+        }
+        for (ThreeLevelWardDoc threeLevelWardDoc : inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs()) {//查房记录是否有拒绝
+            if(threeLevelWardDoc.getStructureMap().get("病情记录").contains("拒绝")){
+                ref = true;
+            }
+        }
+        if(inputInfo.getFirstCourseRecordDoc().getText().contains("拒绝")){//首次病程是否有拒绝
+            ref = true;
+        }
+        if(ref){
+            for (String notice: inputInfo.getNoticeOfConversationDoc().getAllNoticeOfConverstartion()) {
+                if(!notice.contains("拒绝")){
+                    status.set("-1");
+                }
+            }
+        }
+    }
+}

+ 8 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0720.java

@@ -1,4 +1,4 @@
-package com.lantone.qc.kernel.catalogue.noticeinformedconsent;
+package com.lantone.qc.kernel.catalogue.medicalwriting;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
@@ -19,16 +19,19 @@ import java.util.stream.Collectors;
  * @Date: 2020-04-21 18:40
  */
 @Component
-public class NOT0720 extends QCCatalogue {
+public class MEDI02888 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
         NoticeOfConversationDoc noticeOfConversationDoc = inputInfo.getNoticeOfConversationDoc();
         if (noticeOfConversationDoc == null){
-            status.set("0");
+            return;
+        }
+        if(inputInfo.getOperationDocs() != null && inputInfo.getOperationDocs().size() != 0){//手术患者可以没无72
             return;
         }
         Map<String, String> structureMap = noticeOfConversationDoc.getStructureMap();
-        if (structureMap.containsKey("入院72小时内谈话记录")){
-            status.set("0");
+        if (!structureMap.containsKey("入院72小时内谈话记录")){
+            status.set("-1");
         }
     }
 }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0719.java

@@ -1,4 +1,4 @@
-package com.lantone.qc.kernel.catalogue.noticeinformedconsent;
+package com.lantone.qc.kernel.catalogue.medicalwriting;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
@@ -16,7 +16,7 @@ import java.util.Map;
  * @Date: 2020-04-21 18:54
  */
 @Component
-public class NOT0719 extends QCCatalogue {
+public class MEDI02889 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         InformedConsentDoc informedConsentDoc = inputInfo.getInformedConsentDoc();
         if (informedConsentDoc == null){

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/noticeinformedconsent/NOT0718.java

@@ -1,4 +1,4 @@
-package com.lantone.qc.kernel.catalogue.noticeinformedconsent;
+package com.lantone.qc.kernel.catalogue.medicalwriting;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.pub.model.InputInfo;
@@ -15,7 +15,7 @@ import java.util.Map;
  * @Date: 2020-04-21 18:40
  */
 @Component
-public class NOT0718 extends QCCatalogue {
+public class MEDI02890 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         NoticeOfConversationDoc noticeOfConversationDoc = inputInfo.getNoticeOfConversationDoc();
         if (noticeOfConversationDoc == null){

+ 130 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02891.java

@@ -0,0 +1,130 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录手术开始时间与手麻系统记录不一致
+ * @author: 胡敬
+ * @time: 2020/5/12 10:23
+ */
+@Component
+public class OPE02891 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+        //        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<AnesthesiaRelatedDoc> anesthesiaRelatedDocs = inputInfo.getAnesthesiaRelatedDocs();
+        if (operationDocs == null || operationDocs.size() == 0
+                || anesthesiaRelatedDocs == null || anesthesiaRelatedDocs.size() == 0) {
+            return;
+        }
+
+        for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
+            Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
+            String anesOperationName = anesthesiaStructureMap.get("手术名称");
+            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术开始时间");
+            if (StringUtil.isBlank(anesOperationName)) {
+                continue;
+            }
+            anesOperationName = StringUtil.removeBlank(anesOperationName);
+            if (StringUtil.isBlank(anesOperationStartDateStr)) {
+                continue;
+            }
+            Date anesOperationStartDate = StringUtil.parseDateTime(anesOperationStartDateStr);
+            if (anesOperationStartDate == null) {
+                continue;
+            }
+            Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
+            if (startEndDate.get("手术开始时间") != null) {
+                Date operationStartDate = startEndDate.get("手术开始时间");
+                if (!operationStartDate.equals(anesOperationStartDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+    //    }
+
+    /**
+     * 获取手术开始时间和结束时间
+     *
+     * @param operationDocs
+     * @param anesOperationName
+     * @return
+     */
+    private Map<String, Date> getStartEndDate(List<OperationDoc> operationDocs, String anesOperationName) {
+        Map<String, Date> startEndDateMap = new HashMap<>();
+        Date startDate = null, endDate = null;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> operationStructureMap = operationRecordDoc.getStructureMap();
+            String operationName = operationStructureMap.get("手术名称");
+            String operationStartDateStr = operationStructureMap.get("手术开始时间");
+            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operationName)) {
+                continue;
+            }
+            operationName = StringUtil.removeBlank(operationName);
+            if (withInOneDay(operationStartDateStr, operationEndDateStr)) {
+                if (anesOperationName.contains(operationName)) {
+                    Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                    if (startDate == null || operationStartDate.before(startDate)) {
+                        startDate = operationStartDate;
+                    }
+                    Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
+                    if (endDate == null || operationEndDate.after(endDate)) {
+                        endDate = operationEndDate;
+                    }
+                }
+            }
+        }
+        if (startDate != null) {
+            startEndDateMap.put("手术开始时间", startDate);
+        }
+        if (endDate != null) {
+            startEndDateMap.put("手术结束时间", endDate);
+        }
+        return startEndDateMap;
+    }
+
+    /**
+     * 确认手术开始时间->手术结束时间是否为24小时内
+     *
+     * @param firstDateStr
+     * @param secondDateStr
+     * @return
+     */
+    private boolean withInOneDay(String firstDateStr, String secondDateStr) {
+        if (StringUtil.isBlank(firstDateStr) && StringUtil.isBlank(secondDateStr)) {
+            return false;
+        }
+        Date firstDate = StringUtil.parseDateTime(firstDateStr);
+        Date secondDate = StringUtil.parseDateTime(secondDateStr);
+        if (firstDate == null || secondDate == null) {
+            return false;
+        }
+        return firstDate.before(secondDate) && !CatalogueUtil.compareTime(firstDate, secondDate, 24 * 60L);
+    }
+
+}

+ 130 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02892.java

@@ -0,0 +1,130 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 手术记录手术结束时间与手麻系统记录不一致
+ * @author: 胡敬
+ * @time: 2020/5/11 16:32
+ */
+@Component
+public class OPE02892 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+        //        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<AnesthesiaRelatedDoc> anesthesiaRelatedDocs = inputInfo.getAnesthesiaRelatedDocs();
+        if (operationDocs == null || operationDocs.size() == 0
+                || anesthesiaRelatedDocs == null || anesthesiaRelatedDocs.size() == 0) {
+            return;
+        }
+
+        for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
+            Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
+            String anesOperationName = anesthesiaStructureMap.get("手术名称");
+            String anesOperationEndDateStr = anesthesiaStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(anesOperationName)) {
+                continue;
+            }
+            anesOperationName = StringUtil.removeBlank(anesOperationName);
+            if (StringUtil.isBlank(anesOperationEndDateStr)) {
+                continue;
+            }
+            Date anesOperationEndDate = StringUtil.parseDateTime(anesOperationEndDateStr);
+            if (anesOperationEndDate == null) {
+                continue;
+            }
+            Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
+            if (startEndDate.get("手术结束时间") != null) {
+                Date operationEndDate = startEndDate.get("手术结束时间");
+                if (!operationEndDate.equals(anesOperationEndDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+    //    }
+
+    /**
+     * 获取手术开始时间和结束时间
+     *
+     * @param operationDocs
+     * @param anesOperationName
+     * @return
+     */
+    private Map<String, Date> getStartEndDate(List<OperationDoc> operationDocs, String anesOperationName) {
+        Map<String, Date> startEndDateMap = new HashMap<>();
+        Date startDate = null, endDate = null;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> operationStructureMap = operationRecordDoc.getStructureMap();
+            String operationName = operationStructureMap.get("手术名称");
+            String operationStartDateStr = operationStructureMap.get("手术开始时间");
+            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operationName)) {
+                continue;
+            }
+            operationName = StringUtil.removeBlank(operationName);
+            if (withInOneDay(operationStartDateStr, operationEndDateStr)) {
+                if (anesOperationName.contains(operationName)) {
+                    Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                    if (startDate == null || operationStartDate.before(startDate)) {
+                        startDate = operationStartDate;
+                    }
+                    Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
+                    if (endDate == null || operationEndDate.after(endDate)) {
+                        endDate = operationEndDate;
+                    }
+                }
+            }
+        }
+        if (startDate != null) {
+            startEndDateMap.put("手术开始时间", startDate);
+        }
+        if (endDate != null) {
+            startEndDateMap.put("手术结束时间", endDate);
+        }
+        return startEndDateMap;
+    }
+
+    /**
+     * 确认手术开始时间->手术结束时间是否为24小时内
+     *
+     * @param firstDateStr
+     * @param secondDateStr
+     * @return
+     */
+    private boolean withInOneDay(String firstDateStr, String secondDateStr) {
+        if (StringUtil.isBlank(firstDateStr) && StringUtil.isBlank(secondDateStr)) {
+            return false;
+        }
+        Date firstDate = StringUtil.parseDateTime(firstDateStr);
+        Date secondDate = StringUtil.parseDateTime(secondDateStr);
+        if (firstDate == null || secondDate == null) {
+            return false;
+        }
+        return firstDate.before(secondDate) && !CatalogueUtil.compareTime(firstDate, secondDate, 24 * 60L);
+    }
+
+}

+ 130 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02897.java

@@ -0,0 +1,130 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 术后首次病程手术结束时间与手麻系统记录不一致
+ * @author: 胡敬
+ * @time: 2020/5/12 10:23
+ */
+@Component
+public class OPE02897 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+        //        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<AnesthesiaRelatedDoc> anesthesiaRelatedDocs = inputInfo.getAnesthesiaRelatedDocs();
+        if (operationDocs == null || operationDocs.size() == 0
+                || anesthesiaRelatedDocs == null || anesthesiaRelatedDocs.size() == 0) {
+            return;
+        }
+
+        for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
+            Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
+            String anesOperationName = anesthesiaStructureMap.get("手术名称");
+            String anesOperationEndDateStr = anesthesiaStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(anesOperationName)) {
+                continue;
+            }
+            anesOperationName = StringUtil.removeBlank(anesOperationName);
+            if (StringUtil.isBlank(anesOperationEndDateStr)) {
+                continue;
+            }
+            Date anesOperationEndDate = StringUtil.parseDateTime(anesOperationEndDateStr);
+            if (anesOperationEndDate == null) {
+                continue;
+            }
+            Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
+            if (startEndDate.get("手术结束时间") != null) {
+                Date operationEndDate = startEndDate.get("手术结束时间");
+                if (!operationEndDate.equals(anesOperationEndDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+    //    }
+
+    /**
+     * 获取手术开始时间和结束时间
+     *
+     * @param operationDocs
+     * @param anesOperationName
+     * @return
+     */
+    private Map<String, Date> getStartEndDate(List<OperationDoc> operationDocs, String anesOperationName) {
+        Map<String, Date> startEndDateMap = new HashMap<>();
+        Date startDate = null, endDate = null;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+            if (operationDiscussionDoc == null) {
+                continue;
+            }
+            Map<String, String> operationStructureMap = operationDiscussionDoc.getStructureMap();
+            String operationName = operationStructureMap.get("手术名称");
+            String operationStartDateStr = operationStructureMap.get("手术开始时间");
+            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operationName)) {
+                continue;
+            }
+            operationName = StringUtil.removeBlank(operationName);
+            if (withInOneDay(operationStartDateStr, operationEndDateStr)) {
+                if (anesOperationName.contains(operationName)) {
+                    Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                    if (startDate == null || operationStartDate.before(startDate)) {
+                        startDate = operationStartDate;
+                    }
+                    Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
+                    if (endDate == null || operationEndDate.after(endDate)) {
+                        endDate = operationEndDate;
+                    }
+                }
+            }
+        }
+        if (startDate != null) {
+            startEndDateMap.put("手术开始时间", startDate);
+        }
+        if (endDate != null) {
+            startEndDateMap.put("手术结束时间", endDate);
+        }
+        return startEndDateMap;
+    }
+
+    /**
+     * 确认手术开始时间->手术结束时间是否为24小时内
+     *
+     * @param firstDateStr
+     * @param secondDateStr
+     * @return
+     */
+    private boolean withInOneDay(String firstDateStr, String secondDateStr) {
+        if (StringUtil.isBlank(firstDateStr) && StringUtil.isBlank(secondDateStr)) {
+            return false;
+        }
+        Date firstDate = StringUtil.parseDateTime(firstDateStr);
+        Date secondDate = StringUtil.parseDateTime(secondDateStr);
+        if (firstDate == null || secondDate == null) {
+            return false;
+        }
+        return firstDate.before(secondDate) && !CatalogueUtil.compareTime(firstDate, secondDate, 24 * 60L);
+    }
+
+}

+ 130 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE02898.java

@@ -0,0 +1,130 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+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.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 术后首次病程手术开始时间与手麻系统记录不一致
+ * @author: 胡敬
+ * @time: 2020/5/12 10:23
+ */
+@Component
+public class OPE02898 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+        //        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        List<AnesthesiaRelatedDoc> anesthesiaRelatedDocs = inputInfo.getAnesthesiaRelatedDocs();
+        if (operationDocs == null || operationDocs.size() == 0
+                || anesthesiaRelatedDocs == null || anesthesiaRelatedDocs.size() == 0) {
+            return;
+        }
+
+        for (AnesthesiaRelatedDoc anesthesiaRelatedDoc : anesthesiaRelatedDocs) {
+            Map<String, String> anesthesiaStructureMap = anesthesiaRelatedDoc.getStructureMap();
+            String anesOperationName = anesthesiaStructureMap.get("手术名称");
+            String anesOperationStartDateStr = anesthesiaStructureMap.get("手术开始时间");
+            if (StringUtil.isBlank(anesOperationName)) {
+                continue;
+            }
+            anesOperationName = StringUtil.removeBlank(anesOperationName);
+            if (StringUtil.isBlank(anesOperationStartDateStr)) {
+                continue;
+            }
+            Date anesOperationStartDate = StringUtil.parseDateTime(anesOperationStartDateStr);
+            if (anesOperationStartDate == null) {
+                continue;
+            }
+            Map<String, Date> startEndDate = getStartEndDate(operationDocs, anesOperationName);
+            if (startEndDate.get("手术开始时间") != null) {
+                Date operationStartDate = startEndDate.get("手术开始时间");
+                if (!operationStartDate.equals(anesOperationStartDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+    //    }
+
+    /**
+     * 获取手术开始时间和结束时间
+     *
+     * @param operationDocs
+     * @param anesOperationName
+     * @return
+     */
+    private Map<String, Date> getStartEndDate(List<OperationDoc> operationDocs, String anesOperationName) {
+        Map<String, Date> startEndDateMap = new HashMap<>();
+        Date startDate = null, endDate = null;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+            if (operationDiscussionDoc == null) {
+                continue;
+            }
+            Map<String, String> operationStructureMap = operationDiscussionDoc.getStructureMap();
+            String operationName = operationStructureMap.get("手术名称");
+            String operationStartDateStr = operationStructureMap.get("手术开始时间");
+            String operationEndDateStr = operationStructureMap.get("手术结束时间");
+            if (StringUtil.isBlank(operationName)) {
+                continue;
+            }
+            operationName = StringUtil.removeBlank(operationName);
+            if (withInOneDay(operationStartDateStr, operationEndDateStr)) {
+                if (anesOperationName.contains(operationName)) {
+                    Date operationStartDate = StringUtil.parseDateTime(operationStartDateStr);
+                    if (startDate == null || operationStartDate.before(startDate)) {
+                        startDate = operationStartDate;
+                    }
+                    Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
+                    if (endDate == null || operationEndDate.after(endDate)) {
+                        endDate = operationEndDate;
+                    }
+                }
+            }
+        }
+        if (startDate != null) {
+            startEndDateMap.put("手术开始时间", startDate);
+        }
+        if (endDate != null) {
+            startEndDateMap.put("手术结束时间", endDate);
+        }
+        return startEndDateMap;
+    }
+
+    /**
+     * 确认手术开始时间->手术结束时间是否为24小时内
+     *
+     * @param firstDateStr
+     * @param secondDateStr
+     * @return
+     */
+    private boolean withInOneDay(String firstDateStr, String secondDateStr) {
+        if (StringUtil.isBlank(firstDateStr) && StringUtil.isBlank(secondDateStr)) {
+            return false;
+        }
+        Date firstDate = StringUtil.parseDateTime(firstDateStr);
+        Date secondDate = StringUtil.parseDateTime(secondDateStr);
+        if (firstDate == null || secondDate == null) {
+            return false;
+        }
+        return firstDate.before(secondDate) && !CatalogueUtil.compareTime(firstDate, secondDate, 24 * 60L);
+    }
+
+}

+ 26 - 25
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0647.java

@@ -9,6 +9,7 @@ import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 
@@ -22,35 +23,35 @@ import java.util.Map;
 public class OPE0647 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-//        boolean isOperativePatient = true;//是手术患者(暂时默认是)
-//        if (isOperativePatient) {
-            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-        if(operationDocs == null || operationDocs.size() == 0){
+        //        boolean isOperativePatient = true;//是手术患者(暂时默认是)
+        //        if (isOperativePatient) {
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        if (operationDocs == null || operationDocs.size() == 0) {
             status.set("0");
             return;
         }
-            if (operationDocs.size() == 0) {
-                return;
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
+            String operationEndDateStr = operationRecordStructureMap.get("手术结束时间");
+            String operationRecordDateStr = operationRecordStructureMap.get("记录时间");
+            if (CatalogueUtil.isEmpty(operationEndDateStr) || CatalogueUtil.isEmpty(operationRecordDateStr)) {
+                continue;
             }
-            for (OperationDoc operationDoc : operationDocs) {
-                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
-                if (operationRecordDoc == null) {
-                    continue;
-                }
-                Map<String, String> operationRecordStructureMap = operationRecordDoc.getStructureMap();
-                String operationEndDateStr = operationRecordStructureMap.get("手术结束时间");
-                String operationRecordDateStr = operationRecordStructureMap.get("记录时间");
-                if (CatalogueUtil.isEmpty(operationEndDateStr) || CatalogueUtil.isEmpty(operationRecordDateStr)) {
-                    continue;
-                }
-                boolean compareTime = CatalogueUtil.compareTime(StringUtil.parseDateTime(operationEndDateStr),
-                        StringUtil.parseDateTime(operationRecordDateStr),
-                        (long) (24 * 60));
-                if (compareTime) {
-                    status.set("-1");
-                    return;
-                }
+            Date operationEndDate = StringUtil.parseDateTime(operationEndDateStr);
+            Date operationRecordDate = StringUtil.parseDateTime(operationRecordDateStr);
+            if (operationEndDate == null || operationRecordDate == null) {
+                continue;
             }
-//        }
+            boolean compareTime = CatalogueUtil.compareTime(operationEndDate, operationRecordDate, 24 * 60L);
+            if (compareTime) {
+                status.set("-1");
+                return;
+            }
+        }
+        //        }
     }
 }

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

@@ -29,6 +29,10 @@ public class PRE0330 extends QCCatalogue {
         for (OperationDoc operationDoc : operationDocs) {
             if (operationDoc.getPreoperativeDiscussionDoc() != null) {
                 Map<String, String> structureMap = operationDoc.getPreoperativeDiscussionDoc().getStructureMap();
+                if(structureMap != null
+                        && structureMap.get("拟施手术方式、名称及可能的变更与禁忌征 ") != null){
+                    return;
+                }
                 if (StringUtil.isEmpty(structureMap.get("拟行术式")) && StringUtil.isEmpty(structureMap.get("可能的变更"))) {
                     status.set("-1");
                 }

+ 6 - 5
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0094.java

@@ -28,7 +28,7 @@ public class THR0094 extends QCCatalogue {
         }
 
         String sign = inputInfo.getFirstCourseRecordDoc().getStructureMap().get("记录医师");
-        sign = (null==sign)?"":sign.trim();
+        sign = (null == sign) ? "" : sign.trim();
 
         RedisUtil redisUtil = SpringContextUtil.getBean("redisUtil");
         Map<String, Object> surgeon = redisUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
@@ -36,10 +36,11 @@ public class THR0094 extends QCCatalogue {
             return;
         }
         Map<String, String> doctor = (Map) surgeon.get(sign);
-        String occup = doctor.get("occup");
-        if (StringUtils.isNotEmpty(occup) && "1".equals(occup)) {
-            status.set("0");
-            return;
+        if (doctor != null) {
+            String occup = doctor.get("occup");
+            if (StringUtils.isNotEmpty(occup) && "1".equals(occup)) {
+                status.set("0");
+            }
         }
     }
 }

+ 10 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0140.java

@@ -40,6 +40,16 @@ public class THR0140 extends QCCatalogue {
             status.set("0");
         }
 
+        StringBuffer message = new StringBuffer();
+        //长兴:返回所有医师未签名的记录日期
+        for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
+            if(StringUtil.isBlank(threeLevelWardDoc.getStructureMap().get("记录医师"))){
+                if(threeLevelWardDoc.getStructureMap() != null && threeLevelWardDoc.getStructureMap().get("记录时间") != null){
+                    message.append(threeLevelWardDoc.getStructureMap().get("记录时间")+",");
+                }
+            }
+        }
+        info.set(message.toString());
         //        if (inputInfo.getDifficultCaseDiscussDocs().size() > 0) {
         //            processSign(inputInfo, "疑难患者");
         //        }

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0144.java

@@ -37,10 +37,17 @@ public class THR0144 extends QCCatalogue {
         String title = structureMap.get("查房标题");
         conditionRecord = StringUtil.isBlank(conditionRecord)?"":conditionRecord;
         treatmentPlan = StringUtil.isBlank(treatmentPlan)?"":treatmentPlan;
+        //主任或主治查房
         if ((conditionRecord.contains("出院") || treatmentPlan.contains("出院"))
                 && StringUtil.isNotBlank(title)
                 && (CatalogueUtil.subTitle(title).contains(Content.attend) || CatalogueUtil.subTitle(title).contains(Content.director))) {
             status.set("0");
         }
+        //普通查房
+        if(StringUtil.isNotBlank(title)
+                && (title.contains("日常查房记录") || title.contains("普通查房记录") || title.contains("日常病程记录"))
+                && conditionRecord.contains("上级医师")){
+            status.set("0");
+        }
     }
 }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0702.java

@@ -15,13 +15,13 @@ import org.springframework.stereotype.Component;
 import java.util.List;
 
 /**
- * @ClassName : THR0701
+ * @ClassName : THR0702
  * @Description : 首次主任医师查房中鉴别诊断跟首程一致
  * @Author : 胡敬
  * @Date: 2020-04-20 16:38
  */
 @Component
-public class THR0702 extends QCCatalogue {
+public class THR02880 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         if (inputInfo.getThreeLevelWardDocs().size() == 0 || inputInfo.getFirstCourseRecordDoc() == null) {
             status.set("0");

+ 20 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02881.java

@@ -0,0 +1,20 @@
+package com.lantone.qc.kernel.catalogue.threelevelward;
+
+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;
+
+/**
+ * @author 王宇
+ * @create 2020-05-08 16:56
+ * @desc 检验检查结果未及时记录
+ **/
+@Component
+public class THR02881 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+
+    }
+
+}

+ 4 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0595.java

@@ -28,9 +28,9 @@ public class THR0595 extends QCCatalogue {
             return;
         }
         //所有查房记录的日期天
-        List<Integer> dateRecordDay = new ArrayList<>();
+        List<Date> dateRecordDay = new ArrayList<>();
         //危重患者应该有的查房记录的日期天
-        List<Integer> criticallyDay = new ArrayList<>();
+        List<Date> criticallyDay = new ArrayList<>();
         Date criticallyStartDate = null, criticallyEndDate = null;
         String recordTime = "", content = "";
         List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();//查房记录
@@ -47,7 +47,7 @@ public class THR0595 extends QCCatalogue {
             } else if (content.contains("病情稳定") || content.contains("病情好转")) {
                 criticallyEndDate = recordDate;
             }
-            dateRecordDay.add(DateUtil.getDay(recordDate));
+            dateRecordDay.add(DateUtil.dateZeroClear(recordDate));
         }
         if (criticallyStartDate == null || criticallyEndDate == null) {
             return;
@@ -55,7 +55,7 @@ public class THR0595 extends QCCatalogue {
         int daynum = DateUtil.getDay(criticallyEndDate) - DateUtil.getDay(criticallyStartDate);
         for (int i = 1; i <= daynum; i++) {
             if (i % 2 == 0) {
-                int wardDay = DateUtil.getDay(DateUtil.addDate(criticallyStartDate, i));
+                Date wardDay = DateUtil.dateZeroClear(DateUtil.addDate(criticallyStartDate, i));
                 criticallyDay.add(wardDay);
             }
         }

+ 4 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0596.java

@@ -28,9 +28,9 @@ public class THR0596 extends QCCatalogue {
             return;
         }
         //所有查房记录的日期天
-        List<Integer> dateRecordDay = new ArrayList<>();
+        List<Date> dateRecordDay = new ArrayList<>();
         //危重患者应该有的查房记录的日期天
-        List<Integer> criticallyDay = new ArrayList<>();
+        List<Date> criticallyDay = new ArrayList<>();
         Date criticallyStartDate = null, criticallyEndDate = null;
         String recordTime = "", content = "";
         List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();//查房记录
@@ -47,14 +47,14 @@ public class THR0596 extends QCCatalogue {
             } else if (content.contains("病情稳定") || content.contains("病情好转")) {
                 criticallyEndDate = recordDate;
             }
-            dateRecordDay.add(DateUtil.getDay(recordDate));
+            dateRecordDay.add(DateUtil.dateZeroClear(recordDate));
         }
         if (criticallyStartDate == null || criticallyEndDate == null) {
             return;
         }
         int daynum = DateUtil.getDay(criticallyEndDate) - DateUtil.getDay(criticallyStartDate);
         for (int i = 1; i <= daynum; i++) {
-            int wardDay = DateUtil.getDay(DateUtil.addDate(criticallyStartDate, i));
+            Date wardDay = DateUtil.dateZeroClear(DateUtil.addDate(criticallyStartDate, i));
             criticallyDay.add(wardDay);
         }
         if (!dateRecordDay.containsAll(criticallyDay)) {

+ 8 - 4
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0700.java

@@ -1,8 +1,6 @@
 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.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
@@ -29,11 +27,17 @@ public class THR0700 extends QCCatalogue {
             }
             ThreeLevelWardDoc lastWardDoc = allDoctorWradDocs.get(allDoctorWradDocs.size() - 1);
             Map<String, String> structureMap = lastWardDoc.getStructureMap();
+            String recordTitle = structureMap.get("查房标题");
             String conditionRecord = structureMap.get("病情记录");
-            if (StringUtil.isBlank(conditionRecord)) {
+            if (StringUtil.isBlank(recordTitle) || StringUtil.isBlank(conditionRecord)) {
+                status.set("0");
                 return;
             }
-            if (conditionRecord.contains("上级医师")) {
+            if (recordTitle.contains("主治")
+                    || recordTitle.contains("主任")
+                    || recordTitle.contains("主刀")) {
+                status.set("0");
+            } else if (conditionRecord.contains("上级医师")) {
                 status.set("0");
             }
         }

+ 48 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0725.java

@@ -0,0 +1,48 @@
+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.RescueDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : THR0725
+ * @Description : 抢救记录未在抢救开始后6小时内完成
+ * @Author : 胡敬
+ * @Date: 2020-04-29 11:42
+ */
+@Component
+public class THR0725 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<RescueDoc> rescueDocs = inputInfo.getRescueDocs();
+        if (ListUtil.isEmpty(rescueDocs)) {
+            return;
+        }
+        for (RescueDoc rescueDoc : rescueDocs) {
+            Map<String, String> rescueStructureMap = rescueDoc.getStructureMap();
+            String rescueTime = rescueStructureMap.get("抢救时间");
+            String recordTime = rescueStructureMap.get("记录日期");
+            if (StringUtil.isBlank(rescueTime) || StringUtil.isBlank(recordTime)) {
+                continue;
+            }
+            Date rescueTimeDate = StringUtil.parseDateTime(rescueTime);
+            Date recordTimeDate = StringUtil.parseDateTime(recordTime);
+            if (rescueTimeDate == null || recordTimeDate == null) {
+                continue;
+            }
+            if (CatalogueUtil.compareTime(rescueTimeDate, recordTimeDate, 6 * 60L)) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 2 - 2
kernel/src/main/resources/application.yml

@@ -28,10 +28,10 @@ qc:
   hospital_id: 3
 
 CRF:
-  url: http://192.168.2.234:3456/api/mr_info_ex/entity_predict
+  url: http://192.168.3.150:3456/api/mr_info_ex/entity_predict
 
 Similarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
+  url: http://192.168.3.150:3456/api/mr_info_ex/similarity
 
 
 logging:          # 日志

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

@@ -251,6 +251,7 @@ public class Content {
 
     public static String[] dateFormats = {
             "yyyy年MM月dd日HH时mm分",
+            "yyyy年MM月dd日HH:mm",
             "yyyy年MM月dd日H时mm分",
             "yyyy年MM月dd日HH时m分",
             "yyyy年MM月dd日H时m分",
@@ -306,5 +307,6 @@ public class Content {
             "yyyy.MM.dd",
             "yyyy-MM-ddHH:mm:ss.000",
             "yyyyMMddHH:mm",
+            "yyyy-MM-dd'T'HH:mm:ss",
     };
 }

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

@@ -35,7 +35,7 @@ public class InputInfo {
     //手术
     private List<OperationDoc> operationDocs = new ArrayList<>();
     //转科记录
-    private List<TransferRecordDoc> transferRecordDocs = new ArrayList<>();
+    private TransferRecordDoc transferRecordDocs;
     //入院记录
     private BeHospitalizedDoc beHospitalizedDoc;
     //输血/血制品病程记录

+ 8 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/NoticeOfConversationDoc.java

@@ -1,9 +1,17 @@
 package com.lantone.qc.pub.model.doc;
 
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
 /**
  * @Description: 谈话告知书
  * @author: wangyu
  * @time: 2020/4/20 18:18
  */
+@Getter
+@Setter
 public class NoticeOfConversationDoc extends ModelDoc {
+    public List<String> allNoticeOfConverstartion;//所有的告知书
 }

+ 11 - 3
public/src/main/java/com/lantone/qc/pub/model/doc/transferrecord/TransferRecordDoc.java

@@ -1,8 +1,12 @@
 package com.lantone.qc.pub.model.doc.transferrecord;
 
+import com.lantone.qc.pub.model.doc.ModelDoc;
 import lombok.Getter;
 import lombok.Setter;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * @Description: 转科记录
  * @author: rengb
@@ -10,10 +14,14 @@ import lombok.Setter;
  */
 @Getter
 @Setter
-public class TransferRecordDoc {
+public class TransferRecordDoc extends ModelDoc {
 
     private String transferRecordName;
-    private TransferIntoDoc transferIntoDoc;
-    private TransferOutDoc transferOutDoc;
+    //所有转科记录
+    private List<TransferRecordDoc> allTransferDocs = new ArrayList<>();
+    //所有转入记录
+    private List<TransferIntoDoc> transferIntoDocs = new ArrayList<>();
+    //所有转出记录
+    private List<TransferOutDoc> transferOutDocs = new ArrayList<>();
 
 }

+ 40 - 0
trans/src/main/java/com/lantone/qc/trans/changx/ChangxAnesthesiaRelatedDocTrans.java

@@ -0,0 +1,40 @@
+package com.lantone.qc.trans.changx;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.AnesthesiaRelatedDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author: HUJING
+ * @Date: 2020/5/11 16:23
+ */
+public class ChangxAnesthesiaRelatedDocTrans extends ModelDocTrans {
+    @Override
+    public List<AnesthesiaRelatedDoc> extract(MedrecVo medrecVo) {
+        List<AnesthesiaRelatedDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getAnesthesiaRelatedDoc((Map) FastJsonUtils.getJsonToMap(content)));
+        });
+        return retList;
+    }
+
+    private AnesthesiaRelatedDoc getAnesthesiaRelatedDoc(Map<String, String> content) {
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(content, keyContrasts);
+        AnesthesiaRelatedDoc anesthesiaRelatedDoc = new AnesthesiaRelatedDoc();
+        anesthesiaRelatedDoc.setStructureMap(structureMap);
+        anesthesiaRelatedDoc.setPageData((Map) content);
+        return anesthesiaRelatedDoc;
+    }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "组织手术名称=手术名称"
+    );
+}

+ 2 - 1
trans/src/main/java/com/lantone/qc/trans/changx/ChangxBeHospitalizedDocTrans.java

@@ -125,7 +125,8 @@ public class ChangxBeHospitalizedDocTrans extends ModelDocTrans {
             "++++无需VTE预防=",
             "其他++++抗凝药物禁忌其他=",
             "++++物理预防复选框=",
-            "其他++++物理预防其他="
+            "其他++++物理预防其他=",
+            "职业++++首页职业新=职业"
     );
 
 }

+ 65 - 0
trans/src/main/java/com/lantone/qc/trans/changx/ChangxClinicBloodEffectDocTrans.java

@@ -0,0 +1,65 @@
+package com.lantone.qc.trans.changx;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.ClinicBloodEffectDoc;
+import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
+import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.changx.util.CxXmlUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import com.lantone.qc.trans.comsis.Preproc;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 王宇
+ * @create 2020-04-30 12:39
+ * @desc 输血后效果评价
+ **/
+public class ChangxClinicBloodEffectDocTrans extends ModelDocTrans {
+    @Override
+    public List<ClinicBloodEffectDoc> extract(MedrecVo medrecVo) {
+        List<ClinicBloodEffectDoc> retList = Lists.newArrayList();
+        List<String> contents = (List) medrecVo.getContent().get("content");
+        contents.forEach(content -> {
+            retList.add(getClinicalBloodDoc(content));
+        });
+        return retList;
+    }
+    private ClinicBloodEffectDoc getClinicalBloodDoc(String content) {
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent/Region", content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+
+        String text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent/Region/Content_Text");
+        if (StringUtil.isBlank(text)) {
+            text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent/Region");
+        }
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, sourceTitles, text);
+        cutWordMap.putAll(structureMap);
+
+
+        ClinicBloodEffectDoc clinicBloodEffectDoc = ModelDocGenerate.clinicBloodEffectDoc(cutWordMap);
+        clinicBloodEffectDoc.setText(text);
+        clinicBloodEffectDoc.setPageData((Map) xmlNodeValueMap);
+
+        return clinicBloodEffectDoc;
+    }
+
+    private List<String> sourceTitles = Lists.newArrayList(
+            "输注时间",
+            "输注后效果评价",
+            "记录医师",
+            "记录时间"
+    );
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "记录日期=记录时间",
+            "签名++++=记录医师",
+            "签名时间=",
+            "输血效果评价=输注后效果评价"
+    );
+}

+ 16 - 27
trans/src/main/java/com/lantone/qc/trans/changx/ChangxConsultationDocTrans.java

@@ -98,12 +98,15 @@ public class ChangxConsultationDocTrans extends ModelDocTrans {
         return consultationRecordDoc;
     }
 
-    private List<String> consultationRecord_sourceTitles = Lists.newArrayList();
+    private List<String> consultationRecord_sourceTitles = Lists.newArrayList(
+            "医师签名"
+    );
 
     private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
             "执行情况=会诊情况",
-            "记录日期=记录时间",
-            "签名++++=签名"
+            "记录日期=会诊申请日期",
+            "签名++++=签名",
+            "医师签名=签名"
     );
 
 
@@ -129,33 +132,19 @@ public class ChangxConsultationDocTrans extends ModelDocTrans {
     }
 
     private ConsultationResultsDoc getConsultationResultsDoc(String content) {
-        Map<String, String> pageData = Preproc.extract_doc_pub(true, consultationResults_pageDataTitles, content);
-        pageData.put("病程记录内容",
-                pageData.get("病程记录内容")
-                        .replace(pageData.get("病程记录时间"), "")
-                        .replace(pageData.get("病程记录名称"), "")
-        );
-
-        List<String> targetTitles = Lists.newArrayList();
-        consultationResults_sourceTitles.forEach(sourceTitle -> {
-            String targetTitle = "";
-            for (int index = 0; index < sourceTitle.length(); index++) {
-                if (index == sourceTitle.length() - 1) {
-                    targetTitle += sourceTitle.substring(index, index + 1);
-                } else {
-                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
-                }
-            }
-            targetTitles.add(targetTitle);
-        });
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent", content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, consultationApplication_keyContrasts);
 
-        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
-        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+        String text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent/Content_Text");
+        if (StringUtil.isBlank(text)) {
+            text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent");
+        }
+        Map<String, String> cutWordMap = Preproc.getCutWordMap(true, consultationApplication_sourceTitles, text);
+        cutWordMap.putAll(structureMap);
 
-        ConsultationResultsDoc consultationResultsDoc = ModelDocGenerate.consultationResultsDocGen(sourceMap);
+        ConsultationResultsDoc consultationResultsDoc = ModelDocGenerate.consultationResultsDocGen(cutWordMap);
         consultationResultsDoc.setText(content);
-        consultationResultsDoc.setPageData((Map) pageData);
-
+        consultationResultsDoc.setPageData((Map) xmlNodeValueMap);
         return consultationResultsDoc;
     }
 

+ 13 - 5
trans/src/main/java/com/lantone/qc/trans/changx/ChangxDocTrans.java

@@ -21,7 +21,7 @@ public class ChangxDocTrans extends DocTrans {
     protected InputInfo extract(QueryVo queryVo) {
         InputInfo inputInfo = new InputInfo();
         for (MedrecVo i : queryVo.getMedrec()) {
-            if (i.getTitle().equals("会诊")) {
+             if (i.getTitle().equals("会诊")) {
                 ChangxConsultationDocTrans consultationDocTrans = new ChangxConsultationDocTrans();
                 inputInfo.setConsultationDocs(consultationDocTrans.extract(i));
             }
@@ -29,10 +29,10 @@ public class ChangxDocTrans extends DocTrans {
                 ChangxOperationDocTrans operationDocTrans = new ChangxOperationDocTrans();
                 inputInfo.setOperationDocs(operationDocTrans.extract(i));
             }
-            //            if (i.getTitle().equals("转科记录")) {
-            //                ChangxTransferRecordDocTrans transferRecordDocTrans = new ChangxTransferRecordDocTrans();
-            //                inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
-            //            }
+            if (i.getTitle().equals("转科")) {
+                ChangxTransferRecordDocTrans transferRecordDocTrans = new ChangxTransferRecordDocTrans();
+                inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
+            }
             if (i.getTitle().equals("入院记录")) {
                 ChangxBeHospitalizedDocTrans beHospitalizedDocTrans = new ChangxBeHospitalizedDocTrans();
                 inputInfo.setBeHospitalizedDoc(beHospitalizedDocTrans.extract(i));
@@ -41,6 +41,10 @@ public class ChangxDocTrans extends DocTrans {
                 ChangxClinicalBloodDocTrans clinicalBloodDocTrans = new ChangxClinicalBloodDocTrans();
                 inputInfo.setClinicalBloodDocs(clinicalBloodDocTrans.extract(i));
             }
+            if (i.getTitle().equals("输血后效果评价")) {
+                ChangxClinicBloodEffectDocTrans changxClinicBloodEffectDocTrans = new ChangxClinicBloodEffectDocTrans();
+                inputInfo.setClinicBloodEffectDocs(changxClinicBloodEffectDocTrans.extract(i));
+            }
             if (i.getTitle().equals("危急值记录")) {
                 ChangxCrisisValueReportDocTrans crisisValueReportDocTrans = new ChangxCrisisValueReportDocTrans();
                 inputInfo.setCrisisValueReportDocs(crisisValueReportDocTrans.extract(i));
@@ -65,6 +69,10 @@ public class ChangxDocTrans extends DocTrans {
                 ChangxDoctorAdviceDocTrans doctorAdviceDocTrans = new ChangxDoctorAdviceDocTrans();
                 inputInfo.setDoctorAdviceDocs(doctorAdviceDocTrans.extract(i));
             }
+            if (i.getTitle().equals("手术麻醉信息")) {
+                ChangxAnesthesiaRelatedDocTrans changxAnesthesiaRelatedDocTrans = new ChangxAnesthesiaRelatedDocTrans();
+                inputInfo.setAnesthesiaRelatedDocs(changxAnesthesiaRelatedDocTrans.extract(i));
+            }
             //            if (i.getTitle().equals("值班交接制度")) {
             //                ChangxDutyShiftSystemDocTrans dutyShiftSystemDocTrans = new ChangxDutyShiftSystemDocTrans();
             //                inputInfo.setDutyShiftSystemDocs(dutyShiftSystemDocTrans.extract(i));

+ 5 - 0
trans/src/main/java/com/lantone/qc/trans/changx/ChangxNoticeOfConversationDocTrans.java

@@ -4,6 +4,9 @@ import com.lantone.qc.pub.model.doc.NoticeOfConversationDoc;
 import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.trans.ModelDocTrans;
 
+import java.util.List;
+import java.util.Map;
+
 /**
  * @Description: 谈话告知书
  * @author: wangyu
@@ -13,6 +16,8 @@ public class ChangxNoticeOfConversationDocTrans extends ModelDocTrans {
     @Override
     public NoticeOfConversationDoc extract(MedrecVo medrecVo) {
         NoticeOfConversationDoc noticeOfConversationDoc = new NoticeOfConversationDoc();
+        List<String> noticeofConverstartons = (List<String>) medrecVo.getContent().get("content");
+        noticeOfConversationDoc.setAllNoticeOfConverstartion(noticeofConverstartons);
         return noticeOfConversationDoc;
     }
 }

+ 9 - 2
trans/src/main/java/com/lantone/qc/trans/changx/ChangxOperationDocTrans.java

@@ -273,6 +273,12 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
         if (StringUtil.isNotBlank(structureMap.get("签名"))) {
             structureMap.put("记录医师", structureMap.get("签名"));
         }
+        if (StringUtil.isNotBlank(structureMap.get("拟行治疗指征及禁忌症"))) {
+            structureMap.put("拟行术式", structureMap.get("拟行治疗指征及禁忌症"));
+        } else if (StringUtil.isNotBlank(structureMap.get("拟施手术方式"))){
+            structureMap.put("拟行术式", structureMap.get("拟施手术方式"));
+        }
+
 
         String text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent/Region/Content_Text");
         if (StringUtil.isBlank(text)) {
@@ -305,7 +311,8 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
             "术前准备内容",
             "术前术后注意事项",
             "可能意外和防范措施",
-            "拟行术式"
+            "拟行术式",
+            "拟施手术方式、名称及可能的变更与禁忌征"
     );
 
     private List<String> preoperativeDiscussion_keyContrasts = Lists.newArrayList(
@@ -421,7 +428,7 @@ public class ChangxOperationDocTrans extends ModelDocTrans {
 
     private OperationSafetyChecklistDoc getOperationSafetyChecklistDoc(String content) {
         Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent", content);
-        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, operationSafetyChecklist_keyContrasts);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap,    operationSafetyChecklist_keyContrasts);
 
         String text = CxXmlUtil.getTextByNodePath(content, "//DocObjContent/Content_Text");
         if (StringUtil.isBlank(text)) {

+ 133 - 94
trans/src/main/java/com/lantone/qc/trans/changx/ChangxTransferRecordDocTrans.java

@@ -2,7 +2,6 @@ package com.lantone.qc.trans.changx;
 
 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.transferrecord.TransferIntoDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
@@ -10,12 +9,17 @@ import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.changx.util.CxXmlUtil;
 import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
 import com.lantone.qc.trans.comsis.Preproc;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.TreeMap;
 
 /**
  * @Description: 转科记录文档生成
@@ -25,30 +29,88 @@ import java.util.Set;
 public class ChangxTransferRecordDocTrans extends ModelDocTrans {
 
     @Override
-    public List<TransferRecordDoc> extract(MedrecVo medrecVo) {
-        List<TransferRecordDoc> retList = Lists.newArrayList();
+    public TransferRecordDoc extract(MedrecVo medrecVo) {
+        TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
 
         Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
         if (contentMap == null) {
-            return retList;
+            return transferRecordDoc;
         }
-
-        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(contentMap.get("转入"));
-        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(contentMap.get("转出"));
-
-        Set<String> transferRecordNameSet = Sets.newHashSet();
-        transferRecordNameSet.addAll(transferIntoDocMap.keySet());
-        transferRecordNameSet.addAll(transferOutDocMap.keySet());
-
-        transferRecordNameSet.forEach(transferRecordName -> {
-            TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
-            transferRecordDoc.setTransferRecordName(transferRecordName);
-            transferRecordDoc.setTransferIntoDoc(transferIntoDocMap.get(transferRecordName));
-            transferRecordDoc.setTransferOutDoc(transferOutDocMap.get(transferRecordName));
-            retList.add(transferRecordDoc);
+        List<String> into = contentMap.get("转入记录");
+        List<String> out = contentMap.get("转出记录");
+        List<String> all = new ArrayList<>();
+        all.addAll(into);
+        all.addAll(out);
+        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(into);
+        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(out);
+        Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
+
+        //转入
+        Map<Date, TransferIntoDoc> dateRecordIn = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
+            Map<String, String> structureMap = transferIntoDoc.getStructureMap();
+            String inDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(inDateStr)) {
+                continue;
+            }
+            Date inDate = StringUtil.parseDateTime(inDateStr);
+            if (inDate == null) {
+                continue;
+            }
+            dateRecordIn.put(inDate, transferIntoDoc);
+        }
+        transferRecordDoc.setTransferIntoDocs(new ArrayList<>(dateRecordIn.values()));
+        //转出
+        Map<Date, TransferOutDoc> dateRecordOut = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
+            Map<String, String> structureMap = transferOutDoc.getStructureMap();
+            String outDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(outDateStr)) {
+                continue;
+            }
+            Date outDate = StringUtil.parseDateTime(outDateStr);
+            if (outDate == null) {
+                continue;
+            }
+            dateRecordOut.put(outDate, transferOutDoc);
+        }
+        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
         });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                continue;
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
 
-        return retList;
+        return transferRecordDoc;
     }
 
 
@@ -74,49 +136,48 @@ public class ChangxTransferRecordDocTrans extends ModelDocTrans {
     }
 
     private TransferIntoDoc getTransferIntoDoc(String content) {
-        Map<String, String> pageData = Preproc.extract_doc_pub(true, transferInto_pageDataTitles, content);
-        pageData.put("病程记录内容",
-                pageData.get("病程记录内容")
-                        .replace(pageData.get("病程记录时间"), "")
-                        .replace(pageData.get("病程记录名称"), "")
-        );
-
-        List<String> targetTitles = Lists.newArrayList();
-        transferInto_sourceTitles.forEach(sourceTitle -> {
-            String targetTitle = "";
-            for (int index = 0; index < sourceTitle.length(); index++) {
-                if (index == sourceTitle.length() - 1) {
-                    targetTitle += sourceTitle.substring(index, index + 1);
-                } else {
-                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
-                }
-            }
-            targetTitles.add(targetTitle);
-        });
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent//Region", content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
 
-        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
-        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
-
-        TransferIntoDoc transferIntoDoc = ModelDocGenerate.transferIntoDocGen(sourceMap);
+//        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
+        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
         transferIntoDoc.setText(content);
-        transferIntoDoc.setPageData((Map) pageData);
+        transferIntoDoc.setStructureMap(structureMap);
+        transferIntoDoc.setPageData((Map)xmlNodeValueMap);
 
         return transferIntoDoc;
     }
 
-    private List<String> transferInto_pageDataTitles = Lists.newArrayList(
-            "病程记录时间",
-            "病程记录名称",
-            "病程记录内容",
-            "记录医师"
-    );
-    private List<String> transferInto_sourceTitles = Lists.newArrayList(
-            "病程记录时间",
-            "病程记录名称",
-            "病程记录内容",
-            "记录时间",
-            "记录医师"
-    );
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<String> contents) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contents)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (String content : contents) {
+            if (StringUtil.isBlank(content)) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferRecordDoc transferRecordDoc = getTransferAllDoc(content);
+            transferRecordDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(String content) {
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent//Region", content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
+        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+        transferAllDoc.setText(content);
+        transferAllDoc.setStructureMap(structureMap);
+        transferAllDoc.setPageData((Map) xmlNodeValueMap);
+        return transferAllDoc;
+    }
 
 
     /**************************************************转出*******************************************************/
@@ -141,48 +202,26 @@ public class ChangxTransferRecordDocTrans extends ModelDocTrans {
     }
 
     private TransferOutDoc getTransferOutDoc(String content) {
-        Map<String, String> pageData = Preproc.extract_doc_pub(true, transferOut_pageDataTitles, content);
-        pageData.put("病程记录内容",
-                pageData.get("病程记录内容")
-                        .replace(pageData.get("病程记录时间"), "")
-                        .replace(pageData.get("病程记录名称"), "")
-        );
-
-        List<String> targetTitles = Lists.newArrayList();
-        transferOut_sourceTitles.forEach(sourceTitle -> {
-            String targetTitle = "";
-            for (int index = 0; index < sourceTitle.length(); index++) {
-                if (index == sourceTitle.length() - 1) {
-                    targetTitle += sourceTitle.substring(index, index + 1);
-                } else {
-                    targetTitle += sourceTitle.substring(index, index + 1) + "[\\s\\p{Zs}]*";
-                }
-            }
-            targetTitles.add(targetTitle);
-        });
+        Map<String, String> xmlNodeValueMap = CxXmlUtil.firstLevelNodeValue("//DocObjContent//Region", content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(xmlNodeValueMap, keyContrasts);
 
-        Map<String, String> sourceMap = Preproc.extract_doc_pub(true, targetTitles, content);
-        sourceMap.put("记录时间", sourceMap.get("病程记录时间"));
-
-        TransferOutDoc transferOutDoc = ModelDocGenerate.transferOutDocGen(sourceMap);
+        TransferOutDoc transferOutDoc = new TransferOutDoc();
         transferOutDoc.setText(content);
-        transferOutDoc.setPageData((Map) pageData);
+        transferOutDoc.setStructureMap(structureMap);
+        transferOutDoc.setPageData((Map) xmlNodeValueMap);
 
         return transferOutDoc;
     }
 
-    private List<String> transferOut_pageDataTitles = Lists.newArrayList(
-            "病程记录时间",
-            "病程记录名称",
-            "病程记录内容",
-            "记录医师"
-    );
-    private List<String> transferOut_sourceTitles = Lists.newArrayList(
-            "病程记录时间",
-            "病程记录名称",
-            "病程记录内容",
-            "记录时间",
-            "记录医师"
+    private List<String> keyContrasts = Lists.newArrayList(
+            "转出日期=转科日期",
+            "转入日期=转科日期",
+            "转出日期=转科日期",
+            "姓名++++患者姓名=姓名",
+            "签名++++=医师签名",
+            "++++入院日期=入院日期",
+            "入院诊断++++初步诊断=初步诊断",
+            "转入目的++++目的=转入目的",
+            "转出目的++++目的=转出目的"
     );
-
 }

+ 24 - 42
trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java

@@ -1,21 +1,6 @@
 package com.lantone.qc.trans.comsis;
 
-import com.lantone.qc.pub.model.doc.BeHospitalizedDoc;
-import com.lantone.qc.pub.model.doc.ClinicalBloodDoc;
-import com.lantone.qc.pub.model.doc.CrisisValueReportDoc;
-import com.lantone.qc.pub.model.doc.CriticallyIllNoticeDoc;
-import com.lantone.qc.pub.model.doc.DeathCaseDiscussDoc;
-import com.lantone.qc.pub.model.doc.DeathRecordDoc;
-import com.lantone.qc.pub.model.doc.DifficultCaseDiscussDoc;
-import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
-import com.lantone.qc.pub.model.doc.DutyShiftSystemDoc;
-import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
-import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
-import com.lantone.qc.pub.model.doc.NursingSystemDoc;
-import com.lantone.qc.pub.model.doc.RescueDoc;
-import com.lantone.qc.pub.model.doc.SeriouslyIllNoticeDoc;
-import com.lantone.qc.pub.model.doc.StagesSummaryDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.*;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationApplicationDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationRecordDoc;
 import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
@@ -26,6 +11,7 @@ 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.transferrecord.TransferIntoDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
+import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
 import com.lantone.qc.pub.model.label.CaseCharacteristicLabel;
 import com.lantone.qc.pub.model.label.ChiefLabel;
 import com.lantone.qc.pub.model.label.DiagLabel;
@@ -148,30 +134,6 @@ public class ModelDocGenerate {
         return operationSafetyChecklistDoc;
     }
 
-    /**
-     * 转科记录-转入
-     *
-     * @param structureMap
-     * @return
-     */
-    public static TransferIntoDoc transferIntoDocGen(Map<String, String> structureMap) {
-        TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
-        transferIntoDoc.setStructureMap(structureMap);
-        return transferIntoDoc;
-    }
-
-    /**
-     * 转科记录-转出
-     *
-     * @param structureMap
-     * @return
-     */
-    public static TransferOutDoc transferOutDocGen(Map<String, String> structureMap) {
-        TransferOutDoc transferOutDoc = new TransferOutDoc();
-        transferOutDoc.setStructureMap(structureMap);
-        return transferOutDoc;
-    }
-
     /**
      * 入院记录
      *
@@ -203,13 +165,20 @@ public class ModelDocGenerate {
 
         MaritalLabel maritalLabel = new MaritalLabel();
         if (structureMap.get("婚育史") != null) {
-            maritalLabel.setText("婚育史: " + structureMap.get("婚育史"));
+            maritalLabel.setText("婚育史" + structureMap.get("婚育史"));
         }
         beHospitalizedDoc.setMaritalLabel(maritalLabel);
         structureMap.remove("婚育史");
 
         MenstrualLabel menstrualLabel = new MenstrualLabel();
-        menstrualLabel.setText("月经史:" + structureMap.get("月经史"));
+        if(structureMap != null && structureMap.get("月经史") != null){
+            if(structureMap.get("月经史").contains("月 经 史")){
+                String text = structureMap.get("月经史");
+                structureMap.put("月经史",text.replace("月 经 史","").replace(":","").replace(":",""));
+            }
+
+        }
+        menstrualLabel.setText("月经史:" + structureMap.get("月经史"));
         beHospitalizedDoc.setMenstrualLabel(menstrualLabel);
         structureMap.remove("月经史");
 
@@ -265,6 +234,19 @@ public class ModelDocGenerate {
         return clinicalBloodDoc;
     }
 
+    /**
+     * 输血后效果评价
+     *
+     * @param structureMap
+     * @return
+     */
+    public static ClinicBloodEffectDoc clinicBloodEffectDoc(Map<String, String> structureMap) {
+        ClinicBloodEffectDoc clinicBloodEffectDoc = new ClinicBloodEffectDoc();
+        clinicBloodEffectDoc.setStructureMap(structureMap);
+        return clinicBloodEffectDoc;
+    }
+
+
     /**
      * 危急值记录
      *

+ 120 - 24
trans/src/main/java/com/lantone/qc/trans/taizhou/TaiZhouTransferRecordDocTrans.java

@@ -2,7 +2,6 @@ package com.lantone.qc.trans.taizhou;
 
 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.transferrecord.TransferIntoDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferOutDoc;
 import com.lantone.qc.pub.model.doc.transferrecord.TransferRecordDoc;
@@ -13,9 +12,12 @@ import com.lantone.qc.trans.ModelDocTrans;
 import com.lantone.qc.trans.comsis.OrdinaryAssistant;
 import com.lantone.qc.trans.taizhou.util.TzXmlUtil;
 
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
+import java.util.TreeMap;
 
 /**
  * @Description: 转科记录文档生成
@@ -24,31 +26,88 @@ import java.util.Set;
  */
 public class TaiZhouTransferRecordDocTrans extends ModelDocTrans {
 
-    @Override
-    public List<TransferRecordDoc> extract(MedrecVo medrecVo) {
-        List<TransferRecordDoc> retList = Lists.newArrayList();
+    public TransferRecordDoc extract(MedrecVo medrecVo) {
+        TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
 
         Map<String, List<String>> contentMap = (Map) medrecVo.getContent().get("content");
         if (contentMap == null) {
-            return retList;
+            return transferRecordDoc;
         }
-
-        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(contentMap.get("转入"));
-        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(contentMap.get("转出"));
-
-        Set<String> transferRecordNameSet = Sets.newHashSet();
-        transferRecordNameSet.addAll(transferIntoDocMap.keySet());
-        transferRecordNameSet.addAll(transferOutDocMap.keySet());
-
-        transferRecordNameSet.forEach(transferRecordName -> {
-            TransferRecordDoc transferRecordDoc = new TransferRecordDoc();
-            transferRecordDoc.setTransferRecordName(transferRecordName);
-            transferRecordDoc.setTransferIntoDoc(transferIntoDocMap.get(transferRecordName));
-            transferRecordDoc.setTransferOutDoc(transferOutDocMap.get(transferRecordName));
-            retList.add(transferRecordDoc);
+        List<String> into = contentMap.get("转入记录");
+        List<String> out = contentMap.get("转出记录");
+        List<String> all = new ArrayList<>();
+        all.addAll(into);
+        all.addAll(out);
+        Map<String, TransferIntoDoc> transferIntoDocMap = getTransferIntoDocMap(into);
+        Map<String, TransferOutDoc> transferOutDocMap = getTransferOutDocMap(out);
+        Map<String, TransferRecordDoc> transferAllDocMap = getTransferAllDocMap(all);
+
+        //转入
+        Map<Date, TransferIntoDoc> dateRecordIn = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
         });
+        for (TransferIntoDoc transferIntoDoc : transferIntoDocMap.values()) {
+            Map<String, String> structureMap = transferIntoDoc.getStructureMap();
+            String inDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(inDateStr)) {
+                continue;
+            }
+            Date inDate = StringUtil.parseDateTime(inDateStr);
+            if (inDate == null) {
+                continue;
+            }
+            dateRecordIn.put(inDate, transferIntoDoc);
+        }
+        transferRecordDoc.setTransferIntoDocs(new ArrayList<>(dateRecordIn.values()));
+        //转出
+        Map<Date, TransferOutDoc> dateRecordOut = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferOutDoc transferOutDoc : transferOutDocMap.values()) {
+            Map<String, String> structureMap = transferOutDoc.getStructureMap();
+            String outDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(outDateStr)) {
+                continue;
+            }
+            Date outDate = StringUtil.parseDateTime(outDateStr);
+            if (outDate == null) {
+                continue;
+            }
+            dateRecordOut.put(outDate, transferOutDoc);
+        }
+        transferRecordDoc.setTransferOutDocs(new ArrayList<>(dateRecordOut.values()));
+
+        //全部转科记录
+        Map<Date, TransferRecordDoc> dateRecordAll = new TreeMap<>(new Comparator<Date>() {
+            @Override
+            public int compare(Date o1, Date o2) {
+                // 升序排列
+                return o1.compareTo(o2);
+            }
+        });
+        for (TransferRecordDoc transferRecordAllDoc : transferAllDocMap.values()) {
+            Map<String, String> structureMap = transferRecordAllDoc.getStructureMap();
+            String transferDateStr = structureMap.get("转科日期");
+            if (StringUtil.isBlank(transferDateStr)) {
+                continue;
+            }
+            Date transferDate = StringUtil.parseDateTime(transferDateStr);
+            if (transferDate == null) {
+                continue;
+            }
+            dateRecordAll.put(transferDate, transferRecordAllDoc);
+        }
+        transferRecordDoc.setAllTransferDocs(new ArrayList<>(dateRecordAll.values()));
 
-        return retList;
+        return transferRecordDoc;
     }
 
 
@@ -74,17 +133,49 @@ public class TaiZhouTransferRecordDocTrans extends ModelDocTrans {
     }
 
     private TransferIntoDoc getTransferIntoDoc(String content) {
+        Map<String, String> sourceMap = TzXmlUtil.getXmlToMapForTZ(content);
         Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(TzXmlUtil.getXmlToMapForTZ(content), transferInto_keyContrasts);
 
         TransferIntoDoc transferIntoDoc = new TransferIntoDoc();
+        transferIntoDoc.setText(content);
         transferIntoDoc.setStructureMap(structureMap);
-        transferIntoDoc.setPageData((Map) structureMap);
+        transferIntoDoc.setPageData((Map) sourceMap);
 
         return transferIntoDoc;
     }
 
     private List<String> transferInto_keyContrasts = Lists.newArrayList();
 
+    /**************************************************全部*******************************************************/
+    private Map<String, TransferRecordDoc> getTransferAllDocMap(List<String> contents) {
+        Map<String, TransferRecordDoc> retMap = Maps.newHashMap();
+        if (ListUtil.isEmpty(contents)) {
+            return retMap;
+        }
+        int index = 1;
+        String transferRecordName = null;
+        for (String content : contents) {
+            if (StringUtil.isBlank(content)) {
+                continue;
+            }
+            transferRecordName = index + "";
+            TransferRecordDoc transferRecordDoc = getTransferAllDoc(content);
+            transferRecordDoc.setTransferRecordName(transferRecordName);
+            retMap.put(transferRecordName, transferRecordDoc);
+            index++;
+        }
+        return retMap;
+    }
+
+    private TransferRecordDoc getTransferAllDoc(String content) {
+        Map<String, String> sourceMap = TzXmlUtil.getXmlToMapForTZ(content);
+        Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(TzXmlUtil.getXmlToMapForTZ(content), transferInto_keyContrasts);
+        TransferRecordDoc transferAllDoc = new TransferRecordDoc();
+        transferAllDoc.setText(content);
+        transferAllDoc.setStructureMap(structureMap);
+        transferAllDoc.setPageData((Map) sourceMap);
+        return transferAllDoc;
+    }
 
     /**************************************************转出*******************************************************/
     private Map<String, TransferOutDoc> getTransferOutDocMap(List<String> contents) {
@@ -108,15 +199,20 @@ public class TaiZhouTransferRecordDocTrans extends ModelDocTrans {
     }
 
     private TransferOutDoc getTransferOutDoc(String content) {
+        Map<String, String> sourceMap = TzXmlUtil.getXmlToMapForTZ(content);
         Map<String, String> structureMap = OrdinaryAssistant.mapKeyContrast(TzXmlUtil.getXmlToMapForTZ(content), transferOut_keyContrasts);
 
         TransferOutDoc transferOutDoc = new TransferOutDoc();
+        transferOutDoc.setText(content);
         transferOutDoc.setStructureMap(structureMap);
-        transferOutDoc.setPageData((Map) structureMap);
+        transferOutDoc.setPageData((Map) sourceMap);
 
         return transferOutDoc;
     }
 
-    private List<String> transferOut_keyContrasts = Lists.newArrayList();
+    private List<String> transferOut_keyContrasts = Lists.newArrayList(
+            "书写日期=记录日期",
+            "本人姓名=姓名"
+    );
 
 }

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/taizhou/TaizhouDocTrans.java

@@ -34,9 +34,9 @@ public class TaizhouDocTrans extends DocTrans {
                     TaiZhouOperationDocTrans operationDocTrans = new TaiZhouOperationDocTrans();
                     inputInfo.setOperationDocs(operationDocTrans.extract(i));
                     break;
-                case "转科记录":
+                case "转科":
                     TaiZhouTransferRecordDocTrans transferRecordDocTrans = new TaiZhouTransferRecordDocTrans();
-                    /*inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));*/
+                    inputInfo.setTransferRecordDocs(transferRecordDocTrans.extract(i));
                     break;
                 case "入院记录":
                     TaiZhouBeHospitalizedDocTrans beHospitalizedDocTrans = new TaiZhouBeHospitalizedDocTrans();