瀏覽代碼

规则优化

zhoutg 4 年之前
父節點
當前提交
6f308eec0f

+ 133 - 101
src/main/java/com/diagbot/facade/CommonFacade.java

@@ -117,8 +117,8 @@ public class CommonFacade {
         //模型处理数据
         aiAnalyze.aiProcess(searchData, wordCrfDTO);
 
-        // 处理现病史中的化验和辅检,放入结构化
-        processPresentLisPacs(wordCrfDTO);
+        // 统一处理化验、辅检、诊断,放入结构化
+        processLisPacsDiag(wordCrfDTO);
 
         // 现病史中体征内容放入体征标签
         processPresentVital(wordCrfDTO);
@@ -412,7 +412,12 @@ public class CommonFacade {
         }
     }
 
-    public void processPresentLisPacs(WordCrfDTO wordCrfDTO) {
+    /**
+     * 统一处理化验、辅检、诊断,放入结构化
+     *
+     * @param wordCrfDTO
+     */
+    public void processLisPacsDiag(WordCrfDTO wordCrfDTO) {
         DiagLabel diagLabel = wordCrfDTO.getDiagLabel();
         List<com.diagbot.model.entity.Diag> diags = diagLabel.getDiags();
         if (ListUtil.isNotEmpty(diags)) {
@@ -423,110 +428,35 @@ public class CommonFacade {
                 return i;
             }).collect(Collectors.toList()));
         }
-        PresentLabel presentLabel = wordCrfDTO.getPresentLabel();
-        List<com.diagbot.model.entity.Lis> lises = presentLabel.getLises();
         List<Lis> lisList = new ArrayList<>();
-        if (ListUtil.isNotEmpty(lises)) {
-            List<String> lisNames = lises.stream().map(x -> x.getBigItem().getName()).distinct().collect(Collectors.toList());
-            Map<String, Map<String, Map<String, Long>>> configMap = lisConfigFacade.getConfigMap(wordCrfDTO.getHospitalId(), lisNames, null);
-            if (configMap.size() > 0) {
-                lises.stream().forEach(x -> {
-                    String bigName = x.getBigItem().getName();//大项名
-                    String detailName = x.getName();//小项名
-                    String value = x.getPd().getValue();
-                    String unit = x.getPd().getUnit();
-                    if (configMap.containsKey(bigName)) {
-                        Map<String, Map<String, Long>> uniqueDetailMap = configMap.get(bigName);
-                        if (uniqueDetailMap.containsKey(detailName)) {
-                            List<String> uniques = uniqueDetailMap.get(detailName).keySet().stream().collect(Collectors.toList());//所有的公表项
-                            if (ListUtil.isNotEmpty(uniques)) {
-                                List<Lis> lisStream = uniques.stream().map(z -> {
-                                    return getLis(bigName, detailName, value, unit, z);
-                                }).collect(Collectors.toList());
-                                lisList.addAll(lisStream);
-                            }
-                        } else {
-                            Lis lis = getLis(bigName, detailName, value, unit, null);
-                            lisList.add(lis);
-                        }
-                    } else {
-                        Lis lis = getLis(bigName, detailName, value, unit, null);
-                        lisList.add(lis);
-                    }
-                });
-            } else {
-                lises.stream().forEach(x -> {
-                    Lis lis = getLis(x.getBigItem().getName(), x.getName(), x.getPd().getValue(), x.getPd().getUnit(), null);
-                    lisList.add(lis);
-                });
-            }
-        }
-        wordCrfDTO.getLis().addAll(lisList);
 
-        // 处理辅检信息,将现病史和结构化辅检统一放到pacsLable中
-        PacsLabel pacsLabel = wordCrfDTO.getPacsLabel();
-        List<Item> pacsResList = pacsLabel.getRes();
-        PacsLabel pacsPresentLabel = wordCrfDTO.getPresentLabel().getPacsLabel();
-        if (pacsPresentLabel != null) {
-            // 添加辅检项目名称
-            if (ListUtil.isNotEmpty(pacsPresentLabel.getItem())) {
-                pacsLabel.getItem().addAll(pacsPresentLabel.getItem());
-            }
-            // 添加辅检的诊断
-            if (ListUtil.isNotEmpty(pacsPresentLabel.getDisease())) {
-                pacsLabel.getDisease().addAll(pacsPresentLabel.getDisease());
-            }
-            // 添加辅检的描述
-            if (ListUtil.isNotEmpty(pacsPresentLabel.getPacsResults())) {
-                pacsLabel.getPacsResults().addAll(pacsPresentLabel.getPacsResults());
-            }
+        /**************************化验结构化处理开始*****************************/
+        // 处理主诉化验
+        getLisStruct(wordCrfDTO.getChiefLabel().getLises(), lisList, wordCrfDTO.getHospitalId());
+        // 处理现病史化验
+        getLisStruct(wordCrfDTO.getPresentLabel().getLises(), lisList, wordCrfDTO.getHospitalId());
+        // 统一放置化验结构
+        if (ListUtil.isNotEmpty(lisList)) {
+            wordCrfDTO.getLis().addAll(lisList);
         }
+        /*************************化验结构化处理结束******************************/
 
-        if (ListUtil.isNotEmpty(pacsLabel.getDisease())) {
-            for (Pacs pacs : pacsLabel.getDisease()) {
-                Item item = new Item();
-                item.setName(pacs.getName());
-                item.setUniqueName(pacs.getStandName());
-                pacsResList.add(item);
-            }
+        /**************************辅检结构化处理开始*****************************/
+        // 处理辅检信息
+        PacsLabel pacsLabel = wordCrfDTO.getPacsLabel();
+        // 处理主诉辅检
+        getPacsStruct(pacsLabel, wordCrfDTO.getChiefLabel().getPacsLabel());
+        // 处理现病史辅检
+        getPacsStruct(pacsLabel, wordCrfDTO.getPresentLabel().getPacsLabel());
+        // 辅检结果去重
+        if (ListUtil.isNotEmpty(pacsLabel.getRes())) {
+            dealMsgWithItem(pacsLabel.getRes());
         }
-        // 添加辅检的描述
-        if (ListUtil.isNotEmpty(pacsLabel.getPacsResults())) {
-            for (Pacs pacs : pacsLabel.getPacsResults()) {
-                Item item = new Item();
-                item.setName(pacs.getName());
-                item.setUniqueName(pacs.getStandName());
-                pacsResList.add(item);
-                // 部位 + 描述循环放入
-                for (BodyPart bodyPart : pacs.getBodyPartList()) {
-                    Item itemPart = new Item();
-                    itemPart.setName(bodyPart.getName() + pacs.getName());
-                    itemPart.setUniqueName(bodyPart.getStandName() + pacs.getStandName());
-                    pacsResList.add(itemPart);
-                }
-
-                // 描述 + 修饰、 修饰 + 描述 循环放入
-                for (Modification modification : pacs.getModification()) {
-                    Item itemModification = new Item();
-                    itemModification.setName(pacs.getName() + modification.getName());
-                    itemModification.setUniqueName(pacs.getStandName() + modification.getStandName());
-                    pacsResList.add(itemModification);
-
-                    Item itemModificationRe = new Item();
-                    itemModificationRe.setName(modification.getName() + pacs.getName());
-                    itemModificationRe.setUniqueName(modification.getStandName() + pacs.getStandName());
-                    pacsResList.add(itemModificationRe);
-                }
-            }
-
-            // 辅检项目去重
-            if (ListUtil.isNotEmpty(pacsLabel.getRes())) {
-                dealMsgWithItem(pacsLabel.getRes());
-            }
-            if (ListUtil.isNotEmpty(pacsLabel.getItem())) {
-                dealMsgWithItem(pacsLabel.getItem());
-            }
+        // 辅检名称去重
+        if (ListUtil.isNotEmpty(pacsLabel.getItem())) {
+            dealMsgWithItem(pacsLabel.getItem());
         }
+        /*************************辅检结构化处理结束******************************/
 
         //处理辅检
         // List<com.diagbot.biz.push.entity.Pacs> pacs = new ArrayList<>();
@@ -583,6 +513,108 @@ public class CommonFacade {
         // pacsLabel.getPacsNewList().addAll(packagePacs);
     }
 
+
+    public void getPacsStruct(PacsLabel res, PacsLabel dealPacsLabel) {
+        List<Item> pacsResList = res.getRes();
+        if (dealPacsLabel != null) {
+            // 添加辅检项目名称
+            if (ListUtil.isNotEmpty(dealPacsLabel.getItem())) {
+                res.getItem().addAll(dealPacsLabel.getItem());
+            }
+            // 添加辅检的诊断
+            if (ListUtil.isNotEmpty(dealPacsLabel.getDisease())) {
+                res.getDisease().addAll(dealPacsLabel.getDisease());
+            }
+            // 添加辅检的描述
+            if (ListUtil.isNotEmpty(dealPacsLabel.getPacsResults())) {
+                res.getPacsResults().addAll(dealPacsLabel.getPacsResults());
+            }
+        }
+
+        if (ListUtil.isNotEmpty(res.getDisease())) {
+            for (Pacs pacs : res.getDisease()) {
+                Item item = new Item();
+                item.setName(pacs.getName());
+                item.setUniqueName(pacs.getStandName());
+                pacsResList.add(item);
+            }
+        }
+        // 添加辅检的描述
+        if (ListUtil.isNotEmpty(res.getPacsResults())) {
+            for (Pacs pacs : res.getPacsResults()) {
+                Item item = new Item();
+                item.setName(pacs.getName());
+                item.setUniqueName(pacs.getStandName());
+                pacsResList.add(item);
+                // 部位 + 描述循环放入
+                for (BodyPart bodyPart : pacs.getBodyPartList()) {
+                    Item itemPart = new Item();
+                    itemPart.setName(bodyPart.getName() + pacs.getName());
+                    itemPart.setUniqueName(bodyPart.getStandName() + pacs.getStandName());
+                    pacsResList.add(itemPart);
+                }
+
+                // 描述 + 修饰、 修饰 + 描述 循环放入
+                for (Modification modification : pacs.getModification()) {
+                    Item itemModification = new Item();
+                    itemModification.setName(pacs.getName() + modification.getName());
+                    itemModification.setUniqueName(pacs.getStandName() + modification.getStandName());
+                    pacsResList.add(itemModification);
+
+                    Item itemModificationRe = new Item();
+                    itemModificationRe.setName(modification.getName() + pacs.getName());
+                    itemModificationRe.setUniqueName(modification.getStandName() + pacs.getStandName());
+                    pacsResList.add(itemModificationRe);
+                }
+            }
+        }
+    }
+
+    /**
+     * 获取化验的结构
+     *
+     * @param lises
+     * @param lisList
+     * @param hospitalId
+     */
+    public void getLisStruct(List<com.diagbot.model.entity.Lis> lises, List<Lis> lisList, Long hospitalId) {
+        if (ListUtil.isNotEmpty(lises)) {
+            List<String> lisNames = lises.stream().map(x -> x.getBigItem().getName()).distinct().collect(Collectors.toList());
+            Map<String, Map<String, Map<String, Long>>> configMap = lisConfigFacade.getConfigMap(hospitalId, lisNames, null);
+            if (configMap.size() > 0) {
+                lises.stream().forEach(x -> {
+                    String bigName = x.getBigItem().getName();//大项名
+                    String detailName = x.getName();//小项名
+                    String value = x.getPd().getValue();
+                    String unit = x.getPd().getUnit();
+                    if (configMap.containsKey(bigName)) {
+                        Map<String, Map<String, Long>> uniqueDetailMap = configMap.get(bigName);
+                        if (uniqueDetailMap.containsKey(detailName)) {
+                            List<String> uniques = uniqueDetailMap.get(detailName).keySet().stream().collect(Collectors.toList());//所有的公表项
+                            if (ListUtil.isNotEmpty(uniques)) {
+                                List<Lis> lisStream = uniques.stream().map(z -> {
+                                    return getLis(bigName, detailName, value, unit, z);
+                                }).collect(Collectors.toList());
+                                lisList.addAll(lisStream);
+                            }
+                        } else {
+                            Lis lis = getLis(bigName, detailName, value, unit, null);
+                            lisList.add(lis);
+                        }
+                    } else {
+                        Lis lis = getLis(bigName, detailName, value, unit, null);
+                        lisList.add(lis);
+                    }
+                });
+            } else {
+                lises.stream().forEach(x -> {
+                    Lis lis = getLis(x.getBigItem().getName(), x.getName(), x.getPd().getValue(), x.getPd().getUnit(), null);
+                    lisList.add(lis);
+                });
+            }
+        }
+    }
+
     private Lis getLis(String bigName, String detailName, String value, String unit, String uniqueName) {
         Lis lis = new Lis();
         lis.setUnits(unit);

+ 50 - 24
src/main/java/com/diagbot/model/ai/BeHospitalizedAI.java

@@ -47,7 +47,6 @@ public class BeHospitalizedAI extends ModelAI {
 
 
     /**
-     *
      * 类型       模型
      * 主诉	      主诉-现病史模型
      * 现病史	  主诉-现病史模型
@@ -58,11 +57,10 @@ public class BeHospitalizedAI extends ModelAI {
      * 月经史	  个人史模型
      * 体征	      体征模型
      * 诊断	      诊断模型
-     *
+     * <p>
      * 化验       化验模型     已结构化,未使用
      * 辅检	      辅检模型     已结构化,未使用
      *
-     *
      * @param inputInfo
      * @param wordCrfDTO
      * @param crfServiceClient
@@ -79,7 +77,7 @@ public class BeHospitalizedAI extends ModelAI {
                     chiefLabel.setText(chiefText);
                     chiefLabel.setAiText(chiefText);
                     wordCrfDTO.setChiefLabel(chiefLabel);
-                    putContent(crfContent, medicalTextType.get(7), chiefText, Content.chief);/* 2020-06-08修改主诉模型为现病史模型 */
+                    putContent(crfContent, medicalTextType.get(5), chiefText, Content.chief);
                 }
             }
             /* 现病史 */
@@ -140,12 +138,12 @@ public class BeHospitalizedAI extends ModelAI {
                 putContent(crfContent, medicalTextType.get(1), familyText, Content.family);
             }
             /* 辅检 */
-            if(ListUtil.isNotEmpty(inputInfo.getPacs())){
+            if (ListUtil.isNotEmpty(inputInfo.getPacs())) {
                 PacsLabel pacsLabel = new PacsLabel();
                 StringBuffer sb = new StringBuffer();
                 // 编辑结构化数据一次调用
                 for (com.diagbot.biz.push.entity.Pacs pacs : inputInfo.getPacs()) {
-                    sb.append(StringUtils.isNotBlank(pacs.getUniqueName())? pacs.getUniqueName() + ":":pacs.getName()+ ":").append(pacs.getResult() + "。");
+                    sb.append(StringUtils.isNotBlank(pacs.getUniqueName()) ? pacs.getUniqueName() + ":" : pacs.getName() + ":").append(pacs.getResult() + "。");
                 }
                 // List<PacsNew> collect = inputInfo.getPacs().stream().map(x -> {
                 //     PacsNew pacsNew = new PacsNew();
@@ -200,7 +198,7 @@ public class BeHospitalizedAI extends ModelAI {
                 }
             }
             /*
-            *//* 修正诊断 *//*
+             *//* 修正诊断 *//*
             if (beHospitalizedDoc.getRevisedDiagLabel() != null && beHospitalizedDoc.getRevisedDiagLabel().isCrfLabel()) {
                 String revisedDiagText = beHospitalizedDoc.getRevisedDiagLabel().getText();
                 *//*if (CatalogueUtil.numberExist(initial_diag_text)) {
@@ -219,7 +217,7 @@ public class BeHospitalizedAI extends ModelAI {
             // CRF处理
             JSONObject midData = null;
             try {
-                 midData = loadAI(crfContent, crfServiceClient);
+                midData = loadAI(crfContent, crfServiceClient);
             } catch (Exception e) {
                 throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "CRF模型【服务器】挂了!" + e.getMessage());
             }
@@ -228,7 +226,7 @@ public class BeHospitalizedAI extends ModelAI {
                 putChiefCrfData(midData.getJSONObject(Content.chief), wordCrfDTO);
             }
             /* 处理现病史 */
-            if (StringUtil.isNotBlank(wordCrfDTO.getPresentLabel().getText()) ) {
+            if (StringUtil.isNotBlank(wordCrfDTO.getPresentLabel().getText())) {
                 putPresentCrfData(midData.getJSONObject(Content.present), wordCrfDTO);
             }
             /* 处理既往史 */
@@ -251,7 +249,7 @@ public class BeHospitalizedAI extends ModelAI {
             if (StringUtil.isNotBlank(wordCrfDTO.getMaritalLabel().getText())) {
                 putMaritalCrfData(midData.getJSONObject(Content.marriage), wordCrfDTO);
             }
-             //处理初步诊断
+            //处理初步诊断
             if (StringUtil.isNotBlank(wordCrfDTO.getDiagLabel().getText())) {
                 putInitialDiagCrfData(midData.getJSONObject(Content.initial_diag), wordCrfDTO);
             }
@@ -272,12 +270,31 @@ public class BeHospitalizedAI extends ModelAI {
                 putPacsCrfData(midData.getJSONObject(Content.pacs), wordCrfDTO);
             }*/
             // 处理辅检
-            if(StringUtil.isNotBlank(wordCrfDTO.getPacsLabel().getText())) {
+            if (StringUtil.isNotBlank(wordCrfDTO.getPacsLabel().getText())) {
                 putInitialPacsCrfData(midData.getJSONObject(Content.pacs), wordCrfDTO.getPacsLabel());
             }
         }
     }
 
+    // public void putChiefCrfData(JSONObject jsonObject, WordCrfDTO wordCrfDTO) {
+    //     if (jsonObject == null) {
+    //         return;
+    //     }
+    //     JSONObject aiOut = jsonObject.getJSONObject(entityRelationObject).getJSONObject(BeHospitalizedAI.outputs);
+    //     if (aiOut == null) {
+    //         return;
+    //     }
+    //     //使用现病史结构
+    //     EntityProcessClinic entityProcessClinic = new EntityProcessClinic();
+    //     PresentLabel presentLabel = entityProcessClinic.extractEntity(aiOut);
+    //
+    //
+    //     ChiefLabel chiefLabel = wordCrfDTO.getChiefLabel();
+    //     chiefLabel.setClinicals(presentLabel.getClinicals());
+    //     chiefLabel.setDiags(presentLabel.getDiags());
+    //     chiefLabel.setPds(presentLabel.getPds());
+    // }
+
     public void putChiefCrfData(JSONObject jsonObject, WordCrfDTO wordCrfDTO) {
         if (jsonObject == null) {
             return;
@@ -286,15 +303,23 @@ public class BeHospitalizedAI extends ModelAI {
         if (aiOut == null) {
             return;
         }
-        //使用现病史结构
+
+        //放置入inputinfo
         EntityProcessClinic entityProcessClinic = new EntityProcessClinic();
-        PresentLabel presentLabel = entityProcessClinic.extractEntity(aiOut);
+        ChiefLabel chiefLabel = entityProcessClinic.extractEntity_chief(aiOut);
 
+        chiefLabel.setText(wordCrfDTO.getChiefLabel().getText());
+        List<Lis> lis = loadLises(aiOut);
+        chiefLabel.setLises(lis);
 
-        ChiefLabel chiefLabel = wordCrfDTO.getChiefLabel();
-        chiefLabel.setClinicals(presentLabel.getClinicals());
-        chiefLabel.setDiags(presentLabel.getDiags());
-        chiefLabel.setPds(presentLabel.getPds());
+        EntityProcessPacs entityProcessPacs = new EntityProcessPacs();
+        PacsLabel pacsLabel = chiefLabel.getPacsLabel();
+        if (pacsLabel == null) {
+            pacsLabel = new PacsLabel();
+            chiefLabel.setPacsLabel(pacsLabel);
+        }
+        entityProcessPacs.extractEntity(aiOut, pacsLabel);
+        wordCrfDTO.setChiefLabel(chiefLabel);
     }
 
     public void putPresentCrfData(JSONObject jsonObject, WordCrfDTO wordCrfDTO) {
@@ -317,11 +342,11 @@ public class BeHospitalizedAI extends ModelAI {
 
         EntityProcessPacs entityProcessPacs = new EntityProcessPacs();
         PacsLabel pacsLabel = presentLabel.getPacsLabel();
-        if(pacsLabel == null){
+        if (pacsLabel == null) {
             pacsLabel = new PacsLabel();
             presentLabel.setPacsLabel(pacsLabel);
         }
-        entityProcessPacs.extractEntity(aiOut,pacsLabel);
+        entityProcessPacs.extractEntity(aiOut, pacsLabel);
         //服用药品
         List<Medicine> medicines = takeMedicine(presentLabel);
         presentLabel.setTakeMedicine(medicines);
@@ -684,8 +709,8 @@ public class BeHospitalizedAI extends ModelAI {
             return;
         }
         EntityProcessPacs entityProcessPacs = new EntityProcessPacs();
-        entityProcessPacs.extractEntity(aiOut,pacsLabel);
-//        EntityProcessPacsNew entityProcessPacsNew = new EntityProcessPacsNew();
+        entityProcessPacs.extractEntity(aiOut, pacsLabel);
+        //        EntityProcessPacsNew entityProcessPacsNew = new EntityProcessPacsNew();
         // Map<String, PacsNew> map = entityProcessPacsNew.extractEntity(aiOut);
         //
         // List<PacsNew> pacsNewList = pacsLabel.getPacsNewList();
@@ -699,11 +724,12 @@ public class BeHospitalizedAI extends ModelAI {
 
     /**
      * 一般情况以后的药品
+     *
      * @param presentLabel
      */
-    public List<Medicine> takeMedicine(PresentLabel presentLabel){
-//        List<Medicine> takems = new ArrayList<>();
-//        List<GeneralDesc> generals = presentLabel.getGenerals();
+    public List<Medicine> takeMedicine(PresentLabel presentLabel) {
+        //        List<Medicine> takems = new ArrayList<>();
+        //        List<GeneralDesc> generals = presentLabel.getGenerals();
         List<Medicine> medicines = presentLabel.getMedicines();
         /*if (generals.size() > 0) {
             String presentText = presentLabel.getText();

+ 96 - 0
src/main/java/com/diagbot/model/ai/process/EntityProcessClinic.java

@@ -22,6 +22,7 @@ import com.diagbot.model.entity.Relief;
 import com.diagbot.model.entity.Treat;
 import com.diagbot.model.entity.Trend;
 import com.diagbot.model.entity.Vital;
+import com.diagbot.model.label.ChiefLabel;
 import com.diagbot.model.label.PresentLabel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -190,4 +191,99 @@ public class EntityProcessClinic extends EntityProcess {
         }
         return presentLabel;
     }
+
+    public ChiefLabel extractEntity_chief(JSONObject aiOut) {
+        ChiefLabel chiefLabel = new ChiefLabel();
+        try {
+            //临床表现
+            List<Lemma> clinicLemmas = createEntityTree(aiOut, EntityEnum.CLINICAL_FEATURE.toString());
+            for (Lemma lemma : clinicLemmas) {
+                Clinical clinical = new Clinical();
+                clinical.setName(lemma.getText());
+                clinical.setStandName(lemma.getText());
+
+                List<PD> timestamp = new LinkedList<>();
+                for (Lemma relationLemma : lemma.getRelationLemmas()) {
+                    if (relationLemma.getProperty().equals(EntityEnum.NEGATIVE.toString())) {
+                        clinical.setNegative(findNegative(lemma));
+                    }
+                    clinical.setModification(findT(lemma, new Modification(), EntityEnum.MODIFICATION.toString()));//修饰
+                    clinical.setBodyPart(findT(lemma, new BodyPart(), EntityEnum.BODY.toString()));//部位
+                    clinical.setTrend(findT(lemma, new Trend(), EntityEnum.TREND.toString()));//趋势
+                    clinical.setCause(findT(lemma, new Cause(), EntityEnum.CAUSE.toString()));//诱因
+                    clinical.setProperty(findT(lemma, new Property(), EntityEnum.PROPERTY.toString()));//性质
+                    clinical.setDegree(findT(lemma, new Degree(), EntityEnum.DEGREE.toString()));//程度
+                    clinical.setAggravate(findT(lemma, new Aggravate(), EntityEnum.AGGRAVATE.toString()));//加重因素
+                    clinical.setRelief(findT(lemma, new Relief(), EntityEnum.RELIEF.toString()));//缓解因素
+                    if (relationLemma.getProperty().equals(EntityEnum.TIME.toString())) {
+                        String[] time_split = relationLemma.getText().split(",");
+                        for (String time : time_split) {
+                            PD pd = new PD();
+                            String[] val_unit = new String[2];
+                            if (time.trim().length() > 0) {
+                                val_unit = extract_digit(time);
+                            }
+                            pd.setValue(val_unit[0]);
+                            pd.setUnit(val_unit[1]);
+                            pd.setName(time);
+                            timestamp.add(pd);
+                        }
+                    }
+                }
+                clinical.setTimestamp(timestamp);
+                chiefLabel.add(chiefLabel.getClinicals(), clinical);
+            }
+
+            // 诊断
+            EntityProcessDiag entityProcessDiag = new EntityProcessDiag();
+            List<Diag> diags = entityProcessDiag.extractEntity(aiOut);
+            chiefLabel.setDiags(diags);
+
+            // 药品
+            List<Lemma> cureLemmas_me = createEntityTree(aiOut, EntityEnum.DRUG.toString());
+            List<Medicine> medicines = new ArrayList<>();
+            for (Lemma lemma : cureLemmas_me) {
+                Medicine medicine = new Medicine();
+                medicine.setName(lemma.getText());
+                medicine.setStandName(lemma.getText()); // 先赋值,之后有同义词转换再替换
+                if (lemma.isHaveChildren()) {
+                    medicine.setNegative(findNegative(lemma));//阴性
+                }
+                medicines.add(medicine);
+            }
+            chiefLabel.setMedicines(medicines);
+
+            //手术
+            List<Lemma> operationLemmas = createEntityTree(aiOut, EntityEnum.OPERATION.toString());
+            for (Lemma lemma : operationLemmas) {
+                Operation operation = new Operation();
+                operation.setName(lemma.getText());
+                operation.setStandName(lemma.getText()); // 先赋值,之后有同义词转换再替换
+                if (lemma.isHaveChildren()) {
+                    operation.setNegative(findNegative(lemma));//阴性
+                }
+                chiefLabel.add(chiefLabel.getOperations(), operation);
+            }
+
+            //时间
+            List<Lemma> pdLemmas = createEntityTree(aiOut, EntityEnum.TIME.toString());
+            List<PD> pds = new ArrayList<>();
+            for (Lemma lemma : pdLemmas) {
+                PD pd = new PD();
+                String[] val_unit = new String[2];
+                if (lemma.getText().trim().length() > 0) {
+                    val_unit = extract_digit(lemma.getText());
+                }
+                pd.setValue(val_unit[0]);
+                pd.setUnit(val_unit[1]);
+                pd.setName(lemma.getText());
+                pds.add(pd);
+            }
+            chiefLabel.setPds(pds);
+        } catch (Exception e) {
+            e.printStackTrace();
+            logger.error(e.getMessage(), e);
+        }
+        return chiefLabel;
+    }
 }

+ 32 - 1
src/main/java/com/diagbot/model/ai/process/EntityProcessPast.java

@@ -3,13 +3,30 @@ package com.diagbot.model.ai.process;
 import com.alibaba.fastjson.JSONObject;
 import com.diagbot.model.ai.model.EntityEnum;
 import com.diagbot.model.ai.model.Lemma;
-import com.diagbot.model.entity.*;
+import com.diagbot.model.entity.Allergy;
+import com.diagbot.model.entity.AllergyDesc;
+import com.diagbot.model.entity.AllergyFood;
+import com.diagbot.model.entity.AllergyMedicine;
+import com.diagbot.model.entity.BloodTransfusion;
+import com.diagbot.model.entity.BodyPart;
+import com.diagbot.model.entity.Degree;
+import com.diagbot.model.entity.Diag;
+import com.diagbot.model.entity.DiagInfectious;
+import com.diagbot.model.entity.Medicine;
+import com.diagbot.model.entity.Operation;
+import com.diagbot.model.entity.OperationResult;
+import com.diagbot.model.entity.Possible;
+import com.diagbot.model.entity.Quantity;
+import com.diagbot.model.entity.Treat;
+import com.diagbot.model.entity.Vaccinate;
+import com.diagbot.model.entity.Wound;
 import com.diagbot.model.label.PastLabel;
 import com.diagbot.util.CoreUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -201,6 +218,20 @@ public class EntityProcessPast extends EntityProcess {
             for (Lemma lemma : healthLemmas) {
                 pastLabel.setHeathCondition(lemma.getText());
             }
+
+            //药品
+            List<Lemma> cureLemmas_me = createEntityTree(aiOut, EntityEnum.DRUG.toString());
+            List<Medicine> medicines = new ArrayList<>();
+            for (Lemma lemma : cureLemmas_me) {
+                Medicine medicine = new Medicine();
+                medicine.setName(lemma.getText());
+                medicine.setStandName(lemma.getText()); // 先赋值,之后有同义词转换再替换
+                if (lemma.isHaveChildren()) {
+                    medicine.setNegative(findNegative(lemma));//阴性
+                }
+                medicines.add(medicine);
+            }
+            pastLabel.setMedicines(medicines);
         } catch (Exception e) {
             e.printStackTrace();
             logger.error(e.getMessage(), e);

+ 20 - 3
src/main/java/com/diagbot/model/label/ChiefLabel.java

@@ -3,6 +3,9 @@ package com.diagbot.model.label;
 
 import com.diagbot.model.entity.Clinical;
 import com.diagbot.model.entity.Diag;
+import com.diagbot.model.entity.Lis;
+import com.diagbot.model.entity.Medicine;
+import com.diagbot.model.entity.Operation;
 import com.diagbot.model.entity.PD;
 import lombok.Getter;
 import lombok.Setter;
@@ -19,8 +22,22 @@ import java.util.List;
 @Setter
 @Getter
 public class ChiefLabel extends GeneralLabel {
-    private List<Clinical> clinicals;
-    private List<Diag> diags;
-    //现病史中所有时间实体存入
+    // 临床表现
+    private List<Clinical> clinicals = new ArrayList<>();
+    // 疾病信息
+    private List<Diag> diags = new ArrayList<>();
+    // 现病史的辅检信息
+    PacsLabel pacsLabel;
+    // 化验
+    private List<Lis> lises;
+    // 药物
+    private List<Medicine> medicines;
+    // 手术信息
+    private List<Operation> operations = new ArrayList<>();
+    // 主诉中所有时间实体存入
     private List<PD> pds = new ArrayList<>();
+
+    public <T> void add(List<T> list, T obj) {
+        list.add(obj);
+    }
 }

+ 1 - 0
src/main/java/com/diagbot/model/label/PastLabel.java

@@ -27,6 +27,7 @@ public class PastLabel extends GeneralLabel{
     private List<Operation> operations = new ArrayList<>();//手术史
     private List<Vaccinate> vaccinates = new ArrayList<>();//预防接种史
     private String heathCondition;
+    private List<Medicine> medicines;//药物
 
     public void addDiag(Diag diag) {
         this.diags.add(diag);

+ 21 - 50
src/main/java/com/diagbot/process/BillProcess.java

@@ -13,7 +13,6 @@ import com.diagbot.model.entity.Clinical;
 import com.diagbot.model.entity.Medicine;
 import com.diagbot.model.entity.Operation;
 import com.diagbot.model.label.ChiefLabel;
-import com.diagbot.model.label.DiagLabel;
 import com.diagbot.model.label.PacsLabel;
 import com.diagbot.model.label.PastLabel;
 import com.diagbot.model.label.PresentLabel;
@@ -65,7 +64,6 @@ public class BillProcess {
     @Autowired
     MedEquRule medEquRule;
 
-
     public void process(List<BillNeoDTO> billNeoDTOList, WordCrfDTO wordCrfDTO, IndicationDTO res) {
         // 合并图谱数据到同一个对象中
         List<BillNeoMaxDTO> billNeoMaxDTOList = new ArrayList<>();
@@ -168,12 +166,12 @@ public class BillProcess {
 
     // 规则处理
     public void processRule(List<BillNeoMaxDTO> billNeoMaxDTOList, WordCrfDTO wordCrfDTO, IndicationDTO indicationDTO) {
-        DiagLabel diagLabel = wordCrfDTO.getDiagLabel();
         ChiefLabel chiefLabel = wordCrfDTO.getChiefLabel();
         PresentLabel presentLabel = wordCrfDTO.getPresentLabel();
         PastLabel pastLabel = wordCrfDTO.getPastLabel();
+
+        // 【药品数据来源】(主诉、现病史、既往史、结构化药品)
         List<Medicine> allergyAll = new ArrayList<>();
-        List<Medicine> takeMedicine = presentLabel.getTakeMedicine();
         List<Medicine> allergyDrug = new ArrayList<>();
         List<Drug> drug = wordCrfDTO.getDrug();
         for (Item item : drug) {
@@ -182,45 +180,23 @@ public class BillProcess {
             operaData.setStandName(item.getUniqueName());
             allergyDrug.add(operaData);
         }
-        allergyAll.addAll(allergyDrug);
-        allergyAll.addAll(takeMedicine);
-        // 诊断数据
-        List<Item> diags = wordCrfDTO.getDiag();
-        // 添加主诉诊断
-        CoreUtil.addAllDiag(diags, wordCrfDTO.getChiefLabel().getDiags());
-        // 添加现病史诊断
-        CoreUtil.addAllDiag(diags, wordCrfDTO.getPresentLabel().getDiags());
+        CoreUtil.addList(allergyAll, chiefLabel.getMedicines()); // 主诉药品
+        CoreUtil.addList(allergyAll,  presentLabel.getTakeMedicine()); // 现病史药品
+        CoreUtil.addList(allergyAll, pastLabel.getMedicines());  // 既往史药品
+        CoreUtil.addList(allergyAll, allergyDrug);  // 结构化药品
 
+        // 【诊断数据来源】
+        List<Item> diags = wordCrfDTO.getDiag(); // 结构化诊断
+        CoreUtil.addAllDiag(diags, wordCrfDTO.getChiefLabel().getDiags());// 主诉诊断
+        CoreUtil.addAllDiag(diags, wordCrfDTO.getPresentLabel().getDiags()); // 现病史诊断
+        CoreUtil.addAllDiag(diags, wordCrfDTO.getPastLabel().getDiags()); // 既往史诊断
 
-        //辅助检查描述
+        // 【辅检结果数据来源】
         PacsLabel pacsLabel = wordCrfDTO.getPacsLabel();
-        List<Item> pacsDescList = new ArrayList<>();
-        pacsLabel.getRes().stream().forEach(
-                x -> {
-                    Item item = new Item();
-                    item.setName(x.getName());
-                    item.setUniqueName(x.getUniqueName());
-                    pacsDescList.add(item);
-                }
-        );
-        // pacsLabel.getPacsNewList().stream().filter(x -> ListUtil.isNotEmpty(x.getPacsResults()) || ListUtil.isNotEmpty(x.getDisease())).forEach(
-        //         x ->{
-        //             List<String> pacsResults = x.getPacsResults().stream().map(pacr -> pacr.getStandName()).collect(Collectors.toList());
-        //             List<String> diseases = x.getDisease().stream().map(disease -> disease.getStandName()).collect(Collectors.toList());
-        //             pacsResults.addAll(diseases);
-        //             pacsResults.stream().forEach(z ->{
-        //                 Item item = new Item();
-        //                 item.setName(z);
-        //                 item.setUniqueName(z);
-        //                 pacsDescList.add(item);
-        //             });
-        //         }
-        // );
+        List<Item> pacsDescList = pacsLabel.getRes();
 
-        // 手术数据
+        // 【手术数据来源】
         List<Operation> operations_all = new ArrayList<>();
-        List<Operation> operations_present = presentLabel.getOperations();
-        List<Operation> operations_past = pastLabel.getOperations();
         List<Item> operation = wordCrfDTO.getOperation();
         List<Operation> operationsItem = new ArrayList<>();
         for (Item item : operation) {
@@ -229,19 +205,14 @@ public class BillProcess {
             operaData.setStandName(item.getUniqueName());
             operationsItem.add(operaData);
         }
-        operations_all.addAll(operations_present);
-        operations_all.addAll(operations_past);
-        operations_all.addAll(operationsItem);
+        CoreUtil.addList(operations_all, presentLabel.getOperations());
+        CoreUtil.addList(operations_all, pastLabel.getOperations());
+        CoreUtil.addList(operations_all, operationsItem);
 
-        // 临床表现数据
+        // 临床表现数据来源】(主诉、现病史)
         List<Clinical> clinicals = new ArrayList<>();
-        if (chiefLabel != null && ListUtil.isNotEmpty(chiefLabel.getClinicals())) {
-            clinicals.addAll(chiefLabel.getClinicals());
-        }
-        // 现病史临床表现数据先不用
-        // if(presentLabel != null && ListUtil.isNotEmpty(presentLabel.getClinicals())){
-        //     clinicals.addAll(presentLabel.getClinicals());
-        // }
+        CoreUtil.addList(clinicals, chiefLabel.getClinicals()); // 主诉临床表现
+        CoreUtil.addList(clinicals, presentLabel.getClinicals()); // 现病史临床表现
 
         List<BillMsg> billMsgList = new ArrayList<>();
         for (BillNeoMaxDTO bill : billNeoMaxDTOList) {
@@ -272,7 +243,7 @@ public class BillProcess {
             // 禁忌过敏药品(既往史)
             drugRule.bill(bill.getAllergicmeds(), pastLabel.getAllergyMedicines(), bill, billMsgList, NeoEnum.allergicmeds.getName());
 
-            // 服用药品(现病史一般情况后的药品)
+            // 服用药品(主诉、现病史、既往史、结构化药品)
             drugRule.bill(bill.getOralmeds(), allergyAll, bill, billMsgList, NeoEnum.oralmeds.getName());
 
             // 禁忌人群

+ 22 - 4
src/main/java/com/diagbot/util/CoreUtil.java

@@ -810,10 +810,12 @@ public class CoreUtil {
         List<Item> itemList = new ArrayList<>();
         if (ListUtil.isNotEmpty(diagList)) {
             for (Diag diag : diagList) {
-                Item item = new Item();
-                item.setName(diag.getName());
-                item.setUniqueName(diag.getStandName());
-                itemList.add(item);
+                if (diag.getNegative() == null) {
+                    Item item = new Item();
+                    item.setName(diag.getName());
+                    item.setUniqueName(diag.getStandName());
+                    itemList.add(item);
+                }
             }
         }
         return itemList;
@@ -832,6 +834,22 @@ public class CoreUtil {
         return false;
     }
 
+    /**
+     * 添加列表
+     *
+     * @param source
+     * @param addList
+     * @param <T>
+     */
+    public static <T> void addList(List<T> source, List<T> addList) {
+        if (source == null) {
+            return ;
+        }
+        if (ListUtil.isNotEmpty(addList)) {
+            source.addAll(addList);
+        }
+    }
+
     public static void main(String[] args) {
         String ageStr = ".545458";
         System.out.println(Double.parseDouble(ageStr));