瀏覽代碼

添加规则待数据

zhoutg 4 年之前
父節點
當前提交
014fba8069

+ 6 - 45
src/main/java/com/diagbot/facade/BillFacade.java

@@ -3,13 +3,11 @@ 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.dto.BillMsg;
 import com.diagbot.dto.BillNeoDTO;
 import com.diagbot.dto.IndicationDTO;
-import com.diagbot.dto.NodeNeoDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.process.BillProcess;
-import com.diagbot.util.CoreUtil;
+import com.diagbot.rule.OtherRule;
 import com.diagbot.util.StringUtil;
 import com.diagbot.vo.BillNeoVO;
 import com.diagbot.vo.Drug;
@@ -18,10 +16,8 @@ import com.diagbot.vo.ItemExt;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 
 /**
  * @Description: 开单合理性facade
@@ -37,6 +33,8 @@ public class BillFacade {
     BillProcess billProcess;
     @Autowired
     CommonFacade commonFacade;
+    @Autowired
+    OtherRule otherRule;
 
     /**
      * 开单合理性业务
@@ -51,51 +49,14 @@ public class BillFacade {
         // 规则处理
         billProcess.process(billNeoDTOList, wordCrfDTO, res);
 
-        // 医院特殊规则处理
-        otherRule(wordCrfDTO, res);
+        // 特殊规则
+        // otherRule.ecgRule(wordCrfDTO, res);
+        otherRule.qjssxsRule(wordCrfDTO, res);
 
         // 结果去重处理
         commonFacade.dealMsg(res.getBillMsgList());
     }
 
-    /**
-     * 体征特殊值规则处理(图谱数据不好录入)
-     *
-     * @param wordCrfDTO
-     * @param res
-     */
-    public void otherRule(WordCrfDTO wordCrfDTO, IndicationDTO res) {
-        // 特殊值处理
-        List<String> drugNameList = CoreUtil.getPropertyList(wordCrfDTO.getDrugOrder(), "name");
-        String drugOrderName = "去甲肾上腺素";
-        if (drugNameList.contains(drugOrderName)) {
-            // 体征数值比较(例如:体温,血压)
-            NodeNeoDTO ssyNode = new NodeNeoDTO();
-            ssyNode.setName("收缩压");
-            // ssyNode.setMax(new BigDecimal(100));
-            ssyNode.setMin(new BigDecimal(140));
-            Map<String, Object> objectMap = CoreUtil.compareVital(ssyNode, wordCrfDTO.getVitalLabel());
-            if (CoreUtil.getMapFlag(objectMap)) {
-                BillMsg billMsg = new BillMsg();
-                billMsg.setOrderName(drugOrderName);
-                billMsg.setMsg(String.format("该患者%s,不宜开%s", objectMap.get("msg"), drugOrderName));
-                res.getBillMsgList().add(billMsg);
-            }
-
-            NodeNeoDTO szyNode = new NodeNeoDTO();
-            szyNode.setName("舒张压");
-            // szyNode.setMax(new BigDecimal(100));
-            szyNode.setMin(new BigDecimal(90));
-            objectMap = CoreUtil.compareVital(szyNode, wordCrfDTO.getVitalLabel());
-            if (CoreUtil.getMapFlag(objectMap)) {
-                BillMsg billMsg = new BillMsg();
-                billMsg.setOrderName(drugOrderName);
-                billMsg.setMsg(String.format("该患者%s,不宜开%s", objectMap.get("msg"), drugOrderName));
-                res.getBillMsgList().add(billMsg);
-            }
-        }
-    }
-
     public BillNeoVO fillBillNeo(WordCrfDTO wordCrfDTO) {
         BillNeoVO billNeoVO = new BillNeoVO();
 

+ 74 - 9
src/main/java/com/diagbot/rule/OtherRule.java

@@ -1,14 +1,20 @@
 package com.diagbot.rule;
 
 import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.IndicationDTO;
+import com.diagbot.dto.NodeNeoDTO;
 import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.util.CoreUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.StringUtil;
 import com.google.common.collect.Lists;
 import org.springframework.stereotype.Component;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @description: 特殊规则
@@ -19,25 +25,84 @@ import java.util.List;
 public class OtherRule {
 
     /**
-     * 70岁及以上开内镜检查时,需要做心电图检查
+     * 70岁及以上开内镜检查时,需要心电图检查
      *
      * @param wordCrfDTO
      * @param res
      */
-    public void otherRule(WordCrfDTO wordCrfDTO, IndicationDTO res) {
+    public void ecgRule(WordCrfDTO wordCrfDTO, IndicationDTO res) {
         if (wordCrfDTO.getAgeNum() != null && wordCrfDTO.getAgeNum() >= 70) {
-            List<Pacs> pacsOrder = wordCrfDTO.getPacsOrder();
-            if (ListUtil.isNotEmpty(pacsOrder)) {
-                List<String> orderNameList = Lists.newArrayList("胃镜"); // 内镜检查
-                List<String> ecgList = Lists.newArrayList("心电图"); // 心电图检查
-                for (Pacs pacs : pacsOrder) {
+            List<Pacs> pacsOrderList = wordCrfDTO.getPacsOrder();
+            if (ListUtil.isNotEmpty(pacsOrderList)) {
+                List<String> orderNameList = Lists.newArrayList("胃镜"); // 医院内镜检查列表
+                List<String> ecgList = Lists.newArrayList("心电图"); // 医院心电图检查列表
+                List<Pacs> pacsList = wordCrfDTO.getPacs();
+                for (Pacs pacs : pacsOrderList) {
                     String ordreName = pacs.getName();
                     if (StringUtil.isNotBlank(ordreName) && orderNameList.contains(ordreName)) {
-                        // TODO 检查时效内辅检
-
+                        boolean flag = true; // 时效内做过心电图检查标识,false:是,true:否
+                        for (Pacs pa : pacsList) {
+                            if (StringUtil.isNotBlank(pa.getName()) && ecgList.contains(pa.getName())) {
+                                Date ecgDate = StringUtil.parseDateTime(pa.getDateValue()); // 心电图检查时间
+                                Date orderDate = StringUtil.parseDateTime(pacs.getDateValue()); // 开单时间
+                                // 时间未传,数据无效
+                                if (ecgDate != null && orderDate != null) {
+                                    // 超过时效需要再次做心电图检查
+                                    if (!CoreUtil.compareTime(ecgDate, orderDate, 60L * 24, true)) {
+                                        flag = false;
+                                    }
+                                }
+                            }
+                        }
+                        if (flag) {
+                            BillMsg billMsg = new BillMsg();
+                            billMsg.setOrderName(ordreName);
+                            billMsg.setMsg(String.format("该患者%s,开%s时,建议先做心电图检查",
+                                    CoreUtil.subZeroAndDot(String.valueOf(wordCrfDTO.getAgeNum())), ordreName));
+                            res.getBillMsgList().add(billMsg);
+                        }
                     }
                 }
             }
         }
     }
+
+
+    /**
+     * 药品开单:【去甲肾上腺素】,收缩压大于140mmHg 或者舒张压大于90mmHg ,不宜开去甲肾上腺素
+     *
+     * @param wordCrfDTO
+     * @param res
+     */
+    public void qjssxsRule(WordCrfDTO wordCrfDTO, IndicationDTO res) {
+        // 特殊值处理
+        List<String> drugNameList = CoreUtil.getPropertyList(wordCrfDTO.getDrugOrder(), "name");
+        String drugOrderName = "去甲肾上腺素";
+        if (drugNameList.contains(drugOrderName)) {
+            // 体征数值比较(例如:体温,血压)
+            NodeNeoDTO ssyNode = new NodeNeoDTO();
+            ssyNode.setName("收缩压");
+            // ssyNode.setMax(new BigDecimal(100));
+            ssyNode.setMin(new BigDecimal(140));
+            Map<String, Object> objectMap = CoreUtil.compareVital(ssyNode, wordCrfDTO.getVitalLabel());
+            if (CoreUtil.getMapFlag(objectMap)) {
+                BillMsg billMsg = new BillMsg();
+                billMsg.setOrderName(drugOrderName);
+                billMsg.setMsg(String.format("该患者%s,不宜开%s", objectMap.get("msg"), drugOrderName));
+                res.getBillMsgList().add(billMsg);
+            }
+
+            NodeNeoDTO szyNode = new NodeNeoDTO();
+            szyNode.setName("舒张压");
+            // szyNode.setMax(new BigDecimal(100));
+            szyNode.setMin(new BigDecimal(90));
+            objectMap = CoreUtil.compareVital(szyNode, wordCrfDTO.getVitalLabel());
+            if (CoreUtil.getMapFlag(objectMap)) {
+                BillMsg billMsg = new BillMsg();
+                billMsg.setOrderName(drugOrderName);
+                billMsg.setMsg(String.format("该患者%s,不宜开%s", objectMap.get("msg"), drugOrderName));
+                res.getBillMsgList().add(billMsg);
+            }
+        }
+    }
 }

+ 29 - 0
src/main/java/com/diagbot/util/CoreUtil.java

@@ -19,6 +19,7 @@ import org.springframework.stereotype.Component;
 import java.lang.reflect.Field;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -1085,6 +1086,34 @@ public class CoreUtil {
         return map;
     }
 
+    /**
+     * 比较时间,以分钟为单位
+     * endDate比startDate多diff分钟则返回true
+     *
+     * @param startDate
+     * @param endDate
+     * @param diff
+     * @param hasEqual 是否包含“等号”
+     * @return
+     */
+    public static boolean compareTime(Date startDate, Date endDate, Long diff, boolean hasEqual) {
+        boolean overtime = false;
+        if (startDate == null || endDate == null) {
+            return false;
+        }
+        try {
+            Long start = startDate.getTime();
+            Long end = endDate.getTime();
+            if (hasEqual) {
+                return (end - start) >= diff * 1000 * 60;
+            } else {
+                return (end - start) > diff * 1000 * 60;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return overtime;
+    }
 
     public static void main(String[] args) {
         List<Item> list = new ArrayList<>();