Просмотр исходного кода

Merge branch 'master' into his/zjHospital

liuqq 4 лет назад
Родитель
Сommit
6fd0127268
46 измененных файлов с 608 добавлено и 208 удалено
  1. 4 0
      src/main/java/com/diagbot/aggregate/IndicationTestAggregate.java
  2. 2 0
      src/main/java/com/diagbot/dto/BillMsg.java
  3. 5 0
      src/main/java/com/diagbot/dto/BillNeoMaxDTO.java
  4. 3 0
      src/main/java/com/diagbot/dto/NodeNeoDTO.java
  5. 3 0
      src/main/java/com/diagbot/dto/PacsBillNeoDTO.java
  6. 4 0
      src/main/java/com/diagbot/dto/StaticKnowledgeIndexDTO.java
  7. 8 30
      src/main/java/com/diagbot/entity/GraphDiseaseCorresponding.java
  8. 6 3
      src/main/java/com/diagbot/entity/node/LisSet.java
  9. 20 0
      src/main/java/com/diagbot/entity/node/NeedlessOrder.java
  10. 3 0
      src/main/java/com/diagbot/entity/node/PacsName.java
  11. 3 1
      src/main/java/com/diagbot/entity/node/PacsSubName.java
  12. 1 1
      src/main/java/com/diagbot/entity/node/YiBaoDiseaseName.java
  13. 1 1
      src/main/java/com/diagbot/entity/node/YiBaoICD_10Code.java
  14. 26 0
      src/main/java/com/diagbot/entity/relationship/LisSetOralMedicine.java
  15. 21 0
      src/main/java/com/diagbot/entity/relationship/PacsNameNeedlessItem.java
  16. 21 0
      src/main/java/com/diagbot/entity/relationship/PacsNameSubNeedlessItem.java
  17. 1 1
      src/main/java/com/diagbot/entity/relationship/YiBaoDiseaseNameYiBaoICD_10Code.java
  18. 2 1
      src/main/java/com/diagbot/enums/DiseaseTypeEnum.java
  19. 20 14
      src/main/java/com/diagbot/facade/NeoFacade.java
  20. 4 0
      src/main/java/com/diagbot/facade/PushFacade.java
  21. 12 0
      src/main/java/com/diagbot/facade/RetrievalFacade.java
  22. 46 2
      src/main/java/com/diagbot/facade/TestFacade.java
  23. 27 0
      src/main/java/com/diagbot/process/BillProcess.java
  24. 2 2
      src/main/java/com/diagbot/process/OtherTipProcess.java
  25. 71 62
      src/main/java/com/diagbot/process/PushProcess.java
  26. 15 0
      src/main/java/com/diagbot/repository/LisSetNode.java
  27. 1 0
      src/main/java/com/diagbot/repository/MedicineNode.java
  28. 1 1
      src/main/java/com/diagbot/repository/MedicineRepository.java
  29. 2 0
      src/main/java/com/diagbot/repository/NodeInfo.java
  30. 14 31
      src/main/java/com/diagbot/repository/PacsNameNode.java
  31. 13 23
      src/main/java/com/diagbot/repository/PacsSubNameNode.java
  32. 22 10
      src/main/java/com/diagbot/repository/TransfusionSuggestNode.java
  33. 14 0
      src/main/java/com/diagbot/repository/YiBaoDiseaseNameRepository.java
  34. 117 1
      src/main/java/com/diagbot/rule/CommonRule.java
  35. 18 8
      src/main/java/com/diagbot/rule/DrugRule.java
  36. 49 3
      src/main/java/com/diagbot/util/MsgUtil.java
  37. 2 2
      src/main/java/com/diagbot/util/NeoUtil.java
  38. 4 0
      src/main/java/com/diagbot/vo/TestIndicationVO.java
  39. 8 0
      src/main/java/com/diagbot/web/TestController.java
  40. 2 2
      src/main/resources/application-dev.yml
  41. 2 2
      src/main/resources/application-local.yml
  42. 2 2
      src/main/resources/application-pre.yml
  43. 2 2
      src/main/resources/application-pro.yml
  44. 2 2
      src/main/resources/application-test.yml
  45. 1 1
      src/main/resources/logback-spring.xml
  46. 1 0
      src/main/resources/mapper/GraphDiseaseCorrespondingMapper.xml

+ 4 - 0
src/main/java/com/diagbot/aggregate/IndicationTestAggregate.java

@@ -77,6 +77,10 @@ public class IndicationTestAggregate {
         Map<String, Object> otherTransfusionMap = testFacade.testOtherTipTransfusion(file, new TestLineVO());
         map.put("【其他值提醒_输血】",otherTransfusionMap);
 
+        file = testFacade.getMulFileByPath(mapPath.get("【检查结果与项目重复开立规则】"));
+        Map<String, Object> pacsOrderNeedlessMap = testFacade.testPacsOrderNeedlessProcess(file, new TestLineVO());
+        map.put("【检查结果与项目重复开立规则】",pacsOrderNeedlessMap);
+
         return map;
     }
 

+ 2 - 0
src/main/java/com/diagbot/dto/BillMsg.java

@@ -14,6 +14,8 @@ public class BillMsg {
     private String msg;
     // 开单名称
     private String orderName;
+    // 明细名称
+    private String orderDetailName;
     // 开单标准名称
     private String orderStandName;
     // 匹配的内容

+ 5 - 0
src/main/java/com/diagbot/dto/BillNeoMaxDTO.java

@@ -22,6 +22,9 @@ public class BillNeoMaxDTO {
 
     // 类型
     private String type;
+
+    // 日期
+    private String dateValue;
     /****************扩展数据结束******************/
 
     // 禁忌性别
@@ -69,4 +72,6 @@ public class BillNeoMaxDTO {
     // 互斥开单辅助检查
     private List<NodeNeoDTO> pacsOrder = new ArrayList<>();
 
+    // 无需重复辅检开单项
+    private List<NodeNeoDTO> needlessPacsOrder = new ArrayList<>();
 }

+ 3 - 0
src/main/java/com/diagbot/dto/NodeNeoDTO.java

@@ -23,6 +23,9 @@ public class NodeNeoDTO {
     // 名称
     private String name;
 
+    // 正则规则
+    private String regex;
+
     // 类型
     private String termtype;
 

+ 3 - 0
src/main/java/com/diagbot/dto/PacsBillNeoDTO.java

@@ -54,4 +54,7 @@ public class PacsBillNeoDTO {
     // 禁用辅助检查描述
     private List<NodeNeoDTO> pacsDesc = new ArrayList<>();
 
+    // 无需重复辅检开单项
+    private List<NodeNeoDTO> needlessPacsOrder = new ArrayList<>();
+
 }

+ 4 - 0
src/main/java/com/diagbot/dto/StaticKnowledgeIndexDTO.java

@@ -15,6 +15,10 @@ public class StaticKnowledgeIndexDTO {
      * 术语名称
      */
     private String name;
+    /**
+     * 编码
+     */
+    private String code;
     /**
      * 词性
      */

+ 8 - 30
src/main/java/com/diagbot/entity/GraphDiseaseCorresponding.java

@@ -2,6 +2,8 @@ package com.diagbot.entity;
 
 import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+
 import java.io.Serializable;
 
 /**
@@ -12,6 +14,7 @@ import java.io.Serializable;
  * @author zhoutg
  * @since 2020-11-13
  */
+@Data
 public class GraphDiseaseCorresponding implements Serializable {
 
     private static final long serialVersionUID = 1L;
@@ -29,34 +32,9 @@ public class GraphDiseaseCorresponding implements Serializable {
      */
     private String diagIcd;
 
-    public Integer getId() {
-        return id;
-    }
-
-    public void setId(Integer id) {
-        this.id = id;
-    }
-    public String getDiagPingan() {
-        return diagPingan;
-    }
-
-    public void setDiagPingan(String diagPingan) {
-        this.diagPingan = diagPingan;
-    }
-    public String getDiagIcd() {
-        return diagIcd;
-    }
-
-    public void setDiagIcd(String diagIcd) {
-        this.diagIcd = diagIcd;
-    }
-
-    @Override
-    public String toString() {
-        return "GraphDiseaseCorresponding{" +
-            "id=" + id +
-            ", diagPingan=" + diagPingan +
-            ", diagIcd=" + diagIcd +
-        "}";
-    }
+    /**
+     * 警惕标志
+     */
+    private Integer highRiskSign;
+
 }

+ 6 - 3
src/main/java/com/diagbot/entity/node/LisSet.java

@@ -4,19 +4,20 @@ import com.diagbot.entity.node.base.BaseNode;
 import com.diagbot.entity.relationship.LisNameLisSet;
 import com.diagbot.entity.relationship.LisSetGender;
 import com.diagbot.entity.relationship.LisSetGroup;
+import com.diagbot.entity.relationship.LisSetOralMedicine;
 import lombok.Getter;
 import lombok.Setter;
 import org.neo4j.ogm.annotation.NodeEntity;
 import org.neo4j.ogm.annotation.Property;
 import org.neo4j.ogm.annotation.Relationship;
 
-import java.util.Set;
 import java.util.HashSet;
+import java.util.Set;
 
 @Setter
 @Getter
 @NodeEntity(label = "实验室检查套餐名")
-public class LisSet extends BaseNode  {
+public class LisSet extends BaseNode {
 
 	@Property(name = "单位")
 	private String unit;
@@ -36,7 +37,9 @@ public class LisSet extends BaseNode  {
 	@Relationship(type = "实验室检查套餐名禁忌禁忌人群", direction = Relationship.OUTGOING)
 	private Set<LisSetGroup> lisSetGroups = new HashSet<>();
 
+	@Relationship(type = "实验室检查套餐名禁忌服用药品", direction = Relationship.OUTGOING)
+	private Set<LisSetOralMedicine> lisSetOralMedicines = new HashSet<>();
+
 	@Relationship(type = "实验室检查名称相关实验室检查套餐名", direction = Relationship.INCOMING)
 	private Set<LisNameLisSet> lisnamelisSet = new HashSet<>();
-
 }

+ 20 - 0
src/main/java/com/diagbot/entity/node/NeedlessOrder.java

@@ -0,0 +1,20 @@
+package com.diagbot.entity.node;
+
+import com.diagbot.entity.node.base.BaseNode;
+import com.diagbot.entity.relationship.PacsNameNeedlessItem;
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Setter
+@Getter
+@NodeEntity(label = "无需重复开单项")
+public class NeedlessOrder extends BaseNode  {
+
+	@Relationship(type = "辅助检查名称无需重复开单项", direction = Relationship.INCOMING)
+	private Set<PacsNameNeedlessItem> pacsNameNeedlessItems = new HashSet<>();
+}

+ 3 - 0
src/main/java/com/diagbot/entity/node/PacsName.java

@@ -58,6 +58,9 @@ public class PacsName extends BaseNode  {
 	@Relationship(type = "辅助检查名称禁忌开单项互斥", direction = Relationship.OUTGOING)
 	private Set<PacsNameBillConflictItem> pacsNameBillConflictItems = new HashSet<>();
 
+	@Relationship(type = "辅助检查名称无需重复开单项", direction = Relationship.OUTGOING)
+	private Set<PacsNameNeedlessItem> pacsNameNeedlessItems = new HashSet<>();
+
 //	@Relationship(type = "辅助检查名称开单互斥辅助检查名称", direction = Relationship.OUTGOING)
 //	private Set<PacsNamePacsName> conflictPacsName_out = new HashSet<>();
 //

+ 3 - 1
src/main/java/com/diagbot/entity/node/PacsSubName.java

@@ -1,6 +1,5 @@
 package com.diagbot.entity.node;
 
-import com.diagbot.biz.push.entity.Pacs;
 import com.diagbot.entity.node.base.BaseNode;
 import com.diagbot.entity.relationship.*;
 import lombok.Getter;
@@ -52,4 +51,7 @@ public class PacsSubName extends BaseNode  {
 	@Relationship(type = "辅助检查名称包含辅助检查子项目名称", direction = Relationship.INCOMING)
 	private Set<PacsNamePacsSubName> pacsNamePacsSubNames = new HashSet<>();
 
+	@Relationship(type = "辅助检查子项目名称无需重复开单项", direction = Relationship.OUTGOING)
+	private Set<PacsNameSubNeedlessItem> pacsNameSubNeedlessItems = new HashSet<>();
+
 }

+ 1 - 1
src/main/java/com/diagbot/entity/node/YiBaoDiseaseName.java

@@ -29,7 +29,7 @@ public class YiBaoDiseaseName extends BaseNode  {
 	@Property(name="分类")
 	private Integer category;
 
-	@Relationship(type = "医保疾病名称相关医保ICD-10代码", direction = Relationship.OUTGOING)
+	@Relationship(type = "医保疾病名称相关医保ICD_10代码", direction = Relationship.OUTGOING)
 	private Set<YiBaoDiseaseNameYiBaoICD_10Code> yiBaoDiseaseNameYibaoicd_10codes = new HashSet<>();
 
 	@Relationship(type = "医保疾病名称相关国临疾病名称", direction = Relationship.OUTGOING)

+ 1 - 1
src/main/java/com/diagbot/entity/node/YiBaoICD_10Code.java

@@ -17,7 +17,7 @@ import java.util.HashSet;
 public class YiBaoICD_10Code extends BaseNode  {
 
 
-	@Relationship(type = "医保疾病名称相关医保ICD-10代码", direction = Relationship.INCOMING)
+	@Relationship(type = "医保疾病名称相关医保ICD_10代码", direction = Relationship.INCOMING)
 	private Set<YiBaoDiseaseNameYiBaoICD_10Code> yibaodiseasenameYiBaoICD_10Codes = new HashSet<>();
 
 }

+ 26 - 0
src/main/java/com/diagbot/entity/relationship/LisSetOralMedicine.java

@@ -0,0 +1,26 @@
+package com.diagbot.entity.relationship;
+
+import com.diagbot.entity.node.LisSet;
+import com.diagbot.entity.node.OralMedicine;
+import com.diagbot.entity.relationship.base.BaseRelation;
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.EndNode;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+import org.neo4j.ogm.annotation.StartNode;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/3/2 10:33
+ */
+@Getter
+@Setter
+@RelationshipEntity(type = "实验室检查套餐名禁忌服用药品")
+public class LisSetOralMedicine extends BaseRelation {
+    @StartNode
+    private LisSet lisSet;
+
+    @EndNode
+    private OralMedicine oralMedicine;
+}

+ 21 - 0
src/main/java/com/diagbot/entity/relationship/PacsNameNeedlessItem.java

@@ -0,0 +1,21 @@
+package com.diagbot.entity.relationship;
+
+import com.diagbot.entity.node.NeedlessOrder;
+import com.diagbot.entity.node.PacsName;
+import com.diagbot.entity.relationship.base.BaseRelation;
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.EndNode;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+import org.neo4j.ogm.annotation.StartNode;
+
+@Getter
+@Setter
+@RelationshipEntity(type = "辅助检查名称无需重复开单项")
+public class PacsNameNeedlessItem extends BaseRelation {
+    @StartNode
+    private PacsName pacsName;
+
+    @EndNode
+    private NeedlessOrder needlessOrder;
+}

+ 21 - 0
src/main/java/com/diagbot/entity/relationship/PacsNameSubNeedlessItem.java

@@ -0,0 +1,21 @@
+package com.diagbot.entity.relationship;
+
+import com.diagbot.entity.node.NeedlessOrder;
+import com.diagbot.entity.node.PacsSubName;
+import com.diagbot.entity.relationship.base.BaseRelation;
+import lombok.Getter;
+import lombok.Setter;
+import org.neo4j.ogm.annotation.EndNode;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+import org.neo4j.ogm.annotation.StartNode;
+
+@Getter
+@Setter
+@RelationshipEntity(type = "辅助检查子项目名称无需重复开单项")
+public class PacsNameSubNeedlessItem extends BaseRelation {
+    @StartNode
+    private PacsSubName pacsName;
+
+    @EndNode
+    private NeedlessOrder needlessOrder;
+}

+ 1 - 1
src/main/java/com/diagbot/entity/relationship/YiBaoDiseaseNameYiBaoICD_10Code.java

@@ -8,7 +8,7 @@ import lombok.Setter;
 import org.neo4j.ogm.annotation.*;
 
 @Getter
-@Setter@RelationshipEntity(type = "医保疾病名称相关医保ICD-10代码")
+@Setter@RelationshipEntity(type = "医保疾病名称相关医保ICD_10代码")
 public class YiBaoDiseaseNameYiBaoICD_10Code extends BaseRelation {
     @StartNode
     private YiBaoDiseaseName yiBaoDiseaseName;

+ 2 - 1
src/main/java/com/diagbot/enums/DiseaseTypeEnum.java

@@ -12,7 +12,8 @@ import lombok.Setter;
 public enum DiseaseTypeEnum implements KeyedNamed {
 
     identify(1, "鉴别诊断"),
-    possibleDis(2, "可能诊断");
+    possibleDis(2, "可能诊断"),
+    highriskDis(3, "警惕");
 
     @Setter
     private int key;

+ 20 - 14
src/main/java/com/diagbot/facade/NeoFacade.java

@@ -220,7 +220,12 @@ public class NeoFacade {
         if (ListUtil.isNotEmpty(symptomFeatures)) {
             Map map = symptomFeatures.stream().collect(Collectors.toMap(
                     k -> RedisEnum.diseaseCorrespond.getName() + k.getDiagPingan(),
-                    v -> v.getDiagIcd(),
+                    v -> {
+                        Map<String, Object> desc = new HashMap<>();
+                        desc.put("diag_icd", v.getDiagIcd());
+                        desc.put("sign", v.getHighRiskSign());
+                        return desc;
+                    },
                     (v1, v2) -> (v2)
             ));
             redisTemplate.opsForValue().multiSet(map);
@@ -228,15 +233,15 @@ public class NeoFacade {
     }
 
     public void diseaseFilterCache() {
-        Map<String,Map> data = new HashMap<>();
+        Map<String, Map> data = new HashMap<>();
         QueryWrapper<TranHospitalFilter> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey());
         List<TranHospitalFilter> tranHospitalFilters = tranHospitalFilterMapper.selectList(queryWrapper);
         if (ListUtil.isNotEmpty(tranHospitalFilters)) {
             Map<Long, List<TranHospitalFilter>> longListMap = tranHospitalFilters.stream().collect(Collectors.groupingBy(TranHospitalFilter::getHospitalId));
-            longListMap.forEach((x,y)->{
+            longListMap.forEach((x, y) -> {
                 Map<String, Long> collect = y.stream().collect(Collectors.toMap(TranHospitalFilter::getUniqueName, TranHospitalFilter::getDocNum, (existing, replacement) -> replacement));
-                data.put(RedisEnum.diseaseFilter.getName() + x.toString(),collect);
+                data.put(RedisEnum.diseaseFilter.getName() + x.toString(), collect);
             });
             redisTemplate.opsForValue().multiSet(data);
         }
@@ -426,8 +431,8 @@ public class NeoFacade {
         pushSpeDis.removeAll(disByDiag);
         disByDiag.addAll(pushSpeDis);
 
-        Map diag_filters = (Map)redisUtil.get(RedisEnum.diseaseFilter.getName() + pushVO.getHospitalId().toString());
-        if(MapUtils.isNotEmpty(diag_filters)){
+        Map diag_filters = (Map) redisUtil.get(RedisEnum.diseaseFilter.getName() + pushVO.getHospitalId().toString());
+        if (MapUtils.isNotEmpty(diag_filters)) {
             Set set = diag_filters.keySet();
             disByDiag.retainAll(set);
         }
@@ -785,10 +790,10 @@ public class NeoFacade {
             diseases = redisUtil.geth(allDis);
             allDis = diseases.stream().filter(x -> NeoUtil.matchBasic(x, gender_code, age) && NeoUtil.matchPds(x.get("name"), pd)
                     && NeoUtil.matchDept(x, depts)).map(x -> x.get("name")).collect(Collectors.toList());
-            diseases.forEach(x ->{
+            diseases.forEach(x -> {
                 String name = x.get("name");
                 double clafy = Double.parseDouble(x.get("clafy"));
-                dis_fbl.put(name,clafy);
+                dis_fbl.put(name, clafy);
             });
         }
 
@@ -926,10 +931,11 @@ public class NeoFacade {
 
     /**
      * 根据选中的诊断推送药品和手术
+     *
      * @param disName
      */
-    public Map<String,List<String>> reverseInfoByDisName(String disName) {
-        Map<String,List<String>> type_contents = new HashMap<>();
+    public Map<String, List<String>> reverseInfoByDisName(String disName) {
+        Map<String, List<String>> type_contents = new HashMap<>();
         List<DiseaseInfo> diseaseInfo = nodeRepository.getDiseaseInfo(disName);
         if (ListUtil.isNotEmpty(diseaseInfo)) {
             diseaseInfo.forEach(disIf -> {
@@ -937,10 +943,10 @@ public class NeoFacade {
                 List<String> col = disIf.getCol();
                 switch (tp) {
                     case "医保疾病名称相关药物治疗":
-                        type_contents.put(StaticTypeEnum.DRUG.getName(),col);
+                        type_contents.put(StaticTypeEnum.DRUG.getName(), col);
                         break;
                     case "医保疾病名称相关医保手术和操作名称":
-                        type_contents.put(StaticTypeEnum.OPT.getName(),col);
+                        type_contents.put(StaticTypeEnum.OPT.getName(), col);
                         break;
                     default:
                         break;
@@ -1253,8 +1259,8 @@ public class NeoFacade {
     public NeoPushDTO getDiagInfo(NeoPushVO neoPushVO) {
         NeoPushDTO pushDTO = new NeoPushDTO();
         String term = neoPushVO.getDiagVo().getDiags().get(0).getName();
-        String o = (String)redisUtil.get(RedisEnum.diseaseCorrespond.getName() + term);
-        term = StringUtil.isNotBlank(o)?o:term;
+//        String o = (String) redisUtil.get(RedisEnum.diseaseCorrespond.getName() + term);
+//        term = StringUtil.isNotBlank(o) ? o : term;
         pushDTO = this.reverseInfo(term);
 
         return pushDTO;

+ 4 - 0
src/main/java/com/diagbot/facade/PushFacade.java

@@ -36,6 +36,10 @@ public class PushFacade {
     TranHospitalInfoFacade tranHospitalInfoFacade;
 
     public PushDTO processAggreate(PushVO pushVo) {
+        // 年龄容错处理
+        if (pushVo.getAgeNum() == null) {
+            pushVo.setAgeNum(CoreUtil.convertAge(pushVo.getAge()));
+        }
         PushDTO pushDTO = new PushDTO();
         Integer pushMode = tranHospitalInfoFacade.getPushMode(pushVo.getHospitalId());
         //全科推送,走5.0

+ 12 - 0
src/main/java/com/diagbot/facade/RetrievalFacade.java

@@ -13,6 +13,7 @@ import com.diagbot.entity.node.Medicine;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.entity.relationship.LisNameLisSet;
+import com.diagbot.entity.relationship.YiBaoDiseaseNameYiBaoICD_10Code;
 import com.diagbot.enums.StaticTypeEnum;
 import com.diagbot.repository.*;
 import com.diagbot.util.EntityUtil;
@@ -26,6 +27,8 @@ import org.springframework.stereotype.Component;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
 
 /**
  * @Description:
@@ -453,6 +456,15 @@ public class RetrievalFacade {
                 staticDTO.setName(icdDisease.getName());
                 staticDTO.setType(StaticTypeEnum.DIS.getKey());
                 staticDTO.setTypeName(StaticTypeEnum.DIS.getName());
+                Set<YiBaoDiseaseNameYiBaoICD_10Code> yiBaoDiseaseNameYibaoicd_10codes
+                        = icdDisease.getYiBaoDiseaseNameYibaoicd_10codes();
+                if (yiBaoDiseaseNameYibaoicd_10codes != null && yiBaoDiseaseNameYibaoicd_10codes.size() > 0) {
+                    //升序排序
+                    Set<YiBaoDiseaseNameYiBaoICD_10Code> sortYiBaoDiseaseNameYibaoicd_10codes
+                            = new TreeSet<YiBaoDiseaseNameYiBaoICD_10Code>((o1, o2) -> o1.getYiBaoICD_10Code().getName().compareTo(o2.getYiBaoICD_10Code().getName()));
+                    sortYiBaoDiseaseNameYibaoicd_10codes.addAll(yiBaoDiseaseNameYibaoicd_10codes);
+                    staticDTO.setCode(sortYiBaoDiseaseNameYibaoicd_10codes.iterator().next().getYiBaoICD_10Code().getName());
+                }
                 retList.add(staticDTO);
             }
         }

+ 46 - 2
src/main/java/com/diagbot/facade/TestFacade.java

@@ -345,7 +345,7 @@ public class TestFacade {
 
             if (StringUtil.isNotEmpty(bean.getTransfusionNodeName())) {
                 switch (bean.getTransfusionNodeName()) {
-                    case "手术和操作": // 手术和操作
+                    case "医保手术和操作名称": // 医保手术和操作名称
                         List<Item> operation = new ArrayList<>();
                         Item item = new Item();
                         item.setName(bean.getStandName());
@@ -361,7 +361,7 @@ public class TestFacade {
                         diag.add(itemDiag);
                         indicationPushVO.setDiag(diag);
                         break;
-                    case "实验室检查": // 实验室检查
+                    case "实验室检查名称": // 实验室检查名称
                         List<Lis> lisList = new ArrayList<>();
                         Lis lisBean = new Lis();
                         lisBean.setUniqueName(bean.getStandName());
@@ -1034,6 +1034,49 @@ public class TestFacade {
         return map;
     }
 
+    /**
+     * 检查结果与项目重复开立规则测试API
+     *
+     * @param file
+     */
+    public Map<String, Object> testPacsOrderNeedlessProcess(MultipartFile file, TestLineVO testLineVO) {
+        long start = System.currentTimeMillis();
+        List<IndicationPushVO> indicationPushVOList = new ArrayList<>();
+        List<TestIndicationVO> data = ExcelUtils.importExcelMultiSheets(file, 0, 1, testLineVO.getSheetIndex(), TestIndicationVO.class);
+        for (TestIndicationVO bean : data) {
+            if (StringUtil.isNotEmpty(testLineVO.getIdNum()) && !testLineVO.getIdNum().equals(bean.getIdNum())) {
+                continue;
+            }
+            IndicationPushVO indicationPushVO = new IndicationPushVO();
+            indicationPushVO.setRuleType("2");
+            indicationPushVO.setIdNum(bean.getIdNum());
+            if (StringUtil.isNotBlank(bean.getPacsOrderName())) {
+                List<Pacs> pacsOrder = new ArrayList<>();
+                Pacs pacsBean = new Pacs();
+                pacsBean.setName(bean.getPacsOrderName());
+                pacsBean.setUniqueName(bean.getPacsOrderName());
+                pacsBean.setDateValue("2021-01-28 00:00:00");
+                pacsOrder.add(pacsBean);
+                indicationPushVO.setPacsOrder(pacsOrder);
+            }
+
+            List<Pacs> pacsList = new ArrayList<>();
+            Pacs pacsBean = new Pacs();
+            pacsBean.setName(bean.getPacsOrderName());
+            pacsBean.setUniqueName(bean.getPacsOrderName());
+            pacsBean.setResult(bean.getRuleContent());
+            pacsBean.setDateValue("2021-01-27 00:00:00");
+            pacsList.add(pacsBean);
+            indicationPushVO.setPacs(pacsList);
+            indicationPushVOList.add(indicationPushVO);
+        }
+
+        Map<String, Object> map = getDebugMap(indicationPushVOList, "2", start);
+        return map;
+    }
+
+
+
     /**
      * 提示方法
      *
@@ -1175,6 +1218,7 @@ public class TestFacade {
         mapPath.put("【高危手术整合】", path + File.separator + "【高危手术整合】.xlsx");
         mapPath.put("【开单合理性】", path + File.separator + "【开单合理性】.xlsx");
         mapPath.put("【开单合理性_输血】", path + File.separator + "【开单合理性_输血】.xlsx");
+        mapPath.put("【检查结果与项目重复开立规则】", path + File.separator + "【检查结果与项目重复开立规则】.xlsx");
         paramMap.put("mapPath", mapPath);
 
         try {

+ 27 - 0
src/main/java/com/diagbot/process/BillProcess.java

@@ -1,6 +1,7 @@
 package com.diagbot.process;
 
 import com.diagbot.biz.push.entity.Item;
+import com.diagbot.biz.push.entity.Pacs;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.BillNeoDTO;
 import com.diagbot.dto.BillNeoMaxDTO;
@@ -27,6 +28,7 @@ import com.diagbot.rule.VitalRule;
 import com.diagbot.util.BeanUtil;
 import com.diagbot.util.CoreUtil;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -159,6 +161,28 @@ public class BillProcess {
             System.out.println(billNeoMaxDTO);
             billNeoMaxDTOList.add(billNeoMaxDTO);
         }
+
+        // 辅检开单项时间赋值,用于规则【无需重复开单项】
+        // 由于mark之前返回的billNeoDTOList没有时间字段,就用辅检开单的原始数据name和uniqueName两个字段相同时
+        // 进行赋值。可能会存在多个相同的开单项,时间需要分别赋值:处理方式是时间只用一次,刚好可以对上
+        if (ListUtil.isNotEmpty(billNeoMaxDTOList) && ListUtil.isNotEmpty(wordCrfDTO.getPacsOrder())) {
+            List<Integer> useList = new ArrayList<>();
+            for (int i = 0; i < billNeoMaxDTOList.size(); i++) {
+                BillNeoMaxDTO billNeoMaxDTO = billNeoMaxDTOList.get(i);
+                for (int j = 0; j < wordCrfDTO.getPacsOrder().size(); j++) {
+                    Pacs pacs = wordCrfDTO.getPacsOrder().get(j);
+                    if (StringUtil.isNotBlank(pacs.getName()) && StringUtil.isNotBlank(pacs.getUniqueName())
+                            && pacs.getName().equals(billNeoMaxDTO.getOrderName())
+                            && pacs.getUniqueName().equals(billNeoMaxDTO.getOrderStandName())) {
+                        if (!useList.contains(j)) { // 判断使用标识
+                            billNeoMaxDTO.setDateValue(pacs.getDateValue());
+                            useList.add(j);
+                            break;
+                        }
+                    }
+                }
+            }
+        }
         processRule(billNeoMaxDTOList, wordCrfDTO, res);
     }
 
@@ -241,6 +265,9 @@ public class BillProcess {
 
             // 禁忌医疗器械及物品
             medEquRule.bill(wordCrfDTO, bill, billMsgList, NeoEnum.medEqu.getName());
+
+            // 无需重复开单项
+            commonRule.needlessRepeatOrder(wordCrfDTO, bill, billMsgList);
         }
 
         // 24小时重复开单项

+ 2 - 2
src/main/java/com/diagbot/process/OtherTipProcess.java

@@ -57,7 +57,7 @@ public class OtherTipProcess {
                     if (TypeEnum.disease.getName().equals(nodeNeoDTO.getTermtype())) { // 诊断
                         map = CoreUtil.compareNameWithNode(nodeNeoDTO, wordCrfDTO.getDiag());
                     } else if (TypeEnum.drug.getName().equals(nodeNeoDTO.getTermtype())) { // 药品
-                        map = CoreUtil.compareNameWithNode(nodeNeoDTO, wordCrfDTO.getDrug());
+                        map = CoreUtil.compareNameWithNode(nodeNeoDTO, wordCrfDTO.getDrugSource());
                     } else if (NeoEnum.group.getName().equals(nodeNeoDTO.getTermtype())) { // "禁忌人群"
                         map = groupRule.gravidityRule(wordCrfDTO);
                     }
@@ -78,7 +78,7 @@ public class OtherTipProcess {
                         List<String> msgList = (List<String>)map.get("msg");
                         if (ListUtil.isNotEmpty(msgList)) {
                             for (String msg : msgList) {
-                                BillMsg billMsg = MsgUtil.getCommonOtherTipLisMsg(content, msg, nodeNeoDTO.getTermtype());
+                                BillMsg billMsg = MsgUtil.getCommonOtherTipLisMsg(content, msg, nodeNeoDTO.getTermtype(), otherTipNeoDTO);
                                 res.getOtherList().add(billMsg);
                             }
                         }

+ 71 - 62
src/main/java/com/diagbot/process/PushProcess.java

@@ -15,7 +15,6 @@ import com.diagbot.facade.NeoFacade;
 import com.diagbot.facade.TranLisConfigIcssFacade;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RedisUtil;
-import com.diagbot.util.StringUtil;
 import com.diagbot.vo.IcssVo;
 import com.diagbot.vo.NeoPushVO;
 import com.diagbot.vo.PushVO;
@@ -53,37 +52,49 @@ public class PushProcess {
     RedisUtil redisUtil;
 
 
-    public PushDTO processIcss(PushVO pushVo){
+    public PushDTO processIcss(PushVO pushVo) {
 
-        List<Item> diag1 = pushVo.getDiag();
         int length = pushVo.getLength();
         Map<String, List<String>> typeWords = Maps.newHashMap();
         List<String> ruleTypeList = Arrays.asList(pushVo.getFeatureType().split(","));
         List<String> pushDiags = Lists.newArrayList();
+        Map<String, Integer> diag_sign = new LinkedHashMap<>();
         PushDTO pushDTO = new PushDTO();
         IcssVo icssVo = pushVo2IcssVo(pushVo);
 //        String s = JSONObject.toJSONString(icssVo);
-        if((StringUtils.isNotBlank(icssVo.getChief()) && icssVo.getChief().trim().equals("呼吸困难"))
-                || (StringUtils.isNotBlank(icssVo.getSymptom()) && icssVo.getSymptom().trim().equals("呼吸困难"))){
+        if ((StringUtils.isNotBlank(icssVo.getChief()) && icssVo.getChief().trim().equals("呼吸困难"))
+                || (StringUtils.isNotBlank(icssVo.getSymptom()) && icssVo.getSymptom().trim().equals("呼吸困难"))) {
             icssVo.setChief("呼吸困难。");
         }
         Response<ResponseData> annotation = icssPushServiceClient.getAnnotation(icssVo);
-        if(annotation != null){
+        if (annotation != null) {
             ResponseData data = annotation.getData();
-            if(data != null){
+            if (data != null) {
                 Map<String, Map<String, String>> inputs = data.getInputs();
-                if(MapUtils.isNotEmpty(inputs)){
+                if (MapUtils.isNotEmpty(inputs)) {
                     List<String> words = new ArrayList<>(inputs.keySet());
-                    typeWords.put(StandConvertEnum.symptom.toString(),words);
-                    typeWords.put(StandConvertEnum.disease.toString(),words);
-                    typeWords.put(StandConvertEnum.pacs.toString(),words);
-                    typeWords.put(StandConvertEnum.lis.toString(),words);
-                    typeWords.put(StandConvertEnum.vital.toString(),words);
+                    typeWords.put(StandConvertEnum.symptom.toString(), words);
+                    typeWords.put(StandConvertEnum.disease.toString(), words);
+                    typeWords.put(StandConvertEnum.pacs.toString(), words);
+                    typeWords.put(StandConvertEnum.lis.toString(), words);
+                    typeWords.put(StandConvertEnum.vital.toString(), words);
                 }
                 List<FeatureRate> dis = data.getDis();
-                if(ListUtil.isNotEmpty(dis)){
+                if (ListUtil.isNotEmpty(dis)) {
                     pushDiags = dis.stream().filter(x -> x.getDesc() == null || x.getDesc().contains("确诊") || x.getDesc().contains("拟诊"))
-                            .map(x -> x.getFeatureName()).collect(Collectors.toList());
+                            .map(x -> {
+                                        String diag = x.getFeatureName();
+                                        Integer sign = 0;
+                                        Map<String, Object> diag_signs = (Map<String, Object>) redisUtil.get(RedisEnum.diseaseCorrespond.getName() + x.getFeatureName());
+                                        if (MapUtils.isNotEmpty(diag_signs)) {
+                                            diag = (String) diag_signs.get("diag_icd");
+                                            sign = (Integer) diag_signs.get("sign");
+                                        }
+                                        diag_sign.put(diag, sign);
+                                        return diag;
+                                    }
+                            )
+                            .collect(Collectors.toList());
                 }
             }
         }
@@ -94,34 +105,19 @@ public class PushProcess {
             TreatDTO treatDTO = new TreatDTO();
             treatDTO.setName(diaeaseName.getName());
             String uniqueName = diaeaseName.getUniqueName();
-            uniqueName = StringUtils.isNotBlank(uniqueName)?uniqueName:diaeaseName.getName();
+            uniqueName = StringUtils.isNotBlank(uniqueName) ? uniqueName : diaeaseName.getName();
             treatDTO.setUniqueName(uniqueName);
-            /*Map<String,List<String>> reverseInfoByDisName = neoFacade.reverseInfoByDisName(uniqueName);
-            if(reverseInfoByDisName.containsKey(StaticTypeEnum.DRUG.getName())){
-                treatDTO.setMedicineTreat(reverseInfoByDisName.get(StaticTypeEnum.DRUG.getName()).stream().map(x -> {
-                    PushBaseDTO pushBaseDTO = new PushBaseDTO();
-                    pushBaseDTO.setName(x);
-                    return pushBaseDTO;
-                }).collect(Collectors.toList()));
-            }
-            if(reverseInfoByDisName.containsKey(StaticTypeEnum.OPT.getName())){
-                treatDTO.setOperaterTreat(reverseInfoByDisName.get(StaticTypeEnum.OPT.getName()).stream().map(x -> {
-                    PushBaseDTO pushBaseDTO = new PushBaseDTO();
-                    pushBaseDTO.setName(x);
-                    return pushBaseDTO;
-                }).collect(Collectors.toList()));
-            }*/
             collect.add(treatDTO);
             pushDTO.setTreat(collect);
         }
-        Map<String,List<String>> reverseInfoByDisName = null;
+        Map<String, List<String>> reverseInfoByDisName = null;
         //推送治疗
-        if(diaeaseName != null){
+        if (diaeaseName != null) {
             String uniqueName = diaeaseName.getUniqueName();
-            uniqueName = StringUtils.isNotBlank(uniqueName)?uniqueName:diaeaseName.getName();
+            uniqueName = StringUtils.isNotBlank(uniqueName) ? uniqueName : diaeaseName.getName();
             reverseInfoByDisName = neoFacade.reverseInfoByDisName(uniqueName);
         }
-        if(reverseInfoByDisName != null){
+        if (reverseInfoByDisName != null) {
             if (ruleTypeList.contains("8") && reverseInfoByDisName.containsKey(StaticTypeEnum.DRUG.getName())) {
                 pushDTO.setMedicines(reverseInfoByDisName.get(StaticTypeEnum.DRUG.getName()).stream().map(x -> {
                     PushBaseDTO pushBaseDTO = new PushBaseDTO();
@@ -137,16 +133,16 @@ public class PushProcess {
                 }).collect(Collectors.toList()));
             }
         }
-        if(ListUtil.isNotEmpty(icssVo.getDiagOrder())){
+        if (ListUtil.isNotEmpty(icssVo.getDiagOrder())) {
             List<PreResult> diagOrder = icssVo.getDiagOrder();
             //把第一个推送出来的诊断set到diagOrder中,再反推
             NeoPushVO pushVO = new NeoPushVO();
             DiagVo diagVo = new DiagVo();
-            diagVo.setDiags(diagOrder.stream().map(x ->{
+            diagVo.setDiags(diagOrder.stream().map(x -> {
                 String name = x.getName();
                 Diag diag = new Diag();
-                String o = (String)redisUtil.get(RedisEnum.diseaseCorrespond.getName() + name);
-                name = StringUtil.isNotBlank(o)?o:name;
+                Map<String, Object> diag_signs = (Map<String, Object>) redisUtil.get(RedisEnum.diseaseCorrespond.getName() + name);
+                name = MapUtils.isNotEmpty(diag_signs)? (String) diag_signs.get("diag_icd"):name;
                 diag.setName(name);
                 return diag;
             }).collect(Collectors.toList()));
@@ -155,11 +151,25 @@ public class PushProcess {
         }
         try {
             boolean allFieldNull = isAllFieldNull(pushDTO);
-            if(allFieldNull){
+            if (allFieldNull) {
                 if (ListUtil.isNotEmpty(pushDiags)) {
                     //先把所有疾病推出来
                     if (ruleTypeList.contains("7")) {
-                        List<PushBaseDTO> diseeases =  pushDiags.stream().map(x -> {
+                        if(MapUtils.isNotEmpty(diag_sign)){
+                            Map.Entry<String, Integer> first = diag_sign.entrySet().stream().findFirst().get();
+                            if (first.getValue() == 1){
+                                List<String> firstdiag = Lists.newArrayList(first.getKey());
+                                List<PushBaseDTO> collect_highrisk = firstdiag.stream().map(x -> {
+                                    PushBaseDTO pushBaseDTO = new PushBaseDTO();
+                                    pushBaseDTO.setName(x);
+                                    return pushBaseDTO;
+                                }).collect(Collectors.toList());
+                                dis.put(DiseaseTypeEnum.highriskDis.getName(), collect_highrisk);
+                            }
+
+                        }
+
+                        List<PushBaseDTO> diseeases = pushDiags.stream().map(x -> {
                             PushBaseDTO pushBaseDTO = new PushBaseDTO();
                             pushBaseDTO.setName(x);
                             return pushBaseDTO;
@@ -172,7 +182,7 @@ public class PushProcess {
                     //把第一个推送出来的诊断set到diagOrder中,再反推
                     NeoPushVO pushVO = new NeoPushVO();
                     DiagVo diagVo = new DiagVo();
-                    diagVo.setDiags(pushDiags.stream().map(x ->{
+                    diagVo.setDiags(pushDiags.stream().map(x -> {
                         Diag diag = new Diag();
                         diag.setName(x);
                         return diag;
@@ -188,13 +198,11 @@ public class PushProcess {
         }
 
 
-
-
         return pushDTO;
     }
 
     //判断该对象是否: 返回ture表示所有属性为null  返回false表示不是所有属性都是null
-    public static boolean isAllFieldNull(Object obj) throws Exception{
+    public static boolean isAllFieldNull(Object obj) throws Exception {
         List<String> params = Lists.newArrayList("operations", "medicines", "treat");
         Class stuCla = (Class) obj.getClass();// 得到类对象
         Field[] fs = stuCla.getDeclaredFields();//得到属性集合
@@ -203,7 +211,7 @@ public class PushProcess {
             f.setAccessible(true); // 设置属性是可以访问的(私有的也可以)
             String name = f.getName();
             Object val = f.get(obj);// 得到此属性的值
-            if(val!=null && !params.contains(name)) {//只要有1个属性不为空,那么就不是所有的属性值都为空
+            if (val != null && !params.contains(name)) {//只要有1个属性不为空,那么就不是所有的属性值都为空
                 flag = false;
                 break;
             }
@@ -213,17 +221,18 @@ public class PushProcess {
 
     /**
      * pushVo转Icss入参
+     *
      * @param pushVo
      * @return
      */
-    public IcssVo pushVo2IcssVo(PushVO pushVo){
+    public IcssVo pushVo2IcssVo(PushVO pushVo) {
         IcssVo icssVo = new IcssVo();
         icssVo.setAge(new Double(pushVo.getAgeNum()).intValue());
         String sexs = "";
         Integer sex = pushVo.getSex();
-        if(sex == 1){
+        if (sex == 1) {
             sexs = "M";
-        }else if(sex == 2){
+        } else if (sex == 2) {
             sexs = "F";
         }
         icssVo.setSex(sexs);
@@ -232,32 +241,32 @@ public class PushProcess {
         icssVo.setVital(pushVo.getVital());
         icssVo.setPasts(pushVo.getPasts());
         icssVo.setPersonal(pushVo.getPersonal());
-        icssVo.setFeatureType(pushVo.getFeatureType()+",7");
+        icssVo.setFeatureType(pushVo.getFeatureType() + ",7");
 
         List<Lis> lis = pushVo.getLis();
         lis = tranLisConfigIcssFacade.addLisUniqueName(lis, "A001");
-        List<PreResult> lis_icss = lis.stream().map(x ->{
+        List<PreResult> lis_icss = lis.stream().map(x -> {
             PreResult instantiate = BeanUtils.instantiate(PreResult.class);
-            BeanUtils.copyProperties(x,instantiate);
-            instantiate.setValue(x.getValue()==null?"":x.getValue().toString());
-            instantiate.setMaxValue(x.getMaxValue()==null?"":x.getMaxValue().toString());
-            instantiate.setMinValue(x.getMinValue()==null?"":x.getMinValue().toString());
+            BeanUtils.copyProperties(x, instantiate);
+            instantiate.setValue(x.getValue() == null ? "" : x.getValue().toString());
+            instantiate.setMaxValue(x.getMaxValue() == null ? "" : x.getMaxValue().toString());
+            instantiate.setMinValue(x.getMinValue() == null ? "" : x.getMinValue().toString());
             return instantiate;
         }).collect(Collectors.toList());
         icssVo.setLis(lis_icss);
 
         List<Pacs> pacs = pushVo.getPacs();
-        if(ListUtil.isNotEmpty(pacs)){
-            List<PreResult> pacs_icss = pacs.stream().map(x ->{
+        if (ListUtil.isNotEmpty(pacs)) {
+            List<PreResult> pacs_icss = pacs.stream().map(x -> {
                 PreResult instantiate = new PreResult();
-                BeanUtils.copyProperties(x,instantiate);
+                BeanUtils.copyProperties(x, instantiate);
                 return instantiate;
             }).collect(Collectors.toList());
             icssVo.setPacs(pacs_icss);
         }
 
-        if(ListUtil.isNotEmpty(pushVo.getDiag())){
-            List<PreResult> diagOrder =  pushVo.getDiag().stream().map(x ->{
+        if (ListUtil.isNotEmpty(pushVo.getDiag())) {
+            List<PreResult> diagOrder = pushVo.getDiag().stream().map(x -> {
                 String name = x.getName();
                 PreResult preResult = new PreResult();
                 preResult.setName(name);
@@ -281,7 +290,7 @@ public class PushProcess {
         if (ListUtil.isNotEmpty(push)) {
             //先把所有疾病推出来
             if (ruleTypeList.contains("7")) {
-                List<PushBaseDTO> diseeases =  push.stream().map(x -> {
+                List<PushBaseDTO> diseeases = push.stream().map(x -> {
                     PushBaseDTO pushBaseDTO = new PushBaseDTO();
                     pushBaseDTO.setName(x);
                     return pushBaseDTO;
@@ -413,7 +422,7 @@ public class PushProcess {
     private List<PushBaseDTO> getPackagePushBaseDTO(Map<String, List<String>> typeWords, List<String> symptoms, StandConvertEnum symptom) {
         List<PushBaseDTO> symptomPush = symptoms.stream()
                 .map(x -> {
-                    x = ListUtil.isNotEmpty(typeWords.get(symptom.toString()))?!typeWords.get(symptom.toString()).contains(x)?x:"":x;
+                    x = ListUtil.isNotEmpty(typeWords.get(symptom.toString())) ? !typeWords.get(symptom.toString()).contains(x) ? x : "" : x;
                     return x;
                 }).filter(x -> StringUtils.isNotBlank(x)).map(x -> {
                     PushBaseDTO pushBaseDTO = new PushBaseDTO();

+ 15 - 0
src/main/java/com/diagbot/repository/LisSetNode.java

@@ -6,8 +6,10 @@ import com.diagbot.dto.NeoEntityDTO;
 import com.diagbot.entity.node.Gender;
 import com.diagbot.entity.node.Group;
 import com.diagbot.entity.node.LisSet;
+import com.diagbot.entity.node.OralMedicine;
 import com.diagbot.entity.relationship.LisSetGender;
 import com.diagbot.entity.relationship.LisSetGroup;
+import com.diagbot.entity.relationship.LisSetOralMedicine;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -46,6 +48,19 @@ public class LisSetNode {
 			}
 		}
 
+		Set<LisSetOralMedicine> lisSetOralMeds = lisset.getLisSetOralMedicines();
+		for (LisSetOralMedicine lisSetOralMed : lisSetOralMeds) {
+			if (NeoUtil.isExist(lisSetOralMed)) {
+				if (NeoUtil.isExist(lisSetOralMed.getOralMedicine())) {
+					OralMedicine conflict_oralmed = lisSetOralMed.getOralMedicine();
+					nodeInfo = new NodeInfo();
+					nodeInfo.setName(conflict_oralmed.getName());
+					nodeInfo.setTypeval(Constants.yaoping);
+					lisBillNeoDTO.getOralmeds().add(NeoUtil.updateNodeInfo(nodeInfo));
+				}
+			}
+		}
+
 /*
 		Age age = lispack.getAge();
 		if (null!=age) {

+ 1 - 0
src/main/java/com/diagbot/repository/MedicineNode.java

@@ -130,6 +130,7 @@ public class MedicineNode {
 
                 List<String> medRegNamels = medicineRepository.findMedRegNamebyMedicine(medname);
 
+
                 for (String mrnames : medRegNamels) {
                     medRegNames = medRegNameRepository.findByNameIs(mrnames);
 

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

@@ -22,7 +22,7 @@ public interface MedicineRepository extends Neo4jRepository<Medicine, Long> {
 
     List<Medicine> findByNameContainingOrPycodeContaining(String name, String pycode);
 
-    @Query("match (n:药品通用名称)<-[r1:药品相关药品通用名称]-(m:药品代码通用名)-[r2:药品相关药品注册名称]->(o:药品注册名称) where n.name={name} return distinct o.name")
+    @Query("match (n:药品通用名称)<-[r1:药品相关药品通用名称]-(m:药品代码通用名)-[r2:药品相关药品注册名称]->(o:药品注册名称)-[r3]->(t) where n.name={name} and type(r3) contains('禁忌') return distinct o.name")
     List<String> findMedRegNamebyMedicine(@Param("name") String name);
 
     Page<Medicine> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);

+ 2 - 0
src/main/java/com/diagbot/repository/NodeInfo.java

@@ -20,4 +20,6 @@ public class NodeInfo {
     String typeval;
     // 匹配类型
     Integer matchtype;
+    // 正则规则
+    private String regex = "";
 }

+ 14 - 31
src/main/java/com/diagbot/repository/PacsNameNode.java

@@ -5,42 +5,12 @@ import com.diagbot.dto.PacsBillNeoDTO;
 import com.diagbot.entity.BaseNodeInfo;
 import com.diagbot.entity.node.*;
 import com.diagbot.entity.relationship.*;
-import com.diagbot.entity.relationship.base.BaseRelation;
-import com.diagbot.entity.node.Allergen;
-import com.diagbot.entity.node.BillConflictItem;
-import com.diagbot.entity.node.ClinicalFinding;
-import com.diagbot.entity.node.ConflictDevice;
-import com.diagbot.entity.node.Disease;
-import com.diagbot.entity.node.Gender;
-import com.diagbot.entity.node.Group;
-import com.diagbot.entity.node.Lis;
-import com.diagbot.entity.node.MedAllergen;
-import com.diagbot.entity.node.OralMedicine;
-import com.diagbot.entity.node.PacsDescribe;
-import com.diagbot.entity.node.PacsName;
-import com.diagbot.entity.node.Vital;
-import com.diagbot.entity.relationship.PacsNameAllergen;
-import com.diagbot.entity.relationship.PacsNameBillConflictItem;
-import com.diagbot.entity.relationship.PacsNameClinicalFinding;
-import com.diagbot.entity.relationship.PacsNameConflictDevice;
-import com.diagbot.entity.relationship.PacsNameDisease;
-import com.diagbot.entity.relationship.PacsNameGender;
-import com.diagbot.entity.relationship.PacsNameGroup;
-import com.diagbot.entity.relationship.PacsNameLis;
-import com.diagbot.entity.relationship.PacsNameMedAllergen;
-import com.diagbot.entity.relationship.PacsNameOralMedicine;
-import com.diagbot.entity.relationship.PacsNamePacsDescribe;
-import com.diagbot.entity.relationship.PacsNameVital;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 @Component
@@ -78,6 +48,19 @@ public class PacsNameNode {
         PacsBillNeoDTO pacsBillNeoDTO = new PacsBillNeoDTO();
         NodeInfo nodeInfo;
 
+        Set<PacsNameNeedlessItem> pacsNameNeedlessItems = pacs.getPacsNameNeedlessItems();
+        for (PacsNameNeedlessItem pacsNameNeedlessItem : pacsNameNeedlessItems) {
+            if (NeoUtil.isExist(pacsNameNeedlessItem)) {
+                if (NeoUtil.isExist(pacsNameNeedlessItem.getNeedlessOrder())) {
+                    nodeInfo = new NodeInfo();
+                    nodeInfo.setName(pacsNameNeedlessItem.getNeedlessOrder().getName());
+                    nodeInfo.setRegex(pacsNameNeedlessItem.getNeedlessOrder().getName());
+                    pacsBillNeoDTO.getNeedlessPacsOrder().add(NeoUtil.updateNodeInfo(nodeInfo));
+                }
+            }
+        }
+
+
 
         PacsNameGender pacsNamegender = pacs.getPacsNameGender();
         if (NeoUtil.isExist(pacsNamegender)) {

+ 13 - 23
src/main/java/com/diagbot/repository/PacsSubNameNode.java

@@ -2,29 +2,8 @@ package com.diagbot.repository;
 
 import com.diagbot.dto.BillNeoDTO;
 import com.diagbot.dto.PacsBillNeoDTO;
-import com.diagbot.entity.node.Allergen;
-import com.diagbot.entity.node.ClinicalFinding;
-import com.diagbot.entity.node.ConflictDevice;
-import com.diagbot.entity.node.Disease;
-import com.diagbot.entity.node.Gender;
-import com.diagbot.entity.node.Group;
-import com.diagbot.entity.node.Lis;
-import com.diagbot.entity.node.MedAllergen;
-import com.diagbot.entity.node.OralMedicine;
-import com.diagbot.entity.node.PacsDescribe;
-import com.diagbot.entity.node.PacsSubName;
-import com.diagbot.entity.node.Vital;
-import com.diagbot.entity.relationship.PacsSubNameAllergen;
-import com.diagbot.entity.relationship.PacsSubNameClinicalFinding;
-import com.diagbot.entity.relationship.PacsSubNameConflictDevice;
-import com.diagbot.entity.relationship.PacsSubNameDisease;
-import com.diagbot.entity.relationship.PacsSubNameGender;
-import com.diagbot.entity.relationship.PacsSubNameGroup;
-import com.diagbot.entity.relationship.PacsSubNameLis;
-import com.diagbot.entity.relationship.PacsSubNameMedAllergen;
-import com.diagbot.entity.relationship.PacsSubNameOralMedicine;
-import com.diagbot.entity.relationship.PacsSubNamePacsDescribe;
-import com.diagbot.entity.relationship.PacsSubNameVital;
+import com.diagbot.entity.node.*;
+import com.diagbot.entity.relationship.*;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -70,6 +49,17 @@ public class PacsSubNameNode {
         PacsBillNeoDTO pacsBillNeoDTO = new PacsBillNeoDTO();
         NodeInfo nodeInfo;
 
+        Set<PacsNameSubNeedlessItem> pacsNameNeedlessItems = pacs.getPacsNameSubNeedlessItems();
+        for (PacsNameSubNeedlessItem pacsNameNeedlessItem : pacsNameNeedlessItems) {
+            if (NeoUtil.isExist(pacsNameNeedlessItem)) {
+                if (NeoUtil.isExist(pacsNameNeedlessItem.getNeedlessOrder())) {
+                    nodeInfo = new NodeInfo();
+                    nodeInfo.setName(pacsNameNeedlessItem.getNeedlessOrder().getName());
+                    nodeInfo.setRegex(pacsNameNeedlessItem.getNeedlessOrder().getName());
+                    pacsBillNeoDTO.getNeedlessPacsOrder().add(NeoUtil.updateNodeInfo(nodeInfo));
+                }
+            }
+        }
 
         PacsSubNameGender pacsSubNameGender = pacs.getPacsSubNameGender();
         if (NeoUtil.isExist(pacsSubNameGender)) {

+ 22 - 10
src/main/java/com/diagbot/repository/TransfusionSuggestNode.java

@@ -1,11 +1,11 @@
 package com.diagbot.repository;
 
 
+import com.diagbot.biz.push.entity.Item;
+import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.dto.OtherTipTransfusionNeoDTO;
 import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.entity.node.TransfusionSuggest;
-import com.diagbot.biz.push.entity.Item;
-import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.entity.relationship.TransfusionSuggestYiBaoDiseaseName;
@@ -128,11 +128,17 @@ public class TransfusionSuggestNode {
 						if (null == otherTipTfNeoDTO) {
 							otherTipTfNeoDTO = new OtherTipTransfusionNeoDTO();
 						}
-						item = new Item();
-						item.setName(surgname);
-						item.setUniqueName(surgname);
 
-						otherTipTfNeoDTO.getOperation().add(item);
+						// 提示医院名称
+						for (Item ope : wordCrfDTO.getOperation()) {
+							if (StringUtil.isNotBlank(ope.getName()) &&
+									surgname.equals(ope.getUniqueName())) {
+								item = new Item();
+								item.setName(ope.getName());
+								item.setUniqueName(surgname);
+								otherTipTfNeoDTO.getOperation().add(item);
+							}
+						}
 					} else {
 						proceed = false;
 						otherTipTfNeoDTO = null;
@@ -146,11 +152,17 @@ public class TransfusionSuggestNode {
 						if (null == otherTipTfNeoDTO) {
 							otherTipTfNeoDTO = new OtherTipTransfusionNeoDTO();
 						}
-						item = new Item();
-						item.setName(disname);
-						item.setUniqueName(disname);
 
-						otherTipTfNeoDTO.getDiag().add(item);
+						// 提示医院名称
+						for (Item diag : wordCrfDTO.getDiag()) {
+							if (StringUtil.isNotBlank(diag.getName()) &&
+									disname.equals(diag.getUniqueName())) {
+								item = new Item();
+								item.setName(diag.getName());
+								item.setUniqueName(disname);
+								otherTipTfNeoDTO.getDiag().add(item);
+							}
+						}
 					} else {
 						otherTipTfNeoDTO = null;
 					}

+ 14 - 0
src/main/java/com/diagbot/repository/YiBaoDiseaseNameRepository.java

@@ -25,14 +25,28 @@ public interface YiBaoDiseaseNameRepository extends Neo4jRepository<YiBaoDisease
             "AND (toLower(n.`name`) = toLower($name)  OR  toLower(n.`拼音编码`) = toLower($pycode))\n" +
             "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION\n" +
+            "MATCH (n:`医保疾病名称`)-[r:`医保疾病名称相关医保ICD_10代码`]-(m:医保ICD_10代码) WHERE n.`静态知识标识` = $isKL \n" +
+            "AND toLower(m.`name`) = toLower($name)\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
+            "UNION\n" +
             "MATCH (n:`医保疾病名称`) WHERE n.`静态知识标识` = $isKL \n" +
             "AND (toLower(n.`name`) STARTS WITH toLower($name) OR toLower(n.`拼音编码`) STARTS WITH toLower($pycode))\n" +
             "WITH n SKIP 0 LIMIT $size\n" +
             "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
             "UNION \n" +
+            "MATCH (n:`医保疾病名称`)-[r:`医保疾病名称相关医保ICD_10代码`]-(m:医保ICD_10代码) WHERE n.`静态知识标识` = $isKL \n" +
+            "AND toLower(m.`name`) STARTS WITH toLower($name) \n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n" +
+            "UNION \n" +
             "MATCH (n:`医保疾病名称`) WHERE n.`静态知识标识` = $isKL  \n" +
             "AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  \n" +
             "WITH n SKIP 0 LIMIT $size\n" +
+            "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n"+
+            "UNION \n" +
+            "MATCH (n:`医保疾病名称`)-[r:`医保疾病名称相关医保ICD_10代码`]-(m:医保ICD_10代码) WHERE n.`静态知识标识` = $isKL \n" +
+            "AND toLower(m.`name`) CONTAINS toLower($name)   \n" +
+            "WITH n SKIP 0 LIMIT $size\n" +
             "RETURN n,[ (n)-[r]->(m) | [ r, m ] ], ID(n)\n")
     List<YiBaoDiseaseName> staticKnowledgeIndex(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 

+ 117 - 1
src/main/java/com/diagbot/rule/CommonRule.java

@@ -28,6 +28,8 @@ import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
 /**
@@ -109,6 +111,95 @@ public class CommonRule {
         }
     }
 
+    /**
+     * 无需重复开单项
+     *
+     * @param wordCrfDTO
+     * @param billNeoMaxDTO
+     * @param billMsgList
+     */
+    public void needlessRepeatOrder(WordCrfDTO wordCrfDTO, BillNeoMaxDTO billNeoMaxDTO, List<BillMsg> billMsgList) {
+        List<NodeNeoDTO> needlessPacsOrder = billNeoMaxDTO.getNeedlessPacsOrder();
+        String orderStandName = billNeoMaxDTO.getOrderStandName();
+        for (NodeNeoDTO nodeNeoDTO : needlessPacsOrder) {
+            Map<String, List<Pacs>> map = EntityUtil.makeEntityListMap(wordCrfDTO.getPacs(), "uniqueName");
+            List<Pacs> pacsList = map.get(orderStandName);
+            if (ListUtil.isNotEmpty(pacsList)) {
+                sortByProperty(pacsList, "dateValue");
+                Pacs pacs = pacsList.get(pacsList.size() - 1);
+                String result = pacs.getResult();
+                if (StringUtil.isNotBlank(result) && StringUtil.isNotBlank(nodeNeoDTO.getRegex())
+                        && getRegexRes(result, nodeNeoDTO.getRegex())) {
+                    String dateValue = pacs.getDateValue(); // 结果日期
+                    String orderDateValue = billNeoMaxDTO.getDateValue(); // 开单项日期
+                    if (StringUtil.isNotBlank(dateValue) && StringUtil.isNotBlank(orderDateValue)) {
+                        Date dateValueDate = CatalogueUtil.parseStringDate(dateValue);
+                        Date orderDateValueDate = CatalogueUtil.parseStringDate(orderDateValue);
+                        if (dateValueDate != null && orderDateValueDate != null) {
+                            if (!CatalogueUtil.compareTime(dateValueDate, orderDateValueDate, 60L * 24 * 7)) {
+                                BillMsg commonBillMsg = MsgUtil.getNeedlessRepeatOrderMsg(
+                                        billNeoMaxDTO.getOrderName(), billNeoMaxDTO.getOrderStandName(),
+                                        pacs.getName(), billNeoMaxDTO.getType());
+                                billMsgList.add(commonBillMsg);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    /**
+     * 是否有符合的数据(公共方法)
+     *
+     * @param content 文本内容
+     * @param regex   表达式
+     * @return
+     */
+    public Boolean getRegexRes(String content, String regex) {
+        // 是否有符合的数据
+        try {
+            if (StringUtil.isBlank(content) || StringUtil.isBlank(regex)) {
+                return false;
+            }
+            Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
+            Matcher matcher = pattern.matcher(content);
+            if (matcher.find()) {
+                return true;
+            }
+        } catch (Exception e) {
+            return false;
+        }
+        return false;
+    }
+
+    /**
+     * 根据指定字段按照字符串排序
+     *
+     * @param tList
+     * @param property
+     * @param <T>
+     */
+    public <T> void sortByProperty(List<T> tList, String property) {
+        if (ListUtil.isNotEmpty(tList) && tList.size() > 1) {
+            // items 按照时间排序
+            Collections.sort(tList, new Comparator<T>() {
+                @Override
+                public int compare(T o1, T o2) {
+                    String o1Str = (String) CoreUtil.getFieldValue(o1, property);
+                    String o2Str = (String) CoreUtil.getFieldValue(o2, property);
+                    if (StringUtil.isBlank(o1Str)) {
+                        return -1;
+                    }
+                    if (StringUtil.isBlank(o2Str)) {
+                        return 1;
+                    }
+                    return o1Str.compareTo(o2Str);
+                }
+            });
+        }
+    }
+
     /**
      * 24小时重复开单总入口
      *
@@ -206,7 +297,7 @@ public class CommonRule {
                                 if (!CatalogueUtil.compareTime(last, cur, 60L * 24)) {
                                     String name = (String) CoreUtil.getFieldValue(it, "name");
                                     String uniqueName = (String) CoreUtil.getFieldValue(it, "uniqueName");
-                                    BillMsg commonBillMsg = MsgUtil.getBillMsg24Repeat(
+                                    BillMsg commonBillMsg = MsgUtil.getBill24RepeatMsg(
                                             name, uniqueName, name, type);
                                     billMsgList.add(commonBillMsg);
                                     break;
@@ -285,4 +376,29 @@ public class CommonRule {
         return drugAllergyAll;
     }
 
+    public static void main(String[] args) {
+        List<Pacs> pacsList = new ArrayList<>();
+        Pacs pacs = new Pacs();
+        pacs.setName("d1");
+        pacs.setDateValue("2020-01-01");
+        pacsList.add(pacs);
+
+        Pacs pacs1 = new Pacs();
+        pacs1.setName("d2");
+        pacs1.setDateValue("2020-01-07");
+        pacsList.add(pacs1);
+
+        Pacs pacs3 = new Pacs();
+        pacs3.setName("d3");
+        pacs3.setDateValue("2020-01-09");
+        pacsList.add(pacs3);
+        CommonRule commonRule = new CommonRule();
+        commonRule.sortByProperty(pacsList, "dateValue");
+        for (Pacs bean : pacsList) {
+            System.out.println(bean.getName());
+        }
+
+
+    }
+
 }

+ 18 - 8
src/main/java/com/diagbot/rule/DrugRule.java

@@ -3,7 +3,9 @@ package com.diagbot.rule;
 import com.diagbot.dto.BillMsg;
 import com.diagbot.dto.BillNeoMaxDTO;
 import com.diagbot.dto.NodeNeoDTO;
+import com.diagbot.enums.NeoEnum;
 import com.diagbot.enums.RedisEnum;
+import com.diagbot.enums.TypeEnum;
 import com.diagbot.util.CoreUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.MsgUtil;
@@ -60,16 +62,24 @@ public class DrugRule {
             }
             if (old_stand.size() > 0) {
                 for (Map.Entry<String, String> d : old_stand.entrySet()) {
-                    String message = "";
-                    if ("禁忌过敏药品".equals(type)) {
-                        message = d.getKey() + "过敏";
+                    if (NeoEnum.oralmeds.getName().equals(type) && TypeEnum.lis.getName().equals(billNeoMaxDTO.getType())) {
+                        // 化验开单项 + 服用药品的提示规则
+                        BillMsg lisOrderMsg = MsgUtil.getBillLisOrderMsg(
+                                billNeoMaxDTO.getOrderName(), billNeoMaxDTO.getOrderStandName(),
+                                d.getKey(), type);
+                        billMsgList.add(lisOrderMsg);
                     } else {
-                        message = "可能正在用药" + d.getKey();
+                        String message = "";
+                        if ("禁忌过敏药品".equals(type)) {
+                            message = d.getKey() + "过敏";
+                        } else {
+                            message = "可能正在用药" + d.getKey();
+                        }
+                        BillMsg commonBillMsg = MsgUtil.getCommonBillMsg(
+                                billNeoMaxDTO.getOrderName(), billNeoMaxDTO.getOrderStandName(),
+                                message, type, billNeoMaxDTO.getType());
+                        billMsgList.add(commonBillMsg);
                     }
-                    BillMsg commonBillMsg = MsgUtil.getCommonBillMsg(
-                            billNeoMaxDTO.getOrderName(), billNeoMaxDTO.getOrderStandName(),
-                            message, type, billNeoMaxDTO.getType());
-                    billMsgList.add(commonBillMsg);
                 }
             }
         }

+ 49 - 3
src/main/java/com/diagbot/util/MsgUtil.java

@@ -1,5 +1,7 @@
 package com.diagbot.util;
+
 import com.diagbot.dto.BillMsg;
+import com.diagbot.dto.OtherTipNeoDTO;
 import com.diagbot.enums.NeoEnum;
 import com.diagbot.enums.TypeEnum;
 
@@ -93,6 +95,26 @@ public class MsgUtil {
         return billMsg;
     }
 
+    /**
+     * 开单合理性通用提示信息
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getBillLisOrderMsg(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;
+    }
+
     /**
      * 开单合理性——互斥提示信息
      *
@@ -135,21 +157,24 @@ public class MsgUtil {
      * @param content
      * @param name
      * @param type
+     * @param otherTipNeoDTO
      * @return
      */
-    public static BillMsg getCommonOtherTipLisMsg(String content, String name, String type) {
+    public static BillMsg getCommonOtherTipLisMsg(String content, String name, String type, OtherTipNeoDTO otherTipNeoDTO) {
         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);
+            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);
+        billMsg.setOrderName(otherTipNeoDTO.getName());
+        billMsg.setOrderDetailName(otherTipNeoDTO.getDetailName());
         return billMsg;
     }
 
@@ -190,7 +215,7 @@ public class MsgUtil {
      * @param type 类型
      * @return
      */
-    public static BillMsg getBillMsg24Repeat(String orderName, String orderStandName, String content, String type) {
+    public static BillMsg getBill24RepeatMsg(String orderName, String orderStandName, String content, String type) {
         BillMsg billMsg = new BillMsg();
         String msg = String.format("%s重复开立", orderName);
         billMsg.setMsg(msg);
@@ -201,6 +226,27 @@ public class MsgUtil {
         return billMsg;
     }
 
+    /**
+     * 无需重复辅检开单项
+     *
+     * @param orderName 原开单项
+     * @param orderStandName 标准开单项
+     * @param content 匹配内容
+     * @param type 类型
+     * @return
+     */
+    public static BillMsg getNeedlessRepeatOrderMsg(String orderName, String orderStandName, String content, String type) {
+        BillMsg billMsg = new BillMsg();
+        String msg = String.format("重复开立:该患者近期做过%s,且结果无异常", content);
+        billMsg.setMsg(msg);
+        billMsg.setOrderName(orderName);
+        billMsg.setOrderStandName(orderStandName);
+        billMsg.setContent(content);
+        billMsg.setType(type);
+        return billMsg;
+    }
+
+
     /**
      * 开单合理性禁忌医疗器械及物品提示信息
      *

+ 2 - 2
src/main/java/com/diagbot/util/NeoUtil.java

@@ -3,7 +3,6 @@ package com.diagbot.util;
 import com.alibaba.fastjson.JSONObject;
 import com.diagbot.dto.NodeNeoDTO;
 import com.diagbot.dto.PushBaseDTO;
-import com.diagbot.entity.node.Vital;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.base.BaseNode;
 import com.diagbot.entity.relationship.YiBaoDiseaseNameLisBigName;
@@ -14,7 +13,6 @@ import com.diagbot.entity.relationship.base.BaseRelation;
 import com.diagbot.model.entity.PD;
 import com.diagbot.repository.Constants;
 import com.diagbot.repository.NodeInfo;
-import com.diagbot.repository.datautil;
 import org.apache.commons.lang3.StringUtils;
 
 import java.math.BigDecimal;
@@ -33,6 +31,8 @@ public class NeoUtil {
 //        name = datautil.removekey(name, Constants.conflict);
         nodeNeoDTO.setName(name);
 
+        nodeNeoDTO.setRegex(nodeInfo.getRegex());
+
         BigDecimal min = nodeInfo.getMinval();
         if (null!=min) {
             nodeNeoDTO.setMin(min);

+ 4 - 0
src/main/java/com/diagbot/vo/TestIndicationVO.java

@@ -248,4 +248,8 @@ public class TestIndicationVO implements Serializable {
 
     @Excel(name="状态")
     private String status;
+    @Excel(name="辅助检查名称")
+    private String pacsOrderName;
+    @Excel(name="正常规则")
+    private String ruleContent;
 }

+ 8 - 0
src/main/java/com/diagbot/web/TestController.java

@@ -146,6 +146,14 @@ public class TestController {
         return RespDTO.onSuc(testFacade.testHighRiskProcess(file, testLineVO));
     }
 
+    @ApiOperation(value = "检查结果与项目重复开立规则测试API[zhoutg]",
+            notes = "idNum:指定行测试<br>" +
+                    "sheetIndex:sheet的下标,默认为0,表示第一个sheet")
+    @PostMapping("/testPacsOrderNeedlessProcess")
+    public RespDTO<Map<String, Object>> testPacsOrderNeedlessProcess(@RequestParam("file") MultipartFile file, TestLineVO testLineVO) {
+        return RespDTO.onSuc(testFacade.testPacsOrderNeedlessProcess(file, testLineVO));
+    }
+
     @ApiOperation(value = "批量测试[zhoutg]", notes = "参数:目录所在路径,示例:D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据")
     @PostMapping("/testAll")
     public RespDTO<Map<String, Object>> testAll(TestAllVO testAllVO) {

+ 2 - 2
src/main/resources/application-dev.yml

@@ -47,7 +47,7 @@ spring:
       # 初始化大小,最小,最大
       initialSize: 5
       minIdle: 5
-      maxActive: 20
+      maxActive: 100
       # 配置获取连接等待超时的时间
       maxWait: 60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -141,7 +141,7 @@ mybatis-plus:
 
 io.github.lvyahui8.spring:
   base-packages: com.diagbot.aggregate
-  thread-number: 12
+  thread-number: 200
 
 swagger:
   enable: true

+ 2 - 2
src/main/resources/application-local.yml

@@ -47,7 +47,7 @@ spring:
       # 初始化大小,最小,最大
       initialSize: 5
       minIdle: 5
-      maxActive: 20
+      maxActive: 100
       # 配置获取连接等待超时的时间
       maxWait: 60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -141,7 +141,7 @@ mybatis-plus:
 
 io.github.lvyahui8.spring:
   base-packages: com.diagbot.aggregate
-  thread-number: 12
+  thread-number: 200
 
 swagger:
   enable: true

+ 2 - 2
src/main/resources/application-pre.yml

@@ -47,7 +47,7 @@ spring:
       # 初始化大小,最小,最大
       initialSize: 5
       minIdle: 5
-      maxActive: 20
+      maxActive: 100
       # 配置获取连接等待超时的时间
       maxWait: 60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -141,7 +141,7 @@ mybatis-plus:
 
 io.github.lvyahui8.spring:
   base-packages: com.diagbot.aggregate
-  thread-number: 12
+  thread-number: 200
 
 swagger:
   enable: true

+ 2 - 2
src/main/resources/application-pro.yml

@@ -47,7 +47,7 @@ spring:
       # 初始化大小,最小,最大
       initialSize: 5
       minIdle: 5
-      maxActive: 20
+      maxActive: 100
       # 配置获取连接等待超时的时间
       maxWait: 60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -143,7 +143,7 @@ mybatis-plus:
 
 io.github.lvyahui8.spring:
   base-packages: com.diagbot.aggregate
-  thread-number: 12
+  thread-number: 200
 
 swagger:
   enable: true

+ 2 - 2
src/main/resources/application-test.yml

@@ -47,7 +47,7 @@ spring:
       # 初始化大小,最小,最大
       initialSize: 5
       minIdle: 5
-      maxActive: 20
+      maxActive: 100
       # 配置获取连接等待超时的时间
       maxWait: 60000
       # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
@@ -141,7 +141,7 @@ mybatis-plus:
 
 io.github.lvyahui8.spring:
   base-packages: com.diagbot.aggregate
-  thread-number: 12
+  thread-number: 200
 
 swagger:
   enable: true

+ 1 - 1
src/main/resources/logback-spring.xml

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

+ 1 - 0
src/main/resources/mapper/GraphDiseaseCorrespondingMapper.xml

@@ -7,6 +7,7 @@
         <id column="id" property="id" />
         <result column="diag_pingan" property="diagPingan" />
         <result column="diag_icd" property="diagIcd" />
+        <result column="high_risk_sign" property="highRiskSign" />
     </resultMap>
 
 </mapper>