Browse Source

Merge branch 'master' into dev/ez

wangsy 4 years ago
parent
commit
47d0453b18

+ 86 - 0
structure-center/src/main/java/com/lantone/structure/ai/ClinicalbloodAI.java

@@ -0,0 +1,86 @@
+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.CatalogueUtil;
+import com.lantone.common.util.StringUtil;
+import com.lantone.structure.ai.process.EntityProcessBlood;
+import com.lantone.structure.model.Content;
+import com.lantone.structure.model.InputInfo;
+import com.lantone.structure.client.CRFServiceClient;
+import com.lantone.structure.model.doc.ClinicalBloodDoc;
+import com.lantone.structure.model.label.ClinicalBloodLabel;
+
+import java.util.*;
+
+/**
+ * @ClassName : ClinicalbloodAI
+ * @Description : 输血记录
+ * @Author : wsy
+ * @Date: 2021-01-19 17:16
+ */
+public class ClinicalbloodAI extends ModelAI {
+
+    public static List<String> medicalTextType = Arrays.asList("Taizhou_blood_record");
+    public static String entityRelationObject = "entity_relation_object";
+    public static String outputs = "outputs";
+    public static String content = "content";
+    public static List<String> mapKey = Lists.newArrayList("病历内容");
+
+    public void medrec(InputInfo inputInfo, CRFServiceClient crfServiceClient) {
+        JSONArray crfContent = new JSONArray();
+        List<ClinicalBloodDoc> resultsDocs = inputInfo.getClinicalBloodDocs();
+        for (int i = 0; i < resultsDocs.size(); i++) {
+            Map<String, String> structureMap = resultsDocs.get(i).getStructureMap();
+            String content = CatalogueUtil.structureMapJoin(structureMap, mapKey);
+            putContent(crfContent, medicalTextType.get(0), content, Content.bloodRecord);
+        }
+
+        JSONObject midData = loadAI(crfContent, crfServiceClient);//crf返回数据
+
+        for (int i = 0; i < resultsDocs.size(); i++) {
+            if (midData.get(Content.bloodRecord) == null) {
+                continue;
+            }
+            ClinicalBloodDoc resultsDoc = resultsDocs.get(i);
+            ClinicalBloodLabel clinicalBloodLabel = putBloodRecordCrfData(midData.getJSONObject(Content.bloodRecord), inputInfo);
+            if (clinicalBloodLabel != null) {
+                resultsDoc.setClinicalBloodLabel(clinicalBloodLabel);
+            }
+        }
+    }
+
+
+    /**
+     * 处理输血记录
+     *
+     * @param jsonObject
+     */
+    public ClinicalBloodLabel putBloodRecordCrfData(JSONObject jsonObject, InputInfo inputInfo) {
+        ClinicalBloodLabel clinicalBloodLabel = new ClinicalBloodLabel();
+        if (jsonObject == null) {
+            return clinicalBloodLabel;
+        }
+        JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
+        if (aiOut == null) {
+            return clinicalBloodLabel;
+        }
+        EntityProcessBlood entityProcessBlood = new EntityProcessBlood();
+        clinicalBloodLabel = entityProcessBlood.extractEntity(aiOut);
+        return clinicalBloodLabel;
+    }
+
+    protected void putContent(JSONArray crfContent, String medicalTextType, String text, String sign) {
+        String move_text = CatalogueUtil.removeSpecialChar(text);
+        if (StringUtil.isEmpty(move_text)) {
+            return;
+        }
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("medical_text_type", medicalTextType);
+        detailContent.put("content", move_text);
+        detailContent.put("detail_title", sign);
+        detailContent.put("originalText", text);
+        crfContent.add(detailContent);
+    }
+}

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

@@ -35,7 +35,7 @@ public class ModelAI {
     protected JSONObject loadAI(JSONArray crfContent, CRFServiceClient crfServiceClient) {
         JSONArray data = null;
         String classname = this.getClass().getName();
-        if (data == null) {
+        if (data == null || data.size() == 0) {
             //存储CRF完整所需结构数据
             CRFVo crfVo = new CRFVo();
             crfVo.setData(crfContent);
@@ -49,6 +49,7 @@ public class ModelAI {
         return midData;
     }
 
+
     protected JSONObject loadEntity(JSONObject jsonObject, String entityRelationObject, String outputs, String content) {
         if (jsonObject == null) {
             return new JSONObject();

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

@@ -30,7 +30,12 @@ public enum EntityEnum {
     BETTER_FINDING("好转表现"), OUTCOME_TO_BETTER("转归情况-好转"), OUTCOME_CURE("转归情况-治愈"), POSITIVE_FINDING("阳性表现"),
     INSPECTION_ITEMS("检查项目"), DISCHARGE_MODE("出院方式"), LABORATORY_PACKAGE("实验室检查套餐"), LABORATORY_RESULTS("实验室检查结果"),
     AUXILIARY_EXAMINATION_RESULTS("辅检结果"), CONSUMPTION("用量-查房"), USAGE_WARD_ROUND("用法"), STOP("停用"),
-    REASONS_FOR_ANTIBIOTIC("抗生素使用原因"),CHECK_TIME("检查时间");
+    REASONS_FOR_ANTIBIOTIC("抗生素使用原因"), CHECK_TIME("检查时间"), INDICA_BLOOD("输血指征"), TYPE_BLOOD("输血类型"), AMOUNT_BLOOD("输血量"),
+    REASON_BLOOD("输血原因"), MEASURE_BLOOD("输血量计量单位"), START_TIME_BLOOD("输血开始时间"), END_TIME_BLOOD("输血结束时间"),
+    RESPONSE_TYPE_BLOOD("输血反应类型"), FREQUENCY_BLOOD("输血次数"), NEGATIVE_BLOOD("否认"), DRUG_NAME("药品"),DIAGNOSIS_NAME("疾病诊断名称"),
+    CONDITION("抢救病情"), OPERATION_OF_NAME("手术及操作名称"), OPERATION_OF_POSITION_NAME("手术及操作目标部位名称"), OPERATION_METHOD("操作方法"),
+    OPERATION_COUNT("操作次数"), AUXILIARY_TEST("辅检名称"), AUXILIARY_RESULT("辅检结果"),AUXILIARY_QUANTITATIVE("辅检定量结果"), SALVAGE_DRUG("抢救药品"),
+    INTERVENTION("介入物名称");
 
     private String value;
 

+ 104 - 0
structure-center/src/main/java/com/lantone/structure/ai/process/EntityProcessBlood.java

@@ -0,0 +1,104 @@
+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.entity.*;
+import com.lantone.structure.model.label.ClinicalBloodLabel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 输血记录处理
+ */
+public class EntityProcessBlood extends EntityProcess {
+    private Logger logger = LoggerFactory.getLogger(EntityProcessBlood.class);
+
+    public ClinicalBloodLabel extractEntity(JSONObject aiOut) {
+        ClinicalBloodLabel clinicalBloodLabel = new ClinicalBloodLabel();
+        try {
+            Blood blood = new Blood();
+            List<Blood> bloodList = new ArrayList<>();
+            //输血指征
+            List<Lemma> indicationBlood = createEntityTree(aiOut, EntityEnum.INDICA_BLOOD.toString());
+            for (Lemma lemma : indicationBlood) {
+                Indication indication = new Indication();
+                indication.setName(lemma.getText());
+                blood.setIndication(indication);
+            }
+
+            //输血类型
+            List<Lemma> typeBlood = createEntityTree(aiOut, EntityEnum.TYPE_BLOOD.toString());
+            for (Lemma lemma : typeBlood) {
+                Type type = new Type();
+                type.setName(lemma.getText());
+                Amount amount = new Amount();
+                if (lemma.isHaveChildren()) {
+                    for (Lemma relationLemma : lemma.getRelationLemmas()) {
+                        if (relationLemma.getProperty().equals(EntityEnum.AMOUNT_BLOOD.toString())) {
+                            amount.setName(relationLemma.getText());
+                            MeasurementUnit measurementUnit = new MeasurementUnit();
+                            for (Lemma measureLemma : relationLemma.getRelationLemmas()) {
+                                if (measureLemma.getProperty().equals(EntityEnum.MEASURE_BLOOD.toString())) {
+                                    measurementUnit.setName(measureLemma.getText());
+                                }
+                            }
+                            amount.setMeasurementUnit(measurementUnit);
+                        }
+                    }
+                }
+                type.setAmount(amount);
+                blood.setType(type);
+            }
+            //输血原因
+            List<Lemma> reasonBlood = createEntityTree(aiOut, EntityEnum.REASON_BLOOD.toString());
+            for (Lemma lemma : reasonBlood) {
+                Reason reason = new Reason();
+                reason.setName(lemma.getText());
+                blood.setReason(reason);
+            }
+            //输血开始时间
+            List<Lemma> startTimeBlood = createEntityTree(aiOut, EntityEnum.START_TIME_BLOOD.toString());
+            for (Lemma lemma : startTimeBlood) {
+                StartTime startTime = new StartTime();
+                startTime.setName(lemma.getText());
+                blood.setStartTime(startTime);
+            }
+            //输血结束时间
+            List<Lemma> endTimeBlood = createEntityTree(aiOut, EntityEnum.END_TIME_BLOOD.toString());
+            for (Lemma lemma : endTimeBlood) {
+                EndTime endTime = new EndTime();
+                endTime.setName(lemma.getText());
+                blood.setEndTime(endTime);
+            }
+
+            //输血反应类型
+            List<Lemma> responseTypeBlood = createEntityTree(aiOut, EntityEnum.RESPONSE_TYPE_BLOOD.toString());
+            List<ResponseType> responseTypeList = new ArrayList<>();
+            for (Lemma lemma : responseTypeBlood) {
+                ResponseType responseType = new ResponseType();
+                responseType.setName(lemma.getText());
+                responseType.setNegative(findT(lemma, new Negative(), EntityEnum.NEGATIVE_BLOOD.toString()));
+                responseTypeList.add(responseType);
+            }
+            blood.setResponseType(responseTypeList);
+            //输血次数
+            List<Lemma> frequencyBlood = createEntityTree(aiOut, EntityEnum.FREQUENCY_BLOOD.toString());
+            for (Lemma lemma : frequencyBlood) {
+                Frequency frequency = new Frequency();
+                frequency.setName(lemma.getText());
+                blood.setFrequency(frequency);
+            }
+            bloodList.add(blood);
+            clinicalBloodLabel.setBlood(bloodList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+        }
+        return clinicalBloodLabel;
+    }
+}

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

@@ -251,6 +251,10 @@ public class Content {
 
     public static final String timestamp = "timestamp";
 
+    public static final String bloodRecord = "输血记录";
+    public static final String stagesSummary = "阶段小结";
+    public static final String rescue = "抢救记录";
+
     public static String[] dateFormats = {
             "yyyy年MM月dd日HH时mm分",
             "yyyy年MM月dd日HH:mm",

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

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

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/Amount.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : Amount
+ * @Description : 输血量
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class Amount extends General {
+    private MeasurementUnit measurementUnit;//输血量计量单位
+}

+ 21 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/Blood.java

@@ -0,0 +1,21 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * 输血记录
+ */
+@Setter
+@Getter
+public class Blood extends General {
+    private Indication indication; //输血指征
+    private Type type;//输血类型
+    private Reason reason;//输血原因
+    private StartTime startTime;//输血开始时间
+    private EndTime endTime;//输血结束时间
+    private List<ResponseType> responseType;//输血反应类型
+    private Frequency frequency; //输血次数
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/EndTime.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : EndTime
+ * @Description : 输血结束时间
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class EndTime extends General {
+    
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/Indication.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : Indication
+ * @Description : 输血指征
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class Indication extends General {
+    
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/MeasurementUnit.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : MeasurementUnit
+ * @Description : 输血量计量单位
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class MeasurementUnit extends General {
+    
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/Reason.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : Reason
+ * @Description : 输血原因
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class Reason extends General {
+    
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/ResponseType.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : ResponseType
+ * @Description : 输血反应类型
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class ResponseType extends General {
+    private Negative negative;//否认 deny
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/StartTime.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : StartTime
+ * @Description : 输血开始时间
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class StartTime extends General {
+    
+}

+ 16 - 0
structure-center/src/main/java/com/lantone/structure/model/entity/Type.java

@@ -0,0 +1,16 @@
+package com.lantone.structure.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @ClassName : Type
+ * @Description : 输血类型
+ * @Author : wsy
+ * @Date: 2021-01-20 10:09
+ */
+@Setter
+@Getter
+public class Type extends General {
+    private Amount amount;//输血量
+}

+ 25 - 0
structure-center/src/main/java/com/lantone/structure/model/label/ClinicalBloodLabel.java

@@ -0,0 +1,25 @@
+package com.lantone.structure.model.label;
+
+import com.lantone.structure.model.entity.Blood;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName : ClinicalBloodLabel
+ * @Description :
+ * @Author : wsy
+ * @Date: 2021-01-20 9:51
+ */
+@Getter
+@Setter
+public class ClinicalBloodLabel {
+    //输血记录
+    private List<Blood> blood = new ArrayList<>();
+
+    public <T> void add(List<T> list, T obj) {
+        list.add(obj);
+    }
+}