Browse Source

Merge remote-tracking branch 'origin/dev'

# Conflicts:
#	dbanaly/src/main/resources/application-db.yml
hujing 5 năm trước cách đây
mục cha
commit
f8db99f440

+ 3 - 20
dbanaly/src/main/resources/application-db.yml

@@ -5,26 +5,9 @@ spring:
     druid:
       lantone:
         driver-class-name: com.mysql.jdbc.Driver
-        ##236数据库 内网
-#        url: jdbc:mysql://192.168.2.236:3306/qc?useUnicode=true&characterEncoding=utf8&useSSL=false
-#        username: root
-#        password: lantone
-        ##236数据库 外网
-        #        url: jdbc:mysql://223.93.170.82:23606/qc?useUnicode=true&characterEncoding=utf8
-        #        username: root
-        #        password: lantone
-        ##121数据库 内网
-        url: jdbc:mysql://192.168.2.122:3306/qc?useUnicode=true&characterEncoding=utf8
+        url: jdbc:mysql://192.168.2.121:3306/qc?useUnicode=true&characterEncoding=utf8
         username: root
-        password: lantone
-        ##121数据库 外网
-        #        url: jdbc:mysql://223.93.170.82:23606/qc?useUnicode=true&characterEncoding=utf8
-        #        username: root
-        #        password: QuGDHNG35r
-        ##190数据库 内网
-        #        url: jdbc:mysql://192.168.2.190:3306/qc?useUnicode=true&characterEncoding=utf8
-        #        username: root
-        #        password: lantone
+        password: QuGDHNG35r
         initial-size: 8
         min-idle: 1
         max-active: 20
@@ -47,4 +30,4 @@ mybatis-plus:
   configuration:
     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
-xml-is-encryped: true
+xml-is-encryped: false

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

@@ -37,7 +37,7 @@ public class BEH0005 extends QCCatalogue {
         if (chiefText.contains("检查") || chiefText.contains("术后") || chiefText.contains("药物")) {
             status.set("0");
         } else {
-            List<String> words = Lists.newArrayList("年", "月", "周", "天", "日", "时");
+            List<String> words = Lists.newArrayList("年", "月", "周", "天", "日", "时","分");
             String name;
             for (PD pd : pds) {
                 name = pd.getName();

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

@@ -45,7 +45,8 @@ public class BEH0006 extends QCCatalogue {
                     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("日") || pdName.contains("今")
+                                || pdName.contains("1年") || pdName.contains("一年")) {
                             status.set("0");
                             break;
                         }

+ 5 - 3
kernel/src/main/java/com/lantone/qc/kernel/catalogue/behospitalized/BEH0018.java

@@ -6,6 +6,7 @@ import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.OutputInfo;
 import com.lantone.qc.pub.model.entity.PD;
 import com.lantone.qc.pub.model.label.PresentLabel;
+import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -29,10 +30,11 @@ public class BEH0018 extends QCCatalogue {
         if (pds != null && pds.size() > 0) {
             for (PD pd : pds) {
                 String pdName = pd.getName();
-                if (!CatalogueUtil.isEmpty(pdName)) {
+                if (StringUtil.isNotBlank(pdName)) {
                     if (pdName.contains("天") || pdName.contains("周") || pdName.contains("月")
-                            || pdName.contains("时") || pdName.contains("半年") || pdName.contains("秒")
-                            || pdName.contains("日") || pdName.contains("今") || pdName.contains("余年") || isDate(pdName) || pdName.contains("年")) {
+                            || pdName.contains("时") || pdName.contains("秒") || pdName.contains("半年")
+                            || pdName.contains("日") || pdName.contains("今") || pdName.contains("余年")
+                            || pdName.contains("年") || pdName.contains("分") || isDate(pdName)) {
                         status.set("0");
                         break;
                     }

+ 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("颜色")|| text.contains("已绝经"))) {
+            if (StringUtil.isNotBlank(text) && (text.contains("未行经") || text.contains("颜色")|| text.contains("已绝经")|| text.contains("未来潮"))) {
                 status.set("0");
                 return;
             }

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

@@ -38,7 +38,7 @@ public class BEH0068 extends QCCatalogue {
             if (inputInfo.getBeHospitalizedDoc().getMenstrualLabel() != null) {
                 MenstrualLabel menstrualLabel = inputInfo.getBeHospitalizedDoc().getMenstrualLabel();
                 String text = menstrualLabel.getText();
-                if (StringUtil.isNotBlank(text) && text.contains("未行经")) {
+                if (StringUtil.isNotBlank(text) && (text.contains("未行经") || text.contains("未来潮"))) {
                     status.set("0");
                     return;
                 }

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

@@ -77,9 +77,16 @@ public class THR0127 extends QCCatalogue {
                 status.set("0");
                 return;
             }
+            String title = "";
+            /* 如果有手术记录,则取出第一次手术记录的主刀医师职称 */
+            String doctorTitle = CatalogueUtil.getDoctorTitle(inputInfo);
             for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
-                int directorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.director);
-                int dept_doctorNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.dept_doctor);
+                title = roundRecordEveryWeek.get(j);
+                if (title.contains("主刀")){
+                    title = title.replace("主刀",doctorTitle);
+                }
+                int directorNum = CatalogueUtil.appearNumber(title.split(","), Content.director);
+                int dept_doctorNum = CatalogueUtil.appearNumber(title.split(","), Content.dept_doctor);
                 if (directorNum + dept_doctorNum < 2) {
                     //每周无2次主任医师查房记录/科主任查房记录
                     status.set("-1");

+ 0 - 9
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR0128.java

@@ -97,15 +97,6 @@ public class THR0128 extends QCCatalogue {
                     return;
                 }
             }
-            for (int j = 0; j < roundRecordEveryWeek.size(); j++) {
-                int indicationsNum = CatalogueUtil.appearNumber(roundRecordEveryWeek.get(j).split(","), Content.attend);
-                if (indicationsNum < 3) {
-                    //每周无3次主治医师查房记录
-                    status.set("-1");
-                    info.set(lastWardDateRangeList.get(j));
-                    return;
-                }
-            }
         }
     }
 

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

@@ -46,7 +46,7 @@ public class THR0144 extends QCCatalogue {
         conditionRecord = StringUtil.isBlank(conditionRecord) ? "" : conditionRecord;
         treatmentPlan = StringUtil.isBlank(treatmentPlan) ? "" : treatmentPlan;
         //主任或主治查房 标题需要包含“主任”或“主治”,内容需要包含“出院”
-        if ((conditionRecord.contains("出院") || treatmentPlan.contains("出院"))
+        if ((conditionRecord.contains("出院") || treatmentPlan.contains("出院") || conditionRecord.contains("转上级医院"))
                 && StringUtil.isNotBlank(title)
                 && (CatalogueUtil.subTitle(title).contains(Content.attend) || CatalogueUtil.subTitle(title).contains(Content.director))) {
             status.set("0");

+ 31 - 12
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/BeHospitalizedAI.java

@@ -1,24 +1,39 @@
 package com.lantone.qc.kernel.structure.ai;
 
-import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.lantone.qc.kernel.client.CRFServiceClient;
-import com.lantone.qc.kernel.structure.ai.model.EntityEnum;
-import com.lantone.qc.kernel.structure.ai.model.Lemma;
-import com.lantone.qc.kernel.structure.ai.process.*;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessClinic;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessDiag;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessFamily;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessLis;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessMarital;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessMenses;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessPacs;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessPast;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessPersonal;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessVital;
 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.doc.BeHospitalizedDoc;
-import com.lantone.qc.pub.model.entity.*;
-import com.lantone.qc.pub.model.label.*;
-import com.lantone.qc.pub.model.vo.CRFVo;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.entity.Lis;
+import com.lantone.qc.pub.model.entity.Pacs;
+import com.lantone.qc.pub.model.entity.Vital;
+import com.lantone.qc.pub.model.label.ChiefLabel;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.FamilyLabel;
+import com.lantone.qc.pub.model.label.MaritalLabel;
+import com.lantone.qc.pub.model.label.MenstrualLabel;
+import com.lantone.qc.pub.model.label.PacsLabel;
+import com.lantone.qc.pub.model.label.PastLabel;
+import com.lantone.qc.pub.model.label.PersonalLabel;
+import com.lantone.qc.pub.model.label.PresentLabel;
 import com.lantone.qc.pub.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
@@ -110,19 +125,23 @@ public class BeHospitalizedAI extends ModelAI {
                 putContent(crfContent, medicalTextType.get(3), pacs_text, Content.pacs);//辅助检查(暂用主诉现病史模型,之后会新训练单独模型再做修改)
             }
             if (beHospitalizedDoc.getInitialDiagLabel().isCrfLabel()) {
-                if (StringUtil.isNotBlank(initial_diag_text)) {
+                if (StringUtil.isNotBlank(initial_diag_text) && CatalogueUtil.numberExist(initial_diag_text)) {
                     initial_diag_text = CatalogueUtil.removeBetweenWordSpace(initial_diag_text);
-                    putContent(crfContent, medicalTextType.get(6), initial_diag_text, Content.initial_diag);//初步诊断
                 }
+                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);
+                if (CatalogueUtil.numberExist(initial_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);
+                if (CatalogueUtil.numberExist(initial_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);

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

@@ -47,12 +47,16 @@ 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 = structureMap.get(Content.initial_diag);
+                if (CatalogueUtil.numberExist(initial_diag)) {
+                    initial_diag = CatalogueUtil.removeBetweenWordSpace(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 = firstCourseRecordDoc.getInitialDiagLabel().getText();
+                if (CatalogueUtil.numberExist(initial_diag)) {
+                    initial_diag = CatalogueUtil.removeBetweenWordSpace(firstCourseRecordDoc.getInitialDiagLabel().getText());
+                }
                 putContent(crfContent, medicalTextType.get(1), initial_diag, Content.initial_diag);
             }
 
@@ -60,12 +64,16 @@ 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 = structureMap.get("鉴别诊断");
+                if (CatalogueUtil.numberExist(diffDiag)) {
+                    diffDiag = CatalogueUtil.removeBetweenWordSpace(diffDiag);
+                }
                 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 = firstCourseRecordDoc.getDifferentialDiagLabel().getText();
+                if (CatalogueUtil.numberExist(diffDiag)) {
+                    diffDiag = CatalogueUtil.removeBetweenWordSpace(diffDiag);
+                }
                 putContent(crfContent, medicalTextType.get(1), diffDiag, "鉴别诊断");
             }
             //诊疗计划

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

@@ -49,8 +49,10 @@ 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 = leaveHospitalStructureMap.get(Content.dischargeDiag);
+                    if (CatalogueUtil.numberExist(dischargeDiag)) {
+                        dischargeDiag = CatalogueUtil.removeBetweenWordSpace(dischargeDiag);
+                    }
                     putContent(crfContent, medicalTextType.get(1), dischargeDiag, Content.dischargeDiag);
                 }
             }

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

@@ -3,9 +3,10 @@ package com.lantone.qc.kernel.util;
 import com.google.common.collect.ImmutableMap;
 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.doc.DoctorAdviceDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.model.entity.Diag;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.pub.util.SpringContextUtil;
@@ -295,12 +296,23 @@ public class CatalogueUtil {
     }
 
     /**
-     * 判断字符串是否仅包含数字
+     * 判断字符串是否  包含数字
      *
      * @param str
      * @return
      */
     public static boolean numbersOnly(String str) {
+        String regex = "^[0-9]+$";
+        return str.matches(regex);
+    }
+
+    /**
+     * 判断文本是否包含数字
+     *
+     * @param str
+     * @return
+     */
+    public static boolean numberExist(String str) {
         Pattern p = Pattern.compile("[0-9]");
         Matcher m = p.matcher(str);
         return m.find();
@@ -360,12 +372,49 @@ public class CatalogueUtil {
 
     /**
      * 去除两个中文字之间空格
+     *
      * @param str
      * @return
      */
-    public static String removeBetweenWordSpace(String str){
+    public static String removeBetweenWordSpace(String str) {
         Pattern pattern = Pattern.compile("(?<=[\\x{4e00}-\\x{9fa5}])\\s(?=[\\x{4e00}-\\x{9fa5}])");
         Matcher m = pattern.matcher(str);
         return m.replaceAll("");
     }
+
+    /**
+     * 获取主刀医师职称(取第一次取到的主刀医师职称)
+     *
+     * @param inputInfo
+     * @return
+     */
+    public static String getDoctorTitle(InputInfo inputInfo) {
+        String title = "";
+        RedisUtil redisUtil = SpringContextUtil.getBean("redisUtil");
+        Map<String, Object> surgeon = redisUtil.getJsonStringValue(KernelConstants.HOSPITAL_DOCTOR_MAP);
+        if (surgeon == null) {
+            return title;
+        }
+
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        for (OperationDoc operationDoc : operationDocs) {
+            OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+            if (operationRecordDoc == null) {
+                continue;
+            }
+            Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+            String chiefSurgeon = structureMap.get("主刀医师");
+            if (StringUtil.isBlank(chiefSurgeon)){
+                continue;
+            }
+            Map<String, String> doctor = (Map) surgeon.get(chiefSurgeon);
+            if (doctor == null){
+                continue;
+            }
+            title = doctor.get("professor");
+            break;
+        }
+
+        return title;
+    }
 }