Browse Source

医学规则测试

zhaops 4 years ago
parent
commit
b942156b12
24 changed files with 1267 additions and 94 deletions
  1. 11 0
      cdssman-service/src/main/java/com/diagbot/client/CdssCoreClient.java
  2. 14 0
      cdssman-service/src/main/java/com/diagbot/client/hystrix/CdssCoreHystrix.java
  3. 23 0
      cdssman-service/src/main/java/com/diagbot/dto/BillMsg.java
  4. 27 0
      cdssman-service/src/main/java/com/diagbot/dto/IndicationDTO.java
  5. 83 44
      cdssman-service/src/main/java/com/diagbot/entity/ResultBill.java
  6. 27 13
      cdssman-service/src/main/java/com/diagbot/entity/ResultCritical.java
  7. 9 8
      cdssman-service/src/main/java/com/diagbot/entity/ResultInfo.java
  8. 67 0
      cdssman-service/src/main/java/com/diagbot/enums/NeoEnum.java
  9. 69 0
      cdssman-service/src/main/java/com/diagbot/enums/TypeEnum.java
  10. 1 1
      cdssman-service/src/main/java/com/diagbot/facade/DrugConfigFacade.java
  11. 132 9
      cdssman-service/src/main/java/com/diagbot/facade/RuleConvertFacade.java
  12. 134 17
      cdssman-service/src/main/java/com/diagbot/facade/RuleTestFacade.java
  13. 135 0
      cdssman-service/src/main/java/com/diagbot/facade/SearchDataFacade.java
  14. 2 0
      cdssman-service/src/main/java/com/diagbot/repository/BillManRepository.java
  15. 1 1
      cdssman-service/src/main/java/com/diagbot/repository/MedicineRepository.java
  16. 254 0
      cdssman-service/src/main/java/com/diagbot/util/MsgUtil.java
  17. 17 0
      cdssman-service/src/main/java/com/diagbot/vo/Drug.java
  18. 19 0
      cdssman-service/src/main/java/com/diagbot/vo/HospitalBaseVO.java
  19. 30 0
      cdssman-service/src/main/java/com/diagbot/vo/IndicationPushVO.java
  20. 17 0
      cdssman-service/src/main/java/com/diagbot/vo/ItemExt.java
  21. 179 0
      cdssman-service/src/main/java/com/diagbot/vo/SearchData.java
  22. 12 0
      cdssman-service/src/main/java/com/diagbot/web/RuleTestController.java
  23. 2 0
      cdssman-service/src/main/resources/logback-spring.xml
  24. 2 1
      cdssman-service/src/main/resources/mapper/ResultBillMapper.xml

+ 11 - 0
cdssman-service/src/main/java/com/diagbot/client/CdssCoreClient.java

@@ -1,11 +1,13 @@
 package com.diagbot.client;
 
 import com.diagbot.client.hystrix.CdssCoreHystrix;
+import com.diagbot.dto.IndicationDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.RetrievalDTO;
 import com.diagbot.dto.StaticKnowledgeIndexDTO;
 import com.diagbot.vo.ConceptVO;
 import com.diagbot.vo.HasStaticKnowledgeVO;
+import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.RetrievalVO;
 import com.diagbot.vo.StaticKnowledgeIndexVO;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -57,4 +59,13 @@ public interface CdssCoreClient {
      */
     @PostMapping("/retrieval/index")
     RespDTO<RetrievalDTO> index(@RequestBody @Valid RetrievalVO retrievalVO);
+
+    /**
+     * 开单合理性推理
+     *
+     * @param indicationPushVO
+     * @return
+     */
+    @PostMapping("/core/indication")
+    RespDTO<IndicationDTO> indication(@Valid @RequestBody IndicationPushVO indicationPushVO);
 }

+ 14 - 0
cdssman-service/src/main/java/com/diagbot/client/hystrix/CdssCoreHystrix.java

@@ -1,11 +1,13 @@
 package com.diagbot.client.hystrix;
 
 import com.diagbot.client.CdssCoreClient;
+import com.diagbot.dto.IndicationDTO;
 import com.diagbot.dto.RespDTO;
 import com.diagbot.dto.RetrievalDTO;
 import com.diagbot.dto.StaticKnowledgeIndexDTO;
 import com.diagbot.vo.ConceptVO;
 import com.diagbot.vo.HasStaticKnowledgeVO;
+import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.RetrievalVO;
 import com.diagbot.vo.StaticKnowledgeIndexVO;
 import lombok.extern.slf4j.Slf4j;
@@ -70,4 +72,16 @@ public class CdssCoreHystrix implements CdssCoreClient {
         log.error("【hystrix】调用{}异常", "index");
         return null;
     }
+
+    /**
+     * 开单合理性推理
+     *
+     * @param indicationPushVO
+     * @return
+     */
+    @Override
+    public RespDTO<IndicationDTO> indication(@Valid @RequestBody IndicationPushVO indicationPushVO) {
+        log.error("【hystrix】调用{}异常", "indication");
+        return null;
+    }
 }

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

@@ -0,0 +1,23 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+/**
+ * @description: 开单合理性提示语
+ * @author: zhoutg
+ * @time: 2020/7/29 9:57
+ */
+@Data
+public class BillMsg {
+
+    // 提示信息
+    private String msg;
+    // 开单名称
+    private String orderName;
+    // 开单标准名称
+    private String orderStandName;
+    // 匹配的内容
+    private String content;
+    // 类型
+    private String type;
+}

+ 27 - 0
cdssman-service/src/main/java/com/diagbot/dto/IndicationDTO.java

@@ -0,0 +1,27 @@
+package com.diagbot.dto;
+
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @description: 提示信息出参
+ * @author: zhoutg
+ * @time: 2020/7/29 9:57
+ */
+@Data
+public class IndicationDTO {
+    // 危机值提醒
+    private List<BillMsg> criticalValList = new ArrayList<>();
+    // 开单合理性提示信息
+    private List<BillMsg> billMsgList = new ArrayList<>();
+    // 高危药品、手术
+    private List<BillMsg> highRiskList = new ArrayList<>();
+    // 其他提醒
+    private List<BillMsg> otherList = new ArrayList<>();
+    // 记录调试信息
+    private Map<String, Object> debug = new LinkedHashMap<>();
+}

+ 83 - 44
cdssman-service/src/main/java/com/diagbot/entity/ResultBill.java

@@ -1,11 +1,12 @@
 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.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableName;
+
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -13,7 +14,7 @@ import java.io.Serializable;
  * </p>
  *
  * @author zhaops
- * @since 2021-01-08
+ * @since 2021-01-11
  */
 @TableName("test_result_bill")
 public class ResultBill implements Serializable {
@@ -34,12 +35,12 @@ public class ResultBill implements Serializable {
     /**
      * 记录创建时间
      */
-    private LocalDateTime gmtCreate;
+    private Date gmtCreate;
 
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 创建人,0表示无创建人值
@@ -121,10 +122,15 @@ public class ResultBill implements Serializable {
      */
     private BigDecimal minValue;
 
+    /**
+     * 单位
+     */
+    private String unit;
+
     /**
      * 范围(0:范围内,1:范围外)
      */
-    private Integer range;
+    private Integer conflictItemRange;
 
     /**
      * 输出结果(提醒文本)
@@ -139,7 +145,7 @@ public class ResultBill implements Serializable {
     /**
      * 成功标志(1:成功,0:失败)
      */
-    private String success;
+    private Integer success;
 
     /**
      * 提示信息(异常提醒)
@@ -153,6 +159,7 @@ public class ResultBill implements Serializable {
     public void setId(Long id) {
         this.id = id;
     }
+
     public String getIsDeleted() {
         return isDeleted;
     }
@@ -160,20 +167,23 @@ public class ResultBill implements Serializable {
     public void setIsDeleted(String isDeleted) {
         this.isDeleted = isDeleted;
     }
-    public LocalDateTime getGmtCreate() {
+
+    public Date getGmtCreate() {
         return gmtCreate;
     }
 
-    public void setGmtCreate(LocalDateTime gmtCreate) {
+    public void setGmtCreate(Date gmtCreate) {
         this.gmtCreate = gmtCreate;
     }
-    public LocalDateTime getGmtModified() {
+
+    public Date getGmtModified() {
         return gmtModified;
     }
 
-    public void setGmtModified(LocalDateTime gmtModified) {
+    public void setGmtModified(Date gmtModified) {
         this.gmtModified = gmtModified;
     }
+
     public String getCreator() {
         return creator;
     }
@@ -181,6 +191,7 @@ public class ResultBill implements Serializable {
     public void setCreator(String creator) {
         this.creator = creator;
     }
+
     public String getModifier() {
         return modifier;
     }
@@ -188,6 +199,7 @@ public class ResultBill implements Serializable {
     public void setModifier(String modifier) {
         this.modifier = modifier;
     }
+
     public Long getResultId() {
         return resultId;
     }
@@ -195,6 +207,7 @@ public class ResultBill implements Serializable {
     public void setResultId(Long resultId) {
         this.resultId = resultId;
     }
+
     public Integer getBillType() {
         return billType;
     }
@@ -202,6 +215,7 @@ public class ResultBill implements Serializable {
     public void setBillType(Integer billType) {
         this.billType = billType;
     }
+
     public String getBillItemType() {
         return billItemType;
     }
@@ -209,6 +223,7 @@ public class ResultBill implements Serializable {
     public void setBillItemType(String billItemType) {
         this.billItemType = billItemType;
     }
+
     public String getBillItemName() {
         return billItemName;
     }
@@ -216,6 +231,7 @@ public class ResultBill implements Serializable {
     public void setBillItemName(String billItemName) {
         this.billItemName = billItemName;
     }
+
     public String getBillItemHisName() {
         return billItemHisName;
     }
@@ -223,6 +239,7 @@ public class ResultBill implements Serializable {
     public void setBillItemHisName(String billItemHisName) {
         this.billItemHisName = billItemHisName;
     }
+
     public String getBillItemHisDetailName() {
         return billItemHisDetailName;
     }
@@ -230,6 +247,7 @@ public class ResultBill implements Serializable {
     public void setBillItemHisDetailName(String billItemHisDetailName) {
         this.billItemHisDetailName = billItemHisDetailName;
     }
+
     public String getConflictItemType() {
         return conflictItemType;
     }
@@ -237,6 +255,7 @@ public class ResultBill implements Serializable {
     public void setConflictItemType(String conflictItemType) {
         this.conflictItemType = conflictItemType;
     }
+
     public String getConflictItemName() {
         return conflictItemName;
     }
@@ -244,6 +263,7 @@ public class ResultBill implements Serializable {
     public void setConflictItemName(String conflictItemName) {
         this.conflictItemName = conflictItemName;
     }
+
     public String getConflictItemHisName() {
         return conflictItemHisName;
     }
@@ -251,6 +271,7 @@ public class ResultBill implements Serializable {
     public void setConflictItemHisName(String conflictItemHisName) {
         this.conflictItemHisName = conflictItemHisName;
     }
+
     public String getConflictItemHisDetailName() {
         return conflictItemHisDetailName;
     }
@@ -258,6 +279,7 @@ public class ResultBill implements Serializable {
     public void setConflictItemHisDetailName(String conflictItemHisDetailName) {
         this.conflictItemHisDetailName = conflictItemHisDetailName;
     }
+
     public String getInputValue() {
         return inputValue;
     }
@@ -265,6 +287,7 @@ public class ResultBill implements Serializable {
     public void setInputValue(String inputValue) {
         this.inputValue = inputValue;
     }
+
     public String getReferenceValue() {
         return referenceValue;
     }
@@ -272,6 +295,7 @@ public class ResultBill implements Serializable {
     public void setReferenceValue(String referenceValue) {
         this.referenceValue = referenceValue;
     }
+
     public BigDecimal getMaxValue() {
         return maxValue;
     }
@@ -279,6 +303,7 @@ public class ResultBill implements Serializable {
     public void setMaxValue(BigDecimal maxValue) {
         this.maxValue = maxValue;
     }
+
     public BigDecimal getMinValue() {
         return minValue;
     }
@@ -286,13 +311,23 @@ public class ResultBill implements Serializable {
     public void setMinValue(BigDecimal minValue) {
         this.minValue = minValue;
     }
-    public Integer getRange() {
-        return range;
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+
+    public Integer getConflictItemRange() {
+        return conflictItemRange;
     }
 
-    public void setRange(Integer range) {
-        this.range = range;
+    public void setConflictItemRange(Integer conflictItemRange) {
+        this.conflictItemRange = conflictItemRange;
     }
+
     public String getOutput() {
         return output;
     }
@@ -300,6 +335,7 @@ public class ResultBill implements Serializable {
     public void setOutput(String output) {
         this.output = output;
     }
+
     public String getExpectedOutput() {
         return expectedOutput;
     }
@@ -307,13 +343,15 @@ public class ResultBill implements Serializable {
     public void setExpectedOutput(String expectedOutput) {
         this.expectedOutput = expectedOutput;
     }
-    public String getSuccess() {
+
+    public Integer getSuccess() {
         return success;
     }
 
-    public void setSuccess(String success) {
+    public void setSuccess(Integer success) {
         this.success = success;
     }
+
     public String getMessage() {
         return message;
     }
@@ -325,31 +363,32 @@ public class ResultBill implements Serializable {
     @Override
     public String toString() {
         return "ResultBill{" +
-            "id=" + id +
-            ", isDeleted=" + isDeleted +
-            ", gmtCreate=" + gmtCreate +
-            ", gmtModified=" + gmtModified +
-            ", creator=" + creator +
-            ", modifier=" + modifier +
-            ", resultId=" + resultId +
-            ", billType=" + billType +
-            ", billItemType=" + billItemType +
-            ", billItemName=" + billItemName +
-            ", billItemHisName=" + billItemHisName +
-            ", billItemHisDetailName=" + billItemHisDetailName +
-            ", conflictItemType=" + conflictItemType +
-            ", conflictItemName=" + conflictItemName +
-            ", conflictItemHisName=" + conflictItemHisName +
-            ", conflictItemHisDetailName=" + conflictItemHisDetailName +
-            ", inputValue=" + inputValue +
-            ", referenceValue=" + referenceValue +
-            ", maxValue=" + maxValue +
-            ", minValue=" + minValue +
-            ", range=" + range +
-            ", output=" + output +
-            ", expectedOutput=" + expectedOutput +
-            ", success=" + success +
-            ", message=" + message +
-        "}";
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", resultId=" + resultId +
+                ", billType=" + billType +
+                ", billItemType=" + billItemType +
+                ", billItemName=" + billItemName +
+                ", billItemHisName=" + billItemHisName +
+                ", billItemHisDetailName=" + billItemHisDetailName +
+                ", conflictItemType=" + conflictItemType +
+                ", conflictItemName=" + conflictItemName +
+                ", conflictItemHisName=" + conflictItemHisName +
+                ", conflictItemHisDetailName=" + conflictItemHisDetailName +
+                ", inputValue=" + inputValue +
+                ", referenceValue=" + referenceValue +
+                ", maxValue=" + maxValue +
+                ", minValue=" + minValue +
+                ", unit=" + unit +
+                ", conflictItemRange=" + conflictItemRange +
+                ", output=" + output +
+                ", expectedOutput=" + expectedOutput +
+                ", success=" + success +
+                ", message=" + message +
+                "}";
     }
 }

+ 27 - 13
cdssman-service/src/main/java/com/diagbot/entity/ResultCritical.java

@@ -1,11 +1,12 @@
 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.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableName;
+
 import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
 
 /**
  * <p>
@@ -13,7 +14,7 @@ import java.io.Serializable;
  * </p>
  *
  * @author zhaops
- * @since 2021-01-08
+ * @since 2021-01-11
  */
 @TableName("test_result_critical")
 public class ResultCritical implements Serializable {
@@ -34,12 +35,12 @@ public class ResultCritical implements Serializable {
     /**
      * 记录创建时间
      */
-    private LocalDateTime gmtCreate;
+    private Date gmtCreate;
 
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 创建人,0表示无创建人值
@@ -96,6 +97,11 @@ public class ResultCritical implements Serializable {
      */
     private BigDecimal maxValue;
 
+    /**
+     * 单位
+     */
+    private String unit;
+
     /**
      * 范围(0:范围内,1:范围外)
      */
@@ -114,7 +120,7 @@ public class ResultCritical implements Serializable {
     /**
      * 成功标志(1:成功,0:失败)
      */
-    private String success;
+    private Integer success;
 
     /**
      * 提示信息(异常提醒)
@@ -135,18 +141,18 @@ public class ResultCritical implements Serializable {
     public void setIsDeleted(String isDeleted) {
         this.isDeleted = isDeleted;
     }
-    public LocalDateTime getGmtCreate() {
+    public Date getGmtCreate() {
         return gmtCreate;
     }
 
-    public void setGmtCreate(LocalDateTime gmtCreate) {
+    public void setGmtCreate(Date gmtCreate) {
         this.gmtCreate = gmtCreate;
     }
-    public LocalDateTime getGmtModified() {
+    public Date getGmtModified() {
         return gmtModified;
     }
 
-    public void setGmtModified(LocalDateTime gmtModified) {
+    public void setGmtModified(Date gmtModified) {
         this.gmtModified = gmtModified;
     }
     public String getCreator() {
@@ -226,6 +232,13 @@ public class ResultCritical implements Serializable {
     public void setMaxValue(BigDecimal maxValue) {
         this.maxValue = maxValue;
     }
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
     public Integer getRange() {
         return range;
     }
@@ -247,11 +260,11 @@ public class ResultCritical implements Serializable {
     public void setExpectedOutput(String expectedOutput) {
         this.expectedOutput = expectedOutput;
     }
-    public String getSuccess() {
+    public Integer getSuccess() {
         return success;
     }
 
-    public void setSuccess(String success) {
+    public void setSuccess(Integer success) {
         this.success = success;
     }
     public String getMessage() {
@@ -280,6 +293,7 @@ public class ResultCritical implements Serializable {
             ", referenceValue=" + referenceValue +
             ", minValue=" + minValue +
             ", maxValue=" + maxValue +
+            ", unit=" + unit +
             ", range=" + range +
             ", output=" + output +
             ", expectedOutput=" + expectedOutput +

+ 9 - 8
cdssman-service/src/main/java/com/diagbot/entity/ResultInfo.java

@@ -1,10 +1,11 @@
 package com.diagbot.entity;
 
-import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableName;
+
 import java.io.Serializable;
+import java.util.Date;
 
 /**
  * <p>
@@ -33,12 +34,12 @@ public class ResultInfo implements Serializable {
     /**
      * 记录创建时间
      */
-    private LocalDateTime gmtCreate;
+    private Date gmtCreate;
 
     /**
      * 记录修改时间,如果时间是1970年则表示纪录未修改
      */
-    private LocalDateTime gmtModified;
+    private Date gmtModified;
 
     /**
      * 创建人,0表示无创建人值
@@ -89,18 +90,18 @@ public class ResultInfo implements Serializable {
     public void setIsDeleted(String isDeleted) {
         this.isDeleted = isDeleted;
     }
-    public LocalDateTime getGmtCreate() {
+    public Date getGmtCreate() {
         return gmtCreate;
     }
 
-    public void setGmtCreate(LocalDateTime gmtCreate) {
+    public void setGmtCreate(Date gmtCreate) {
         this.gmtCreate = gmtCreate;
     }
-    public LocalDateTime getGmtModified() {
+    public Date getGmtModified() {
         return gmtModified;
     }
 
-    public void setGmtModified(LocalDateTime gmtModified) {
+    public void setGmtModified(Date gmtModified) {
         this.gmtModified = gmtModified;
     }
     public String getCreator() {

+ 67 - 0
cdssman-service/src/main/java/com/diagbot/enums/NeoEnum.java

@@ -0,0 +1,67 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author zhoutg
+ * @Description: 图谱禁忌类型
+ * @date 2018年10月11日 下午3:33:22
+ */
+
+public enum NeoEnum implements KeyedNamed {
+
+    gender(1, "禁忌性别"),
+    ageNeoDTO(2, "禁忌年龄"),
+    clinicfindings(3, "禁忌临床表现"),
+    oralmeds(4, "禁忌服用药品"),
+    allergicmeds(5, "禁忌过敏药品"),
+    operations(6, "禁忌手术"),
+    procedures(7, "禁忌操作"),
+    lis(8, "禁忌实验室检查"),
+    pacs(9, "禁忌辅助检查"),
+    disease(10, "禁忌疾病"),
+    group(11, "禁忌人群"),
+    conflictmeds(12, "配伍禁忌"),
+    vitals(13, "禁忌查体"),
+    pacsDesc(14, "禁忌辅助检查描述"),
+    medEqu(15, "禁忌医疗器械及物品"),
+    exclusion(16, "开单项互斥");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    NeoEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static NeoEnum getEnum(int key) {
+        for (NeoEnum item : NeoEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        NeoEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+
+}

+ 69 - 0
cdssman-service/src/main/java/com/diagbot/enums/TypeEnum.java

@@ -0,0 +1,69 @@
+package com.diagbot.enums;
+
+import com.diagbot.core.KeyedNamed;
+import lombok.Setter;
+
+/**
+ * @author zhoutg
+ * @Description: 类型枚举
+ * @date 2018年10月11日 下午3:33:22
+ */
+
+public enum TypeEnum implements KeyedNamed {
+
+    lis(1, "化验"),
+    pacs(2, "辅检"),
+    disease(3, "诊断"),
+    drug(4, "药品"),
+    clinical(5, "临床表现"),
+    operation(6, "手术"),
+    vital(7, "查体"),
+    transfusion(8, "输血"),
+    age(9,"年龄");
+
+    @Setter
+    private int key;
+
+    @Setter
+    private String name;
+
+    TypeEnum(int key, String name) {
+        this.key = key;
+        this.name = name;
+    }
+
+    public static TypeEnum getEnum(int key) {
+        for (TypeEnum item : TypeEnum.values()) {
+            if (item.key == key) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static TypeEnum getEnum(String value) {
+        for (TypeEnum item : TypeEnum.values()) {
+            if (item.getName().equals(value)) {
+                return item;
+            }
+        }
+        return null;
+    }
+
+    public static String getName(int key) {
+        TypeEnum item = getEnum(key);
+        return item != null ? item.name : null;
+    }
+
+    @Override
+    public int getKey() {
+        return key;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+
+}

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

@@ -488,7 +488,7 @@ public class DrugConfigFacade {
             }
         });
 
-        Map<String, List<DrugConfig>> uniqueNameMap = EntityUtil.makeEntityListMap(records, "uniqeuName");
+        Map<String, List<DrugConfig>> uniqueNameMap = EntityUtil.makeEntityListMap(records, "uniqueName");
         for (Map.Entry<String, List<DrugConfig>> entry : uniqueNameMap.entrySet()) {
             if (ListUtil.isNotEmpty(entry.getValue())) {
                 Map<String, Map<String, List<Long>>> subMap = new HashMap<>();

+ 132 - 9
cdssman-service/src/main/java/com/diagbot/facade/RuleConvertFacade.java

@@ -1,15 +1,18 @@
 package com.diagbot.facade;
 
+import com.diagbot.dto.BillMsg;
 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.enums.GraphLabelEnum;
 import com.diagbot.enums.StatusEnum;
+import com.diagbot.enums.TypeEnum;
 import com.diagbot.repository.MedicineRepository;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.MsgUtil;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
@@ -45,9 +48,10 @@ public class RuleConvertFacade {
 
     public List<ResultBill> billRuleConvert(List<BillItem> billItems, Long hospitalId) {
         List<ResultBill> retList = Lists.newLinkedList();
+        List<ResultBill> resultBillList = Lists.newLinkedList();
 
         if (ListUtil.isEmpty(billItems)) {
-            return retList;
+            return resultBillList;
         }
 
         List<MedNameRegName> medNameRegNameList = medicineRepository.findCustomByNameAndRegName(StatusEnum.Enable.getKey());
@@ -66,7 +70,9 @@ public class RuleConvertFacade {
         Map<String, Map<String, List<Long>>> transfusionConfigMap = transfusionConfigFacade.getUniqueConfigMap(hospitalId, null, null);
 
 
+        int count=1;
         for (BillItem billItem : billItems) {
+            System.out.println(count++ +",id:"+billItem.getConceptId()+"name:"+billItem.getConceptName()+",type:"+billItem.getConceptLabel());
             List<MappingShortEntity> billMappingList = Lists.newArrayList();
             List<MappingShortEntity> conflictMappingList = Lists.newArrayList();
 
@@ -156,21 +162,26 @@ public class RuleConvertFacade {
             resultBill.setBillItemName(billItem.getConceptName());
             resultBill.setConflictItemType(billItem.getConditionLabel());
             resultBill.setConflictItemName(billItem.getConditionName());
-            resultBill.setMaxValue(BigDecimal.valueOf(billItem.getConditionMaxValue()));
-            resultBill.setMinValue(BigDecimal.valueOf(billItem.getConditionMinValue()));
-            resultBill.setRange(billItem.getConditionRange());
+            if (billItem.getConditionMaxValue() != null) {
+                resultBill.setMaxValue(BigDecimal.valueOf(billItem.getConditionMaxValue()));
+            }
+            if (billItem.getConditionMinValue() != null) {
+                resultBill.setMinValue(BigDecimal.valueOf(billItem.getConditionMinValue()));
+            }
+            resultBill.setConflictItemRange(billItem.getConditionRange());
+            resultBill.setUnit(billItem.getConditionUnit());
             if (ListUtil.isEmpty(billMappingList)) {
                 if (ListUtil.isEmpty(conflictMappingList)) {
                     ResultBill addResultBill = new ResultBill();
                     BeanUtil.copyProperties(resultBill, addResultBill);
-                    retList.add(addResultBill);
+                    resultBillList.add(addResultBill);
                 } else {
                     conflictMappingList.forEach(conflictItem -> {
                         ResultBill addResultBill = new ResultBill();
                         BeanUtil.copyProperties(resultBill, addResultBill);
                         addResultBill.setConflictItemHisName(conflictItem.getHisName());
                         addResultBill.setConflictItemHisDetailName(conflictItem.getHisDetailName());
-                        retList.add(addResultBill);
+                        resultBillList.add(addResultBill);
                     });
                 }
             } else {
@@ -180,7 +191,7 @@ public class RuleConvertFacade {
                         BeanUtil.copyProperties(resultBill, addResultBill);
                         addResultBill.setBillItemHisName(billMappingItem.getHisName());
                         addResultBill.setBillItemHisDetailName(billMappingItem.getHisDetailName());
-                        retList.add(addResultBill);
+                        resultBillList.add(addResultBill);
                     });
                 } else {
                     billMappingList.forEach(billMappingItem -> {
@@ -193,12 +204,66 @@ public class RuleConvertFacade {
                             BeanUtil.copyProperties(addResultBill, addExtResultBill);
                             addExtResultBill.setConflictItemHisName(conflictItem.getHisName());
                             addExtResultBill.setConflictItemHisDetailName(conflictItem.getHisDetailName());
-                            retList.add(addExtResultBill);
+                            resultBillList.add(addExtResultBill);
                         });
                     });
                 }
             }
         }
+
+        //模拟输入值
+        for (ResultBill result : resultBillList) {
+            String orderType = getOrderType(result.getBillItemType());
+            if (result.getMaxValue() != null || result.getMinValue() != null) {
+                if (result.getConflictItemRange() == null) {
+                    result.setConflictItemRange(0);
+                }
+                if (result.getConflictItemRange().equals(1)) {
+                    if (result.getMinValue() != null) {
+                        ResultBill minResult = new ResultBill();
+                        BeanUtil.copyProperties(result, minResult);
+                        minResult.setInputValue(random(null, result.getMinValue()).toString());
+                        BillMsg billMsg = MsgUtil.getCommonBillMsg(minResult.getBillItemHisName(),
+                                minResult.getBillItemName(),
+                                minResult.getInputValue(),
+                                "禁忌" + minResult.getConflictItemType(),
+                                orderType);
+                        minResult.setExpectedOutput(billMsg.getMsg());
+                        retList.add(minResult);
+                    }
+                    if (result.getMaxValue() != null) {
+                        ResultBill maxResult = new ResultBill();
+                        BeanUtil.copyProperties(result, maxResult);
+                        maxResult.setInputValue(random(result.getMaxValue(), null).toString());
+                        BillMsg billMsg = MsgUtil.getCommonBillMsg(maxResult.getBillItemHisName(),
+                                maxResult.getBillItemName(),
+                                maxResult.getInputValue(),
+                                "禁忌" + maxResult.getConflictItemType(),
+                                orderType);
+                        maxResult.setExpectedOutput(billMsg.getMsg());
+                        retList.add(maxResult);
+                    }
+                } else {
+                    result.setInputValue(random(result.getMinValue(), result.getMaxValue()).toString());
+                    BillMsg billMsg = MsgUtil.getCommonBillMsg(result.getBillItemHisName(),
+                            result.getBillItemName(),
+                            result.getInputValue(),
+                            "禁忌" + result.getConflictItemType(),
+                            orderType);
+                    result.setExpectedOutput(billMsg.getMsg());
+                    retList.add(result);
+                }
+            } else {
+                //result.setInputValue(result.getConflictItemName());
+                BillMsg billMsg = MsgUtil.getCommonBillMsg(result.getBillItemHisName(),
+                        result.getBillItemName(),
+                        result.getConflictItemName(),
+                        "禁忌" + result.getConflictItemType(),
+                        orderType);
+                result.setExpectedOutput(billMsg.getMsg());
+                retList.add(result);
+            }
+        }
         return retList;
     }
 
@@ -209,4 +274,62 @@ public class RuleConvertFacade {
         item.setHisDetailName(hisDetailName);
         return item;
     }
-}
+
+    /**
+     * 生成随机数
+     *
+     * @param min
+     * @param max
+     * @return
+     */
+    public BigDecimal random(BigDecimal min, BigDecimal max) {
+        if (min == null) {
+            min = BigDecimal.ZERO;
+        }
+        if (max == null) {
+            max = min.add(BigDecimal.TEN);
+        }
+        BigDecimal randomVal = new BigDecimal(Math.random() * (max.doubleValue() - min.doubleValue()) + min.doubleValue());
+        return randomVal.setScale(2, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 开单类型转换
+     * @param type
+     * @return
+     */
+    public String getOrderType(String type){
+        String orderType="";
+        if(type.equals(GraphLabelEnum.LisSet.getName())){
+            orderType=TypeEnum.lis.getName();
+        }
+        if(type.equals(GraphLabelEnum.PacsName)
+                ||type.equals(GraphLabelEnum.PacsSubName)){
+            orderType=TypeEnum.pacs.getName();
+        }
+        if(type.equals(GraphLabelEnum.YiBaoDiseaseName.getName())){
+            orderType=TypeEnum.disease.getName();
+        }
+        if(type.equals(GraphLabelEnum.MedRegName.getName())
+                ||type.equals(GraphLabelEnum.Medicine.getName())){
+            orderType=TypeEnum.drug.getName();
+        }
+        if(type.equals(GraphLabelEnum.ClinicalFinding.getName())){
+            orderType=TypeEnum.clinical.getName();
+        }
+        if(type.equals(GraphLabelEnum.YiBaoOperationName.getName())){
+            orderType=TypeEnum.operation.getName();
+        }
+        if(type.equals(GraphLabelEnum.Vital.getName())){
+            orderType=TypeEnum.vital.getName();
+        }
+        if(type.equals(GraphLabelEnum.TransfusionRemind.getName())
+                ||type.equals(GraphLabelEnum.TransfusionSuggest.getName())){
+            orderType=TypeEnum.transfusion.getName();
+        }
+        if(type.equals(GraphLabelEnum.Age.getName())){
+            orderType=TypeEnum.age.getName();
+        }
+        return orderType;
+    }
+}

+ 134 - 17
cdssman-service/src/main/java/com/diagbot/facade/RuleTestFacade.java

@@ -1,32 +1,48 @@
 package com.diagbot.facade;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.client.CdssCoreClient;
+import com.diagbot.dto.BillMsg;
+import com.diagbot.dto.IndicationDTO;
+import com.diagbot.dto.RespDTO;
 import com.diagbot.entity.DiseaseConfig;
 import com.diagbot.entity.DrugConfig;
 import com.diagbot.entity.LisConfig;
 import com.diagbot.entity.OperationConfig;
 import com.diagbot.entity.PacsConfig;
 import com.diagbot.entity.ResultBill;
+import com.diagbot.entity.ResultInfo;
 import com.diagbot.entity.TransfusionConfig;
 import com.diagbot.entity.node.BillItem;
 import com.diagbot.entity.node.LisCritical;
 import com.diagbot.entity.node.PacsCritical;
 import com.diagbot.entity.node.TransfusionRemind;
+import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.enums.StatusEnum;
 import com.diagbot.repository.BillManRepository;
 import com.diagbot.repository.LisCriticalRepository;
 import com.diagbot.repository.PacsCriticalRepository;
 import com.diagbot.repository.TransfusionRemindRepository;
+import com.diagbot.service.ResultBillService;
+import com.diagbot.service.ResultInfoService;
 import com.diagbot.util.ExcelUtils;
+import com.diagbot.util.ListUtil;
+import com.diagbot.util.RespDTOUtil;
 import com.diagbot.vo.HospitalIdVO;
+import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.RuleTestVO;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
 import org.springframework.stereotype.Component;
 
 import javax.servlet.http.HttpServletResponse;
+import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 /**
  * @Description:
@@ -35,6 +51,13 @@ import java.util.Map;
  */
 @Component
 public class RuleTestFacade {
+    @Autowired
+    private CdssCoreClient cdssCoreClient;
+    @Autowired
+    private ResultBillService resultBillService;
+    @Autowired
+    private ResultInfoService resultInfoService;
+
     @Autowired
     private LisConfigFacade lisConfigFacade;
     @Autowired
@@ -62,36 +85,130 @@ public class RuleTestFacade {
     @Autowired
     private RuleConvertFacade ruleConvertFacade;
 
-
-    public void ruleTest(RuleTestVO ruleTestVO) {
-        Long hospitalId = ruleTestVO.getHospitalId();
+    @Autowired
+    private SearchDataFacade searchDataFacade;
 
 
+    /**
+     * 全规则测试
+     *
+     * @param ruleTestVO
+     */
+    public void ruleTest(RuleTestVO ruleTestVO) {
         //开单合理性规则-通用
-        List<BillItem> billRules = billManRepository.getAllRules();
+        billRuleTest(ruleTestVO);
         //开单合理性规则-输血
-        List<TransfusionRemind> billRules_transfusion = transfusionRemindRepository.findByStatus(StatusEnum.Enable.getKey());
-
+        billTransfusionRuleTest(ruleTestVO);
         //危急值规则-检验
-        List<LisCritical> criticalRules_lis = lisCriticalRepository.findCustomByStatus(StatusEnum.Enable.getKey());
         //危急值规则-检查
-        List<PacsCritical> criticalRules_pacs = pacsCriticalRepository.findByStatus(StatusEnum.Enable.getKey());
-
         //高危药品
         //高危手术
+    }
 
+    /**
+     * 开单合理性测试
+     *
+     * @param ruleTestVO
+     */
+    public void billRuleTest(RuleTestVO ruleTestVO) {
+        Long hospitalId = ruleTestVO.getHospitalId();
+
+        List<BillItem> billRules = billManRepository.getAllRules();
         //生成测试规则
-        //TODO
-        /*            private String inputValue;
-            private String referenceValue;
-            private String output;
-            private String expectedOutput;
-            private String success;
-            private String message;*/
-        List<ResultBill> resultBillList = ruleConvertFacade.billRuleConvert(billRules, hospitalId);
+        List<ResultBill> resultList = ruleConvertFacade.billRuleConvert(billRules, hospitalId);
+        if (ListUtil.isEmpty(resultList)) {
+            return;
+        }
+
+        for (ResultBill resultBill : resultList) {
+            IndicationPushVO indicationPushVO = searchDataFacade.creatBillVO(resultBill);
+            indicationPushVO.setHospitalId(hospitalId);
+            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("未提示开单项");
+                } else {
+                    /*private String referenceValue;*/
+                    resultBill.setOutput(billMsgList.get(0).getMsg());
+                    if (resultBill.getOutput().equals(resultBill.getExpectedOutput())) {
+                        resultBill.setSuccess(1);
+                    } else {
+                        resultBill.setSuccess(0);
+                    }
+                }
+            } else {
+                resultBill.setSuccess(0);
+                resultBill.setMessage("远程调用推理接口失败");
+            }
+        }
+
+        Integer totleNum = resultList.size();
+        Integer successNum = resultList.stream().filter(i -> i.getSuccess().equals(1)).collect(Collectors.toList()).size();
+        Integer failedNum = resultList.stream().filter(i -> i.getSuccess().equals(0)).collect(Collectors.toList()).size();
+
+
+        //保存测试结果
+        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 : resultList) {
+            resultBill.setResultId(resultInfo.getId());
+        }
+
+        resultBillService.saveOrUpdateBatch(resultList);
+    }
+
+    /**
+     * 开单合理性测试-输血
+     *
+     * @param ruleTestVO
+     */
+    public void billTransfusionRuleTest(RuleTestVO ruleTestVO) {
+        Long hospitalId = ruleTestVO.getHospitalId();
+        List<TransfusionRemind> billRules_transfusion = transfusionRemindRepository.findByStatus(StatusEnum.Enable.getKey());
         List<ResultBill> resultBillList_transfusion = Lists.newArrayList();
     }
 
+    /**
+     * 危急值规则测试-检验
+     *
+     * @param ruleTestVO
+     */
+    public void criticalLisRuleTest(RuleTestVO ruleTestVO) {
+        List<LisCritical> criticalRules_lis = lisCriticalRepository.findCustomByStatus(StatusEnum.Enable.getKey());
+    }
+
+    /**
+     * 危急值规则测试-检查
+     *
+     * @param ruleTestVO
+     */
+    public void criticalPacsRuleTest(RuleTestVO ruleTestVO) {
+        List<PacsCritical> criticalRules_pacs = pacsCriticalRepository.findByStatus(StatusEnum.Enable.getKey());
+    }
+
     /**
      * 数据导出
      *

+ 135 - 0
cdssman-service/src/main/java/com/diagbot/facade/SearchDataFacade.java

@@ -0,0 +1,135 @@
+package com.diagbot.facade;
+
+import com.diagbot.biz.push.entity.Item;
+import com.diagbot.biz.push.entity.Lis;
+import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.entity.ResultBill;
+import com.diagbot.enums.GraphLabelEnum;
+import com.diagbot.util.StringUtil;
+import com.diagbot.vo.Drug;
+import com.diagbot.vo.IndicationPushVO;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/1/11 11:37
+ */
+@Component
+public class SearchDataFacade {
+
+    public IndicationPushVO creatBillVO(ResultBill resultBill) {
+        IndicationPushVO indicationPushVO = new IndicationPushVO();
+        indicationPushVO.setAge("20");
+        indicationPushVO.setSex(3);
+        indicationPushVO.setRuleType("1");
+
+        //开单项
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.LisSet.getName())) {
+            //检验开单项
+            Lis lis = new Lis();
+            lis.setName(resultBill.getBillItemHisName());
+            lis.setDetailName(resultBill.getBillItemHisDetailName());
+            lis.setUniqueName(resultBill.getBillItemName());
+            indicationPushVO.getLisOrder().add(lis);
+        }
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.PacsName.getName())
+                || resultBill.getBillItemType().equals(GraphLabelEnum.PacsSubName.getName())) {
+            Pacs pacs = new Pacs();
+            pacs.setName(resultBill.getBillItemHisName());
+            pacs.setUniqueName(resultBill.getBillItemName());
+            indicationPushVO.getPacsOrder().add(pacs);
+        }
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.YiBaoOperationName.getName())) {
+            Item operation = new Item();
+            operation.setName(resultBill.getBillItemHisName());
+            operation.setUniqueName(resultBill.getBillItemName());
+            indicationPushVO.getOperationOrder().add(operation);
+        }
+        if (resultBill.getBillItemType().equals(GraphLabelEnum.MedRegName.getName())) {
+            Drug drug = new Drug();
+            drug.setName(resultBill.getBillItemHisName());
+            drug.setUniqueName(resultBill.getBillItemName());
+            indicationPushVO.getDrugOrder().add(drug);
+        }
+
+        //未使用禁忌条件:食物过敏原、手术、给药途径
+        if (resultBill.getConflictItemType().equals(GraphLabelEnum.Gender.getName())) {
+            if (resultBill.getConflictItemName().equals("男")) {
+                indicationPushVO.setSex(1);
+            } else if (resultBill.getConflictItemName().equals("女")) {
+                indicationPushVO.setSex(2);
+            } else {
+                indicationPushVO.setSex(3);
+            }
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Vital.getName())) {
+            //禁忌年龄特殊处理
+            if (resultBill.getConflictItemName().equals("年龄")) {
+                indicationPushVO.setAge(resultBill.getInputValue());
+            } else {
+                indicationPushVO.setVital(resultBill.getConflictItemName() + resultBill.getInputValue() + ",");
+            }
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.ClinicalFinding.getName())) {
+            indicationPushVO.setSymptom(indicationPushVO.getSymptom() +
+                    resultBill.getInputValue() + ",");
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.OralMedicine.getName())) {
+            indicationPushVO.setSymptom(indicationPushVO.getSymptom() +
+                    "一直服用" +
+                    (StringUtil.isNotBlank(resultBill.getConflictItemHisName())
+                            ? resultBill.getConflictItemHisName()
+                            : resultBill.getConflictItemName()) +
+                    ",");
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.MedAllergen.getName())
+                || resultBill.getConflictItemType().equals(GraphLabelEnum.Allergen.getName())) {
+            indicationPushVO.setPasts(indicationPushVO.getPasts() +
+                    "对" +
+                    (StringUtil.isNotBlank(resultBill.getConflictItemHisName())
+                            ? resultBill.getConflictItemHisName()
+                            : resultBill.getConflictItemName()) +
+                    "过敏,");
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.PacsDescribe.getName())) {
+            Pacs pacs = new Pacs();
+            pacs.setName("胸部CT");
+            pacs.setUniqueName("胸部CT");
+            pacs.setDesc(resultBill.getConflictItemName());
+            pacs.setResult(resultBill.getConflictItemName());
+            indicationPushVO.getPacs().add(pacs);
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Lis.getName())) {
+            Lis lis = new Lis();
+            lis.setName(resultBill.getConflictItemHisName());
+            lis.setDetailName(resultBill.getConflictItemHisDetailName());
+            lis.setUniqueName(resultBill.getConflictItemName());
+            lis.setUnits(resultBill.getUnit());
+            if (resultBill.getMinValue() != null || resultBill.getMaxValue() != null) {
+                lis.setValue(Double.valueOf(resultBill.getInputValue()));
+            } else {
+                lis.setOtherValue(resultBill.getInputValue());
+            }
+            if (resultBill.getMaxValue() != null) {
+                lis.setMaxValue(resultBill.getMaxValue().doubleValue());
+            }
+            if (resultBill.getMinValue() != null) {
+                lis.setMinValue(resultBill.getMinValue().doubleValue());
+            }
+            indicationPushVO.getLis().add(lis);
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Disease.getName())) {
+            Item diag = new Item();
+            diag.setName(resultBill.getConflictItemHisName());
+            diag.setUniqueName(resultBill.getConflictItemName());
+            indicationPushVO.getDiag().add(diag);
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.Group.getName())) {
+            indicationPushVO.setSymptom(indicationPushVO.getSymptom() +
+                    resultBill.getConflictItemName() + resultBill.getInputValue() + resultBill.getUnit() + ",");
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.ConflictDevice.getName())) {
+            indicationPushVO.setPasts(indicationPushVO.getPasts() +
+                    "有" + resultBill.getConflictItemName() + ",");
+        } else if (resultBill.getConflictItemType().equals(GraphLabelEnum.BillConflictItem.getName())) {
+            Pacs pacs = new Pacs();
+            pacs.setName(resultBill.getConflictItemHisName());
+            pacs.setUniqueName(resultBill.getConflictItemName());
+            indicationPushVO.getPacsOrder().add(pacs);
+        }
+
+        return indicationPushVO;
+    }
+}

+ 2 - 0
cdssman-service/src/main/java/com/diagbot/repository/BillManRepository.java

@@ -92,6 +92,8 @@ public interface BillManRepository extends Neo4jRepository<BillItemDetail,Long>
             "and r.状态 = 1 \n" +
             "and m.状态=1 \n" +
             "and n.状态=1 \n" +
+            "and n.name<> '' \n" +
+            "and m.name<> '' \n" +
             "return " +
             "id(m) as conceptId,m.name as conceptName,labels(m)[0] as conceptLabel,m.状态 as conceptStatus,\n" +
             "r.规则类型 as ruleType,\n" +

+ 1 - 1
cdssman-service/src/main/java/com/diagbot/repository/MedicineRepository.java

@@ -23,7 +23,7 @@ public interface MedicineRepository extends Neo4jRepository<Medicine, Long> {
 
     @Query("match (n:药品通用名称)<-[r1:药品相关药品通用名称]-(m:药品代码通用名)-[r2:药品相关药品注册名称]->(o:药品注册名称) \n" +
             "where n.状态={status} and o.状态={status}\n" +
-            "return distinct n.name as medName,o.name as regMedName")
+            "return distinct n.name as medName,o.name as medRegName")
     List<MedNameRegName> findCustomByNameAndRegName(@Param("status")Integer status);
 
     @Query("match (n:药品通用名称)<-[r1:药品相关药品通用名称]-(m:药品代码通用名)-[r2:药品相关药品注册名称]->(o:药品注册名称) where n.name={name} return distinct o.name")

+ 254 - 0
cdssman-service/src/main/java/com/diagbot/util/MsgUtil.java

@@ -0,0 +1,254 @@
+package com.diagbot.util;
+import com.diagbot.dto.BillMsg;
+import com.diagbot.enums.NeoEnum;
+import com.diagbot.enums.TypeEnum;
+
+/**
+ * @description: 提示语工具类
+ * @author: zhoutg
+ * @time: 2020/9/14 11:16
+ */
+public class MsgUtil {
+
+    /**
+     * 高危药品、手术通用提示信息
+     *
+     * @param name
+     * @param highLevel
+     * @param type
+     * @return
+     */
+    public static BillMsg getCommonHighRiskMsg(String name, String highLevel, String type) {
+        BillMsg billMsg = new BillMsg();
+        if (TypeEnum.operation.getName().equals(type)) {
+            billMsg.setMsg(name + "为高风险手术,请留意");
+        } else if (TypeEnum.drug.getName().equals(type)) {
+            billMsg.setMsg(name + "为" + highLevel + "药品,请留意");
+        }
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 危急值通用提示信息
+     *
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getCommonCriticalMsg(String content, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("该患者%s,请留意", content);
+        if (TypeEnum.pacs.getName().equals(type)) {
+            msg = String.format("该患者检查结果%s,请留意", content);
+        }
+        billMsg.setMsg(msg);
+        billMsg.setType(type);
+        billMsg.setContent(content);
+        return billMsg;
+    }
+
+    // /**
+    //  * 开单合理性通用提示信息
+    //  *
+    //  * @param orderName 原开单项
+    //  * @param orderStandName 标准开单项
+    //  * @param content 匹配内容
+    //  * @param type 类型
+    //  * @return
+    //  */
+    // public static BillMsg getCommonBillMsg(String orderName, String orderStandName, String content, String type) {
+    //     BillMsg billMsg = new BillMsg();
+    //     String msg = String.format("该患者%s,不宜开%s", content, orderName);
+    //     billMsg.setMsg(msg);
+    //     billMsg.setOrderName(orderName);
+    //     billMsg.setOrderStandName(orderStandName);
+    //     billMsg.setContent(content);
+    //     billMsg.setType(type);
+    //     return billMsg;
+    // }
+
+    /**
+     * 开单合理性通用提示信息
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @param type 开单项类型
+     * @return
+     */
+    public static BillMsg getCommonBillMsg(String orderName, String orderStandName, String content, String type, String orderType) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("该患者%s,不宜开%s", content, orderName);
+        // 输血提示语是另一种写法
+        if (TypeEnum.transfusion.getName().equals(orderType)) {
+            msg = String.format("该患者%s,谨慎输注%s", content, orderName);
+        }
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(orderName);
+        billMsg.setOrderStandName(orderStandName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 开单合理性——互斥提示信息
+     *
+     * @param complexOrderName 多个开单项
+     * @param orderName 原开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getBillExclusionMsg(String orderName, String content, String complexOrderName, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("检查项目互斥:%s与%s不宜同时进行", orderName, content);
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(complexOrderName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 复杂情况高危手术提示
+     *
+     * @param content
+     * @param name
+     * @param type
+     * @return
+     */
+    public static BillMsg getComplexOperationMsg(String name, String content, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("该患者%s,%s为高风险手术,请留意", name, content);
+        billMsg.setMsg(msg);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 其他提醒——化验
+     *
+     * @param content
+     * @param name
+     * @param type
+     * @return
+     */
+    public static BillMsg getCommonOtherTipLisMsg(String content, String name, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = "";
+        if (TypeEnum.disease.getName().equals(type)) {
+            msg = String.format("该患者%s,患有%s,请留意", content, name);
+        } else if (TypeEnum.drug.getName().equals(type)) {
+            msg = String.format("该患者%s,已开%s,请留意", content, name);
+        } else if (NeoEnum.group.getName().equals(type)) {
+            msg = String.format("该患者%s,%s,请留意", content, name);
+        }
+        billMsg.setMsg(msg);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 其他提醒——辅检
+     *
+     * @param content
+     * @return
+     */
+    public static BillMsg getCommonOtherTipPacsMsg(String content) {
+        BillMsg billMsg = new BillMsg();
+        billMsg.setMsg(content);
+        billMsg.setContent(content);
+        return billMsg;
+    }
+
+    /**
+     * 其他提醒——输血
+     *
+     * @param content
+     * @param name
+     * @return
+     */
+    public static BillMsg getCommonOtherTipTransfusionMsg(String content, String name) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("该患者%s,建议输注%s", content, name);
+        billMsg.setMsg(msg);
+        billMsg.setContent(content);
+        return billMsg;
+    }
+
+    /**
+     * 开单合理性24小时重复开通用提示信息
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getBillMsg24Repeat(String orderName, String orderStandName, String content, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("%s重复开立", orderName);
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(orderName);
+        billMsg.setOrderStandName(orderStandName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 开单合理性禁忌医疗器械及物品提示信息
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getBillMedEquMsg(String orderName, String orderStandName, String content, String type, String orderType) {
+        BillMsg billMsg = new BillMsg();
+        if (content.startsWith("具有")) {
+            content = content.replaceFirst("具有", ""); // 将“具有”替换成空
+        }
+        String msg = String.format("该患者具有%s,不宜开%s", content, orderName);
+        // 输血提示语是另一种写法
+        if (TypeEnum.transfusion.getName().equals(orderType)) {
+            msg = String.format("该患者具有%s,谨慎输注%s", content, orderName);
+        }
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(orderName);
+        billMsg.setOrderStandName(orderStandName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+    /**
+     * 开单合理性手术提示信息
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getCommonSurgeryMsg(String orderName, String orderStandName, String content, String type, String orderType) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("该患者有%s史,不宜开%s", content, orderName);
+        // 输血提示语是另一种写法
+        if (TypeEnum.transfusion.getName().equals(orderType)) {
+            msg = String.format("该患者有%s史,谨慎输注%s", content, orderName);
+        }
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(orderName);
+        billMsg.setOrderStandName(orderStandName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+}

+ 17 - 0
cdssman-service/src/main/java/com/diagbot/vo/Drug.java

@@ -0,0 +1,17 @@
+package com.diagbot.vo;
+
+import com.diagbot.biz.push.entity.Item;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/9/7 20:09
+ */
+@Getter
+@Setter
+public class Drug extends Item {
+    // 剂型
+    private String form;
+}

+ 19 - 0
cdssman-service/src/main/java/com/diagbot/vo/HospitalBaseVO.java

@@ -0,0 +1,19 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/7/29 18:37
+ */
+@Getter
+@Setter
+public class HospitalBaseVO {
+    // 医院ID
+    @NotNull(message = "请输入医院id")
+    private Long hospitalId;
+}

+ 30 - 0
cdssman-service/src/main/java/com/diagbot/vo/IndicationPushVO.java

@@ -0,0 +1,30 @@
+package com.diagbot.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotBlank;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @Description:病情提示入参
+ * @Author:zhaops
+ * @time: 2020/7/29 15:35
+ */
+@Getter
+@Setter
+public class IndicationPushVO extends SearchData {
+    /**
+     * 规则类型(1:危急值提醒,2:开单合理项,3:高危药品、手术,4:其他提醒)
+     */
+    @NotBlank(message = "ruleType不能为空")
+    private String ruleType = "";
+
+    List<String> ruleTypeList = new ArrayList<>();
+    // 文件的行号,测试文件数据用
+    private String idNum;
+
+    private String msg;
+
+}

+ 17 - 0
cdssman-service/src/main/java/com/diagbot/vo/ItemExt.java

@@ -0,0 +1,17 @@
+package com.diagbot.vo;
+
+import com.diagbot.biz.push.entity.Item;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2020/8/27 19:09
+ */
+@Getter
+@Setter
+public class ItemExt extends Item {
+    // 备注内容
+    private String remark;
+}

+ 179 - 0
cdssman-service/src/main/java/com/diagbot/vo/SearchData.java

@@ -0,0 +1,179 @@
+package com.diagbot.vo;
+
+import com.diagbot.biz.push.entity.Item;
+import com.diagbot.biz.push.entity.Lis;
+import com.diagbot.biz.push.entity.Pacs;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/7/29 15:31
+ */
+@Getter
+@Setter
+public class SearchData extends HospitalBaseVO {
+    /**
+     * 大数据返回内容截取长度
+     */
+    private Integer length = 10;
+    /**
+     * 年龄文本数据
+     */
+    private String age;
+    /**
+     * 年龄数字数据
+     */
+    @ApiModelProperty(hidden = true)
+    private Double ageNum;
+    /**
+     * 性别(1:男,2:女,3:通用)
+     */
+    private Integer sex;
+    /**
+     * 婚姻
+     */
+    private String marriage = "";
+    /**
+     * 主诉
+     */
+    private String chief = "";
+    /**
+     * 现病史
+     */
+    private String symptom = "";
+    /**
+     * 查体
+     */
+    private String vital = "";
+    /**
+     * 既往史
+     */
+    private String pasts = "";
+    /**
+     * 传染病史
+     */
+    private String infectious = "";
+    /**
+     * 手术外伤史
+     */
+    private String surgical = "";
+    /**
+     * 过敏史
+     */
+    private String allergy = "";
+    /**
+     * 接种史
+     */
+    private String vaccination = "";
+    /**
+     * 个人史
+     */
+    private String personal = "";
+    /**
+     * 婚育史
+     */
+    private String marital = "";
+    /**
+     * 家族史
+     */
+    private String family = "";
+    /**
+     * 月经史
+     */
+    private String menstrual = "";
+    /**
+     * 其他史
+     */
+    private String other = "";
+    /**
+     * 化验文本数据
+     */
+    private String lisString = "";
+    /**
+     * 辅检文本数据
+     */
+    private String pacsString = "";
+    /**
+     * 诊断文本数据
+     */
+    private String diagString = "";
+    /**
+     * 药品文本数据
+     */
+    private String drugString = "";
+    /**
+     * 科室
+     */
+    private List<Item> dept = new ArrayList<>();
+    /**
+     * 化验项目和结果
+     */
+    private List<Lis> lis = new ArrayList<>();
+    /**
+     * 辅检项目和结果
+     */
+    private List<Pacs> pacs = new ArrayList<>();
+    /**
+     * 诊断
+     */
+    private List<Item> diag = new ArrayList<>();
+    /**
+     * 药品
+     */
+    private List<Drug> drug = new ArrayList<>();
+    /**
+     * 手术及操作
+     */
+    private List<Item> operation = new ArrayList<>();
+    /**
+     * 输血记录
+     */
+    private List<ItemExt> transfusion = new ArrayList<>();
+    /**
+     * 当前化验开单项
+     */
+    private List<Lis> lisOrder = new ArrayList<>();
+    /**
+     * 当前辅检开单项
+     */
+    private List<Pacs> pacsOrder = new ArrayList<>();
+    /**
+     * 当前诊断开单项
+     */
+    private List<Item> diagOrder = new ArrayList<>();
+    /**
+     * 当前药品开单项
+     */
+    private List<Drug> drugOrder = new ArrayList<>();
+    /**
+     * 当前手术开单项
+     */
+    private List<Item> operationOrder = new ArrayList<>();
+    /**
+     * 当前输血开单项
+     */
+    private List<ItemExt> transfusionOrder = new ArrayList<>();
+    /**
+     * 其他开单项
+     */
+    private List<Item> otherOrder = new ArrayList<>();
+    /**
+     * 选中诊断
+     */
+    private Item diseaseName;
+    /**
+     * 选中手术
+     */
+    private Item operationName;
+    /**
+     * 其他指标
+     */
+    private Map<String, String> otherIndex;
+}

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

@@ -3,9 +3,11 @@ package com.diagbot.web;
 import com.diagbot.annotation.SysLogger;
 import com.diagbot.facade.RuleTestFacade;
 import com.diagbot.vo.HospitalIdVO;
+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;
@@ -39,4 +41,14 @@ public class RuleTestController {
     public void exportExcel(HttpServletResponse response, @RequestBody @Valid HospitalIdVO hospitalIdVO) {
         ruleTestFacade.exportExcel(response, hospitalIdVO);
     }
+
+    @ApiOperation(value = "开单合理性规则测试[zhaops]",
+            notes = "hospitalId: 医院Id <br>" +
+                    "caseId: 测试类型<br>")
+    @PostMapping("/billRuleTest")
+    @SysLogger("billRuleTest")
+    @Transactional
+    public void billRuleTest(@Valid @RequestBody RuleTestVO ruleTestVO) {
+        ruleTestFacade.billRuleTest(ruleTestVO);
+    }
 }

+ 2 - 0
cdssman-service/src/main/resources/logback-spring.xml

@@ -204,6 +204,8 @@
     <!-- FrameworkServlet日志-->
     <logger name="org.springframework" level="WARN"/>
 
+    <logger name="org.neo4j.ogm" level="DEBUG" />
+
     <!-- mybatis日志打印-->
     <logger name="org.apache.ibatis" level="DEBUG"/>
     <logger name="java.sql" level="DEBUG"/>

+ 2 - 1
cdssman-service/src/main/resources/mapper/ResultBillMapper.xml

@@ -24,7 +24,8 @@
         <result column="reference_value" property="referenceValue" />
         <result column="max_value" property="maxValue" />
         <result column="min_value" property="minValue" />
-        <result column="range" property="range" />
+        <result column="unit" property="unit" />
+        <result column="conflict_item_range" property="conflictItemRange" />
         <result column="output" property="output" />
         <result column="expected_output" property="expectedOutput" />
         <result column="success" property="success" />