|
@@ -2,6 +2,7 @@ package com.lantone.qc.kernel.catalogue.threelevelward;
|
|
|
|
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Lists;
|
|
import com.google.common.collect.Maps;
|
|
import com.google.common.collect.Maps;
|
|
|
|
+import com.google.common.collect.Sets;
|
|
import com.lantone.qc.kernel.catalogue.QCCatalogue;
|
|
import com.lantone.qc.kernel.catalogue.QCCatalogue;
|
|
import com.lantone.qc.kernel.util.CatalogueUtil;
|
|
import com.lantone.qc.kernel.util.CatalogueUtil;
|
|
import com.lantone.qc.kernel.util.SimilarityUtil;
|
|
import com.lantone.qc.kernel.util.SimilarityUtil;
|
|
@@ -9,12 +10,10 @@ import com.lantone.qc.pub.model.InputInfo;
|
|
import com.lantone.qc.pub.model.OutputInfo;
|
|
import com.lantone.qc.pub.model.OutputInfo;
|
|
import com.lantone.qc.pub.model.doc.*;
|
|
import com.lantone.qc.pub.model.doc.*;
|
|
import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
|
|
import com.lantone.qc.pub.model.doc.consultation.ConsultationDoc;
|
|
-import com.lantone.qc.pub.model.doc.consultation.ConsultationResultsDoc;
|
|
|
|
import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
|
|
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.OperationDoc;
|
|
import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
|
|
import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
|
|
import com.lantone.qc.pub.model.entity.Drug;
|
|
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.DateUtil;
|
|
import com.lantone.qc.pub.util.StringUtil;
|
|
import com.lantone.qc.pub.util.StringUtil;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
@@ -53,27 +52,34 @@ public class THR02986 extends QCCatalogue {
|
|
if (allDoctorWradDocs.size() == 0) {
|
|
if (allDoctorWradDocs.size() == 0) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ List<Map<String, String>> docAdvStruct = doctorAdviceDocs
|
|
|
|
+ .stream()
|
|
|
|
+ .filter(Objects::nonNull)
|
|
|
|
+ .map(DoctorAdviceDoc::getStructureMap)
|
|
|
|
+ .filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("激素"))
|
|
|
|
+ .filter(x -> StringUtil.isNotBlank(x.get("医嘱状态判别")) && !x.get("医嘱状态判别").contains("已停止"))
|
|
|
|
+ .filter(x -> StringUtil.isNotBlank(x.get("给药方式")) && x.get("给药方式").contains("静脉滴注"))
|
|
|
|
+ .filter(x -> StringUtil.isNotBlank(x.get("医嘱频率")) && !x.get("医嘱频率").equals("ONCE"))
|
|
|
|
+ .collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ //记录同一天内是否开过多次同一激素
|
|
|
|
+ Map<String, Map<Date, Integer>> antibioticDateTimes = Maps.newHashMap();
|
|
|
|
+ //记录同一激素同一天内是否开过多次,用于医嘱中需要处理的激素过滤(一天内同一激素开过多次的激素直接过滤)
|
|
|
|
+ getAntibioticTimes(docAdvStruct, antibioticDateTimes);
|
|
Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
|
|
Map<Date, String> doctorAdviceDrugMap = Maps.newLinkedHashMap();
|
|
- for (DoctorAdviceDoc adviceDoc : doctorAdviceDocs) {
|
|
|
|
- Map<String, String> adviceDocStructureMap = adviceDoc.getStructureMap();
|
|
|
|
- String name = adviceDocStructureMap.get("医嘱项目名称");
|
|
|
|
- String drugCategory = adviceDocStructureMap.get("药品类型");
|
|
|
|
- String startDateStr = adviceDocStructureMap.get("医嘱开始时间");
|
|
|
|
- if (StringUtil.isNotBlank(drugCategory) && drugCategory.contains("激素")) {
|
|
|
|
- if (StringUtil.isNotBlank(name)) {
|
|
|
|
- if (Arrays.asList(KSS).contains(name)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- name = name.replaceAll("[针]", "");
|
|
|
|
- if (name.contains(" ")) {
|
|
|
|
- name = name.split(" ")[0];
|
|
|
|
- }
|
|
|
|
- Date startDate = StringUtil.parseDateTime(startDateStr);
|
|
|
|
- if (startDate != null) {
|
|
|
|
- startDate = DateUtil.dateZeroClear(startDate);
|
|
|
|
- doctorAdviceDrugMap.put(startDate, name);
|
|
|
|
- }
|
|
|
|
|
|
+ Date startDate = null;
|
|
|
|
+ for (Map<String, String> adviceDoc : docAdvStruct) {
|
|
|
|
+ String drugName = adviceDoc.get("医嘱项目名称");
|
|
|
|
+ String startDateStr = adviceDoc.get("医嘱开始时间");
|
|
|
|
+ if (StringUtil.isNotBlank(drugName)) {
|
|
|
|
+ if (Arrays.asList(JS).contains(drugName)) {
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
+ startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
|
|
|
|
+ if (antibioticDateTimes.get(drugName).get(startDate) > 0) {
|
|
|
|
+ continue; //一天内同一激素开过多次的激素直接过滤
|
|
|
|
+ }
|
|
|
|
+ doctorAdviceDrugMap.put(startDate, drugName);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -128,7 +134,7 @@ public class THR02986 extends QCCatalogue {
|
|
}
|
|
}
|
|
|
|
|
|
//从会诊记录中获取信息
|
|
//从会诊记录中获取信息
|
|
- if (consultationDocs.size() > 0) {
|
|
|
|
|
|
+ /*if (consultationDocs.size() > 0) {
|
|
List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
|
|
List<ConsultationResultsDoc> consultationResultsDocs = consultationDocs
|
|
.stream()
|
|
.stream()
|
|
.map(ConsultationDoc::getConsultationResultsDoc)
|
|
.map(ConsultationDoc::getConsultationResultsDoc)
|
|
@@ -137,7 +143,7 @@ public class THR02986 extends QCCatalogue {
|
|
.collect(Collectors.toList());
|
|
.collect(Collectors.toList());
|
|
consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
|
|
consultationResultsDocs.forEach(x -> getInfo(info, x.getStructureMap(), "会诊结果单", "会诊日期及时间", "会诊意见"));
|
|
consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
|
|
consultationResultsDocs.forEach(x -> getInfo(infoModel, x.getStructureMap().get("会诊日期及时间"), x.getConsultationResultLabel().getDrugs()));
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
|
|
|
|
//从出院小结中获取信息
|
|
//从出院小结中获取信息
|
|
if (leaveHospitalDoc != null) {
|
|
if (leaveHospitalDoc != null) {
|
|
@@ -152,17 +158,23 @@ public class THR02986 extends QCCatalogue {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
|
+ Map<Object, Object> data = Maps.newHashMap();
|
|
|
|
+ Set<String> existDrug = Sets.newHashSet();
|
|
String infoStr = "";
|
|
String infoStr = "";
|
|
for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
|
|
for (Map.Entry<Date, String> doctorAdviceDrug : doctorAdviceDrugMap.entrySet()) {
|
|
Date doctorAdviceDate = doctorAdviceDrug.getKey();
|
|
Date doctorAdviceDate = doctorAdviceDrug.getKey();
|
|
String drugs = doctorAdviceDrug.getValue();
|
|
String drugs = doctorAdviceDrug.getValue();
|
|
|
|
+ if (drugs.contains(" ")) {
|
|
|
|
+ drugs = drugs.split(" ")[0];
|
|
|
|
+ }
|
|
drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
|
|
drugs = removeBracket(drugs).replaceAll("[^\u4e00-\u9fa5]", "");
|
|
Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
|
|
Set<String> splitDrugs = CatalogueUtil.getRegexWords(drugs, "[((\\[][^\\[\\]()()]+[\\]))]")
|
|
- .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产") && !x.contains("胰岛素")).collect(Collectors.toSet());
|
|
|
|
|
|
+ .stream().filter(x -> !x.equals("合资") && !x.equals("进口") && !x.equals("国产")).collect(Collectors.toSet());
|
|
/**********************************************先文本匹配************************************************/
|
|
/**********************************************先文本匹配************************************************/
|
|
String missDrug = "";
|
|
String missDrug = "";
|
|
for (Map.Entry<String, Date> map : info.entrySet()) {
|
|
for (Map.Entry<String, Date> map : info.entrySet()) {
|
|
- missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug);
|
|
|
|
|
|
+ missDrug = getMissDrug(map.getKey(), map.getValue(), doctorAdviceDate, splitDrugs, 2, missDrug, existDrug);
|
|
//当前激素药(drugs)在info中已找到,直接跳出当前循环
|
|
//当前激素药(drugs)在info中已找到,直接跳出当前循环
|
|
if (StringUtil.isBlank(missDrug)) {
|
|
if (StringUtil.isBlank(missDrug)) {
|
|
break;
|
|
break;
|
|
@@ -195,12 +207,44 @@ public class THR02986 extends QCCatalogue {
|
|
}
|
|
}
|
|
|
|
|
|
if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
|
|
if (StringUtil.isNotBlank(missDrug) && !modelFind && CatalogueUtil.compareTime(doctorAdviceDate, new Date(), 48 * 60L)) {
|
|
- infoStr = CatalogueUtil.concatInfo(infoStr, splitDrugs.toString().replaceAll("[\\[\\]]", "") + "(" + DateUtil.formatDate(doctorAdviceDate) + ")");
|
|
|
|
|
|
+ infoAppend(sb, splitDrugs.toString().replaceAll("[\\[\\]]", ""), DateUtil.formatDate(doctorAdviceDate));
|
|
|
|
+ data.put(doctorAdviceDate, splitDrugs.toString().replaceAll("[\\[\\]]", ""));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if (StringUtil.isNotBlank(infoStr)) {
|
|
|
|
|
|
+ if (StringUtil.isNotBlank(sb.toString())) {
|
|
this.status.set("-1");
|
|
this.status.set("-1");
|
|
- this.info.set(infoStr);
|
|
|
|
|
|
+ this.info.set("医嘱:" + sb.toString().substring(0, sb.toString().length() - 1));
|
|
|
|
+ extData.set(data);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 记录同一激素同一天内是否开过多次,用于医嘱中需要处理的激素过滤(一天内同一激素开过多次的激素直接过滤)
|
|
|
|
+ *
|
|
|
|
+ * @param docAdvStruct
|
|
|
|
+ * @param antibioticDateTimes
|
|
|
|
+ */
|
|
|
|
+ private void getAntibioticTimes(List<Map<String, String>> docAdvStruct, Map<String, Map<Date, Integer>> antibioticDateTimes) {
|
|
|
|
+ String drugName;
|
|
|
|
+ String startDateStr;
|
|
|
|
+ Date startDate;
|
|
|
|
+ Map<Date, Integer> antibioticDateTime;
|
|
|
|
+ for (Map<String, String> structMap : docAdvStruct) {
|
|
|
|
+ drugName = structMap.get("医嘱项目名称");
|
|
|
|
+ startDateStr = structMap.get("医嘱开始时间");
|
|
|
|
+ startDate = DateUtil.dateZeroClear(StringUtil.parseDateTime(startDateStr));
|
|
|
|
+ if (antibioticDateTimes.containsKey(drugName)) {
|
|
|
|
+ Map<Date, Integer> map = antibioticDateTimes.get(drugName);
|
|
|
|
+ if (map.containsKey(startDate)) {
|
|
|
|
+ map.put(startDate, map.get(startDate) + 1);
|
|
|
|
+ } else {
|
|
|
|
+ map.put(startDate, 0);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ antibioticDateTime = Maps.newHashMap();
|
|
|
|
+ antibioticDateTime.put(startDate, 0);
|
|
|
|
+ antibioticDateTimes.put(drugName, antibioticDateTime);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -239,7 +283,7 @@ public class THR02986 extends QCCatalogue {
|
|
* @param days
|
|
* @param days
|
|
* @return 如果文本中找到该药,则返回空字符串
|
|
* @return 如果文本中找到该药,则返回空字符串
|
|
*/
|
|
*/
|
|
- private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug) {
|
|
|
|
|
|
+ private String getMissDrug(String content, Date wardDate, Date doctorAdviceDate, Set<String> drugs, int days, String missDrug, Set<String> existDrug) {
|
|
if ("时间不匹配".equals(missDrug)) {
|
|
if ("时间不匹配".equals(missDrug)) {
|
|
missDrug = "";//初始化缺失药物
|
|
missDrug = "";//初始化缺失药物
|
|
}
|
|
}
|
|
@@ -252,9 +296,10 @@ public class THR02986 extends QCCatalogue {
|
|
continue;
|
|
continue;
|
|
}
|
|
}
|
|
if (content.contains(drug.replaceAll("[^\\u4e00-\\u9fa5]", ""))
|
|
if (content.contains(drug.replaceAll("[^\\u4e00-\\u9fa5]", ""))
|
|
- || regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
|
|
|
|
- || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前")) {
|
|
|
|
|
|
+ || (existDrug.contains(drug) && (regexFind(content, "继续", "治疗") || regexFind(content, "维持", "治疗")
|
|
|
|
+ || regexFind(content, "继续", "抗感染") || regexFind(content, "治疗", "同前")))) {
|
|
findDrug = true;
|
|
findDrug = true;
|
|
|
|
+ existDrug.add(drug);
|
|
break;
|
|
break;
|
|
} else {
|
|
} else {
|
|
missDrug = concatInfo(missDrug, drug);
|
|
missDrug = concatInfo(missDrug, drug);
|
|
@@ -325,7 +370,18 @@ public class THR02986 extends QCCatalogue {
|
|
return str;
|
|
return str;
|
|
}
|
|
}
|
|
|
|
|
|
- private static final String[] KSS = {
|
|
|
|
|
|
+ /**
|
|
|
|
+ * 拼接提示信息
|
|
|
|
+ *
|
|
|
|
+ * @param sb
|
|
|
|
+ * @param drugKey
|
|
|
|
+ * @param date
|
|
|
|
+ */
|
|
|
|
+ private void infoAppend(StringBuffer sb, String drugKey, String date) {
|
|
|
|
+ sb.append(drugKey).append("(").append(date).append(")").append(",");
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private static final String[] JS = {
|
|
"瑞格列奈片",
|
|
"瑞格列奈片",
|
|
"西格列汀片",
|
|
"西格列汀片",
|
|
"维格列汀片",
|
|
"维格列汀片",
|