Pārlūkot izejas kodu

义乌妇保:新增部分产科质控规则

zhanghang 3 gadi atpakaļ
vecāks
revīzija
61e77f175e
20 mainītis faili ar 1413 papildinājumiem un 737 dzēšanām
  1. 0 47
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/FIRP03110.java
  2. 0 68
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03112.java
  3. 0 69
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03114.java
  4. 0 100
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03116.java
  5. 0 50
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0160.java
  6. 0 48
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0589.java
  7. 0 99
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/OPE03111.java
  8. 0 67
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03115.java
  9. 0 102
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03117.java
  10. 0 18
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03118.java
  11. 0 69
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR3113.java
  12. 164 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03290.java
  13. 165 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03293.java
  14. 177 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03313.java
  15. 169 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03315.java
  16. 175 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03316.java
  17. 179 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03319.java
  18. 172 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03321.java
  19. 180 0
      kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03322.java
  20. 32 0
      public/src/main/java/com/lantone/qc/pub/Content.java

+ 0 - 47
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/FIRP03110.java

@@ -1,47 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.OutputInfo;
-import com.lantone.qc.pub.util.DateUtil;
-import com.lantone.qc.pub.util.StringUtil;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * @ClassName : FIRP03110
- * @Description : 病案首页未在患者出院院24小时内完成
- * @Author : zhanghang
- * @Date: 2021-03-31 11:12
- */
-@Component
-public class FIRP03110 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        if (inputInfo.getFirstPageRecordDoc() != null && inputInfo.getFirstPageRecordDoc().getStructureMap() != null) {
-            Map<String, String> firstPageRecordMap = inputInfo.getFirstPageRecordDoc().getStructureMap();
-            String admisDate = firstPageRecordMap.get(Content.dischargeTime);
-            String recordTime = firstPageRecordMap.get("创建时间");
-            if (CatalogueUtil.isEmpty(admisDate) || CatalogueUtil.isEmpty(recordTime)) {
-                return;
-            }
-            if(!CatalogueUtil.compareTime(
-                    StringUtil.parseDateTime(admisDate),
-                    StringUtil.parseDateTime(DateUtil.nowString()),
-                    Long.valueOf(24 * 60))){//如果出院还未过24小时规则不判断
-                return;
-            }
-
-            if (CatalogueUtil.compareTime(
-                    StringUtil.parseDateTime(admisDate),
-                    StringUtil.parseDateTime(recordTime),
-                    Long.valueOf(24 * 60))) {
-                status.set("-1");
-            }
-        }
-    }
-
-}

+ 0 - 68
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03112.java

@@ -1,68 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.PacsDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : MEDI03112
- * @Description :  医嘱存在MR,报告单未记录
- * @Author : zh
- * @Date: 2021-04-06 17:06
- */
-public class MEDI03112 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        int ctNum = 0;
-        int bcNum = 0;
-        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
-        if (ListUtil.isNotEmpty(doctorAdviceDocsList)) {
-            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
-                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                    //ct取临时医嘱
-                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                    if (StringUtil.isNotEmpty(doctorAsks)) {
-                        if ("临时医嘱".equals(doctorAsks)) {
-                            //取医嘱项目名称
-                            String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                            if (daItemName.contains("磁共振") || daItemName.contains("MR")) {
-                                if (!daItemName.contains("IMRT") && !daItemName.contains("mrs评分")) {
-                                    ctNum++;
-
-                                    continue;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
-            if(ListUtil.isNotEmpty(pacsDocs)){
-                if(pacsDocs.size()>0) {
-                    for (PacsDoc pacsDoc : pacsDocs) {
-                        String pacsDocStr = pacsDoc.getStructureMap().get("报告名称");
-                        if (StringUtil.isNotEmpty(pacsDocStr) && pacsDocStr.contains("MR")) {
-                            bcNum++;
-                        }
-                    }
-                }
-            }
-            if (ctNum != bcNum) {
-                status.set("-1");
-            }
-
-        }
-    }
-}

+ 0 - 69
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03114.java

@@ -1,69 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.PacsDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : MEDI03114
- * @Description :接受CT情况下报告单缺少CT报告
- * @Author : zh
- * @Date: 2021-04-06 17:06
- */
-public class MEDI03114 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        int ctNum = 0;
-        int bcNum = 0;
-        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
-        if (ListUtil.isNotEmpty(doctorAdviceDocsList)) {
-            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
-                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                    //ct取临时医嘱
-                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                    if (StringUtil.isNotEmpty(doctorAsks)) {
-                        if ("临时医嘱".equals(doctorAsks)) {
-                            //取医嘱项目名称
-                            String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                            if (daItemName.contains("CT") || daItemName.contains("X线")) {
-                                if ((!daItemName.contains("ATCH") && !daItemName.contains("TCT") && !daItemName.contains("HCT") && !daItemName.contains("OCT") && !daItemName.contains("NCT") && !daItemName.contains("LCT") && !daItemName.contains("ACT")) || (daItemName.contains("停"))) {
-                                    //都不包含为CT
-                                    ctNum++;
-                                    continue;
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-            List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
-            if(ListUtil.isNotEmpty(pacsDocs)){
-                if(pacsDocs.size()>0) {
-                    for (PacsDoc pacsDoc : pacsDocs) {
-                        String pacsDocStr = pacsDoc.getStructureMap().get("报告名称");
-                        if (StringUtil.isNotEmpty(pacsDocStr) && pacsDocStr.contains("CT")) {
-                            bcNum++;
-                        }
-                    }
-                }
-            }
-            if (ctNum != bcNum) {
-                status.set("-1");
-            }
-
-        }
-    }
-}

+ 0 - 100
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MEDI03116.java

@@ -1,100 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.google.common.collect.Maps;
-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.LisDoc;
-import com.lantone.qc.pub.model.doc.PacsDoc;
-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.List;
-import java.util.Map;
-
-/**
- * @ClassName : MEDI03116
- * @Description: 病理检查缺少病理检查报告单
- * @author: zh
- * @time: 2021/04/06 11:22
- */
-
-@Component
-public class MEDI03116 extends QCCatalogue {
-    @Override
-    protected void start(InputInfo inputInfo, OutputInfo outputInfo) throws ParseException {
-        status.set("0");
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-        if (firstPageRecordDoc == null) {
-            //病案首页为空判断医嘱
-            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
-            if(ListUtil.isEmpty(doctorAdviceDocs)){
-                return;
-            }
-            if (doctorAdviceDocs.size() == 0) {
-                return;
-            }
-            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
-                Map<String, String> structureMap = dad.getStructureMap();
-                String state = structureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                    String name = structureMap.get("医嘱项目名称");
-                    if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
-                            || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
-                        continue;
-                    }
-                    if (name.contains("手术")) {
-                        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
-                            String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
-                            if (adviceDocName.contains("病理")) {
-                                status.set("-1");
-                                List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
-                                for (PacsDoc pacsDoc : pacsDocs) {
-                                    Map<String, String> pacsDocStructureMap = pacsDoc.getStructureMap();
-                                    String pacsDocStr = pacsDocStructureMap.get("报告名称");
-                                    if (pacsDocStr.contains("病理")) {
-                                        status.set("0");
-                                        return;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        Map<String, String> firstPageRecordDocStructureMap = firstPageRecordDoc.getStructureMap();
-        String pathologyMoneyStr = firstPageRecordDocStructureMap.get("病理诊断费");
-        String operationMoneyStr = firstPageRecordDocStructureMap.get("手术费");
-        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
-            return;
-        }
-        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
-            return;
-        }
-            double a = Double.parseDouble(pathologyMoneyStr);
-            double b = Double.parseDouble(operationMoneyStr);
-            if (a > Content.pathologicalFee && b > 0) {
-                status.set("-1");
-                List<PacsDoc> pacsDocs = inputInfo.getPacsDocs();
-                for (PacsDoc pacsDoc : pacsDocs) {
-                    Map<String, String> pacsDocStructureMap = pacsDoc.getStructureMap();
-                    String pacsDocStr = pacsDocStructureMap.get("报告名称");
-                    if (pacsDocStr.contains("病理")) {
-                        status.set("0");
-                        return;
-                    }
-
-                }
-            }
-        }
-
-}

+ 0 - 50
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0160.java

@@ -1,50 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.LisDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-/**
- * @ClassName : MI0160
- * @Description: 病程记录缺少细菌培养结果
- * @author: zh
- * @time: 2021/04/06 11:22
- */
-
-public class MI0160 extends QCCatalogue {
-        public void start(InputInfo inputInfo, OutputInfo outputInfo){
-            status.set("0");
-            List<DoctorAdviceDoc> doctorAdviceDocList = inputInfo.getDoctorAdviceDocs();
-            if(ListUtil.isNotEmpty(doctorAdviceDocList)){
-                for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocList) {
-                    Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                    if("临时医嘱".equals(doctorAsks)){
-                        String doctorAsksName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                        if(StringUtil.isNotEmpty(doctorAsksName)&&doctorAsksName.contains("细菌培养")){
-                            status.set("-1");
-                            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
-                            if(ListUtil.isNotEmpty(allDoctorWradDocs)&&allDoctorWradDocs.size()>0){
-                                for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
-                                    String allDoctorStr = allDoctorWradDoc.getStructureMap().get("病情记录");
-                                    if(allDoctorStr.contains("细菌培养")){
-                                        status.set("0");
-                                        return;
-                                    }
-                                }
-                            }
-
-                        }
-                    }
-                }
-            }
-        }
-}

+ 0 - 48
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/MI0589.java

@@ -1,48 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.LisDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : MI0589
- * @Description: 报告单缺少细菌培养记录
- * @author: zh
- * @time: 2021/04/06 11:22
- */
-
-public class MI0589 extends QCCatalogue {
-        public void start(InputInfo inputInfo, OutputInfo outputInfo){
-            status.set("0");
-            List<DoctorAdviceDoc> doctorAdviceDocList = inputInfo.getDoctorAdviceDocs();
-            if(ListUtil.isNotEmpty(doctorAdviceDocList)){
-                for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocList) {
-                    Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                    String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                    if("临时医嘱".equals(doctorAsks)){
-                        String doctorAsksName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                        if(StringUtil.isNotEmpty(doctorAsksName)&&doctorAsksName.contains("细菌培养")){
-                            status.set("-1");
-                            List<LisDoc> lisDocs = inputInfo.getLisDocs();
-                            if(ListUtil.isNotEmpty(lisDocs)){
-                                for (LisDoc lisDoc : lisDocs) {
-                                    String lisDocStr = lisDoc.getStructureMap().get("报告名称");
-                                    if(StringUtil.isNotEmpty(lisDocStr)&&lisDocStr.contains("细菌培养")){
-                                        status.set("0");
-                                        return;
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-}

+ 0 - 99
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/OPE03111.java

@@ -1,99 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-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.PacsDoc;
-import com.lantone.qc.pub.model.doc.operation.OperationDoc;
-import com.lantone.qc.pub.util.StringUtil;
-import org.springframework.stereotype.Component;
-
-import java.text.ParseException;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @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");
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-        if (firstPageRecordDoc == null) {
-            //病案首页为空判断医嘱
-            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
-            if (doctorAdviceDocs.size() == 0) {
-                return;
-            }
-            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
-                Map<String, String> dadStructureMap = dad.getStructureMap();
-                String state = dadStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                    String name = dadStructureMap.get("医嘱项目名称");
-                    if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
-                            || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
-                        continue;
-                    }
-                    if (name.contains("手术")) {
-                        for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
-                            String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
-                            if (adviceDocName.contains("病理")) {
-                                status.set("-1");
-                                //判断有无手术记录
-                                List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-                                if (operationDocs != null && operationDocs.size() > 0) {
-                                    //有手术记录的情况下,手术记录中应该出现体现有标本
-                                    String operationDocsStr = operationDocs.get(0).getOperationRecordDoc().getStructureMap().get("手术经过及处理");
-                                    if (StringUtil.isNotBlank(operationDocsStr)) {
-                                        if (operationDocsStr.contains("标本")) {
-                                            status.set("0");
-                                            return;
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        Map<String, String> structureMap = firstPageRecordDoc.getStructureMap();
-        String pathologyMoneyStr = structureMap.get("病理诊断费");
-        String operationMoneyStr = structureMap.get("手术费");
-        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
-            return;
-        }
-        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
-            return;
-        }
-        double a = Double.parseDouble(pathologyMoneyStr);
-        double b = Double.parseDouble(operationMoneyStr);
-        if (a > Content.pathologicalFee && b > 0) {
-                status.set("-1");
-                //判断有无手术记录
-                List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
-                if (operationDocs != null && operationDocs.size() > 0) {
-                //有手术记录的情况下,手术记录中应该出现体现有标本
-                    String operationDocsStr = operationDocs.get(0).getOperationRecordDoc().getStructureMap().get("手术经过及处理");
-                    if(StringUtil.isNotBlank(operationDocsStr)){
-                        if(operationDocsStr.contains("标本")){
-                            status.set("0");
-                            return;
-                        }
-                    }
-                }
-            }
-        }
-}

+ 0 - 67
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03115.java

@@ -1,67 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.ThreeLevelWardDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.MapUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : THR03115
- * @Description :  接受CT情况下病程记录缺少CT检查记录
- * @Author : zh
- * @Date: 2021-04-06 17:06
- */
-public class THR03115 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        int ctNum=0;
-        int bcNum=0;
-        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
-        if(ListUtil.isNotEmpty(doctorAdviceDocsList)) {
-            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
-                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                //ct取临时医嘱
-                String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                if ("临时医嘱".equals(doctorAsks)) {
-                    //取医嘱项目名称
-                    String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                    if (daItemName.contains("CT") || daItemName.contains("X线")) {
-                        if ((!daItemName.contains("ATCH") && !daItemName.contains("TCT") && !daItemName.contains("HCT") && !daItemName.contains("OCT") && !daItemName.contains("NCT") && !daItemName.contains("LCT") && !daItemName.contains("ACT")) || (daItemName.contains("停"))) {
-                            //都不包含为CT
-                            ctNum++;
-                            continue;
-                        }
-                    }
-                }
-                }
-            }
-            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
-            if(ListUtil.isNotEmpty(allDoctorWradDocs)&&allDoctorWradDocs.size()>0){
-                for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
-                    Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
-                    String records = structureMap.get("病情记录");
-                    if (records.contains("CT")&&StringUtil.isNotEmpty(records)) {
-                        bcNum++;
-                    }
-                }
-            }
-            if(ctNum!=bcNum){
-                status.set("-1");
-            }
-
-        }
-    }
-
-}

+ 0 - 102
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03117.java

@@ -1,102 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-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.PacsDoc;
-import com.lantone.qc.pub.model.doc.ThreeLevelWardDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-import io.netty.util.internal.ObjectUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : THR03117
- * @Description :  病理检查存在病程记录中无病理报告结果
- * @Author : zh
- * @Date: 2021-04-02 17:06
- */
-public class THR03117 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-        if(firstPageRecordDoc==null){
-            //病案首页为空判断医嘱
-            List<DoctorAdviceDoc> doctorAdviceDocs = inputInfo.getDoctorAdviceDocs();
-            if (doctorAdviceDocs.size() == 0) {
-                return;
-            }
-            for (DoctorAdviceDoc dad : doctorAdviceDocs) {
-                Map<String, String> dadStructureMap = dad.getStructureMap();
-                String state = dadStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                String name = dadStructureMap.get("医嘱项目名称");
-                if (name.contains("非手术") || name.contains("手术室") || (name.contains("手术") && name.contains("取消")) || (name.contains("暂停") && name.contains("手术")) || name.contains("静脉穿刺置管术") || name.startsWith("停") || name.contains("前一次")
-                        || name.contains("特殊病人手术使用一次性卫生材料") || name.contains("人免疫缺陷病毒抗体检测免费")) {
-                    continue;
-                }
-                if (name.contains("手术")) {
-                    for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocs) {
-                        String adviceDocName = doctorAdviceDoc.getStructureMap().get("医嘱项目名称");
-                        if (adviceDocName.contains("病理")) {
-                            status.set("-1");
-                            //查房记录查找病理报告
-                            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
-                            //所有查房记录
-                            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
-                            if(ListUtil.isEmpty(allDoctorWradDocs)){
-                                return;
-                            }
-                            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
-                                String pathographyStr = allDoctorWradDoc.getStructureMap().get("病情记录");
-                                if(pathographyStr.contains("病理报告")){
-                                    status.set("0");
-                                    return;
-                                }
-                            }
-
-                        }
-                    }
-                    }
-                }
-            }
-        }
-        Map<String, String> structureMap = firstPageRecordDoc.getStructureMap();
-        String pathologyMoneyStr = structureMap.get("病理诊断费");
-        String operationMoneyStr = structureMap.get("手术费");
-        if(StringUtil.isEmpty(pathologyMoneyStr)||StringUtil.isEmpty(operationMoneyStr)){
-            return;
-        }
-        if ((pathologyMoneyStr.equals("0")  || operationMoneyStr.equals("0") )) {
-            return;
-        }
-        double a = Double.parseDouble(pathologyMoneyStr);
-        double b = Double.parseDouble(operationMoneyStr);
-        if (a > Content.pathologicalFee && b > 0) {
-            status.set("-1");
-            //查房记录查找病理报告
-            ThreeLevelWardDoc threeLevelWardDoc = inputInfo.getThreeLevelWardDocs().get(0);
-            //所有查房记录
-            List<ThreeLevelWardDoc> allDoctorWradDocs = threeLevelWardDoc.getAllDoctorWradDocs();
-            if(ListUtil.isEmpty(allDoctorWradDocs)){
-                return;
-            }
-            for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
-                String pathographyStr = allDoctorWradDoc.getStructureMap().get("病情记录");
-                if(pathographyStr.contains("病理报告")){
-                    status.set("0");
-                    return;
-                }
-            }
-        }
-
-    }
-}

+ 0 - 18
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR03118.java

@@ -1,18 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-import com.lantone.qc.pub.model.InputInfo;
-import com.lantone.qc.pub.model.OutputInfo;
-import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
-
-/**
- * @ClassName : THR03118
- * @Description :  病程记录未记录恶性肿瘤化学治疗相关信息
- * @Author : zh
- * @Date: 2021-04-019 17:06
- */
-public class THR03118 extends QCCatalogue{
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
-    }
-}

+ 0 - 69
kernel/src/main/java/com/lantone/qc/kernel/catalogue/beilun/majorInspection/THR3113.java

@@ -1,69 +0,0 @@
-package com.lantone.qc.kernel.catalogue.beilun.majorInspection;
-
-import com.lantone.qc.kernel.catalogue.QCCatalogue;
-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.ThreeLevelWardDoc;
-import com.lantone.qc.pub.util.ListUtil;
-import com.lantone.qc.pub.util.StringUtil;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * @ClassName : THR3113
- * @Description :  接受MR情况下病程记录缺少MR检查记录
- * @Author : zh
- * @Date: 2021-04-06 17:06
- */
-public class THR3113 extends QCCatalogue {
-    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
-        status.set("0");
-        int ctNum=0;
-        int bcNum=0;
-        List<DoctorAdviceDoc> doctorAdviceDocsList = inputInfo.getDoctorAdviceDocs();
-        if(ListUtil.isNotEmpty(doctorAdviceDocsList)) {
-            for (DoctorAdviceDoc doctorAdviceDoc : doctorAdviceDocsList) {
-                Map<String, String> doctorAdviceDocStructureMap = doctorAdviceDoc.getStructureMap();
-                String state = doctorAdviceDocStructureMap.get("医嘱状态判别");
-                if(StringUtil.isEmpty(state)){
-                    continue;
-                }
-                if(state.equals("在用")) {
-                //ct取临时医嘱
-                String doctorAsks = doctorAdviceDocStructureMap.get("医嘱类型判别");
-                if (StringUtil.isNotEmpty(doctorAsks)) {
-                    if ("临时医嘱".equals(doctorAsks)) {
-                        //取医嘱项目名称
-                        String daItemName = doctorAdviceDocStructureMap.get("医嘱项目名称");
-                        if (daItemName.contains("磁共振") || daItemName.contains("MR")) {
-                            if (!daItemName.contains("IMRT") && !daItemName.contains("mrs评分")) {
-                                ctNum++;
-                                continue;
-                            }
-                        }
-                    }
-                    }
-                }
-            }
-            List<ThreeLevelWardDoc> allDoctorWradDocs = inputInfo.getThreeLevelWardDocs().get(0).getAllDoctorWradDocs();
-            if(ListUtil.isNotEmpty(allDoctorWradDocs)) {
-                if (allDoctorWradDocs.size() > 0) {
-                    for (ThreeLevelWardDoc allDoctorWradDoc : allDoctorWradDocs) {
-                        Map<String, String> structureMap = allDoctorWradDoc.getStructureMap();
-                        String records = structureMap.get("病情记录");
-                        if (records.contains("MR") && StringUtil.isNotEmpty(records)) {
-                            bcNum++;
-                        }
-                    }
-                }
-            }
-            if(ctNum!=bcNum){
-                status.set("-1");
-            }
-
-        }
-    }
-
-}

+ 164 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03290.java

@@ -0,0 +1,164 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.entity.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : LEA03290
+ * @Description : 入院记录或首页诊断为【妊娠合并子宫瘢痕】,出院小结出院诊断无妊娠合并子宫瘢痕
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class LEA03290 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_RZZGBH;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_RZZGBH;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&(diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&(diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&( diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if(StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) || diagMap.get("诊断名称").matches(rex))).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取出院小结
+            LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+            if (leaveHospitalDoc == null) {
+                return;
+            }
+            DiagLabel leaveDiagLabel = leaveHospitalDoc.getLeaveDiagLabel();
+            if (leaveDiagLabel == null) {
+                return;
+            }
+            List<Diag> diags = leaveDiagLabel.getDiags();
+            if (ListUtil.isEmpty(diags)) {
+                return;
+            }
+            for (Diag diag : diags) {
+                String diagName = diag.getHospitalDiagName();
+                for (String diagCollectName : diagCollectList) {
+                    if (StringUtil.isNotEmpty(diagName) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (getLikeRate(diagName, diagCollectName)) {
+                            status.set("0");
+                            return;
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 165 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/leavehospital/LEA03293.java

@@ -0,0 +1,165 @@
+package com.lantone.qc.kernel.catalogue.leavehospital;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+import com.lantone.qc.pub.model.entity.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : LEA03293
+ * @Description : 入院记录或首页诊断为【妊娠合并子宫瘢痕】,出院小结入院诊断无妊娠合并子宫瘢痕
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class LEA03293 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_RZZGBH;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_RZZGBH;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&(diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&(diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) &&( diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if(StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) || diagMap.get("诊断名称").matches(rex))).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取出院小结
+            LeaveHospitalDoc leaveHospitalDoc = inputInfo.getLeaveHospitalDoc();
+            if (leaveHospitalDoc == null) {
+                return;
+            }
+            //获取入院诊断
+            DiagLabel beHospitalizedLabel = leaveHospitalDoc.getBeHospitalizedLabel();
+            if (beHospitalizedLabel == null) {
+                return;
+            }
+            List<Diag> diags = beHospitalizedLabel.getDiags();
+            if (ListUtil.isEmpty(diags)) {
+                return;
+            }
+            for (Diag diag : diags) {
+                String diagName = diag.getHospitalDiagName();
+                for (String diagCollectName : diagCollectList) {
+                    if (StringUtil.isNotEmpty(diagName) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (getLikeRate(diagName, diagCollectName)) {
+                            status.set("0");
+                            return;
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 177 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03313.java

@@ -0,0 +1,177 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+import com.lantone.qc.pub.model.doc.LeaveHospitalDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.label.OperationDiscussionLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03313
+ * @Description : 入院记录或首页诊断为【妊娠合并子宫瘢痕】,术后首次病程中术后诊断无妊娠合并子宫瘢痕
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03313 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_RZZGBH;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_RZZGBH;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) || diagMap.get("诊断名称").matches(rex))).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取术后首程病程录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+                if (operationDiscussionDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
+                String operationDiagZ = structureMap.get("术中后诊断");
+                String operationDiagO = structureMap.get("术后诊断");
+                if (StringUtil.isEmpty(operationDiagZ) && StringUtil.isEmpty(operationDiagO)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if ((StringUtil.isNotEmpty(operationDiagZ) || StringUtil.isNotEmpty(operationDiagO)) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagZ)) {
+                            if (getLikeRate(operationDiagZ, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        if (StringUtil.isNotEmpty(operationDiagO)) {
+                            if (getLikeRate(operationDiagO, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 169 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03315.java

@@ -0,0 +1,169 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03315
+ * @Description : 入院记录或首页诊断为【妊娠合并子宫瘢痕】,手术记录术前诊断无妊娠合并子宫瘢痕
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03315 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_RZZGBH;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_RZZGBH;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) || diagMap.get("诊断名称").matches(rex))).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取术后首程病程录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String operationDiagO = structureMap.get("术前诊断");
+                if (StringUtil.isEmpty(operationDiagO)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if (StringUtil.isNotEmpty(operationDiagO) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagO)) {
+                            if (getLikeRate(operationDiagO, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 175 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03316.java

@@ -0,0 +1,175 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03315
+ * @Description : 入院记录或首页诊断为【妊娠合并子宫瘢痕】,手术记录术前诊断无妊娠合并子宫瘢痕
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03316 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_RZZGBH;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_RZZGBH;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) || diag.getHospitalDiagName().matches(rex))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) || diagMap.get("诊断名称").matches(rex))).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取术后首程病程录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String operationDiagZ = structureMap.get("术中后诊断");
+                String operationDiagO = structureMap.get("术后诊断");
+                if (StringUtil.isEmpty(operationDiagZ) && StringUtil.isEmpty(operationDiagO)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if ((StringUtil.isNotEmpty(operationDiagZ) || StringUtil.isNotEmpty(operationDiagO)) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagZ)) {
+                            if (getLikeRate(operationDiagZ, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        if (StringUtil.isNotEmpty(operationDiagO)) {
+                            if (getLikeRate(operationDiagO, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 179 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03319.java

@@ -0,0 +1,179 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03319
+ * @Description : 入院记录或首页诊断为【胎膜早破】,术后首次病程中术后诊断无胎膜早破
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03319 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_TMZP;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_TMZP;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破") )).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) ||
+                        diagMap.get("诊断名称").matches(rex) || diagMap.get("诊断名称").contains("胎膜早破") )).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取术后首程病程录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationDiscussionDoc operationDiscussionDoc = operationDoc.getOperationDiscussionDoc();
+                if (operationDiscussionDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationDiscussionDoc.getStructureMap();
+                String operationDiagZ = structureMap.get("术中后诊断");
+                String operationDiagO = structureMap.get("术后诊断");
+                if (StringUtil.isEmpty(operationDiagZ) && StringUtil.isEmpty(operationDiagO)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if ((StringUtil.isNotEmpty(operationDiagZ) || StringUtil.isNotEmpty(operationDiagO)) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagZ)) {
+                            if (getLikeRate(operationDiagZ, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        if (StringUtil.isNotEmpty(operationDiagO)) {
+                            if (getLikeRate(operationDiagO, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 172 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03321.java

@@ -0,0 +1,172 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03321
+ * @Description : 入院记录或首页诊断为【胎膜早破】,手术记录术前诊断无胎膜早破
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03321 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_TMZP;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_TMZP;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破") )).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) ||
+                        diagMap.get("诊断名称").matches(rex) || diagMap.get("诊断名称").contains("胎膜早破") )).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取手术记录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String operationDiagZ = structureMap.get("术前诊断");
+                if (StringUtil.isEmpty(operationDiagZ)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if ((StringUtil.isNotEmpty(operationDiagZ)) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagZ)) {
+                            if (getLikeRate(operationDiagZ, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

+ 180 - 0
kernel/src/main/java/com/lantone/qc/kernel/catalogue/operationdiscussion/OPE03322.java

@@ -0,0 +1,180 @@
+package com.lantone.qc.kernel.catalogue.operationdiscussion;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
+import com.lantone.qc.kernel.catalogue.QCCatalogue;
+import com.lantone.qc.kernel.client.SimilarityServiceClient;
+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.BeHospitalizedDoc;
+import com.lantone.qc.pub.model.doc.FirstPageRecordDoc;
+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.Annotation;
+import com.lantone.qc.pub.model.entity.Diag;
+import com.lantone.qc.pub.model.label.DiagLabel;
+import com.lantone.qc.pub.model.vo.SimilarityVo;
+import com.lantone.qc.pub.util.ListUtil;
+import com.lantone.qc.pub.util.StringUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @ClassName : OPE03322
+ * @Description : 入院记录或首页诊断为【胎膜早破】,手术记录中术后诊断无胎膜早破
+ * @Author : zhanghang
+ * @Date: 2022-04-13 13:54
+ */
+@Component
+public class OPE03322 extends QCCatalogue {
+    @Autowired
+    SimilarityServiceClient similarityServiceClient;
+
+    @Override
+    public void start(InputInfo inputInfo, OutputInfo outputInfo) {
+        status.set("0");
+        List<String> diagListWords = Content.JBLB_TMZP;
+        //获取入院记录
+        BeHospitalizedDoc beHospitalizedDoc = inputInfo.getBeHospitalizedDoc();
+        //获取病案首页
+        FirstPageRecordDoc firstPageRecordDoc = inputInfo.getFirstPageRecordDoc();
+        if (beHospitalizedDoc == null && firstPageRecordDoc == null) {
+            return;
+        }
+        //匹配疾病正则
+        String rex = Content.PDZZ_TMZP;
+        //创建存储能匹配疾病的集合
+        List<String> diagList = new ArrayList<>();
+        //入院记录不为空,获取其诊断信息
+        if (beHospitalizedDoc != null) {
+            //初步诊断
+            DiagLabel initialDiagLabel = beHospitalizedDoc.getInitialDiagLabel();
+            //修正诊断
+            DiagLabel revisedDiagLabel = beHospitalizedDoc.getRevisedDiagLabel();
+            //补充诊断
+            DiagLabel suppleDiagLabel = beHospitalizedDoc.getSuppleDiagLabel();
+            if (initialDiagLabel != null) {
+                List<Diag> diagLists = initialDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破") )).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+
+            }
+            if (revisedDiagLabel != null) {
+                List<Diag> diagLists = revisedDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+            if (suppleDiagLabel != null) {
+                List<Diag> diagLists = suppleDiagLabel.getDiags();
+                if (ListUtil.isNotEmpty(diagLists)) {
+                    diagLists.stream().filter(diag -> StringUtil.isNotEmpty(diag.getHospitalDiagName()) && (diagListWords.contains(diag.getHospitalDiagName()) ||
+                            diag.getHospitalDiagName().matches(rex) || diag.getHospitalDiagName().contains("胎膜早破"))).forEach(diag ->
+                            diagList.add(diag.getHospitalDiagName()));
+                }
+            }
+        }
+        //获取病案首页疾病并判断
+        if (firstPageRecordDoc != null) {
+            //获取出院诊断
+            String leaveDiagStr = firstPageRecordDoc.getStructureMap().get("出院诊断");
+            if (StringUtil.isNotEmpty(leaveDiagStr)) {
+                List<Map<String, String>> leaveDiagList = (List<Map<String, String>>) JSONArray.parse(leaveDiagStr);
+                leaveDiagList.stream().filter(diagMap -> StringUtil.isNotEmpty(diagMap.get("诊断名称")) && (diagListWords.contains(diagMap.get("诊断名称")) ||
+                        diagMap.get("诊断名称").matches(rex) || diagMap.get("诊断名称").contains("胎膜早破") )).forEach(diagMap ->
+                        diagList.add(diagMap.get("诊断名称")));
+            }
+        }
+        //如果疾病集合为空则直接返回
+        if (ListUtil.isEmpty(diagList)) {
+            return;
+        }
+        List<String> diagCollectList = diagList.stream().distinct().collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(diagCollectList)) {
+            status.set("-1");
+            //获取手术记录
+            List<OperationDoc> operationDocs = inputInfo.getOperationDocs();
+            if (ListUtil.isEmpty(operationDocs)) {
+                return;
+            }
+            for (OperationDoc operationDoc : operationDocs) {
+                OperationRecordDoc operationRecordDoc = operationDoc.getOperationRecordDoc();
+                if (operationRecordDoc == null) {
+                    continue;
+                }
+                //获取术后诊断
+                Map<String, String> structureMap = operationRecordDoc.getStructureMap();
+                String operationDiagZ = structureMap.get("术中后诊断");
+                String operationDiagO = structureMap.get("术后诊断");
+                if (StringUtil.isEmpty(operationDiagZ) && StringUtil.isEmpty(operationDiagO)) {
+                    continue;
+                }
+                for (String diagCollectName : diagCollectList) {
+                    if ((StringUtil.isNotEmpty(operationDiagZ) || StringUtil.isNotEmpty(operationDiagO)) && StringUtil.isNotEmpty(diagCollectName)) {
+                        if (StringUtil.isNotEmpty(operationDiagZ)) {
+                            if (getLikeRate(operationDiagZ, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                        if (StringUtil.isNotEmpty(operationDiagO)) {
+                            if (getLikeRate(operationDiagO, diagCollectName)) {
+                                status.set("0");
+                                return;
+                            }
+                        }
+                    }
+                }
+            }
+            return;
+        }
+    }
+
+    private boolean getLikeRate(String text_1, String text_2) {
+        JSONArray similarContent = new JSONArray();
+        JSONObject detailContent = new JSONObject();
+        detailContent.put("text_1", text_1);
+        detailContent.put("text_2", text_2);
+        similarContent.add(detailContent);
+        //存储CRF完整所需结构数据
+        SimilarityVo similarityVo = new SimilarityVo();
+        similarityVo.setData(similarContent);
+        //获取CRF模型返回数据
+        JSONArray data = getAnnotation(similarityServiceClient, similarityVo).getData();
+        double likeRate = 0d;
+        if (data.size() > 0) {
+            JSONObject dataContent = data.getJSONObject(0);
+            likeRate = dataContent.getDoubleValue("like_rate");
+        }
+        if (likeRate > 0.9) {
+            return true;
+        }
+        return false;
+    }
+
+    private Annotation getAnnotation(SimilarityServiceClient similarityServiceClient, SimilarityVo similarityVo) {
+        Annotation annotation = new Annotation();
+        try {
+            String annotation_str = similarityServiceClient.getAnnotation(similarityVo);
+            annotation = JSON.parseObject(annotation_str, Annotation.class);
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        } finally {
+            return annotation;
+        }
+    }
+}

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

@@ -698,6 +698,38 @@ public class Content {
     public static List<String> NUMBERLIST = Arrays.asList(
             "枚","支","块","个");
 
+    /**
+     *  是否妊娠合并子宫瘢痕--疾病列表
+     */
+    public static List<String> JBLB_RZZGBH = Arrays.asList(
+            "妊娠合并子宫瘢痕", "妊娠合并子宫疤痕", "剖宫产瘢痕妊娠", "子宫瘢痕处妊娠", "剖宫产史的妊娠", "妊娠合并宫颈瘢痕");
+
+    /**
+     *   pdzz--是否妊娠合并子宫瘢痕的正则
+     */
+    public static String PDZZ_RZZGBH = "(?<!([未否无没不非]|排除)[^。,;。,;]{0,20})[^。,;。,;未否无没不非除]{0,10}(未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非除]{0,10}(?:(?:妊娠)[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]" +
+            "{0,10}(?:宫)[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:瘢痕|疤痕)|(?:宫)" +
+            "[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:瘢痕|疤痕)[^。,;。,;未否无没不非]" +
+            "{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:妊娠)|(?:瘢痕|疤痕)[^。,;。,;未否无没不非]{0,10}" +
+            "(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]{0,10}(?:宫)[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非]{0,10}(?:妊娠)|(?:剖宫产史|剖腹产史)[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]" +
+            "{0,10}(?:妊娠))(?!([^。,;。,;]{0,3}([::\\t](否|无|从不|从未|未发现|未见|未诉|没有)|(否|无|从不|从未|未发现|未见|未诉|没有)(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
+
+    /**
+     *  胎膜早破--疾病列表
+     */
+    public static List<String> JBLB_TMZP = Arrays.asList("胎膜早破,在24小时以后产程开始", "足月胎膜早破(在1-7天内产程开始)",
+            "早产胎膜早破(在1-7天内产程开始)", "早产胎膜早破(在7天以后产程开始)"
+            , "胎膜早破,由于治疗而使产程延迟", "胎膜早破");
+
+    /**
+     *   pdzz--胎膜早破
+     */
+    public static String PDZZ_TMZP = "(?<!([未否无没不非]|排除)[^。,;。,;]{0,20})[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?" +
+            "[^。,;。,;未否无没不非]{0,10}(?:(?:胎膜)[^。,;。,;未否无没不非]{0,10}(未知|未明|淹没|没药|不对称|非对称)?[^。,;。,;未否无没不非]" +
+            "{0,10}(?:早破|早期破裂))(?!([^。,;。,;]{0,3}([::\\t](否|无|从不|从未|未发现|未见|未诉|没有)|(否|无|从不|从未|未发现|未见|未诉|没有)" +
+            "(\\\\b|[。,;。,;\\f\\n\\r\\t]))))";
 
 }