浏览代码

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

wangsy 3 年之前
父节点
当前提交
d7d1d435eb
共有 18 个文件被更改,包括 445 次插入109 次删除
  1. 9 9
      dbanaly/src/main/resources/application-local.yml
  2. 209 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/threelevelward/THR03116.java
  3. 70 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03235.java
  4. 7 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0351.java
  5. 4 4
      kernel/src/main/resources/bootstrap.yml
  6. 1 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisValueReportDocTrans.java
  7. 3 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstPageRecordDocTrans.java
  8. 1 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLeaveHospitalDocTrans.java
  9. 3 2
      trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOperationDocTrans.java
  10. 20 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunBeHospitalizedHtmlAnalysis.java
  11. 13 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathCaseDiscussHtmlAnalysis.java
  12. 7 6
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java
  13. 1 1
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunLeaveHospitalHtmlAnalysis.java
  14. 43 79
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunOperationInformedHtmlAnalysis.java
  15. 2 2
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunPreoperativeHtmlAnalysis.java
  16. 10 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunTransferIntoHtmlAnalysis.java
  17. 10 0
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunTransferOutHtmlAnalysis.java
  18. 32 2
      trans/src/main/java/com/lantone/qc/trans/xszyy/util/comsis/XszyyCommonAnalysisUtil.java

+ 9 - 9
dbanaly/src/main/resources/application-local.yml

@@ -5,9 +5,9 @@ spring:
     druid:
       lantone:
         driver-class-name: com.mysql.jdbc.Driver
-        url: jdbc:mysql://127.0.0.1:3306/qc?useUnicode=true&characterEncoding=utf8&useSSL=false
+        url: jdbc:mysql://192.168.0.195:3306/qc?useUnicode=true&characterEncoding=utf8&useSSL=false
         username: root
-        password: langtong
+        password: lantone
         initial-size: 8
         min-idle: 1
         max-active: 20
@@ -28,7 +28,7 @@ spring:
     database:
       cache: 10 # cache索引
       token: 10 # Token索引
-    host: 127.0.0.1  #Redis服务器地址
+    host: 192.168.0.196 #Redis服务器地址
     port: 6379 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
     password: lantone # Redis服务器连接密码(默认为空)
     lettuce:
@@ -39,19 +39,19 @@ spring:
         min-idle: 0 # 连接池中的最小空闲连接
     timeout: 20000 # 连接超时时间(毫秒)
 
-xml-is-encryped: true
+xml-is-encryped: false
 
 CRF:
-  url: http://127.0.0.1:13456/api/mr_info_ex/entity_predict
+  url: http://192.168.0.196:3456/api/mr_info_ex/entity_predict
 
 Similarity:
-  url: http://127.0.0.1:13456/api/mr_info_ex/similarity
+  url: http://192.168.0.196:3456/api/mr_info_ex/similarity
 
 NewSimilarity:
-  url: http://127.0.0.1:12323/api/similarity
+  url: http://192.168.0.196:23232/api/similarity
 
 NewBatchSimilarity:
-  url: http://127.0.0.1:12323/api/similarity_batch
+  url: http://192.168.0.196:23232/api/similarity_batch
 
 ChiefPresentSimilarity:
-  url: http://127.0.0.1:13456/api/mr_info_ex/chief_present_similarity
+  url: http://192.168.0.196:3456/api/mr_info_ex/chief_present_similarity

+ 209 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/hospital/xszyy/threelevelward/THR03116.java

@@ -0,0 +1,209 @@
+package com.lantone.qc.kernel.catalogue.hospital.xszyy.threelevelward;
+
+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.model.doc.*;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @ClassName : THE03116
+ * @Description: 病理检查缺少病理检查报告单
+ * @author: 贺聪聪
+ * @time: 2022/05/25 14:49
+ */
+
+@Component
+public class THR03116 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        boolean flag = false;
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
+        List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        //去医嘱
+        if (ListUtil.isNotEmpty(doctorAdviceDocs)) {
+            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
+                Map<String, String> dadStructureMap = dad.getStructureMap();
+                String daStatus = dadStructureMap.get(Content.doctorAdviceState);
+                if (StringUtil.isNotEmpty(daStatus)) {
+                    if (!Content.cancellationOrderList.contains(daStatus)) {
+                        String adviceType = dadStructureMap.get(Content.doctorAdviceType);
+                        //取临时医嘱
+                        if (StringUtil.isNotEmpty(adviceType) && adviceType.equals(Content.statOrder)) {
+                            String name = dadStructureMap.get(Content.medicalOrderName);
+                            if (exStr(name)) {
+                                flag = true;
+                                break;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        //用首页判断是否进行了病理检查
+        if(firstPageRecordDoc!=null){
+            String str = firstPageRecordDoc.getStructureMap().get("病理诊断费");
+            if ( !str.equals("0") && StringUtil.isNotEmpty(str)) {
+                double a = Double.parseDouble(str);
+                if ( a > Content.pathologicalFee) {
+                    flag=true;
+                }
+            }
+        }
+        //手术记录
+        if(ListUtil.isNotEmpty(operationDocs)){
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if(operationRecordDoc!=null) {
+                    String str = operationRecordDoc.getStructureMap().get("手术经过及处理");
+                    if (StringUtil.isNotEmpty(str)) {
+                        if (ssBlStr(str)) {
+                            flag = true;
+                        }
+                    }
+                }
+            }
+        }
+        List<PathologyShipDoc> pathologyShipDocs = inputInfo.getPathologyShipDocs();
+        if(ListUtil.isNotEmpty(pathologyShipDocs)){
+            flag=true;
+        }
+        if (flag) {
+            status.set("-1");
+            if (ListUtil.isNotEmpty(pacsDocs)) {
+                for (PacsDoc pacsDoc : pacsDocs) {
+                    Map<String, String> structureMap = pacsDoc.getStructureMap();
+                    String str = structureMap.get("检查所见");
+                    String str1 = structureMap.get("临床诊断");
+                    String str2 = structureMap.get("报告名称");
+                    String str3 = structureMap.get("观察记录");
+                    String str4 = structureMap.get("检查结果诊断");
+                    String str5 = structureMap.get("检查部位");
+                    if(dateStr(str)||dateStr(str1)||dateStr(str2)||dateStr(str3)||dateStr(str4)||str5.contains("病理")){
+                        status.set("0");
+                        return;
+                    }
+                }
+            }
+        }
+    }
+    private boolean dateStr(String string){
+        if(StringUtil.isEmpty(string)){
+            return false;
+        }
+        boolean flag=false;
+        String str = Str(string);
+        String rex="[\\s\\S]*(?=流式)[\\s\\S]*";
+        String rex1="[\\s\\S]*(?=穿透)[^,;,;。]{0,7}(?=层)[\\s\\S]*";
+        String rex2="[\\s\\S]*(?=癌)[^,;,;。]{0,7}(?=浸润)[\\s\\S]*";
+        String rex3="[\\s\\S]*(?=分化)[\\s\\S]*";
+        String rex4="[\\s\\S]*(?=淋巴结)[^,;,;。]{0,8}(?=转移)[\\s\\S]*";
+        String rex5="[\\s\\S]*(?=浸润性)[^,;,;。]{0,8}(?=癌)[\\s\\S]*";
+        String rex6="[\\s\\S]*(?=突破)[^,;,;。]{0,7}(?=层)[\\s\\S]*";
+        List<String> reportCardPathologyList = Content.reportCardPathologyList;
+        for (String reportCardPathology : reportCardPathologyList) {
+            if(string.contains(reportCardPathology)){
+                flag=true;
+            }
+        }
+        if(flag || str.matches(rex1)|| str.matches(rex2)
+                ||str.matches(rex3)|| str.matches(rex4)||str.matches(rex5)|| str.matches(rex6)|| str.matches(rex)){
+            return true;
+        }
+        return false;
+    }
+    private boolean ssBlStr(String string){
+        if(StringUtil.isEmpty(string)){
+            return false;
+        }
+        List<String> surgeryPathologyTwoList = Content.surgeryPathologyTwoList;
+        for (String surgeryPathologyTwo : surgeryPathologyTwoList) {
+            if(string.contains(surgeryPathologyTwo)){
+                return true;
+            }
+        }
+        String str = Str(string);
+        if(str.contains("冰冻")){
+            if(bdStr(str)){
+                return true;
+            }
+        }
+        return false;
+    }
+    private boolean exStr(String string){
+        if(StringUtil.isEmpty(string)){
+            return false;
+        }
+        String str = Str(string);
+        List<String> doctorAdvicePathologyList = Content.doctorAdvicePathologyList;
+        for (String doctorAdvicePathology : doctorAdvicePathologyList) {
+            if(string.contains(doctorAdvicePathology)){
+                return true;
+            }
+        }
+        if(str.contains("冰冻")){
+            if(bdStr(str)){
+                return true;
+            }
+        }
+        return false;
+    }
+    private String Str(String str){
+        str = str.replaceAll("\\*", "\\\\*");
+        str = str.replaceAll("\\)", "\\\\)");
+        str = str.replaceAll("\\.", "\\\\.");
+        str = str.replaceAll("\\?", "\\\\?");
+        str = str.replaceAll("\\+", "\\\\+");
+        str = str.replaceAll("\\$", "\\\\$");
+        str = str.replaceAll("\\^", "\\\\^");
+        str = str.replaceAll("\\[", "\\\\[");
+        str = str.replaceAll("\\]", "\\\\]");
+        str = str.replaceAll("\\(", "\\\\(");
+        str = str.replaceAll("\\{", "\\\\{");
+        str = str.replaceAll("\\}", "\\\\}");
+        str = str.replaceAll("\\|", "\\\\|");
+        str = str.replaceAll("\\/", "\\\\/");
+        return str;
+    }
+    //判断包含冰冻但不属于病理
+    private boolean bdStr(String str) {
+        ArrayList<String> blStrings = new ArrayList<>();
+        String rex1="[\\s\\S]{0,10}(?=冰冻)[\\s\\S]{0,10}";
+        Matcher matcher = Pattern.compile(rex1).matcher(str);
+        while (matcher.find()) {
+            String group = matcher.group();
+            blStrings.add(group);
+        }
+        List<String> notBLList = Content.notBDBLList;
+        if (ListUtil.isNotEmpty(blStrings)) {
+            for (String notBL : notBLList) {
+                for (int i = 0; i < blStrings.size(); i++) {
+                    String cfStr = blStrings.get(i);
+                    if (cfStr.contains(notBL)) {
+                        blStrings.remove(i);
+                        continue;
+                    }
+                }
+            }
+            if (blStrings.size() > 0) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 70 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03235.java

@@ -0,0 +1,70 @@
+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 com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author 贺聪聪
+ * @Description: 手术记录中手术日期填写错误
+ * @data 2022/5/24  10:42
+ */
+@Component
+public class OPE03235 extends QCCatalogue {
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+        if (operationDocs == null || operationDocs.size() == 0) {
+            return;
+        }
+        if (leaveHospitalDoc != null) {
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    return;
+                }
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String operationDayStr = structureMap.get("手术日期");
+                if (StringUtil.isBlank(operationDayStr)) {
+                    continue;
+                }
+                String operationDatesStr = operationDayStr.substring(0,10);//截取手术日期
+                String operationTimeStr = structureMap.get("开始时间").substring(0,5);//截取开始时间
+                String operationDateStr = operationDatesStr + " " + operationTimeStr;//拼接
+
+                String beginDateStr = leaveHospitalDoc.getStructureMap().get("入院日期");
+                String endDateStr = leaveHospitalDoc.getStructureMap().get("出院时间");
+                if (StringUtil.isBlank(beginDateStr) || StringUtil.isBlank(endDateStr) || StringUtil.isBlank(operationDateStr)) {
+                    return;
+                }
+                Date beginDate = StringUtil.parseDateTime(beginDateStr);
+                Date endDate = StringUtil.parseDateTime(endDateStr);
+                Date operationDate = StringUtil.parseDateTime(operationDateStr);
+
+                if (operationDate.before(beginDate) || operationDate.after(endDate)) {
+                    status.set("-1");
+                    return;
+                } else {
+                    return;
+                }
+            }
+        }
+    }
+}
+
+
+
+
+

+ 7 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE0351.java

@@ -50,6 +50,13 @@ public class OPE0351 extends QCCatalogue {
                         && (operationDoc.getOperationDiscussionDoc().getText().contains("°C")
                         || operationDoc.getOperationDiscussionDoc().getText().contains("次/分")
                         || operationDoc.getOperationDiscussionDoc().getText().contains("mmHg")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("体温")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("脉搏")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("呼吸")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("血压")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("血氧")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("瞳孔")
+                        || operationDoc.getOperationDiscussionDoc().getText().contains("角膜反射")
                 )) {
                     flag = true;
                 }

+ 4 - 4
kernel/src/main/resources/bootstrap.yml

@@ -1,5 +1,5 @@
 server:
-  port: 6010 # 端口号
+  port: 6012 # 端口号
   servlet:
     context-path: ${spring.application.name}  # 访问路径,如果不配置,访问IP:端口号,配置后访问IP:端口号/${context-path}
 
@@ -18,10 +18,10 @@ spring:
   resources:
     static-locations: classpath:/
   profiles:
-    active: test
+    active: local
 
 qc:
-  hospital_id: 1,2,3,4,5,6,7,8,10,11,13,15,20,34,35,36,37
+  hospital_id: 1,2,3,4,5,6,7,8,10,11,13,15,20,21,22,23,24,34,35,36
 
 logging:          # 日志
   config: classpath:logback-spring.xml
@@ -30,4 +30,4 @@ mybatis-plus:
   mapper-locations: classpath:/mapper/lt/*Mapper.xml
   type-aliases-package: com.lantone.qc.dbanaly.lt.entity
   configuration:
-    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunCrisisValueReportDocTrans.java

@@ -66,7 +66,7 @@ public class BeiLunCrisisValueReportDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "病情记录=病历内容",
+            "病情记录=病情分析及处理",
             "书写医师=记录医生"
     );
 

+ 3 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunFirstPageRecordDocTrans.java

@@ -8,6 +8,7 @@ import com.lantone.qc.pub.model.vo.MedrecVo;
 import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.pub.util.ListUtil;
 import com.lantone.qc.trans.ModelDocTrans;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
 
 import java.util.HashMap;
 import java.util.Iterator;
@@ -24,11 +25,13 @@ public class BeiLunFirstPageRecordDocTrans extends ModelDocTrans {
     @Override
     public FirstPageRecordDoc extract(MedrecVo medrecVo) {
         Map<String, String> content = (Map) medrecVo.getContent();
+        content.put("姓名", XszyyCommonAnalysisUtil.extracReplace(content.get("姓名")));
         FirstPageRecordDoc firstPageRecordDoc = new FirstPageRecordDoc();
         firstPageRecordDoc.setStructureMap(content);
 
         Map<String, Object> structureExtMap = Maps.newHashMap();
         structureExtMap.putAll(content);
+        structureExtMap.put("姓名", XszyyCommonAnalysisUtil.extracReplace(content.get("姓名")));
         structureExtMap.put(Content.diagnose_cts, FastJsonUtils.getJsonToBean(content.get(Content.diagnose_cts), Object.class));
         //        structureExtMap.put(Content.outpatientEmergencyDiag, FastJsonUtils.getJsonToBean(content.get(Content.outpatientEmergencyDiag), Object.class));
         structureExtMap.put(Content.operative_information, FastJsonUtils.getJsonToBean(content.get(Content.operative_information), Object.class));

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunLeaveHospitalDocTrans.java

@@ -66,7 +66,7 @@ public class BeiLunLeaveHospitalDocTrans extends ModelDocTrans {
     private List<String> keyContrasts = Lists.newArrayList(
             "入院时间=入院日期",
             "医师签名=记录医生",
-            "日期=医师签名日期"
+            "日期=医师签名日期","诊治经过=诊疗经过"
     );
 
 }

+ 3 - 2
trans/src/main/java/com/lantone/qc/trans/xszyy/BeiLunOperationDocTrans.java

@@ -254,7 +254,7 @@ public class BeiLunOperationDocTrans extends ModelDocTrans {
         } else {
             String recTitle = contentMap.get("recTitle").toString();
             String recTypeId = contentMap.get("recTypeId").toString();
-            BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunPreoperativeHtmlAnalysis();
+            BeiLunPreoperativeHtmlAnalysis beiLunHtmlAnalysis = new BeiLunPreoperativeHtmlAnalysis();
             Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
             if (MapUtils.isNotEmpty(sourceMap)) {
                 structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, preoperativeDiscussion_keyContrasts);
@@ -262,7 +262,8 @@ public class BeiLunOperationDocTrans extends ModelDocTrans {
                 structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
             }
         }
-        List<String> titles = Lists.newArrayList("讨论时间", "手术指征", "注意事项", "术前诊断", "医生签名", "风险及防范措施", "可替代方案", "术前准备", "参加人员");
+        List<String> titles = Lists.newArrayList("讨论时间", "手术指征", "注意事项", "术前诊断", "医生签名", "风险及防范措施",
+                "可替代方案", "术前准备", "参加人员");
         if (structureMap.containsKey("简要病情")) {
             String value = structureMap.get("简要病情").replaceAll("医师姓名", "").replaceAll("简要病情描述", "");
             structureMap.put("简要病情", value);

+ 20 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunBeHospitalizedHtmlAnalysis.java

@@ -46,7 +46,7 @@ public class BeiLunBeHospitalizedHtmlAnalysis implements BeiLunHtmlAnalysis {
 
     //一般模板
     private void analysisGeneral(Document doc, String recTitle, Map<String, String> map) {
-        List<String> titles = Lists.newArrayList("家长姓名","病区","床号","住院号码","病案号","住院号","入 院 记 录","住 院 大 病 历",
+        List<String> titles = Lists.newArrayList("家长姓名","病区","床号","住院号码","入 院 记 录","住 院 大 病 历",
                 "姓 名","职业", "职 业", "性 别", "入院日期","年 龄", "记录日期", "婚 姻","病史陈述者", "出生地","可靠程度",
                 "民 族","身份证号码","发病节气","病案号","单位或住址","主 诉","现病史","既往史","个人史","婚育史","家族史",
                 "入 院 诊 断","专项 评估","专项评估",
@@ -60,15 +60,34 @@ public class BeiLunBeHospitalizedHtmlAnalysis implements BeiLunHtmlAnalysis {
             //有冒号版本
             XszyyCommonAnalysisUtil.html2StructureMap(titles,htmlContent,map);
         }
+      /*  //拆分发病节气后面的病案号
+        if (map.containsKey("发病节气")&&map.get("发病节气").length()>4){
+            map.put("病案号",map.get("发病节气").substring(map.get("发病节气").indexOf("病"),map.get("发病节气").indexOf(map.get("发病节气").charAt((map.get("发病节气").length()-1)))+1));
+            map.put("发病节气",map.get("发病节气").substring(0,map.get("发病节气").indexOf(map.get("病案号"))));
+           // map.put("病案号",map.get("病案号").substring(map.get("发病节气").length(),map.get("病案号").length()));
+        }*/
         //书写医生中包含书写时间
         if(map.containsKey("书写医生")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医生"))!=null){
             map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医生")));
             map.put("书写医生",map.get("书写医生").substring(0,map.get("书写医生").indexOf(map.get("书写时间"))));
         }
+        //去掉所有空格
+        if(map.containsKey("姓名")&&map.get("姓名").length()>2){
+            map.put("姓名",XszyyCommonAnalysisUtil.extracReplace(map.get("姓名")));
+        }
+
         if(map.containsKey("医师签名")&&XszyyCommonAnalysisUtil.extractDate(map.get("医师签名"))!=null){
             map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("医师签名")));
             map.put("书写医生",map.get("医师签名").substring(0,map.get("医师签名").indexOf(map.get("书写时间"))));
         }
+        /**
+         *姓名后面的内容截取
+         */
+        if(map.get("姓名").length()>3){
+            map.put("家长姓名",map.get("姓名").substring(map.get("姓名").indexOf("家"),map.get("姓名").indexOf(map.get("姓名").charAt(map.get("姓名").length() - 1))+1));
+            map.put("姓名",map.get("姓名").substring(0,map.get("姓名").indexOf(map.get("家长姓名"))));
+        }
+
         if(map.containsKey("书写医师")&&XszyyCommonAnalysisUtil.extractDate(map.get("书写医师"))!=null){
             map.put("书写时间",XszyyCommonAnalysisUtil.extractDate(map.get("书写医师")));
             map.put("书写医生",map.get("书写医师").substring(0,map.get("书写医师").indexOf(map.get("书写时间"))));

+ 13 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunDeathCaseDiscussHtmlAnalysis.java

@@ -46,13 +46,25 @@ public class BeiLunDeathCaseDiscussHtmlAnalysis implements BeiLunHtmlAnalysis {
                 if(map.containsKey("死亡诊断") && map.get("死亡诊断").contains("主任医师")){
                     String swzd = map.get("死亡诊断");
                     map.put("死亡诊断",swzd.substring(0,swzd.indexOf("主任医师")));
-                    map.put("医师发言",swzd.substring(swzd.indexOf("主任医师")));
+                    map.put("医师发言",swzd.substring(swzd.indexOf("主任医师")+"主任医师:".length()));
                 }
                 //住院号包含死亡病例讨论记录
                 if(map.containsKey("住院号")&&map.get("住院号").contains("死亡病例讨论记录")){
                     String zyh = map.get("住院号");
                     map.put("住院号",zyh.substring(0,zyh.indexOf("死亡病例讨论记录")));
                 }
+                //主持人包含参加人员姓名及专业技术职称
+                if(map.containsKey("主持人")&&map.get("主持人").contains("参加人员姓名及专业技术职称")){
+                    String test = map.get("主持人");
+                    map.put("主持人",test.substring(0,test.indexOf("参加人员姓名及专业技术职称")));
+                    map.put("参加人员姓名及专业技术职称",test.substring(test.indexOf("参加人员姓名及专业技术职称")+"参加人员姓名及专业技术职称:".length()));
+                }
+                //医师发言包含主持人小结意见
+                if(map.containsKey("医师发言")&&map.get("医师发言").contains("主持人小结意见")){
+                    String test = map.get("医师发言");
+                    map.put("医师发言",test.substring(0,test.indexOf("主持人小结意见")));
+                    map.put("主持人小结意见",test.substring(test.indexOf("主持人小结意见")+"主持人小结意见:".length()));
+                }
             }
 
 

+ 7 - 6
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunFirstCourseRecordHtmlAnalysis.java

@@ -50,7 +50,7 @@ public class BeiLunFirstCourseRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
                 structureMap.put("病历内容",structureMap.get("病历内容").replace(":",":").replace(structureMap.get("病历日期"),""));
 
                 List<String> specialString = Lists.newArrayList(
-                        "无需其他特殊鉴别诊断","无需鉴别","无须鉴别"
+                        "诊断标准:","4.本病应同以下疾病鉴别:","5.鉴别诊断:","4、鉴别诊断:","鉴别诊断:"
                 );
                 if(StringUtil.isNotEmpty(structureMap.get("西医诊断依据及鉴别诊断"))){
                     String diag=structureMap.get("西医诊断依据及鉴别诊断");
@@ -60,13 +60,14 @@ public class BeiLunFirstCourseRecordHtmlAnalysis implements BeiLunHtmlAnalysis {
                         diag=diag.replace(structureMap.get("初步诊断"),"");
                     }
                     if(StringUtil.isEmpty(structureMap.get("西医诊断依据")) && StringUtil.isEmpty(structureMap.get("西医鉴别诊断"))){
+                        for (String specialC:specialString){
+                            if(diag.contains(specialC)){
+                                structureMap.put("西医鉴别诊断",diag.substring(diag.indexOf(specialC)));
+                                diag=diag.replace(structureMap.get("西医鉴别诊断"),"");
+                            }
+                        }
                         structureMap.put("西医诊断依据",diag);
                         structureMap.put("西医诊断依据及鉴别诊断","");
-                        /*for (String specialC:specialString){
-                            if(structureMap.get("西医诊断依据").contains(specialC)){
-                                structureMap.put("西医鉴别诊断","无需鉴别");
-                            }
-                        }*/
                     }
                 }
                 if(StringUtil.isNotEmpty(structureMap.get("拟诊讨论")) && StringUtil.isEmpty(structureMap.get("中医辨病辩证依据及鉴别诊断"))){

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunLeaveHospitalHtmlAnalysis.java

@@ -32,7 +32,7 @@ public class BeiLunLeaveHospitalHtmlAnalysis implements BeiLunHtmlAnalysis {
             Document doc = Jsoup.parse(html);
 
             List<String> titles = Lists.newArrayList("姓名","病区","床号","住院号","出 院 记 录",
-                    "入院时间","出院时间","住院天数","入院情况","入院诊断","诊治经过","出院情况","出院诊断","出院医嘱",
+                    "入院时间","出院时间","住院天数","入院情况","入院诊断","诊疗经过","诊治经过","出院情况","出院诊断","出院医嘱",
                     "患者或其授权人签字","医师签名","日期","出院温馨提示"
             );
             String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());

+ 43 - 79
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunOperationInformedHtmlAnalysis.java

@@ -5,6 +5,7 @@ import com.google.common.collect.Maps;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.xszyy.util.comsis.XszyyCommonAnalysisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -13,6 +14,8 @@ import org.jsoup.nodes.Document;
 
 import java.util.List;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @Description: 手术知情同意书html解析
@@ -26,99 +29,60 @@ public class BeiLunOperationInformedHtmlAnalysis implements BeiLunHtmlAnalysis {
 
     @Override
     public Map<String, String> analysis(String... args) {
-        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        Map<String, String> map = Maps.newLinkedHashMap();
         try {
-            List<String> titles = Lists.newArrayList(
-                    "术种使用的植入性材料或高值耗材及风险",
-                    "医师陈述",
-                    "患方签名",
-                    "签字时间",
-                    "签名时间");
             String html = args[0];
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
-            String htmlContent = XszyyHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), false);
+            List<String> titles = Lists.newArrayList("患者姓名","病区","床号","住院号",
+                    "术前诊断","拟施手术名称","术前准备及防范措施","医疗替代方案(不同治疗方案及手术方式)",
+                    "拒绝手术可能发生的后果","患者自身存在的高危因素","手术中可能出现的意外和风险","手术后可能出现的意外和并发症",
+                    "除上述情况外,本次手术还可能导致下列并发症","患方意见",
+                    "患者/法定监护人/被授权人签字","主刀医师签字","审批医师签字"
+            );
+            String htmlContent = XszyyCommonAnalysisUtil.html2String(doc.toString());
             if (StringUtil.isNotBlank(htmlContent)) {
-                htmlContent = htmlContent.replaceAll("[   ]", " ");
-                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
-            }
-            CommonAnalysisUtil.extractDateByTitle(structureMap, "记录时间");
-            for (String ignoreContrast : ignoreContrasts) {
-                if(structureMap.containsKey( ignoreContrast)){
-                    structureMap.remove(ignoreContrast);
+                //无冒号版本
+                XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
+                //住院号包含标题
+                if(map.containsKey("住院号")){
+                    Pattern pattern = Pattern.compile("[0-9]{1,}");
+                    Matcher matcher = pattern.matcher(map.get("住院号"));
+                    if (matcher.find()) {
+                        map.put("住院号",matcher.group(0));
+                    }
                 }
-            }
-
-            resultHandle(structureMap);
-            parseMethod(structureMap);
-            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
-        } catch (Exception e) {
-            log.error(e.getMessage(), e);
-        }
-        return structureMap;
-    }
-    private List<String>  ignoreContrasts = Lists.newArrayList(
-            "医师陈述",
-            "患方签名",
-            "签字时间",
-            "签名时间"
-    );
-
-    private void parseMethod(Map<String, String> result) {
-        if (result.containsKey("术种使用的植入性材料或高值耗材及风险") && StringUtils.isNotEmpty(result.get("术种使用的植入性材料或高值耗材及风险"))) {
-            Boolean flag= true;
-            String str = result.get("术种使用的植入性材料或高值耗材及风险");
-            if(str.contains("\uF0FE无") && str.contains("\uF06F有")){
-                result.put("术种使用的植入性材料或高值耗材及风险","false");
-                flag = false;
-            }
-            if(str.contains("\uF06F无") && str.contains("\uF0FE有")){
-             /*   str = str.split("\uF0FE有")[1];
-                str = str.replace(",",",").replace("。",",").replace("   ",",");
-                str = str.split(",")[0];
-                result.put("植入性材料",str);*/
-                result.put("术种使用的植入性材料或高值耗材及风险","true");
-                Boolean modelFlag = false;
-                for (String model : Content.MODELIST) {
-                    if(str.contains(model)){
-                        modelFlag = true;
-                        break;
+                //患者/法定监护人/被授权人签字存在日期
+                if(map.containsKey("患者/法定监护人/被授权人签字")&&map.get("患者/法定监护人/被授权人签字").contains("日期")){
+                    String targetText = map.get("患者/法定监护人/被授权人签字");
+                    map.put("患者/法定监护人/被授权人签字",targetText.substring(0,targetText.indexOf("日期")));
+                    if(XszyyCommonAnalysisUtil.extractDate(targetText)!=null){
+                        map.put("患方签名时间",XszyyCommonAnalysisUtil.extractDate(targetText));
                     }
                 }
-                Boolean numFlag = false;
-                for (String number : Content.NUMBERLIST) {
-                    if(str.contains(number)){
-                        numFlag = true;
-                        break;
+                //主刀医师签字存在日期
+                if(map.containsKey("主刀医师签字")&&map.get("主刀医师签字").contains("日期")){
+                    String targetText = map.get("主刀医师签字");
+                    map.put("主刀医师签字",targetText.substring(0,targetText.indexOf("日期")));
+                    if(XszyyCommonAnalysisUtil.extractDate(targetText)!=null){
+                        map.put("主刀医师签字日期",XszyyCommonAnalysisUtil.extractDate(targetText));
                     }
                 }
-                if(modelFlag && numFlag){
-                    result.put("型号和数量符合要求","true");
+                //审批医师签字存在日期
+                if(map.containsKey("审批医师签字")&&map.get("审批医师签字").contains("日期")){
+                    String targetText = map.get("审批医师签字");
+                    map.put("审批医师签字",targetText.substring(0,targetText.indexOf("日期")));
+                    if(XszyyCommonAnalysisUtil.extractDate(targetText)!=null){
+                        map.put("审批医师签字日期",XszyyCommonAnalysisUtil.extractDate(targetText));
+                    }
                 }
 
-                flag = false;
-            }
-            if(flag){
-                result.put("术种使用的植入性材料或高值耗材及风险","");
             }
-
-        }
-
-}
-
-    private void resultHandle(Map<String, String> result) {
-        if (MapUtils.isEmpty(result)) {
-            return;
+            XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
         }
-        result.forEach((key, value) -> {
-            if (StringUtil.isNotBlank(value)) {
-                value = StringUtil.trim(value);
-                if (value.endsWith(";") || value.endsWith(";")) {
-                    value = value.substring(0, value.length() - 1);
-                }
-                result.put(key, value);
-            }
-        });
+        return map;
     }
 }

+ 2 - 2
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunPreoperativeHtmlAnalysis.java

@@ -31,9 +31,9 @@ public class BeiLunPreoperativeHtmlAnalysis implements BeiLunHtmlAnalysis {
             String recTitle = args[1];
             String recTypeId = args[2];
             Document doc = Jsoup.parse(html);
-            List<String> titles = Lists.newArrayList("简要病情","术前诊断","手术指征","拟施手术名称和方式","拟施麻醉方式",
+            List<String> titles = Lists.newArrayList("简要病情","术前诊断","拟施手术名称和方式","拟施麻醉方式",
                     "注意事项","术者术前查房情况","书写医师","医师签名",
-                    "术前准备","麻醉方式","手术人员","手术方式",
+                    "麻醉方式","手术人员","手术方式",
                     "入院日期","入院时间","讨论日期","讨论时间","讨论地点","主 持 人","参加人员姓名及专业技术职称","参加人员","报告病史", "讨论记录","讨论意见内容记录","记录者签名","记录者",
                     "主持人签名","(4)可能出现的意外及防范措施","(3)手术方案","(2)术前准备","(1)手术指征","主持人小结意见","主持人小结"
             );

+ 10 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunTransferIntoHtmlAnalysis.java

@@ -39,6 +39,16 @@ public class BeiLunTransferIntoHtmlAnalysis implements BeiLunHtmlAnalysis {
                 //无冒号版本
                 XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
                 map.put("标题",recTitle);
+                if(map.containsKey("标题")&&XszyyCommonAnalysisUtil.extractDate(map.get("标题"))!=null){
+                    map.put("病历日期",XszyyCommonAnalysisUtil.extractDate(map.get("标题")));
+                    map.put("转科日期",XszyyCommonAnalysisUtil.extractDate(map.get("标题")));
+                }else{
+                    if(map.containsKey("转入日期")){
+                        map.put("病历日期",map.get("转入日期"));
+                        map.put("转科日期",map.get("转入日期"));
+                    }
+
+                }
             }
 
             XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);

+ 10 - 0
trans/src/main/java/com/lantone/qc/trans/xszyy/util/BeiLunTransferOutHtmlAnalysis.java

@@ -39,6 +39,16 @@ public class BeiLunTransferOutHtmlAnalysis implements BeiLunHtmlAnalysis {
                 //无冒号版本
                 XszyyCommonAnalysisUtil.html2StructureMapNoColon(titles,htmlContent,map);
                 map.put("标题",recTitle);
+                if(map.containsKey("标题")&&XszyyCommonAnalysisUtil.extractDate(map.get("标题"))!=null){
+                    map.put("病历日期",XszyyCommonAnalysisUtil.extractDate(map.get("标题")));
+                    map.put("转科日期",XszyyCommonAnalysisUtil.extractDate(map.get("标题")));
+                }else{
+                    if(map.containsKey("转入日期")){
+                        map.put("病历日期",map.get("转入日期"));
+                        map.put("转科日期",map.get("转入日期"));
+                    }
+
+                }
             }
 
             XszyyHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, map);

+ 32 - 2
trans/src/main/java/com/lantone/qc/trans/xszyy/util/comsis/XszyyCommonAnalysisUtil.java

@@ -209,8 +209,8 @@ public class XszyyCommonAnalysisUtil {
      * 标题没有冒号版本
      */
     public static void html2StructureMapNoColon(List<String> titles, String htmlText, Map<String, String> structureMap) {
-        List<String> sortTitlesNoColon = sortTitlesNoColon(titles, htmlText);
-        cutByTitlesNoColon(htmlText, sortTitlesNoColon, 0, structureMap);
+       List<String> sortTitlesNoColon = sortTitlesNoColons(titles, htmlText);
+       cutByTitlesNoColon(htmlText, sortTitlesNoColon, 0, structureMap);
     }
 
     /**
@@ -271,6 +271,27 @@ public class XszyyCommonAnalysisUtil {
         return titles;
     }
 
+    /**
+     * 标题没有冒号版本
+     */
+    public static List<String> sortTitlesNoColons(List<String> titles, String content) {
+        Map<Integer, String> titleIndex = new TreeMap<>();
+        int index;
+        for (String title : titles) {
+            index = content.indexOf(title);
+            if (index != -1) {
+                titleIndex.put(index, title);
+                String a = "";
+                for (int i = 0; i < title.length(); i++) {
+                    a += "*";
+                }
+                content = content.replace(title,a );
+            }
+        }
+        titles = Lists.newArrayList(titleIndex.values());
+        return titles;
+    }
+
     /**
      * 抽取文本中的第一个时间(萧山中医院)
      *
@@ -302,6 +323,15 @@ public class XszyyCommonAnalysisUtil {
         return null;
     }
 
+    /**
+     * 去掉字符串中的空格
+     * @param top
+     * @return
+     */
+    public static String extracReplace(String top) {
+        String replaceAll = top.replaceAll(" +", "");
+        return replaceAll;
+    }
     /**
      * 宁波中医院抽取文本中的第一个时间
      *