Browse Source

医学规则测试

zhaops 4 years ago
parent
commit
38c9029b66

+ 23 - 0
cdssman-service/src/main/java/com/diagbot/dto/CaseResultDTO.java

@@ -0,0 +1,23 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/1/13 17:07
+ */
+@Getter
+@Setter
+public class CaseResultDTO {
+    private String caseName;
+    private Long resultId;
+    private Long caseId;
+    private Integer ruleNum;
+    private Integer ruleSuccessNum;
+    private Integer ruleFailedNum;
+    private Date gmtModified;
+}

+ 13 - 0
cdssman-service/src/main/java/com/diagbot/facade/ResultBillFacade.java

@@ -0,0 +1,13 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.ResultBillServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/1/13 17:36
+ */
+@Component
+public class ResultBillFacade extends ResultBillServiceImpl {
+}

+ 13 - 0
cdssman-service/src/main/java/com/diagbot/facade/ResultInfoFacade.java

@@ -0,0 +1,13 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.ResultInfoServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/1/13 17:14
+ */
+@Component
+public class ResultInfoFacade extends ResultInfoServiceImpl {
+}

+ 256 - 77
cdssman-service/src/main/java/com/diagbot/facade/RuleConvertFacade.java

@@ -5,6 +5,7 @@ import com.diagbot.entity.MappingShortEntity;
 import com.diagbot.entity.ResultBill;
 import com.diagbot.entity.node.BillItem;
 import com.diagbot.entity.node.MedNameRegName;
+import com.diagbot.entity.node.TransfusionRemind;
 import com.diagbot.enums.GraphLabelEnum;
 import com.diagbot.enums.StatusEnum;
 import com.diagbot.enums.TypeEnum;
@@ -19,6 +20,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -49,15 +51,21 @@ public class RuleConvertFacade {
     @Autowired
     private DrugTypeFacade drugTypeFacade;
 
+    /**
+     * 开单规则转换
+     * @param billItems
+     * @param hospitalId
+     * @return
+     */
     public List<ResultBill> billRuleConvert(List<BillItem> billItems, Long hospitalId) {
         List<ResultBill> retList = Lists.newLinkedList();
         List<ResultBill> resultBillList = Lists.newLinkedList();
-        List<ResultBill> retMedNameList=Lists.newArrayList();
+        List<ResultBill> retMedNameList = Lists.newArrayList();
         List<ResultBill> retBillList = Lists.newArrayList();
         List<ResultBill> retConflictList = Lists.newArrayList();
 
         if (ListUtil.isEmpty(billItems)) {
-            return resultBillList;
+            return retList;
         }
 
         List<MedNameRegName> medNameRegNameList = medicineRepository.findCustomByNameAndRegName(StatusEnum.Enable.getKey());
@@ -76,8 +84,6 @@ public class RuleConvertFacade {
         Map<String, Map<String, Map<String, List<Long>>>> drugConfigMap = drugConfigFacade.getUniqueConfigMap(hospitalId, null, null);
         Map<String, Map<String, List<Long>>> diseaseConfigMap = diseaseConfigFacade.getUniqueConfigMap(hospitalId, null, null);
         Map<String, Map<String, List<Long>>> operationConfigMap = operationConfigFacade.getUniqueConfigMap(hospitalId, null, null);
-        Map<String, Map<String, List<Long>>> transfusionConfigMap = transfusionConfigFacade.getUniqueConfigMap(hospitalId, null, null);
-
 
         for (BillItem billItem : billItems) {
             //基础属性复制
@@ -272,9 +278,137 @@ public class RuleConvertFacade {
             }
         }
 
+        //模拟输入值
+        retList = createInputValue(retConflictList);
+        return retList;
+    }
+
+
+    public List<ResultBill> billRuleConvert_transfusion(List<TransfusionRemind> items,Long hospitalId) {
+        List<ResultBill> retList = Lists.newLinkedList();
+        List<ResultBill> resultBillList = Lists.newLinkedList();
+        List<ResultBill> retBillList = Lists.newArrayList();
+        List<ResultBill> retConflictList = Lists.newArrayList();
+
+        if (ListUtil.isEmpty(items)) {
+            return retList;
+        }
+
+        Map<String, Map<String, Map<String, List<Long>>>> lisConfigMap = lisConfigFacade.getUniqueConfigMap(hospitalId, null, null);
+        Map<String, Map<String, List<Long>>> diseaseConfigMap = diseaseConfigFacade.getUniqueConfigMap(hospitalId, null, null);
+        Map<String, Map<String, List<Long>>> operationConfigMap = operationConfigFacade.getUniqueConfigMap(hospitalId, null, null);
+        Map<String, Map<String, List<Long>>> transfusionConfigMap = transfusionConfigFacade.getUniqueConfigMap(hospitalId, null, null);
+
+        for (TransfusionRemind item : items) {
+            //基础属性复制
+            ResultBill resultBill = new ResultBill();
+            resultBill.setBillType(2);
+            resultBill.setBillItemType("输血提醒指标");
+            resultBill.setBillItemName(item.getTransfusion_type());
+            resultBill.setConflictItemType(item.getNode_label());
+            resultBill.setConflictItemName(item.getIndex_name());
+            if (item.getMaxval() != null) {
+                resultBill.setMaxValue(BigDecimal.valueOf(item.getMaxval()));
+            }
+            if (item.getMinval() != null) {
+                resultBill.setMinValue(BigDecimal.valueOf(item.getMinval()));
+            }
+            resultBill.setConflictItemRange(item.getRange());
+            resultBill.setUnit(item.getUnit());
+            resultBillList.add(resultBill);
+        }
+
+        //开单项转医院名称
+        for (ResultBill resultBill : resultBillList) {
+            Map<String, List<Long>> hisMap = transfusionConfigMap.get(resultBill.getBillItemName());
+            if (hisMap != null && hisMap.size() > 0) {
+                hisMap.entrySet().forEach(result -> {
+                    ResultBill addResultBill = new ResultBill();
+                    BeanUtil.copyProperties(resultBill, addResultBill);
+                    addResultBill.setBillItemHisName(result.getKey());
+                    retBillList.add(addResultBill);
+                });
+            } else {
+                resultBill.setSuccess(0);
+                resultBill.setMessage("开单项缺少医院端映射;");
+                retBillList.add(resultBill);
+            }
+        }
+
+        //禁忌项转医院名称
+        for (ResultBill resultBill : retBillList) {
+            Map<String, List<String>> hisMap = new HashMap<>();
+            if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
+                Map<String, List<Long>> subMap = operationConfigMap.get(resultBill.getConflictItemName());
+                if (subMap != null && subMap.size() > 0) {
+                    subMap.entrySet().forEach(item -> {
+                        hisMap.put(item.getKey(), new ArrayList<>());
+                    });
+                }
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoDiseaseName.getName())) {
+                Map<String, List<Long>> subMap = diseaseConfigMap.get(resultBill.getConflictItemName());
+                if (subMap != null && subMap.size() > 0) {
+                    subMap.entrySet().forEach(item -> {
+                        hisMap.put(item.getKey(), new ArrayList<>());
+                    });
+                }
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.LisName.getName())) {
+                Map<String, Map<String, List<Long>>> subMap = lisConfigMap.get(resultBill.getConflictItemName());
+                if (subMap != null && subMap.size() > 0) {
+                    subMap.entrySet().forEach(item -> {
+                        hisMap.put(item.getKey(), new ArrayList<>(item.getValue().keySet()));
+                    });
+                }
+            }
+
+            if (hisMap != null && hisMap.size() > 0) {
+                hisMap.entrySet().forEach(item -> {
+                    ResultBill addResultBill = new ResultBill();
+                    BeanUtil.copyProperties(resultBill, addResultBill);
+                    addResultBill.setConflictItemHisName(item.getKey());
+                    if (ListUtil.isNotEmpty(item.getValue())) {
+                        item.getValue().forEach(detailName -> {
+                            ResultBill addResultBillExt = new ResultBill();
+                            BeanUtil.copyProperties(addResultBill, addResultBillExt);
+                            addResultBillExt.setConflictItemHisDetailName(detailName);
+                            retConflictList.add(addResultBillExt);
+                        });
+                    } else {
+                        retConflictList.add(addResultBill);
+                    }
+                });
+            } else {
+                resultBill.setSuccess(0);
+                resultBill.setMessage("禁忌项缺少医院端映射;");
+                retConflictList.add(resultBill);
+            }
+        }
 
         //模拟输入值
-        for (ResultBill result : retConflictList) {
+        retList = createInputValue(retConflictList);
+
+        return retList;
+    }
+
+    public MappingShortEntity setMappingShortEntity(String name, String hisName, String hisDetailName) {
+        MappingShortEntity item = new MappingShortEntity();
+        item.setName(name);
+        item.setHisName(hisName);
+        item.setHisDetailName(hisDetailName);
+        return item;
+    }
+
+    /**
+     * 模拟输入数值
+     * @param resultList
+     * @return
+     */
+    public List<ResultBill> createInputValue(List<ResultBill> resultList) {
+        List<ResultBill> retList = Lists.newLinkedList();
+        if (ListUtil.isEmpty(resultList)) {
+            return retList;
+        }
+        for (ResultBill result : resultList) {
             if (result.getSuccess() != null && result.getSuccess().equals(0)) {
                 retList.add(result);
                 continue;
@@ -315,14 +449,6 @@ public class RuleConvertFacade {
         return retList;
     }
 
-    public MappingShortEntity setMappingShortEntity(String name, String hisName, String hisDetailName) {
-        MappingShortEntity item = new MappingShortEntity();
-        item.setName(name);
-        item.setHisName(hisName);
-        item.setHisDetailName(hisDetailName);
-        return item;
-    }
-
     /**
      * 模拟提示信息
      *
@@ -332,72 +458,125 @@ public class RuleConvertFacade {
     public BillMsg getBillMsg(ResultBill resultBill) {
         BillMsg billMsg = new BillMsg();
         String orderType = getOrderType(resultBill.getBillItemType());
-        if (resultBill.getConflictItemType().equals(GraphLabelEnum.BillConflictItem.getName())) {
-            //互斥项
-            billMsg = MsgUtil.getBillExclusionMsg(resultBill.getBillItemHisName(),
-                    resultBill.getConflictItemHisName(),
-                    resultBill.getConflictItemHisName(),
-                    "禁忌" + resultBill.getConflictItemType());
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.ConflictDevice.getName())) {
-            //禁忌医疗器械及物品提示信息
-            billMsg = MsgUtil.getBillMedEquMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    resultBill.getConflictItemName(),
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
-            //禁忌手术
-            billMsg = MsgUtil.getCommonSurgeryMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    resultBill.getConflictItemHisName(),
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.OralMedicine.getName())) {
-            //禁忌服用药品
-            billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    "可能正在用药" + resultBill.getConflictItemHisName(),
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.MedAllergen.getName())
-                || resultBill.getConflictItemType().equals(GraphLabelEnum.Allergen.getName())) {
-            //禁忌药物过敏原/食物过敏原/过敏原
-            billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    StringUtil.isNotBlank(resultBill.getConflictItemHisName())
-                            ? resultBill.getConflictItemHisName()
-                            : resultBill.getConflictItemName()
-                            + "过敏",
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
-        }else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Group.getName())) {
-            //禁忌禁忌人群
-            billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    resultBill.getConflictItemName(),
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
-        } else {
-            //通用
-            String content = "";
-            if (StringUtil.isNotBlank(resultBill.getConflictItemHisName())) {
-                content = resultBill.getConflictItemHisName();
-            }
-            if (StringUtil.isNotBlank(resultBill.getConflictItemHisDetailName())
-                    && !resultBill.getConflictItemHisName().equals(resultBill.getConflictItemHisDetailName())) {
-                content += resultBill.getConflictItemHisDetailName();
-            }
-            if (StringUtil.isBlank(content)) {
-                content += resultBill.getConflictItemName();
+        //输血开单
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.TransfusionRemind.getName())) {
+            if (resultBill.getConflictItemType().equals(GraphLabelEnum.LisName.getName())) {
+                String content = resultBill.getConflictItemHisName();
+                if (StringUtil.isNotBlank(resultBill.getConflictItemHisDetailName())
+                        && !resultBill.getConflictItemHisName().equals(resultBill.getConflictItemHisDetailName())) {
+                    content += resultBill.getConflictItemHisDetailName();
+                }
+                if (StringUtil.isNotBlank(resultBill.getInputValue())) {
+                    content += trimZero(resultBill.getInputValue());
+                }
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        content,
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType
+                );
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
+                billMsg = MsgUtil.getCommonSurgeryMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType
+                );
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoDiseaseName.getName())) {
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType
+                );
+            } else {
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType
+                );
             }
-            if (StringUtil.isNotBlank(resultBill.getInputValue())) {
-                content += trimZero(resultBill.getInputValue());
+        } else {
+            if (resultBill.getConflictItemType().equals(GraphLabelEnum.BillConflictItem.getName())) {
+                //互斥项
+                billMsg = MsgUtil.getBillExclusionMsg(resultBill.getBillItemHisName(),
+                        resultBill.getConflictItemHisName(),
+                        resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType());
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.ConflictDevice.getName())) {
+                //禁忌医疗器械及物品提示信息
+                billMsg = MsgUtil.getBillMedEquMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
+                //禁忌手术
+                billMsg = MsgUtil.getCommonSurgeryMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.OralMedicine.getName())) {
+                //禁忌服用药品
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        "可能正在用药" + resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.MedAllergen.getName())
+                    || resultBill.getConflictItemType().equals(GraphLabelEnum.Allergen.getName())) {
+                //禁忌药物过敏原/食物过敏原/过敏原
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        StringUtil.isNotBlank(resultBill.getConflictItemHisName())
+                                ? resultBill.getConflictItemHisName()
+                                : resultBill.getConflictItemName()
+                                + "过敏",
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Group.getName())) {
+                //禁忌禁忌人群
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Lis.getName())) {
+                //禁忌实验室检查
+                String content = "";
+                if (StringUtil.isNotBlank(resultBill.getConflictItemHisName())) {
+                    content = resultBill.getConflictItemHisName();
+                }
+                if (StringUtil.isNotBlank(resultBill.getConflictItemHisDetailName())
+                        && !resultBill.getConflictItemHisName().equals(resultBill.getConflictItemHisDetailName())) {
+                    content += resultBill.getConflictItemHisDetailName();
+                }
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        content,
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Disease.getName())) {
+                //禁忌疾病
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        resultBill.getConflictItemHisName(),
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
+            } else {
+                //通用
+                String content = resultBill.getConflictItemName();
+                if (StringUtil.isNotBlank(resultBill.getInputValue())) {
+                    content += trimZero(resultBill.getInputValue());
+                }
+                billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
+                        resultBill.getBillItemName(),
+                        content,
+                        "禁忌" + resultBill.getConflictItemType(),
+                        orderType);
             }
-            billMsg = MsgUtil.getCommonBillMsg(resultBill.getBillItemHisName(),
-                    resultBill.getBillItemName(),
-                    content,
-                    "禁忌" + resultBill.getConflictItemType(),
-                    orderType);
         }
         return billMsg;
     }

+ 120 - 83
cdssman-service/src/main/java/com/diagbot/facade/RuleTestFacade.java

@@ -34,7 +34,9 @@ import com.diagbot.vo.HospitalIdVO;
 import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.RuleTestVO;
 import com.google.common.collect.Lists;
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletResponse;
@@ -54,8 +56,10 @@ public class RuleTestFacade {
     @Autowired
     private CdssCoreClient cdssCoreClient;
     @Autowired
+    @Qualifier("resultBillServiceImpl")
     private ResultBillService resultBillService;
     @Autowired
+    @Qualifier("resultInfoServiceImpl")
     private ResultInfoService resultInfoService;
 
     @Autowired
@@ -110,95 +114,20 @@ public class RuleTestFacade {
      *
      * @param ruleTestVO
      */
-    public void billRuleTest(RuleTestVO ruleTestVO) {
+    public Boolean billRuleTest(RuleTestVO ruleTestVO) {
         Long hospitalId = ruleTestVO.getHospitalId();
 
         List<BillItem> billRules = billManRepository.getAllRules();
         //生成测试规则
         List<ResultBill> resultList = ruleConvertFacade.billRuleConvert(billRules, hospitalId);
         if (ListUtil.isEmpty(resultList)) {
-            return;
+            return true;
         }
-
-        List<ResultBill> saveList = Lists.newArrayList();
-
-        for (ResultBill resultBill : resultList) {
-            if (resultBill.getSuccess() != null
-                    && resultBill.getSuccess().equals(0)) {
-                saveList.add(resultBill);
-                continue;
-            }
-            IndicationPushVO indicationPushVO = searchDataFacade.creatBillVO(resultBill);
-            indicationPushVO.setHospitalId(hospitalId);
-
-            resultBill.setInputParams(FastJsonUtils.getBeanToJson(indicationPushVO));
-
-            RespDTO<IndicationDTO> respDTO = cdssCoreClient.indication(indicationPushVO);
-            if (RespDTOUtil.respIsOK(respDTO)) {
-                IndicationDTO data = respDTO.data;
-                List<BillMsg> billMsgList = data.getBillMsgList();
-                if (ListUtil.isEmpty(billMsgList)) {
-                    resultBill.setSuccess(0);
-                    resultBill.setMessage("未提示开单项");
-                    saveList.add(resultBill);
-                } else {
-                    /*private String referenceValue;*/
-                    for (BillMsg billMsg : billMsgList) {
-                        ResultBill saveResultBill = new ResultBill();
-                        BeanUtil.copyProperties(resultBill, saveResultBill);
-                        saveResultBill.setOutput(billMsg.getMsg());
-                        if (saveResultBill.getOutput().equals(saveResultBill.getExpectedOutput())) {
-                            saveResultBill.setSuccess(1);
-                        } else {
-                            saveResultBill.setSuccess(0);
-                            saveResultBill.setMessage("提示内容与预期不符");
-                        }
-                        saveList.add(saveResultBill);
-                    }
-                }
-            } else {
-                resultBill.setSuccess(0);
-                resultBill.setMessage("远程调用推理接口失败");
-                saveList.add(resultBill);
-            }
-        }
-
-        Integer totleNum = saveList.size();
-        Integer successNum = saveList.stream().filter(i -> i.getSuccess().equals(1)).collect(Collectors.toList()).size();
-        Integer failedNum = saveList.stream().filter(i -> i.getSuccess().equals(0)).collect(Collectors.toList()).size();
-
-
+        //远程调用推理
+        List<ResultBill> saveList = callBill(resultList, hospitalId);
         //保存测试结果
-        Date now = new Date();
-        QueryWrapper<ResultInfo> resultInfoQueryWrapper = new QueryWrapper<>();
-        resultInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
-                .eq("hospital_id", ruleTestVO.getHospitalId())
-                .eq("case_id", ruleTestVO.getCaseId());
-        ResultInfo resultInfo = resultInfoService.getOne(resultInfoQueryWrapper, false);
-        if (resultInfo == null) {
-            resultInfo = new ResultInfo();
-            resultInfo.setHospitalId(ruleTestVO.getHospitalId());
-            resultInfo.setCaseId(ruleTestVO.getCaseId());
-            resultInfo.setGmtCreate(now);
-        }
-        resultInfo.setGmtModified(now);
-        resultInfo.setRuleNum(totleNum);
-        resultInfo.setRuleSuccessNum(successNum);
-        resultInfo.setRuleFailedNum(failedNum);
-        resultInfoService.saveOrUpdate(resultInfo);
-
-        QueryWrapper<ResultBill> resultBillQueryWrapper = new QueryWrapper<>();
-        resultBillQueryWrapper.eq("result_id", resultInfo.getId());
-        resultBillService.remove(resultBillQueryWrapper);
-
-        for (ResultBill resultBill : saveList) {
-            resultBill.setBillType(1);
-            resultBill.setGmtCreate(now);
-            resultBill.setGmtModified(now);
-            resultBill.setResultId(resultInfo.getId());
-        }
-
-        resultBillService.saveOrUpdateBatch(saveList);
+        saveResultBill(saveList, ruleTestVO, 1);
+        return true;
     }
 
     /**
@@ -206,10 +135,19 @@ public class RuleTestFacade {
      *
      * @param ruleTestVO
      */
-    public void billTransfusionRuleTest(RuleTestVO ruleTestVO) {
+    public Boolean billTransfusionRuleTest(RuleTestVO ruleTestVO) {
         Long hospitalId = ruleTestVO.getHospitalId();
         List<TransfusionRemind> billRules_transfusion = transfusionRemindRepository.findByStatus(StatusEnum.Enable.getKey());
-        List<ResultBill> resultBillList_transfusion = Lists.newArrayList();
+        //生成测试规则
+        List<ResultBill> resultList = ruleConvertFacade.billRuleConvert_transfusion(billRules_transfusion, hospitalId);
+        if (ListUtil.isEmpty(resultList)) {
+            return true;
+        }
+        //远程调用推理
+        List<ResultBill> saveList = callBill(resultList, hospitalId);
+        //保存测试结果
+        saveResultBill(saveList, ruleTestVO, 2);
+        return true;
     }
 
     /**
@@ -294,4 +232,103 @@ public class RuleTestFacade {
 
         ExcelUtils.exportExcel(map, null, fileName, response);
     }
+
+    /**
+     * 开单合理性远程调用接口
+     *
+     * @param list
+     * @param hospitalId
+     * @return
+     */
+    public List<ResultBill> callBill(List<ResultBill> list, Long hospitalId) {
+        List<ResultBill> retList = Lists.newLinkedList();
+        if (ListUtil.isEmpty(list)) {
+            return retList;
+        }
+        for (ResultBill resultBill : list) {
+            if (resultBill.getSuccess() != null
+                    && resultBill.getSuccess().equals(0)) {
+                retList.add(resultBill);
+                continue;
+            }
+            IndicationPushVO indicationPushVO = searchDataFacade.creatBillVO(resultBill);
+            indicationPushVO.setHospitalId(hospitalId);
+
+            resultBill.setInputParams(FastJsonUtils.getBeanToJson(indicationPushVO));
+
+            RespDTO<IndicationDTO> respDTO = cdssCoreClient.indication(indicationPushVO);
+            if (RespDTOUtil.respIsOK(respDTO)) {
+                IndicationDTO data = respDTO.data;
+                List<BillMsg> billMsgList = data.getBillMsgList();
+                if (ListUtil.isEmpty(billMsgList)) {
+                    resultBill.setSuccess(0);
+                    resultBill.setMessage("未提示开单项");
+                    retList.add(resultBill);
+                } else {
+                    for (BillMsg billMsg : billMsgList) {
+                        ResultBill saveResultBill = new ResultBill();
+                        BeanUtil.copyProperties(resultBill, saveResultBill);
+                        saveResultBill.setOutput(billMsg.getMsg());
+                        if (saveResultBill.getOutput().equals(saveResultBill.getExpectedOutput())) {
+                            saveResultBill.setSuccess(1);
+                        } else {
+                            saveResultBill.setSuccess(0);
+                            saveResultBill.setMessage("提示内容与预期不符");
+                        }
+                        retList.add(saveResultBill);
+                    }
+                }
+            } else {
+                resultBill.setSuccess(0);
+                resultBill.setMessage("远程调用推理接口失败");
+                retList.add(resultBill);
+            }
+        }
+        return retList;
+    }
+
+    /**
+     * 保存开单合理性测试结果
+     * @param list
+     * @param ruleTestVO
+     * @param billType
+     * @return
+     */
+    public Boolean saveResultBill(List<ResultBill> list, RuleTestVO ruleTestVO, Integer billType) {
+        //保存测试结果
+        Date now = new Date();
+        Integer totleNum = list.size();
+        Integer successNum = list.stream().filter(i -> i.getSuccess().equals(1)).collect(Collectors.toList()).size();
+        Integer failedNum = list.stream().filter(i -> i.getSuccess().equals(0)).collect(Collectors.toList()).size();
+        QueryWrapper<ResultInfo> resultInfoQueryWrapper = new QueryWrapper<>();
+        resultInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("hospital_id", ruleTestVO.getHospitalId())
+                .eq("case_id", ruleTestVO.getCaseId());
+        ResultInfo resultInfo = resultInfoService.getOne(resultInfoQueryWrapper, false);
+        if (resultInfo == null) {
+            resultInfo = new ResultInfo();
+            resultInfo.setHospitalId(ruleTestVO.getHospitalId());
+            resultInfo.setCaseId(ruleTestVO.getCaseId());
+            resultInfo.setGmtCreate(now);
+        }
+        resultInfo.setGmtModified(now);
+        resultInfo.setRuleNum(totleNum);
+        resultInfo.setRuleSuccessNum(successNum);
+        resultInfo.setRuleFailedNum(failedNum);
+        resultInfoService.saveOrUpdate(resultInfo);
+
+        QueryWrapper<ResultBill> resultBillQueryWrapper = new QueryWrapper<>();
+        resultBillQueryWrapper.eq("result_id", resultInfo.getId());
+        resultBillService.remove(resultBillQueryWrapper);
+
+        for (ResultBill resultBill : list) {
+            resultBill.setBillType(billType);
+            resultBill.setGmtCreate(now);
+            resultBill.setGmtModified(now);
+            resultBill.setResultId(resultInfo.getId());
+        }
+
+        resultBillService.saveOrUpdateBatch(list);
+        return true;
+    }
 }

+ 22 - 3
cdssman-service/src/main/java/com/diagbot/facade/SearchDataFacade.java

@@ -8,6 +8,7 @@ import com.diagbot.enums.GraphLabelEnum;
 import com.diagbot.util.StringUtil;
 import com.diagbot.vo.Drug;
 import com.diagbot.vo.IndicationPushVO;
+import com.diagbot.vo.ItemExt;
 import org.springframework.stereotype.Component;
 
 /**
@@ -18,6 +19,12 @@ import org.springframework.stereotype.Component;
 @Component
 public class SearchDataFacade {
 
+    /**
+     * 生成开单合理性入参
+     *
+     * @param resultBill
+     * @return
+     */
     public IndicationPushVO creatBillVO(ResultBill resultBill) {
         IndicationPushVO indicationPushVO = new IndicationPushVO();
         indicationPushVO.setAge("20");
@@ -52,6 +59,12 @@ public class SearchDataFacade {
             drug.setUniqueName(resultBill.getBillItemName());
             indicationPushVO.getDrugOrder().add(drug);
         }
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.TransfusionRemind.getName())) {
+            ItemExt itemExt = new ItemExt();
+            itemExt.setName(resultBill.getBillItemHisName());
+            itemExt.setUniqueName(resultBill.getBillItemName());
+            indicationPushVO.getTransfusionOrder().add(itemExt);
+        }
 
         //未使用禁忌条件:食物过敏原、手术、给药途径
         if (resultBill.getConflictItemType().equals(GraphLabelEnum.Gender.getName())) {
@@ -98,7 +111,8 @@ public class SearchDataFacade {
             pacs.setDesc(resultBill.getConflictItemName());
             pacs.setResult(resultBill.getConflictItemName());
             indicationPushVO.getPacs().add(pacs);
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Lis.getName())) {
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Lis.getName())
+                || resultBill.getConflictItemType().equals(GraphLabelEnum.LisName.getName())) {
             Lis lis = new Lis();
             lis.setName(resultBill.getConflictItemHisName());
             lis.setDetailName(resultBill.getConflictItemHisDetailName());
@@ -116,7 +130,8 @@ public class SearchDataFacade {
                 lis.setMinValue(resultBill.getMinValue().doubleValue());
             }
             indicationPushVO.getLis().add(lis);
-        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Disease.getName())) {
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Disease.getName())
+                || resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoDiseaseName.getName())) {
             Item diag = new Item();
             diag.setName(resultBill.getConflictItemHisName());
             diag.setUniqueName(resultBill.getConflictItemName());
@@ -135,8 +150,12 @@ public class SearchDataFacade {
             pacs.setName(resultBill.getConflictItemHisName());
             pacs.setUniqueName(resultBill.getConflictItemName());
             indicationPushVO.getPacsOrder().add(pacs);
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
+            Item operation = new Item();
+            operation.setName(resultBill.getConflictItemHisName());
+            operation.setUniqueName(resultBill.getConflictItemName());
+            indicationPushVO.getOperation().add(operation);
         }
-
         return indicationPushVO;
     }
 }

+ 5 - 2
cdssman-service/src/main/java/com/diagbot/mapper/ResultBillMapper.java

@@ -1,7 +1,10 @@
 package com.diagbot.mapper;
 
-import com.diagbot.entity.ResultBill;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.entity.ResultBill;
+import com.diagbot.vo.ResultBillPageVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -12,5 +15,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  * @since 2021-01-08
  */
 public interface ResultBillMapper extends BaseMapper<ResultBill> {
-
+    IPage<ResultBill> getPage(@Param("resultBillPageVO") ResultBillPageVO resultBillPageVO);
 }

+ 6 - 0
cdssman-service/src/main/java/com/diagbot/mapper/ResultInfoMapper.java

@@ -1,7 +1,12 @@
 package com.diagbot.mapper;
 
+import com.diagbot.dto.CaseResultDTO;
 import com.diagbot.entity.ResultInfo;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.vo.HospitalIdVO;
+import com.diagbot.vo.RuleTestVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +18,5 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  */
 public interface ResultInfoMapper extends BaseMapper<ResultInfo> {
 
+    List<CaseResultDTO> getCaseResultList(RuleTestVO ruleTestVO);
 }

+ 5 - 1
cdssman-service/src/main/java/com/diagbot/service/ResultBillService.java

@@ -1,7 +1,10 @@
 package com.diagbot.service;
 
-import com.diagbot.entity.ResultBill;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.ResultBill;
+import com.diagbot.vo.ResultBillPageVO;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * <p>
@@ -13,4 +16,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ResultBillService extends IService<ResultBill> {
 
+    IPage<ResultBill> getPage(@Param("resultBillPageVO") ResultBillPageVO resultBillPageVO);
 }

+ 5 - 0
cdssman-service/src/main/java/com/diagbot/service/ResultInfoService.java

@@ -1,7 +1,11 @@
 package com.diagbot.service;
 
+import com.diagbot.dto.CaseResultDTO;
 import com.diagbot.entity.ResultInfo;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.vo.RuleTestVO;
+
+import java.util.List;
 
 /**
  * <p>
@@ -13,4 +17,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface ResultInfoService extends IService<ResultInfo> {
 
+    List<CaseResultDTO> getCaseResultList(RuleTestVO ruleTestVO);
 }

+ 7 - 0
cdssman-service/src/main/java/com/diagbot/service/impl/ResultBillServiceImpl.java

@@ -1,9 +1,13 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.entity.ResultBill;
 import com.diagbot.mapper.ResultBillMapper;
 import com.diagbot.service.ResultBillService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.ResultBillPageVO;
+
+import org.apache.ibatis.annotations.Param;
 import org.springframework.stereotype.Service;
 
 /**
@@ -17,4 +21,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class ResultBillServiceImpl extends ServiceImpl<ResultBillMapper, ResultBill> implements ResultBillService {
 
+    public IPage<ResultBill> getPage(@Param("resultBillPageVO") ResultBillPageVO resultBillPageVO) {
+        return baseMapper.getPage(resultBillPageVO);
+    }
 }

+ 8 - 1
cdssman-service/src/main/java/com/diagbot/service/impl/ResultInfoServiceImpl.java

@@ -1,11 +1,15 @@
 package com.diagbot.service.impl;
 
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.CaseResultDTO;
 import com.diagbot.entity.ResultInfo;
 import com.diagbot.mapper.ResultInfoMapper;
 import com.diagbot.service.ResultInfoService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.vo.RuleTestVO;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * <p>
  *  服务实现类
@@ -17,4 +21,7 @@ import org.springframework.stereotype.Service;
 @Service
 public class ResultInfoServiceImpl extends ServiceImpl<ResultInfoMapper, ResultInfo> implements ResultInfoService {
 
+    public List<CaseResultDTO> getCaseResultList(RuleTestVO ruleTestVO) {
+        return baseMapper.getCaseResultList(ruleTestVO);
+    }
 }

+ 18 - 0
cdssman-service/src/main/java/com/diagbot/vo/ResultBillPageVO.java

@@ -0,0 +1,18 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/1/13 17:25
+ */
+@Getter
+@Setter
+public class ResultBillPageVO extends Page {
+    private Integer success;
+    private Long resultId;
+    private Integer billType;
+}

+ 46 - 4
cdssman-service/src/main/java/com/diagbot/web/RuleTestController.java

@@ -1,13 +1,19 @@
 package com.diagbot.web;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.diagbot.annotation.SysLogger;
+import com.diagbot.dto.CaseResultDTO;
+import com.diagbot.dto.RespDTO;
+import com.diagbot.entity.ResultBill;
+import com.diagbot.facade.ResultBillFacade;
+import com.diagbot.facade.ResultInfoFacade;
 import com.diagbot.facade.RuleTestFacade;
 import com.diagbot.vo.HospitalIdVO;
+import com.diagbot.vo.ResultBillPageVO;
 import com.diagbot.vo.RuleTestVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -15,6 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
+import java.util.List;
 
 /**
  * @Description:
@@ -27,6 +34,30 @@ import javax.validation.Valid;
 public class RuleTestController {
     @Autowired
     private RuleTestFacade ruleTestFacade;
+    @Autowired
+    private ResultInfoFacade resultInfoFacade;
+    @Autowired
+    private ResultBillFacade resultBillFacade;
+
+    @ApiOperation(value = "开单合理性测试列表[zhaops]",
+            notes = "success: 成功标志(0:失败,1:成功) <br>" +
+                    "resultId: 结果id <br>" +
+                    "billType: 开单项类型(1:通用,2:输血) <br>")
+    @PostMapping("/getResultBillPage")
+    @SysLogger("getResultBillPage")
+    public RespDTO<IPage<ResultBill>> getResultBillPage(@Valid @RequestBody ResultBillPageVO resultBillPageVO) {
+        IPage<ResultBill> data = resultBillFacade.getPage(resultBillPageVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "医院规则测试结果列表[zhaops]",
+            notes = "hospitalId: 医院Id <br>")
+    @PostMapping("/getCaseResultList")
+    @SysLogger("getCaseResultList")
+    public RespDTO<List<CaseResultDTO>> getCaseResultList(@Valid @RequestBody RuleTestVO ruleTestVO) {
+        List<CaseResultDTO> data = resultInfoFacade.getCaseResultList(ruleTestVO);
+        return RespDTO.onSuc(data);
+    }
 
     /**
      * 数据导出
@@ -47,8 +78,19 @@ public class RuleTestController {
                     "caseId: 测试类型<br>")
     @PostMapping("/billRuleTest")
     @SysLogger("billRuleTest")
-    @Transactional
-    public void billRuleTest(@Valid @RequestBody RuleTestVO ruleTestVO) {
-        ruleTestFacade.billRuleTest(ruleTestVO);
+    public RespDTO<Boolean> billRuleTest(@Valid @RequestBody RuleTestVO ruleTestVO) {
+        Boolean data = ruleTestFacade.billRuleTest(ruleTestVO);
+        return RespDTO.onSuc(data);
+    }
+
+    @ApiOperation(value = "开单合理性规则测试[zhaops]",
+            notes = "hospitalId: 医院Id <br>" +
+                    "caseId: 测试类型<br>")
+    @PostMapping("/billTransfusionRuleTest")
+    @SysLogger("billTransfusionRuleTest")
+    //@Transactional
+    public RespDTO<Boolean> billTransfusionRuleTest(@Valid @RequestBody RuleTestVO ruleTestVO) {
+        Boolean data = ruleTestFacade.billTransfusionRuleTest(ruleTestVO);
+        return RespDTO.onSuc(data);
     }
 }

+ 15 - 0
cdssman-service/src/main/resources/mapper/ResultBillMapper.xml

@@ -33,4 +33,19 @@
         <result column="input_params" property="inputParams" />
     </resultMap>
 
+    <!-- 分页查询 -->
+    <select id="getPage" resultType="com.diagbot.entity.ResultBill">
+        select a.*
+        from test_result_bill a
+        where a.is_deleted='N'
+        <if test="resultBillPageVO.success != null">
+            and a.success = #{resultBillPageVO.success}
+        </if>
+        <if test="resultBillPageVO.resultId != null">
+            and a.result_id = #{resultBillPageVO.resultId}
+        </if>
+        <if test="resultBillPageVO.billType != null">
+            and a.bill_type = #{resultBillPageVO.billType}
+        </if>
+    </select>
 </mapper>

+ 20 - 0
cdssman-service/src/main/resources/mapper/ResultInfoMapper.xml

@@ -17,4 +17,24 @@
         <result column="rule_failed_num" property="ruleFailedNum" />
     </resultMap>
 
+    <!--医院规则测试结果列表-->
+    <select id="getCaseResultList" resultType="com.diagbot.dto.CaseResultDTO">
+        SELECT
+        a.case_name AS caseName,
+        b.id AS resultId,
+        b.case_id AS caseId,
+        b.rule_num AS ruleNum,
+        b.rule_success_num AS ruleSuccessNum,
+        b.rule_failed_num AS ruleFailedNum,
+        b.gmt_modified AS gmtModified
+        FROM
+        test_case_info a
+        LEFT JOIN test_result_info b ON a.id = b.case_id
+        <if test="hospitalId != null">
+            AND b.hospital_id = #{hospitalId}
+        </if>
+        WHERE
+        a.is_deleted = 'N'
+    </select>
+
 </mapper>

+ 11 - 11
config-server/src/main/resources/shared/cdssman-service-dev.yml

@@ -3,16 +3,22 @@ server:
 
 # 驱动配置信息
 spring:
+  data:
+    neo4j:
+      URI: http://192.168.2.234:7480
+      username: neo4j
+      password: root
   datasource:
     dynamic:
       primary: mysql
       # 数据库配置
       datasource:
-        neo4j:
-          driver-class-name: org.neo4j.jdbc.Driver
-          url: jdbc:neo4j:http://192.168.3.150:7474
-          username: neo4j
-          password: 12345678
+        mysql:
+          driver-class-name: com.mysql.cj.jdbc.Driver
+          platform: mysql
+          url: jdbc:mysql://192.168.2.236:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
+          username: root
+          password: lantone
           #定义初始连接数
           initialSize: 0
           #定义最大连接数
@@ -23,12 +29,6 @@ spring:
           minIdle: 1
           #定义最长等待时间
           maxWait: 60000
-        mysql:
-          driver-class-name: com.mysql.cj.jdbc.Driver
-          platform: mysql
-          url: jdbc:mysql://192.168.2.236:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true
-          username: root
-          password: lantone
 
 
   cloud:

+ 6 - 7
config-server/src/main/resources/shared/cdssman-service-local.yml

@@ -3,6 +3,11 @@ server:
 
 # 驱动配置信息
 spring:
+  data:
+    neo4j:
+      URI: http://192.168.3.150:7480
+      username: neo4j
+      password: root
   datasource:
     dynamic:
       primary: mysql
@@ -24,12 +29,6 @@ spring:
           minIdle: 1
           #定义最长等待时间
           maxWait: 60000
-neo4j:
-  data:
-    URI: http://192.168.2.234:7480
-    username: neo4j
-    password: root
-
 
   cloud:
     stream:
@@ -89,4 +88,4 @@ imageUrl:
 
 #CDSS核心地址
 cdss-core:
-  url: http://192.168.2.236:7010
+  url: http://192.168.2.121:7010