Browse Source

医学规则测试

zhaops 4 years ago
parent
commit
c736f5932b

+ 368 - 0
cdssman-service/src/main/java/com/diagbot/entity/ResultHighriskOperation.java

@@ -0,0 +1,368 @@
+package com.diagbot.entity;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.util.Date;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-19
+ */
+@TableName("test_result_highrisk_operation")
+public class ResultHighriskOperation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 测试结果id
+     */
+    private Long resultId;
+
+    /**
+     * 标准名称
+     */
+    private String highriskItemName;
+
+    /**
+     * 医院端名称
+     */
+    private String highriskItemHisName;
+
+    /**
+     * 手术级别(1、2、3、4、5)
+     */
+    private String level;
+
+    /**
+     * 高危条件名称
+     */
+    private String factorItemName;
+
+    /**
+     * 高危条件医院端名称
+     */
+    private String factorItemHisName;
+
+    /**
+     * 高危条件医院端名称-细项
+     */
+    private String factorItemHisDetailName;
+
+    /**
+     * 高危条件类型
+     */
+    private String factorItemType;
+
+    /**
+     * 高危条件范围
+     */
+    private Integer factorItemRange;
+
+    /**
+     * 高危条件最小值
+     */
+    private BigDecimal factorItemMinValue;
+
+    /**
+     * 高危条件最大值
+     */
+    private BigDecimal factorItemMaxValue;
+
+    /**
+     * 输入值
+     */
+    private String inputValue;
+
+    /**
+     * 高危条件单位
+     */
+    private String factorItemUnit;
+
+    /**
+     * 是否模糊匹配
+     */
+    private String factorItemExactMatch;
+
+    /**
+     * 高危条件
+     */
+    private String factorItemCond;
+
+    /**
+     * 输出结果(提醒文本)
+     */
+    private String output;
+
+    /**
+     * 期望输出结果(提醒文本)
+     */
+    private String expectedOutput;
+
+    /**
+     * 成功标志(1:成功,0:失败)
+     */
+    private Integer success;
+
+    /**
+     * 提示信息(异常提醒)
+     */
+    private String message;
+
+    /**
+     * 模拟入参
+     */
+    private String inputParams;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+    public Long getResultId() {
+        return resultId;
+    }
+
+    public void setResultId(Long resultId) {
+        this.resultId = resultId;
+    }
+    public String getHighriskItemName() {
+        return highriskItemName;
+    }
+
+    public void setHighriskItemName(String highriskItemName) {
+        this.highriskItemName = highriskItemName;
+    }
+    public String getHighriskItemHisName() {
+        return highriskItemHisName;
+    }
+
+    public void setHighriskItemHisName(String highriskItemHisName) {
+        this.highriskItemHisName = highriskItemHisName;
+    }
+    public String getLevel() {
+        return level;
+    }
+
+    public void setLevel(String level) {
+        this.level = level;
+    }
+    public String getFactorItemName() {
+        return factorItemName;
+    }
+
+    public void setFactorItemName(String factorItemName) {
+        this.factorItemName = factorItemName;
+    }
+    public String getFactorItemHisName() {
+        return factorItemHisName;
+    }
+
+    public void setFactorItemHisName(String factorItemHisName) {
+        this.factorItemHisName = factorItemHisName;
+    }
+    public String getFactorItemHisDetailName() {
+        return factorItemHisDetailName;
+    }
+
+    public void setFactorItemHisDetailName(String factorItemHisDetailName) {
+        this.factorItemHisDetailName = factorItemHisDetailName;
+    }
+    public String getFactorItemType() {
+        return factorItemType;
+    }
+
+    public void setFactorItemType(String factorItemType) {
+        this.factorItemType = factorItemType;
+    }
+    public Integer getFactorItemRange() {
+        return factorItemRange;
+    }
+
+    public void setFactorItemRange(Integer factorItemRange) {
+        this.factorItemRange = factorItemRange;
+    }
+    public BigDecimal getFactorItemMinValue() {
+        return factorItemMinValue;
+    }
+
+    public void setFactorItemMinValue(BigDecimal factorItemMinValue) {
+        this.factorItemMinValue = factorItemMinValue;
+    }
+    public BigDecimal getFactorItemMaxValue() {
+        return factorItemMaxValue;
+    }
+
+    public void setFactorItemMaxValue(BigDecimal factorItemMaxValue) {
+        this.factorItemMaxValue = factorItemMaxValue;
+    }
+    public String getInputValue() {
+        return inputValue;
+    }
+
+    public void setInputValue(String inputValue) {
+        this.inputValue = inputValue;
+    }
+    public String getFactorItemUnit() {
+        return factorItemUnit;
+    }
+
+    public void setFactorItemUnit(String factorItemUnit) {
+        this.factorItemUnit = factorItemUnit;
+    }
+    public String getFactorItemExactMatch() {
+        return factorItemExactMatch;
+    }
+
+    public void setFactorItemExactMatch(String factorItemExactMatch) {
+        this.factorItemExactMatch = factorItemExactMatch;
+    }
+    public String getFactorItemCond() {
+        return factorItemCond;
+    }
+
+    public void setFactorItemCond(String factorItemCond) {
+        this.factorItemCond = factorItemCond;
+    }
+    public String getOutput() {
+        return output;
+    }
+
+    public void setOutput(String output) {
+        this.output = output;
+    }
+    public String getExpectedOutput() {
+        return expectedOutput;
+    }
+
+    public void setExpectedOutput(String expectedOutput) {
+        this.expectedOutput = expectedOutput;
+    }
+    public Integer getSuccess() {
+        return success;
+    }
+
+    public void setSuccess(Integer success) {
+        this.success = success;
+    }
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+    public String getInputParams() {
+        return inputParams;
+    }
+
+    public void setInputParams(String inputParams) {
+        this.inputParams = inputParams;
+    }
+
+    @Override
+    public String toString() {
+        return "ResultHighriskOperation{" +
+            "id=" + id +
+            ", isDeleted=" + isDeleted +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", creator=" + creator +
+            ", modifier=" + modifier +
+            ", resultId=" + resultId +
+            ", highriskItemName=" + highriskItemName +
+            ", highriskItemHisName=" + highriskItemHisName +
+            ", level=" + level +
+            ", factorItemName=" + factorItemName +
+            ", factorItemHisName=" + factorItemHisName +
+            ", factorItemHisDetailName=" + factorItemHisDetailName +
+            ", factorItemType=" + factorItemType +
+            ", factorItemRange=" + factorItemRange +
+            ", factorItemMinValue=" + factorItemMinValue +
+            ", factorItemMaxValue=" + factorItemMaxValue +
+            ", inputValue=" + inputValue +
+            ", factorItemUnit=" + factorItemUnit +
+            ", factorItemExactMatch=" + factorItemExactMatch +
+            ", factorItemCond=" + factorItemCond +
+            ", output=" + output +
+            ", expectedOutput=" + expectedOutput +
+            ", success=" + success +
+            ", message=" + message +
+            ", inputParams=" + inputParams +
+        "}";
+    }
+}

+ 2 - 1
cdssman-service/src/main/java/com/diagbot/enums/TypeEnum.java

@@ -19,7 +19,8 @@ public enum TypeEnum implements KeyedNamed {
     operation(6, "手术"),
     vital(7, "查体"),
     transfusion(8, "输血"),
-    age(9,"年龄");
+    age(9,"年龄"),
+    pacsDecs(10,"辅检结果描述");
 
     @Setter
     private int key;

+ 595 - 4
cdssman-service/src/main/java/com/diagbot/facade/RuleConvertFacade.java

@@ -1,10 +1,12 @@
 package com.diagbot.facade;
 
+import com.alibaba.fastjson.JSONObject;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.entity.MappingShortEntity;
 import com.diagbot.entity.ResultBill;
 import com.diagbot.entity.ResultCritical;
 import com.diagbot.entity.ResultHighriskDrug;
+import com.diagbot.entity.ResultHighriskOperation;
 import com.diagbot.entity.node.BillItem;
 import com.diagbot.entity.node.LisCritical;
 import com.diagbot.entity.node.LisName;
@@ -12,6 +14,7 @@ import com.diagbot.entity.node.MedNameRegName;
 import com.diagbot.entity.node.MedRegName;
 import com.diagbot.entity.node.PacsCritical;
 import com.diagbot.entity.node.TransfusionRemind;
+import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.enums.GraphLabelEnum;
 import com.diagbot.enums.StatusEnum;
 import com.diagbot.enums.TypeEnum;
@@ -24,10 +27,12 @@ import com.diagbot.util.StringUtil;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -59,6 +64,7 @@ public class RuleConvertFacade {
 
     /**
      * 开单规则转换
+     *
      * @param billItems
      * @param hospitalId
      * @return
@@ -291,11 +297,12 @@ public class RuleConvertFacade {
 
     /**
      * 开单规则转换-输血
+     *
      * @param items
      * @param hospitalId
      * @return
      */
-    public List<ResultBill> billRuleConvert_transfusion(List<TransfusionRemind> items,Long hospitalId) {
+    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();
@@ -403,11 +410,12 @@ public class RuleConvertFacade {
 
     /**
      * 危急值规则转换-检验
+     *
      * @param items
      * @param hospitalId
      * @return
      */
-    public List<ResultCritical> criticalRuleConvert_lis(List<LisCritical> items,Long hospitalId) {
+    public List<ResultCritical> criticalRuleConvert_lis(List<LisCritical> items, Long hospitalId) {
         List<ResultCritical> retList = Lists.newLinkedList();
         List<ResultCritical> resultList = Lists.newLinkedList();
         List<ResultCritical> resultMappingList = Lists.newArrayList();
@@ -489,11 +497,12 @@ public class RuleConvertFacade {
 
     /**
      * 危急值规则转换-检查
+     *
      * @param items
      * @param hospitalId
      * @return
      */
-    public List<ResultCritical> criticalRuleConvert_pacs(List<PacsCritical> items,Long hospitalId) {
+    public List<ResultCritical> criticalRuleConvert_pacs(List<PacsCritical> items, Long hospitalId) {
         List<ResultCritical> retList = Lists.newLinkedList();
         List<ResultCritical> resultList = Lists.newLinkedList();
         List<ResultCritical> resultMappingList = Lists.newArrayList();
@@ -538,11 +547,12 @@ public class RuleConvertFacade {
 
     /**
      * 高危药品转换
+     *
      * @param items
      * @param hospitalId
      * @return
      */
-    public List<ResultHighriskDrug> highriskRuleConvert_drug(List<MedRegName> items,Long hospitalId) {
+    public List<ResultHighriskDrug> highriskRuleConvert_drug(List<MedRegName> items, Long hospitalId) {
         List<ResultHighriskDrug> retList = Lists.newLinkedList();
         List<ResultHighriskDrug> retMedList = Lists.newLinkedList();
         List<ResultHighriskDrug> retMappingList = Lists.newLinkedList();
@@ -617,6 +627,324 @@ public class RuleConvertFacade {
         return retList;
     }
 
+    /**
+     * 高危手术转换
+     *
+     * @param items
+     * @param hospitalId
+     * @return
+     */
+    public List<ResultHighriskOperation> highriskRuleConvert_operation(List<YiBaoOperationName> items, Long hospitalId) {
+        List<ResultHighriskOperation> retList = Lists.newLinkedList();
+        List<ResultHighriskOperation> retOptList = Lists.newLinkedList();
+        List<ResultHighriskOperation> retMappingList = Lists.newLinkedList();
+        List<ResultHighriskOperation> retFactorMappingList = Lists.newLinkedList();
+
+        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);
+
+        if (ListUtil.isEmpty(items)) {
+            return retList;
+        }
+
+        List<String> conds = items.stream().map(i -> i.getHighriskcond()).filter(i -> StringUtil.isNotBlank(i)).distinct().collect(Collectors.toList());
+        Map<Integer, Map<String, Object>> condMap = new LinkedHashMap<>();
+        if (ListUtil.isNotEmpty(conds)) {
+            for (String cond : conds) {
+                condMap.putAll(getHighriskCondMap(cond));
+            }
+        }
+
+        //转换高危手术记录
+        Integer condIndex = 0;
+        for (YiBaoOperationName item : items) {
+            //非高危手术
+            if (StringUtil.isBlank(item.getOpgrade()) || item.getOpgrade().equals("0") || item.getOpgrade().equals("1")) {
+                continue;
+            }
+            ResultHighriskOperation result = new ResultHighriskOperation();
+            result.setHighriskItemName(item.getName());
+            result.setLevel(item.getOpgrade());
+            //带条件高危手术
+            if (item.getOpgrade().equals("2")) {
+                if (condMap == null || condMap.size() == 0||StringUtil.isBlank(item.getHighriskcond())) {
+                    result.setSuccess(0);
+                    result.setMessage("缺少高危条件");
+                    retOptList.add(result);
+                    continue;
+                }
+                result.setFactorItemCond(item.getHighriskcond());
+                Map<String, Object> subCondMap = condMap.get(condIndex++);
+                if (condIndex.equals(condMap.size())) {
+                    condIndex = 0;
+                }
+                String type = subCondMap.get("type").toString();
+                if (type.equals(TypeEnum.age.getName())) {
+                    ResultHighriskOperation ageResult = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, ageResult);
+                    ageResult.setFactorItemType(TypeEnum.age.getName());
+                    ageResult.setFactorItemName(subCondMap.get("name").toString());
+                    if (subCondMap.containsKey("最大值")) {
+                        ageResult.setFactorItemMaxValue((BigDecimal) subCondMap.get("最大值"));
+                    }
+                    if (subCondMap.containsKey("最小值")) {
+                        ageResult.setFactorItemMinValue((BigDecimal) subCondMap.get("最小值"));
+                    }
+                    if (subCondMap.containsKey("单位")) {
+                        ageResult.setFactorItemUnit(subCondMap.get("单位").toString());
+                    }
+                    if (subCondMap.containsKey("范围")) {
+                        ageResult.setFactorItemRange((Integer) subCondMap.get("范围"));
+                    }
+                    retOptList.add(ageResult);
+                } else if (type.equals(TypeEnum.vital.getName())) {
+                    ResultHighriskOperation vitalResult = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, vitalResult);
+                    vitalResult.setFactorItemName(subCondMap.get("name").toString());
+                    vitalResult.setFactorItemType(TypeEnum.vital.getName());
+                    if (subCondMap.containsKey("最大值")) {
+                        vitalResult.setFactorItemMaxValue((BigDecimal) subCondMap.get("最大值"));
+                    }
+                    if (subCondMap.containsKey("最小值")) {
+                        vitalResult.setFactorItemMinValue((BigDecimal) subCondMap.get("最小值"));
+                    }
+                    if (subCondMap.containsKey("单位")) {
+                        vitalResult.setFactorItemUnit((String) subCondMap.get("单位"));
+                    }
+                    if (subCondMap.containsKey("范围")) {
+                        vitalResult.setFactorItemRange((Integer) subCondMap.get("范围"));
+                    }
+                    retOptList.add(vitalResult);
+                } else if (type.equals(TypeEnum.disease.getName())) {
+                    ResultHighriskOperation diagResult = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, diagResult);
+                    diagResult.setFactorItemType(TypeEnum.disease.getName());
+                    diagResult.setFactorItemName(subCondMap.get("name").toString());
+                    retOptList.add(diagResult);
+                } else if (type.equals(TypeEnum.lis.getName())) {
+                    ResultHighriskOperation lisResult = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, lisResult);
+                    lisResult.setFactorItemType(TypeEnum.lis.getName());
+                    lisResult.setFactorItemName(subCondMap.get("name").toString());
+                    if (subCondMap.containsKey("最大值")) {
+                        lisResult.setFactorItemMaxValue((BigDecimal) subCondMap.get("最大值"));
+                    }
+                    if (subCondMap.containsKey("最小值")) {
+                        lisResult.setFactorItemMinValue((BigDecimal) subCondMap.get("最小值"));
+                    }
+                    if (subCondMap.containsKey("单位")) {
+                        lisResult.setFactorItemUnit((String) subCondMap.get("单位"));
+                    }
+                    if (subCondMap.containsKey("范围")) {
+                        lisResult.setFactorItemRange((Integer) subCondMap.get("范围"));
+                    }
+                    if (subCondMap.containsKey("结果")) {
+                        lisResult.setInputValue((String) subCondMap.get("结果"));
+                    }
+                    retOptList.add(lisResult);
+                } else if (type.equals(TypeEnum.pacsDecs.getName())) {
+                    ResultHighriskOperation pacsDescResult = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, pacsDescResult);
+                    pacsDescResult.setFactorItemType(TypeEnum.pacsDecs.getName());
+                    pacsDescResult.setInputValue(subCondMap.get("name").toString());
+                    retOptList.add(pacsDescResult);
+                }
+               /* String highriskcond = item.getHighriskcond();
+                JSONObject jobj = JSONObject.parseObject(highriskcond);
+                if (null != jobj) {
+                    // 判断年龄
+                    JSONObject ageobj = jobj.getJSONObject("年龄");
+                    if (ageobj != null) {
+                        ResultHighriskOperation ageResult = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, ageResult);
+                        ageResult.setFactorItemType(TypeEnum.age.getName());
+                        ageResult.setFactorItemName("年龄");
+                        if (ageobj.containsKey("最大值")) {
+                            ageResult.setFactorItemMaxValue(ageobj.getBigDecimal("最大值"));
+                        }
+                        if (ageobj.containsKey("最小值")) {
+                            ageResult.setFactorItemMinValue(ageobj.getBigDecimal("最小值"));
+                        }
+                        if (ageobj.containsKey("单位")) {
+                            ageResult.setFactorItemUnit(ageobj.getString("单位"));
+                        }
+                        if (ageobj.containsKey("范围")) {
+                            ageResult.setFactorItemRange(ageobj.getInteger("范围"));
+                        }
+                        retOptList.add(ageResult);
+                    }
+                    // 判断生命体征和查体
+                    JSONObject vitalObj = jobj.getJSONObject("生命体征及查体");
+                    if (null != vitalObj) {
+                        for (Map.Entry<String, Object> entry : vitalObj.entrySet()) {
+                            ResultHighriskOperation vitalResult = new ResultHighriskOperation();
+                            BeanUtil.copyProperties(result, vitalResult);
+                            vitalResult.setFactorItemName(entry.getKey());
+                            vitalResult.setFactorItemType(TypeEnum.vital.getName());
+                            if (ObjectUtils.isEmpty(entry.getValue())) {
+                                retOptList.add(vitalResult);
+                                continue;
+                            }
+                            JSONObject subVitalObj = (JSONObject) entry.getValue();
+                            if (null != subVitalObj) {
+                                if (subVitalObj.containsKey("最大值")) {
+                                    vitalResult.setFactorItemMaxValue(subVitalObj.getBigDecimal("最大值"));
+                                }
+                                if (subVitalObj.containsKey("最小值")) {
+                                    vitalResult.setFactorItemMinValue(subVitalObj.getBigDecimal("最小值"));
+                                }
+                                if (subVitalObj.containsKey("单位")) {
+                                    vitalResult.setFactorItemUnit(subVitalObj.getString("单位"));
+                                }
+                                if (subVitalObj.containsKey("范围")) {
+                                    vitalResult.setFactorItemRange(subVitalObj.getInteger("范围"));
+                                }
+                            }
+                            retOptList.add(vitalResult);
+                        }
+                    }
+
+                    // 判断合并疾病
+                    JSONObject diagobj = jobj.getJSONObject("合并疾病");
+                    if (null != diagobj) {
+                        for (Map.Entry<String, Object> entry : diagobj.entrySet()) {
+                            ResultHighriskOperation diagResult = new ResultHighriskOperation();
+                            BeanUtil.copyProperties(result, diagResult);
+                            diagResult.setFactorItemType(TypeEnum.disease.getName());
+                            diagResult.setFactorItemName(entry.getKey());
+                            retOptList.add(diagResult);
+                        }
+                    }
+
+                    // 判断化验结果
+                    JSONObject lisobj = jobj.getJSONObject("化验结果");
+                    if (null != lisobj) {
+                        for (Map.Entry<String, Object> entry : lisobj.entrySet()) {
+                            ResultHighriskOperation lisResult = new ResultHighriskOperation();
+                            BeanUtil.copyProperties(result, lisResult);
+                            lisResult.setFactorItemType(TypeEnum.lis.getName());
+                            lisResult.setFactorItemName(entry.getKey());
+                            if (ObjectUtils.isEmpty(entry.getValue())) {
+                                retOptList.add(lisResult);
+                                continue;
+                            }
+                            JSONObject subLisObj = (JSONObject) entry.getValue();
+                            if (null != subLisObj) {
+                                if (subLisObj.containsKey("最大值")) {
+                                    lisResult.setFactorItemMaxValue(subLisObj.getBigDecimal("最大值"));
+                                }
+                                if (subLisObj.containsKey("最小值")) {
+                                    lisResult.setFactorItemMinValue(subLisObj.getBigDecimal("最小值"));
+                                }
+                                if (subLisObj.containsKey("单位")) {
+                                    lisResult.setFactorItemUnit(subLisObj.getString("单位"));
+                                }
+                                if (subLisObj.containsKey("范围")) {
+                                    lisResult.setFactorItemRange(subLisObj.getInteger("范围"));
+                                }
+                                if (subLisObj.containsKey("结果")) {
+                                    lisResult.setInputValue(subLisObj.getString("结果"));
+                                }
+                            }
+                            retOptList.add(lisResult);
+                        }
+                    }
+
+                    // 判断辅检结果,暂不处理
+                    JSONObject pacsObj = jobj.getJSONObject("辅检结果");
+                    // 判断辅检结果描述
+                    JSONObject pacsDescObj = jobj.getJSONObject("辅检结果描述");
+                    if (null != pacsDescObj) {
+                        for (Map.Entry<String, Object> entry : pacsDescObj.entrySet()) {
+                            ResultHighriskOperation pacsDescResult = new ResultHighriskOperation();
+                            BeanUtil.copyProperties(result, pacsDescResult);
+                            pacsDescResult.setFactorItemType(TypeEnum.pacsDecs.getName());
+                            pacsDescResult.setFactorItemName("胸部CT");
+                            pacsDescResult.setFactorItemHisName("胸部CT");
+                            pacsDescResult.setInputValue(entry.getKey());
+                            retOptList.add(pacsDescResult);
+                        }
+                    }
+                }*/
+            } else {
+                retOptList.add(result);
+            }
+        }
+
+        //手术名称映射
+        for (ResultHighriskOperation result : retOptList) {
+            Map<String, List<Long>> subMap = operationConfigMap.get(result.getHighriskItemName());
+            if (subMap != null && subMap.size() > 0) {
+                subMap.keySet().forEach(hisName -> {
+                    ResultHighriskOperation resultExt = new ResultHighriskOperation();
+                    BeanUtil.copyProperties(result, resultExt);
+                    resultExt.setHighriskItemHisName(hisName);
+                    retMappingList.add(resultExt);
+                });
+            } else {
+                result.setSuccess(0);
+                result.setMessage((StringUtil.isNotBlank(result.getMessage()) ? result.getMessage() : "") +
+                        "高危手术缺少医院端映射;");
+                retMappingList.add(result);
+            }
+        }
+
+        //高危条件映射
+        for (ResultHighriskOperation result : retMappingList) {
+            if (result.getFactorItemType() == null) {
+                retFactorMappingList.add(result);
+                continue;
+            }
+            if (result.getFactorItemType().equals(TypeEnum.disease.getName())) {
+                Map<String, List<Long>> subMap = diseaseConfigMap.get(result.getFactorItemName());
+                if (subMap != null && subMap.size() > 0) {
+                    subMap.keySet().forEach(hisName -> {
+                        ResultHighriskOperation resultExt = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, resultExt);
+                        resultExt.setFactorItemHisName(hisName);
+                        retFactorMappingList.add(resultExt);
+                    });
+                } else {
+                    result.setSuccess(0);
+                    result.setMessage((StringUtil.isNotBlank(result.getMessage()) ? result.getMessage() : "") +
+                            "高危手术条件缺少医院端映射;");
+                    retFactorMappingList.add(result);
+                }
+
+            } else if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                Map<String, Map<String, List<Long>>> subMap = lisConfigMap.get(result.getFactorItemName());
+                if (subMap != null && subMap.size() > 0) {
+                    subMap.entrySet().forEach(entry -> {
+                        ResultHighriskOperation resultExt = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, resultExt);
+                        resultExt.setFactorItemHisName(entry.getKey());
+                        if (entry.getValue() != null && entry.getValue().size() > 0) {
+                            entry.getValue().keySet().forEach(hisDetailName -> {
+                                resultExt.setFactorItemHisDetailName(hisDetailName);
+                                retFactorMappingList.add(resultExt);
+                            });
+                        } else {
+                            retFactorMappingList.add(resultExt);
+                        }
+                    });
+                } else {
+                    result.setSuccess(0);
+                    result.setMessage((StringUtil.isNotBlank(result.getMessage()) ? result.getMessage() : "") +
+                            "高危手术条件缺少医院端映射;");
+                    retFactorMappingList.add(result);
+                }
+            } else {
+                retFactorMappingList.add(result);
+            }
+        }
+
+        //模拟输入数据
+        retList = createHighriskOperationInputValue(retFactorMappingList);
+
+        return retList;
+    }
+
     public MappingShortEntity setMappingShortEntity(String name, String hisName, String hisDetailName) {
         MappingShortEntity item = new MappingShortEntity();
         item.setName(name);
@@ -627,6 +955,7 @@ public class RuleConvertFacade {
 
     /**
      * 模拟输入数值
+     *
      * @param resultList
      * @return
      */
@@ -678,6 +1007,7 @@ public class RuleConvertFacade {
 
     /**
      * 模拟输入数值-危急值
+     *
      * @param resultList
      * @return
      */
@@ -727,6 +1057,70 @@ public class RuleConvertFacade {
         return retList;
     }
 
+    /**
+     * 模拟输入数值-高危手术
+     *
+     * @param resultList
+     * @return
+     */
+    public List<ResultHighriskOperation> createHighriskOperationInputValue(List<ResultHighriskOperation> resultList) {
+        List<ResultHighriskOperation> retList = Lists.newLinkedList();
+        if (ListUtil.isEmpty(resultList)) {
+            return retList;
+        }
+        for (ResultHighriskOperation result : resultList) {
+            if (result.getSuccess() != null && result.getSuccess().equals(0)) {
+                retList.add(result);
+                continue;
+            }
+            if (result.getFactorItemMaxValue() != null || result.getFactorItemMinValue() != null) {
+                if (result.getFactorItemRange() == null) {
+                    result.setFactorItemRange(0);
+                }
+                if (result.getFactorItemRange().equals(1)) {
+                    if (result.getFactorItemMinValue() != null) {
+                        ResultHighriskOperation minResult = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, minResult);
+                        if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                            minResult.setInputValue(random(null, result.getFactorItemMinValue()).toString());
+                        } else {
+                            minResult.setInputValue(random_int(null, result.getFactorItemMinValue().intValue()).toString());
+                        }
+                        BillMsg billMsg = getHighriskOperationMsg(minResult);
+                        minResult.setExpectedOutput(billMsg.getMsg());
+                        retList.add(minResult);
+                    }
+                    if (result.getFactorItemMaxValue() != null) {
+                        ResultHighriskOperation maxResult = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, maxResult);
+                        if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                            maxResult.setInputValue(random(result.getFactorItemMaxValue(), null).toString());
+                        } else {
+                            maxResult.setInputValue(random_int(result.getFactorItemMaxValue().intValue(), null).toString());
+                        }
+                        BillMsg billMsg = getHighriskOperationMsg(maxResult);
+                        maxResult.setExpectedOutput(billMsg.getMsg());
+                        retList.add(maxResult);
+                    }
+                } else {
+                    if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                        result.setInputValue(random(result.getFactorItemMinValue(), result.getFactorItemMaxValue()).toString());
+                    } else {
+                        result.setInputValue(random_int(result.getFactorItemMinValue().intValue(), result.getFactorItemMaxValue().intValue()).toString());
+                    }
+                    BillMsg billMsg = getHighriskOperationMsg(result);
+                    result.setExpectedOutput(billMsg.getMsg());
+                    retList.add(result);
+                }
+            } else {
+                BillMsg billMsg = getHighriskOperationMsg(result);
+                result.setExpectedOutput(billMsg.getMsg());
+                retList.add(result);
+            }
+        }
+        return retList;
+    }
+
     /**
      * 模拟提示信息
      *
@@ -861,6 +1255,7 @@ public class RuleConvertFacade {
 
     /**
      * 模拟提示信息-危急值
+     *
      * @param resultCritical
      * @return
      */
@@ -885,6 +1280,60 @@ public class RuleConvertFacade {
         return billMsg;
     }
 
+    /**
+     * 模拟提示信息-高危手术
+     *
+     * @param result
+     * @return
+     */
+    public BillMsg getHighriskOperationMsg(ResultHighriskOperation result) {
+        BillMsg billMsg = new BillMsg();
+        if (StringUtil.isNotBlank(result.getLevel()) && result.getLevel().equals("2")) {
+            if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                String content = "";
+                if (StringUtil.isNotBlank(result.getFactorItemHisName())) {
+                    content += result.getFactorItemHisName();
+                }
+                if (StringUtil.isNotBlank(result.getFactorItemHisDetailName())
+                        && !result.getFactorItemHisDetailName().equals(result.getFactorItemHisName())) {
+                    content += result.getFactorItemHisDetailName();
+                }
+                if (StringUtil.isNotBlank(result.getInputValue())) {
+                    content += trimZero(result.getInputValue());
+                }
+                billMsg = MsgUtil.getComplexOperationMsg(content, result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            } else if (result.getFactorItemType().equals(TypeEnum.age.getName())) {
+                String content = result.getFactorItemName() + ":";
+                if (StringUtil.isNotBlank(result.getInputValue())) {
+                    content += trimZero(result.getInputValue());
+                }
+                billMsg = MsgUtil.getComplexOperationMsg(content, result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            } else if (result.getFactorItemType().equals(TypeEnum.vital.getName())) {
+                String content = "";
+                if (result.getFactorItemName().equals("收缩压")) {
+                    content = "血压" + result.getInputValue() + "/80";
+                } else if (result.getFactorItemName().equals("舒张压")) {
+                    content = "血压120/" + result.getInputValue();
+                } else {
+                    content = result.getFactorItemName();
+                    if (StringUtil.isNotBlank(result.getInputValue())) {
+                        content += trimZero(result.getInputValue());
+                    }
+                }
+                billMsg = MsgUtil.getComplexOperationMsg(content, result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            } else if (result.getFactorItemType().equals(TypeEnum.pacsDecs.getName())) {
+                billMsg = MsgUtil.getComplexOperationMsg(result.getInputValue(), result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            } else if (result.getFactorItemType().equals(TypeEnum.disease.getName())) {
+                billMsg = MsgUtil.getComplexOperationMsg(result.getFactorItemHisName(), result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            } else {
+                billMsg = MsgUtil.getComplexOperationMsg(result.getFactorItemName(), result.getHighriskItemHisName(), TypeEnum.operation.getName());
+            }
+        } else {
+            billMsg = MsgUtil.getCommonHighRiskMsg(result.getHighriskItemHisName(), result.getLevel(), TypeEnum.operation.getName());
+        }
+        return billMsg;
+    }
+
 
     /**
      * 生成随机数
@@ -904,6 +1353,24 @@ public class RuleConvertFacade {
         return randomVal.setScale(2, BigDecimal.ROUND_HALF_UP);
     }
 
+    /**
+     * 生成随机-整数
+     *
+     * @param min
+     * @param max
+     * @return
+     */
+    public Integer random_int(Integer min, Integer max) {
+        if (min == null) {
+            min = 0;
+        }
+        if (max == null) {
+            max = min + 10;
+        }
+        Integer random_int = (int) (Math.random() * (max - min)) + min;
+        return random_int;
+    }
+
     /**
      * 开单类型转换
      *
@@ -959,4 +1426,128 @@ public class RuleConvertFacade {
         }
         return s;
     }
+
+    /**
+     * 手术高危条件
+     *
+     * @param highriskCond
+     * @return
+     */
+    Map<Integer, Map<String, Object>> getHighriskCondMap(String highriskCond) {
+        Map<Integer, Map<String, Object>> retMap = new LinkedHashMap<>();
+        if (StringUtil.isBlank(highriskCond)) {
+            return retMap;
+        }
+        JSONObject jobj = JSONObject.parseObject(highriskCond);
+        if (null != jobj) {
+            Integer index = 0;
+            // 判断年龄
+            JSONObject ageobj = jobj.getJSONObject("年龄");
+            if (ageobj != null) {
+                Map<String, Object> subMap = new HashMap<>();
+                subMap.put("type", TypeEnum.age.getName());
+                subMap.put("name", "年龄");
+                if (ageobj.containsKey("最大值")) {
+                    subMap.put("最大值", ageobj.getBigDecimal("最大值"));
+                }
+                if (ageobj.containsKey("最小值")) {
+                    subMap.put("最小值", ageobj.getBigDecimal("最小值"));
+                }
+                if (ageobj.containsKey("单位")) {
+                    subMap.put("单位", ageobj.getString("单位"));
+                }
+                if (ageobj.containsKey("范围")) {
+                    subMap.put("范围", ageobj.getInteger("范围"));
+                }
+                retMap.put(index++, subMap);
+            }
+            // 判断生命体征和查体
+            JSONObject vitalObj = jobj.getJSONObject("生命体征及查体");
+            if (null != vitalObj) {
+                for (Map.Entry<String, Object> entry : vitalObj.entrySet()) {
+                    Map<String, Object> subMap = new HashMap<>();
+                    subMap.put("type", TypeEnum.vital.getName());
+                    subMap.put("name", entry.getKey());
+                    if (ObjectUtils.isEmpty(entry.getValue())) {
+                        retMap.put(index++, subMap);
+                        continue;
+                    }
+                    JSONObject subVitalObj = (JSONObject) entry.getValue();
+                    if (null != subVitalObj) {
+                        if (subVitalObj.containsKey("最大值")) {
+                            subMap.put("最大值", subVitalObj.getBigDecimal("最大值"));
+                        }
+                        if (subVitalObj.containsKey("最小值")) {
+                            subMap.put("最小值", subVitalObj.getBigDecimal("最小值"));
+                        }
+                        if (subVitalObj.containsKey("单位")) {
+                            subMap.put("单位", subVitalObj.getString("单位"));
+                        }
+                        if (subVitalObj.containsKey("范围")) {
+                            subMap.put("范围", subVitalObj.getInteger("范围"));
+                        }
+                    }
+                    retMap.put(index++, subMap);
+                }
+            }
+
+            // 判断合并疾病
+            JSONObject diagobj = jobj.getJSONObject("合并疾病");
+            if (null != diagobj) {
+                for (Map.Entry<String, Object> entry : diagobj.entrySet()) {
+                    Map<String, Object> subMap = new HashMap<>();
+                    subMap.put("type", TypeEnum.disease.getName());
+                    subMap.put("name", entry.getKey());
+                    retMap.put(index++, subMap);
+                }
+            }
+
+            // 判断化验结果
+            JSONObject lisobj = jobj.getJSONObject("化验结果");
+            if (null != lisobj) {
+                for (Map.Entry<String, Object> entry : lisobj.entrySet()) {
+                    Map<String, Object> subMap = new HashMap<>();
+                    subMap.put("type", TypeEnum.lis.getName());
+                    subMap.put("name", entry.getKey());
+                    if (ObjectUtils.isEmpty(entry.getValue())) {
+                        retMap.put(index++, subMap);
+                        continue;
+                    }
+                    JSONObject subLisObj = (JSONObject) entry.getValue();
+                    if (null != subLisObj) {
+                        if (subLisObj.containsKey("最大值")) {
+                            subMap.put("最大值", subLisObj.getBigDecimal("最大值"));
+                        }
+                        if (subLisObj.containsKey("最小值")) {
+                            subMap.put("最小值", subLisObj.getBigDecimal("最小值"));
+                        }
+                        if (subLisObj.containsKey("单位")) {
+                            subMap.put("单位", subLisObj.getString("单位"));
+                        }
+                        if (subLisObj.containsKey("范围")) {
+                            subMap.put("范围", subLisObj.getInteger("范围"));
+                        }
+                        if (subLisObj.containsKey("结果")) {
+                            subMap.put("结果", subLisObj.getString("结果"));
+                        }
+                    }
+                    retMap.put(index++, subMap);
+                }
+            }
+
+            // 判断辅检结果,暂不处理
+            JSONObject pacsObj = jobj.getJSONObject("辅检结果");
+            // 判断辅检结果描述
+            JSONObject pacsDescObj = jobj.getJSONObject("辅检结果描述");
+            if (null != pacsDescObj) {
+                for (Map.Entry<String, Object> entry : pacsDescObj.entrySet()) {
+                    Map<String, Object> subMap = new HashMap<>();
+                    subMap.put("type", TypeEnum.pacsDecs.getName());
+                    subMap.put("name", entry.getKey());
+                    retMap.put(index++, subMap);
+                }
+            }
+        }
+        return retMap;
+    }
 }

+ 129 - 1
cdssman-service/src/main/java/com/diagbot/facade/RuleTestFacade.java

@@ -1,5 +1,7 @@
 package com.diagbot.facade;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.client.CdssCoreClient;
 import com.diagbot.dto.BillMsg;
@@ -13,6 +15,7 @@ import com.diagbot.entity.PacsConfig;
 import com.diagbot.entity.ResultBill;
 import com.diagbot.entity.ResultCritical;
 import com.diagbot.entity.ResultHighriskDrug;
+import com.diagbot.entity.ResultHighriskOperation;
 import com.diagbot.entity.ResultInfo;
 import com.diagbot.entity.TransfusionConfig;
 import com.diagbot.entity.node.BillItem;
@@ -20,22 +23,27 @@ import com.diagbot.entity.node.LisCritical;
 import com.diagbot.entity.node.MedRegName;
 import com.diagbot.entity.node.PacsCritical;
 import com.diagbot.entity.node.TransfusionRemind;
+import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.enums.StatusEnum;
+import com.diagbot.enums.TypeEnum;
 import com.diagbot.repository.BillManRepository;
 import com.diagbot.repository.LisCriticalRepository;
 import com.diagbot.repository.MedRegNameRepository;
 import com.diagbot.repository.PacsCriticalRepository;
 import com.diagbot.repository.TransfusionRemindRepository;
+import com.diagbot.repository.YiBaoOperationNameRepository;
 import com.diagbot.service.ResultBillService;
 import com.diagbot.service.ResultCriticalService;
 import com.diagbot.service.ResultHighriskDrugService;
+import com.diagbot.service.ResultHighriskOperationService;
 import com.diagbot.service.ResultInfoService;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.ExcelUtils;
 import com.diagbot.util.FastJsonUtils;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RespDTOUtil;
+import com.diagbot.util.StringUtil;
 import com.diagbot.vo.BillRuleVO;
 import com.diagbot.vo.CriticalRuleVO;
 import com.diagbot.vo.HighriskRuleVO;
@@ -74,6 +82,10 @@ public class RuleTestFacade {
     @Autowired
     @Qualifier("resultHighriskDrugServiceImpl")
     private ResultHighriskDrugService resultHighriskDrugService;
+    @Autowired
+    @Qualifier("resultHighriskOperationServiceImpl")
+    private ResultHighriskOperationService resultHighriskOperationService;
+
 
     @Autowired
     private LisConfigFacade lisConfigFacade;
@@ -98,6 +110,8 @@ public class RuleTestFacade {
     private TransfusionRemindRepository transfusionRemindRepository;
     @Autowired
     private MedRegNameRepository medRegNameRepository;
+    @Autowired
+    private YiBaoOperationNameRepository yiBaoOperationNameRepository;
 
     @Autowired
     private UnUsedMappingFacade unUsedMappingFacade;
@@ -223,6 +237,23 @@ public class RuleTestFacade {
         return true;
     }
 
+    /**
+     * 高危手术测试
+     *
+     * @return
+     */
+    public Boolean highriskOperationRuleTest(HighriskRuleVO highriskRuleVO) {
+        Long hospitalId = highriskRuleVO.getHospitalId();
+        List<YiBaoOperationName> items = yiBaoOperationNameRepository.findByStatusAndOpgradeExists(1);
+        //生成测试规则
+        List<ResultHighriskOperation> resultList = ruleConvertFacade.highriskRuleConvert_operation(items, hospitalId);
+        //远程调用推理
+        List<ResultHighriskOperation> saveList = callHighRisk_operation(resultList, hospitalId);
+        //保存测试结果
+        saveResultHighrisk_operation(saveList, highriskRuleVO);
+        return true;
+    }
+
 
     /**
      * 数据导出
@@ -398,7 +429,7 @@ public class RuleTestFacade {
     }
 
     /**
-     * 危急值远程调用接口
+     * 高危药品远程调用接口
      *
      * @param list
      * @param hospitalId
@@ -451,6 +482,60 @@ public class RuleTestFacade {
         return retList;
     }
 
+    /**
+     * 高危手术远程调用接口
+     *
+     * @param list
+     * @param hospitalId
+     * @return
+     */
+    public List<ResultHighriskOperation> callHighRisk_operation(List<ResultHighriskOperation> list, Long hospitalId) {
+        List<ResultHighriskOperation> retList = Lists.newLinkedList();
+        if (ListUtil.isEmpty(list)) {
+            return retList;
+        }
+        for (ResultHighriskOperation result : list) {
+            if (result.getSuccess() != null
+                    && result.getSuccess().equals(0)) {
+                retList.add(result);
+                continue;
+            }
+            IndicationPushVO indicationPushVO = searchDataFacade.creatHighriskVO_operation(result);
+            indicationPushVO.setHospitalId(hospitalId);
+
+            result.setInputParams(FastJsonUtils.getBeanToJson(indicationPushVO));
+
+            RespDTO<IndicationDTO> respDTO = cdssCoreClient.indication(indicationPushVO);
+            if (RespDTOUtil.respIsOK(respDTO)) {
+                IndicationDTO data = respDTO.data;
+                List<BillMsg> billMsgList = data.getHighRiskList();
+                if (ListUtil.isEmpty(billMsgList)) {
+                    result.setSuccess(0);
+                    result.setMessage("未提示高危项");
+                    retList.add(result);
+                } else {
+                    for (BillMsg billMsg : billMsgList) {
+                        ResultHighriskOperation saveResult = new ResultHighriskOperation();
+                        BeanUtil.copyProperties(result, saveResult);
+                        saveResult.setOutput(billMsg.getMsg());
+                        if (saveResult.getOutput().equals(saveResult.getExpectedOutput())) {
+                            saveResult.setSuccess(1);
+                        } else {
+                            saveResult.setSuccess(0);
+                            saveResult.setMessage("提示内容与预期不符");
+                        }
+                        retList.add(saveResult);
+                    }
+                }
+            } else {
+                result.setSuccess(0);
+                result.setMessage("远程调用推理接口失败");
+                retList.add(result);
+            }
+        }
+        return retList;
+    }
+
     /**
      * 保存开单合理性测试结果
      *
@@ -581,4 +666,47 @@ public class RuleTestFacade {
         resultHighriskDrugService.saveOrUpdateBatch(list);
         return true;
     }
+
+    /**
+     * 保存高危药品测试结果
+     *
+     * @param list
+     * @param highriskRuleVO
+     * @return
+     */
+    public Boolean saveResultHighrisk_operation(List<ResultHighriskOperation> list, HighriskRuleVO highriskRuleVO) {
+        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", highriskRuleVO.getHospitalId())
+                .eq("case_id", highriskRuleVO.getCaseId());
+        ResultInfo resultInfo = resultInfoService.getOne(resultInfoQueryWrapper, false);
+        if (resultInfo == null) {
+            resultInfo = new ResultInfo();
+            resultInfo.setHospitalId(highriskRuleVO.getHospitalId());
+            resultInfo.setCaseId(highriskRuleVO.getCaseId());
+            resultInfo.setGmtCreate(now);
+        }
+        resultInfo.setGmtModified(now);
+        resultInfo.setRuleNum(totleNum);
+        resultInfo.setRuleSuccessNum(successNum);
+        resultInfo.setRuleFailedNum(failedNum);
+        resultInfoService.saveOrUpdate(resultInfo);
+
+        QueryWrapper<ResultHighriskOperation> resultHighriskOperationQueryWrapper = new QueryWrapper<>();
+        resultHighriskOperationQueryWrapper.eq("result_id", resultInfo.getId());
+        resultHighriskOperationService.remove(resultHighriskOperationQueryWrapper);
+
+        for (ResultHighriskOperation result : list) {
+            result.setGmtCreate(now);
+            result.setGmtModified(now);
+            result.setResultId(resultInfo.getId());
+        }
+
+        resultHighriskOperationService.saveOrUpdateBatch(list);
+        return true;
+    }
 }

+ 70 - 1
cdssman-service/src/main/java/com/diagbot/facade/SearchDataFacade.java

@@ -6,7 +6,9 @@ import com.diagbot.biz.push.entity.Pacs;
 import com.diagbot.entity.ResultBill;
 import com.diagbot.entity.ResultCritical;
 import com.diagbot.entity.ResultHighriskDrug;
+import com.diagbot.entity.ResultHighriskOperation;
 import com.diagbot.enums.GraphLabelEnum;
+import com.diagbot.enums.TypeEnum;
 import com.diagbot.util.StringUtil;
 import com.diagbot.vo.Drug;
 import com.diagbot.vo.IndicationPushVO;
@@ -213,7 +215,7 @@ public class SearchDataFacade {
     }
 
     /**
-     * 生成危急值入参
+     * 生成高危药品入参
      *
      * @param result
      * @return
@@ -232,4 +234,71 @@ public class SearchDataFacade {
 
         return indicationPushVO;
     }
+
+    /**
+     * 生成高危手术入参
+     *
+     * @param result
+     * @return
+     */
+    public IndicationPushVO creatHighriskVO_operation(ResultHighriskOperation result) {
+        IndicationPushVO indicationPushVO = new IndicationPushVO();
+        indicationPushVO.setSex(3);
+        indicationPushVO.setRuleType("3");
+        indicationPushVO.setAge("20");
+
+        Item item = new Item();
+        item.setName(result.getHighriskItemHisName());
+        item.setUniqueName(result.getHighriskItemName());
+        indicationPushVO.getOperationOrder().add(item);
+
+        if (result.getFactorItemType() != null) {
+
+            if (result.getFactorItemType().equals(TypeEnum.age.getName())) {
+                indicationPushVO.setAge(result.getInputValue());
+            } else if (result.getFactorItemType().equals(TypeEnum.vital.getName())) {
+                if (result.getFactorItemName().equals("体温")) {
+                    indicationPushVO.setVital(result.getFactorItemName() + result.getInputValue() + "℃,");
+                } else if (result.getFactorItemName().equals("收缩压")) {
+                    indicationPushVO.setVital("血压" + result.getInputValue() + "/80mmHg,");
+                } else if (result.getFactorItemName().equals("舒张压")) {
+                    indicationPushVO.setVital("血压120/" + result.getInputValue() + "mmHg,");
+                } else {
+                    indicationPushVO.setVital(result.getFactorItemName() + (StringUtil.isNotBlank(result.getInputValue()) ? result.getInputValue() : "") + ",");
+                }
+            } else if (result.getFactorItemType().equals(TypeEnum.disease.getName())) {
+                Item diag = new Item();
+                diag.setName(result.getFactorItemHisName());
+                diag.setUniqueName(result.getFactorItemName());
+                indicationPushVO.getDiag().add(diag);
+
+            } else if (result.getFactorItemType().equals(TypeEnum.lis.getName())) {
+                Lis lis = new Lis();
+                lis.setName(result.getFactorItemHisName());
+                lis.setDetailName(result.getFactorItemHisDetailName());
+                lis.setUniqueName(result.getFactorItemName());
+                lis.setUnits(result.getFactorItemUnit());
+                if (result.getFactorItemMinValue() != null || result.getFactorItemMaxValue() != null) {
+                    lis.setValue(Double.valueOf(result.getInputValue()));
+                } else {
+                    lis.setOtherValue(result.getInputValue());
+                }
+                if (result.getFactorItemMaxValue() != null) {
+                    lis.setMaxValue(result.getFactorItemMaxValue().doubleValue());
+                }
+                if (result.getFactorItemMinValue() != null) {
+                    lis.setMinValue(result.getFactorItemMinValue().doubleValue());
+                }
+                indicationPushVO.getLis().add(lis);
+            } else if (result.getFactorItemType().equals(TypeEnum.pacsDecs.getName())) {
+                Pacs pacs = new Pacs();
+                pacs.setName(result.getFactorItemHisName());
+                pacs.setUniqueName(result.getFactorItemName());
+                pacs.setResult(result.getInputValue());
+                indicationPushVO.getPacs().add(pacs);
+            }
+        }
+
+        return indicationPushVO;
+    }
 }

+ 16 - 0
cdssman-service/src/main/java/com/diagbot/mapper/ResultHighriskOperationMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.ResultHighriskOperation;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-15
+ */
+public interface ResultHighriskOperationMapper extends BaseMapper<ResultHighriskOperation> {
+
+}

+ 3 - 0
cdssman-service/src/main/java/com/diagbot/repository/YiBaoOperationNameRepository.java

@@ -19,6 +19,9 @@ public interface YiBaoOperationNameRepository extends Neo4jRepository<YiBaoOpera
 
     List<YiBaoOperationName> findByNameIn(List<String> names);
 
+    @Query("match(n:医保手术和操作名称) where exists(n.手术级别) and n.状态={status} return n,id(n)")
+    List<YiBaoOperationName> findByStatusAndOpgradeExists(@Param("status")Integer status);
+
     Page<YiBaoOperationName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
 
     @Query("MATCH (n:`医保手术和操作名称`) WHERE n.`静态知识标识` = $isKL \n" +

+ 16 - 0
cdssman-service/src/main/java/com/diagbot/service/ResultHighriskOperationService.java

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.ResultHighriskOperation;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-15
+ */
+public interface ResultHighriskOperationService extends IService<ResultHighriskOperation> {
+
+}

+ 20 - 0
cdssman-service/src/main/java/com/diagbot/service/impl/ResultHighriskOperationServiceImpl.java

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.ResultHighriskOperation;
+import com.diagbot.mapper.ResultHighriskOperationMapper;
+import com.diagbot.service.ResultHighriskOperationService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-15
+ */
+@Service
+public class ResultHighriskOperationServiceImpl extends ServiceImpl<ResultHighriskOperationMapper, ResultHighriskOperation> implements ResultHighriskOperationService {
+
+}

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

@@ -159,7 +159,7 @@ public class RuleTestController {
         if (highriskRuleVO.getHighriskType().equals(1)) {
             data = ruleTestFacade.highriskDrugRuleTest(highriskRuleVO);
         } else if (highriskRuleVO.getHighriskType().equals(2)) {
-
+            data = ruleTestFacade.highriskOperationRuleTest(highriskRuleVO);
         }
         return RespDTO.onSuc(data);
     }

+ 35 - 0
cdssman-service/src/main/resources/mapper/ResultHighriskOperationMapper.xml

@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.ResultHighriskOperationMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.ResultHighriskOperation">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="result_id" property="resultId" />
+        <result column="highrisk_item_name" property="highriskItemName" />
+        <result column="highrisk_item_his_name" property="highriskItemHisName" />
+        <result column="level" property="level" />
+        <result column="factor_item_name" property="factorItemName" />
+        <result column="factor_item_his_name" property="factorItemHisName" />
+        <result column="factor_item_his_detail_name" property="factorItemHisDetailName" />
+        <result column="factor_item_type" property="factorItemType" />
+        <result column="factor_item_range" property="factorItemRange" />
+        <result column="factor_item_min_value" property="factorItemMinValue" />
+        <result column="factor_item_max_value" property="factorItemMaxValue" />
+        <result column="input_value" property="inputValue" />
+        <result column="factor_item_unit" property="factorItemUnit" />
+        <result column="factor_item_exact_match" property="factorItemExactMatch" />
+        <result column="factor_item_cond" property="factorItemCond" />
+        <result column="output" property="output" />
+        <result column="expected_output" property="expectedOutput" />
+        <result column="success" property="success" />
+        <result column="message" property="message" />
+        <result column="input_params" property="inputParams" />
+    </resultMap>
+
+</mapper>