فهرست منبع

Merge remote-tracking branch 'origin/dev'

louhr 5 سال پیش
والد
کامیت
a655966b33
45فایلهای تغییر یافته به همراه351 افزوده شده و 186 حذف شده
  1. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0002.java
  2. 31 37
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0005.java
  3. 6 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0006.java
  4. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0009.java
  5. 6 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0012.java
  6. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0014.java
  7. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0017.java
  8. 3 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0058.java
  9. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0065.java
  10. 6 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0069.java
  11. 3 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0072.java
  12. 1 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0375.java
  13. 6 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0376.java
  14. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0400.java
  15. 35 15
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0414.java
  16. 10 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0416.java
  17. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0441.java
  18. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0449.java
  19. 8 8
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0724.java
  20. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/clinicalblood/CLI0309.java
  21. 5 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0087.java
  22. 3 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0092.java
  23. 8 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0096.java
  24. 6 10
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0504.java
  25. 24 7
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0161.java
  26. 5 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0162.java
  27. 19 9
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0178.java
  28. 5 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0202.java
  29. 7 3
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0147.java
  30. 43 44
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0149.java
  31. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA02901.java
  32. 27 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0322.java
  33. 17 1
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0351.java
  34. 4 4
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/preoperativediscussion/PRE0328.java
  35. 10 2
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0601.java
  36. 5 4
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/BeHospitalizedAI.java
  37. 8 8
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/FirstCourseRecordAI.java
  38. 2 2
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/LeaveHospitalAI.java
  39. 2 1
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ModelAI.java
  40. 4 0
      kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessFamily.java
  41. 1 1
      kernel/src/main/java/com/lantone/qc/kernel/util/CatalogueUtil.java
  42. 1 0
      public/src/main/java/com/lantone/qc/pub/model/entity/Dead.java
  43. 1 0
      public/src/main/java/com/lantone/qc/pub/model/vo/ChiefPresentSimilarityVo.java
  44. 1 0
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxPathologyShipDocTrans.java
  45. 7 4
      trans/src/main/java/com/lantone/qc/trans/changx/ChangxThreeLevelWardDocTrans.java

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

@@ -89,7 +89,8 @@ public class BEH0002 extends QCCatalogue {
                 String firstClinical = clinicals.get(0).getName();
                 /* 主诉现病史相似度算法接口 */
                 ModelAI modelAI = new ModelAI();
-                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(firstClinical, symptoms, false, chiefPresentSimilarityServiceClient);
+                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(firstClinical, symptoms, false
+                        , "chief_present", chiefPresentSimilarityServiceClient);
                 if (jsonArray.size() == 2) {
                     /* 相似度最高症状 */
                     String symptom = jsonArray.getString(0);

+ 31 - 37
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0005.java

@@ -1,17 +1,16 @@
 package com.lantone.qc.kernel.catalogue.behospitalized;
 
+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.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
-import com.lantone.qc.pub.model.entity.Clinical;
 import com.lantone.qc.pub.model.entity.PD;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
-import java.util.Map;
 
 
 /**
@@ -23,48 +22,43 @@ import java.util.Map;
 @Component
 public class BEH0005 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        if(inputInfo.getBeHospitalizedDoc() == null){
+        if (inputInfo.getBeHospitalizedDoc() == null) {
             status.set("0");
             return;
         }
-        List<Integer> time_index = new ArrayList<>();
-        String chief_text = inputInfo.getBeHospitalizedDoc().getChiefLabel().getText();
-        if(chief_text.contains("检查") || chief_text.contains("术后") || chief_text.contains("药物")){
+        List<Integer> timeIndex = new ArrayList<>();
+        ChiefLabel chiefLabel = inputInfo.getBeHospitalizedDoc().getChiefLabel();
+        if (chiefLabel == null) {
             status.set("0");
-        }else {
-            int year = chief_text.indexOf("年");
-            if (year != -1) {
-                time_index.add(year);
-            }
-            int month = chief_text.indexOf("月");
-            if (month != -1) {
-                time_index.add(month);
-            }
-            int week = chief_text.indexOf("周");
-            if (week != -1) {
-                time_index.add(week);
-            }
-            int day = chief_text.indexOf("天");
-            if (day != -1) {
-                time_index.add(day);
-            }
-            int ri = chief_text.indexOf("日");
-            if (ri != -1) {
-                time_index.add(ri);
-            }
-            int hour = chief_text.indexOf("时");
-            if (hour != -1) {
-                time_index.add(hour);
+            return;
+        }
+        List<PD> pds = chiefLabel.getPds();
+        String chiefText = chiefLabel.getText();
+        if (chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物")) {
+            status.set("0");
+        } else {
+            List<String> words = Lists.newArrayList("年", "月", "周", "天", "日", "时");
+            String name;
+            for (PD pd : pds) {
+                name = pd.getName();
+                if (StringUtil.isNotBlank(name)) {
+                    for (String word : words) {
+                        if (name.contains(word)) {
+                            timeIndex.add(chiefText.indexOf(word));
+                            break;
+                        }
+                    }
+                }
             }
         }
-        if(time_index.size()>0){
-            int min = time_index.get(0);
-            for (Integer data:time_index) {
-                if(data<min){
+        if (timeIndex.size() > 0) {
+            int min = timeIndex.get(0);
+            for (Integer data : timeIndex) {
+                if (data < min) {
                     min = data;
                 }
             }
-            if(min == time_index.get(0)){
+            if (min == timeIndex.get(0)) {
                 status.set("0");
             }
         }

+ 6 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0006.java

@@ -31,18 +31,21 @@ public class BEH0006 extends QCCatalogue {
             return;
         }
         String chiefText = chiefLabel.getText();
-        if (StringUtil.isNotBlank(chiefText) && (chiefText.contains("复查")
-                || chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物") || chiefText.contains("发现"))) {
+        if (StringUtil.isNotBlank(chiefText) && chiefText.contains("半年")) {
             status.set("0");
         } else {
             List<PD> pds = chiefLabel.getPds();
             if (pds != null && pds.size() > 0) {
+                if (pds.size() == 2) {
+                    status.set("0");
+                    return;
+                }
                 for (PD pd : pds) {
                     String pdName = pd.getName();
                     if (!CatalogueUtil.isEmpty(pdName)) {
                         if (pdName.contains("天") || pdName.contains("周") || pdName.contains("月")
                                 || pdName.contains("时") || pdName.contains("半年") || pdName.contains("秒")
-                                || pdName.contains("日") || pdName.contains("今")) {
+                                || pdName.contains("分") || pdName.contains("日") || pdName.contains("今")) {
                             status.set("0");
                             break;
                         }

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

@@ -34,7 +34,8 @@ public class BEH0009 extends QCCatalogue {
             return;
         }
         String chiefText = chiefLabel.getText();
-        if (StringUtil.isNotBlank(chiefText) && (chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物") || chiefText.contains("发现"))) {
+        if (StringUtil.isNotBlank(chiefText) &&
+                (chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物") || chiefText.contains("发现") || chiefText.contains("误服"))) {
             status.set("0");
         } else {
             List<Diag> diags = chiefLabel.getDiags();

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

@@ -42,6 +42,12 @@ public class BEH0012 extends QCCatalogue {
                 for (String diagSplit : diag.getHospitalDiagName().split("、")) {
 
                     String hospitalDiagName = diagSplit.trim().replace("待查", "");
+                    if (hospitalDiagName.contains("伴")) {
+                        hospitalDiagName = hospitalDiagName.substring(0, hospitalDiagName.indexOf("伴"));
+                    }
+                    if (hospitalDiagName.length() > 15) {
+                        continue;
+                    }
                     if (!disList.contains(hospitalDiagName)) {
                         hospitalDiagName = hospitalDiagName.replaceAll("^[0-9]", "");
                     }

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

@@ -53,7 +53,9 @@ public class BEH0014 extends QCCatalogue {
             if (present.length() > 30) {
                 present = present.substring(0, 30);
             }
-            if (present.contains("体检") || present.contains("发现") || present.contains("检查")) {
+            if (present.contains("体检") || present.contains("发现") || present.contains("检查") || present.contains("因")
+                    || present.contains("确诊") || present.contains("诊断") || present.contains("复查") || present.contains("术后")
+                    || present.contains("药物") || present.contains("误服")) {
                 status.set("0");
                 return;
             }

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0017.java

@@ -56,5 +56,8 @@ public class BEH0017 extends QCCatalogue {
         } else {
             status.set("0");
         }
+        if (presentLabel.getPds().size() > 0) {
+            status.set("0");
+        }
     }
 }

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

@@ -45,7 +45,9 @@ public class BEH0058 extends QCCatalogue {
         } else {
             String regex = ".*\\d?子\\d?女.*";
             boolean flag = maritalText.matches(regex);
-            if (flag) {
+            regex = ".*\\d+-\\d+-\\d+-0.*";
+            boolean matches = maritalText.matches(regex);
+            if (flag || matches) {
                 status.set("0");
                 return;
             }

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

@@ -35,7 +35,7 @@ public class BEH0065 extends QCCatalogue {
         } else {
             MenstrualLabel menstrualLabel = inputInfo.getBeHospitalizedDoc().getMenstrualLabel();
             String text = menstrualLabel.getText();
-            if (StringUtil.isNotBlank(text) && (text.contains("未行经") || text.contains("颜色"))) {
+            if (StringUtil.isNotBlank(text) && (text.contains("未行经") || text.contains("颜色")|| text.contains("已绝经"))) {
                 status.set("0");
                 return;
             }

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

@@ -25,11 +25,16 @@ public class BEH0069 extends QCCatalogue {
             return;
         }
         Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
-        if (StringUtils.isNotEmpty(structureMap.get("家庭成员类似病史"))) {
+        if (StringUtils.isNotEmpty(structureMap.get("家庭成员类似病史"))
+                ||StringUtils.isNotEmpty(structureMap.get("外祖父母"))
+                ||StringUtils.isNotEmpty(structureMap.get("家族遗传病"))
+                ||StringUtils.isNotEmpty(structureMap.get("既往妊娠分娩情况"))
+                ||StringUtils.isNotEmpty(structureMap.get("近亲结婚史"))) {
             status.set("0");
             return;
         }
 
+
         if (inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getFamilyLabel() != null) {
             if (!CatalogueUtil.isEmpty(inputInfo.getBeHospitalizedDoc().getFamilyLabel().getText())) {
                 status.set("0");

+ 3 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0072.java

@@ -31,7 +31,8 @@ public class BEH0072 extends QCCatalogue {
             String familyText = familyLabel.getText();
             if (StringUtil.isNotBlank(familyText)) {
                 familyText = familyText.substring(0, Math.min(10, familyText.length()));
-                if (familyText.contains("死因") || familyText.contains("原因") || familyText.contains("不详")) {
+                if (familyText.contains("死因") || familyText.contains("原因") || familyText.contains("详")
+                || familyText.contains("因")) {
                     return;
                 }
             }
@@ -42,7 +43,7 @@ public class BEH0072 extends QCCatalogue {
             for (Family family : families) {
                 if (family.getDead() != null) {
                     Dead dead = family.getDead();
-                    if (family.getName().contains("年迈")) {
+                    if (family.getName().contains("年迈") || dead.getNegative() != null) {
                         continue;
                     }
                     if (dead.getDeadReason() != null || dead.getUnknow() != null) {

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

@@ -41,6 +41,7 @@ public class BEH0375 extends QCCatalogue {
                         || maritalLabel.getText().contains("离婚")
                         || maritalLabel.getText().contains("离异")
                         || maritalLabel.getText().contains("已故")
+                        || maritalLabel.getText().contains("丧偶")
                         || maritalLabel.getText().contains("详见原病历")
                 )
                 )

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

@@ -52,14 +52,18 @@ public class BEH0376 extends QCCatalogue {
         }
         String maritalText = maritalLabel.getText();
         if (StringUtil.isNotBlank(maritalText)) {
-            List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女"
-                    , "0-0-0-0", "详见原病历");
+            List<String> words = Lists.newArrayList("未婚", "未育", "未婚育", "未生育", "未生", "0子0女", "详见原病历");
             for (String word : words) {
                 if (maritalText.contains(word)) {
                     status.set("0");
                     return;
                 }
             }
+            String regex = ".*\\d+-\\d+-\\d+-0.*";
+            if (maritalText.matches(regex)){
+                status.set("0");
+                return;
+            }
         }
         //未婚 无子女
         if (maritalLabel.getMaritalStatus() != null && maritalLabel.getMaritalStatus().getName().contains("未婚")) {

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

@@ -22,7 +22,7 @@ public class BEH0400 extends QCCatalogue {
             return;
         }
         PastLabel pastLabel = inputInfo.getBeHospitalizedDoc().getPastLabel();
-        if (pastLabel != null || StringUtil.isNotBlank(pastLabel.getText())) {
+        if (pastLabel != null && StringUtil.isNotBlank(pastLabel.getText())) {
             status.set("0");
         }
     }

+ 35 - 15
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0414.java

@@ -1,6 +1,7 @@
 package com.lantone.qc.kernel.catalogue.behospitalized;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
@@ -20,26 +21,45 @@ import java.util.Map;
 public class BEH0414 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
-        if (inputInfo.getBeHospitalizedDoc() == null || inputInfo.getFirstPageRecordDoc() == null) {
-            return;
-        }
-        Map<String, String> structureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
-        Map<String, String> firstStructMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-        String contactAddress_bh = structureMap.get("年龄");
-        String contactAddress_first = firstStructMap.get(Content.age);
-        if (StringUtil.isNotBlank(contactAddress_bh) && StringUtil.isNotBlank(contactAddress_first)) {
-            contactAddress_bh = removeUnit(contactAddress_bh);
-            contactAddress_first = removeUnit(contactAddress_first);
-            if (!contactAddress_first.equals(contactAddress_bh)) {
+        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null
+                && inputInfo.getBeHospitalizedDoc() != null && inputInfo.getBeHospitalizedDoc().getStructureMap() != null) {
+            Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
+            Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
+            String firstAdmissionAge = firstpageStructureMap.get(Content.age);
+            /* 根据病案首页新生儿出生月数和新生儿出生天数拼接年龄 */
+            String newbornAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
+            String newbornAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
+            String newbornAgeStr = "";
+            int newbornAge = 0;
+            if (StringUtil.isNotBlank(newbornAgeMonths) && StringUtil.isNotBlank(newbornAgeDays)){
+                newbornAgeStr = newbornAgeMonths + newbornAgeDays;
+            }
+            if (StringUtil.isNotBlank(newbornAgeStr)){
+                newbornAge = removalUnit(newbornAgeStr);
+            }
+            String admissionAge = beHospitalStructureMap.get(Content.age);
+            if (StringUtil.isBlank(firstAdmissionAge) || StringUtil.isBlank(admissionAge)) {
+                status.set("0");
+                return;
+            }
+            int firstAdmissionAgeNum = removalUnit(firstAdmissionAge);
+            int admissionAgeNum = removalUnit(admissionAge);
+
+            if (firstAdmissionAgeNum != admissionAgeNum && newbornAge != admissionAgeNum) {
                 status.set("-1");
             }
         }
     }
 
-    private String removeUnit(String str) {
-        if (str.contains("岁")) {
-            return str.replace("岁", "");
+    private int removalUnit(String admissionAge) {
+        int age = 0;
+        if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("岁")) {
+            admissionAge = admissionAge.replaceAll("[岁天]", "");
+        }
+        admissionAge = admissionAge.replaceAll("[^0-9]","");
+        if (CatalogueUtil.numbersOnly(admissionAge)) {
+            age = Integer.parseInt(admissionAge);
         }
-        return str;
+        return age;
     }
 }

+ 10 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0416.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;
@@ -28,11 +29,18 @@ public class BEH0416 extends QCCatalogue {
         if (structureMap != null && firstStructMap != null) {
             String contactAddress_bh = structureMap.get("职业");
             String contactAddress_first = firstStructMap.get(Content.job);
-            if (!CatalogueUtil.isEmpty(contactAddress_bh) && !CatalogueUtil.isEmpty(contactAddress_first)) {
-                if (!contactAddress_first.equals(contactAddress_bh)) {
+            if (StringUtil.isNotBlank(contactAddress_bh) && StringUtil.isNotBlank(contactAddress_first)) {
+                if (!removeBrackets(contactAddress_first).equals(removeBrackets(contactAddress_bh))) {
                     status.set("-1");
                 }
             }
         }
     }
+
+    /*
+    去除括号
+     */
+    private String removeBrackets(String str){
+        return str.replaceAll("[()()]","");
+    }
 }

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

@@ -34,7 +34,8 @@ public class BEH0441 extends QCCatalogue {
         }
         String presentText = presentLabel.getText();
         if (StringUtil.isNotBlank(presentText)) {
-            List<String> words = Lists.newArrayList("胃纳", "食纳", "食欲", "未纳", "纳眠", "饮食", "纳眠","禁食");
+            List<String> words = Lists.newArrayList("胃纳", "食纳", "食欲", "未纳", "纳眠", "饮食", "纳眠"
+                    ,"禁食","未食","鼻饲","食","吃","饮");
             for (String word : words) {
                 if (presentText.contains(word)) {
                     status.set("0");

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

@@ -62,7 +62,8 @@ public class BEH0449 extends QCCatalogue {
                 List<String> clinicName = getClinicName(presentClinicals);
                 /* 文本相似度模型 */
                 ModelAI modelAI = new ModelAI();
-                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(chiefClinic, clinicName, false, chiefPresentSimilarityServiceClient);
+                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(chiefClinic, clinicName,
+                        false, "chief_present", chiefPresentSimilarityServiceClient);
                 if (jsonArray.size() == 2) {
                     double likeRate = jsonArray.getDoubleValue(1);
                     if (likeRate > 0.9) {

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

@@ -54,10 +54,10 @@ public class BEH0724 extends QCCatalogue {
         if (ListUtil.isNotEmpty(allergies)) {
             if (firpAllergyMedicine.contains("无")) {
                 allergies = allergies.stream().filter(i -> i != null
-                                && i.getNegative() != null
-                                && StringUtil.isNotBlank(i.getName())
-                                && i.getAllergyMedicine() != null
-                                && StringUtil.isNotBlank(i.getAllergyMedicine().getName())
+                        && i.getNegative() != null
+                        && StringUtil.isNotBlank(i.getName())
+                        && i.getAllergyMedicine() != null
+                        && StringUtil.isNotBlank(i.getAllergyMedicine().getName())
                 ).collect(Collectors.toList());
                 /* 模型提出的药物过敏史内容有一个否定就算与病案首页的药物过敏:无 相同 */
                 if (allergies.size() > 0) {
@@ -65,16 +65,16 @@ public class BEH0724 extends QCCatalogue {
                 }
             } else {
                 allergies = allergies.stream().filter(i -> i != null
-                                && StringUtil.isNotBlank(i.getName())
-                                && i.getAllergyMedicine() != null
-                                && StringUtil.isNotBlank(i.getAllergyMedicine().getName())
+                        && StringUtil.isNotBlank(i.getName())
+                        && i.getAllergyMedicine() != null
+                        && StringUtil.isNotBlank(i.getAllergyMedicine().getName())
                 ).collect(Collectors.toList());
 
                 List<String> allergyMedicine = getAllergyMedicine(allergies);
                 /* 主诉现病史相似度算法接口 */
                 ModelAI modelAI = new ModelAI();
                 JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(firpAllergyMedicine, allergyMedicine,
-                        false, chiefPresentSimilarityServiceClient);
+                        false, "chief_present", chiefPresentSimilarityServiceClient);
                 if (jsonArray.size() == 2) {
                     /* 相似度分数 */
                     double likeRate = jsonArray.getDoubleValue(1);

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

@@ -25,6 +25,9 @@ public class CLI0309 extends QCCatalogue {
         if (ListUtil.isEmpty(clinicalBloodDocs) || ListUtil.isEmpty(clinicBloodEffectDocs)) {
             return;
         }
+        if (clinicalBloodDocs.size() < clinicBloodEffectDocs.size()) {
+            return;
+        }
         if (clinicalBloodDocs.size() != clinicBloodEffectDocs.size()) {
             status.set("-1");
             info.set("部分输血记录未找到对应输血后效果评价");

+ 5 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0087.java

@@ -30,6 +30,11 @@ public class FIRC0087 extends QCCatalogue {
                 if(diags == null || diags.size()<1){
                     status.set("-1");
                 }
+                if (StringUtils.isNotEmpty(differentialDiagLabel.getText())
+                        && (differentialDiagLabel.getText().contains("暂缺")
+                            || differentialDiagLabel.getText().contains("无") || differentialDiagLabel.getText().contains("诊断"))) {
+                    status.set("0");
+                }
             }
         }
     }

+ 3 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0092.java

@@ -44,5 +44,8 @@ public class FIRC0092 extends QCCatalogue {
                         || treatPlanLabel.getPacs().size() > 0)) {
             status.set("0");
         }
+        if (treatPlanLabel.getNursingLevel() == null) {
+            info.set("无护理级别");
+        }
     }
 }

+ 8 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0096.java

@@ -18,7 +18,7 @@ import java.util.Map;
 /**
  * @ClassName : FIRC0096
  * @Description : 初步诊断不标准
- * @Author : 楼辉荣 
+ * @Author : 楼辉荣
  * @Date: 2020-03-06 17:28
  */
 @Component
@@ -38,9 +38,14 @@ public class FIRC0096 extends QCCatalogue {
             if(initialDiagLabel != null){
                 List<Diag> diags = initialDiagLabel.getDiags();
                 if(diags != null && diags.size()>0){
-                    for (Diag diag:diags
-                         ) {
+                    for (Diag diag:diags) {
                         String hospitalDiagName = diag.getHospitalDiagName().trim().replace("待查","");
+                        if (hospitalDiagName.contains("伴")){
+                            hospitalDiagName = hospitalDiagName.substring(0,hospitalDiagName.indexOf("伴"));
+                        }
+                        if (hospitalDiagName.length() > 15){
+                            continue;
+                        }
                         if(!hostpital_standDiag.containsKey(hospitalDiagName)){
                             diags_out.add(hospitalDiagName);
                             break;

+ 6 - 10
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstcourserecord/FIRC0504.java

@@ -1,10 +1,10 @@
 package com.lantone.qc.kernel.catalogue.firstcourserecord;
 
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
-import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -20,18 +20,14 @@ public class FIRC0504 extends QCCatalogue {
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
-        if(firstCourseRecordDoc != null){
+        if (firstCourseRecordDoc != null) {
             Map<String, String> firstRecordMap = firstCourseRecordDoc.getStructureMap();
-            if(firstRecordMap != null){
-                String morbidity_after = firstRecordMap.get("治疗计划");
-                if(morbidity_after != null){
-                    if(CatalogueUtil.isEmpty(morbidity_after)){
-                        status.set("-1");
-                    }
-                }else {
+            if (firstRecordMap != null) {
+                String treatPlan = firstRecordMap.get("治疗计划");
+                if (StringUtil.isBlank(treatPlan)) {
                     status.set("-1");
                 }
             }
         }
     }
-    }
+}

+ 24 - 7
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0161.java

@@ -25,23 +25,40 @@ public class FIRP0161 extends QCCatalogue {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             Map<String, String> beHospitalStructureMap = inputInfo.getBeHospitalizedDoc().getStructureMap();
             String firstAdmissionAge = firstpageStructureMap.get(Content.age);
+            /* 根据病案首页新生儿出生月数和新生儿出生天数拼接年龄 */
+            String newbornAgeMonths = firstpageStructureMap.get(Content.newbornAgeMonths);
+            String newbornAgeDays = firstpageStructureMap.get(Content.newbornAgeDays);
+            String newbornAgeStr = "";
+            int newbornAge = 0;
+            if (StringUtil.isNotBlank(newbornAgeMonths) && StringUtil.isNotBlank(newbornAgeDays)){
+                newbornAgeStr = newbornAgeMonths + newbornAgeDays;
+            }
+            if (StringUtil.isNotBlank(newbornAgeStr)){
+                newbornAge = removalUnit(newbornAgeStr);
+            }
             String admissionAge = beHospitalStructureMap.get(Content.age);
-            if (StringUtil.isBlank(firstAdmissionAge) || StringUtil.isBlank(admissionAge)){
+            if (StringUtil.isBlank(firstAdmissionAge) || StringUtil.isBlank(admissionAge)) {
                 status.set("0");
                 return;
             }
-            firstAdmissionAge = removalUnit(firstAdmissionAge);
-            admissionAge = removalUnit(admissionAge);
-            if (!CatalogueUtil.compareToken(firstAdmissionAge, admissionAge)) {
+            int firstAdmissionAgeNum = removalUnit(firstAdmissionAge);
+            int admissionAgeNum = removalUnit(admissionAge);
+
+            if (firstAdmissionAgeNum != admissionAgeNum && newbornAge != admissionAgeNum) {
                 status.set("-1");
             }
         }
     }
 
-    private String removalUnit(String admissionAge) {
+    private int removalUnit(String admissionAge) {
+        int age = 0;
         if (StringUtil.isNotBlank(admissionAge) && admissionAge.contains("岁")) {
-            admissionAge = admissionAge.replace("岁", "");
+            admissionAge = admissionAge.replaceAll("[岁天]", "");
+        }
+        admissionAge = admissionAge.replaceAll("[^0-9]","");
+        if (CatalogueUtil.numbersOnly(admissionAge)) {
+            age = Integer.parseInt(admissionAge);
         }
-        return admissionAge;
+        return age;
     }
 }

+ 5 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0162.java

@@ -1,10 +1,10 @@
 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.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.Map;
@@ -22,7 +22,10 @@ public class FIRP0162 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String idNumber = firstpageStructureMap.get(Content.idNumber);
-            if (!CatalogueUtil.isEmpty(idNumber)) {
+            if (StringUtil.isNotBlank(idNumber)) {
+                if ("-".equals(idNumber) || "—".equals(idNumber)) {
+                    return;
+                }
                 String regex = "\\d{15}|\\d{17}[\\dxX]";
                 if (!idNumber.matches(regex)) {
                     status.set("-1");

+ 19 - 9
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0178.java

@@ -2,6 +2,7 @@ package com.lantone.qc.kernel.catalogue.firstpagerecord;
 
 import com.alibaba.fastjson.JSONArray;
 import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.ChiefPresentSimilarityServiceClient;
 import com.lantone.qc.kernel.client.SimilarityServiceClient;
 import com.lantone.qc.kernel.structure.ai.ModelAI;
 import com.lantone.qc.pub.Content;
@@ -28,6 +29,8 @@ import java.util.Map;
 public class FIRP0178 extends QCCatalogue {
     @Autowired
     SimilarityServiceClient similarityServiceClient;
+    @Autowired
+    ChiefPresentSimilarityServiceClient chiefPresentSimilarityServiceClient;
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         status.set("0");
@@ -53,24 +56,31 @@ public class FIRP0178 extends QCCatalogue {
                 return;
             }
 
-            /* 目前相似度算法是针对文本的,在此处并不适用,如 截瘫 - 高位截瘫,相似度为0 */
+            /* 修改为疾病相似度模型 */
             ModelAI modelAI = new ModelAI();
             int matchDiagSum = 0;
             for (String firstpageLeaveDiag : firstpageLeaveDiags) {
+                JSONArray jsonArray = modelAI.loadChiefPresentSimilarAI(firstpageLeaveDiag, leaveDiagsStr, false
+                        , "diagnose", chiefPresentSimilarityServiceClient);
+                if (jsonArray.size() == 2) {
+                    /* 相似度最高症状 */
+                    String symptom = jsonArray.getString(0);
+                    /* 相似度分数 */
+                    double likeRate = jsonArray.getDoubleValue(1);
+                    if (likeRate > 0.9) {
+                        matchDiagSum++;
+                    }
+                }
+                /*
                 for (String leaveDiag : leaveDiagsStr) {
                     if (firstpageLeaveDiag.equals(leaveDiag) || leaveDiag.contains(firstpageLeaveDiag)) {
                         matchDiagSum++;
                         break;
-                    } else {
-                        JSONArray similarContent = new JSONArray();
-                        modelAI.putContent(similarContent, firstpageLeaveDiag, leaveDiag);
-                        double likeRate = modelAI.loadSimilarAI(similarContent, similarityServiceClient);
-                        if (likeRate > 0.9) {
-                            matchDiagSum++;
-                            break;
-                        }
                     }
                 }
+
+                 */
+
             }
 
             if (matchDiagSum != firstpageLeaveDiags.size()) {

+ 5 - 2
kernel/src/main/java/com/lantone/qc/kernel/catalogue/firstpagerecord/FIRP0202.java

@@ -22,10 +22,13 @@ public class FIRP0202 extends QCCatalogue {
         if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
             Map<String, String> firstpageStructureMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
             String newbornAdmisWeightStr = firstpageStructureMap.get(Content.newbornAdmisWeight);
-            if (CatalogueUtil.isEmpty(newbornAdmisWeightStr) || "-".equals(newbornAdmisWeightStr)) {
+            if (CatalogueUtil.isEmpty(newbornAdmisWeightStr) || !CatalogueUtil.numbersOnly(newbornAdmisWeightStr)) {
                 return;
             }
-            int newbornAdmisWeight = Integer.parseInt(newbornAdmisWeightStr);
+            double newbornAdmisWeight = Double.parseDouble(newbornAdmisWeightStr);
+            if (newbornAdmisWeight / 1000 >= 1) {
+                newbornAdmisWeight = newbornAdmisWeight / 1000;
+            }
             if (newbornAdmisWeight <= 1 || newbornAdmisWeight >= 10) {
                 status.set("-1");
             }

+ 7 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0147.java

@@ -45,11 +45,15 @@ public class LEA0147 extends QCCatalogue {
                 if (ListUtil.isNotEmpty(diags) && hospitalDiagMap != null) {
                     List<String> diagnames = new ArrayList<>();
                     for (Diag dg : diags) {
-                        if ("其他的".equals(dg.getHospitalDiagName())) {
+                        String hospitalDiagName = dg.getHospitalDiagName();
+                        if (hospitalDiagName.contains("伴")) {
+                            hospitalDiagName = hospitalDiagName.substring(0, hospitalDiagName.indexOf("伴"));
+                        }
+                        if ("其他的".equals(hospitalDiagName) || hospitalDiagName.length() > 15) {
                             continue;
                         }
-                        if (hospitalDiagMap.get(dg.getHospitalDiagName()) == null) {
-                            diagnames.add(dg.getHospitalDiagName());
+                        if (hospitalDiagMap.get(hospitalDiagName) == null) {
+                            diagnames.add(hospitalDiagName);
                         }
                     }
                     if (diagnames.size() > 0) {

+ 43 - 44
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA0149.java

@@ -25,57 +25,56 @@ public class LEA0149 extends QCCatalogue {
     @Override
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
         LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
-        if (leaveHospitalDoc == null) {
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        if (leaveHospitalDoc == null || beHospitalizedDoc == null) {
             status.set("0");
             return;
         }
         DeathRecordDoc deathRecordDoc = inputInfo.getDeathRecordDoc();
-        if (deathRecordDoc == null || deathRecordDoc.getText() == null) {
-            BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
-            if (beHospitalizedDoc != null) {
-                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 bhThings = lhStructureMap.get("入院情况");
-                    if (StringUtil.isNotBlank(bhThings)){
-                        bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
-                    }
-
-                    //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
-                    if (StringUtil.isNotBlank(leaveChief)) {
-                        leaveChief = leaveChief.replaceAll("[\\p{Punct}\\pP。-]", "");
-                        if (bhChief.equals(leaveChief)) {
-                            status.set("0");
-                            return;
-                        }
-                    }
-                    if (StringUtil.isNotBlank(bhThings) && bhThings.replace(" ","").contains(bhChief.replace(" ",""))) {
-                        status.set("0");
-                        return;
-                    }
-                    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");
-                    }
-
+        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 bhThings = lhStructureMap.get("入院情况");
+            if (StringUtil.isNotBlank(bhThings)) {
+                bhThings = CatalogueUtil.int2ChineseNum(bhThings.replaceAll("[\\p{Punct}\\pP。-]", ""));
+            }
 
-                    //                    bhThings = bhThings.replaceAll("[\\p{Punct}\\pP]", "");
-                    //                    if (bhThings.indexOf(bhChief) < 0) {
-                    //                        status.set("-1");
-                    //                    }
+            //如果出院小结结构化数据能取出主诉,则直接用该主诉和入院记录主诉比较
+            if (StringUtil.isNotBlank(leaveChief)) {
+                leaveChief = leaveChief.replaceAll("[\\p{Punct}\\pP。-]", "");
+                if (bhChief.equals(leaveChief)) {
+                    status.set("0");
+                    return;
                 }
             }
-        }
+            if (StringUtil.isNotBlank(bhThings) && bhThings.replace(" ", "").contains(bhChief.replace(" ", ""))) {
+                status.set("0");
+                return;
+            }
+            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");
+            //                    }
+        }
     }
 }

+ 2 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA02901.java

@@ -34,10 +34,11 @@ public class LEA02901 extends QCCatalogue {
             if (StringUtil.isNotBlank(dischargeOrder)) {
                 List<String> words = Lists.newArrayList("qd","bid","tid","qid","qh","q2h","q4h","q6h","q8h",
                         "qn","q3w","qod","biw","qw","prn","sos","ad","lib","st","stat","hs","am","po","ID","IH","IM",
-                        "IV","OD","OL","OS","OU","ivgtt","Q12H");
+                        "IV","OD","OL","OS","OU","ivgtt","Q12H","QN","ONCE");
                 for (String word : words) {
                     if (dischargeOrder.contains(word.toUpperCase()) || dischargeOrder.contains(word.toLowerCase())) {
                         status.set("-1");
+                        info.set("出院医嘱用法用量不规范");
                         return;
                     }
                 }

+ 27 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0322.java

@@ -0,0 +1,27 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.OutputInfo;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+
+/**
+ * @Description: 手术患者无手术记录
+ * @author: Mark
+ * @time: 2020/04/04 11:22
+ */
+@Component
+public class OPE0322 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        long cou = inputInfo.getOperationDocs().stream().map(i -> i.getOperationRecordDoc()).filter(i -> i != null).count();
+        if (cou == 0) {
+            status.set("-1");
+        }
+    }
+
+}

+ 17 - 1
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0351.java

@@ -5,6 +5,7 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -42,7 +43,22 @@ public class OPE0351 extends QCCatalogue {
                 }
                 return flag;
             }).count();
-            if (count > 0) {
+            long matchCount = operationDocs.stream().filter(operationDoc -> {
+                boolean flag = false;
+                if (operationDoc.getOperationDiscussionDoc() != null
+                        && StringUtil.isNotBlank(operationDoc.getOperationDiscussionDoc().getText())
+                        && (operationDoc.getOperationDiscussionDoc().getText().contains("体温")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("呼吸")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("脉搏")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("血压")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("心率")
+                )) {
+                    flag = true;
+                }
+                return flag;
+            }).count();
+            /* count为术后首程中没有生命体征的数量,matchCount为术后首程包含体温 呼吸 脉搏 血压 心率这些词的数量 */
+            if (count > 0 && matchCount == 0) {
                 status.set("-1");
             }
         }

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

@@ -24,9 +24,9 @@ public class PRE0328 extends QCCatalogue {
         if (operationDocs == null || operationDocs.size() == 0) {
             return;
         }
-        if(inputInfo.getBeHospitalizedDoc() != null
-                && inputInfo.getBeHospitalizedDoc().getStructureMap().get("现病史") !=null
-                && inputInfo.getBeHospitalizedDoc().getStructureMap().get("现病史").contains("急诊手术")){
+        if (inputInfo.getBeHospitalizedDoc() != null
+                && inputInfo.getBeHospitalizedDoc().getStructureMap().get("现病史") != null
+                && inputInfo.getBeHospitalizedDoc().getStructureMap().get("现病史").contains("急诊手术")) {
             return;
         }
         int i = 0, j = 0;
@@ -38,7 +38,7 @@ public class PRE0328 extends QCCatalogue {
                 j++;
             }
         }
-        if (i != j) {
+        if (i > 0 && i != j) {
             status.set("-1");
             info.set("手术记录不一致");
         }

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

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -25,15 +26,22 @@ public class THR0601 extends QCCatalogue {
             return;
         }
         List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();//查房记录
-        String title;
+        String title, record;
         boolean findIndications = false;
         for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
             Map<String, String> rescueStructureMap = threeLevelWardDoc.getStructureMap();
             title = CatalogueUtil.subTitle(rescueStructureMap.get("查房标题"));
-            if (!CatalogueUtil.isEmpty(title) && title.contains(Content.attend)) {
+            record = CatalogueUtil.subTitle(rescueStructureMap.get("病情记录"));
+            if (StringUtil.isNotBlank(title) && title.contains(Content.attend)) {
                 findIndications = true;
                 break;
             }
+            if (StringUtil.isNotBlank(title) && StringUtil.isNotBlank(record)
+                    && title.contains("共同照护讨论记录") && record.contains(Content.attend)) {
+                findIndications = true;
+                break;
+            }
+
         }
         if (!findIndications) {
             status.set("-1");

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

@@ -69,7 +69,8 @@ public class BeHospitalizedAI extends ModelAI {
             if (beHospitalizedDoc.getChiefLabel().isCrfLabel()) {
                 if (StringUtil.isNotBlank(chief_text)) {
                     chief_text = StringUtil.removeBlank(chief_text);
-                    putContent(crfContent, medicalTextType.get(3), chief_text, Content.chief);  //主诉
+                    /* 2020-06-08修改主诉模型为现病史模型 */
+                    putContent(crfContent, medicalTextType.get(7), chief_text, Content.chief);  //主诉
                 }
             }
             if (beHospitalizedDoc.getPresentLabel().isCrfLabel()) {
@@ -110,18 +111,18 @@ public class BeHospitalizedAI extends ModelAI {
             }
             if (beHospitalizedDoc.getInitialDiagLabel().isCrfLabel()) {
                 if (StringUtil.isNotBlank(initial_diag_text)) {
-                    //initial_diag_text = CatalogueUtil.removeBetweenWordSpace(initial_diag_text);
+                    initial_diag_text = CatalogueUtil.removeBetweenWordSpace(initial_diag_text);
                     putContent(crfContent, medicalTextType.get(6), initial_diag_text, Content.initial_diag);//初步诊断
                 }
             }
             if (StringUtils.isNotEmpty(revised_diag_text) && beHospitalizedDoc.getRevisedDiagLabel().isCrfLabel()) {
                 //修正诊断
-                //revised_diag_text = CatalogueUtil.removeBetweenWordSpace(revised_diag_text);
+                revised_diag_text = CatalogueUtil.removeBetweenWordSpace(revised_diag_text);
                 putContent(crfContent, medicalTextType.get(6), revised_diag_text, Content.revised_diag);
             }
             if (StringUtils.isNotEmpty(supple_diag_text) && beHospitalizedDoc.getSuppleDiagLabel().isCrfLabel()) {
                 //补充诊断
-                //supple_diag_text = CatalogueUtil.removeBetweenWordSpace(supple_diag_text);
+                supple_diag_text = CatalogueUtil.removeBetweenWordSpace(supple_diag_text);
                 putContent(crfContent, medicalTextType.get(6), supple_diag_text, Content.supple_diag);
             }
             JSONObject midData = loadAI(crfContent, crfServiceClient);

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

@@ -46,12 +46,12 @@ public class FirstCourseRecordAI extends ModelAI {
             //putContent(crfContent, medicalTextType.get(0), firstCourseRecordDoc.getCaseCharacteristicLabel().getText(), Content.case_feature);
             //初步诊断
             if (StringUtils.isNotEmpty(structureMap.get(Content.initial_diag))) {
-                //String initial_diag = CatalogueUtil.removeBetweenWordSpace(structureMap.get(Content.initial_diag));
-                String initial_diag = structureMap.get(Content.initial_diag);
+                String initial_diag = CatalogueUtil.removeBetweenWordSpace(structureMap.get(Content.initial_diag));
+                //String initial_diag = structureMap.get(Content.initial_diag);
                 putContent(crfContent, medicalTextType.get(1), initial_diag, Content.initial_diag);
             } else if (firstCourseRecordDoc.getInitialDiagLabel() != null && StringUtil.isNotBlank(firstCourseRecordDoc.getInitialDiagLabel().getText())) {
-                //String initial_diag = CatalogueUtil.removeBetweenWordSpace(firstCourseRecordDoc.getInitialDiagLabel().getText());
-                String initial_diag = firstCourseRecordDoc.getInitialDiagLabel().getText();
+                String initial_diag = CatalogueUtil.removeBetweenWordSpace(firstCourseRecordDoc.getInitialDiagLabel().getText());
+                //String initial_diag = firstCourseRecordDoc.getInitialDiagLabel().getText();
                 putContent(crfContent, medicalTextType.get(1), initial_diag, Content.initial_diag);
             }
 
@@ -59,12 +59,12 @@ public class FirstCourseRecordAI extends ModelAI {
             //putContent(crfContent, medicalTextType.get(0), firstCourseRecordDoc.getDiagnosisLabel().getText(), Content.diag_basis);
             //鉴别诊断
             if (StringUtils.isNotEmpty(structureMap.get("鉴别诊断"))) {
-                //String diffDiag = CatalogueUtil.removeBetweenWordSpace(structureMap.get("鉴别诊断"));
-                String diffDiag = structureMap.get("鉴别诊断");
+                String diffDiag = CatalogueUtil.removeBetweenWordSpace(structureMap.get("鉴别诊断"));
+                //String diffDiag = structureMap.get("鉴别诊断");
                 putContent(crfContent, medicalTextType.get(1), diffDiag, "鉴别诊断");
             } else if (firstCourseRecordDoc.getDifferentialDiagLabel() != null && StringUtil.isNotBlank(firstCourseRecordDoc.getDifferentialDiagLabel().getText())) {
-                //String diffDiag = CatalogueUtil.removeBetweenWordSpace(firstCourseRecordDoc.getDifferentialDiagLabel().getText());
-                String diffDiag = firstCourseRecordDoc.getDifferentialDiagLabel().getText();
+                String diffDiag = CatalogueUtil.removeBetweenWordSpace(firstCourseRecordDoc.getDifferentialDiagLabel().getText());
+                //String diffDiag = firstCourseRecordDoc.getDifferentialDiagLabel().getText();
                 putContent(crfContent, medicalTextType.get(1), diffDiag, "鉴别诊断");
             }
             //诊疗计划

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

@@ -49,8 +49,8 @@ public class LeaveHospitalAI extends ModelAI {
                 //                }
                 //出院诊断
                 if (StringUtil.isNotBlank(leaveHospitalStructureMap.get(Content.dischargeDiag))) {
-                    //String dischargeDiag = CatalogueUtil.removeBetweenWordSpace(leaveHospitalStructureMap.get(Content.dischargeDiag));
-                    String dischargeDiag = leaveHospitalStructureMap.get(Content.dischargeDiag);
+                    String dischargeDiag = CatalogueUtil.removeBetweenWordSpace(leaveHospitalStructureMap.get(Content.dischargeDiag));
+                    //String dischargeDiag = leaveHospitalStructureMap.get(Content.dischargeDiag);
                     putContent(crfContent, medicalTextType.get(1), dischargeDiag, Content.dischargeDiag);
                 }
             }

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

@@ -189,13 +189,14 @@ public class ModelAI {
      * @return
      */
     public JSONArray loadChiefPresentSimilarAI(String string1, List<String> string2, boolean directionCheck
-            , ChiefPresentSimilarityServiceClient chiefPresentSimilarityServiceClient) {
+            ,String modelName, ChiefPresentSimilarityServiceClient chiefPresentSimilarityServiceClient) {
         //存储CRF完整所需结构数据
         ChiefPresentSimilarityVo similarityVo = new ChiefPresentSimilarityVo();
         JSONObject data = new JSONObject();
         putContent(data, string1, string2);
         similarityVo.setData(data);
         similarityVo.setDirection_check(directionCheck);
+        similarityVo.setModel_name(modelName);
         //获取CRF模型返回数据
         JSONArray predY = getAnnotation(chiefPresentSimilarityServiceClient, similarityVo).getPred_y();
         return getChiefPresentSimilarOutputs(predY);

+ 4 - 0
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/process/EntityProcessFamily.java

@@ -92,6 +92,10 @@ public class EntityProcessFamily extends EntityProcess {
                     Age age = new Age();
                     age.setName(lemma.getText());
                     dead.setAge(age);
+                } else if (lemma.getProperty().equals(EntityEnum.NEGATIVE.toString())) {
+                    Negative negative = new Negative();
+                    negative.setName(lemma.getText());
+                    dead.setNegative(negative);
                 }
             }
         }

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

@@ -92,7 +92,7 @@ public class CatalogueUtil {
             }
             for (String word : words) {
                 if (StringUtil.isNotBlank(word)) {
-                    String newWord = word.replaceAll("[“”]", "");
+                    String newWord = word.replaceAll("[“”]", "\"");
                     if (sections.stream().noneMatch(section -> section.contains(newWord))) {
                         retWords.add(word);
                     }

+ 1 - 0
public/src/main/java/com/lantone/qc/pub/model/entity/Dead.java

@@ -12,6 +12,7 @@ public class Dead extends General {
     private String desc;
     private DeadReason deadReason;
     private Unknow unknow;
+    private Negative negative;
     private Age age;
     private PD pd;
 }

+ 1 - 0
public/src/main/java/com/lantone/qc/pub/model/vo/ChiefPresentSimilarityVo.java

@@ -9,4 +9,5 @@ import lombok.Setter;
 public class ChiefPresentSimilarityVo {
     private JSONObject data;
     private boolean direction_check;
+    private String model_name;
 }

+ 1 - 0
trans/src/main/java/com/lantone/qc/trans/changx/ChangxPathologyShipDocTrans.java

@@ -43,6 +43,7 @@ public class ChangxPathologyShipDocTrans extends ModelDocTrans {
     private List<String> keyContrasts = Lists.newArrayList(
             "姓名++++患者姓名=姓名",
             "病案号++++住院号=病案号",
+            "病区++++病区名称=病区",
             "数量=标本件数",
             "医师=送检医师",
             "++++送检材料=送检标本名称",

+ 7 - 4
trans/src/main/java/com/lantone/qc/trans/changx/ChangxThreeLevelWardDocTrans.java

@@ -135,10 +135,12 @@ public class ChangxThreeLevelWardDocTrans extends ModelDocTrans {
         String content = structureMap.get("病情记录");
         AttendingDoctorWardDoc attendingDoctorWardDoc = null;
         //标题有代字
-        if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) || findAttend(title, content)) {
-            attendingDoctorWardDoc = new AttendingDoctorWardDoc();
-            attendingDoctorWardDoc.setStructureMap(structureMap);
-            attendingDoctorWardDoc.setPageData((Map) structureMap);
+        if (StringUtil.isNotBlank(title)) {
+            if ((StringUtils.isNotEmpty(subTitle(title)) && subTitle(title).contains("主治")) || findAttend(title, content)) {
+                attendingDoctorWardDoc = new AttendingDoctorWardDoc();
+                attendingDoctorWardDoc.setStructureMap(structureMap);
+                attendingDoctorWardDoc.setPageData((Map) structureMap);
+            }
         }
         return attendingDoctorWardDoc;
     }
@@ -185,6 +187,7 @@ public class ChangxThreeLevelWardDocTrans extends ModelDocTrans {
             "日常病程记录++++文本框=病情记录",
             "在此输入副主任医师查房记录++++文本框=病情记录",
             "在此输入副主任兼主刀医师查房记录++++文本框=病情记录",
+            "在此输入副主任医师代主治医师查房记录++++文本框=病情记录",
             "科主任=三级医师",
             "入院诊断++++初步诊断=入院诊断",
             "记录日期=记录时间"