Prechádzať zdrojové kódy

厦门五院分支更新

wangsy 1 rok pred
rodič
commit
834b559b49
56 zmenil súbory, kde vykonal 1201 pridanie a 186 odobranie
  1. 13 14
      dbanaly/src/main/resources/application-debug.yml
  2. 2 1
      kernel/pom.xml
  3. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0009.java
  4. 5 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0022.java
  5. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0024.java
  6. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0025.java
  7. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0028.java
  8. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0030.java
  9. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0043.java
  10. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0046.java
  11. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0047.java
  12. 13 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0079.java
  13. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02902.java
  14. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH02903.java
  15. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0424.java
  16. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0083.java
  17. 39 21
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0181.java
  18. 59 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0199.java
  19. 33 11
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0201.java
  20. 12 6
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0274.java
  21. 35 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0277.java
  22. 53 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0278.java
  23. 52 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0279.java
  24. 66 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0280.java
  25. 44 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0281.java
  26. 94 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0282.java
  27. 77 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0283.java
  28. 46 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0284.java
  29. 55 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0290.java
  30. 8 9
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02904.java
  31. 7 13
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02905.java
  32. 74 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0293.java
  33. 74 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0296.java
  34. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP03179.java
  35. 12 6
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/changshaxy/firstpagerecord/FIRP03241.java
  36. 71 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/firstpagerecord/FIRP0182.java
  37. 53 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/firstpagerecord/FIRP03038.java
  38. 100 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/leavehospital/LEA0149.java
  39. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0134.java
  40. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0139.java
  41. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0144.java
  42. 7 40
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/BeHospitalizedAI.java
  43. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ConsultationAI.java
  44. 5 5
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/FirstCourseRecordAI.java
  45. 3 3
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/LeaveHospitalAI.java
  46. 1 13
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ModelAI.java
  47. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/OperationAI.java
  48. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ThreeLevelWardAI.java
  49. 0 3
      kernel/src/main/java/com/lantone/qc/kernel/util/SimilarityUtil.java
  50. 5 0
      public/src/main/java/com/lantone/qc/pub/Content.java
  51. 0 1
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenBeHospitalizedDocTrans.java
  52. 4 2
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenClinicBloodEffectDocTrans.java
  53. 22 2
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenClinicalBloodDocTrans.java
  54. 5 2
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenConsultationDocTrans.java
  55. 3 1
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenSeriouslyIllNoticeDocTrans.java
  56. 27 2
      trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenThreeLevelWardDocTrans.java

+ 13 - 14
dbanaly/src/main/resources/application-debug.yml

@@ -5,9 +5,9 @@ spring:
     druid:
       lantone:
         driver-class-name: com.mysql.jdbc.Driver
-        url: jdbc:mysql://192.168.2.237:3307/qc_xszyy?useUnicode=true&characterEncoding=utf8&useSSL=false
+        url: jdbc:mysql://192.168.2.31:3306/qc?useUnicode=true&characterEncoding=utf8&useSSL=false
         username: root
-        password: lantone
+        password: dsYun8!@#
         initial-size: 8
         min-idle: 1
         max-active: 20
@@ -24,15 +24,14 @@ spring:
         filters: stat
         connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
         use-global-data-source-stat: true
-
   #redis
   redis:
     database:
-      cache: 10 # cache索引
-      token: 10 # Token索引
-    host: 192.168.2.237  #Redis服务器地址
-    port: 63791 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
-    password: emrais # Redis服务器连接密码(默认为空)
+      cache: 2 # cache索引
+      token: 2 # Token索引
+    host: 192.168.2.31  #Redis服务器地址
+    port: 6379 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
+    password:  # Redis服务器连接密码(默认为空)
     lettuce:
       pool:
         max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
@@ -41,19 +40,19 @@ spring:
         min-idle: 0 # 连接池中的最小空闲连接
     timeout: 20000 # 连接超时时间(毫秒)
 
-xml-is-encryped: false
+xml-is-encryped: true
 
 CRF:
-  url: http://192.168.2.234:3456/api/mr_info_ex/entity_predict
+  url: http://192.168.2.33:3456/api/mr_info_ex/entity_predict
 
 Similarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/similarity
+  url: http://192.168.2.33:3456/api/mr_info_ex/similarity
 
 NewSimilarity:
-  url: http://192.168.2.234:23232/api/similarity
+  url: http://192.168.2.33:23232/api/similarity
 
 NewBatchSimilarity:
-  url: http://192.168.2.234:23232/api/similarity_batch
+  url: http://192.168.2.33:23232/api/similarity_batch
 
 ChiefPresentSimilarity:
-  url: http://192.168.2.234:3456/api/mr_info_ex/chief_present_similarity
+  url: http://192.168.2.33:3456/api/mr_info_ex/chief_present_similarity

+ 2 - 1
kernel/pom.xml

@@ -96,7 +96,8 @@
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
-            <version>5.1.38</version>
+            <version>8.0.33</version>
+<!--            <version>5.1.38</version>-->
         </dependency>
 
         <!--redis设置-->

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

@@ -22,7 +22,7 @@ import java.util.List;
 @Component
 public class BEH0009 extends QCCatalogue {
     private List<String> containList = Arrays.asList("检查", "术后", "药物", "发现", "误服", "确诊", "经", "异常", "诊断"
-            , "示", "超", "伤", "术", "复查", "体检", "血透", "血液透析", "孕", "农药", "呻吟", "颈椎");
+            , "示", "超", "伤", "术", "复查", "体检", "血透", "血液透析", "孕", "农药", "呻吟", "颈椎", "咳", "热");
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         if (inputInfo.getBeHospitalizedDoc() == null) {

+ 5 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0022.java

@@ -30,6 +30,11 @@ public class BEH0022 extends QCCatalogue {
             status.set("0");
             return;
         }
+        String present = inputInfo.getBeHospitalizedDoc().getStructureMap().get("现病史");
+        if(StringUtil.isNotBlank(present) &&("尚可".equals(present) || "一般".equals(present) || "正常".equals(present) || "变化".equals(present))){
+            status.set("0");
+            return;
+        }
         List<GeneralDesc> generals = presentLabel.getGenerals();
         if (generals != null && generals.size() > 0) {
             status.set("0");

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

@@ -48,7 +48,7 @@ public class BEH0024 extends QCCatalogue {
         }
         //硬规则匹配
         String pastLabelText = pastLabel.getText();
-        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见") || pastLabelText.contains("骨折")
+        if (pastLabelText.contains("外伤") || pastLabelText.contains("详见") || pastLabelText.contains("骨折") || pastLabelText.contains("跌倒") || pastLabelText.contains("不详")
                 || pastLabelText.contains("见旧病历") || pastLabelText.contains("见既往病历") || pastLabelText.contains("右根骨手术")) {
             status.set("0");
         }

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

@@ -61,7 +61,7 @@ public class BEH0025 extends QCCatalogue {
         }
         //规则硬匹配
         String pastLabelText = pastLabel.getText();
-        if (pastLabelText.contains("术") || pastLabelText.contains("详见")|| pastLabelText.contains("术史")
+        if (pastLabelText.contains("术") || pastLabelText.contains("详见")|| pastLabelText.contains("行") || pastLabelText.contains("不详")
                 || pastLabelText.contains("见旧病历") || pastLabelText.contains("见既往病历")|| pastLabelText.contains("体外碎石")) {
             status.set("0");
         }

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

@@ -39,7 +39,7 @@ public class BEH0028 extends QCCatalogue {
             return;
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("输血") || pastText.contains("详见")|| pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
+        if (pastText.contains("输血") || pastText.contains("详见")|| pastText.contains("见旧病历") || pastText.contains("见既往病历") || pastText.contains("不详")) {
             status.set("0");
             return;
         }

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

@@ -47,7 +47,7 @@ public class BEH0030 extends QCCatalogue {
             status.set("0");
         }
         String pastText = pastLabel.getText();
-        if (pastText.contains("肝炎") || pastText.contains("传染病") || pastText.contains("结核") || pastText.contains("详见原病历")
+        if (pastText.contains("肝炎") || pastText.contains("传染病") || pastText.contains("结核") || pastText.contains("详见原病历") || pastText.contains("不详")
                 || pastText.contains("见旧病历") || pastText.contains("见既往病历") || pastText.contains("乙肝")) {
             status.set("0");
         }

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

@@ -42,7 +42,7 @@ public class BEH0043 extends QCCatalogue {
             return;
         }
         String text = personalLabel.getText();
-        if (StringUtil.isBlank(text) || text.contains("居住") || text.contains("生长") || text.contains("生活") || text.contains("本地")
+        if (StringUtil.isBlank(text) || text.contains("居住") || text.contains("生长") || text.contains("生活") || text.contains("本地")  || text.contains("不详")
                 || text.contains("详见")|| text.contains("见旧病历") || text.contains("见既往病历")) {
             status.set("0");
             return;

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

@@ -37,7 +37,7 @@ public class BEH0046 extends QCCatalogue {
             return;
         }
         String personalText = personalLabel.getText();
-        if (StringUtil.isBlank(personalText) || personalText.contains("偶有") || personalText.contains("烟")
+        if (StringUtil.isBlank(personalText) || personalText.contains("偶有") || personalText.contains("烟") || personalText.contains("不详")
                 || personalText.contains("详见")) {
             status.set("0");
             return;

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

@@ -36,7 +36,7 @@ public class BEH0047 extends QCCatalogue {
             return;
         }
         String pastText = personalLabel.getText();
-        if (pastText.contains("饮酒") || pastText.contains("详见")|| pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
+        if (pastText.contains("饮酒") || pastText.contains("详见") || pastText.contains("不详") || pastText.contains("见旧病历") || pastText.contains("见既往病历")) {
             status.set("0");
             return;
         }

+ 13 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0079.java

@@ -4,8 +4,11 @@ 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.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Map;
+
 /**
  * @ClassName : BEH0079
  * @Description : 专科检查未填写
@@ -20,6 +23,16 @@ public class BEH0079 extends QCCatalogue {
             status.set("0");
             return;
         }
+        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+        String vitalLabelSpecial = structureMap.get("专科检查");
+        if (StringUtil.isNotBlank(vitalLabelSpecial) && !"。".equals(vitalLabelSpecial)) {
+            status.set("0");
+            return;
+        }
+        if (vitalLabelSpecial.contains("null")) {
+            status.set("0");
+            return;
+        }
         if (inputInfo.getBeHospitalizedDoc().getVitalLabelSpecial() != null) {
             if (!CatalogueUtil.isEmpty(inputInfo.getBeHospitalizedDoc().getVitalLabelSpecial().getText())) {
                 status.set("0");

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

@@ -33,7 +33,7 @@ public class BEH02902 extends QCCatalogue {
         }
 
         if (StringUtil.isNotBlank(pacsText) && (pacsText.contains("缺") || pacsText.contains("暂无")
-                || "无".equals(pacsText) || "无。".equals(pacsText) || "。".equals(pacsText))) {
+                || "无".equals(pacsText) || "无。".equals(pacsText) || "。".equals(pacsText) || "-".equals(pacsText))) {
             status.set("0");
             return;
         }

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

@@ -32,7 +32,7 @@ public class BEH02903 extends QCCatalogue {
         }
 
         if (StringUtil.isNotBlank(pacsText) && (pacsText.contains("缺") || pacsText.contains("暂无")
-                || "无".equals(pacsText) || "无。".equals(pacsText) || "。".equals(pacsText))) {
+                || "无".equals(pacsText) || "无。".equals(pacsText) || "。".equals(pacsText) || "-".equals(pacsText))) {
             status.set("0");
             return;
         }

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

@@ -24,7 +24,7 @@ public class BEH0424 extends QCCatalogue {
         }
         Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
         if(structureMap != null){
-            String phone = structureMap.get("电话");
+            String phone = structureMap.get("联系电话");
             String contactNumber = structureMap.get("联系人电话");
             if(CatalogueUtil.isEmpty(phone) && CatalogueUtil.isEmpty(contactNumber)){
                 status.set("-1");

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0083.java

@@ -22,7 +22,7 @@ public class FIRC0083 extends QCCatalogue {
         }
         double likeRate = firstCourseRecordDoc.getCaseCharacteristicLabel().getLikeRate();
         // 根据医学部要求将相似度阈值提高到85%
-        if (likeRate > 0.95) {
+        if (likeRate > 0.85) {
             status.set("-1");
         }
     }

+ 39 - 21
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0181.java

@@ -1,11 +1,14 @@
 package com.lantone.qc.kernel.catalogue.firstpagerecord;
 
+import com.google.common.collect.Lists;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -19,31 +22,46 @@ import java.util.Map;
  */
 @Component
 public class FIRP0181 extends QCCatalogue {
+    /**
+     * 判断病案首页中是否有出院诊断,1.如果为空不做判断,2.判断出院诊断中诊断类别为01的诊断编码是否为首字母为S或T,不是则跳出
+     * 3.判断损伤、中毒外部原因名称是否填写,未填写则提示缺陷
+     */
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getFirstPageRecordDoc() == null) {
-            return;
-        }
 
-        if (inputInfo.getFirstCourseRecordDoc() == null) {
-            return;
-        }
-        Map<String, String> structureMap = inputInfo.getFirstCourseRecordDoc().getStructureMap();
-        String EDStr = structureMap.get("病例特点");
-        if (StringUtil.isNotBlank(EDStr) && !EDStr.contains("损伤中毒")) {
-            return;
-        }
+        boolean flag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String diagnoseType = diag.get(Content.diagnose_type); //诊断类别
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                // 主要诊断
+                if (StringUtils.isNotBlank(diagnoseType) && "01".equals(diagnoseType)) {
+                    if (StringUtils.isEmpty(icdCode)) {
+                        return;
+                    }
+                    // 如果出院诊断中诊断编码icdCodes,则设置flag为true
+                    if (icdCode.startsWith("C") || icdCode.startsWith("T")) {
+                        flag = true;
+                        break;
+                    }
+
+                }
+            }
 
-        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
-            Map<String, Object> firstpageStructure = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
-            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            List<Map<String, String>> dischargeDiag = (List) firstpageStructure.get(Content.dischargeDiag);
-            String transferDept = firstpageStructureMap.get(Content.dp_out);
-            String transferDept_changxing = firstpageStructureMap.get("损伤中毒因素");
-            String code = dischargeDiag.get(0).get("诊断编码");
-            if (code.startsWith("S") || code.startsWith("T")){
-                if ((CatalogueUtil.isEmpty(transferDept) || "[]".equals(transferDept))
-                        || (CatalogueUtil.isEmpty(transferDept_changxing) || "[]".equals(transferDept_changxing))) {
+            // 如果flag为true
+            if (flag) {
+                //损伤中毒因素
+                String poisonFactor = firstPageStructureMap.get(Content.poison_factor);
+                if (StringUtil.isBlank(poisonFactor) || poisonFactor.equals("-")) {
                     status.set("-1");
                     return;
                 }

+ 59 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0199.java

@@ -1,38 +1,87 @@
 package com.lantone.qc.kernel.catalogue.firstpagerecord;
 
+import com.google.common.collect.Lists;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
+import java.util.List;
 import java.util.Map;
 
 /**
  * @ClassName : FIRP0199
  * @Description : 新生儿出生体重未填写
- * @Author : 胡敬
- * @Date: 2020-03-14 16:30
+ * @Author : dsYun
+ * @Date: 2023-07-20 16:30
  */
 @Component
 public class FIRP0199 extends QCCatalogue {
+    /**
+     * 判断病案首页中是出院诊断信息,1.如果为空不做判断,2.判断是否出现Z37.0,Z37.2,Z37.3,Z37.5,Z37.6编码,不存在则返回
+     * 3.判断是否年龄(天)小于28天活着入院时间减去出生日期小于28天时,新生儿出生体重是否填写,未填写则提示缺陷
+     */
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        List<String> words = Lists.newArrayList("Z37.0", "Z37.2", "Z37.3", "Z37.5", "Z37.6");
+        boolean flag = false;
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            /*
-            String infantAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
-            String infantAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
-            if (CatalogueUtil.isEmpty(infantAgeMonths) && CatalogueUtil.isEmpty(infantAgeDays)) {
+
+            Map<String, Object> firstpageStructureExtMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureExtMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
                 return;
             }
 
-             */
-            String newbornWeight = firstpageStructureMap.get(Content.newbornWeight);
-            if (StringUtil.isBlank(newbornWeight)) {
-                status.set("-1");
+            for (Map<String, String> diag : dischargeDiag) {
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                if (StringUtils.isEmpty(icdCode)) {
+                    continue;
+                }
+                // 如果出院诊断中诊断编码以V、W、X、Y则提示缺陷
+                for (String word : words) {
+                    if (word.equals(icdCode)) {
+                        flag = true;
+                    }
+                }
+            }
+            //TODO 年龄不足1周岁的年龄(天)≤28天
+
+            // 入院时间减去出生日期小于28天
+            String firstAdmisTime = firstpageStructureMap.get(Content.admisTime); //病案首页入院时间
+            String firstBirthTime = firstpageStructureMap.get(Content.birth_date); //病案首页出生日期
+            // 如果入院时间或者出生日期为空,跳出
+            if (StringUtil.isBlank(firstAdmisTime) || StringUtil.isBlank(firstBirthTime)) {
+                return;
+            }
+            Date aDate = DateUtil.parseDateTime(firstAdmisTime); // 入院时间 Date格式
+            Date bDate = DateUtil.parseDateTime(firstBirthTime); // 出生日期 Date格式
+            // 不是日期格式,跳出
+            if (aDate == null || bDate == null) {
+                return;
             }
+            long day = (aDate.getTime() - bDate.getTime()) / (24 * 60 * 60 * 1000);
+            if (day < 28) {
+                flag = true;
+            }
+
+
+            // 如果不存在Z37.0,Z37.2,Z37.3,Z37.5,Z37.6编码,则不判断
+            if (flag) {
+                String newbornWeight = firstpageStructureMap.get(Content.newbornWeight); //新生儿出生体重
+                if (StringUtil.isBlank(newbornWeight)) {
+                    status.set("-1");
+                }
+            }
+
         }
     }
 }

+ 33 - 11
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0201.java

@@ -1,38 +1,60 @@
 package com.lantone.qc.kernel.catalogue.firstpagerecord;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
-import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
+import java.util.Date;
 import java.util.Map;
 
 /**
  * @ClassName : FIRP0201
  * @Description : 新生儿入院体重未填写
- * @Author : 胡敬
- * @Date: 2020-03-14 16:28
+ * @Author : dsYun
+ * @Date: 2023-07-20 16:28
  */
 @Component
 public class FIRP0201 extends QCCatalogue {
+    /**
+     * 判断病案首页中是新生儿入院体重、入院时间和出生日期是否为空,1.如果为空不做判断,2.年龄不足1周岁的年龄(天)≤28天,或入院时间减出生日期≤28天时
+     * 3.如果新生儿入院体重为空,则提示缺陷
+     */
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
+        boolean flag = false;
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            /*
-            String infantAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
-            String infantAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
-            if (CatalogueUtil.isEmpty(infantAgeMonths) && CatalogueUtil.isEmpty(infantAgeDays)) {
+            //TODO 年龄不足1周岁的年龄(天)≤28天
+
+            // 入院时间减去出生日期小于28天
+            String firstAdmisTime = firstpageStructureMap.get(Content.admisTime); //病案首页入院时间
+            String firstBirthTime = firstpageStructureMap.get(Content.birth_date); //病案首页出生日期
+            // 如果入院时间或者出生日期为空,跳出
+            if (StringUtil.isBlank(firstAdmisTime) || StringUtil.isBlank(firstBirthTime)) {
+                return;
+            }
+            Date aDate = DateUtil.parseDateTime(firstAdmisTime); // 入院时间 Date格式
+            Date bDate = DateUtil.parseDateTime(firstBirthTime); // 出生日期 Date格式
+            // 不是日期格式,跳出
+            if (aDate == null || bDate == null) {
                 return;
             }
+            long day = (aDate.getTime() - bDate.getTime()) / (24 * 60 * 60 * 1000);
+            if (day < 28) {
+                flag = true;
+            }
 
-             */
-            String newbornAdmisWeight = firstpageStructureMap.get(Content.newbornAdmisWeight);
-            if (CatalogueUtil.isEmpty(newbornAdmisWeight)){
-                status.set("-1");
+            if (flag) {
+                String newbornAdmisWeight = firstpageStructureMap.get(Content.newbornAdmisWeight); // 新生儿入院体重
+                if (StringUtil.isBlank(newbornAdmisWeight)) {
+                    status.set("-1");
+                }
             }
+
         }
     }
 }

+ 12 - 6
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0274.java

@@ -5,6 +5,7 @@ import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -21,12 +22,17 @@ public class FIRP0274 extends QCCatalogue {
         status.set("0");
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            /*String age = firstpageStructureMap.get(Content.age);*/
-            String infantAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
-            String infantAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
-            if (CatalogueUtil.isEmpty(infantAgeMonths)
-                    && CatalogueUtil.isEmpty(infantAgeDays)) {
-                status.set("-1");
+            String age = firstpageStructureMap.get(Content.age); // 年龄
+            // 年龄存在特殊字符,不做判断
+            if (StringUtil.isBlank(age) || CatalogueUtil.isSpecialChar(age) || age.equals("月")) {
+                return;
+            }
+            age = age.replace("岁","");
+            if("0".equals(age)){
+                String infantAgeDays = firstpageStructureMap.get(Content.newbornAgeDays); // 新生儿出生天数
+                if (CatalogueUtil.isEmpty(infantAgeDays)) {
+                    status.set("-1");
+                }
             }
         }
     }

+ 35 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0277.java

@@ -0,0 +1,35 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0277
+ * @Description : 损伤中毒因素编码未填写
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0277 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 poisonFactor = firstPageStructureMap.get(Content.poison_factor); //损伤中毒因素
+            if (StringUtil.isBlank(poisonFactor)){
+                return;
+            }
+            String poisonFactorCode = firstPageStructureMap.get(Content.poison_factor_code); //损伤中毒因素编码
+            if(StringUtil.isBlank(poisonFactorCode)){
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 53 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0278.java

@@ -0,0 +1,53 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0278
+ * @Description : 患者年龄填写错误
+ * @Author : dsYun
+ * @Date: 2023-08-17 16:24
+ */
+@Component
+public class FIRP0278 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 age = firstpageStructureMap.get(Content.age); // 年龄
+            // 年龄存在特殊字符,不做判断
+            if (StringUtil.isBlank(age) || CatalogueUtil.isSpecialChar(age) || age.equals("月")) {
+                return;
+            }
+            age = age.replace("岁","");
+            String admisTime = firstpageStructureMap.get(Content.admisTime); // 入院时间
+            String birthDate = firstpageStructureMap.get(Content.birth_date); // 出生日期
+            // 如果入院时间或者出生日期为空,跳出
+            if(StringUtil.isBlank(admisTime) || StringUtil.isBlank(birthDate)){
+                return;
+            }
+            Date aDate = DateUtil.parseDate(admisTime); // 入院时间 Date格式
+            Date bDate = DateUtil.parseDate(birthDate); // 出生日期 Date格式
+            // 不是日期格式,跳出
+            if (aDate == null || bDate == null) {
+                return;
+            }
+            //入院时间年份减去出生日期年份
+            int year = aDate.getYear() - bDate.getYear();
+            if (year < Integer.parseInt(age) -2 || year > Integer.parseInt(age) + 1) {
+                //误差超过1岁提醒
+                status.set("-1");
+            }
+        }
+    }
+}

+ 52 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0279.java

@@ -0,0 +1,52 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0279
+ * @Description : 出院时间不能早于入院时间
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0279 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 firstAdmisTime = firstpageStructureMap.get(Content.admisTime);//病案首页入院时间
+            String firstDischargeTime = firstpageStructureMap.get(Content.dischargeTime);//病案首页出院时间
+
+            if(StringUtil.isBlank(firstAdmisTime) || StringUtil.isBlank(firstDischargeTime)){
+                return;
+            }
+
+            Date firstAdmisDate = DateUtil.parseDateTime(firstAdmisTime,DateUtil.DATE_TIME_FORMAT);
+            Date firstDischargeDate = DateUtil.parseDate(firstDischargeTime,DateUtil.DATE_TIME_FORMAT); //将带字符串的YYYY-DD-MM HH:MM:SS 转成日期
+
+            if (firstAdmisDate == null || firstDischargeDate == null){
+                return;
+            }
+            // 出院日期在入院日期之前提示缺陷
+            if(firstDischargeDate.before(firstAdmisDate)){
+                status.set("-1");
+                return;
+            }
+            // 出院日期等于入院日期提示缺陷
+            if (CatalogueUtil.equalsDate(firstAdmisDate, firstDischargeDate, "yyyy-MM-dd HH:mm:ss")) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 66 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0280.java

@@ -0,0 +1,66 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.util.DateUtil;
+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 : FIRP0280
+ * @Description : 手术操作日期不在入院时间和出院时间之间
+ * @Author : dsYun
+ * @Date: 2023-08-17 20:28
+ */
+@Component
+public class FIRP0280 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        /**
+         *判断病案首页中是否有手术信息、入院时间和出院时间,1.如果为空不做判断,2.判断手术日期是否在入院时间-1和出院日期之间 3.不在,则提示缺陷
+         */
+        status.set("0");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            // 手术信息
+            List<Map<String, String>> operativeInformation = (List<Map<String, String>>) firstpageStructureMap.get(Content.operative_information);
+            String firstAdmisTime = inputInfo.getFirstPageRecordDoc().getStructureMap().get(Content.admisTime); //病案首页入院时间
+            String firstDischargeTime = inputInfo.getFirstPageRecordDoc().getStructureMap().get(Content.dischargeTime); //病案首页出院时间
+
+            if (ListUtil.isEmpty(operativeInformation) || StringUtil.isBlank(firstAdmisTime) || StringUtil.isBlank(firstDischargeTime)) {
+                return;
+            }
+
+            Date firstAdmisDate = DateUtil.parseDateTime(firstAdmisTime, DateUtil.DATE_TIME_FORMAT);
+            Date firstDischargeDate = DateUtil.parseDate(firstDischargeTime, DateUtil.DATE_TIME_FORMAT); //将带字符串的YYYY-DD-MM HH:MM:SS 转成日期
+
+            for (Map<String, String> operative : operativeInformation) {
+                String operativeDateString = operative.get(Content.operative_date); // 手术日期
+                if (StringUtil.isBlank(operativeDateString)) {
+                    continue;
+                }
+                Date operativeDate = DateUtil.parseDateTime(operativeDateString, DateUtil.DATE_TIME_FORMAT);
+                // 手术日期在入院时间一天前
+                if (operativeDate.before(DateUtil.addDate(firstAdmisDate, -1))) {
+                    status.set("-1");
+                    return;
+                }
+                // 手术日期在出院时间之后
+                if (operativeDate.after(firstDischargeDate)) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 44 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0281.java

@@ -0,0 +1,44 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0281
+ * @Description : 门(急)诊诊断编码不能使用V、W、X、Y开头的编码
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0281 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        status.set("0");
+        List<String> words = Lists.newArrayList("V", "W", "X", "Y");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String outpatientEmergencyDiag = firstPageStructureMap.get(Content.outpatientEmergencyDiag); //门急诊诊断
+            String outpatientEmrDiagnoseCode = firstPageStructureMap.get(Content.outpatient_emr_diagnose_code); //门急诊诊断编码
+
+            if (StringUtil.isBlank(outpatientEmergencyDiag) || outpatientEmergencyDiag.equals("-") || StringUtil.isBlank(outpatientEmrDiagnoseCode)){
+                return;
+            }
+            // 如果门急诊诊断编码以V、W、X、Y则提示缺陷
+            for(String word : words){
+                if(outpatientEmrDiagnoseCode.startsWith(word)){
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 94 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0282.java

@@ -0,0 +1,94 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0282
+ * @Description : 存在P10~P15诊断编码,入院时间或出生日期填写错误
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0282 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        status.set("0");
+        List<String> icdCodes = Lists.newArrayList("P10", "P11", "P12", "P13", "P14", "P15");
+        boolean flag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+
+            String admisTime = firstPageStructureMap.get(Content.admisTime); // 入院时间
+            String birthDate = firstPageStructureMap.get(Content.birth_date); // 出生日期
+            // 如果入院时间或者出生日期为空,跳出
+            if (StringUtil.isBlank(admisTime) || StringUtil.isBlank(birthDate)) {
+                return;
+            }
+
+            LocalDate aDate = LocalDate.parse(admisTime); // 入院时间 LocalDate格式
+            LocalDate bDate = LocalDate.parse(birthDate); // 出生日期 LocalDate格式
+
+            // 不是日期格式,跳出
+            if (aDate == null || bDate == null) {
+                return;
+            }
+            //门急诊诊断编码
+            String outpatientEmrDiagnoseCode = firstPageStructureMap.get(Content.outpatient_emr_diagnose_code);
+            if (StringUtil.isNotBlank(outpatientEmrDiagnoseCode) && outpatientEmrDiagnoseCode.equals("-")) {
+                // 如果门急诊诊断编码为"P10", "P11", "P12", "P13", "P14", "P15",则设置flag为true
+                for (String icdCode : icdCodes) {
+                    if (icdCode.equals(outpatientEmrDiagnoseCode)) {
+                        flag = true;
+                        break;
+                    }
+                }
+            }
+
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                if (StringUtils.isEmpty(icdCode)) {
+                    continue;
+                }
+                // 如果出院诊断中诊断编码"P10", "P11", "P12", "P13", "P14", "P15",则设置flag为true
+                for (String word : icdCodes) {
+                    if (word.equals(icdCode)) {
+                        flag = true;
+                        break;
+                    }
+                }
+            }
+
+            // 如果flag为true
+            if (flag) {
+                //如果入院时间和出生日期之间日期大于28天则提示缺陷
+                Period diff = Period.between(aDate, bDate);
+                int diffDays = diff.getDays();
+                if (diffDays > 28) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 77 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0283.java

@@ -0,0 +1,77 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0283
+ * @Description : 出院其他诊断编码无分娩结局编码Z37
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0283 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        status.set("0");
+        List<String> icdCodes = Lists.newArrayList("O80", "O81", "O82", "O83", "O84");
+        // 流产结局编码
+        List<String> abortIcdCodes = Lists.newArrayList("O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08");
+        boolean flag = false;
+        //是否存在流产结局编码
+        boolean abortFlag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                if (StringUtils.isEmpty(icdCode)) {
+                    continue;
+                }
+
+                // 如果存在分娩结局编码Z37,则跳出
+                if("Z37".equals(icdCode)){
+                    return;
+                }
+
+                // 如果出院诊断中诊断编码"O80", "O81", "O82", "O83", "O84",则设置flag为true
+                for (String word : icdCodes) {
+                    if (word.equals(icdCode)) {
+                        flag = true;
+                        break;
+                    }
+                }
+                // 如果出院诊断中诊断编码"O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08",则设置abortFlag为true
+                for (String word : abortIcdCodes) {
+                    if (word.equals(icdCode)) {
+                        abortFlag = true;
+                        break;
+                    }
+                }
+            }
+        }
+        // 若诊断编码存在"O80", "O81", "O82", "O83", "O84",且出院诊断编码无"O00", "O01", "O02", "O03", "O04", "O05", "O06", "O07", "O08"
+        if(flag && !abortFlag){
+            status.set("-1");
+            return;
+        }
+    }
+}

+ 46 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0284.java

@@ -0,0 +1,46 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0284
+ * @Description : 损伤、中毒外部原因编码需V、W、X、Y开头
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:10
+ */
+@Component
+public class FIRP0284 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        List<String> words = Lists.newArrayList("V", "W", "X", "Y");
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            String poisonFactor = firstPageStructureMap.get(Content.poison_factor); //损伤中毒因素
+            String poisonFactorCode = firstPageStructureMap.get(Content.poison_factor_code); //损伤中毒因素编码
+
+            if (StringUtil.isBlank(poisonFactor) || poisonFactor.equals("-") || StringUtil.isBlank(poisonFactorCode) || poisonFactorCode.equals("-")) {
+                status.set("0");
+                return;
+            }
+            // 如果损伤中毒因素编码以V、W、X、Y则跳出
+            for (String word : words) {
+                if (poisonFactorCode.startsWith(word)) {
+                    status.set("0");
+                    return;
+                }
+            }
+        } else {
+            status.set("0");
+        }
+    }
+}

+ 55 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0290.java

@@ -0,0 +1,55 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.DateUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0290
+ * @Description : 质控日期不能早于入院时间
+ * @Author : dsYun
+ * @Date: 2023-08-20 17:10
+ */
+@Component
+public class FIRP0290 extends QCCatalogue {
+    /**
+     * 判断病案首页中是否有质控日期和入院时间,1.如果为空不做判断,2.判断是否为日期格式,不是则跳出3.如果质控日期在入院时间之前,则提示缺陷
+     */
+    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 firstAdmisTime = firstpageStructureMap.get(Content.admisTime);//病案首页入院时间
+            String firstQcTime = firstpageStructureMap.get(Content.qc_date);//病案首页质控日期
+
+            if(StringUtil.isBlank(firstAdmisTime) || StringUtil.isBlank(firstQcTime)){
+                return;
+            }
+
+            Date firstAdmisDate = DateUtil.parseDateTime(firstAdmisTime,DateUtil.DATE_TIME_FORMAT);
+            Date firstQcDate = DateUtil.parseDate(firstQcTime,DateUtil.DATE_TIME_FORMAT); //将带字符串的YYYY-DD-MM HH:MM:SS 转成日期
+
+            if (firstAdmisDate == null || firstQcDate == null){
+                return;
+            }
+            // 出院日期在入院日期之前提示缺陷
+            if(firstQcDate.before(firstAdmisDate)){
+                status.set("-1");
+                return;
+            }
+            // 出院日期等于入院日期提示缺陷
+            if (CatalogueUtil.equalsDate(firstAdmisDate, firstQcDate, "yyyy-MM-dd HH:mm:ss")) {
+                status.set("-1");
+                return;
+            }
+        }
+    }
+}

+ 8 - 9
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02904.java

@@ -18,20 +18,19 @@ import java.util.Map;
 @Component
 public class FIRP02904 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
         if (inputInfo.getFirstPageRecordDoc() == null) {
-            status.set("0");
             return;
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            String drugAllergy = firstpageStructureMap.get(Content.drugAllergy);
-            if (StringUtil.isBlank(drugAllergy) || "无".equals(drugAllergy)) {
-                status.set("0");
-                return;
-            }
-            String allergicDrugs = firstpageStructureMap.get(Content.allergyDrug);
-            if (StringUtil.isNotEmpty(allergicDrugs)) {
-                status.set("0");
+            String drugAllergy = firstpageStructureMap.get(Content.drugAllergy); //药物过敏
+
+            if (StringUtil.isNotBlank(drugAllergy) || "有".equals(drugAllergy) || "2".equals(drugAllergy)) {
+                String allergicDrugs = firstpageStructureMap.get(Content.allergyDrug); //过敏药物
+                if (StringUtil.isBlank(allergicDrugs)) {
+                    status.set("-1");
+                }
             }
         }
     }

+ 7 - 13
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP02905.java

@@ -20,30 +20,24 @@ import java.util.Map;
 @Component
 public class FIRP02905 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
         if (inputInfo.getFirstPageRecordDoc() == null) {
-            status.set("0");
             return;
         }
-        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc(); //死亡记录
         if (deathRecordDoc != null) {
-            status.set("0");
             return;
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            String outWay = firstpageStructureMap.get(Content.outWay);
-            String name = firstpageStructureMap.get(Content.receivingOrganization);
+            String outWay = firstpageStructureMap.get(Content.outWay); //离院方式
+            String receivingOrganization = firstpageStructureMap.get(Content.receivingOrganization);//接收机构名称
             if (StringUtil.isBlank(outWay)) {
-                status.set("0");
                 return;
             }
-            //医嘱离院不需要接受机构(宁海一院)
-            if (StringUtil.isNotBlank(outWay) && ("医嘱离院".equals(outWay) || "死亡".equals(outWay) || "非医嘱离院".equals(outWay) || "其他".equals(outWay))) {
-                status.set("0");
-                return;
-            }
-            if (!CatalogueUtil.isEmpty(name)) {
-                status.set("0");
+
+            if ("医嘱转院".equals(outWay) && (CatalogueUtil.isEmpty(receivingOrganization) || "-".equals(receivingOrganization))) {
+                status.set("-1");
             }
         }
     }

+ 74 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0293.java

@@ -0,0 +1,74 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDate;
+import java.time.Period;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0293
+ * @Description : 病理诊断编码未填写
+ * @Author : dsYun
+ * @Date: 2023-08-19 17:10
+ */
+@Component
+public class FIRP0293 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        status.set("0");
+        List<String> icdCodes = Lists.newArrayList("D01", "D02", "D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10", "D11", "D12", "D13",
+                "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31", "D32",
+                "D33", "D34", "D35", "D36", "D37", "D38", "D39", "D40", "D41", "D42", "D43", "D44", "D45", "D46", "D47", "D48");
+
+        boolean flag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String diagnoseType = diag.get(Content.diagnose_type); //诊断类别
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                // 主要诊断
+                if(StringUtils.isNotBlank(diagnoseType) && "01".equals(diagnoseType)){
+                    if (StringUtils.isEmpty(icdCode)) {
+                        return;
+                    }
+                    // 如果出院诊断中诊断编码icdCodes,则设置flag为true
+                    for (String word : icdCodes) {
+                        if (icdCode.startsWith("C") || word.equals(icdCode)) {
+                            flag = true;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            // 如果flag为true
+            if (flag) {
+                //病理诊断编码
+                String pathologyDiagnoseCode = firstPageStructureMap.get(Content.pathologyDiagnoseCode);
+                if (StringUtil.isBlank(pathologyDiagnoseCode) || pathologyDiagnoseCode.equals("-")) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 74 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0296.java

@@ -0,0 +1,74 @@
+package com.lantone.qc.kernel.catalogue.firstpagerecord;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0296
+ * @Description :损伤、中毒外部原因编码未填写
+ * @Author :
+ * @Date: 2020-03-16 11:33
+ */
+@Component
+public class FIRP0296 extends QCCatalogue {
+    /**
+     * 判断病案首页中是否有出院诊断,1.如果为空不做判断,2.判断出院诊断中诊断类别为01的诊断编码是否为首字母为S或T,不是则跳出
+     * 3.判断损伤、中毒外部原因名称是否填写,未填写或为-则跳出,4.判断损伤、中毒外部原因编码是否填写,未填写则提示缺陷
+     */
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+
+        boolean flag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String diagnoseType = diag.get(Content.diagnose_type); //诊断类别
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                // 主要诊断
+                if (StringUtils.isNotBlank(diagnoseType) && "01".equals(diagnoseType)) {
+                    if (StringUtils.isEmpty(icdCode)) {
+                        return;
+                    }
+                    // 如果出院诊断中诊断编码icdCodes,则设置flag为true
+                    if (icdCode.startsWith("C") || icdCode.startsWith("T")) {
+                        flag = true;
+                        break;
+                    }
+
+                }
+            }
+
+            // 如果flag为true
+            if (flag) {
+                //损伤中毒因素
+                String poisonFactor = firstPageStructureMap.get(Content.poison_factor);
+                if (StringUtil.isBlank(poisonFactor) || poisonFactor.equals("-")) {
+                    return;
+                }
+                //损伤中毒因素编码
+                String poisonFactorCode = firstPageStructureMap.get(Content.poison_factor_code);
+                if (StringUtil.isBlank(poisonFactorCode) || poisonFactorCode.equals("-")) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

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

@@ -30,7 +30,7 @@ public class FIRP03179 extends QCCatalogue {
             long count = outpatientEmergencyDiag.stream().filter(diag -> {
                 boolean flag = false;
                 if (StringUtil.isNotBlank(diag.get("诊断类别"))
-                        && diag.get("诊断类别").contains("主要诊断")
+                        && diag.get("诊断类别").contains("01")
                         && StringUtil.isBlank(diag.get("诊断编码"))) {
                     flag = true;
                 }

+ 12 - 6
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/changshaxy/firstpagerecord/FIRP03241.java

@@ -1,18 +1,20 @@
 package com.lantone.qc.kernel.catalogue.hospital.changshaxy.firstpagerecord;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
+import sun.misc.Contended;
 
 import java.util.Map;
 
 /**
  * @ClassName : FIRP03241
- * @Description : 有出院31天再住院计划目的未填写
- * @Author : dy
- * @Date: 2021-11-15 11:15
+ * @Description : 31天再住院计划目的未填写
+ * @Author : dsYun
+ * @Date: 2023-08-19 11:15
  */
 @Component
 public class FIRP03241 extends QCCatalogue {
@@ -23,9 +25,13 @@ public class FIRP03241 extends QCCatalogue {
         }
         if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            String days = firstpageStructureMap.get("三十一天内再住院计划");
-            String objective = firstpageStructureMap.get("再住院目的");
-            if (StringUtil.isNotBlank(days) && "有".equals(days) && StringUtil.isBlank(objective)) {
+            String reHospitalization = firstpageStructureMap.get(Content.reHospitalization); //三十一天内再住院计划
+            String againBehospitalGoal = firstpageStructureMap.get(Content.againBehospitalGoal); //再住院目的
+            if (StringUtil.isEmpty(reHospitalization) || "-".equals(reHospitalization)) {
+                return;
+            }
+            // 如果三十一天内再住院计划是有或2,且再住院目的为空,则提示缺陷
+            if (("有".equals(reHospitalization) || "2".equals(reHospitalization)) && StringUtil.isBlank(againBehospitalGoal)) {
                 status.set("-1");
                 return;
             }

+ 71 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/firstpagerecord/FIRP0182.java

@@ -0,0 +1,71 @@
+package com.lantone.qc.kernel.catalogue.hospital.xiamen.firstpagerecord;
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP0182
+ * @Description :病理诊断未填写
+ * @Author : dsYun
+ * @Date: 2023-08-19 20:11
+ */
+@Component
+public class FIRP0182 extends QCCatalogue {
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+
+        status.set("0");
+        List<String> icdCodes = Lists.newArrayList("D01", "D02", "D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10", "D11", "D12", "D13",
+                "D14", "D15", "D16", "D17", "D18", "D19", "D20", "D21", "D22", "D23", "D24", "D25", "D26", "D27", "D28", "D29", "D30", "D31", "D32",
+                "D33", "D34", "D35", "D36", "D37", "D38", "D39", "D40", "D41", "D42", "D43", "D44", "D45", "D46", "D47", "D48");
+
+        boolean flag = false;
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, String> firstPageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+
+            // 出院诊断
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for (Map<String, String> diag : dischargeDiag) {
+                String diagnoseType = diag.get(Content.diagnose_type); //诊断类别
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                // 主要诊断
+                if(StringUtils.isNotBlank(diagnoseType) && "01".equals(diagnoseType)){
+                    if (StringUtils.isEmpty(icdCode)) {
+                        return;
+                    }
+                    // 如果出院诊断中诊断编码icdCodes,则设置flag为true
+                    for (String word : icdCodes) {
+                        if (icdCode.startsWith("C") || word.equals(icdCode)) {
+                            flag = true;
+                            break;
+                        }
+                    }
+                }
+            }
+
+            // 如果flag为true
+            if (flag) {
+                //病理诊断
+                String pathologyDiagnose = firstPageStructureMap.get(Content.pathologyDiagnose);
+                if (StringUtil.isBlank(pathologyDiagnose) || pathologyDiagnose.equals("-")) {
+                    status.set("-1");
+                    return;
+                }
+            }
+        }
+    }
+}

+ 53 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/firstpagerecord/FIRP03038.java

@@ -0,0 +1,53 @@
+package com.lantone.qc.kernel.catalogue.hospital.xiamen.firstpagerecord;
+
+
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.Content;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import com.lantone.qc.pub.util.ListUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @ClassName : FIRP03038
+ * @Description : 出院诊断疾病编码不能使用V、W、X、Y开头的编码
+ * @Author : dsYun
+ * @Date: 2023-08-17 17:45
+ */
+@Component
+public class FIRP03038 extends QCCatalogue {
+
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> words = Lists.newArrayList("V", "W", "X", "Y");
+        if (inputInfo.getFirstPageRecordDoc() == null) {
+            return;
+        }
+        if (inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
+            Map<String, Object> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureExtMap();
+            List<Map<String, String>> dischargeDiag = (List) firstpageStructureMap.get(Content.dischargeDiag); //出院诊断
+            if (ListUtil.isEmpty(dischargeDiag)) {
+                return;
+            }
+
+            for(Map<String, String> diag : dischargeDiag){
+                String icdCode = diag.get(Content.icd_code); //诊断编码
+                if(StringUtils.isEmpty(icdCode)){
+                    continue;
+                }
+                // 如果出院诊断中诊断编码以V、W、X、Y则提示缺陷
+                for(String word : words){
+                    if(icdCode.startsWith(word)){
+                        status.set("-1");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+}

+ 100 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/leavehospital/LEA0149.java

@@ -0,0 +1,100 @@
+package com.lantone.qc.kernel.catalogue.hospital.xiamen.leavehospital;
+
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description: 出院记录内容缺主诉
+ * @author: rengb
+ * @time: 2020/3/10 13:53
+ */
+@Component
+public class LEA0149 extends QCCatalogue {
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (leaveHospitalDoc == null || beHospitalizedDoc == null) {
+            status.set("0");
+            return;
+        }
+        DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
+        if (deathRecordDoc != null) {
+            status.set("0");
+            return;
+        }
+        Map<String, String> lhStructureMap = leaveHospitalDoc.getStructureMap();
+        ChiefLabel chiefLabel = beHospitalizedDoc.getChiefLabel();
+        if (lhStructureMap != null && chiefLabel != null) {
+            String bhChief = CatalogueUtil.int2ChineseNum(chiefLabel.getText().replaceAll("[\\p{Punct}\\pP。-]", ""));
+            String leaveChief = lhStructureMap.get("主诉");
+            String key = getKeyByHospitalId();
+            String bhThings = lhStructureMap.get(key);
+            if (StringUtil.isNotBlank(bhThings)) {
+                bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhThings.contains("\n")) {
+                    bhThings = bhThings.replace("\n", "");
+                }
+            } else {
+                status.set("0");
+                return;
+            }
+
+            //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
+            if (StringUtil.isNotBlank(leaveChief)) {
+                leaveChief = CatalogueUtil.int2ChineseNum(leaveChief.replaceAll("[\\p{Punct}\\pP。-]", ""));
+                if (bhChief.equals(leaveChief)) {
+                    status.set("0");
+                    return;
+                }
+            }
+            if (bhThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                status.set("0");
+                return;
+            }
+            if (StringUtils.isNotBlank(bhThings)) {
+                Pattern compile = Pattern.compile("(?<=2.).*(?=3.体格检查)");
+                Matcher matcher = compile.matcher(bhThings);
+                while (matcher.find()) {
+                    String number = matcher.group(0);
+                    if (CatalogueUtil.isEmpty(number)) {
+                        status.set("-1");
+                    }
+                }
+                //处理台州的
+                if (bhThings.contains("患者因")) {
+                    status.set("0");
+                }
+            }
+
+
+            //                    bhThings = bhThings.replaceAll("[\\p{Punct}\\pP]", "");
+            //                    if (bhThings.indexOf(bhChief) < 0) {
+            //                        status.set("-1");
+            //                    }
+        }
+    }
+
+    private String getKeyByHospitalId() {
+        switch (Content.hospital_Id) {
+            case "7":               //厦门
+                return "病史摘要";
+            default:
+                return "入院情况";
+        }
+    }
+}

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0134.java

@@ -40,7 +40,7 @@ public class THR0134 extends QCCatalogue {
         String content = firstAttendStructureMap.get("病情记录");
         if (content.contains("诊断明确") || content.contains("目前诊断") || content.contains("目前考虑") || content.contains("当前诊断") ||
                 content.contains("考虑诊断") || content.contains("诊断考虑") || content.contains("诊断基本明确") || content.contains("初步诊断") ||
-                content.contains("诊断为") || regexFind(content, "诊断", "基本明确")) {
+                content.contains("诊断为") || regexFind(content, "诊断", "基本明确") || content.contains("查房后示")) {
             status.set("0");
             return;
         }

+ 1 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0139.java

@@ -38,7 +38,7 @@ public class THR0139 extends QCCatalogue {
         String admisDateStr = inputInfo.getBeHospitalizedDoc().getStructureMap().get("入院日期");
         String recordDateStr = firstDirectStructureMap.get("查房日期");
         String content = firstDirectStructureMap.get("病情记录");
-        if (content.contains("诊断明确") || content.contains("目前诊断") || content.contains("目前考虑") || content.contains("当前诊断") ||
+        if (content.contains("诊断明确") || content.contains("目前诊断") || content.contains("目前考虑") || content.contains("诊断") || content.contains("继续") ||
                 content.contains("考虑诊断") || content.contains("诊断考虑") || content.contains("诊断基本明确") || content.contains("初步诊断") ||
                 content.contains("诊断为") || regexFind(content, "诊断", "基本明确")) {
             status.set("0");

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xiamen/threelevelward/THR0144.java

@@ -14,7 +14,8 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * @ClassName : THR0144
+ * @ClassName :
+ * THR0144
  * @Description : 患者出院前无上级医师(主治及以上)同意出院的病程记录
  * @Author : 胡敬
  * @Date: 2020-03-19 17:20

+ 7 - 40
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/BeHospitalizedAI.java

@@ -95,10 +95,10 @@ public class BeHospitalizedAI extends ModelAI {
                 putContent(crfContent, medicalTextType.get(2), maritalText, Content.marriage);
             }
             /* 月经史 */
-            if (beHospitalizedDoc.getMenstrualLabel() != null && beHospitalizedDoc.getMenstrualLabel().isCrfLabel()) {
-                String menstrualText = beHospitalizedDoc.getMenstrualLabel().getText();
-                putContent(crfContent, medicalTextType.get(2), concatMenstrual, menstrualText, Content.menses);
-            }
+//            if (beHospitalizedDoc.getMenstrualLabel() != null && beHospitalizedDoc.getMenstrualLabel().isCrfLabel()) {
+//                String menstrualText = beHospitalizedDoc.getMenstrualLabel().getText();
+//                putContent(crfContent, medicalTextType.get(2), concatMenstrual, menstrualText, Content.menses);
+//            }
             /* 家族史 */
             if (beHospitalizedDoc.getFamilyLabel() != null && beHospitalizedDoc.getFamilyLabel().isCrfLabel()) {
                 String familyText = beHospitalizedDoc.getFamilyLabel().getText();
@@ -165,9 +165,9 @@ public class BeHospitalizedAI extends ModelAI {
                 putPersonalCrfData(midData.getJSONObject(Content.personal), inputInfo);
             }
             /* 处理月经史 */
-            if (beHospitalizedDoc.getMenstrualLabel() != null && beHospitalizedDoc.getMenstrualLabel().isCrfLabel()) {
-                putMensesCrfData(midData.getJSONObject(Content.menses), inputInfo);
-            }
+//            if (beHospitalizedDoc.getMenstrualLabel() != null && beHospitalizedDoc.getMenstrualLabel().isCrfLabel()) {
+//                putMensesCrfData(midData.getJSONObject(Content.menses), inputInfo);
+//            }
             /* 处理家族史 */
             if (beHospitalizedDoc.getFamilyLabel() != null && beHospitalizedDoc.getFamilyLabel().isCrfLabel()) {
                 putFamilyCrfData(midData.getJSONObject(Content.family), inputInfo);
@@ -205,9 +205,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -226,9 +223,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -252,9 +246,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -276,9 +267,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -294,9 +282,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -319,9 +304,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -343,9 +325,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null || jsonObject.getJSONObject(entityRelationObject) == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -367,9 +346,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -407,9 +383,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -441,9 +414,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;
@@ -468,9 +438,6 @@ public class BeHospitalizedAI extends ModelAI {
         if (jsonObject == null) {
             return;
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return;
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
         if (aiOut == null) {
             return;

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

@@ -65,7 +65,7 @@ public class ConsultationAI extends ModelAI {
      */
     public List<Drug> putDrugCrfData(JSONObject jsonObject) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return new ArrayList<>();
         }
         EntityProcessDrug entityProcessDrug = new EntityProcessDrug();

+ 5 - 5
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/FirstCourseRecordAI.java

@@ -178,7 +178,7 @@ public class FirstCourseRecordAI extends ModelAI {
      */
     public void putInitialDiagCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         //诊断信息
@@ -195,7 +195,7 @@ public class FirstCourseRecordAI extends ModelAI {
      */
     public void putDiagnosisCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         //使用现病史结构来处理诊断依据
@@ -213,7 +213,7 @@ public class FirstCourseRecordAI extends ModelAI {
      */
     public void putDifferentialDiagCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         //诊断信息
@@ -230,7 +230,7 @@ public class FirstCourseRecordAI extends ModelAI {
      */
     public void putTreatPlanCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         //诊疗计划
@@ -248,7 +248,7 @@ public class FirstCourseRecordAI extends ModelAI {
      */
     public void putDrugCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         EntityProcessDrug entityProcessDrug = new EntityProcessDrug();

+ 3 - 3
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/LeaveHospitalAI.java

@@ -92,7 +92,7 @@ public class LeaveHospitalAI extends ModelAI {
      */
     public void putDischargeCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         EntityProcessLeaveHospital entityProcessLeaveHospital = new EntityProcessLeaveHospital();
@@ -108,7 +108,7 @@ public class LeaveHospitalAI extends ModelAI {
      */
     public void putDiagCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         EntityProcessDiag entityProcessDiag = new EntityProcessDiag();
@@ -126,7 +126,7 @@ public class LeaveHospitalAI extends ModelAI {
      */
     public void putDrugCrfData(JSONObject jsonObject, InputInfo inputInfo) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         EntityProcessDrug entityProcessDrug = new EntityProcessDrug();

+ 1 - 13
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ModelAI.java

@@ -44,7 +44,7 @@ public class ModelAI {
         if (useCrfCache) {
             data = (JSONArray) redisUtil.hget(prex + behospitalCode, classname);
         }
-        if (false) {
+        if (data == null) {
             //存储CRF完整所需结构数据
             CRFVo crfVo = new CRFVo();
             crfVo.setData(crfContent);
@@ -65,9 +65,6 @@ public class ModelAI {
         if (jsonObject == null) {
             return new JSONObject();
         }
-        if (jsonObject.getJSONObject(entityRelationObject) == null) {
-            return new JSONObject();
-        }
         JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(outputs);
         aiOut.put(content, jsonObject.getJSONObject(entityRelationObject).getString(content));
         return aiOut;
@@ -118,9 +115,6 @@ public class ModelAI {
      */
     public JSONObject getOutputs(JSONArray data) {
         JSONObject midData = new JSONObject();
-        if(data == null){
-            return midData;
-        }
         for (int i = 0; i < data.size(); i++) {
             JSONObject detailContent = data.getJSONObject(i);
             String detail_title = detailContent.getString("detail_title");
@@ -188,9 +182,6 @@ public class ModelAI {
      */
     public double getSimilarOutputs(JSONArray data) {
         double likeRate = 0d;
-        if( data==null ){
-            return likeRate;
-        }
         if (data.size() > 0) {
             JSONObject dataContent = data.getJSONObject(0);
             likeRate = dataContent.getDoubleValue("like_rate");
@@ -260,9 +251,6 @@ public class ModelAI {
      */
     public JSONArray getChiefPresentSimilarOutputs(JSONArray predY) {
         JSONArray dataArr = new JSONArray();
-        if(predY == null){
-            return dataArr;
-        }
         if (predY != null && predY.size() > 0) {
             dataArr = predY.getJSONArray(0);
         }

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/OperationAI.java

@@ -95,7 +95,7 @@ public class OperationAI extends ModelAI {
      */
     public OperationDiscussionLabel putOperationDiscussionCrfData(JSONObject jsonObject) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return null;
         }
         String originalText = jsonObject.getString("originalText");
@@ -110,7 +110,7 @@ public class OperationAI extends ModelAI {
      */
     public List<Drug> putDrugCrfData(JSONObject jsonObject) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return new ArrayList<>();
         }
         EntityProcessDrug entityProcessDrug = new EntityProcessDrug();

+ 2 - 2
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ThreeLevelWardAI.java

@@ -160,7 +160,7 @@ public class ThreeLevelWardAI extends ModelAI {
      */
     public void putWardRoundCrfData(JSONObject jsonObject, InputInfo inputInfo, int serious) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return;
         }
         String wardDate = jsonObject.getString("wardDate");
@@ -201,7 +201,7 @@ public class ThreeLevelWardAI extends ModelAI {
      */
     public ThreeLevelWardLabel putWardRoundCrfData(JSONObject jsonObject) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
-        if (aiOut == null || aiOut.size()==0) {
+        if (aiOut == null) {
             return new ThreeLevelWardLabel();
         }
         String detailTitle = jsonObject.getString("detail_title");

+ 0 - 3
kernel/src/main/java/com/lantone/qc/kernel/util/SimilarityUtil.java

@@ -62,9 +62,6 @@ public class SimilarityUtil {
      * @return 返回具体数据集合
      */
     public JSONArray similarityRequest(String word_type, String word, int number) {
-        if(1==1){
-            return null;
-        }
         if (StringUtil.isBlank(word_type) || StringUtil.isBlank(word) || number == 0) {
             return null;
         }

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

@@ -179,6 +179,7 @@ public class Content {
     public static final String dialectical_nursing = "辩证施护";
 
     public static final String outpatientEmergencyDiag = "门急诊诊断";
+    public static final String outpatient_emr_diagnose_code = "门急诊诊断编码";
     public static final String diagCode = "诊断编码";
     public static final String diagnoseName = "诊断名称";
     public static final String inStatus = "入院情况";
@@ -186,12 +187,15 @@ public class Content {
     public static final String dischargeDiag = "出院诊断";
     public static final String leaveHospitalDoctorAdvice = "出院医嘱";
     public static final String dp_out = "损伤、中毒外部原因";
+    public static final String poison_factor = "损伤中毒因素";
+    public static final String poison_factor_code = "损伤中毒因素编码";
     public static final String diagnose_type = "诊断类别";
     public static final String chinese_western_type = "中西医类别";
     public static final String diagnose_type_short = "诊断判别";
     public static final String diagnose_name = "诊断名称";
     public static final String icd_code = "诊断编码";
     public static final String pathologyDiagnose = "病理诊断";
+    public static final String pathologyDiagnoseCode = "病理诊断编码";
     public static final String pathologyDiagnoseCost = "病理诊断费";
     public static final String admitPath = "入院途径";
     public static final String admisTime = "入院时间"; //病案首页用
@@ -252,6 +256,7 @@ public class Content {
     public static final String brainInjuryComaAfterMins = "颅脑损伤患者昏迷后分钟";
     public static final String daCode = "医嘱转院机构名称";
     public static final String reHospitalization = "三十一天内再住院计划";
+    public static final String againBehospitalGoal = "再住院目的";
     //判断
     public static final String cancellationOrder = "作废";
 

+ 0 - 1
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenBeHospitalizedDocTrans.java

@@ -47,7 +47,6 @@ public class XiamenBeHospitalizedDocTrans extends ModelDocTrans {
             "婚姻状况=婚姻",
             "既往史|过敏史=过敏史",
             "病历日期=记录时间",
-            "户口地址=住址",
             "病历日期=记录日期",
             "病历|体格检查=体格检查",
             "病史陈述人=病史陈述者",

+ 4 - 2
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenClinicBloodEffectDocTrans.java

@@ -69,16 +69,18 @@ public class XiamenClinicBloodEffectDocTrans extends ModelDocTrans {
 
     private List<String> wordList = Lists.newArrayList("输血前指征", "输血后指征", "生命体征评估");
     private List<String> keyContrasts = Lists.newArrayList(
-            "输血诊断=病历内容",
             "评估时间=病历日期",
             "病历内容=临床诊断",
             "输血后检查|ABO血型=ABO",
+            "输血后检查|Rh血型=RH",
             "输血前指征=输血前实验室检测指征",
             "输血后指征=输血后实验室检测指征",
             "生命体征评估=临床症状与生命体征",
             "生命体征评估|神志=神志状态",
             "生命体征评估|心肺功能=心肺功能评估",
-            "科别=科室"
+            "生命体征评估|外周循环=外周循环",
+            "科别=科室",
+            "病历号=住院号"
     );
 
 }

+ 22 - 2
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenClinicalBloodDocTrans.java

@@ -41,10 +41,31 @@ public class XiamenClinicalBloodDocTrans extends ModelDocTrans {
     private ClinicalBloodDoc getClinicalBloodDoc(Map<String, Object> contentMap) {
         String content = contentMap.get("xmlText").toString();
         Map<String, String> structureMap = null;
+        StringBuffer sb = new StringBuffer();
         if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
             structureMap = (Map) FastJsonUtils.getJsonToMap(content);
             structureMap = OrdinaryAssistant.mapKeyContrast(structureMap, keyContrasts, "10");
         }
+        if (MapUtils.isEmpty(structureMap)) {
+            return null;
+        }
+        if (structureMap.containsKey("病历内容")) {
+            sb.append(structureMap.get("病历内容").replace(" ", ""));
+            structureMap.put("病历内容", sb.toString());
+        }
+        if (structureMap.containsKey("输血原因")) {
+            sb.append("输血原因:" + structureMap.get("输血原因").replace(" ", ""));
+            structureMap.put("病历内容", sb.toString());
+        }
+        if (structureMap.containsKey("输注过程")) {
+            sb.append("输注过程:" + structureMap.get("输注过程").replace(" ", ""));
+            structureMap.put("病历内容", sb.toString());
+        }
+        if (structureMap.containsKey("病程|辅助检查")) {
+            sb.append("病程|辅助检查:" + structureMap.get("病程|辅助检查").replace(" ", ""));
+            structureMap.put("病历内容", sb.toString());
+        }
+
         if (MapUtils.isNotEmpty(structureMap)) {
             ClinicalBloodDoc clinicalBloodDoc = ModelDocGenerate.clinicalBloodDocGen(structureMap);
             clinicalBloodDoc.setPageData((Map) structureMap);
@@ -56,8 +77,7 @@ public class XiamenClinicalBloodDocTrans extends ModelDocTrans {
 
     private List<String> keyContrasts = Lists.newArrayList(
             "输注成分=输注种类、血型、数量",
-            "输血过程=输注过程",
-            "输血原因=病历内容"
+            "输血过程=输注过程"
     );
 
 }

+ 5 - 2
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenConsultationDocTrans.java

@@ -105,7 +105,10 @@ public class XiamenConsultationDocTrans extends ModelDocTrans {
 
     private List<String> consultationRecord_keyContrasts = Lists.newArrayList(
             "标题=病历标题",
-            "会诊意见=简要病情"
+            "病程|会诊申请=会诊申请",
+            "会诊意见=简要病情",
+            "病程|会诊意见=简要病情",
+            "病程|治疗计划=治疗计划"
     );
 
 
@@ -162,9 +165,9 @@ public class XiamenConsultationDocTrans extends ModelDocTrans {
             "科别=申请科室",
             "病历号=住院号",
             "简要病情=病情简介",
+            "病情描述=病情简介",
             "会诊科室=院内会诊申请科室",
             "申请医生=申请医师",
-            "记录时间=会诊时间",
             "记录医生=会诊医师"
     );
 

+ 3 - 1
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenSeriouslyIllNoticeDocTrans.java

@@ -56,6 +56,8 @@ public class XiamenSeriouslyIllNoticeDocTrans extends ModelDocTrans {
         }
     }
 
-    private List<String> keyContrasts = Lists.newArrayList();
+    private List<String> keyContrasts = Lists.newArrayList(
+            "病历号=住院号"
+    );
 
 }

+ 27 - 2
trans/src/main/java/com/lantone/qc/trans/xiamen/XiamenThreeLevelWardDocTrans.java

@@ -141,6 +141,7 @@ public class XiamenThreeLevelWardDocTrans extends ModelDocTrans {
 
     private void classifyThreeLevelWardDoc(ThreeLevelWardDoc threeLevelWardDoc, Map<String, Object> contentMap, Map<String, String> PhysicianTitleMap) {
         String content = contentMap.get("xmlText").toString();
+        StringBuffer sb = new StringBuffer();
         Map<String, String> structureMap = null;
         if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
             structureMap = (Map) FastJsonUtils.getJsonToMap(content);
@@ -149,10 +150,34 @@ public class XiamenThreeLevelWardDocTrans extends ModelDocTrans {
         if (MapUtils.isEmpty(structureMap)) {
             return;
         }
-
         if (structureMap.containsKey("病情记录")) {
-            structureMap.put("病情记录", structureMap.get("病情记录").replace(" ", ""));
+            sb.append(structureMap.get("病情记录").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
+        }
+        if (structureMap.containsKey("病程|治疗方案")) {
+            sb.append("病程|治疗方案:" + structureMap.get("病程|治疗方案").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
+        }
+        if (structureMap.containsKey("病程|辅助检查")) {
+            sb.append("病程|辅助检查:" + structureMap.get("病程|辅助检查").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
+        }
+        if (structureMap.containsKey("病程|查房意见")) {
+            sb.append("病程|查房意见:" + structureMap.get("病程|查房意见").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
         }
+        if (structureMap.containsKey("病程|患者情况")) {
+            sb.append("病程|患者情况:" + structureMap.get("病程|患者情况").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
+        }
+        if (structureMap.containsKey("病程|出院")) {
+            sb.append("病程|出院:" + structureMap.get("病程|出院").replace(" ", ""));
+            structureMap.put("病情记录", sb.toString());
+        }
+
+//        if (structureMap.containsKey("病情记录")) {
+//            structureMap.put("病情记录", structureMap.get("病情记录").replace(" ", ""));
+//        }
         //structureMap.put("查房日期", structureMap.get("记录时间"));
         /*Map<String, String> cutWordMap = Maps.newHashMap();
         String text = CxXmlUtil.getXmlText(content);