Browse Source

Merge remote-tracking branch 'origin/dev/ez' into dev/ez

wangsy 4 years ago
parent
commit
ea6e10674a
16 changed files with 426 additions and 39 deletions
  1. 37 8
      structure-center/src/main/java/com/lantone/structure/ai/FirstCourseRecordAI.java
  2. 1 2
      structure-center/src/main/java/com/lantone/structure/ai/model/EntityEnum.java
  3. 42 0
      structure-center/src/main/java/com/lantone/structure/ai/process/EntityDailyCourseRecord.java
  4. 27 3
      structure-center/src/main/java/com/lantone/structure/ai/process/EntityProcessOperation.java
  5. 6 0
      structure-center/src/main/java/com/lantone/structure/facade/StructureFacade.java
  6. 7 4
      structure-center/src/main/java/com/lantone/structure/facade/tran/ConsultationTran.java
  7. 97 0
      structure-center/src/main/java/com/lantone/structure/facade/tran/DailyCourseRecordTran.java
  8. 4 7
      structure-center/src/main/java/com/lantone/structure/facade/tran/DeathRecordTran.java
  9. 1 1
      structure-center/src/main/java/com/lantone/structure/facade/tran/DutyShiftSystemTran.java
  10. 7 5
      structure-center/src/main/java/com/lantone/structure/facade/tran/LeaveHospitalTran.java
  11. 158 0
      structure-center/src/main/java/com/lantone/structure/facade/tran/OperationDiscussionTran.java
  12. 14 8
      structure-center/src/main/java/com/lantone/structure/facade/tran/PreoperativeDiscussionTran.java
  13. 6 1
      structure-center/src/main/java/com/lantone/structure/facade/tran/TransferRecordTran.java
  14. 1 0
      structure-center/src/main/java/com/lantone/structure/model/Content.java
  15. 2 0
      structure-center/src/main/java/com/lantone/structure/model/doc/DailyCourseRecordDoc.java
  16. 16 0
      structure-center/src/main/java/com/lantone/structure/model/label/DailyCourseRecordLabel.java

+ 37 - 8
structure-center/src/main/java/com/lantone/structure/ai/FirstCourseRecordAI.java

@@ -3,21 +3,18 @@ package com.lantone.structure.ai;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
+import com.lantone.common.util.ListUtil;
+import com.lantone.structure.ai.process.*;
 import com.lantone.structure.client.CRFServiceClient;
 import com.lantone.structure.client.SimilarityServiceClient;
-import com.lantone.structure.ai.process.EntityProcessClinic;
-import com.lantone.structure.ai.process.EntityProcessDiag;
-import com.lantone.structure.ai.process.EntityProcessDrug;
-import com.lantone.structure.ai.process.EntityProcessTreatPlan;
 import com.lantone.common.util.CatalogueUtil;
 import com.lantone.structure.model.Content;
 import com.lantone.structure.model.InputInfo;
+import com.lantone.structure.model.doc.DailyCourseRecordDoc;
 import com.lantone.structure.model.doc.FirstCourseRecordDoc;
 import com.lantone.structure.model.entity.Diag;
 import com.lantone.structure.model.entity.Drug;
-import com.lantone.structure.model.label.DrugLabel;
-import com.lantone.structure.model.label.PresentLabel;
-import com.lantone.structure.model.label.TreatPlanLabel;
+import com.lantone.structure.model.label.*;
 import com.lantone.common.util.StringUtil;
 import org.apache.commons.lang3.StringUtils;
 
@@ -36,7 +33,7 @@ public class FirstCourseRecordAI extends ModelAI {
      *
      */
     public static List<String> medicalTextType = Arrays.asList("FirstCoursera_cx", "Diagnoses_cx"
-            , "FirstCourseTreatment_cx", "CourseRecordSRR");
+            , "FirstCourseTreatment_cx", "CourseRecordSRR","Taizhou_before_surgery");
     public static String entityRelationObject = "entity_relation_object";
     public static String outputs = "outputs";
     public static String content = "content";
@@ -44,6 +41,20 @@ public class FirstCourseRecordAI extends ModelAI {
     public void medrec(InputInfo inputInfo, CRFServiceClient crfServiceClient, SimilarityServiceClient similarityServiceClient) {
         JSONArray crfContent = new JSONArray();
         JSONArray similarContent = new JSONArray();
+        List<DailyCourseRecordDoc> dailyCourseRecordDocs  = inputInfo.getDailyCourseRecordDocs();
+        if (ListUtil.isNotEmpty(dailyCourseRecordDocs)) {
+            DailyCourseRecordDoc dailyCourseRecordDoc = dailyCourseRecordDocs.get(0);
+            if (dailyCourseRecordDoc != null) {
+                String text = dailyCourseRecordDoc.getText();
+                if(text.contains("医嘱")){
+                    //title记得改!!!!Taizhou_before_surgery
+                    text = text.substring(text.indexOf("医嘱"),text.lastIndexOf(""));
+                    putContent(crfContent, medicalTextType.get(4), text, Content.doctorAdviceRecord);
+                    JSONObject midData = loadAI(crfContent, crfServiceClient);//crf返回数据
+                    dailyCourseRecordCrfData(midData.getJSONObject(Content.doctorAdviceRecord), inputInfo);
+                }
+            }
+        }
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
         if (firstCourseRecordDoc != null) {
             Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
@@ -187,6 +198,24 @@ public class FirstCourseRecordAI extends ModelAI {
         inputInfo.getFirstCourseRecordDoc().getInitialDiagLabel().setDiags(diags);
     }
 
+    /**
+     * 处理日常病程记录
+     *
+     * @param jsonObject
+     */
+    public void dailyCourseRecordCrfData(JSONObject jsonObject, InputInfo inputInfo) {
+        if (jsonObject == null) {
+            return;
+        }
+        JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
+        if (aiOut == null) {
+            return;
+        }
+        EntityDailyCourseRecord entityDailyCourseRecord = new EntityDailyCourseRecord();
+        DailyCourseRecordLabel dailyCourseRecordLabel = entityDailyCourseRecord.extractEntity(aiOut);
+        inputInfo.getDailyCourseRecordDocs().get(0).setDailyCourseRecordLabel(dailyCourseRecordLabel);
+    }
+
     /**
      * 诊断依据
      *

+ 1 - 2
structure-center/src/main/java/com/lantone/structure/ai/model/EntityEnum.java

@@ -41,8 +41,7 @@ public enum EntityEnum {
     CORD_AROUND_BODY("脐带绕身"), UTERINE_WALL_SUTURE("子宫壁缝合情况"), UC_AGENT("宫缩剂名称"), UC_CONSUMPTION("宫缩剂用量"), UC_USAGE_WARD_ROUND("宫缩剂用法"),
     UTERINE_CAVITY_ABNORMITY("宫腔探查异常情况描述"), UTERINE_CAVITY_DISPOSE("宫腔探查处理情况"), PUERPERA_CONDITION("手术时产妇情况"), HEMORRHAGE("术中出血"),
     FLUID_INFUSION("补液"),BLOOD_PRESSURE("血压情况"), NEWBORN("新生儿"), APGAR_SCORE("Apgar评分"), SCORE("分数"), CAPUT_SUCCEDANEUM("产瘤"),
-    CAPUT_SUCCEDANEUM_PART("产瘤部位"), OPE_DRUG("手术用药名称"), OPE_CONSUMPTION("手术用药量"), OPE_USAGE_WARD_ROUND("手术用药方法"), TRANSFUSION("输血成分"), DOCTORADVICE_RECORD("医嘱内容"), ASSESSMENTPLAN("诊疗计划"),ALLERGYRECORD("过敏史"),OPCONTRAINDICATION("手术禁忌"),OPBOTTOMNAME("手术目标部位");
-
+    CAPUT_SUCCEDANEUM_PART("产瘤部位"), OPE_DRUG("手术用药名称"), OPE_CONSUMPTION("手术用药量"), OPE_USAGE_WARD_ROUND("手术用药方法"), TRANSFUSION("输血成分"), DOCTORADVICE_RECORD("医嘱内容"), ASSESSMENTPLAN("诊疗计划"),ALLERGYRECORD("过敏史"),OPCONTRAINDICATION("手术禁忌"),OPBOTTOMNAME("手术目标部位"),DOCTORADVICERECORD("医嘱信息");
 
 
     private String value;

+ 42 - 0
structure-center/src/main/java/com/lantone/structure/ai/process/EntityDailyCourseRecord.java

@@ -0,0 +1,42 @@
+package com.lantone.structure.ai.process;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.lantone.structure.ai.model.EntityEnum;
+import com.lantone.structure.ai.model.Lemma;
+import com.lantone.structure.model.label.DailyCourseRecordLabel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+
+/**
+ * 处理日常病程记录
+ */
+public class EntityDailyCourseRecord extends EntityProcess {
+    private Logger logger = LoggerFactory.getLogger(EntityDailyCourseRecord.class);
+
+    public DailyCourseRecordLabel extractEntity(JSONObject aiOut) {
+        DailyCourseRecordLabel dailyCourseRecordLabel= new DailyCourseRecordLabel();
+        try {
+
+            //医嘱信息
+            StringBuffer sb = new StringBuffer();
+            int doctorAdvice = 0;
+            List<Lemma> doctorAdviceRecord = createEntityTree(aiOut, EntityEnum.DOCTORADVICERECORD.toString());
+            for (Lemma lemma : doctorAdviceRecord) {
+                doctorAdvice++;
+                if(doctorAdviceRecord.size()>1){
+                    sb.append(doctorAdvice+lemma.getText()+" ");
+                }else{
+                    sb.append(lemma.getText());
+                }
+            }
+            dailyCourseRecordLabel.setDoctorAdviceRecord(sb.toString());
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+        }
+        return dailyCourseRecordLabel;
+    }
+}

+ 27 - 3
structure-center/src/main/java/com/lantone/structure/ai/process/EntityProcessOperation.java

@@ -20,22 +20,46 @@ public class EntityProcessOperation extends EntityProcess {
         try {
 
             //过敏史
+            StringBuffer sbxx = new StringBuffer();
+            int allergy = 0;
             List<Lemma> indicationAllergy = createEntityTree(aiOut, EntityEnum.ALLERGYRECORD.toString());
             for (Lemma lemma : indicationAllergy) {
-                preoperativeDiscussionLabel.setAllergyRecord(lemma.getText());
+                allergy++;
+                if(indicationAllergy.size()>1){
+                    sbxx.append(allergy+lemma.getText()+" ");
+                }else{
+                    sbxx.append(lemma.getText());
+                }
             }
+            preoperativeDiscussionLabel.setAllergyRecord(sbxx.toString());
 
             //手术禁忌症
+            StringBuffer sbx = new StringBuffer();
+            int opContrain = 0;
             List<Lemma> indicationOpContrain = createEntityTree(aiOut, EntityEnum.OPCONTRAINDICATION.toString());
             for (Lemma lemma : indicationOpContrain) {
-                preoperativeDiscussionLabel.setOpContraindication(lemma.getText());
+                opContrain++;
+                if(indicationOpContrain.size()>1){
+                    sbx.append(opContrain+lemma.getText()+" ");
+                }else{
+                    sbx.append(lemma.getText());
+                }
             }
+            preoperativeDiscussionLabel.setOpContraindication(sbx.toString());
 
             //拟实施手术目标部位名称
+          StringBuffer sb = new StringBuffer();
+            int count = 0;
             List<Lemma> indicationOpBottom = createEntityTree(aiOut, EntityEnum.OPBOTTOMNAME.toString());
             for (Lemma lemma : indicationOpBottom) {
-                preoperativeDiscussionLabel.setOpBottomName(lemma.getText());
+                count++;
+                if(indicationOpBottom.size()>1){
+                    sb.append(count+lemma.getText()+" ");
+                }else{
+                    sb.append(lemma.getText());
+                }
             }
+            preoperativeDiscussionLabel.setOpBottomName(sb.toString());
         } catch (Exception e) {
             e.printStackTrace();
             logger.error(e.getMessage(), e);

+ 6 - 0
structure-center/src/main/java/com/lantone/structure/facade/StructureFacade.java

@@ -95,6 +95,12 @@ public class StructureFacade {
             case "术前讨论":
                 targetTran = new PreoperativeDiscussionTran();
                 break;
+            case "术后首次病程记录":
+                targetTran = new OperationDiscussionTran();
+                break;
+            case "日常病程记录":
+                targetTran = new DailyCourseRecordTran();
+                break;
             default:
                 break;
         }

+ 7 - 4
structure-center/src/main/java/com/lantone/structure/facade/tran/ConsultationTran.java

@@ -184,15 +184,18 @@ public class ConsultationTran extends TargetTran {
             //区别
             if(firSplit.length>0){
                 String deptStr = "";
-                for (int i = 0; i < 10; i++) {
+                for (int i = 0; i < firSplit.length; i++) {
                     String firStr = firSplit[i];
+                    if(firStr.contains("日期")){
+                         firStr = firStr.split("日期")[0];
+                    }
                     if(firStr.contains("请求")){
                          deptStr = firStr.substring(firStr.indexOf("请求")+"请求".length());
                     }
                     if(deptStr.contains(" ")){
                         String[] split = deptStr.split(" ");
-                        if(split.length>=2){
-                            deptStr = split[split.length-2];
+                        if(split.length>=2 && StringUtil.isNotEmpty(deptStr)){
+                            deptStr =deptStr.trim();
                         }
                     }
 
@@ -247,7 +250,7 @@ public class ConsultationTran extends TargetTran {
                 if(StringUtil.isEmpty(retMap.get("会诊目的")) || StringUtil.isEmpty(retMap.get("会诊理由")) && StringUtil.isNotEmpty(retMap.get("会诊理由及目的"))) {
                     String firStr = retMap.get("会诊理由及目的");
                     String specialName = retMap.get("会诊申请科室");
-                    if(firStr.contains(specialName)){
+                    if(StringUtil.isNotEmpty(firStr) && StringUtil.isNotEmpty(specialName) &&  firStr.contains(specialName)){
                          firStr = firStr.substring(0, firStr.lastIndexOf(specialName));
                         retMap.put("会诊目的",firStr);
                         retMap.put("会诊理由",firStr);

+ 97 - 0
structure-center/src/main/java/com/lantone/structure/facade/tran/DailyCourseRecordTran.java

@@ -0,0 +1,97 @@
+package com.lantone.structure.facade.tran;
+
+import com.lantone.common.util.StringUtil;
+import com.lantone.structure.model.doc.DailyCourseRecordDoc;
+import com.lantone.structure.model.label.DailyCourseRecordLabel;
+import lombok.extern.slf4j.Slf4j;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description:日常病程记录
+ * @author: cy
+ * @time: 2021/3/16 17:23
+ */
+@Slf4j
+public class DailyCourseRecordTran extends TargetTran {
+
+    @Override
+    public Map<String, String> convert(String text) {
+        List<DailyCourseRecordDoc> dailyCourseRecordDocs = new ArrayList<>();
+        DailyCourseRecordDoc dailyCourseRecordDoc  = new DailyCourseRecordDoc();
+        dailyCourseRecordDoc.setText(text);
+        dailyCourseRecordDocs.add(dailyCourseRecordDoc);
+        inputInfo.setDailyCourseRecordDocs(dailyCourseRecordDocs);
+        Map<String, String> structureMap = new HashMap<String, String>();
+        dailyCourseContrast(inputInfo.getDailyCourseRecordDocs(), structureMap);
+        dailyCourseRecordDoc.setStructureMap(structureMap);
+        aiProcess();
+        lastSovle(inputInfo.getDailyCourseRecordDocs(),structureMap);
+        return structureMap;
+    }
+
+    public void dailyCourseContrast(List<DailyCourseRecordDoc> dailyCourseRecordDocs,Map<String, String> retMap) {
+        String text = dailyCourseRecordDocs.get(0).getText();
+        String file = text;
+        retMap.put("住院病程",file);
+        String signDate = "签名日期";
+        if(file.contains("签字日期")){
+            signDate = "签字日期";
+        }
+        if(file.contains(signDate)){
+            String date = file.substring(file.lastIndexOf(signDate));
+            date = extractDate(date);
+            if(StringUtil.isNotEmpty(date)){
+                retMap.put("签名日期时间",date);
+            }
+        }
+        String signName= parseString(file);
+        if(StringUtil.isNotEmpty(signName)){
+            retMap.put("医师签名",signName);
+        }
+
+    }
+
+    public static void lastSovle(List<DailyCourseRecordDoc> dailyCourseRecordDocs , Map<String,String> rep) {
+        if(!dailyCourseRecordDocs.isEmpty() && dailyCourseRecordDocs.get(0)!=null && dailyCourseRecordDocs.get(0)
+                .getDailyCourseRecordLabel()!=null){
+            DailyCourseRecordLabel dailyCourseRecordLabel = dailyCourseRecordDocs.get(0).getDailyCourseRecordLabel();
+            String doctorAdviceRecord = dailyCourseRecordLabel.getDoctorAdviceRecord();
+            if(StringUtil.isNotEmpty(doctorAdviceRecord)){
+                rep.put("医嘱内容",doctorAdviceRecord);
+            }
+        }
+    }
+
+
+    /**
+     * 抽取文本中的第一个时间
+     *
+     * @param top
+     * @return
+     */
+    public static String extractDate (String top){
+        Pattern pattern = Pattern.compile("[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}");
+        Matcher matcher = pattern.matcher(top);
+        if (matcher.find()) {
+            return matcher.group(0);
+        } else {
+            Pattern p1 = Pattern.compile("[0-9]{4}年[0-9]+月[0-9]+日");
+            Matcher m1 = p1.matcher(top);
+            if (m1.find()) {
+                return m1.group(0);
+            }
+        }
+        return null;
+    }
+
+    // 取/后
+    public static String parseString(String text){
+        if(text.contains("/")){
+            text = text.substring(text.lastIndexOf("/")+1);
+            text= parseString(text);
+        }
+        return text;
+    }
+}

+ 4 - 7
structure-center/src/main/java/com/lantone/structure/facade/tran/DeathRecordTran.java

@@ -46,16 +46,13 @@ public class DeathRecordTran extends TargetTran {
         Map<String, String> sourceMap = Maps.newHashMap();
         List<String> titles = CommonAnalysisUtil.sortTitles(
                 //
-                Lists.newArrayList("姓名","性别","年龄","职业","入院日期","入院时间","入院诊断", "死亡日期","死亡时间","主    诉",
+                Lists.newArrayList("姓名","姓    名","性别","性    别","年龄","年    龄","业"," 职    业","入院日期","入院时间","入院诊断", "死亡日期","死亡时间","主    诉",
                         "住院天数","死亡诊断","最后诊断","入院情况","流行病史","表格<诊断>内容","诊疗经过", "治疗经过","抢救措施","死亡原因","死亡原因(包括死亡讨论结果)"),
                 text
         );
 
         CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
-        if(sourceMap.containsKey("性别")||sourceMap.containsKey("职业")||sourceMap.containsKey("住院天数")
-                ||sourceMap.containsKey("入院诊断")  ||sourceMap.containsKey("流行病史")  ||sourceMap.containsKey("补充诊断")){
-            sourceMap.remove("性别");
-            sourceMap.remove("职业");
+        if(sourceMap.containsKey("住院天数")||sourceMap.containsKey("入院诊断")  ||sourceMap.containsKey("流行病史")  ||sourceMap.containsKey("补充诊断")){
             sourceMap.remove("住院天数");
             sourceMap.remove("入院诊断");
             sourceMap.remove("流行病史");
@@ -262,7 +259,7 @@ public class DeathRecordTran extends TargetTran {
             if (StringUtil.isEmpty(retMap.get("入院时间"))) {
                 retMap.remove("入院时间");
             }
-            String text = deathRecordDoc.getText();
+      /*      String text = deathRecordDoc.getText();
             String[] split = text.split("\n");
             for (int i = 0; i < split.length; i++) {
                 if( split[i].contains("姓    名:")){
@@ -299,7 +296,7 @@ public class DeathRecordTran extends TargetTran {
                     }
                 }
 
-            }
+            }*/
         }
     }
 

+ 1 - 1
structure-center/src/main/java/com/lantone/structure/facade/tran/DutyShiftSystemTran.java

@@ -61,7 +61,7 @@ public class DutyShiftSystemTran extends TargetTran {
 
     public void dutyShiftSystemContrast ( List<DutyShiftSystemDoc> dutyShiftSystemDocs,Map<String, String> retMap) {
         String text = dutyShiftSystemDocs.get(0).getText();
-        String fir = text.split("\n")[1];
+        String fir = text;
         if(StringUtil.isNotEmpty(retMap.get("诊疗计划"))){
             String subStr = text.substring(text.indexOf("诊疗计划:")+"诊疗计划:".length());
             String planRet = retMap.get("诊疗计划");

+ 7 - 5
structure-center/src/main/java/com/lantone/structure/facade/tran/LeaveHospitalTran.java

@@ -137,17 +137,19 @@ public class LeaveHospitalTran extends TargetTran {
 
             }
 
-            if (StringUtil.isNotEmpty(retMap.get("首席医师").trim())) {
+            if (StringUtil.isNotEmpty(retMap.get("首席医师")) &&StringUtil.isNotEmpty(retMap.get("首席医师").trim())) {
                 String firDoctor = retMap.get("首席医师");
                 if(firDoctor.contains("经治/主治医师")){
-                    if(StringUtil.isNotEmpty( firDoctor.split("经治/主治医师")[0].trim())){
-                        firDoctor = firDoctor.split("经治/主治医师")[0].trim();
+                    String ote = firDoctor.split("经治/主治医师")[0];
+                    if(StringUtil.isNotEmpty(ote) && StringUtil.isNotEmpty(ote.trim())){
+                        firDoctor = ote.trim();
                         retMap.put("首席医师",firDoctor);
                     }else{
                         retMap.remove("首席医师");
                     }
-                    if(StringUtil.isNotEmpty( firDoctor.split("经治/主治医师")[1].trim())){
-                        String value = firDoctor.split("经治/主治医师")[1].trim();
+                    String otc = firDoctor.split("经治/主治医师")[1];
+                    if(StringUtil.isNotEmpty(otc) && StringUtil.isNotEmpty(otc.trim())){
+                        String value =otc.trim();
                         if(value.contains(":")){
                             value =  value.substring(value.indexOf(":")+1);
                         }

+ 158 - 0
structure-center/src/main/java/com/lantone/structure/facade/tran/OperationDiscussionTran.java

@@ -0,0 +1,158 @@
+package com.lantone.structure.facade.tran;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.common.util.StringUtil;
+import com.lantone.structure.facade.tran.util.CommonAnalysisUtil;
+import com.lantone.structure.model.doc.operation.OperationDiscussionDoc;
+import com.lantone.structure.model.doc.operation.OperationDoc;
+import com.lantone.structure.util.MapUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @Description:术后首次病程
+ * @author: cy
+ * @time: 2021/3/16 14:12
+ */
+@Slf4j
+public class OperationDiscussionTran extends TargetTran {
+
+    @Override
+    public Map<String, String> convert(String text) {
+         List<OperationDoc> operationDocs = new ArrayList<>();
+        OperationDoc operationDoc  = new OperationDoc();
+        OperationDiscussionDoc operationDiscussionDoc  = new OperationDiscussionDoc();
+        operationDiscussionDoc.setText(text);
+        operationDoc.setOperationDiscussionDoc(operationDiscussionDoc);
+        operationDocs.add(operationDoc);
+        inputInfo.setOperationDocs(operationDocs);
+        Map<String, String> structureMap = new HashMap<String, String>();
+        Map<String, String> retMap = new HashMap<String, String>();
+            structureMap = cutWord(text);
+        oDContrast(inputInfo.getOperationDocs(), structureMap);
+        mapKeyContrastCommon(structureMap,stagesContrasts,retMap);
+      //  preoperativeDiscussionDoc.setStructureMap(retMap);
+     //   aiProcess();
+    //    lastSovle(inputInfo.getOperationDocs(),retMap);
+        return retMap;
+    }
+
+    private Map<String, String> cutWord(String text) {
+        Map<String, String> sourceMap = Maps.newHashMap();
+        List<String> titles = CommonAnalysisUtil.sortTitles(
+                Lists.newArrayList("简要病情"),
+                text
+        );
+        CommonAnalysisUtil.cutByTitles(text, titles, 0, sourceMap);
+        if( sourceMap.containsKey("术前诊断")){
+            sourceMap.remove("术前诊断");
+        }
+        return sourceMap;
+    }
+
+    private List<String> stagesContrasts = Lists.newArrayList(
+            "手术指征=手术指征",
+            "手术指征=手术适应证"
+    );
+
+    public void oDContrast(List<OperationDoc> operationDocs,Map<String, String> retMap) {
+        String text = operationDocs.get(0).getOperationDiscussionDoc().getText();
+        if(text.contains("\n")){
+            String[] split = text.split("\n");
+            for (int i = 0; i < split.length; i++) {
+                if(i<=1){
+                    String date= extractDate(split[i]);
+                    if(StringUtil.isNotEmpty(date)){
+                        retMap.put("记录日期时间",date);
+                    }
+                }
+            }
+        }
+        if(text.contains("患者诊断")){
+            String sureStr = text.substring(text.indexOf("患者诊断") + "患者诊断".length());
+            if(sureStr.contains("禁忌症")){
+                sureStr = sureStr.substring(0,sureStr.indexOf("禁忌症"));
+            }
+            if(sureStr.contains("手术指征")){
+                sureStr = sureStr.substring(0,sureStr.indexOf("手术指征"));
+            }
+            if(sureStr.contains("明确")){
+                sureStr = sureStr.substring(0,sureStr.indexOf("明确"));
+            }
+            retMap.put("术后诊断名称",sureStr);
+        }
+        if(text.contains("注意观察")){
+            String sureStr = text.substring(text.indexOf("注意观察") + "注意观察".length());
+            if(sureStr.contains("。")){
+                sureStr = sureStr.split("。")[0];
+            }
+            retMap.put("注意事项",sureStr);
+        }
+        String signName= parseString(text);
+        if(StringUtil.isNotEmpty(signName)){
+            retMap.put("医师签名",signName);
+        }
+
+    }
+
+    public static void mapKeyContrastCommon(Map sourceMap, List<String> keyContrasts, Map<String, String> retMap) {
+        Map<String, String> sourceMap_ = MapUtil.copyMap(sourceMap);
+        String[] arry = null;
+        String sourceKey = null, targetKey;
+        Set<String> removeKey = new HashSet<>();
+        for (String keyContrast : keyContrasts) {
+            arry = keyContrast.split("=");
+            sourceKey = arry[0];
+            if (arry.length == 1) {
+                targetKey = arry[0];
+            } else {
+                targetKey = arry[1];
+            }
+            if (StringUtil.isNotBlank(sourceMap_.get(sourceKey))
+                    && (!retMap.containsKey(targetKey) || StringUtil.isBlank(retMap.get(targetKey)))) {
+                retMap.put(targetKey, sourceMap_.get(sourceKey));
+            }
+            removeKey.add(sourceKey);
+        }
+        Set<String> keySet = retMap.keySet();
+        for (String key : sourceMap_.keySet()) {
+            if (!keySet.contains(key) && !removeKey.contains(key)) { // 如果之前已放过key就不用放了
+                retMap.put(key, sourceMap_.get(key));
+            }
+        }
+    }
+
+    /**
+     * 抽取文本中的第一个时间
+     *
+     * @param top
+     * @return
+     */
+    public static String extractDate (String top){
+        Pattern pattern = Pattern.compile("[0-9]{4}[-][0-9]{1,2}[-][0-9]{1,2}");
+        Matcher matcher = pattern.matcher(top);
+        if (matcher.find()) {
+            return matcher.group(0);
+        } else {
+            Pattern p1 = Pattern.compile("[0-9]{4}年[0-9]+月[0-9]+日");
+            Matcher m1 = p1.matcher(top);
+            if (m1.find()) {
+                return m1.group(0);
+            }
+        }
+        return null;
+    }
+
+    // 取/后
+    public static String parseString(String text){
+        if(text.contains("/")){
+            text = text.substring(text.lastIndexOf("/")+1);
+            text= parseString(text);
+        }
+        return text;
+    }
+}

+ 14 - 8
structure-center/src/main/java/com/lantone/structure/facade/tran/PreoperativeDiscussionTran.java

@@ -32,7 +32,8 @@ public class PreoperativeDiscussionTran extends TargetTran {
         Map<String, String> structureMap = new HashMap<String, String>();
         Map<String, String> retMap = new HashMap<String, String>();
         Boolean falg = false;
-        if(text.split("\n")[0].contains("讨论记录")){
+        String file = text.split("\n")[0];
+        if(file.contains("讨论记录") || file.contains("术前讨论")){
             structureMap = cutWordRe(text);
             falg = true;
         }else{
@@ -67,12 +68,11 @@ public class PreoperativeDiscussionTran extends TargetTran {
     private Map<String, String> cutWordRe(String text) {
         Map<String, String> sourceMap = Maps.newHashMap();
         List<String> titleReplace = CommonAnalysisUtil.sortTitles(
-                Lists.newArrayList("讨论主持人","参加人员","术前诊断","讨论摘要","主持人总结"),
+                Lists.newArrayList("讨论时间","讨论地点","讨论主持人","参加人员","术前诊断","讨论摘要","主持人总结"),
                 text
         );
         CommonAnalysisUtil.cutByTitles(text, titleReplace, 0, sourceMap);
-        if(sourceMap.containsKey("讨论主持人")|| sourceMap.containsKey("术前诊断")){
-            sourceMap.remove("讨论主持人");
+        if(sourceMap.containsKey("术前诊断")){
             sourceMap.remove("术前诊断");
         }
         return sourceMap;
@@ -81,6 +81,8 @@ public class PreoperativeDiscussionTran extends TargetTran {
 
 
     private List<String> stagesContrasts = Lists.newArrayList(
+            "讨论时间=讨论日期时间",
+            "讨论主持人=主持人姓名",
             "手术指征=手术指征",
             "手术指征=手术适应证",
             "手术禁忌=手术禁忌症",
@@ -97,10 +99,14 @@ public class PreoperativeDiscussionTran extends TargetTran {
         String text = operationDocs.get(0).getPreoperativeDiscussionDoc().getText();
         if(flag == false){
         //小结日期时间
-        String sumdDate = extractDate(text);
-        if(StringUtil.isNotEmpty(sumdDate)){
-            retMap.put("小结日期时间",sumdDate);
-        }
+            if(text.contains("简要病情")){
+                String caseFile = text.substring(0,text.indexOf("简要病情:"));
+                String sumdDate = extractDate(caseFile);
+                if(StringUtil.isNotEmpty(sumdDate)){
+                    retMap.put("小结日期时间",sumdDate);
+                }
+            }
+
 
         //病历摘要   诊断依据
         if(StringUtil.isNotEmpty(retMap.get("简要病情"))) {

+ 6 - 1
structure-center/src/main/java/com/lantone/structure/facade/tran/TransferRecordTran.java

@@ -65,7 +65,12 @@ public class TransferRecordTran extends TargetTran {
     public void transferRecordContrast (TransferRecordDoc transferRecordDocs,Map<String, String> retMap) {
         //转入日期时间取第一时间
         String text = transferRecordDocs.getText();
-        String fir = text.split("\n")[1];
+        String fileName = "转入记录";
+        if(text.contains("转科记录")){
+            fileName = "转科记录";
+        }
+        String[] split = text.split(fileName);
+        String fir = split[0]+fileName;
         String planText = "";
         if(text.contains("转入诊疗计划:")){
             planText = text.substring( text.indexOf("转入诊疗计划:"));

+ 1 - 0
structure-center/src/main/java/com/lantone/structure/model/Content.java

@@ -252,6 +252,7 @@ public class Content {
     public static final String timestamp = "timestamp";
     public static final String  preoperativeDiscussion = "过敏、禁忌症";
     public static final String  surgicalSite = "手术目标部位";
+    public static final String  doctorAdviceRecord = "医嘱内容";
     public static final String bloodRecord = "输血记录";
     public static final String stagesSummary = "阶段小结";
     public static final String rescue = "抢救记录";

+ 2 - 0
structure-center/src/main/java/com/lantone/structure/model/doc/DailyCourseRecordDoc.java

@@ -1,5 +1,6 @@
 package com.lantone.structure.model.doc;
 
+import com.lantone.structure.model.label.DailyCourseRecordLabel;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -12,4 +13,5 @@ import lombok.Setter;
 @Setter
 @Getter
 public class DailyCourseRecordDoc extends ModelDoc {
+    DailyCourseRecordLabel dailyCourseRecordLabel;
 }

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/label/DailyCourseRecordLabel.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.label;
+import lombok.Getter;
+import lombok.Setter;
+
+
+/**
+ * @ClassName :
+ * @Description :
+ * @Author :
+ * @Date:
+ */
+@Getter
+@Setter
+public class DailyCourseRecordLabel extends GeneralLabel {
+   private String doctorAdviceRecord;//医嘱信息
+}