|
@@ -0,0 +1,218 @@
|
|
|
+package com.lantone.qc.kernel.catalogue.hospital.ningbozhongyi.operationdiscussion;
|
|
|
+
|
|
|
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
|
|
|
+import com.lantone.qc.pub.Content;
|
|
|
+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.FirstPageRecordDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.PathologyShipDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
|
|
|
+import com.lantone.qc.pub.model.doc.operation.OperationRecordDoc;
|
|
|
+import com.lantone.qc.pub.util.ListUtil;
|
|
|
+import com.lantone.qc.pub.util.StringUtil;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.text.ParseException;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.regex.Matcher;
|
|
|
+import java.util.regex.Pattern;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @ClassName : OPE03111
|
|
|
+ * @Description: 手术病理检查存在手术记录中无病理相关记录
|
|
|
+ * @author: zh
|
|
|
+ * @time: 2021/04/06 11:22
|
|
|
+ */
|
|
|
+@Component
|
|
|
+public class OPE03111 extends QCCatalogue {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
|
|
|
+ status.set("0");
|
|
|
+ boolean blHz = false;
|
|
|
+ FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
|
|
|
+ List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
|
|
|
+ //是否包含手术记录
|
|
|
+ if(operationDocs==null || operationDocs.size()==0){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(operationDocs!=null) {
|
|
|
+ for (OperationDoc operationDoc : operationDocs) {
|
|
|
+ OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
|
|
|
+ if (operationRecordDoc == null) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //判断医嘱是否进行了病理检查
|
|
|
+ List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
|
|
|
+ if (ListUtil.isNotEmpty(doctorAdviceDocs)) {
|
|
|
+ for (DoctorAdviceDoc dad : doctorAdviceDocs) {
|
|
|
+ Map<String, String> dadStructureMap = dad.getStructureMap();
|
|
|
+ String daStatus = dadStructureMap.get(Content.doctorAdviceState);
|
|
|
+ String adviceType = dadStructureMap.get(Content.doctorAdviceType);
|
|
|
+ //取临时医嘱
|
|
|
+ if (StringUtil.isNotEmpty(adviceType) && adviceType.equals(Content.statOrder)) {
|
|
|
+ if (StringUtil.isNotEmpty(daStatus)) {
|
|
|
+ if (!Content.cancellationOrderList.contains(daStatus)) {
|
|
|
+ String name = dadStructureMap.get(Content.medicalOrderName);
|
|
|
+ if (bLStr(name)) {
|
|
|
+ blHz = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //用首页或出院判断是否进行了病理检查
|
|
|
+ if(firstPageRecordDoc!=null){
|
|
|
+ String str = firstPageRecordDoc.getStructureMap().get("病理诊断费");
|
|
|
+ if ( !str.equals("0") && StringUtil.isNotEmpty(str)) {
|
|
|
+ double a = Double.parseDouble(str);
|
|
|
+ if ( a > Content.pathologicalFee) {
|
|
|
+ blHz=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ List<PathologyShipDoc> pathologyShipDocs = inputInfo.getPathologyShipDocs();
|
|
|
+ if(ListUtil.isNotEmpty(pathologyShipDocs)){
|
|
|
+ blHz=true;
|
|
|
+ }
|
|
|
+ //判断手术记录有无标本记录
|
|
|
+ if(blHz) {
|
|
|
+ status.set("-1");
|
|
|
+ if (operationDocs != null ) {
|
|
|
+ //有手术记录的情况下,手术记录中应该出现体现有标本
|
|
|
+ for (OperationDoc operationDoc : operationDocs) {
|
|
|
+ String specimens = operationDoc.getOperationRecordDoc().getStructureMap().get("术中取病理标本");
|
|
|
+ String pathological = operationDoc.getOperationRecordDoc().getStructureMap().get("病理检查");
|
|
|
+ if(StringUtil.isNotEmpty(specimens)){
|
|
|
+ if(specimens.equals("有")){
|
|
|
+ status.set("0");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(specimens.equals("无")){
|
|
|
+ status.set("0");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (StringUtil.isNotEmpty(pathological)){
|
|
|
+ if (pathological.equals("送")){
|
|
|
+ status.set("0");
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
|
|
|
+ if (operationRecordDoc != null) {
|
|
|
+ String str = operationRecordDoc.getStructureMap().get("手术经过及处理");
|
|
|
+ if (StringUtil.isNotEmpty(str)) {
|
|
|
+ if (dateStr(str)) {
|
|
|
+ status.set("0");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private boolean dateStr(String string){
|
|
|
+ if(StringUtil.isEmpty(string)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ boolean flag=false;
|
|
|
+ String str = Str(string);
|
|
|
+ String rex="[\\s\\S]*(?=流式)[\\s\\S]*";
|
|
|
+ String rex1="[\\s\\S]*(?=穿透)[^,;,;。]{0,7}(?=层)[\\s\\S]*";
|
|
|
+ String rex2="[\\s\\S]*(?=癌)[^,;,;。]{0,6}(?=浸润)[\\s\\S]*";
|
|
|
+ String rex3="[\\s\\S]*(?=分化)[\\s\\S]*";
|
|
|
+ String rex4="[\\s\\S]*(?=淋巴结)[^,;,;。]{0,8}(?=转移)[\\s\\S]*";
|
|
|
+ String rex5="[\\s\\S]*(?=浸润性)[^,;,;。]{0,8}(?=癌)[\\s\\S]*";
|
|
|
+ String rex6="[\\s\\S]*(?=突破)[^,;,;。]{0,7}(?=层)[\\s\\S]*";
|
|
|
+ List<String> surgeryPathologyList = Content.surgeryPathologyList;
|
|
|
+ for (String surgeryPathology : surgeryPathologyList) {
|
|
|
+ if(str.contains(surgeryPathology)){
|
|
|
+ flag=true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(flag || str.matches(rex1)|| str.matches(rex2)
|
|
|
+ ||str.matches(rex3)|| str.matches(rex4)||str.matches(rex5)|| str.matches(rex6)|| str.matches(rex)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if(str.contains("冰冻")){
|
|
|
+ if(bdStr(str)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ private boolean bLStr(String string){
|
|
|
+ if(StringUtil.isEmpty(string)){
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ String str = Str(string);
|
|
|
+ List<String> doctorAdvicePathologyList = Content.doctorAdvicePathologyList;
|
|
|
+ for (String doctorAdvicePathology : doctorAdvicePathologyList) {
|
|
|
+ if(str.contains(doctorAdvicePathology)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(str.contains("冰冻")){
|
|
|
+ if(bdStr(str)){
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ //判断包含冰冻但不属于病理
|
|
|
+ private boolean bdStr(String str) {
|
|
|
+ ArrayList<String> blStrings = new ArrayList<>();
|
|
|
+ String rex1="[\\s\\S]{0,10}(?=冰冻)[\\s\\S]{0,10}";
|
|
|
+ Matcher matcher = Pattern.compile(rex1).matcher(str);
|
|
|
+ while (matcher.find()) {
|
|
|
+ String group = matcher.group();
|
|
|
+ blStrings.add(group);
|
|
|
+ }
|
|
|
+ List<String> notBLList = Content.notBDBLList;
|
|
|
+ if (ListUtil.isNotEmpty(blStrings)) {
|
|
|
+ for (String notBL : notBLList) {
|
|
|
+ for (int i = 0; i < blStrings.size(); i++) {
|
|
|
+ String cfStr = blStrings.get(i);
|
|
|
+ if (cfStr.contains(notBL)) {
|
|
|
+ blStrings.remove(i);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (blStrings.size() > 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ private String Str(String str){
|
|
|
+ str = str.replaceAll("\\*", "\\\\*");
|
|
|
+ str = str.replaceAll("\\)", "\\\\)");
|
|
|
+ str = str.replaceAll("\\.", "\\\\.");
|
|
|
+ str = str.replaceAll("\\?", "\\\\?");
|
|
|
+ str = str.replaceAll("\\+", "\\\\+");
|
|
|
+ str = str.replaceAll("\\$", "\\\\$");
|
|
|
+ str = str.replaceAll("\\^", "\\\\^");
|
|
|
+ str = str.replaceAll("\\[", "\\\\[");
|
|
|
+ str = str.replaceAll("\\]", "\\\\]");
|
|
|
+ str = str.replaceAll("\\(", "\\\\(");
|
|
|
+ str = str.replaceAll("\\{", "\\\\{");
|
|
|
+ str = str.replaceAll("\\}", "\\\\}");
|
|
|
+ str = str.replaceAll("\\|", "\\\\|");
|
|
|
+ str = str.replaceAll("\\/", "\\\\/");
|
|
|
+ return str;
|
|
|
+ }
|
|
|
+}
|