ソースを参照

使用植入物但手术记录或病程记录未记录相关信息

chengyao 4 年 前
コミット
416a9a5938

+ 70 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03119.java

@@ -0,0 +1,70 @@
+package com.lantone.qc.kernel.catalogue.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.ThreeLevelWardDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationDoc;
+import com.lantone.qc.pub.model.doc.operation.OperationInformedConsentDoc;
+import com.lantone.qc.pub.util.ListUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import java.text.ParseException;
+import java.util.*;
+
+/**
+ * @Description: 使用植入物但手术记录或病程记录未记录相关信息
+ * @author: cy
+ * @time: 2021/05/19 14:45
+ */
+@Component
+public class OPE03119 extends QCCatalogue {
+
+    @Override
+    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
+        status.set("0");
+        //先判断有无手术记录
+        List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+        long operationCount = 0L;
+        if (operationDocs != null && operationDocs.size() > 0) {
+             operationCount = operationDocs.stream().map(i -> i.getOperationInformedConsentDoc()).filter(i ->StringUtils.isNotEmpty(i.getStructureMap().get("使用植入性材料")) && StringUtils.isNotEmpty(i.getStructureMap().get("型号和数量符合要求")) && "true".equals(i.getStructureMap().get("使用植入性材料")) && "true".equals(i.getStructureMap().get("型号和数量符合要求"))).count();
+        }
+        Boolean flag = false;
+        Boolean modelFlag = false;
+        Boolean numFlag = false;
+        List<ThreeLevelWardDoc> threeLevelWardDocList = inputInfo.getThreeLevelWardDocs();
+        if (ListUtil.isNotEmpty(threeLevelWardDocList)) {
+            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDocList.get(0).getAllDoctorWradDocs();
+            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
+                String illness = allDoctorWradDoc.getStructureMap().get(Content.illnessRecords);
+                //判断病程记录是否记录植入物
+                    for (String plant : Content.IMPLANTSLIST) {
+                        if (illness.contains(plant)) {
+                            flag = true;
+                            break;
+                        }
+                    }
+
+                    for (String model : Content.MODELIST) {
+                        if(illness.contains(model)){
+                            modelFlag = true;
+                            break;
+                        }
+                    }
+
+                    for (String number : Content.NUMBERLIST) {
+                        if(illness.contains(number)){
+                            numFlag = true;
+                            break;
+                        }
+                    }
+                 }
+            }
+        if(operationCount <= 0 && flag == false && modelFlag == false  && numFlag == false){
+            status.set("-1");
+            return;
+        }
+    }
+}

+ 18 - 0
public/src/main/java/com/lantone/qc/pub/Content.java

@@ -371,4 +371,22 @@ public class Content {
      */
     public static List<String> BLOODRECORDLIST = Arrays.asList(
             "输血/成份血知情同意书","成份血知情同意书","输血知情同意书","使用血液制品知情同意书","血液制品治疗知情同意书","输血治疗知情同意书","输血治疗同意书","血液制品治疗同意书","输血(血制品)治疗知情同意书","输血制品同意书","临床输血治疗知情同意书");
+
+    /**
+     *   植入物
+     */
+    public static List<String> IMPLANTSLIST = Arrays.asList(
+            "植入物","支架植入术");
+
+    /**
+     *   种类
+     */
+    public static List<String> MODELIST = Arrays.asList(
+            "国产","进口");
+
+    /**
+     *   数量单位
+     */
+    public static List<String> NUMBERLIST = Arrays.asList(
+            "枚","支","块","个");
 }

+ 1 - 1
trans/src/main/java/com/lantone/qc/trans/beilun/BeiLunOperationDocTrans.java

@@ -367,7 +367,7 @@ public class BeiLunOperationDocTrans extends ModelDocTrans {
     }
 
     private List<String> keyContrasts = Lists.newArrayList(
-            "术种使用的植入性材料或高值耗材及风险=使用植入性材料且种类和数量符合要求"
+            "术种使用的植入性材料或高值耗材及风险=使用植入性材料"
     );
 
     private List<String> operationInformedConsent_sourceTitles = Lists.newArrayList(

+ 3 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/BeilunDocTrans.java

@@ -188,6 +188,9 @@ public class BeilunDocTrans extends DocTrans {
             inputInfo.getPageData().put("输血/血制品病程记录", inputInfo.getClinicalBloodDocs().stream().map(i -> i.getPageData()).collect(Collectors.toList()));
 //            inputInfo.setClinicalBloodDocs(inputInfo.getClinicalBloodDocs().stream().filter(i -> StringUtil.isNotBlank(i.getText()) && !i.getText().contains("输白蛋白")).collect(Collectors.toList()));
         }
+        if (inputInfo.getInformedConsentDoc() != null) {
+            inputInfo.getPageData().put("知情同意书", Lists.newArrayList(inputInfo.getInformedConsentDoc().getPageData()));
+        }
         if (ListUtil.isNotEmpty(inputInfo.getClinicBloodEffectDocs())) {
             inputInfo.getPageData().put(
                     "输血后效果评价",

+ 53 - 6
trans/src/main/java/com/lantone/qc/trans/beilun/BeilunInformedConsentDocTrans.java

@@ -1,9 +1,20 @@
 package com.lantone.qc.trans.beilun;
 
+import com.google.common.collect.Lists;
+import com.lantone.qc.pub.model.doc.DeathRecordDoc;
 import com.lantone.qc.pub.model.doc.InformedConsentDoc;
 import com.lantone.qc.pub.model.vo.MedrecVo;
+import com.lantone.qc.pub.util.FastJsonUtils;
 import com.lantone.qc.trans.ModelDocTrans;
-
+import com.lantone.qc.trans.beilun.util.BeiLunDeathRecordHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunHtmlAnalysis;
+import com.lantone.qc.trans.beilun.util.BeiLunInformedHtmlAnalysis;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import com.lantone.qc.trans.comsis.ModelDocGenerate;
+import com.lantone.qc.trans.comsis.OrdinaryAssistant;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -11,15 +22,51 @@ import java.util.Map;
  * @author: cy
  * @time: 2021/4/18 17:48
  */
+@Slf4j
 public class BeilunInformedConsentDocTrans extends ModelDocTrans {
     @Override
     public InformedConsentDoc extract(MedrecVo medrecVo) {
-        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
-        Map<String, Object> content = medrecVo.getContent();
-        if(content .size()>0){
-            Map<String, String> structureMap = informedConsentDoc.getStructureMap();
-            content.forEach((key,value)-> structureMap.put(key,value.toString()));
+//        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
+//        Map<String, Object> content = medrecVo.getContent();
+//        if(content .size()>0){
+//            Map<String, String> structureMap = informedConsentDoc.getStructureMap();
+//            content.forEach((key,value)-> structureMap.put(key,value.toString()));
+//        }
+        InformedConsentDoc informedConsentDoc = null;
+        try {
+            Map<String, Object> contentMap = ((List<Map>) medrecVo.getContent().get("content")).get(0);
+            String content = contentMap.get("xmlText").toString();
+            Map<String, String> structureMap = null;
+            if (contentMap.get("isParsed") != null && "1".equals(contentMap.get("isParsed").toString())) {
+                structureMap = (Map) FastJsonUtils.getJsonToMap(content);
+            } else {
+                String recTitle = contentMap.get("recTitle").toString();
+                String recTypeId = contentMap.get("recTypeId").toString();
+                BeiLunHtmlAnalysis beiLunHtmlAnalysis = new BeiLunInformedHtmlAnalysis();
+                Map<String, String> sourceMap = beiLunHtmlAnalysis.analysis(content, recTitle, recTypeId);
+                if (MapUtils.isNotEmpty(sourceMap)) {
+                    structureMap = OrdinaryAssistant.mapKeyContrast(sourceMap, keyContrasts);
+                    structureMap.put("记录编号", contentMap.get("recId").toString());
+                    structureMap.put("病历号", contentMap.get("behospitalCode") == null ? null : contentMap.get("behospitalCode").toString());
+                }
+            }
+            if (MapUtils.isNotEmpty(structureMap)) {
+                informedConsentDoc = ModelDocGenerate.informedConsentDocGen(structureMap);
+                informedConsentDoc.setText(CommonAnalysisUtil.html2String(content));
+                informedConsentDoc.setPageData((Map) structureMap);
+            }
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
         }
         return informedConsentDoc;
     }
+
+    private List<String> keyContrasts = Lists.newArrayList(
+            "患者签名=患方签名",
+            "患方手写意见=患方签名",
+            "患方手写意见患方签名=患方签名",
+            "患方或受托代理人签名=患方或受托代理人签名",
+               "代理人签名=被授权人签名",
+            "被授权人签名=被授权人签名"
+    );
 }

+ 92 - 0
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunInformedHtmlAnalysis.java

@@ -0,0 +1,92 @@
+package com.lantone.qc.trans.beilun.util;
+
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.lantone.qc.pub.util.StringUtil;
+import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description: 知情同意书html解析
+ * @author: HUJING
+ * @time: 2020/9/14 15:41
+ */
+@Slf4j
+public class BeiLunInformedHtmlAnalysis implements BeiLunHtmlAnalysis {
+
+    private String modeId = "53";
+
+    @Override
+    public Map<String, String> analysis(String... args) {
+        Map<String, String> structureMap = Maps.newLinkedHashMap();
+        try {
+            List<String> titles = Lists.newArrayList(
+                    "患者签名",
+                    "患方手写意见",
+                    "患方手写意见患方签名",
+                    "患方或受托代理人签名",
+                    "代理人签名",
+                    "被授权人签名",
+                    "手印备注与患者关系",
+                    "与患者关系",
+                    "其他");
+            String html = args[0];
+            String recTitle = args[1];
+            String recTypeId = args[2];
+            Document doc = Jsoup.parse(html);
+            String htmlContent = BeiLunHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), false);
+            if (StringUtil.isNotBlank(htmlContent)) {
+                htmlContent = htmlContent.replaceAll("[   ]", " ").replace("其他:","").replace("被授权人签名","").replace("患者签名","").replace("患方签名","").replace("患者/法定代理人签名","").replace("手印说明(\uF06F右食指 \uF06F左食指)","");
+                CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
+            }
+            CommonAnalysisUtil.extractDateByTitle(structureMap, "记录时间");
+            for (String ignoreContrast : ignoreContrasts) {
+                if(structureMap.containsKey( ignoreContrast)){
+                    structureMap.remove(ignoreContrast);
+                }
+            }
+
+            resultHandle(structureMap);
+            BeiLunHtmlAnalysisUtil.insertModuleId(modeId, recTypeId, structureMap);
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+        }
+        return structureMap;
+    }
+    private List<String>  ignoreContrasts = Lists.newArrayList(
+            "其他",
+            "与患者关系",
+            "手印备注与患者关系",
+            "身份证号码"
+    );
+
+    private void resultHandle(Map<String, String> result) {
+        if (MapUtils.isEmpty(result)) {
+            return;
+        }
+        if (result.containsKey("代理人签名")) {
+            String signName = result.get("代理人签名");
+
+            if ( signName.contains("手印备注")) {
+                signName = signName.split("手印备注")[0];
+                result.put("代理人签名",signName);
+            }
+        }
+        result.forEach((key, value) -> {
+            if (StringUtil.isNotBlank(value)) {
+                value = StringUtil.trim(value);
+                if (value.endsWith(";") || value.endsWith(";")) {
+                    value = value.substring(0, value.length() - 1);
+                }
+                result.put(key, value);
+            }
+        });
+    }
+}

+ 34 - 3
trans/src/main/java/com/lantone/qc/trans/beilun/util/BeiLunOperationInformedHtmlAnalysis.java

@@ -2,6 +2,7 @@ package com.lantone.qc.trans.beilun.util;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.lantone.qc.pub.Content;
 import com.lantone.qc.pub.util.StringUtil;
 import com.lantone.qc.trans.comsis.CommonAnalysisUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -39,7 +40,7 @@ public class BeiLunOperationInformedHtmlAnalysis implements BeiLunHtmlAnalysis {
             Document doc = Jsoup.parse(html);
             String htmlContent = BeiLunHtmlAnalysisUtil.blockDivToStr(doc.selectFirst("body").child(0), false);
             if (StringUtil.isNotBlank(htmlContent)) {
-                htmlContent = htmlContent.replaceAll("[   ]", " ").replace("患者签名","").replace("不会签字的按手印并备注手印说明:谁的哪根手指,并注明谁代写的与患者关系:与患者关系","");
+                htmlContent = htmlContent.replaceAll("[   ]", " ");
                 CommonAnalysisUtil.html2StructureMap(titles, htmlContent, structureMap);
             }
             CommonAnalysisUtil.extractDateByTitle(structureMap, "记录时间");
@@ -59,19 +60,49 @@ public class BeiLunOperationInformedHtmlAnalysis implements BeiLunHtmlAnalysis {
     }
     private List<String>  ignoreContrasts = Lists.newArrayList(
             "医师陈述",
+            "患方签名",
             "签字时间",
             "签名时间"
     );
 
     private void parseMethod(Map<String, String> result) {
         if (result.containsKey("术种使用的植入性材料或高值耗材及风险") && StringUtils.isNotEmpty(result.get("术种使用的植入性材料或高值耗材及风险"))) {
+            Boolean flag= true;
             String str = result.get("术种使用的植入性材料或高值耗材及风险");
-            if(str.contains("\uF0FE无") && str.contains("\uF06F有耗材")){
+            if(str.contains("\uF0FE无") && str.contains("\uF06F有")){
                 result.put("术种使用的植入性材料或高值耗材及风险","false");
+                flag = false;
             }
-            if(str.contains("\uF06F无") && str.contains("\uF0FE有耗材")){
+            if(str.contains("\uF06F无") && str.contains("\uF0FE有")){
+             /*   str = str.split("\uF0FE有")[1];
+                str = str.replace(",",",").replace("。",",").replace("   ",",");
+                str = str.split(",")[0];
+                result.put("植入性材料",str);*/
                 result.put("术种使用的植入性材料或高值耗材及风险","true");
+                Boolean modelFlag = false;
+                for (String model : Content.MODELIST) {
+                    if(str.contains(model)){
+                        modelFlag = true;
+                        break;
+                    }
+                }
+                Boolean numFlag = false;
+                for (String number : Content.NUMBERLIST) {
+                    if(str.contains(number)){
+                        numFlag = true;
+                        break;
+                    }
+                }
+                if(modelFlag && numFlag){
+                    result.put("型号和数量符合要求","true");
+                }
+
+                flag = false;
+            }
+            if(flag){
+                result.put("术种使用的植入性材料或高值耗材及风险","");
             }
+
         }
 
 }

+ 12 - 0
trans/src/main/java/com/lantone/qc/trans/comsis/ModelDocGenerate.java

@@ -298,6 +298,18 @@ public class ModelDocGenerate {
         return deathRecordDoc;
     }
 
+    /**
+     * 知情同意书
+     *
+     * @param structureMap
+     * @return
+     */
+    public static InformedConsentDoc informedConsentDocGen(Map<String, String> structureMap) {
+        InformedConsentDoc informedConsentDoc = new InformedConsentDoc();
+        informedConsentDoc.setStructureMap(structureMap);
+        return informedConsentDoc;
+    }
+
     /**
      * 手术知情同意书
      *