浏览代码

1.邵逸夫添加首次病程录、手术记录、会诊结果单走CRF模型取药品
2.邵逸夫医嘱有抗生素\激素使用病程无记录修改逻辑

huj 4 年之前
父节点
当前提交
bc10891f5c

+ 67 - 59
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02985.java

@@ -14,7 +14,6 @@ import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.model.entity.Drug;
-import com.lantone.qc.pub.model.label.ThreeLevelWardLabel;
 import com.lantone.qc.pub.util.DateUtil;
 import com.lantone.qc.pub.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +27,7 @@ import java.util.stream.Collectors;
 /**
  * @ClassName : THR02985
  * @Description : 医嘱有抗生素使用病程无记录
- * 药品类型(0.普药 1.抗生素 2.抗生素)
+ * 药品类型(0.普药 1.抗生素 2.素)
  * @Author : 胡敬
  * @Date: 2020-06-23 10:04
  */
@@ -50,6 +49,7 @@ public class THR02985 extends QCCatalogue {
     SimilarityUtil similarityUtil;
 
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
@@ -58,12 +58,10 @@ public class THR02985 extends QCCatalogue {
         LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
         List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
         if (doctorAdviceDocs.size() == 0 || threeLevelWardDocs.size() == 0) {
-            status.set("0");
             return;
         }
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
         if (allDoctorWradDocs.size() == 0) {
-            status.set("0");
             return;
         }
         Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
@@ -91,52 +89,78 @@ public class THR02985 extends QCCatalogue {
         }
 
         Map<String, Date> info = Maps.newLinkedHashMap();
+        Map<String, List<Drug>> infoModel = Maps.newLinkedHashMap();
+        String dateStr = null;
         //入院记录中获取信息
-        if (beHospitalizedDoc != null) {
+        /*if (beHospitalizedDoc != null) {
             Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
             getInfo(info, structureMap, "入院记录", "入院日期", "治疗计划");
-        }
+        }*/
         //从首程治疗计划中获取信息
         if (firstCourseRecordDoc != null) {
-            Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
-            getInfo(info, structureMap, "首次病程录", "记录时间", "治疗计划");
+            getInfo(info, firstCourseRecordDoc.getStructureMap(), "首次病程录", "记录时间", "治疗计划");
+            if (firstCourseRecordDoc.getDrugLabel() != null) {
+                List<Drug> drugs = firstCourseRecordDoc.getDrugLabel().getDrugs();
+                dateStr = firstCourseRecordDoc.getStructureMap().get("记录时间");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
         }
 
+        //从查房记录中获取信息
+        List<ThreeLevelWardDoc> wardDocs = allDoctorWradDocs
+                .stream()
+                .filter(x -> StringUtil.isNotBlank(x.getStructureMap().get("查房日期")) && x.getThreeLevelWardLabel().size() > 0)
+                .collect(Collectors.toList());
+        wardDocs.forEach(x -> getInfo(info, x.getStructureMap(), "查房记录", "查房日期", "病情记录", "治疗计划和措施"));
+        wardDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("查房日期"), x.getThreeLevelWardLabel().get(x.getThreeLevelWardLabel().size() - 1).getDrugs()));
+
         //从手术记录中获取信息
         if (operationDocs.size() > 0) {
             //手术记录
-            List<Map<String, String>> operationRecordStructMap = operationDocs
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
                     .stream()
                     .map(OperationDoc::getOperationRecordDoc)
                     .filter(Objects::nonNull)
-                    .map(OperationRecordDoc::getStructureMap)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
                     .collect(Collectors.toList());
-            operationRecordStructMap.forEach(x -> getInfo(info, x, "手术记录", "病历日期", "手术经过"));
+            operationRecordDocs.forEach(x -> getInfo(info, x.getStructureMap(), "手术记录", "病历日期", "手术经过"));
+            operationRecordDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("病历日期"), x.getOperationRecordLabel().getDrugs()));
             //术后首程
-            List<Map<String, String>> operationDiscussionStructMap = operationDocs
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
                     .stream()
                     .map(OperationDoc::getOperationDiscussionDoc)
                     .filter(Objects::nonNull)
-                    .map(OperationDiscussionDoc::getStructureMap)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("记录日期")))
                     .collect(Collectors.toList());
-            operationDiscussionStructMap.forEach(x -> getInfo(info, x, "术后首程", "记录日期", "手术经过", "治疗计划和措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(info, x.getStructureMap(), "术后首程", "记录日期", "手术经过", "治疗计划和措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("记录日期"), x.getOperationDiscussionLabel().getDrugs()));
         }
 
         //从会诊记录中获取信息
         if (consultationDocs.size() > 0) {
-            List<Map<String, String>> consultationResultStructMap = consultationDocs
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
                     .stream()
                     .map(ConsultationDoc::getConsultationResultsDoc)
                     .filter(Objects::nonNull)
-                    .map(ConsultationResultsDoc::getStructureMap)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
                     .collect(Collectors.toList());
-            consultationResultStructMap.forEach(x -> getInfo(info, x, "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
         }
 
         //从出院小结中获取信息
         if (leaveHospitalDoc != null) {
-            Map<String, String> structureMap = leaveHospitalDoc.getStructureMap();
-            getInfo(info, structureMap, "出院小结", "出院时间", "诊治经过", "出院带药");
+            getInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", "出院时间", "诊治经过", "出院带药");
+            if (leaveHospitalDoc.getLeaveHospitalLabel() != null) {
+                List<Drug> drugs = leaveHospitalDoc.getLeaveHospitalLabel().getDrugs();
+                dateStr = leaveHospitalDoc.getStructureMap().get("出院时间");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", "出院时间", "诊治经过", "出院带药");
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
         }
 
         String infoStr = "";
@@ -144,12 +168,9 @@ public class THR02985 extends QCCatalogue {
             Date doctorAdviceDate = doctorAdviceDrug.getKey();
             String drugs = doctorAdviceDrug.getValue();
             drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
-            String drugStandardWord = similarityUtil.getDrugStandardWord(drugs);
-            if (StringUtil.isNotBlank(drugStandardWord)) {
-                drugs = drugStandardWord;
-            }
             Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
                     .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
+            /**********************************************先文本匹配************************************************/
             String missDrug = "";
             for (Map.Entry<String, Date> map : info.entrySet()) {
                 missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug);
@@ -161,57 +182,36 @@ public class THR02985 extends QCCatalogue {
             if (StringUtil.isBlank(missDrug)) {
                 continue;
             }
+            /**********************************************文本匹配没有找到药,再走模型************************************************/
             boolean modelFind = false;
-            int wardNum = 0;
-            for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
-                /*****************纯文本匹配******************/
-                Map<String, String> wardDocStructureMap = threeLevelWardDoc.getStructureMap();
-                String wardDateStr = wardDocStructureMap.get("查房日期");
-                String content = wardDocStructureMap.get("病情记录") + wardDocStructureMap.get("治疗计划和措施");
-                Date wardDate = StringUtil.parseDateTime(wardDateStr);
-                missDrug = getMissDrug(content, wardDate, doctorAdviceDate, splitDrugs, 2, missDrug);
-                //当前抗生素药(drugs)在查房记录中已找到,直接跳出当前查房记录的循环
-                if ((doctorAdviceDate.before(wardDate) && !CatalogueUtil.compareTime(doctorAdviceDate, wardDate, 2 * 24 * 60L))
-                        || (wardDate.before(doctorAdviceDate) && !CatalogueUtil.compareTime(wardDate, doctorAdviceDate, 24 * 60L))) {
-                    /*****************药品相似度模型******************/
-                    List<ThreeLevelWardLabel> label = threeLevelWardDoc.getThreeLevelWardLabel();
-                    if (label.size() > 0) {
-                        List<Drug> drugList = label.get(0).getDrugs();
-                        for (Drug drug : drugList) {
-                            for (String adDrug : splitDrugs) {
-                                if (compareStandard(drug.getName(), adDrug)) {
-                                    modelFind = true;
-                                    break;
-                                }
-                            }
-                            if (modelFind) {
+            for (Map.Entry<String, List<Drug>> modelMap : infoModel.entrySet()) {
+                dateStr = modelMap.getKey();
+                List<Drug> diags = modelMap.getValue();
+                Date date = StringUtil.parseDateTime(dateStr);
+                //医嘱开始时间往后2天或往前一天找药
+                if ((doctorAdviceDate.before(date) && !CatalogueUtil.compareTime(doctorAdviceDate, date, 48 * 60L))
+                        || (date.before(doctorAdviceDate) && !CatalogueUtil.compareTime(date, doctorAdviceDate, 24 * 60L))) {
+                    for (String adDrug : splitDrugs) {
+                        for (Drug courseDrug : diags) {
+                            if (compareStandard(courseDrug.getName(), adDrug)) {
+                                modelFind = true;
                                 break;
                             }
                         }
                     }
                 }
-                if (StringUtil.isNotBlank(missDrug) && !modelFind) {//missDrug不为空,只有两种可能:1.确实是缺失的药    2.字符串为“时间不匹配”
-                    wardNum++;                                      //当前所有查房记录都没找到药,该医嘱时间再与系统当前时间对比,若超过48小时则提示该药缺失
-                }
-                if (StringUtil.isBlank(missDrug) || modelFind) {
+                if (modelFind) {
                     break;
                 }
             }
-            //如果目前所有查房记录都没有
-            if (wardNum == allDoctorWradDocs.size() && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
-                continue;
-            }
 
-            if (StringUtil.isNotBlank(missDrug) && !"时间不匹配".equals(missDrug) && !modelFind) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, missDrug + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
+            if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
+                infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
             }
         }
         if (StringUtil.isNotBlank(infoStr)) {
             this.status.set("-1");
             this.info.set(infoStr);
-        } else {
-            this.status.set("0");
         }
     }
 
@@ -232,6 +232,14 @@ public class THR02985 extends QCCatalogue {
         }
     }
 
+    private void getInfo(Map<String, List<Drug>> info, String dateKey, List<Drug> drugs) {
+        if (info.containsKey(dateKey)) {
+            info.get(dateKey).addAll(drugs);
+        } else {
+            info.put(dateKey, drugs);
+        }
+    }
+
     /**
      * 核心:从文本中找药
      *

+ 70 - 53
kernel/src/main/java/com/lantone/qc/kernel/catalogue/threelevelward/THR02986.java

@@ -28,7 +28,7 @@ import java.util.stream.Collectors;
 /**
  * @ClassName : THR02986
  * @Description : 医嘱有激素使用病程无记录
- * 药品类型(0.普药 1.素 2.激素)
+ * 药品类型(0.普药 1.抗生素 2.激素)
  * @Author : 胡敬
  * @Date: 2020-06-23 10:43
  */
@@ -36,7 +36,9 @@ import java.util.stream.Collectors;
 public class THR02986 extends QCCatalogue {
     @Autowired
     SimilarityUtil similarityUtil;
+
     public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
         List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
         List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
         FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
@@ -45,12 +47,10 @@ public class THR02986 extends QCCatalogue {
         LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
         List<ConsultationDoc> consultationDocs = inputInfo.getConsultationDocs();
         if (doctorAdviceDocs.size() == 0 || threeLevelWardDocs.size() == 0) {
-            status.set("0");
             return;
         }
         List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
         if (allDoctorWradDocs.size() == 0) {
-            status.set("0");
             return;
         }
         Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
@@ -78,61 +78,88 @@ public class THR02986 extends QCCatalogue {
         }
 
         Map<String, Date> info = Maps.newLinkedHashMap();
+        Map<String, List<Drug>> infoModel = Maps.newLinkedHashMap();
+        String dateStr = null;
         //入院记录中获取信息
-        if (beHospitalizedDoc != null) {
+        /*if (beHospitalizedDoc != null) {
             Map<String, String> structureMap = beHospitalizedDoc.getStructureMap();
             getInfo(info, structureMap, "入院记录", "入院日期", "治疗计划");
-        }
+        }*/
         //从首程治疗计划中获取信息
         if (firstCourseRecordDoc != null) {
-            Map<String, String> structureMap = firstCourseRecordDoc.getStructureMap();
-            getInfo(info, structureMap, "首次病程录", "记录时间", "治疗计划");
+            getInfo(info, firstCourseRecordDoc.getStructureMap(), "首次病程录", "记录时间", "治疗计划");
+            if (firstCourseRecordDoc.getDrugLabel() != null) {
+                List<Drug> drugs = firstCourseRecordDoc.getDrugLabel().getDrugs();
+                dateStr = firstCourseRecordDoc.getStructureMap().get("记录时间");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
         }
 
+        //从查房记录中获取信息
+        List<ThreeLevelWardDoc> wardDocs = allDoctorWradDocs
+                .stream()
+                .filter(x -> StringUtil.isNotBlank(x.getStructureMap().get("查房日期")) && x.getThreeLevelWardLabel().size() > 0)
+                .collect(Collectors.toList());
+        wardDocs.forEach(x -> getInfo(info, x.getStructureMap(), "查房记录", "查房日期", "病情记录", "治疗计划和措施"));
+        wardDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("查房日期"), x.getThreeLevelWardLabel().get(x.getThreeLevelWardLabel().size() - 1).getDrugs()));
+
         //从手术记录中获取信息
         if (operationDocs.size() > 0) {
             //手术记录
-            List<Map<String, String>> operationRecordStructMap = operationDocs
+            List<OperationRecordDoc> operationRecordDocs = operationDocs
                     .stream()
                     .map(OperationDoc::getOperationRecordDoc)
                     .filter(Objects::nonNull)
-                    .map(OperationRecordDoc::getStructureMap)
+                    .filter(x -> x.getOperationRecordLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("病历日期")))
                     .collect(Collectors.toList());
-            operationRecordStructMap.forEach(x -> getInfo(info, x, "手术记录", "病历日期", "手术经过"));
+            operationRecordDocs.forEach(x -> getInfo(info, x.getStructureMap(), "手术记录", "病历日期", "手术经过"));
+            operationRecordDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("病历日期"), x.getOperationRecordLabel().getDrugs()));
             //术后首程
-            List<Map<String, String>> operationDiscussionStructMap = operationDocs
+            List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
                     .stream()
                     .map(OperationDoc::getOperationDiscussionDoc)
                     .filter(Objects::nonNull)
-                    .map(OperationDiscussionDoc::getStructureMap)
+                    .filter(x -> x.getOperationDiscussionLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("记录日期")))
                     .collect(Collectors.toList());
-            operationDiscussionStructMap.forEach(x -> getInfo(info, x, "术后首程", "记录日期", "手术经过", "治疗计划和措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(info, x.getStructureMap(), "术后首程", "记录日期", "手术经过", "治疗计划和措施"));
+            operationDiscussionDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("记录日期"), x.getOperationDiscussionLabel().getDrugs()));
         }
 
         //从会诊记录中获取信息
         if (consultationDocs.size() > 0) {
-            List<Map<String, String>> consultationResultStructMap = consultationDocs
+            List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
                     .stream()
                     .map(ConsultationDoc::getConsultationResultsDoc)
                     .filter(Objects::nonNull)
-                    .map(ConsultationResultsDoc::getStructureMap)
+                    .filter(x -> x.getConsultationResultLabel() != null && StringUtil.isNotBlank(x.getStructureMap().get("会诊日期及时间")))
                     .collect(Collectors.toList());
-            consultationResultStructMap.forEach(x -> getInfo(info, x, "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
+            consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
         }
 
         //从出院小结中获取信息
         if (leaveHospitalDoc != null) {
-            Map<String, String> structureMap = leaveHospitalDoc.getStructureMap();
-            getInfo(info, structureMap, "出院小结", "出院时间", "诊治经过");
+            getInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", "出院时间", "诊治经过", "出院带药");
+            if (leaveHospitalDoc.getLeaveHospitalLabel() != null) {
+                List<Drug> drugs = leaveHospitalDoc.getLeaveHospitalLabel().getDrugs();
+                dateStr = leaveHospitalDoc.getStructureMap().get("出院时间");
+                if (StringUtil.isNotBlank(dateStr)) {
+                    getInfo(info, leaveHospitalDoc.getStructureMap(), "出院小结", "出院时间", "诊治经过", "出院带药");
+                    getInfo(infoModel, dateStr, drugs);
+                }
+            }
         }
 
         String infoStr = "";
         for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
             Date doctorAdviceDate = doctorAdviceDrug.getKey();
             String drugs = doctorAdviceDrug.getValue();
-            drugs = removeBracket(drugs);
+            drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
             Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
                     .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
+            /**********************************************先文本匹配************************************************/
             String missDrug = "";
             for (Map.Entry<String, Date> map : info.entrySet()) {
                 missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug);
@@ -144,54 +171,36 @@ public class THR02986 extends QCCatalogue {
             if (StringUtil.isBlank(missDrug)) {
                 continue;
             }
+            /**********************************************文本匹配没有找到药,再走模型************************************************/
             boolean modelFind = false;
-            int wardNum = 0;
-            for (ThreeLevelWardDoc threeLevelWardDoc : allDoctorWradDocs) {
-                /*****************纯文本匹配******************/
-                Map<String, String> wardDocStructureMap = threeLevelWardDoc.getStructureMap();
-                String wardDateStr = wardDocStructureMap.get("查房日期");
-                String content = wardDocStructureMap.get("病情记录") + wardDocStructureMap.get("治疗计划和措施");
-                Date wardDate = StringUtil.parseDateTime(wardDateStr);
-                missDrug = getMissDrug(content, wardDate, doctorAdviceDate, splitDrugs, 2, missDrug);
-                //当前激素药(drugs)在查房记录中已找到,直接跳出当前查房记录的循环
-                /*****************药品相似度模型******************/
-                List<ThreeLevelWardLabel> label = threeLevelWardDoc.getThreeLevelWardLabel();
-                if (label.size() > 0) {
-                    List<Drug> drugList = label.get(0).getDrugs();
-                    for (Drug drug : drugList) {
-                        for (String adDrug : splitDrugs) {
-                            if (compareStandard(drug.getName(), adDrug)) {
+            for (Map.Entry<String, List<Drug>> modelMap : infoModel.entrySet()) {
+                dateStr = modelMap.getKey();
+                List<Drug> diags = modelMap.getValue();
+                Date date = StringUtil.parseDateTime(dateStr);
+                //医嘱开始时间往后2天或往前一天找药
+                if ((doctorAdviceDate.before(date) && !CatalogueUtil.compareTime(doctorAdviceDate, date, 48 * 60L))
+                        || (date.before(doctorAdviceDate) && !CatalogueUtil.compareTime(date, doctorAdviceDate, 24 * 60L))) {
+                    for (String adDrug : splitDrugs) {
+                        for (Drug courseDrug : diags) {
+                            if (compareStandard(courseDrug.getName(), adDrug)) {
                                 modelFind = true;
                                 break;
                             }
                         }
-                        if (modelFind) {
-                            break;
-                        }
                     }
                 }
-                if (StringUtil.isNotBlank(missDrug) && !modelFind) {//missDrug不为空,只有两种可能:1.确实是缺失的药    2.字符串为“时间不匹配”
-                    wardNum++;                                      //当前所有查房记录都没找到药,该医嘱时间再与系统当前时间对比,若超过48小时则提示该药缺失
-                }
-                if (StringUtil.isBlank(missDrug) || modelFind) {
+                if (modelFind) {
                     break;
                 }
             }
-            //如果目前所有查房记录都没有
-            if (wardNum == allDoctorWradDocs.size() && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
-                continue;
-            }
 
-            if (StringUtil.isNotBlank(missDrug) && !"时间不匹配".equals(missDrug) && !modelFind) {
-                infoStr = CatalogueUtil.concatInfo(infoStr, missDrug + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
+            if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
+                infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
             }
         }
         if (StringUtil.isNotBlank(infoStr)) {
             this.status.set("-1");
             this.info.set(infoStr);
-        } else {
-            this.status.set("0");
         }
     }
 
@@ -212,6 +221,14 @@ public class THR02986 extends QCCatalogue {
         }
     }
 
+    private void getInfo(Map<String, List<Drug>> info, String dateKey, List<Drug> drugs) {
+        if (info.containsKey(dateKey)) {
+            info.get(dateKey).addAll(drugs);
+        } else {
+            info.put(dateKey, drugs);
+        }
+    }
+
     /**
      * 核心:从文本中找药
      *
@@ -244,7 +261,7 @@ public class THR02986 extends QCCatalogue {
                 }
             }
             if (findDrug) {
-                missDrug = "";//如果找到一种抗生素药,就把报错信息置为空
+                missDrug = "";//如果找到一种素药,就把报错信息置为空
             }
         } else {
             if (StringUtil.isBlank(missDrug)) {
@@ -277,7 +294,7 @@ public class THR02986 extends QCCatalogue {
     }
 
     /**
-     * 比较两个抗生素标准词是否一致
+     * 比较两个素标准词是否一致
      *
      * @param firstWord
      * @param secordWord

+ 88 - 0
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/ConsultationAI.java

@@ -0,0 +1,88 @@
+package com.lantone.qc.kernel.structure.ai;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.client.CRFServiceClient;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessDrug;
+import com.lantone.qc.kernel.util.CatalogueUtil;
+import com.lantone.qc.pub.model.InputInfo;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
+import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
+import com.lantone.qc.pub.model.entity.Drug;
+import com.lantone.qc.pub.model.label.ConsultationResultLabel;
+import com.lantone.qc.pub.util.StringUtil;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : ConsultationAI
+ * @Description :
+ * @Author : 胡敬
+ * @Date: 2020-09-01 16:40
+ */
+public class ConsultationAI extends ModelAI {
+    /**
+     *
+     */
+    public static List<String> medicalTextType = Arrays.asList("CourseRecordSRR");
+    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<ConsultationDoc> docs = inputInfo.getConsultationDocs();
+        List<ConsultationResultsDoc> resultsDocs = docs.stream().map(ConsultationDoc::getConsultationResultsDoc).filter(Objects::nonNull).collect(Collectors.toList());
+        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, i + "药物");
+        }
+
+        JSONObject midData = loadAI(inputInfo.isUseCrfCache(), inputInfo.getMedicalRecordInfoDoc().getStructureMap().get("behospitalCode"), crfContent, crfServiceClient);//crf返回数据
+
+        for (int i = 0; i < resultsDocs.size(); i++) {
+            if (midData.get(i + "药物") == null) {
+                continue;
+            }
+            ConsultationResultsDoc resultsDoc = resultsDocs.get(i);
+            ConsultationResultLabel consultationResultLabel = new ConsultationResultLabel();
+            List<Drug> drugs = putDrugCrfData(midData.getJSONObject(i + "药物"));
+            consultationResultLabel.setDrugs(drugs);
+            resultsDoc.setConsultationResultLabel(consultationResultLabel);
+        }
+    }
+
+
+    /**
+     * 存放抓取的药品
+     *
+     * @param jsonObject
+     */
+    public List<Drug> putDrugCrfData(JSONObject jsonObject) {
+        JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
+        if (aiOut == null) {
+            return new ArrayList<>();
+        }
+        EntityProcessDrug entityProcessDrug = new EntityProcessDrug();
+        List<Drug> drugs = entityProcessDrug.extractEntity(aiOut);
+        return drugs;
+    }
+
+    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);
+    }
+}

+ 30 - 1
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/FirstCourseRecordAI.java

@@ -7,12 +7,15 @@ import com.lantone.qc.kernel.client.CRFServiceClient;
 import com.lantone.qc.kernel.client.SimilarityServiceClient;
 import com.lantone.qc.kernel.structure.ai.process.EntityProcessClinic;
 import com.lantone.qc.kernel.structure.ai.process.EntityProcessDiag;
+import com.lantone.qc.kernel.structure.ai.process.EntityProcessDrug;
 import com.lantone.qc.kernel.structure.ai.process.EntityProcessTreatPlan;
 import com.lantone.qc.kernel.util.CatalogueUtil;
 import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.doc.FirstCourseRecordDoc;
 import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.entity.Drug;
+import com.lantone.qc.pub.model.label.DrugLabel;
 import com.lantone.qc.pub.model.label.PresentLabel;
 import com.lantone.qc.pub.model.label.TreatPlanLabel;
 import com.lantone.qc.pub.util.StringUtil;
@@ -32,7 +35,8 @@ public class FirstCourseRecordAI extends ModelAI {
     /**
      *
      */
-    public static List<String> medicalTextType = Arrays.asList("FirstCoursera_cx", "Diagnoses_cx", "FirstCourseTreatment_cx");
+    public static List<String> medicalTextType = Arrays.asList("FirstCoursera_cx", "Diagnoses_cx"
+            , "FirstCourseTreatment_cx", "CourseRecordSRR");
     public static String entityRelationObject = "entity_relation_object";
     public static String outputs = "outputs";
     public static String content = "content";
@@ -82,6 +86,9 @@ public class FirstCourseRecordAI extends ModelAI {
             if (treatPlanLabel != null && StringUtil.isNotBlank(treatPlanLabel.getAiText())) {
                 putContent(crfContent, medicalTextType.get(2), treatPlanLabel.getAiText(), "诊疗计划");
             }
+
+            String drugContent = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList("治疗计划"));
+            putContent(crfContent, medicalTextType.get(3), drugContent, "药品");
             /*
             if (StringUtils.isNotEmpty(structureMap.get("诊疗计划")) && StringUtils.isNotEmpty(structureMap.get("需求评估"))) {
                 putContent(crfContent, medicalTextType.get(2), structureMap.get("诊疗计划") + structureMap.get("需求评估"), "诊疗计划");
@@ -124,6 +131,9 @@ public class FirstCourseRecordAI extends ModelAI {
             if (midData.containsKey("诊疗计划")) {
                 putTreatPlanCrfData(midData.getJSONObject("诊疗计划"), inputInfo);//处理诊疗计划
             }
+            if (midData.containsKey("药品")) {
+                putDrugCrfData(midData.getJSONObject("药品"), inputInfo);
+            }
 
             double likeRate = loadSimilarAI(similarContent, similarityServiceClient);
             putCaseCharacteristicSimilarData(likeRate, inputInfo);//存放与现病史文本相似度
@@ -228,4 +238,23 @@ public class FirstCourseRecordAI extends ModelAI {
         treatPlanLabel.setText(inputInfo.getFirstCourseRecordDoc().getTreatPlanLabel().getText());
         inputInfo.getFirstCourseRecordDoc().setTreatPlanLabel(treatPlanLabel);
     }
+
+    /**
+     * 存放抓取的药品
+     *
+     * @param jsonObject
+     * @param inputInfo
+     */
+    public void putDrugCrfData(JSONObject jsonObject, InputInfo inputInfo) {
+        JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
+        if (aiOut == null) {
+            return;
+        }
+        EntityProcessDrug entityProcessDrug = new EntityProcessDrug();
+        List<Drug> drugs = entityProcessDrug.extractEntity(aiOut);
+        FirstCourseRecordDoc firstCourseRecordDoc = inputInfo.getFirstCourseRecordDoc();
+        DrugLabel label = new DrugLabel();
+        label.setDrugs(drugs);
+        firstCourseRecordDoc.setDrugLabel(label);
+    }
 }

+ 39 - 26
kernel/src/main/java/com/lantone/qc/kernel/structure/ai/OperationAI.java

@@ -11,10 +11,13 @@ import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.model.InputInfo;
 import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
 import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
 import com.lantone.qc.pub.model.entity.Drug;
 import com.lantone.qc.pub.model.label.OperationDiscussionLabel;
+import com.lantone.qc.pub.model.label.OperationRecordLabel;
 import com.lantone.qc.pub.util.StringUtil;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -40,36 +43,47 @@ public class OperationAI extends ModelAI {
         JSONArray crfContent = new JSONArray();
         List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
         for (int i = 0; i < operationDocs.size(); i++) {
-            if (operationDocs.get(i).getOperationDiscussionDoc() == null) {
-                continue;
+            if (operationDocs.get(i).getOperationRecordDoc() != null) {
+                OperationRecordDoc operationRecordDoc = operationDocs.get(i).getOperationRecordDoc();
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                //存放抓取的药品
+                String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList("手术经过"));
+                putContent(crfContent, medicalTextType.get(1), content, "手术记录" + i + "药物");
+            }
+            if (operationDocs.get(i).getOperationDiscussionDoc() != null) {
+                OperationDiscussionDoc operationDiscussionDoc = operationDocs.get(i).getOperationDiscussionDoc();
+                Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
+                String discussionText = CatalogueUtil.structureMapJoin(structureMap, discussionKey);
+                putContent(crfContent, medicalTextType.get(0), discussionText, Content.operation_Discussion + i);
+                //存放抓取的药品
+                String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList("治疗计划和措施"));
+                putContent(crfContent, medicalTextType.get(1), content, Content.operation_Discussion + i + "药物");
             }
-            OperationDiscussionDoc operationDiscussionDoc = operationDocs.get(i).getOperationDiscussionDoc();
-            Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
-            String discussionText = CatalogueUtil.structureMapJoin(structureMap, discussionKey);
-            putContent(crfContent, medicalTextType.get(0), discussionText, Content.operation_Discussion + i);
-            //存放抓取的药品
-            String content = CatalogueUtil.structureMapJoin(structureMap, Lists.newArrayList("治疗计划和措施"));
-            putContent(crfContent, medicalTextType.get(1), content, Content.operation_Discussion + i + "药物");
         }
 
         JSONObject midData = loadAI(inputInfo.isUseCrfCache(), inputInfo.getMedicalRecordInfoDoc().getStructureMap().get("behospitalCode"), crfContent, crfServiceClient);//crf返回数据
 
         for (int i = 0; i < operationDocs.size(); i++) {
-            if (midData.get(Content.operation_Discussion + i) == null) {
-                continue;
-            }
-            OperationDiscussionDoc discussionDoc = operationDocs.get(i).getOperationDiscussionDoc();
-            OperationDiscussionLabel discussionLabel = putOperationDiscussionCrfData(midData.getJSONObject(Content.operation_Discussion + i));
-            if (discussionLabel != null) {
-                discussionDoc.setOperationDiscussionLabel(discussionLabel);
+            if (midData.get("手术记录" + i + "药物") != null) {
+                OperationRecordDoc operationRecordDoc = operationDocs.get(i).getOperationRecordDoc();
+                //手术记录药品
+                OperationRecordLabel operationRecordLabel = new OperationRecordLabel();
+                operationRecordLabel.setDrugs(putDrugCrfData(midData.getJSONObject("手术记录" + i + "药物")));
             }
-            //药品
-            if (midData.get(Content.operation_Discussion + i + "药物") != null) {
-                discussionLabel = operationDocs.get(i).getOperationDiscussionDoc().getOperationDiscussionLabel();
-                if (discussionLabel == null) {
-                    discussionLabel = new OperationDiscussionLabel();
+            if (midData.get(Content.operation_Discussion + i) != null) {
+                OperationDiscussionDoc discussionDoc = operationDocs.get(i).getOperationDiscussionDoc();
+                OperationDiscussionLabel discussionLabel = putOperationDiscussionCrfData(midData.getJSONObject(Content.operation_Discussion + i));
+                if (discussionLabel != null) {
+                    discussionDoc.setOperationDiscussionLabel(discussionLabel);
+                }
+                //术后首程药品
+                if (midData.get(Content.operation_Discussion + i + "药物") != null) {
+                    discussionLabel = operationDocs.get(i).getOperationDiscussionDoc().getOperationDiscussionLabel();
+                    if (discussionLabel == null) {
+                        discussionLabel = new OperationDiscussionLabel();
+                    }
+                    discussionLabel.setDrugs(putDrugCrfData(midData.getJSONObject(Content.operation_Discussion + i + "药物")));
                 }
-                putDrugCrfData(midData.getJSONObject(Content.operation_Discussion + i + "药物"), discussionLabel);
             }
         }
     }
@@ -93,16 +107,15 @@ public class OperationAI extends ModelAI {
      * 存放抓取的药品
      *
      * @param jsonObject
-     * @param operationDiscussionLabel
      */
-    public void putDrugCrfData(JSONObject jsonObject, OperationDiscussionLabel operationDiscussionLabel) {
+    public List<Drug> putDrugCrfData(JSONObject jsonObject) {
         JSONObject aiOut = loadEntity(jsonObject, entityRelationObject, outputs, content);
         if (aiOut == null) {
-            return;
+            return new ArrayList<>();
         }
         EntityProcessDrug entityProcessDrug = new EntityProcessDrug();
         List<Drug> drugs = entityProcessDrug.extractEntity(aiOut);
-        operationDiscussionLabel.setDrugs(drugs);
+        return drugs;
     }
 
     protected void putContent(JSONArray crfContent, String medicalTextType, String text, String sign) {

+ 3 - 4
public/src/main/java/com/lantone/qc/pub/model/doc/FirstCourseRecordDoc.java

@@ -1,9 +1,6 @@
 package com.lantone.qc.pub.model.doc;
 
-import com.lantone.qc.pub.model.label.CaseCharacteristicLabel;
-import com.lantone.qc.pub.model.label.DiagLabel;
-import com.lantone.qc.pub.model.label.DiagnosisLabel;
-import com.lantone.qc.pub.model.label.TreatPlanLabel;
+import com.lantone.qc.pub.model.label.*;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -26,4 +23,6 @@ public class FirstCourseRecordDoc extends ModelDoc {
     private DiagLabel differentialDiagLabel;
     //诊疗计划
     private TreatPlanLabel treatPlanLabel;
+    //药品-抗生素
+    private DrugLabel drugLabel;
 }

+ 2 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/consultation/ConsultationResultsDoc.java

@@ -1,6 +1,7 @@
 package com.lantone.qc.pub.model.doc.consultation;
 
 import com.lantone.qc.pub.model.doc.ModelDoc;
+import com.lantone.qc.pub.model.label.ConsultationResultLabel;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -13,4 +14,5 @@ import lombok.Setter;
 @Setter
 public class ConsultationResultsDoc extends ModelDoc {
     private String consultationName;
+    private ConsultationResultLabel consultationResultLabel;
 }

+ 2 - 0
public/src/main/java/com/lantone/qc/pub/model/doc/operation/OperationRecordDoc.java

@@ -1,6 +1,7 @@
 package com.lantone.qc.pub.model.doc.operation;
 
 import com.lantone.qc.pub.model.doc.ModelDoc;
+import com.lantone.qc.pub.model.label.OperationRecordLabel;
 import lombok.Getter;
 import lombok.Setter;
 
@@ -13,4 +14,5 @@ import lombok.Setter;
 @Setter
 public class OperationRecordDoc extends ModelDoc {
     private String operationName;
+    private OperationRecordLabel operationRecordLabel;
 }

+ 19 - 0
public/src/main/java/com/lantone/qc/pub/model/label/ConsultationResultLabel.java

@@ -0,0 +1,19 @@
+package com.lantone.qc.pub.model.label;
+
+import com.lantone.qc.pub.model.entity.Drug;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description :
+ * @Author : HUJING
+ * @Date: 2020/9/1 16:46
+ */
+@Getter
+@Setter
+public class ConsultationResultLabel {
+    private List<Drug> drugs = new ArrayList<>();
+}

+ 19 - 0
public/src/main/java/com/lantone/qc/pub/model/label/DrugLabel.java

@@ -0,0 +1,19 @@
+package com.lantone.qc.pub.model.label;
+
+import com.lantone.qc.pub.model.entity.Drug;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description :   CRF模型抓取的抗生素
+ * @Author : HUJING
+ * @Date: 2020/9/1 16:35
+ */
+@Getter
+@Setter
+public class DrugLabel {
+    private List<Drug> drugs = new ArrayList<>();
+}

+ 20 - 0
public/src/main/java/com/lantone/qc/pub/model/label/OperationRecordLabel.java

@@ -0,0 +1,20 @@
+package com.lantone.qc.pub.model.label;
+
+import com.lantone.qc.pub.model.entity.Drug;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName : OperationRecordLabel
+ * @Description :
+ * @Author : 胡敬
+ * @Date: 2020-09-01 17:04
+ */
+@Getter
+@Setter
+public class OperationRecordLabel {
+    private List<Drug> drugs = new ArrayList<>();  //药物
+}