|
@@ -8,17 +8,19 @@ import com.lantone.qc.kernel.util.SimilarityUtil;
|
|
|
import com.lantone.qc.pub.model.InputInfo;
|
|
|
import com.lantone.qc.pub.model.OutputInfo;
|
|
|
import com.lantone.qc.pub.model.doc.DoctorAdviceDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
|
|
|
import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.operation.OperationDiscussionDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
|
|
|
import com.lantone.qc.pub.model.entity.Drug;
|
|
|
+import com.lantone.qc.pub.model.label.LeaveHospitalLabel;
|
|
|
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;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
-import java.util.Date;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
+import java.util.*;
|
|
|
import java.util.regex.Matcher;
|
|
|
import java.util.regex.Pattern;
|
|
|
import java.util.stream.Collectors;
|
|
@@ -37,7 +39,9 @@ public class THR03072 extends QCCatalogue {
|
|
|
status.set("0");
|
|
|
List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
|
|
|
List<ThreeLevelWardDoc> threeLevelWardDocs = inputInfo.getThreeLevelWardDocs();
|
|
|
- if (doctorAdviceDocs.size() == 0 || threeLevelWardDocs.size() == 0) {
|
|
|
+ List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
|
|
|
+ LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
|
|
|
+ if (doctorAdviceDocs.size() == 0) {
|
|
|
return;
|
|
|
}
|
|
|
//抗生素及开医嘱时间(包括减用过抗生素的时间) key:抗生素名 "2020-08-20,2020-08-21 ..."
|
|
@@ -54,21 +58,12 @@ public class THR03072 extends QCCatalogue {
|
|
|
.filter(x -> StringUtil.isNotBlank(x.get("药品类型")) && x.get("药品类型").contains("抗生素") && StringUtil.isNotBlank(x.get("医嘱单次剂量")))
|
|
|
.collect(Collectors.toList());
|
|
|
|
|
|
- docAdvStruct
|
|
|
- .stream()
|
|
|
- .map(x -> x.get("医嘱项目名称"))
|
|
|
- .forEach(y -> antibioticStatus.put(removeBracket(y), 0));
|
|
|
-
|
|
|
String drugName = null, value = null, startDateStr = null;
|
|
|
for (Map<String, String> structMap : docAdvStruct) {
|
|
|
drugName = structMap.get("医嘱项目名称");
|
|
|
value = structMap.get("医嘱单次剂量");
|
|
|
startDateStr = structMap.get("医嘱开始时间");
|
|
|
drugName = removeBracket(drugName);
|
|
|
- String drugStandardWord = similarityUtil.getDrugStandardWord(drugName);
|
|
|
- if (StringUtil.isNotBlank(drugStandardWord)) {
|
|
|
- drugName = drugStandardWord;
|
|
|
- }
|
|
|
collectAntibioticInfo(antibioticDate, antibioticStatus, antibioticValue, drugName, value, startDateStr);
|
|
|
}
|
|
|
|
|
@@ -76,6 +71,7 @@ public class THR03072 extends QCCatalogue {
|
|
|
for (Map.Entry<String, Integer> as : antibioticStatus.entrySet()) {
|
|
|
if (as.getValue() == 0) {
|
|
|
antibioticDate.remove(as.getKey());
|
|
|
+ antibioticValue.remove(as.getKey());
|
|
|
}
|
|
|
}
|
|
|
//抗生素减用过的集合如果为空,则一个抗生素都没有减用过,直接返回0
|
|
@@ -83,64 +79,82 @@ public class THR03072 extends QCCatalogue {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- //查房记录中抗生素及查房时间(包括减用过抗生素的时间) key:抗生素名 "2020-08-20,2020-08-21 ..."
|
|
|
- Map<String, List<String>> antibioticDateWard = Maps.newHashMap();
|
|
|
- //查房记录中抗生素减用集合 key:抗生素名 value: 0:未减用,1及以上:减用次数
|
|
|
- Map<String, Integer> antibioticStatusWard = Maps.newHashMap();
|
|
|
- //查房记录中抗生素及各初始剂量 key:抗生素名 value:抗生素第一次使用时剂量
|
|
|
- Map<String, List<Double>> antibioticValueWard = Maps.newHashMap();
|
|
|
- List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
|
|
|
- for (ThreeLevelWardDoc doc : allDoctorWradDocs) {
|
|
|
- if (doc.getThreeLevelWardLabel().size() == 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
|
|
|
- List<Drug> drugs = label.getDrugs();
|
|
|
- for (Drug drug : drugs) {
|
|
|
- String wardDrug = drug.getName();
|
|
|
- wardDrug = removeBracket(wardDrug);
|
|
|
- String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
|
|
|
- if (StringUtil.isNotBlank(drugStandardWord)) {
|
|
|
- wardDrug = drugStandardWord;
|
|
|
+ //病程记录中抗生素及查房时间(包括减用过抗生素的时间) key:抗生素名 "2020-08-20,2020-08-21 ..."
|
|
|
+ Map<String, List<String>> antibioticDateCourse = Maps.newHashMap();
|
|
|
+ //病程记录中抗生素减用集合 key:抗生素名 value: 0:未减用,1及以上:减用次数
|
|
|
+ Map<String, Integer> antibioticStatusCourse = Maps.newHashMap();
|
|
|
+ //病程记录中抗生素及各初始剂量 key:抗生素名 value:抗生素第一次使用时剂量
|
|
|
+ Map<String, List<Double>> antibioticValueCourse = Maps.newHashMap();
|
|
|
+ String dateStr = null;
|
|
|
+ /*********************************************查房记录********************************************************/
|
|
|
+ if (threeLevelWardDocs.size() > 0) {
|
|
|
+ List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocs.get(0).getAllDoctorWradDocs();
|
|
|
+ for (ThreeLevelWardDoc doc : allDoctorWradDocs) {
|
|
|
+ if (doc.getThreeLevelWardLabel().size() == 0) {
|
|
|
+ continue;
|
|
|
}
|
|
|
- //药品用量和使用原因都有时
|
|
|
- if (drug.getConsumption() != null) {
|
|
|
- //查房记录抗生素减用过的集合中没包含该抗生素,则认为该抗生素是第一次出现,此时不需要减用原因
|
|
|
- if (!antibioticStatusWard.containsKey(wardDrug) || drug.getUsageWardRound() != null) {
|
|
|
- String consumption = drug.getConsumption().getName();
|
|
|
- collectAntibioticInfo(antibioticDateWard, antibioticStatusWard, antibioticValueWard, wardDrug, consumption, doc.getStructureMap().get("查房日期"));
|
|
|
- }
|
|
|
+ dateStr = doc.getStructureMap().get("查房日期");
|
|
|
+ ThreeLevelWardLabel label = doc.getThreeLevelWardLabel().get(0);
|
|
|
+ List<Drug> drugs = label.getDrugs();
|
|
|
+ getCourseDrugInfo(antibioticDateCourse, antibioticStatusCourse, antibioticValueCourse, dateStr, drugs);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ /*********************************************术后首程********************************************************/
|
|
|
+ if (operationDocs.size() > 0) {
|
|
|
+ List<OperationDiscussionDoc> operationDiscussionDocs = operationDocs
|
|
|
+ .stream()
|
|
|
+ .map(OperationDoc::getOperationDiscussionDoc)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .filter(x -> x.getOperationDiscussionLabel() != null)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+ for (OperationDiscussionDoc discussionDoc : operationDiscussionDocs) {
|
|
|
+ dateStr = discussionDoc.getStructureMap().get("记录日期");
|
|
|
+ if (StringUtil.isBlank(dateStr)) {
|
|
|
+ continue;
|
|
|
}
|
|
|
+ List<Drug> drugs = discussionDoc.getOperationDiscussionLabel().getDrugs();
|
|
|
+ getCourseDrugInfo(antibioticDateCourse, antibioticStatusCourse, antibioticValueCourse, dateStr, drugs);
|
|
|
}
|
|
|
}
|
|
|
- //把查房记录中没减用过的抗生素删除
|
|
|
- /*for (Map.Entry<String, Integer> as : antibioticStatusWard.entrySet()) {
|
|
|
- if (as.getValue() == 0) {
|
|
|
- antibioticDateWard.remove(as.getKey());
|
|
|
+ /*********************************************出院小结********************************************************/
|
|
|
+ if (leaveHospitalDoc != null) {
|
|
|
+ LeaveHospitalLabel leaveHospitalLabel = leaveHospitalDoc.getLeaveHospitalLabel();
|
|
|
+ dateStr = leaveHospitalDoc.getStructureMap().get("出院时间");
|
|
|
+ if (leaveHospitalLabel != null && StringUtil.isNotBlank(dateStr)) {
|
|
|
+ List<Drug> drugs = leaveHospitalLabel.getDrugs();
|
|
|
+ getCourseDrugInfo(antibioticDateCourse, antibioticStatusCourse, antibioticValueCourse, dateStr, drugs);
|
|
|
}
|
|
|
- }*/
|
|
|
+ }
|
|
|
+ //将病程日期排序
|
|
|
+ antibioticDateCourse.forEach((x, y) -> y.sort(Comparator.naturalOrder()));
|
|
|
|
|
|
/**
|
|
|
* 1.antibioticDate:从医嘱中取 key:抗生素名 value:医嘱中该抗生素所有减用时的时间(包括初始使用时间)
|
|
|
- * 2.antibioticDateWard:从查房记录中取 key:抗生素名 value:查房记录中该抗生素所有已减用并且该抗生素有减用原因的查房时间(包括初始使用时间)
|
|
|
+ * 2.antibioticDateWard:从查房记录中取 key:抗生素名 value:查房记录中该抗生素所有减用时的查房时间(包括初始使用时间)
|
|
|
* 3.医嘱中该抗生素初始使用时间往后两天内,查房记录中该抗生素初始使用时间也在这两天内,则满足一半。
|
|
|
* 4.医嘱中该抗生素减用时的时间往后两天内,查房记录中该抗生素减用时间也在这两天内,则满足条件,该抗生素通过该条规则
|
|
|
* 5.继续判断下一个抗生素
|
|
|
* 6.若医嘱中减用过的抗生素,查房记录中没出现过,则该抗生素会报出来(存入miss,规则最后会把所有不符合的抗生素都报出来)
|
|
|
*/
|
|
|
- List<String> miss = Lists.newArrayList();
|
|
|
+ StringBuffer sb = new StringBuffer();
|
|
|
String drugKey = null, start = null, change = null, wardStartStr = null, wardChangeStr = null;
|
|
|
List<String> dateList = null;
|
|
|
for (Map.Entry<String, List<String>> ad : antibioticDate.entrySet()) {
|
|
|
drugKey = ad.getKey();
|
|
|
- if (!antibioticDateWard.containsKey(drugKey)) {
|
|
|
- miss.add(drugKey);
|
|
|
+ List<Double> antibioticValueList = antibioticValue.get(drugKey);//医嘱中该药品对应的所有用量
|
|
|
+ String drugStandardWord = similarityUtil.getDrugStandardWord(drugKey);
|
|
|
+ if (StringUtil.isNotBlank(drugStandardWord)) {
|
|
|
+ drugKey = drugStandardWord;
|
|
|
+ }
|
|
|
+ if (!antibioticDateCourse.containsKey(drugKey)) {
|
|
|
+ for (String date : ad.getValue()) {
|
|
|
+ infoAppend(sb, drugKey, date);
|
|
|
+ }
|
|
|
continue;
|
|
|
}
|
|
|
- List<Double> antibioticValueList = antibioticValue.get(drugKey);
|
|
|
- List<Double> antibioticValueWardList = antibioticValueWard.get(drugKey);
|
|
|
+ List<Double> antibioticValueWardList = antibioticValueCourse.get(drugKey);//病程记录中该药品对应的所有用量
|
|
|
int findNum = 0;
|
|
|
- for (int i = 1; i < antibioticValueList.size(); i++) {//从减用的值开始,如果减用过的值查房记录中都有,则不报该药
|
|
|
+ for (int i = 1; i < antibioticValueList.size(); i++) {//从加用的值开始,如果加用过的值查房记录中都有,则不报该药
|
|
|
if (antibioticValueWardList.contains(antibioticValueList.get(i))) {
|
|
|
findNum++;
|
|
|
}
|
|
@@ -150,7 +164,7 @@ public class THR03072 extends QCCatalogue {
|
|
|
}
|
|
|
dateList = ad.getValue();
|
|
|
int matchNum = 0;
|
|
|
- List<String> wardDateStr = antibioticDateWard.get(drugKey);
|
|
|
+ List<String> wardDateStr = antibioticDateCourse.get(drugKey);
|
|
|
for (int i = 0; i < dateList.size() - 1; i++) {
|
|
|
start = dateList.get(i); //抗生素开医嘱时间
|
|
|
change = dateList.get(i + 1); //抗生素用量改变时间
|
|
@@ -167,13 +181,42 @@ public class THR03072 extends QCCatalogue {
|
|
|
}
|
|
|
}
|
|
|
if (dateList.size() - 1 != matchNum) {
|
|
|
- miss.add(drugKey);
|
|
|
+ infoAppend(sb, drugKey, change);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (miss.size() > 0) {
|
|
|
+ if (sb.toString().length() > 0) {
|
|
|
status.set("-1");
|
|
|
- info.set(miss.toString().replaceAll("[\\[\\]]", ""));
|
|
|
+ info.set(sb.toString().substring(0, sb.toString().length() - 1));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 收集各模块药品信息
|
|
|
+ *
|
|
|
+ * @param antibioticDateWard 病程中抗生素使用所有时间
|
|
|
+ * @param antibioticStatusWard 病程中抗生素用量改变状态
|
|
|
+ * @param antibioticValueWard 病程中抗生素及用量
|
|
|
+ * @param dateStr 记录日期
|
|
|
+ * @param drugs 模型提取出的药品列表
|
|
|
+ */
|
|
|
+ private void getCourseDrugInfo(Map<String, List<String>> antibioticDateWard, Map<String, Integer> antibioticStatusWard,
|
|
|
+ Map<String, List<Double>> antibioticValueWard, String dateStr, List<Drug> drugs) {
|
|
|
+ for (Drug drug : drugs) {
|
|
|
+ String wardDrug = drug.getName();
|
|
|
+ wardDrug = removeBracket(wardDrug);
|
|
|
+ String drugStandardWord = similarityUtil.getDrugStandardWord(wardDrug);
|
|
|
+ if (StringUtil.isNotBlank(drugStandardWord)) {
|
|
|
+ wardDrug = drugStandardWord;
|
|
|
+ }
|
|
|
+ //药品用量和使用原因都有时
|
|
|
+ if (drug.getConsumption() != null) {
|
|
|
+ //查房记录抗生素减用过的集合中没包含该抗生素,则认为该抗生素是第一次出现,此时不需要减用原因
|
|
|
+ if (!antibioticStatusWard.containsKey(wardDrug) || drug.getUsageWardRound() != null) {
|
|
|
+ String consumption = drug.getConsumption().getName();
|
|
|
+ collectAntibioticInfo(antibioticDateWard, antibioticStatusWard, antibioticValueWard, wardDrug, consumption, dateStr);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -187,12 +230,13 @@ public class THR03072 extends QCCatalogue {
|
|
|
* @param value 抗生素用量
|
|
|
* @param startDateStr 抗生素使用时间(医嘱开始时间或查房时间)
|
|
|
*/
|
|
|
- private void collectAntibioticInfo(Map<String, List<String>> antibioticDate, Map<String, Integer> antibioticStatus, Map<String, List<Double>> antibioticValue, String drugName, String value, String startDateStr) {
|
|
|
+ private void collectAntibioticInfo(Map<String, List<String>> antibioticDate, Map<String, Integer> antibioticStatus,
|
|
|
+ Map<String, List<Double>> antibioticValue, String drugName, String value, String startDateStr) {
|
|
|
double v = -1;
|
|
|
try {
|
|
|
v = Double.parseDouble(getNumber(value));
|
|
|
} catch (Exception e) {
|
|
|
- System.out.println("THR03072: " + drugName + ":" + value + "解析异常");
|
|
|
+ System.out.println("THR03075: " + drugName + ":" + value + "解析异常");
|
|
|
}
|
|
|
if (v < 0) {
|
|
|
return;
|
|
@@ -236,4 +280,15 @@ public class THR03072 extends QCCatalogue {
|
|
|
return str;
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 拼接提示信息
|
|
|
+ *
|
|
|
+ * @param sb
|
|
|
+ * @param drugKey
|
|
|
+ * @param date
|
|
|
+ */
|
|
|
+ private void infoAppend(StringBuffer sb, String drugKey, String date) {
|
|
|
+ sb.append(drugKey).append("(").append(DateUtil.formatDate(StringUtil.parseDateTime(date))).append(")").append(",");
|
|
|
+ }
|
|
|
+
|
|
|
}
|