瀏覽代碼

Merge branch 'master' into innerDevelop

gaodm 4 年之前
父節點
當前提交
205f68877b
共有 58 個文件被更改,包括 1317 次插入420 次删除
  1. 6 10
      pom.xml
  2. 114 0
      src/main/java/com/diagbot/aggregate/IndicationTestAggregate.java
  3. 3 4
      src/main/java/com/diagbot/config/CacheDeleteInit.java
  4. 5 0
      src/main/java/com/diagbot/dto/PushPlanDTO.java
  5. 3 1
      src/main/java/com/diagbot/dto/PushPlanDetailDTO.java
  6. 134 0
      src/main/java/com/diagbot/entity/FollowupPlanMapping.java
  7. 34 0
      src/main/java/com/diagbot/entity/node/Age.java
  8. 3 0
      src/main/java/com/diagbot/entity/node/Disease.java
  9. 3 0
      src/main/java/com/diagbot/entity/node/Group.java
  10. 3 0
      src/main/java/com/diagbot/entity/node/MedAllergen.java
  11. 1 0
      src/main/java/com/diagbot/entity/node/MedRegName.java
  12. 12 0
      src/main/java/com/diagbot/entity/node/Medicine.java
  13. 3 1
      src/main/java/com/diagbot/entity/node/YiBaoDiseaseName.java
  14. 7 0
      src/main/java/com/diagbot/entity/node/base/BaseNode.java
  15. 1 1
      src/main/java/com/diagbot/enums/RedisEnum.java
  16. 8 8
      src/main/java/com/diagbot/enums/StandConvertEnum.java
  17. 20 10
      src/main/java/com/diagbot/facade/CacheFacade.java
  18. 2 2
      src/main/java/com/diagbot/facade/EntityFacade.java
  19. 27 4
      src/main/java/com/diagbot/facade/FollowupPlanInfoFacade.java
  20. 13 0
      src/main/java/com/diagbot/facade/FollowupPlanMappingFacade.java
  21. 2 2
      src/main/java/com/diagbot/facade/HighRiskFacade.java
  22. 76 67
      src/main/java/com/diagbot/facade/NeoFacade.java
  23. 16 0
      src/main/java/com/diagbot/facade/PushFacade.java
  24. 42 34
      src/main/java/com/diagbot/facade/RetrievalFacade.java
  25. 19 0
      src/main/java/com/diagbot/facade/StaticKnowledgeFacade.java
  26. 307 127
      src/main/java/com/diagbot/facade/TestFacade.java
  27. 16 0
      src/main/java/com/diagbot/mapper/FollowupPlanMappingMapper.java
  28. 32 3
      src/main/java/com/diagbot/repository/BaseNodeRepository.java
  29. 5 10
      src/main/java/com/diagbot/repository/DeptNode.java
  30. 4 1
      src/main/java/com/diagbot/repository/DeptRepository.java
  31. 5 6
      src/main/java/com/diagbot/repository/LisNameNode.java
  32. 7 5
      src/main/java/com/diagbot/repository/LisNameRepository.java
  33. 5 7
      src/main/java/com/diagbot/repository/LisSetNode.java
  34. 8 3
      src/main/java/com/diagbot/repository/LisSetRepository.java
  35. 8 3
      src/main/java/com/diagbot/repository/MedRegNameNode.java
  36. 69 11
      src/main/java/com/diagbot/repository/MedicineNode.java
  37. 10 0
      src/main/java/com/diagbot/repository/MedicineRepository.java
  38. 7 7
      src/main/java/com/diagbot/repository/PacsNameNode.java
  39. 11 0
      src/main/java/com/diagbot/repository/PacsNameRepository.java
  40. 2 0
      src/main/java/com/diagbot/repository/SymptomNameRepository.java
  41. 6 6
      src/main/java/com/diagbot/repository/YiBaoDiseaseNode.java
  42. 10 0
      src/main/java/com/diagbot/repository/YiBaoDiseaseRepository.java
  43. 74 71
      src/main/java/com/diagbot/repository/YiBaoOperationNameNode.java
  44. 10 0
      src/main/java/com/diagbot/repository/YiBaoOperationNameRepository.java
  45. 16 0
      src/main/java/com/diagbot/service/FollowupPlanMappingService.java
  46. 20 0
      src/main/java/com/diagbot/service/impl/FollowupPlanMappingServiceImpl.java
  47. 18 0
      src/main/java/com/diagbot/util/NeoUtil.java
  48. 21 2
      src/main/java/com/diagbot/util/RedisUtil.java
  49. 32 7
      src/main/java/com/diagbot/util/StringUtil.java
  50. 9 1
      src/main/java/com/diagbot/vo/StaticKnowledgeIndexVO.java
  51. 19 0
      src/main/java/com/diagbot/vo/TestAllVO.java
  52. 3 0
      src/main/java/com/diagbot/vo/TestLineVO.java
  53. 1 1
      src/main/java/com/diagbot/web/CacheController.java
  54. 1 1
      src/main/java/com/diagbot/web/Cn2SpellController.java
  55. 1 1
      src/main/java/com/diagbot/web/StaticKnowledgeController.java
  56. 4 3
      src/main/java/com/diagbot/web/TestController.java
  57. 2 0
      src/main/resources/logback-spring.xml
  58. 17 0
      src/main/resources/mapper/FollowupPlanMappingMapper.xml

+ 6 - 10
pom.xml

@@ -194,22 +194,18 @@
             <artifactId>spring-boot-starter-data-neo4j</artifactId>
         </dependency>
 
-
-        <dependency>
-            <groupId>org.neo4j</groupId>
-            <artifactId>neo4j-ogm-core</artifactId>
-            <version>3.2.2</version>
-            <scope>compile</scope>
-        </dependency>
-
+        <!--<dependency>-->
+            <!--<groupId>org.neo4j</groupId>-->
+            <!--<artifactId>neo4j-ogm-core</artifactId>-->
+            <!--<version>3.2.2</version>-->
+            <!--<scope>compile</scope>-->
+        <!--</dependency>-->
 
         <dependency>
             <groupId>org.neo4j</groupId>
             <artifactId>neo4j-ogm-http-driver</artifactId>
-            <version>3.2.11</version>
         </dependency>
 
-
         <!-- 文件上传相关�?? -->
         <dependency>
             <groupId>commons-beanutils</groupId>

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

@@ -0,0 +1,114 @@
+package com.diagbot.aggregate;
+
+import com.diagbot.facade.TestFacade;
+import com.diagbot.vo.TestLineVO;
+import io.github.lvyahui8.spring.annotation.DataConsumer;
+import io.github.lvyahui8.spring.annotation.DataProvider;
+import io.github.lvyahui8.spring.annotation.InvokeParameter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+/**
+ * @Description: 提醒类聚合
+ * @author: zhoutg
+ * @time: 2019/10/16 13:37
+ */
+@Component
+@Slf4j
+public class IndicationTestAggregate {
+
+    @Autowired
+    TestFacade testFacade;
+
+    @DataProvider("testAll")
+    public Map<String, Map<String, Object>> testAll(
+            @InvokeParameter("mapPath") Map<String, String> mapPath,
+            @DataConsumer("t1") Map<String, Map<String, Object>> t1Map,
+            @DataConsumer("t2") Map<String, Map<String, Object>> t2Map,
+            @DataConsumer("t3") Map<String, Map<String, Object>> t3Map,
+            @DataConsumer("t4") Map<String, Map<String, Object>> t4Map) {
+        Map<String, Map<String, Object>> map = new LinkedHashMap<>();
+        if (t1Map != null) {
+            map.putAll(t1Map);
+        }
+        if (t2Map != null) {
+            map.putAll(t2Map);
+        }
+        if (t3Map != null) {
+            map.putAll(t3Map);
+        }
+        if (t4Map != null) {
+            map.putAll(t4Map);
+        }
+        return map;
+    }
+
+    @DataProvider("t1")
+    public Map<String, Object> t1(@InvokeParameter("mapPath") Map<String, String> mapPath) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        MultipartFile file = null;
+
+        file = testFacade.getMulFileByPath(mapPath.get("【开单合理性_输血】"));
+        Map<String, Object> billTransfusionMap = testFacade.testIndicationTransfusion(file, new TestLineVO());
+        map.put("【开单合理性_输血】",billTransfusionMap);
+
+        file = testFacade.getMulFileByPath(mapPath.get("【危急值_化验】"));
+        Map<String, Object> criticalMapLis = testFacade.importCriticalLisExcel(file, new TestLineVO());
+        map.put("【危急值_化验】",criticalMapLis);
+
+        file = testFacade.getMulFileByPath(mapPath.get("【危急值_辅检】"));
+        Map<String, Object> criticalMapPacs = testFacade.importCriticalPacsExcel(file, new TestLineVO());
+        map.put("【危急值_辅检】",criticalMapPacs);
+
+        return map;
+    }
+
+    @DataProvider("t2")
+    public Map<String, Object> t2(@InvokeParameter("mapPath") Map<String, String> mapPath) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        MultipartFile file = testFacade.getMulFileByPath(mapPath.get("【高危药品】"));
+        Map<String, Object> highDrugMap = testFacade.testHighRiskDrugExcel(file, new TestLineVO());
+        map.put("【高危药品】",highDrugMap);
+        return map;
+    }
+
+    @DataProvider("t3")
+    public Map<String, Object> t3(@InvokeParameter("mapPath") Map<String, String> mapPath) {
+        Map<String, Object> map = new LinkedHashMap<>();
+
+        MultipartFile file = testFacade.getMulFileByPath(mapPath.get("【高危手术】"));
+        Map<String, Object> highOperationMap = testFacade.testHighRiskOperationExcel(file, new TestLineVO());
+        map.put("【高危手术】",highOperationMap);
+        return map;
+    }
+
+    @DataProvider("t4")
+    public Map<String, Object> t4(@InvokeParameter("mapPath") Map<String, String> mapPath) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        MultipartFile file = null;
+        file = testFacade.getMulFileByPath(mapPath.get("【开单合理性】"));
+        TestLineVO testLineVO = new TestLineVO();
+        testLineVO.setGetOne(true);
+        Map<String, Object> billMap = testFacade.importExcel(file, testLineVO);
+        map.put("【开单合理性】",billMap);
+
+        file = testFacade.getMulFileByPath(mapPath.get("【其他值提醒_化验】"));
+        Map<String, Object> otherLisMap = testFacade.testOtherTipLis(file, new TestLineVO());
+        map.put("【其他值提醒_化验】",otherLisMap);
+
+        file = testFacade.getMulFileByPath(mapPath.get("【其他值提醒_辅检】"));
+        Map<String, Object> otherPacsMap = testFacade.testOtherTipPacs(file, new TestLineVO());
+        map.put("【其他值提醒_辅检】",otherPacsMap);
+
+        file = testFacade.getMulFileByPath(mapPath.get("【其他值提醒_输血】"));
+        Map<String, Object> otherTransfusionMap = testFacade.testOtherTipTransfusion(file, new TestLineVO());
+        map.put("【其他值提醒_输血】",otherTransfusionMap);
+
+        return map;
+    }
+}

+ 3 - 4
src/main/java/com/diagbot/config/CacheDeleteInit.java

@@ -27,11 +27,10 @@ public class CacheDeleteInit implements CommandLineRunner {
     public void run(String... args) throws Exception {
         // 服务启动清除redis缓存
         cacheFacade.clear();
-        cacheFacade.clearLoadCache();
         log.info("CDSS-CORE服务启动清除redis缓存成功!");
-        //
-        neoFacade.getDrugCache();
-        log.info("CDSS-CORE服务启动加载药品缓存成功!");
+
+        cacheFacade.loadDrugTypeCache();
+        log.info("CDSS-CORE服务启动加载药品类型对应关系缓存成功!");
 
         neoFacade.getSymptomCache();
         log.info("CDSS-CORE服务启动加载图谱症状缓存成功!");

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

@@ -4,7 +4,9 @@ import lombok.Getter;
 import lombok.Setter;
 
 import java.util.ArrayList;
+import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @Description: 检验检查计划出参
@@ -14,5 +16,8 @@ import java.util.List;
 @Getter
 @Setter
 public class PushPlanDTO {
+    // 随访计划信息
     private List<PushPlansDTO> pushPlans = new ArrayList<>();
+    // 记录调试信息
+    private Map<String, Object> debug = new LinkedHashMap<>();
 }

+ 3 - 1
src/main/java/com/diagbot/dto/PushPlanDetailDTO.java

@@ -21,8 +21,10 @@ public class PushPlanDetailDTO {
     private Date examineDate;
     //描述
     private String description;
+    //是否历史数据
+    private Integer history;
     //检验
     private List<String> lis = new ArrayList<>();
     //检查
     private List<String> pacs = new ArrayList<>();
-}
+}

+ 134 - 0
src/main/java/com/diagbot/entity/FollowupPlanMapping.java

@@ -0,0 +1,134 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 手术随访计划映射表
+ * </p>
+ *
+ * @author zhaops
+ * @since 2020-09-24
+ */
+@TableName("tran_followup_plan_mapping")
+public class FollowupPlanMapping implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 手术分类名称
+     */
+    private String operationName;
+
+    /**
+     * 随访手术名称
+     */
+    private String standardName;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+    public String getOperationName() {
+        return operationName;
+    }
+
+    public void setOperationName(String operationName) {
+        this.operationName = operationName;
+    }
+    public String getStandardName() {
+        return standardName;
+    }
+
+    public void setStandardName(String standardName) {
+        this.standardName = standardName;
+    }
+
+    @Override
+    public String toString() {
+        return "FollowupPlanMapping{" +
+            "id=" + id +
+            ", isDeleted=" + isDeleted +
+            ", gmtCreate=" + gmtCreate +
+            ", gmtModified=" + gmtModified +
+            ", creator=" + creator +
+            ", modifier=" + modifier +
+            ", operationName=" + operationName +
+            ", standardName=" + standardName +
+        "}";
+    }
+}

+ 34 - 0
src/main/java/com/diagbot/entity/node/Age.java

@@ -0,0 +1,34 @@
+package com.diagbot.entity.node;
+
+import com.diagbot.biz.push.entity.Pacs;
+import com.diagbot.entity.node.base.BaseNode;
+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.HashSet;
+import java.util.Set;
+
+@Setter
+@Getter
+@NodeEntity(label = "年龄")
+public class Age extends BaseNode  {
+
+	@Property(name = "最小值")
+	private Double minval;
+
+	@Property(name = "最大值")
+	private Double maxval;
+
+	@Property(name = "范围")
+	private Integer range;
+
+	@Property(name = "名称")
+	private String termname;
+
+	@Relationship(type = "药品通用名称禁忌年龄", direction = Relationship.INCOMING)
+	private Set<Medicine> medicines = new HashSet<>();
+
+}

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

@@ -31,4 +31,7 @@ public class Disease extends BaseNode  {
 	@Relationship(type = "辅助检查子项目名称禁忌疾病", direction = Relationship.INCOMING)
 	private Set<PacsSubName> pacssubnames = new HashSet<>();
 
+	@Relationship(type = "药品通用名称禁忌疾病", direction = Relationship.INCOMING)
+	private Set<Medicine> medicines = new HashSet<>();
+
 }

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

@@ -34,4 +34,7 @@ public class Group extends BaseNode  {
 	@Relationship(type = "辅助检查子项目名称禁忌禁忌人群", direction = Relationship.INCOMING)
 	private Set<PacsSubName> pacssubnames = new HashSet<>();
 
+	@Relationship(type = "药品通用名称禁忌禁忌人群", direction = Relationship.INCOMING)
+	private Set<Medicine> medicines = new HashSet<>();
+
 }

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

@@ -31,4 +31,7 @@ public class MedAllergen extends BaseNode  {
 	@Relationship(type = "联合项目禁忌药物过敏原", direction = Relationship.INCOMING)
 	private Set<CombiOperation> combioperations = new HashSet<>();
 
+	@Relationship(type = "药品通用名称禁忌药物过敏原", direction = Relationship.INCOMING)
+	private Set<Medicine> medicines = new HashSet<>();
+
 }

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

@@ -21,4 +21,5 @@ public class MedRegName extends BaseNode  {
 	@Relationship(type = "药品相关药品注册名称", direction = Relationship.INCOMING)
 	private Set<MedCodeName> medcodenames = new HashSet<>();
 
+
 }

+ 12 - 0
src/main/java/com/diagbot/entity/node/Medicine.java

@@ -21,5 +21,17 @@ public class Medicine extends BaseNode  {
 	@Relationship(type = "化验提醒指标相关药品通用名称", direction = Relationship.INCOMING)
 	private Set<LisRemind> lisreminds = new HashSet<>();
 
+	@Relationship(type = "药品通用名称禁忌禁忌人群", direction = Relationship.OUTGOING)
+	private Set<Group> group = new HashSet<>();
+
+	@Relationship(type = "药品通用名称禁忌年龄", direction = Relationship.OUTGOING)
+	private Set<Age> age = new HashSet<>();
+
+	@Relationship(type = "药品通用名称禁忌疾病", direction = Relationship.OUTGOING)
+	private Set<Disease> disease = new HashSet<>();
+
+	@Relationship(type = "药品通用名称禁忌药物过敏原", direction = Relationship.OUTGOING)
+	private Set<MedAllergen> medAllergens = new HashSet<>();
+
 
 }

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

@@ -17,6 +17,8 @@ public class YiBaoDiseaseName extends BaseNode  {
 
 	@Property(name = "性别")
 	private String gender;
+	@Property(name = "年龄")
+	private String age;
 
 	@Relationship(type = "医保疾病名称相关医保ICD-10代码", direction = Relationship.OUTGOING)
 	private Set<YiBaoICD_10Code> yibaoicd_10codes = new HashSet<>();
@@ -33,7 +35,7 @@ public class YiBaoDiseaseName extends BaseNode  {
 	@Relationship(type = "医保疾病名称相关症状", direction = Relationship.OUTGOING)
 	private Set<Symptom> symptoms = new HashSet<>();
 
-	@Relationship(type = "体征相关医保疾病名称", direction = Relationship.INCOMING)
+	@Relationship(type = "医保疾病名称相关体征", direction = Relationship.OUTGOING)
 	private Set<Vital> vitals = new HashSet<>();
 
 	@Relationship(type = "实验室检查相关医保疾病名称", direction = Relationship.INCOMING)

+ 7 - 0
src/main/java/com/diagbot/entity/node/base/BaseNode.java

@@ -30,4 +30,11 @@ public class BaseNode implements Serializable {
     @Property(name = "拼音编码")
     private String pycode;
 
+    @Property(name = "静态知识")
+    private String knowledge;
+
+    // 静态知识标识, 0:没有静态知识, 1:有静态知识
+    @Property(name = "静态知识标识")
+    private Integer is_kl;
+
 }

+ 1 - 1
src/main/java/com/diagbot/enums/RedisEnum.java

@@ -11,7 +11,7 @@ import lombok.Setter;
 
 public enum RedisEnum implements KeyedNamed {
 
-    drugType(1, "药品分类_");
+    drugType(1, "drugType:");
 
     @Setter
     private int key;

+ 8 - 8
src/main/java/com/diagbot/enums/StandConvertEnum.java

@@ -11,14 +11,14 @@ import lombok.Setter;
 
 public enum StandConvertEnum implements KeyedNamed {
 
-    lis(1, "lis"),
-    pacs(2, "pacs"),
-    disease(3, "disease"),
-    drug(4, "drug"),
-    symptom(5, "symptom"),
-    operation(6, "operation"),
-    vital(7, "vital"),
-    transfusion(8, "transfusion");
+    lis(1, "lisConv:"),
+    pacs(2, "pacsConv:"),
+    disease(3, "diseaseConv:"),
+    drug(4, "drugConv:"),
+    symptom(5, "symptomConv:"),
+    operation(6, "operationConv:"),
+    vital(7, "vitalConv:"),
+    transfusion(8, "transfusionConv:");
 
     @Setter
     private int key;

+ 20 - 10
src/main/java/com/diagbot/facade/CacheFacade.java

@@ -17,6 +17,8 @@ public class CacheFacade {
 
     @Autowired
     RedisUtil redisUtil;
+    @Autowired
+    NeoFacade neoFacade;
 
     /**
      * 清除缓存信息
@@ -34,22 +36,30 @@ public class CacheFacade {
      * @return
      */
     public void clearStandConvert() {
-        redisUtil.delete(StandConvertEnum.disease.getName());
-        redisUtil.delete(StandConvertEnum.drug.getName());
-        redisUtil.delete(StandConvertEnum.lis.getName());
-        redisUtil.delete(StandConvertEnum.operation.getName());
-        redisUtil.delete(StandConvertEnum.pacs.getName());
-        redisUtil.delete(StandConvertEnum.symptom.getName());
-        redisUtil.delete(StandConvertEnum.vital.getName());
-        redisUtil.delete(StandConvertEnum.transfusion.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.disease.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.drug.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.lis.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.operation.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.pacs.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.symptom.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.vital.getName());
+        redisUtil.deleteByPrex(StandConvertEnum.transfusion.getName());
     }
 
     /**
-     * 清除启动加载类缓存
+     * 加载药品缓存
      *
      * @return
      */
-    public void clearLoadCache() {
+    public void loadDrugTypeCache() {
         redisUtil.deleteByPrex(RedisEnum.drugType.getName());
+        // redisUtil.deleteByPrex("");
+        // redisUtil.deleteByPrex("药品分类_");
+        neoFacade.getDrugCache();
+
+    }
+
+    public void clearLoadCache(String str) {
+        redisUtil.deleteByPrex(str);
     }
 }

+ 2 - 2
src/main/java/com/diagbot/facade/EntityFacade.java

@@ -62,12 +62,12 @@ public class EntityFacade {
             switch (clsname) {
                 case "LisName":
                     LisNameNode lisNode = new LisNameNode();
-                    keys = getKeys(lisRepository.getKeys(), "name");
+                    keys = getKeys(baseNodeRepository.getLisNameKeys(), "name");
                     neoEntityDTO = lisNode.updateEntity(name, props, keys, lisRepository);
                     break;
                 case "LisSet":
                     LisSetNode lisPackNode = new LisSetNode();
-                    keys = getKeys(lisSetRepository.getKeys(), "name");
+                    keys = getKeys(baseNodeRepository.getLisSetKeys(), "name");
                     neoEntityDTO = lisPackNode.updateEntity(name, props, keys, lisSetRepository);
                     break;
             }

+ 27 - 4
src/main/java/com/diagbot/facade/FollowupPlanInfoFacade.java

@@ -8,6 +8,7 @@ import com.diagbot.dto.PushPlansDTO;
 import com.diagbot.entity.FollowupPlanDetail;
 import com.diagbot.entity.FollowupPlanDetailHospital;
 import com.diagbot.entity.FollowupPlanInfo;
+import com.diagbot.entity.FollowupPlanMapping;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
@@ -40,15 +41,17 @@ public class FollowupPlanInfoFacade extends FollowupPlanInfoServiceImpl {
     FollowupPlanDetailFacade followupPlanDetailFacade;
     @Autowired
     FollowupPlanDetailHospitalFacade followupPlanDetailHospitalFacade;
+    @Autowired
+    FollowupPlanMappingFacade followupPlanMappingFacade;
 
     /**
-     *
      * @param operationName
      * @param hospitalId
      * @return
      */
     public PushPlanDTO getFollowUpPlans(Item operationName, Long hospitalId) {
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date now = DateUtil.now();
         PushPlanDTO pushPlanDTO = new PushPlanDTO();
         List<PushPlansDTO> pushPlans = new ArrayList<>();
         if (operationName == null
@@ -67,9 +70,17 @@ public class FollowupPlanInfoFacade extends FollowupPlanInfoServiceImpl {
         pushPlansDTO.setItem(operationName);
         List<PushPlanDetailDTO> pushPlanDetails = Lists.newLinkedList();
 
+        QueryWrapper<FollowupPlanMapping> followupPlanMappingQueryWrapper = new QueryWrapper<>();
+        followupPlanMappingQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("standard_name", operationName.getUniqueName());
+        FollowupPlanMapping followupPlanMapping = followupPlanMappingFacade.getOne(followupPlanMappingQueryWrapper, false);
+        if (followupPlanMapping == null) {
+            return pushPlanDTO;
+        }
+
         QueryWrapper<FollowupPlanInfo> followupPlanInfoQueryWrapper = new QueryWrapper<>();
         followupPlanInfoQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
-                .eq("operation_name", operationName.getUniqueName());
+                .eq("operation_name", followupPlanMapping.getOperationName());
         FollowupPlanInfo followupPlanInfo = this.getOne(followupPlanInfoQueryWrapper, false);
         if (followupPlanInfo != null) {
             List<FollowupPlanDetailHospital> followupPlanDetailHospitalList = Lists.newLinkedList();
@@ -97,8 +108,14 @@ public class FollowupPlanInfoFacade extends FollowupPlanInfoServiceImpl {
 
                     if (ListUtil.isNotEmpty(entry.getValue())) {
                         PushPlanDetailDTO pushPlanDetailDTO = new PushPlanDetailDTO();
-                        pushPlanDetailDTO.setExamineDate(DateUtil.addMonth(date, entry.getKey()));
+                        Date examineDate = DateUtil.addMonth(date, entry.getKey());
+                        pushPlanDetailDTO.setExamineDate(examineDate);
                         pushPlanDetailDTO.setDescription(entry.getValue().get(0).getFollowUpTime());
+                        if (examineDate.after(now)) {
+                            pushPlanDetailDTO.setHistory(0);
+                        } else {
+                            pushPlanDetailDTO.setHistory(1);
+                        }
                         Map<Integer, List<FollowupPlanDetailHospital>> itemTypeMap
                                 = EntityUtil.makeEntityListMap(entry.getValue(), "itemType");
                         //检验
@@ -125,8 +142,14 @@ public class FollowupPlanInfoFacade extends FollowupPlanInfoServiceImpl {
 
                     if (ListUtil.isNotEmpty(entry.getValue())) {
                         PushPlanDetailDTO pushPlanDetailDTO = new PushPlanDetailDTO();
-                        pushPlanDetailDTO.setExamineDate(DateUtil.addMonth(date, entry.getKey()));
+                        Date examineDate = DateUtil.addMonth(date, entry.getKey());
+                        pushPlanDetailDTO.setExamineDate(examineDate);
                         pushPlanDetailDTO.setDescription(entry.getValue().get(0).getFollowUpTime());
+                        if (examineDate.after(now)) {
+                            pushPlanDetailDTO.setHistory(0);
+                        } else {
+                            pushPlanDetailDTO.setHistory(1);
+                        }
                         Map<Integer, List<FollowupPlanDetail>> itemTypeMap
                                 = EntityUtil.makeEntityListMap(entry.getValue(), "itemType");
                         //检验

+ 13 - 0
src/main/java/com/diagbot/facade/FollowupPlanMappingFacade.java

@@ -0,0 +1,13 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.FollowupPlanMappingServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/9/24 15:23
+ */
+@Component
+public class FollowupPlanMappingFacade extends FollowupPlanMappingServiceImpl {
+}

+ 2 - 2
src/main/java/com/diagbot/facade/HighRiskFacade.java

@@ -34,7 +34,7 @@ public class HighRiskFacade {
      */
     public void highRiskFac(IndicationPushVO indicationPushVO, WordCrfDTO wordCrfDTO, IndicationDTO res) {
         // 高风险图谱接口调用
-        HighRiskNeoVO highRiskNeoVO = fillHighRiskNeo(wordCrfDTO);
+        // HighRiskNeoVO highRiskNeoVO = fillHighRiskNeo(wordCrfDTO);
         List<HighRiskNeoDTO> highRiskNeoDTOList = neoFacade.getHighRiskNeo(wordCrfDTO);
         // 规则处理
         // TODO 测试数据开始
@@ -94,7 +94,7 @@ public class HighRiskFacade {
         highRiskProcess.process(highRiskNeoDTOList, res,wordCrfDTO);
 
         // 结果去重处理
-        // commonFacade.dealMsg(res.getHighRiskList());
+        commonFacade.dealMsg(res.getHighRiskList());
     }
 
 

+ 76 - 67
src/main/java/com/diagbot/facade/NeoFacade.java

@@ -1,23 +1,40 @@
 package com.diagbot.facade;
 
 import com.alibaba.fastjson.JSONArray;
-import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.client.ChiefPresentSimilarityServiceClient;
 import com.diagbot.client.StandConvertServiceClient;
-import com.diagbot.dto.*;
+import com.diagbot.dto.BillNeoDTO;
+import com.diagbot.dto.CriticalNeoDTO;
+import com.diagbot.dto.HighRiskNeoDTO;
+import com.diagbot.dto.NeoPushDTO;
+import com.diagbot.dto.NodeNeoDTO;
+import com.diagbot.dto.OtherTipNeoDTO;
+import com.diagbot.dto.OtherTipPacsNeoDTO;
+import com.diagbot.dto.OtherTipTransfusionNeoDTO;
+import com.diagbot.dto.PushBaseDTO;
+import com.diagbot.dto.StandConvertCrfBatchDTO;
+import com.diagbot.dto.StandConvertCrfDTO;
+import com.diagbot.dto.WordCrfDTO;
 import com.diagbot.entity.node.LisRemind;
 import com.diagbot.entity.node.Medicine;
 import com.diagbot.entity.node.Symptom;
 import com.diagbot.entity.node.YiBaoDiseaseName;
+import com.diagbot.enums.RedisEnum;
 import com.diagbot.enums.StandConvertEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
 import com.diagbot.repository.*;
 import com.diagbot.util.ListUtil;
+import com.diagbot.util.NeoUtil;
 import com.diagbot.util.RedisUtil;
 import com.diagbot.util.StringUtil;
-import com.diagbot.vo.*;
+import com.diagbot.vo.BillNeoVO;
+import com.diagbot.vo.CriticalNeoVO;
+import com.diagbot.vo.Drug;
+import com.diagbot.vo.NeoPushVO;
+import com.diagbot.vo.StandConvert;
+import com.diagbot.vo.StandConvertCrfVO;
 import com.diagbot.vo.neoPushEntity.ChiefPushVo;
 import com.diagbot.vo.neoPushEntity.Diag;
 import com.diagbot.vo.neoPushEntity.PresentPushVo;
@@ -33,7 +50,14 @@ import org.springframework.stereotype.Component;
 
 import java.math.BigDecimal;
 import java.text.DecimalFormat;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -126,7 +150,7 @@ public class NeoFacade {
 
         // 加载药品缓存
         for (String key : res.keySet()) {
-            redisUtil.updateValueByType("药品分类_" + key, res.get(key));
+            redisUtil.updateValue(RedisEnum.drugType.getName() + key, res.get(key));
         }
         return res;
     }
@@ -244,7 +268,7 @@ public class NeoFacade {
         }
         symptoms = Stream.of(symptom_chief,symptom_present).flatMap(Collection::stream).distinct().collect(Collectors.toList());
         //症状推疾病
-        List<String> allDis_bySymptom = getDisBySymptom(symptoms);
+        List<String> allDis_bySymptom = getDisBySymptom(symptoms,age,sex);
         allDis.addAll(allDis_bySymptom);
         //体征推出的疾病
         //化验推出的疾病辅检
@@ -308,12 +332,12 @@ public class NeoFacade {
         return neoPushDTOS;
     }
 
-    public List<String> getDisBySymptom(List<String> symptoms){
+    public List<String> getDisBySymptom(List<String> symptoms,Integer age,Integer sex){
         List<String> symptomCache = getSymptomCache();
         //取交集
         symptoms.retainAll(symptomCache);
         long start = System.currentTimeMillis();
-        List<String> allDis_bySymptom = pushDis(symptomNameRepository, symptoms);
+        List<String> allDis_bySymptom = pushDis(symptomNameRepository, symptoms,age,sex);
         long end = System.currentTimeMillis();
         return allDis_bySymptom;
         }
@@ -326,9 +350,10 @@ public class NeoFacade {
      * @param symptoms
      * @return
      */
-    public List<String> pushDis(SymptomNameRepository symptomNameRepository,List<String> symptoms){
+    public List<String> pushDis(SymptomNameRepository symptomNameRepository,List<String> symptoms,Integer age,Integer sex){
         List<String> allDis = Lists.newArrayList();
-        if(ListUtil.isNotEmpty(symptoms)){
+
+        /*if(ListUtil.isNotEmpty(symptoms)){
             symptoms.parallelStream().forEach(x ->{
                 List<Symptom> byNameIs = symptomNameRepository.findByNameIs(x);
                 if(ListUtil.isNotEmpty(byNameIs)){
@@ -338,7 +363,15 @@ public class NeoFacade {
                     allDis.addAll(diseases);
                 }
             });
-        }
+        }*/
+        List<Symptom> byNameIn = symptomNameRepository.findByNameIn(symptoms);
+        /*List<YiBaoDiseaseName> collect = byNameIn.stream()
+                .map(x -> x.getDisease().stream().filter(z -> NeoUtil.matchBasic(z,sex,age)).collect(Collectors.toList()))
+                .flatMap(List::stream).collect(Collectors.toList());*/
+
+        allDis = byNameIn.stream()
+                .map(z -> z.getDisease().stream().filter(o -> NeoUtil.matchBasic(o,sex,age)).map(y -> y.getName()).collect(Collectors.toList())).flatMap(List::stream)
+                .collect(Collectors.toList());
         return allDis;
     }
 
@@ -569,8 +602,8 @@ public class NeoFacade {
      */
     public List<BillNeoDTO> getDrugBill(Map<String, String> medsterm) {
 
-        MedicineCodeNode medicineNode = new MedicineCodeNode();
-        List<BillNeoDTO> billNeoDTOs = medicineNode.getDrugBill(medsterm, medicineCodeRepository);
+        MedicineNode medicineNode = new MedicineNode();
+        List<BillNeoDTO> billNeoDTOs = medicineNode.getMedicineBill(medsterm, medicineRepository);
 
         return billNeoDTOs;
     }
@@ -769,14 +802,14 @@ public class NeoFacade {
         Map<String, Map<String, String>> map = new LinkedHashMap<>();
 
         List<StandConvertCrfVO> standConvertCrfVOList = new ArrayList<>();
-        List<String> clinicalConList = getConvertList(standConvert.getClinicalList(), StandConvertEnum.symptom.getName(), standConvertCrfVOList);
-        List<String> operationConList = getConvertList(standConvert.getOperationList(), StandConvertEnum.operation.getName(), standConvertCrfVOList);
-        List<String> drugConList = getConvertList(standConvert.getDrugList(), StandConvertEnum.drug.getName(), standConvertCrfVOList);
-        List<String> vitallConList = getConvertList(standConvert.getVitalList(), StandConvertEnum.vital.getName(), standConvertCrfVOList);
-        List<String> diseaseConList = getConvertList(standConvert.getDiaglList(), StandConvertEnum.disease.getName(), standConvertCrfVOList);
-        List<String> pacsConList = getConvertList(standConvert.getPacsList(), StandConvertEnum.pacs.getName(), standConvertCrfVOList);
-        List<String> lisConList = getConvertList(standConvert.getLisList(), StandConvertEnum.lis.getName(), standConvertCrfVOList);
-        List<String> transfusionConList = getConvertList(standConvert.getTransfusionList(), StandConvertEnum.transfusion.getName(), standConvertCrfVOList);
+        List<String> clinicalConList = getConvertList(standConvert.getClinicalList(), StandConvertEnum.symptom.toString(), standConvertCrfVOList);
+        List<String> operationConList = getConvertList(standConvert.getOperationList(), StandConvertEnum.operation.toString(), standConvertCrfVOList);
+        List<String> drugConList = getConvertList(standConvert.getDrugList(), StandConvertEnum.drug.toString(), standConvertCrfVOList);
+        List<String> vitallConList = getConvertList(standConvert.getVitalList(), StandConvertEnum.vital.toString(), standConvertCrfVOList);
+        List<String> diseaseConList = getConvertList(standConvert.getDiaglList(), StandConvertEnum.disease.toString(), standConvertCrfVOList);
+        List<String> pacsConList = getConvertList(standConvert.getPacsList(), StandConvertEnum.pacs.toString(), standConvertCrfVOList);
+        List<String> lisConList = getConvertList(standConvert.getLisList(), StandConvertEnum.lis.toString(), standConvertCrfVOList);
+        List<String> transfusionConList = getConvertList(standConvert.getTransfusionList(), StandConvertEnum.transfusion.toString(), standConvertCrfVOList);
 
         StandConvertCrfBatchDTO standConvertCrfBatchDTO = null;
         try {
@@ -785,14 +818,14 @@ public class NeoFacade {
             throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "标准词转换【服务器】挂了!" + e.getMessage());
         }
         Map<String, Map<String, StandConvertCrfDTO>> crfMap = standConvertCrfBatchDTO.getData();
-        getConvertMap(crfMap, StandConvertEnum.symptom.getName(), clinicalConList, standConvert.getClinicalList(), map);
-        getConvertMap(crfMap, StandConvertEnum.operation.getName(), operationConList, standConvert.getOperationList(), map);
-        getConvertMap(crfMap, StandConvertEnum.drug.getName(), drugConList, standConvert.getDrugList(), map);
-        getConvertMap(crfMap, StandConvertEnum.vital.getName(), vitallConList, standConvert.getVitalList(), map);
-        getConvertMap(crfMap, StandConvertEnum.disease.getName(), diseaseConList, standConvert.getDiaglList(), map);
-        getConvertMap(crfMap, StandConvertEnum.pacs.getName(), pacsConList, standConvert.getPacsList(), map);
-        getConvertMap(crfMap, StandConvertEnum.lis.getName(), lisConList, standConvert.getLisList(), map);
-        getConvertMap(crfMap, StandConvertEnum.transfusion.getName(), transfusionConList, standConvert.getTransfusionList(), map);
+        getConvertMap(crfMap, StandConvertEnum.symptom.toString(), clinicalConList, map);
+        getConvertMap(crfMap, StandConvertEnum.operation.toString(), operationConList, map);
+        getConvertMap(crfMap, StandConvertEnum.drug.toString(), drugConList, map);
+        getConvertMap(crfMap, StandConvertEnum.vital.toString(), vitallConList, map);
+        getConvertMap(crfMap, StandConvertEnum.disease.toString(), diseaseConList, map);
+        getConvertMap(crfMap, StandConvertEnum.pacs.toString(), pacsConList, map);
+        getConvertMap(crfMap, StandConvertEnum.lis.toString(), lisConList, map);
+        getConvertMap(crfMap, StandConvertEnum.transfusion.toString(), transfusionConList, map);
 
         return map;
     }
@@ -810,14 +843,10 @@ public class NeoFacade {
             return null;
         }
 
-        // 从redis获取对应的内容
-        Map<String, String> redisMap = redisUtil.getValueByType(type);
-        if (redisMap == null) {
-            redisMap = new LinkedHashMap<>();
-        }
         if (ListUtil.isNotEmpty(wordList)) {
             for (String s : wordList) {
-                if (StringUtil.isBlank(redisMap.get(s))) {
+                String value = redisUtil.getWithString(type +  "Conv:" + s);
+                if (StringUtil.isBlank(value)) {
                     StandConvertCrfVO standConvertCrfVO = new StandConvertCrfVO();
                     standConvertCrfVO.setWord_type(type);
                     standConvertCrfVO.setWord(s);
@@ -837,60 +866,40 @@ public class NeoFacade {
      * @param crfDTO
      * @param type
      * @param convertList
-     * @param orginList
      * @param map
      */
     public void getConvertMap(Map<String, Map<String, StandConvertCrfDTO>> crfDTO, String type, List<String> convertList,
-                              List<String> orginList, Map<String, Map<String, String>> map) {
-        if (ListUtil.isEmpty(orginList)) {
+                              Map<String, Map<String, String>> map) {
+        if (ListUtil.isEmpty(convertList)) {
             return ;
         }
         Map<String, StandConvertCrfDTO> crfMap = crfDTO.get(type);
         Map<String, String> typeMap = new LinkedHashMap<>();
-        Boolean updateRedis = false;
 
-        // 从redis获取对应的内容
-        Map<String, String> redisMap = redisUtil.getValueByType(type);
-        if (redisMap == null) {
-            redisMap = new LinkedHashMap<>();
-        }
-        for (String s : orginList) {
-            if (redisMap.containsKey(s)) {
-                typeMap.put(s, redisMap.get(s));
-            } else if (crfMap != null) {
+        for (String s : convertList) {
+            String lastS = s;
+            if (crfMap != null) {
                 StandConvertCrfDTO standConvertCrfDTO = crfMap.get(s);
                 if (standConvertCrfDTO != null) {
-                    List<Map<String,String>> list = standConvertCrfDTO.getStandard_words();
+                    List<Map<String, String>> list = standConvertCrfDTO.getStandard_words();
                     if (ListUtil.isEmpty(list)) {
-                        redisMap.put(s, s);
-                        typeMap.put(s, s);
+                        redisUtil.updateValue(type + "Conv:" + s, s);
                     } else {
                         String rateStr = standConvertCrfDTO.getStandard_words().get(0).get("rate");
                         BigDecimal rate = new BigDecimal(rateStr);
                         int flag = rate.compareTo(new BigDecimal(standConvertRate));
                         if (flag < 0) {
-                            redisMap.put(s, s); // rate 小于阈值
-                            typeMap.put(s, s);
+                            redisUtil.updateValue(type + "Conv:" + s, s);
                         } else {
-                            redisMap.put(s, standConvertCrfDTO.getStandard_words().get(0).get("standard_word"));
-                            typeMap.put(s, standConvertCrfDTO.getStandard_words().get(0).get("standard_word"));
+                            redisUtil.updateValue(type + "Conv:" + s, standConvertCrfDTO.getStandard_words().get(0).get("standard_word"));
+                            lastS = standConvertCrfDTO.getStandard_words().get(0).get("standard_word");
                         }
                     }
                 } else {
-                    redisMap.put(s, s); // 找不到就认为是标准词
-                    typeMap.put(s, s); // 找不到就认为是标准词
+                    redisUtil.updateValue(type + "Conv:" + s, s);
                 }
-                updateRedis = true;
-            } else {
-                redisMap.put(s, s); // 找不到就认为是标准词
-                typeMap.put(s, s); // 找不到就认为是标准词
-                updateRedis = true;
             }
-        }
-
-        // 更新redis
-        if (updateRedis) {
-            redisUtil.updateValueByType(redisMap, type);
+            typeMap.put(s, lastS);
         }
         map.put(type, typeMap);
     }

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

@@ -71,10 +71,26 @@ public class PushFacade {
      * @return
      */
     public PushPlanDTO pushPlan(PushPlanVO pushPlanVO) {
+        Map<String, Object> debug = new LinkedHashMap<>();
+        long l1 = System.currentTimeMillis();
         PushPlanDTO pushPlanDTO = new PushPlanDTO();
         if (pushPlanVO.getOperationName() != null) {
+            WordCrfDTO wordCrfDTO = new WordCrfDTO();
+            wordCrfDTO.setOperationName(pushPlanVO.getOperationName());
+            // 标准词转换
+            long standStart = System.currentTimeMillis();
+            StandConvert standConvert = commonFacade.dataTypeGet(wordCrfDTO);
+            Map<String, Map<String, String>> standConvertMap = neoFacade.standConvertCrf(standConvert);
+            commonFacade.dataTypeSet(wordCrfDTO, standConvertMap);
+            CoreUtil.getDebugStr(standStart, "标准词转换耗时", debug);
+            // 推送随访计划
+            long pushStart = System.currentTimeMillis();
             pushPlanDTO = followupPlanInfoFacade.getFollowUpPlans(pushPlanVO.getOperationName(), pushPlanVO.getHospitalId());
+            CoreUtil.getDebugStr(pushStart, "推送耗时", debug);
+            pushPlanDTO.setDebug(debug);
         }
+        CoreUtil.getDebugStr(l1, "本次调用总计耗时", debug);
+
         return pushPlanDTO;
     }
 }

+ 42 - 34
src/main/java/com/diagbot/facade/RetrievalFacade.java

@@ -13,7 +13,22 @@ import com.diagbot.entity.node.PacsName;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoOperationName;
 import com.diagbot.enums.StaticTypeEnum;
-import com.diagbot.repository.*;
+import com.diagbot.repository.BaseNodeRepository;
+import com.diagbot.repository.DeptNode;
+import com.diagbot.repository.DeptRepository;
+import com.diagbot.repository.LisNameNode;
+import com.diagbot.repository.LisNameRepository;
+import com.diagbot.repository.LisSetNode;
+import com.diagbot.repository.LisSetRepository;
+import com.diagbot.repository.MedicineNode;
+import com.diagbot.repository.MedicineRepository;
+import com.diagbot.repository.PacsNameNode;
+import com.diagbot.repository.PacsNameRepository;
+import com.diagbot.repository.TransfusionRemindRepository;
+import com.diagbot.repository.YiBaoDiseaseNode;
+import com.diagbot.repository.YiBaoDiseaseRepository;
+import com.diagbot.repository.YiBaoOperationNameNode;
+import com.diagbot.repository.YiBaoOperationNameRepository;
 import com.diagbot.util.EntityUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.vo.RetrievalVO;
@@ -68,7 +83,6 @@ public class RetrievalFacade {
      */
     public RetrievalDTO index(RetrievalVO retrievalVO) {
         RetrievalDTO retrievalDTO = new RetrievalDTO();
-
         switch (retrievalVO.getType()) {
             case 1:
                 retrievalDTO.setLisNames(getLisPacks(retrievalVO.getInputStr()));
@@ -103,10 +117,10 @@ public class RetrievalFacade {
     /*
      * 获取化验套餐名称列表
      */
-    public List<String> getLisPacks(String name) {
+    public List<String> getLisPacks(String info) {
 
         LisSetNode lisPackNode = new LisSetNode();
-        List<String> lisPacklist = lisPackNode.getLISPackNameList(name, lisSetRepository);
+        List<String> lisPacklist = lisPackNode.getLISPackNameList(info, lisSetRepository, baseNodeRepository);
 
         return lisPacklist;
     }
@@ -115,10 +129,10 @@ public class RetrievalFacade {
     /*
      * 获取化验细项名称列表
      */
-    public List<LisDetailDTO> getLis(String name) {
+    public List<LisDetailDTO> getLis(String info) {
 
         LisNameNode lisNode = new LisNameNode();
-        List<LisDetailDTO> lislist = lisNode.getLisDetailList(name, lisRepository);
+        List<LisDetailDTO> lislist = lisNode.getLisDetailList(info, lisRepository, baseNodeRepository);
 
         return lislist;
     }
@@ -127,10 +141,10 @@ public class RetrievalFacade {
     /*
      * 获取辅检名称列表
      */
-    public List<String> getPACSs(String name) {
+    public List<String> getPACSs(String info) {
 
         PacsNameNode pacsNode = new PacsNameNode();
-        List<String> pacslist = pacsNode.getPACSNameList(name, pacsRepository);
+        List<String> pacslist = pacsNode.getPACSNameList(info, pacsRepository, baseNodeRepository);
 
         return pacslist;
     }
@@ -139,10 +153,10 @@ public class RetrievalFacade {
     /*
      * 获取疾病名称列表
      */
-    public List<DiseaseInfoDTO> getDiseases(String name) {
+    public List<DiseaseInfoDTO> getDiseases(String info) {
 
         YiBaoDiseaseNode yiBaoDiseaseNode = new YiBaoDiseaseNode();
-        List<DiseaseInfoDTO> diseaselist = yiBaoDiseaseNode.getDiseaseNameList(name, icdDiseaseRepository);
+        List<DiseaseInfoDTO> diseaselist = yiBaoDiseaseNode.getDiseaseNameList(info, icdDiseaseRepository, baseNodeRepository);
 
         return diseaselist;
     }
@@ -151,10 +165,10 @@ public class RetrievalFacade {
     /*
      * 获取药品商品名称列表
      */
-    public List<DrugInfoDTO> getMedicines(String name) {
+    public List<DrugInfoDTO> getMedicines(String info) {
 
         MedicineNode medicineNode = new MedicineNode();
-        List<DrugInfoDTO> medslist = medicineNode.getMedicineList(name, medicineRepository);
+        List<DrugInfoDTO> medslist = medicineNode.getMedicineList(info, medicineRepository, baseNodeRepository);
 
         return medslist;
     }
@@ -163,10 +177,10 @@ public class RetrievalFacade {
     /*
      * 获取手术和操作名称列表
      */
-    public List<OperationInfoDTO> getOperations(String name) {
+    public List<OperationInfoDTO> getOperations(String info) {
 
         YiBaoOperationNameNode operationNode = new YiBaoOperationNameNode();
-        List<OperationInfoDTO> opslist = operationNode.getOperationList(name, operationRepository);
+        List<OperationInfoDTO> opslist = operationNode.getOperationList(info, operationRepository, baseNodeRepository);
 
         return opslist;
     }
@@ -175,21 +189,12 @@ public class RetrievalFacade {
     /*
      * 获取输血方式列表
      */
-    public List<String> getTransfusion(String name) {
-        List<String> transfusionNames = transfusionRemindRepository.findTransfusionByName(name);
+    public List<String> getTransfusion(String info) {
+        List<String> transfusionNames = transfusionRemindRepository.findTransfusionByName(info);
 
         return transfusionNames;
     }
 
-    /*
-     * 按拼音获取名称列表
-     */
-    public List<String> getNamebyPinYin(String pycode) {
-        List<String> namelist = baseNodeRepository.getNamebyPinYin(pycode);
-
-        return namelist;
-    }
-
 
     /*
      * 获取科室名称列表
@@ -197,11 +202,12 @@ public class RetrievalFacade {
     public List<String> getDepts(String name) {
 
         DeptNode deptNode = new DeptNode();
-        List<String> deptlist = deptNode.getDeptNameList(name, deptRepository);
+        List<String> deptlist = deptNode.getDeptNameList(name, deptRepository, baseNodeRepository);
 
         return deptlist;
     }
 
+
     /**
      * 医学知识(静态信息)检索
      *
@@ -214,7 +220,7 @@ public class RetrievalFacade {
         List<Integer> types = staticKnowledgeIndexVO.getTypes();
 
         //TODO 诊断
-        List<YiBaoDiseaseName> icdDiseaseList = icdDiseaseRepository.findByNameContaining(inputStr);
+        List<YiBaoDiseaseName> icdDiseaseList = icdDiseaseRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
         List<StaticKnowledgeIndexDTO> disRetList = Lists.newLinkedList();
         for (YiBaoDiseaseName icdDisease : icdDiseaseList) {
             StaticKnowledgeIndexDTO staticDTO = new StaticKnowledgeIndexDTO();
@@ -224,7 +230,7 @@ public class RetrievalFacade {
             disRetList.add(staticDTO);
         }
         //TODO 药品
-        List<Medicine> medicineList = medicineRepository.findByNameContaining(inputStr);
+        List<Medicine> medicineList = medicineRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
 
         List<StaticKnowledgeIndexDTO> drugRetList = Lists.newLinkedList();
         for (Medicine medicine : medicineList) {
@@ -235,7 +241,7 @@ public class RetrievalFacade {
             drugRetList.add(staticDTO);
         }
         //TODO 检验套餐
-        List<LisSet> lisSetList = lisSetRepository.findByNameContaining(inputStr);
+        List<LisSet> lisSetList = lisSetRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
 
         List<StaticKnowledgeIndexDTO> lisSetRetList = Lists.newLinkedList();
         for (LisSet lisSet : lisSetList) {
@@ -246,7 +252,7 @@ public class RetrievalFacade {
             lisSetRetList.add(staticDTO);
         }
         //TODO 检验明细关联出检验套餐
-        List<LisName> lisList = lisRepository.findByNameContaining(inputStr);
+        List<LisName> lisList = lisRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
 
         List<StaticKnowledgeIndexDTO> lisSetRelatecLisRetList = Lists.newLinkedList();
         for (LisName lis : lisList) {
@@ -274,7 +280,7 @@ public class RetrievalFacade {
             }
         }
         //TODO 检验明细
-        lisList = lisRepository.findByNameContaining(inputStr);
+        //lisList = lisRepository.findByNameContainingOrPycodeContaining(inputStr, inputStr);
 
         List<StaticKnowledgeIndexDTO> lisRetList = Lists.newLinkedList();
         for (LisName lis : lisList) {
@@ -285,7 +291,7 @@ public class RetrievalFacade {
             lisRetList.add(staticDTO);
         }
         //TODO 检查
-        List<PacsName> pacsList = pacsRepository.findByNameContaining(inputStr);
+        List<PacsName> pacsList = pacsRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
 
         List<StaticKnowledgeIndexDTO> pacsRetList = Lists.newLinkedList();
         for (PacsName pacs : pacsList) {
@@ -296,9 +302,8 @@ public class RetrievalFacade {
             pacsRetList.add(staticDTO);
         }
 
-
         //TODO 手术和操作
-        List<YiBaoOperationName> operationList = operationRepository.findByNameContaining(inputStr);
+        List<YiBaoOperationName> operationList = operationRepository.findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(staticKnowledgeIndexVO.getHasInfo(), inputStr, inputStr, 100);
 
         List<StaticKnowledgeIndexDTO> operationRetList = Lists.newLinkedList();
 
@@ -341,6 +346,9 @@ public class RetrievalFacade {
                 retList.addAll(operationRetList);
             }
         }
+        if (ListUtil.isNotEmpty(retList) && retList.size() > 100) {
+            retList = retList.subList(0, 100);
+        }
         return retList;
     }
 }

+ 19 - 0
src/main/java/com/diagbot/facade/StaticKnowledgeFacade.java

@@ -1,8 +1,13 @@
 package com.diagbot.facade;
 
+import com.diagbot.repository.BaseNodeRepository;
 import com.diagbot.vo.HasStaticKnowledgeVO;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
 /**
  * @Description:
  * @Author:zhaops
@@ -17,7 +22,21 @@ public class StaticKnowledgeFacade {
      * @param hasStaticKnowledgeVO
      * @return
      */
+    @Autowired
+    BaseNodeRepository nodeRepository;
     public Boolean updateHasInfoStatus(HasStaticKnowledgeVO hasStaticKnowledgeVO) {
+        @NotBlank(message = "请输入术语类型") String type = hasStaticKnowledgeVO.getType();
+        @NotBlank(message = "请输入标准术语名称") String name = hasStaticKnowledgeVO.getName();
+        @NotNull(message = "请输入是否有静态信息(0-无,1-有)") Integer hasInfo = hasStaticKnowledgeVO.getHasInfo();
+        nodeRepository.updateStaticKnowledgeSign(type,name,hasInfo);
+        /*switch (type){
+            case "":
+                System.out.println();
+                break;
+            case "ww":
+                System.out.println();
+                break;
+        }*/
         return true;
     }
 }

+ 307 - 127
src/main/java/com/diagbot/facade/TestFacade.java

@@ -7,8 +7,10 @@ import com.diagbot.client.StandConvertServiceClient;
 import com.diagbot.dto.IndicationDTO;
 import com.diagbot.dto.StandConvertCrfBatchDTO;
 import com.diagbot.dto.StandConvertCrfDTO;
+import com.diagbot.enums.RedisEnum;
 import com.diagbot.exception.CommonErrorCode;
 import com.diagbot.exception.CommonException;
+import com.diagbot.util.BeanUtil;
 import com.diagbot.util.ExcelUtils;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.RedisUtil;
@@ -17,8 +19,10 @@ import com.diagbot.vo.Drug;
 import com.diagbot.vo.IndicationPushVO;
 import com.diagbot.vo.ItemExt;
 import com.diagbot.vo.StandConvertCrfVO;
+import com.diagbot.vo.TestAllVO;
 import com.diagbot.vo.TestIndicationVO;
 import com.diagbot.vo.TestLineVO;
+import io.github.lvyahui8.spring.facade.DataFacade;
 import org.apache.commons.fileupload.FileItem;
 import org.apache.commons.fileupload.FileItemFactory;
 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
@@ -35,6 +39,10 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
 
 /**
  * @Description: 测试facade
@@ -50,6 +58,8 @@ public class TestFacade {
     StandConvertServiceClient standConvertServiceClient;
     @Autowired
     RedisUtil redisUtil;
+    @Autowired
+    CacheFacade cacheFacade;
 
     /**
      * 开单项数据测试
@@ -102,99 +112,129 @@ public class TestFacade {
                         operationOrder.add(operationItem);
                         indicationPushVO.setOperationOrder(operationOrder);
                         break;
+                    case "药品通用名称":
+                        List<Drug> drugOrder = new ArrayList<>();
+                        Drug drug = new Drug();
+                        drug.setName(bean.getStandName());
+                        drug.setUniqueName(bean.getStandName());
+                        drugOrder.add(drug);
+                        indicationPushVO.setDrugOrder(drugOrder);
+                        break;
                     default:
                         continue;
                 }
             }
 
+            indicationPushVO.setMsg(bean.getNeoName());
+
             if (StringUtil.isNotEmpty(bean.getNeoType())) {
                 switch (bean.getNeoType()) {
-                    // case "1": // 性别
-                    //     if ("男性".equals(bean.getNeoName())) {
-                    //         indicationPushVO.setSex(1);
-                    //     } else if ("女性".equals(bean.getNeoName())) {
-                    //         indicationPushVO.setSex(2);
-                    //     }
-                    //     break;
-                    // case "2": // 化验, 示例:血小板计数,<,50,10^9/L
-                    //     String lisStr = bean.getNeoName();
-                    //     String[] lisArr = lisStr.split(",");
-                    //
-                    //     List<Lis> lisList = new ArrayList<>();
-                    //     Lis lisBean = new Lis();
-                    //     lisBean.setUniqueName(lisArr[0]);
-                    //     lisBean.setName(lisArr[0]);
-                    //     lisBean.setDetailName(lisArr[0]);
-                    //     lisBean.setValue(getValue(lisArr));
-                    //     lisList.add(lisBean);
-                    //     indicationPushVO.setLis(lisList);
-                    //     break;
-                    // case "3": // 临床表现
-                    //     indicationPushVO.setChief(bean.getNeoName());
-                    //     break;
+                    case "1": // 性别
+                        if ("男性".equals(bean.getNeoName())) {
+                            indicationPushVO.setSex(1);
+                        } else if ("女性".equals(bean.getNeoName())) {
+                            indicationPushVO.setSex(2);
+                        }
+                        break;
+                    case "2": // 化验, 示例:血小板计数,<,50,10^9/L
+                        String lisStr = bean.getNeoName();
+                        String[] lisArr = lisStr.split(",");
+
+                        List<Lis> lisList = new ArrayList<>();
+                        Lis lisBean = new Lis();
+                        lisBean.setUniqueName(lisArr[0]);
+                        lisBean.setName(lisArr[0]);
+                        lisBean.setDetailName(lisArr[0]);
+                        lisBean.setValue(getValue(lisArr));
+                        lisList.add(lisBean);
+                        indicationPushVO.setLis(lisList);
+                        break;
+                    case "3": // 临床表现
+                        indicationPushVO.setChief(bean.getNeoName());
+                        break;
                     case "4": //辅助检查描述
                         indicationPushVO.setSymptom("B超:提示" + bean.getNeoName());
                         break;
-                    // case "5": // 诊断
-                    //     List<Item> diag = new ArrayList<>();
-                    //     Item diagItem = new Item();
-                    //     diagItem.setName(bean.getNeoName());
-                    //     diagItem.setUniqueName(bean.getNeoName());
-                    //     diag.add(diagItem);
-                    //     indicationPushVO.setDiag(diag);
-                    //     break;
-                    // case "6": // 服用药品
-                    //     StringBuffer symptom = new StringBuffer("发病来,神志清,精神可,胃纳一般,睡眠可,二便无殊。一直服用");
-                    //     symptom.append(bean.getNeoName()).append("。");
-                    //     indicationPushVO.setSymptom(symptom.toString());
-                    //     break;
-                    // case "7" : // 药品过敏原
-                    //     StringBuffer pastStr = new StringBuffer("");
-                    //     if ("药品通用名称".equals(bean.getDrugType())) {
-                    //         pastStr.append("有“").append(bean.getNeoName()).append("”过敏。");
-                    //         indicationPushVO.setPasts(pastStr.toString());
-                    //     } else if ("药品类别".equals(bean.getDrugType())) {
-                    //         List<String> drugList = (List<String>)redisUtil.get("药品分类_" + bean.getNeoName());
-                    //         if (ListUtil.isNotEmpty(drugList)) {
-                    //             for (String s : drugList) {
-                    //                 pastStr = new StringBuffer("");
-                    //                 IndicationPushVO indicationPushCopy = new IndicationPushVO();
-                    //                 BeanUtil.copyProperties(indicationPushVO, indicationPushCopy);
-                    //                 pastStr.append("有“").append(s).append("”过敏。");
-                    //                 indicationPushCopy.setPasts(pastStr.toString());
-                    //                 indicationPushCopy.setMsg("过敏药品【" + s + "】");
-                    //                 indicationPushVOList.add(indicationPushCopy);
-                    //             }
-                    //         }
-                    //         continue;
-                    //     }
-                    //     break;
-                    // case "12": // 体征
-                    //     StringBuffer sbVital = new StringBuffer();
-                    //     String[] vitalArr = bean.getNeoName().split(",");
-                    //     if (vitalArr.length > 1) {
-                    //         if ("收缩压".equals(vitalArr[0]) || "舒张压".equals(vitalArr[0])) {
-                    //             if ("收缩压".equals(vitalArr[0])) {
-                    //                 sbVital.append("血压");
-                    //                 sbVital.append(getValue(vitalArr) + "/100mmHg");
-                    //                 indicationPushVO.setVital(sbVital.toString());
-                    //             } else if ("舒张压".equals(vitalArr[0])) {
-                    //                 sbVital.append("血压");
-                    //                 sbVital.append("100/" + getValue(vitalArr) + "mmHg");
-                    //                 indicationPushVO.setVital(sbVital.toString());
-                    //             }
-                    //         } else {
-                    //             // 其他数值类型
-                    //             sbVital.append(vitalArr[0]);
-                    //             sbVital.append(getValue(vitalArr));
-                    //             sbVital.append(vitalArr[3]);
-                    //             indicationPushVO.setVital(sbVital.toString());
-                    //         }
-                    //     } else {
-                    //         sbVital.append(vitalArr[0]);
-                    //         indicationPushVO.setVital(sbVital.toString());
-                    //     }
-                    //     break;
+                    case "5": // 诊断
+                        List<Item> diag = new ArrayList<>();
+                        Item diagItem = new Item();
+                        diagItem.setName(bean.getNeoName());
+                        diagItem.setUniqueName(bean.getNeoName());
+                        diag.add(diagItem);
+                        indicationPushVO.setDiag(diag);
+                        break;
+                    case "6": // 服用药品
+                        StringBuffer symptom = new StringBuffer("发病来,神志清,精神可,胃纳一般,睡眠可,二便无殊。一直服用");
+                        symptom.append(bean.getNeoName()).append("。");
+                        indicationPushVO.setSymptom(symptom.toString());
+                        break;
+                    case "10": // 禁忌人群
+                        if ("妊娠".equals(bean.getNeoName())) {
+                            List<Item> groupList = new ArrayList<>();
+                            Item group = new Item();
+                            group.setName(bean.getNeoName());
+                            group.setUniqueName(bean.getNeoName());
+                            groupList.add(group);
+                            indicationPushVO.setDiag(groupList);
+                        } else {
+                            continue;
+                        }
+                    case "7" : // 药品过敏原
+                        StringBuffer pastStr = new StringBuffer("");
+                        if ("药品通用名称".equals(bean.getDrugType())) {
+                            pastStr.append("有“").append(bean.getNeoName()).append("”过敏。");
+                            indicationPushVO.setPasts(pastStr.toString());
+                        } else if ("药品类别".equals(bean.getDrugType())) {
+                            List<String> drugList = (List<String>)redisUtil.get(RedisEnum.drugType.getName() + bean.getNeoName());
+                            if (ListUtil.isNotEmpty(drugList)) {
+                                if (testLineVO.isGetOne()) {
+                                    pastStr.append("有“").append(drugList.get(getRandomNum(drugList.size()))).append("”过敏。");
+                                    indicationPushVO.setPasts(pastStr.toString());
+                                } else {
+                                    for (String s : drugList) {
+                                        pastStr = new StringBuffer("");
+                                        IndicationPushVO indicationPushCopy = new IndicationPushVO();
+                                        BeanUtil.copyProperties(indicationPushVO, indicationPushCopy);
+                                        pastStr.append("有“").append(s).append("”过敏。");
+                                        indicationPushCopy.setPasts(pastStr.toString());
+                                        indicationPushCopy.setMsg("过敏药品【" + s + "】");
+                                        indicationPushVOList.add(indicationPushCopy);
+                                    }
+                                    continue;
+                                }
+                            }
+                        }
+                        break;
+                    case "12": // 体征
+                        StringBuffer sbVital = new StringBuffer();
+                        String[] vitalArr = bean.getNeoName().split(",");
+                        if (vitalArr.length > 1) {
+                            if ("收缩压".equals(vitalArr[0]) || "舒张压".equals(vitalArr[0])) {
+                                if ("收缩压".equals(vitalArr[0])) {
+                                    sbVital.append("血压");
+                                    sbVital.append(getValue(vitalArr) + "/100mmHg");
+                                    indicationPushVO.setVital(sbVital.toString());
+                                } else if ("舒张压".equals(vitalArr[0])) {
+                                    sbVital.append("血压");
+                                    sbVital.append("100/" + getValue(vitalArr) + "mmHg");
+                                    indicationPushVO.setVital(sbVital.toString());
+                                }
+                            } else {
+                                // 其他数值类型
+                                sbVital.append(vitalArr[0]);
+                                sbVital.append(getValue(vitalArr));
+                                sbVital.append(vitalArr[3]);
+                                indicationPushVO.setVital(sbVital.toString());
+                            }
+                        } else {
+                            sbVital.append(vitalArr[0]);
+                            indicationPushVO.setVital(sbVital.toString());
+                        }
+                        break;
+                    case "14": // 年龄
+                        String[] splitAge = bean.getNeoName().split(",");
+                        indicationPushVO.setAge((int) getValueNum(splitAge));
+                        break;
                     default:
                         continue;
                 }
@@ -202,7 +242,8 @@ public class TestFacade {
             indicationPushVOList.add(indicationPushVO);
         }
 
-        Map<String, Object> map = getDebugMap(indicationPushVOList, "2", start);
+        // Map<String, Object> map = getDebugMap(indicationPushVOList, "2", start);
+        Map<String, Object> map = getDebugMapMulti(indicationPushVOList, "2", start);
         return map;
     }
 
@@ -287,7 +328,7 @@ public class TestFacade {
                 continue;
             }
             // 3,4是高危手术
-            if ("0".equals(bean.getOperationLevel()) || "1".equals(bean.getOperationLevel()) || "2".equals(bean.getOperationLevel())) {
+            if (StringUtil.isBlank(bean.getOperationLevel()) || "0".equals(bean.getOperationLevel()) || "1".equals(bean.getOperationLevel()) || "2".equals(bean.getOperationLevel())) {
                 continue;
             }
             IndicationPushVO indicationPushVO = new IndicationPushVO();
@@ -299,10 +340,11 @@ public class TestFacade {
             item.setName(bean.getOperationName());
             operationOrder.add(item);
             indicationPushVO.setOperationOrder(operationOrder);
+            indicationPushVO.setMsg(bean.getOperationName());
             indicationPushVOList.add(indicationPushVO);
         }
 
-        Map<String, Object> map = getDebugMap(indicationPushVOList, "3", start);
+        Map<String, Object> map = getDebugMapMulti(indicationPushVOList, "3", start);
         return map;
     }
 
@@ -490,17 +532,18 @@ public class TestFacade {
             IndicationPushVO indicationPushVO = new IndicationPushVO();
             indicationPushVO.setRuleType("3");
             indicationPushVO.setIdNum(bean.getIdNum());
-            List<Drug> drug = new ArrayList<>();
+            List<Drug> drugOrder = new ArrayList<>();
             Drug item = new Drug();
             item.setUniqueName(bean.getDrugHighRisk());
             item.setName(bean.getDrugHighRisk());
             item.setForm(bean.getDrugForm());
-            drug.add(item);
-            indicationPushVO.setDrug(drug);
+            drugOrder.add(item);
+            indicationPushVO.setDrugOrder(drugOrder);
+            indicationPushVO.setMsg(bean.getDrugHighRisk() + bean.getDrugForm());
             indicationPushVOList.add(indicationPushVO);
         }
 
-        Map<String, Object> map = getDebugMap(indicationPushVOList, "3", start);
+        Map<String, Object> map = getDebugMapMulti(indicationPushVOList, "3", start);
         return map;
     }
 
@@ -546,6 +589,7 @@ public class TestFacade {
                 lisDetail.add(lisDetailBean);
             }
             indicationPushVO.setLis(lisDetail);
+            indicationPushVO.setMsg(bean.getCriticalLis());
 
             indicationPushVOList.add(indicationPushVO);
         }
@@ -577,6 +621,7 @@ public class TestFacade {
             pacs.setResult(bean.getRuleText());
             pacsList.add(pacs);
             indicationPushVO.setPacs(pacsList);
+            indicationPushVO.setMsg(bean.getRuleText());
             indicationPushVO.setIdNum(bean.getIdNum());
 
             indicationPushVOList.add(indicationPushVO);
@@ -608,9 +653,9 @@ public class TestFacade {
      * @return
      */
     public double getValueNum(String[] arr) {
-        if ("<".equals(arr[1]) || "≤".equals(arr[1])) {
+        if ("<".equals(arr[1]) || "<".equals(arr[1]) || "≤".equals(arr[1])) {
             return Double.parseDouble(arr[2]) - 1;
-        } else if (">".equals(arr[1]) || "≥".equals(arr[1])) {
+        } else if (">".equals(arr[1]) || "≥".equals(arr[1]) || ">".equals(arr[1])) {
             return Double.parseDouble(arr[2]) + 1;
         }
         return 0.0;
@@ -685,12 +730,12 @@ public class TestFacade {
                 operation.add(item);
             }
             indicationPushVO.setOperation(operation);*/
-            //年龄
+           //年龄
             IndicationPushVO indicationPushVOAge = new IndicationPushVO();
             String[] split = bean.getAgeAll().split(",");
             setname(indicationPushVOAge,bean);
             indicationPushVOAge.setAge((int) getValueNum(split));
-            indicationPushVOAge.setMsg("年龄:"+operationNameMsg);
+            indicationPushVOAge.setMsg("年龄:"+(int) getValueNum(split)+operationNameMsg);
             indicationPushVOAge.setRuleType("3");
             indicationPushVOAge.setIdNum(bean.getIdNum());
             indicationPushVOList.add(indicationPushVOAge);
@@ -698,14 +743,19 @@ public class TestFacade {
            //体格
             String physique = bean.getPhysique();
             String[] physiqueStrArray = physique.split(",");
-            for (String str : physiqueStrArray) {
+            for (int i = 0;i<physiqueStrArray.length;i++) {
+                String str = physiqueStrArray[i];
+                if(testLineVO.isGetOne()){
+                    int sum = getRandomNum(physiqueStrArray.length);
+                    str =physiqueStrArray[sum];
+                }
                 IndicationPushVO indphysiquePushVO = new IndicationPushVO();
                 setname(indphysiquePushVO,bean);
                 StringBuffer sbVital = new StringBuffer();
                 String[] vitalArr = str.split(",");
                 if (vitalArr.length > 1) {
-                    if ("收缩压".equals(vitalArr[0]) || "舒张压".equals(vitalArr[0])) {
-                        if ("收缩压".equals(vitalArr[0])) {
+                    if ("收缩压".equals(vitalArr[0].trim()) || "舒张压".equals(vitalArr[0].trim())) {
+                        if ("收缩压".equals(vitalArr[0].trim())) {
                             sbVital.append("血压");
                             sbVital.append(getValue(vitalArr) + "/100mmHg");
                             indphysiquePushVO.setIdNum(bean.getIdNum());
@@ -742,13 +792,21 @@ public class TestFacade {
                     indphysiquePushVO.setVital(sbVital.toString());
                     indicationPushVOList.add(indphysiquePushVO);
                 }
-
+                if(testLineVO.isGetOne()){
+                    break;
+                }
             }
 
            //化验
             String lisAll = bean.getLisAll();
             String[] physiquelisAll = lisAll.split(",");
-            for (String str : physiquelisAll) {
+            for (int i = 0;i<physiquelisAll.length;i++) {
+
+                String str = physiquelisAll[i];
+                if(testLineVO.isGetOne()){
+                    int sum = getRandomNum(physiquelisAll.length);
+                    str =physiquelisAll[sum];
+                }
                 IndicationPushVO indicationPushVOlisList = new IndicationPushVO();
                 setname(indicationPushVOlisList,bean);
                 List<Lis> lisList = new ArrayList<>();
@@ -757,30 +815,33 @@ public class TestFacade {
                     String[] strArray = str.split(",");
                     if(strArray.length>2) {
                         Lis lisBean = new Lis();
-                        lisBean.setUniqueName(strArray[0]);
-                        lisBean.setName(strArray[0]);
-                        lisBean.setDetailName(strArray[0]);
+                        lisBean.setUniqueName(strArray[0].trim());
+                        lisBean.setName(strArray[0].trim());
+                        lisBean.setDetailName(strArray[0].trim());
                         lisBean.setValue(getValue(strArray));
                         lisList.add(lisBean);
                         indicationPushVOlisList.setIdNum(bean.getIdNum());
                         indicationPushVOlisList.setRuleType("3");
-                        indicationPushVOlisList.setMsg("化验" + strArray[0] + "==" + operationNameMsg);
+                        indicationPushVOlisList.setMsg("化验" + strArray[0].trim() + "==" + operationNameMsg);
                         indicationPushVOlisList.setLis(lisList);
                         indicationPushVOList.add(indicationPushVOlisList);
                     }else {
                         Lis lisBean = new Lis();
-                        lisBean.setUniqueName(strArray[0]);
+                        lisBean.setUniqueName(strArray[0].trim());
                         lisBean.setName(strArray[0]);
-                        lisBean.setDetailName(strArray[0]);
-                        lisBean.setOtherValue(strArray[1]);
+                        lisBean.setDetailName(strArray[0].trim());
+                        lisBean.setOtherValue(strArray[1].trim());
                         lisList.add(lisBean);
                         indicationPushVOlisList.setIdNum(bean.getIdNum());
                         indicationPushVOlisList.setRuleType("3");
-                        indicationPushVOlisList.setMsg("化验:" + strArray[0] + "==" + operationNameMsg);
+                        indicationPushVOlisList.setMsg("化验:" + strArray[0].trim() + "==" + operationNameMsg);
                         indicationPushVOlisList.setLis(lisList);
                         indicationPushVOList.add(indicationPushVOlisList);
                     }
                 }
+                if(testLineVO.isGetOne()){
+                    break;
+                }
             }
 
             //辅检
@@ -788,14 +849,20 @@ public class TestFacade {
             String[] physiquepacsAll = pacsAll.split(",");
             //indicationPushVO.setSymptom(pacsAll);
 
-            for (String pacsStr : physiquepacsAll) {
+            for (int i = 0;i<physiquepacsAll.length;i++) {
+
+                String pacsStr = physiquepacsAll[i];
+                if(testLineVO.isGetOne()){
+                    int sum = getRandomNum(physiquepacsAll.length);
+                    pacsStr =physiquepacsAll[sum];
+                }
                 IndicationPushVO indicationPushVOpacs = new IndicationPushVO();
                 setname(indicationPushVOpacs,bean);
                 List<Pacs> pacs = new ArrayList<>();
                 Pacs pacs1 = new Pacs();
                 pacs1.setUniqueName("腹部CT");
                 pacs1.setName("腹部CT");
-                pacs1.setResult(pacsStr);
+                pacs1.setResult(pacsStr.trim());
                 pacs.add(pacs1);
                 indicationPushVOpacs.setIdNum(bean.getIdNum());
                 indicationPushVOpacs.setRuleType("3");
@@ -803,32 +870,44 @@ public class TestFacade {
                 indicationPushVOpacs.setPacs(pacs);
                 indicationPushVOpacs.setSymptom(pacsAll);
                 indicationPushVOList.add(indicationPushVOpacs);
+                if(testLineVO.isGetOne()){
+                    break;
+                }
             }
 
            //诊断"腹部CT"
             String disease = bean.getDisease();
             String[] physiquedisease = disease.split(",");
 
-            for (String diseaseStr : physiquedisease) {
+            for (int i = 0;i<physiquedisease.length;i++) {
+
+                String diseaseStr = physiquedisease[i];
+                if(testLineVO.isGetOne()){
+                    int sum = getRandomNum(physiquelisAll.length);
+                    diseaseStr =physiquedisease[sum];
+                }
                 IndicationPushVO indicationPushVOpacs = new IndicationPushVO();
                 setname(indicationPushVOpacs,bean);
                 List<Item> diag = new ArrayList<>();
                 Item item = new Item();
-                item.setUniqueName(diseaseStr);
-                item.setName(diseaseStr);
+                item.setUniqueName(diseaseStr.trim());
+                item.setName(diseaseStr.trim());
                 diag.add(item);
                 indicationPushVOpacs.setMsg("诊断:"+diseaseStr+"=="+operationNameMsg);
                 indicationPushVOpacs.setDiag(diag);
                 indicationPushVOpacs.setIdNum(bean.getIdNum());
                 indicationPushVOpacs.setRuleType("3");
                 indicationPushVOList.add(indicationPushVOpacs);
+                if(testLineVO.isGetOne()){
+                    break;
+                }
             }
             //List<Item> operationOrder = new ArrayList<>();
             // setname(indicationPushVO,bean);
             //  indicationPushVOList.add(indicationPushVO);
         }
 
-        Map<String, Object> map = getDebugMap(indicationPushVOList, "3", start);
+        Map<String, Object> map = getDebugMapMulti(indicationPushVOList, "3", start);
         return map;
     }
 
@@ -881,12 +960,66 @@ public class TestFacade {
         }
         map.put("总条数", indicationPushVOList.size() + "条");
         map.put("出错条数", msg.size() + "条");
-        map.put("出错信息", msg);
-        map.put("程序报错", errMsg);
+        if (ListUtil.isNotEmpty(msg)) {
+            map.put("出错信息", msg);
+        }
+        if (ListUtil.isNotEmpty(errMsg)) {
+            map.put("程序报错", errMsg);
+        }
         map.put("执行时间", (System.currentTimeMillis() - start) / 1000.0 + "秒");
         return map;
     }
 
+    /**
+     * 多线程执行
+     *
+     * @param indicationPushVOList
+     * @param start
+     * @return
+     */
+    public Map getDebugMapMulti(List<IndicationPushVO> indicationPushVOList, String ruleType, long start) {
+        Map<String, Object> map = new LinkedHashMap<>();
+        List<String> errMsg = new ArrayList<>();
+        try {
+            int threadNum = 8; // 推荐的总线程数 = cpu个数 * 每个cpu的核数
+            List<List<IndicationPushVO>> threadData = divideByCopies(indicationPushVOList, threadNum);
+            List<Future<Map>> list = new ArrayList<>();
+
+            ExecutorService executor = Executors.newFixedThreadPool(threadNum);
+            for (int i = 0; i < threadNum; i++) {
+                final int index = i; // 这一行代码很重要,如果使用成员变量,下面会报错
+                Future<Map> future = executor.submit(new Callable<Map>() {
+                    @Override
+                    public Map call() {
+                        List<IndicationPushVO> data = threadData.get(index);
+                        return getDebugMap(data, ruleType, start);
+                    }
+                });
+                list.add(future);
+            }
+
+            // 拼接返回数据
+            for (int i = 0; i < list.size(); i++) {
+                Future<Map> future = list.get(i);
+                while(!future.isDone()); // 这一行代码很重要
+                List<String> obj = (List<String>)future.get().get("出错信息");
+                if (ListUtil.isNotEmpty(obj)) {
+                    errMsg.addAll(obj);
+                }
+            }
+            map.put("总条数", indicationPushVOList.size() + "条");
+            map.put("出错条数", errMsg.size() + "条");
+            if (ListUtil.isNotEmpty(errMsg)) {
+                map.put("出错信息", errMsg);
+            }
+            Long t2 = System.currentTimeMillis();
+            map.put("执行时间", (t2 - start) / 1000.0 + "秒");
+        } catch (Exception e) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "多线程执行高风险手术复杂情况失败:" + e.getMessage());
+        }
+        return map;
+    }
+
     public void setname(IndicationPushVO indicationPushVO, TestIndicationVO bean) {
         List<Item> operationOrder = new ArrayList<>();
         Item item = new Item();
@@ -896,29 +1029,44 @@ public class TestFacade {
         indicationPushVO.setOperationOrder(operationOrder);
     }
 
-    public Map testAll() {
+    public Map testAll(TestAllVO testAllVO) {
+        if (StringUtil.isBlank(testAllVO.getPath())) {
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "参数为空,未填写【文件所在路径】");
+        }
+        long start = System.currentTimeMillis();
+        String path = testAllVO.getPath();
         Map<String, Object> map = new LinkedHashMap<>();
-        String picPathLis ="D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\【危急值_化验】.xlsx";
-        String picPathPacs ="D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据\\【危急值_辅检】.xls";
-        MultipartFile file = null;
+        Map<String, Object> paramMap = new LinkedHashMap<>();
+        Map<String, String> mapPath = new LinkedHashMap<>();
+        mapPath.put("【危急值_化验】", path + File.separator + "【危急值_化验】.xlsx");
+        mapPath.put("【危急值_辅检】", path + File.separator + "【危急值_辅检】.xls");
+        mapPath.put("【其他值提醒_化验】", path + File.separator + "【其他值提醒_化验】.xlsx");
+        mapPath.put("【其他值提醒_辅检】", path + File.separator + "【其他值提醒_辅检】.xlsx");
+        mapPath.put("【其他值提醒_输血】", path + File.separator + "【其他值提醒_输血】.xlsx");
+        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);
 
-        file = getMulFileByPath(picPathLis);
-        Map<String, Object> criticalMapLis = importCriticalLisExcel(file, new TestLineVO());
-        map.put("【危急值_化验】",criticalMapLis);
+        try {
+            map = DataFacade.get("testAll", paramMap, Map.class);
+        } catch (Exception e) {
+            e.printStackTrace();
+            throw new CommonException(CommonErrorCode.SERVER_IS_ERROR, "提醒类服务出错" + e.getMessage());
+        }
 
-        file = getMulFileByPath(picPathPacs);
-        Map<String, Object> criticalMapPacs = importCriticalPacsExcel(file, new TestLineVO());
-        map.put("【危急值_辅检】",criticalMapPacs);
+        map.put("总耗时", (System.currentTimeMillis() - start) / 1000.0 + "秒");
         return map;
     }
 
-    private MultipartFile getMulFileByPath(String picPath) {
+    public MultipartFile getMulFileByPath(String picPath) {
         FileItem fileItem = createFileItem(picPath);
         MultipartFile mfile = new CommonsMultipartFile(fileItem);
         return mfile;
     }
 
-    private FileItem createFileItem(String filePath) {
+    public FileItem createFileItem(String filePath) {
         FileItemFactory factory = new DiskFileItemFactory(16, null);
         String textFieldName = "textField";
         int num = filePath.lastIndexOf(".");
@@ -946,4 +1094,36 @@ public class TestFacade {
         }
         return item;
     }
+
+    /**
+     * 随机获取0—size之间的一个数值
+     * @param size
+     * @return
+     */
+    public int getRandomNum(int size) {
+        return (int)(Math.random() * size);
+    }
+
+    /**
+     * 将列表按列表总长度划分
+     *
+     * @param originList 数据
+     * @param num 份数
+     * @param <T>
+     * @return
+     */
+    public <T> List<List<T>> divideByCopies(List<T> originList, int num) {
+        List<List<T>> list = new ArrayList<>();
+        if (ListUtil.isEmpty(originList) || num < 0) {
+            return null;
+        }
+        for (int i = 0; i < num; i++) {
+            list.add(new ArrayList<T>());
+        }
+        for (int i = 0; i < originList.size(); i++) {
+            list.get(i % num).add(originList.get(i));
+        }
+
+        return list;
+    }
 }

+ 16 - 0
src/main/java/com/diagbot/mapper/FollowupPlanMappingMapper.java

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.diagbot.entity.FollowupPlanMapping;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 手术随访计划映射表 Mapper 接口
+ * </p>
+ *
+ * @author zhaops
+ * @since 2020-09-24
+ */
+public interface FollowupPlanMappingMapper extends BaseMapper<FollowupPlanMapping> {
+
+}

+ 32 - 3
src/main/java/com/diagbot/repository/BaseNodeRepository.java

@@ -1,6 +1,7 @@
 package com.diagbot.repository;
 
 
+import com.diagbot.entity.node.*;
 import com.diagbot.entity.node.base.BaseNode;
 import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
@@ -15,6 +16,12 @@ public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
     @Query("MATCH (n) RETURN DISTINCT(LABELS(n))")
     List<String> getLabels();
 
+    @Query("MATCH (n:实验室检查套餐) RETURN DISTINCT(KEYS(n))")
+    List<List<String>> getLisSetKeys();
+
+    @Query("MATCH (n:实验室检查) RETURN DISTINCT(KEYS(n))")
+    List<List<String>> getLisNameKeys();
+
     @Query("MATCH (c:药品化学物质类别)<-[r:药品相关药品化学物质类别]-(y:药品代码通用名)-[r1:药品相关药品通用名称]->(m:药品通用名称) " +
             " RETURN DISTINCT(m.name)+'::'+c.name")
     List<String> getMedHuaXueClass();
@@ -31,7 +38,7 @@ public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
             " RETURN DISTINCT(m.name)+'::'+c.name")
     List<String> getMedJiePouClass();
 
-    @Query("match(s:症状) return distinct s.name")
+    @Query("match(s) where any(label in labels(s) where label in ['症状','体征']) return distinct s.name")
     List<String> getSymptomClass();
 
     @Query("match(d:医保疾病名称)-[r:医保疾病名称相关性别]->(h) return DISTINCT d.name+'&'+h.name")
@@ -43,6 +50,28 @@ public interface BaseNodeRepository extends Neo4jRepository<BaseNode, Long> {
     @Query("match(d:医保疾病名称)-[r:医保疾病名称相关发病率]->(h) return DISTINCT d.name+'&'+h.name")
     List<String> getDisdistributionClass();
 
-    @Query("MATCH (n) WHERE EXISTS(n.拼音编码) AND n.拼音编码={py} RETURN n.name")
-    List<String> getNamebyPinYin(@Param("py") String pycode);
+    @Query("MATCH (n:实验室检查套餐名) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<LisSet> getLisSetbyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:实验室检查名称) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<LisName> getLisbyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:辅助检查名称) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<PacsName> getPacsbyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:医保疾病名称) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<YiBaoDiseaseName> getYiBaoDiseasebyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:医保手术与操作名称) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<YiBaoOperationName> getYiBaoOperationbyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:药品通用名称) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<Medicine> getMedicinebyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n:科室) WHERE EXISTS(n.拼音编码) AND n.拼音编码 CONTAINS {py} RETURN n")
+    List<Dept> getDeptbyPinYin(@Param("py") String pycode);
+
+    @Query("MATCH (n) WHERE labels(n)[0]={lab} and n.name={nm} set n.静态知识标识={sign}")
+    void updateStaticKnowledgeSign(@Param("lab") String lab,@Param("nm") String nm,@Param("sign") Integer sign);
+
 }

+ 5 - 10
src/main/java/com/diagbot/repository/DeptNode.java

@@ -1,7 +1,8 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.Dept;
-import com.diagbot.util.ListUtil;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -11,19 +12,13 @@ public class DeptNode {
     /**
      * 获取科室名称列表
      */
-    public List<String> getDeptNameList(String name, DeptRepository deptRepository) {
-
+    public List<String> getDeptNameList(String name, DeptRepository deptRepository, BaseNodeRepository baseNodeRepository) {
         List<String> deptlt = new ArrayList<>();
-
-        List<Dept> deptlist = deptRepository.findByNameContaining(name);
-        if (ListUtil.isNotEmpty(deptlist) && deptlist.size() > 100) {
-            deptlist = deptlist.subList(0, 100);
-        }
-
+        Page<Dept> deptPage = deptRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+        List<Dept> deptlist = deptPage.getContent();
         for (Dept dept : deptlist) {
             deptlt.add(dept.getName());
         }
-
         return deptlt;
     }
 }

+ 4 - 1
src/main/java/com/diagbot/repository/DeptRepository.java

@@ -1,6 +1,8 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.Dept;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
 
 import java.util.List;
@@ -11,5 +13,6 @@ public interface DeptRepository extends Neo4jRepository<Dept, Long> {
     List<Dept> findByNameContaining(String name);
 
     List<Dept> findByNameIs(String name);
-}
 
+    Page<Dept> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+}

+ 5 - 6
src/main/java/com/diagbot/repository/LisNameNode.java

@@ -12,10 +12,11 @@ import com.diagbot.entity.node.Group;
 import com.diagbot.entity.node.LisCritical;
 import com.diagbot.entity.node.LisName;
 import com.diagbot.entity.node.LisSet;
-import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
 import com.diagbot.util.StringUtil;
 import com.diagbot.vo.CriticalNeoVO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -173,17 +174,15 @@ public class LisNameNode {
 	/**
 	 * 获取化验细项名称列表
 	 */
-	public List<LisDetailDTO> getLisDetailList(String name, LisNameRepository lisRepository) {
+	public List<LisDetailDTO> getLisDetailList(String name, LisNameRepository lisRepository, BaseNodeRepository baseNodeRepository) {
 		String nodename, unit;
 		Double min, max;
 
 		List<LisDetailDTO> lislist = new ArrayList<>();
 		LisDetailDTO lisDetailDTO;
 
-		List<LisName> lislt = lisRepository.findByNameContaining(name);
-		if (ListUtil.isNotEmpty(lislt) && lislt.size() > 100) {
-			lislt = lislt.subList(0, 100);
-		}
+		Page<LisName> lisPage = lisRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+		List<LisName> lislt = lisPage.getContent();
 
 		for (LisName lis : lislt) {
 			lisDetailDTO = new LisDetailDTO();

+ 7 - 5
src/main/java/com/diagbot/repository/LisNameRepository.java

@@ -1,6 +1,8 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.LisName;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
 import org.springframework.data.repository.query.Param;
@@ -14,12 +16,12 @@ public interface LisNameRepository extends Neo4jRepository<LisName, Long> {
 
     List<LisName> findByNameContaining(String name);
 
-    @Query("MATCH (n:实验室检查) RETURN DISTINCT(KEYS(n))")
-    List<List<String>> getKeys();
-
     List<LisName> findByNameIn(List<String> names);
 
-    @Query("MATCH (n:实验室检查名称)-[r]->(b) where n.name contains {name} return n, collect(r), collect(b) limit 100")
-    List<LisName> findByNameContaininglimit100(@Param("name") String name);
+    Page<LisName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`实验室检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<LisName> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
 }
 

+ 5 - 7
src/main/java/com/diagbot/repository/LisSetNode.java

@@ -5,8 +5,9 @@ import com.diagbot.dto.LisBillNeoDTO;
 import com.diagbot.dto.NeoEntityDTO;
 import com.diagbot.entity.node.Gender;
 import com.diagbot.entity.node.LisSet;
-import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -143,16 +144,13 @@ public class LisSetNode {
 	/**
 	 * 获取化验套餐名称列表
 	 */
-	public List<String> getLISPackNameList(String name, LisSetRepository lisPackRepository) {
+	public List<String> getLISPackNameList(String name, LisSetRepository lisPackRepository, BaseNodeRepository baseNodeRepository) {
 		String nodename;
 
 		List<String> lispacklist = new ArrayList<>();
 
-		List<LisSet> lisSetlist = lisPackRepository.findByNameContaining(name);
-
-		if (ListUtil.isNotEmpty(lisSetlist) && lisSetlist.size() > 100) {
-			lisSetlist = lisSetlist.subList(0, 100);
-		}
+		Page<LisSet> lisPackPage = lisPackRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+		List<LisSet> lisSetlist = lisPackPage.getContent();
 
 		for (LisSet lisSet : lisSetlist) {
 			nodename = lisSet.getName();

+ 8 - 3
src/main/java/com/diagbot/repository/LisSetRepository.java

@@ -1,8 +1,11 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.LisSet;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
 import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -13,9 +16,11 @@ public interface LisSetRepository extends Neo4jRepository<LisSet, Long> {
 
     List<LisSet> findByNameContaining(String name);
 
-    @Query("MATCH (n:实验室检查套餐) RETURN DISTINCT(KEYS(n))")
-    List<List<String>> getKeys();
-
     List<LisSet> findByNameIn(List<String> names);
+
+    Page<LisSet> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`实验室检查套餐名`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<LisSet> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
 }
 

+ 8 - 3
src/main/java/com/diagbot/repository/MedRegNameNode.java

@@ -1,13 +1,17 @@
 package com.diagbot.repository;
 
+import com.diagbot.dto.BillNeoDTO;
+import com.diagbot.dto.DrugBillNeoDTO;
 import com.diagbot.dto.HighRiskNeoDTO;
-import com.diagbot.entity.node.MedCodeName;
-import com.diagbot.entity.node.MedRegName;
-import com.diagbot.entity.node.Medicine;
+import com.diagbot.dto.NodeNeoDTO;
+import com.diagbot.entity.node.*;
 import com.diagbot.vo.Drug;
 
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
 
 public class MedRegNameNode {
@@ -69,5 +73,6 @@ public class MedRegNameNode {
         return highRiskNeoDTOS;
     }
 
+
 }
 

+ 69 - 11
src/main/java/com/diagbot/repository/MedicineNode.java

@@ -1,9 +1,17 @@
 package com.diagbot.repository;
 
-import com.diagbot.dto.*;
-import com.diagbot.entity.node.*;
+import com.diagbot.dto.BillNeoDTO;
+import com.diagbot.dto.DrugBillNeoDTO;
+import com.diagbot.dto.DrugInfoDTO;
+import com.diagbot.dto.NodeNeoDTO;
+import com.diagbot.entity.node.Age;
+import com.diagbot.entity.node.Disease;
+import com.diagbot.entity.node.Group;
+import com.diagbot.entity.node.MedAllergen;
+import com.diagbot.entity.node.Medicine;
 import com.diagbot.util.ListUtil;
-import com.diagbot.util.NeoUtil;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.math.BigDecimal;
 import java.util.ArrayList;
@@ -16,16 +24,69 @@ public class MedicineNode {
 
     public DrugBillNeoDTO MedicinetoDrugDTO(Medicine medicine) {
         DrugBillNeoDTO drugBillNeoDTO = new DrugBillNeoDTO();
-        NodeInfo nodeInfo = new NodeInfo();
+
+        Set<Age> ages = medicine.getAge();
+        for (Age age : ages) {
+            NodeNeoDTO nodeNeoDTO = fillNodeNeoDTO(age);
+            drugBillNeoDTO.setAgeNeoDTO(nodeNeoDTO);
+        }
+
+        Set<Group> groups = medicine.getGroup();
+        for (Group group : groups) {
+            NodeNeoDTO nodeNeoDTO = new NodeNeoDTO();
+            nodeNeoDTO.setName(group.getName());
+            nodeNeoDTO.setTermtype(Constants.group);
+            drugBillNeoDTO.getGroup().add(nodeNeoDTO);
+        }
+
+
+        Set<MedAllergen> medAllergens = medicine.getMedAllergens();
+        for (MedAllergen medAllergen : medAllergens) {
+            NodeNeoDTO nodeNeoDTO = new NodeNeoDTO();
+            nodeNeoDTO.setName(medAllergen.getName());
+            nodeNeoDTO.setTermtype(Constants.yaoping);
+            drugBillNeoDTO.getAllergicmeds().add(nodeNeoDTO);
+        }
+
+
+        Set<Disease> diseases = medicine.getDisease();
+        for (Disease disease : diseases) {
+            NodeNeoDTO nodeNeoDTO = new NodeNeoDTO();
+            nodeNeoDTO.setName(disease.getName());
+            nodeNeoDTO.setTermtype(Constants.disease);
+            drugBillNeoDTO.getDisease().add(nodeNeoDTO);
+        }
 
         return drugBillNeoDTO;
     }
 
 
+    public NodeNeoDTO fillNodeNeoDTO(Age age) {
+        NodeNeoDTO nodeNeoDTO = new NodeNeoDTO();
+        Integer range;
+        BigDecimal max, min;
+
+        nodeNeoDTO.setName(age.getName());
+
+        max = (age.getMaxval() == null) ? null : new BigDecimal(age.getMaxval());
+        nodeNeoDTO.setMax(max);
+
+        min = (age.getMinval() == null) ? null : new BigDecimal(age.getMinval());
+        nodeNeoDTO.setMin(min);
+
+        range = (age.getRange() == null) ? 0 : age.getRange();
+        nodeNeoDTO.setValType(range);
+
+        nodeNeoDTO.setName(age.getTermname());
+
+        return nodeNeoDTO;
+    }
+
+
     /**
      * 处理处方开单合理性
      */
-    public List<BillNeoDTO> getDrugBill(Map<String, String> medsterm, MedicineRepository medicineRepository) {
+    public List<BillNeoDTO> getMedicineBill(Map<String, String> medsterm, MedicineRepository medicineRepository) {
         List<BillNeoDTO> billNeoDTOs = new ArrayList<>();
         BillNeoDTO billNeoDTO;
 
@@ -61,17 +122,14 @@ public class MedicineNode {
     /**
      * 获取药品商品名称列表
      */
-    public List<DrugInfoDTO> getMedicineList(String name, MedicineRepository medicineRepository) {
+    public List<DrugInfoDTO> getMedicineList(String name, MedicineRepository medicineRepository, BaseNodeRepository baseNodeRepository) {
         String nodename;
 
         List<DrugInfoDTO> medslist = new ArrayList<>();
         DrugInfoDTO drugInfoDTO;
 
-        List<Medicine> medicines = medicineRepository.findByNameContaining(name);
-
-        if (ListUtil.isNotEmpty(medicines) && medicines.size() > 100) {
-            medicines = medicines.subList(0, 100);
-        }
+        Page<Medicine> medicinePage = medicineRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+        List<Medicine> medicines = medicinePage.getContent();
 
         for (Medicine med : medicines) {
             drugInfoDTO = new DrugInfoDTO();

+ 10 - 0
src/main/java/com/diagbot/repository/MedicineRepository.java

@@ -1,7 +1,11 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.Medicine;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -13,5 +17,11 @@ public interface MedicineRepository extends Neo4jRepository<Medicine, Long> {
     List<Medicine> findByNameContaining(String name);
 
     List<Medicine> findByNameIn(List<String> names);
+
+    Page<Medicine> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`药品通用名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<Medicine> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
 }
 

+ 7 - 7
src/main/java/com/diagbot/repository/PacsNameNode.java

@@ -14,8 +14,9 @@ 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.util.ListUtil;
 import com.diagbot.util.NeoUtil;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -101,7 +102,7 @@ public class PacsNameNode {
         for (OralMedicine conflict_medicine : conflict_medicines) {
             nodeInfo = new NodeInfo();
             nodeInfo.setName(conflict_medicine.getName());
-            nodeInfo.setTypeval(Constants.oralmed);
+            nodeInfo.setTypeval(Constants.yaoping);
             pacsBillNeoDTO.getOralmeds().add(NeoUtil.updateNodeInfo(nodeInfo));
         }
 
@@ -183,15 +184,14 @@ public class PacsNameNode {
     /**
      * 获取辅检名称列表
      */
-    public List<String> getPACSNameList(String name, PacsNameRepository pacsRepository) {
+    public List<String> getPACSNameList(String name, PacsNameRepository pacsRepository, BaseNodeRepository baseNodeRepository) {
         String pacsname;
 
         List<String> pacslist = new ArrayList<>();
 
-        List<PacsName> pacslt = pacsRepository.findByNameContaining(name);
-        if (ListUtil.isNotEmpty(pacslt) && pacslt.size() > 100) {
-            pacslt = pacslt.subList(0, 100);
-        }
+        Page<PacsName> pacsPage = pacsRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+
+        List<PacsName> pacslt = pacsPage.getContent();
 
         for (PacsName pacs : pacslt) {
             pacsname = pacs.getName();

+ 11 - 0
src/main/java/com/diagbot/repository/PacsNameRepository.java

@@ -1,7 +1,11 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.PacsName;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -13,5 +17,12 @@ public interface PacsNameRepository extends Neo4jRepository<PacsName, Long> {
     List<PacsName> findByNameContaining(String name);
 
     List<PacsName> findByNameIn(List<String> names);
+
+    Page<PacsName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`辅助检查名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<PacsName> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
+
 }
 

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

@@ -10,6 +10,8 @@ public interface SymptomNameRepository extends Neo4jRepository<Symptom, Long> {
 
     List<Symptom> findByNameIs(String name);
 
+    List<Symptom> findByNameIn(List<String> names);
+
     List<Symptom> findByNameContaining(String name);
 }
 

+ 6 - 6
src/main/java/com/diagbot/repository/YiBaoDiseaseNode.java

@@ -8,8 +8,9 @@ import com.diagbot.entity.node.GuoLinICD_10Code;
 import com.diagbot.entity.node.PathwayName;
 import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.entity.node.YiBaoICD_10Code;
-import com.diagbot.util.ListUtil;
 import com.diagbot.vo.NeoPushVO;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -246,16 +247,15 @@ public class YiBaoDiseaseNode {
 	/**
 	 * 获取疾病名称列表
 	 */
-	public List<DiseaseInfoDTO> getDiseaseNameList(String name, YiBaoDiseaseRepository diseaseRepository) {
+	public List<DiseaseInfoDTO> getDiseaseNameList(String name, YiBaoDiseaseRepository diseaseRepository, BaseNodeRepository baseNodeRepository) {
 		String icdname;
 
 		List<String> dislist = new ArrayList<>();
 		List<DiseaseInfoDTO> diseaseInfoDTOList = new ArrayList<>();
 
-		List<YiBaoDiseaseName> diseases = diseaseRepository.findByNameContaining(name);
-		if (ListUtil.isNotEmpty(diseases) && diseases.size() > 100) {
-			diseases = diseases.subList(0, 100);
-		}
+		Page<YiBaoDiseaseName> diseasesPage
+				= diseaseRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+		List<YiBaoDiseaseName> diseases = diseasesPage.getContent();
 
 		for (YiBaoDiseaseName dis : diseases) {
 			icdname = dis.getName();

+ 10 - 0
src/main/java/com/diagbot/repository/YiBaoDiseaseRepository.java

@@ -1,7 +1,11 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.YiBaoDiseaseName;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -13,5 +17,11 @@ public interface YiBaoDiseaseRepository extends Neo4jRepository<YiBaoDiseaseName
     List<YiBaoDiseaseName> findByNameContaining(String name);
 
     List<YiBaoDiseaseName> findByNameIn(List<String> names);
+
+    Page<YiBaoDiseaseName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`医保疾病名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<YiBaoDiseaseName> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
 }
 

+ 74 - 71
src/main/java/com/diagbot/repository/YiBaoOperationNameNode.java

@@ -27,6 +27,8 @@ import com.diagbot.util.CoreUtil;
 import com.diagbot.util.ListUtil;
 import com.diagbot.util.NeoUtil;
 import com.diagbot.util.StringUtil;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -89,7 +91,7 @@ public class YiBaoOperationNameNode {
         for (OralMedicine conflict_oralmed : conflict_oralmeds) {
             nodeInfo = new NodeInfo();
             nodeInfo.setName(conflict_oralmed.getName());
-            nodeInfo.setTypeval(Constants.oralmed);
+            nodeInfo.setTypeval(Constants.yaoping);
             opBillNeoDTO.getOralmeds().add(NeoUtil.updateNodeInfo(nodeInfo));
         }
 
@@ -168,16 +170,15 @@ public class YiBaoOperationNameNode {
     /**
      * 获取手术操作名称列表
      */
-    public List<OperationInfoDTO> getOperationList(String name, YiBaoOperationNameRepository operationRepository) {
+    public List<OperationInfoDTO> getOperationList(String name, YiBaoOperationNameRepository operationRepository, BaseNodeRepository baseNodeRepository) {
         String nodename;
 
         List<OperationInfoDTO> opslist = new ArrayList<>();
         OperationInfoDTO opInfoDTO;
 
-        List<YiBaoOperationName> operations = operationRepository.findByNameContaining(name);
-        if (ListUtil.isNotEmpty(operations) && operations.size() > 100) {
-            operations = operations.subList(0, 100);
-        }
+        Page<YiBaoOperationName> operationPage = operationRepository.findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(name, name, PageRequest.of(0, 100));
+
+        List<YiBaoOperationName> operations = operationPage.getContent();
 
         for (YiBaoOperationName op : operations) {
             opInfoDTO = new OperationInfoDTO();
@@ -243,88 +244,90 @@ public class YiBaoOperationNameNode {
             String cond = operation.getHighriskcond();
             JSONObject jobj = JSONObject.parseObject(cond);
 
-            // 判断年龄
-            JSONObject ageobj = jobj.getJSONObject("年龄");
-
-            nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO("年龄", ageobj);
-            if (null != wordCrfDTO.getAge()) {
-                int age = wordCrfDTO.getAge();
-                match = CoreUtil.compareNum(nodeNeoDTO, age);
-                if (match) {
-                    nodeNeoDTO.setName("年龄:" + age);
-                    nodeNeoDTO.setVal("年龄:" + age);
-                    nodeNeoDTO.setTermtype(TypeEnum.age.getName());
-                    highRiskNeoDTO.getFactor().add(nodeNeoDTO);
+            if (null!=jobj) {
+                // 判断年龄
+                JSONObject ageobj = jobj.getJSONObject("年龄");
+
+                nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO("年龄", ageobj);
+                if (null != wordCrfDTO.getAge()) {
+                    int age = wordCrfDTO.getAge();
+                    match = CoreUtil.compareNum(nodeNeoDTO, age);
+                    if (match) {
+                        nodeNeoDTO.setName("年龄:" + age);
+                        nodeNeoDTO.setVal("年龄:" + age);
+                        nodeNeoDTO.setTermtype(TypeEnum.age.getName());
+                        highRiskNeoDTO.getFactor().add(nodeNeoDTO);
+                    }
                 }
-            }
 
-            // 判断生命体征和查体
-            VitalLabel vitalLabel = wordCrfDTO.getVitalLabel();
-            JSONObject vitalobj = jobj.getJSONObject("生命体征及查体");
-            for (String key : vitalobj.keySet()) {
-                nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO(key, vitalobj.getJSONObject(key));
-                res = CoreUtil.compareVital(nodeNeoDTO, vitalLabel);
-
-                if ((Boolean) res.get("flag")) {
-                    nodeNeoDTO.setVal(res.get("msg").toString());
-                    nodeNeoDTO.setTermtype(TypeEnum.vital.getName());
-                    highRiskNeoDTO.getFactor().add(nodeNeoDTO);
-                }
-            }
+                // 判断生命体征和查体
+                VitalLabel vitalLabel = wordCrfDTO.getVitalLabel();
+                JSONObject vitalobj = jobj.getJSONObject("生命体征及查体");
+                for (String key : vitalobj.keySet()) {
+                    nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO(key, vitalobj.getJSONObject(key));
+                    res = CoreUtil.compareVital(nodeNeoDTO, vitalLabel);
 
-            // 判断合并疾病
-            List<Item> diags = wordCrfDTO.getDiag();
-            JSONObject diagobj = jobj.getJSONObject("合并疾病");
-            for (String key : diagobj.keySet()) {
-                for (Item item : diags) {
-                    if (StringUtil.isNotBlank(item.getUniqueName()) && item.getUniqueName().equals(key)) {
-                        nodeNeoDTO = new NodeNeoDTO();
-                        nodeNeoDTO.setName(item.getUniqueName());
-                        nodeNeoDTO.setVal(item.getUniqueName());
-                        nodeNeoDTO.setTermtype(TypeEnum.disease.getName());
+                    if ((Boolean) res.get("flag")) {
+                        nodeNeoDTO.setVal(res.get("msg").toString());
+                        nodeNeoDTO.setTermtype(TypeEnum.vital.getName());
                         highRiskNeoDTO.getFactor().add(nodeNeoDTO);
                     }
                 }
-            }
 
-            // 判断化验结果
-            List<com.diagbot.biz.push.entity.Lis> lislist = wordCrfDTO.getLis();
-            JSONObject lisobj = jobj.getJSONObject("化验结果");
-            for (String key : lisobj.keySet()) {
-                nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO(key, lisobj.getJSONObject(key));
-                for (com.diagbot.biz.push.entity.Lis lis : lislist) {
-                    String name = lis.getUniqueName();
-                    if (nodeNeoDTO.getName().equals(name)) {
-                        res = CoreUtil.compareLis(nodeNeoDTO, lis);
-
-                        if ((Boolean) res.get("flag")) {
-                            nodeNeoDTO.setVal(res.get("msg").toString());
-                            nodeNeoDTO.setTermtype(TypeEnum.lis.getName());
+                // 判断合并疾病
+                List<Item> diags = wordCrfDTO.getDiag();
+                JSONObject diagobj = jobj.getJSONObject("合并疾病");
+                for (String key : diagobj.keySet()) {
+                    for (Item item : diags) {
+                        if (StringUtil.isNotBlank(item.getUniqueName()) && item.getUniqueName().equals(key)) {
+                            nodeNeoDTO = new NodeNeoDTO();
+                            nodeNeoDTO.setName(item.getUniqueName());
+                            nodeNeoDTO.setVal(item.getUniqueName());
+                            nodeNeoDTO.setTermtype(TypeEnum.disease.getName());
                             highRiskNeoDTO.getFactor().add(nodeNeoDTO);
                         }
                     }
                 }
-            }
 
-            // 判断辅检结果
-            PacsLabel pacslbl = wordCrfDTO.getPacsLabel();
+                // 判断化验结果
+                List<com.diagbot.biz.push.entity.Lis> lislist = wordCrfDTO.getLis();
+                JSONObject lisobj = jobj.getJSONObject("化验结果");
+                for (String key : lisobj.keySet()) {
+                    nodeNeoDTO = NeoUtil.jsontoNodeNeoDTO(key, lisobj.getJSONObject(key));
+                    for (com.diagbot.biz.push.entity.Lis lis : lislist) {
+                        String name = lis.getUniqueName();
+                        if (nodeNeoDTO.getName().equals(name)) {
+                            res = CoreUtil.compareLis(nodeNeoDTO, lis);
+
+                            if ((Boolean) res.get("flag")) {
+                                nodeNeoDTO.setVal(res.get("msg").toString());
+                                nodeNeoDTO.setTermtype(TypeEnum.lis.getName());
+                                highRiskNeoDTO.getFactor().add(nodeNeoDTO);
+                            }
+                        }
+                    }
+                }
 
-            JSONObject pacsobj = jobj.getJSONObject("辅检结果描述");
-            for (String key : pacsobj.keySet()) {
+                // 判断辅检结果
+                PacsLabel pacslbl = wordCrfDTO.getPacsLabel();
 
-                for (Item item : pacslbl.getRes()) {
-                    if (StringUtil.isNotBlank(item.getUniqueName()) && item.getUniqueName().contains(key)) {
-                        nodeNeoDTO = new NodeNeoDTO();
-                        nodeNeoDTO.setName(item.getUniqueName());
-                        nodeNeoDTO.setVal(item.getUniqueName());
-                        nodeNeoDTO.setTermtype(TypeEnum.pacs.getName());
-                        highRiskNeoDTO.getFactor().add(nodeNeoDTO);
+                JSONObject pacsobj = jobj.getJSONObject("辅检结果描述");
+                for (String key : pacsobj.keySet()) {
+
+                    for (Item item : pacslbl.getRes()) {
+                        if (StringUtil.isNotBlank(item.getUniqueName()) && item.getUniqueName().contains(key)) {
+                            nodeNeoDTO = new NodeNeoDTO();
+                            nodeNeoDTO.setName(item.getUniqueName());
+                            nodeNeoDTO.setVal(item.getUniqueName());
+                            nodeNeoDTO.setTermtype(TypeEnum.pacs.getName());
+                            highRiskNeoDTO.getFactor().add(nodeNeoDTO);
+                        }
                     }
                 }
-            }
 
-            if (highRiskNeoDTO.getFactor().size() > 0) {
-                highRiskNeoDTO.setType(TypeEnum.operation.getName());
+                if (highRiskNeoDTO.getFactor().size() > 0) {
+                    highRiskNeoDTO.setType(TypeEnum.operation.getName());
+                }
             }
         } catch (Exception ex) {
             ex.printStackTrace();

+ 10 - 0
src/main/java/com/diagbot/repository/YiBaoOperationNameRepository.java

@@ -1,7 +1,11 @@
 package com.diagbot.repository;
 
 import com.diagbot.entity.node.YiBaoOperationName;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.neo4j.annotation.Query;
 import org.springframework.data.neo4j.repository.Neo4jRepository;
+import org.springframework.data.repository.query.Param;
 
 import java.util.List;
 
@@ -13,4 +17,10 @@ public interface YiBaoOperationNameRepository extends Neo4jRepository<YiBaoOpera
     List<YiBaoOperationName> findByNameContaining(String name);
 
     List<YiBaoOperationName> findByNameIn(List<String> names);
+
+    Page<YiBaoOperationName> findByNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(String name, String pycode, Pageable pageable);
+
+    @Query("MATCH (n:`医保手术和操作名称`)-[r]-(m) WHERE n.`静态知识标识` = $isKL  AND (toLower(n.`name`) CONTAINS toLower($name) OR toLower(n.`拼音编码`) CONTAINS toLower($pycode))  RETURN n, collect(r), collect(m) limit $size")
+    List<YiBaoOperationName> findByIsKLAndNameContainingIgnoreCaseOrPycodeContainingIgnoreCase(@Param("isKL") Integer isKL, @Param("name") String name, @Param("pycode") String pycode, @Param("size") Integer size);
+
 }

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

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.diagbot.entity.FollowupPlanMapping;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 手术随访计划映射表 服务类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2020-09-24
+ */
+public interface FollowupPlanMappingService extends IService<FollowupPlanMapping> {
+
+}

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

@@ -0,0 +1,20 @@
+package com.diagbot.service.impl;
+
+import com.diagbot.entity.FollowupPlanMapping;
+import com.diagbot.mapper.FollowupPlanMappingMapper;
+import com.diagbot.service.FollowupPlanMappingService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 手术随访计划映射表 服务实现类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2020-09-24
+ */
+@Service
+public class FollowupPlanMappingServiceImpl extends ServiceImpl<FollowupPlanMappingMapper, FollowupPlanMapping> implements FollowupPlanMappingService {
+
+}

+ 18 - 0
src/main/java/com/diagbot/util/NeoUtil.java

@@ -3,6 +3,7 @@ package com.diagbot.util;
 import com.alibaba.fastjson.JSONObject;
 import com.diagbot.dto.NodeNeoDTO;
 import com.diagbot.dto.PushBaseDTO;
+import com.diagbot.entity.node.YiBaoDiseaseName;
 import com.diagbot.repository.Constants;
 import com.diagbot.repository.NodeInfo;
 import com.diagbot.repository.datautil;
@@ -121,4 +122,21 @@ public class NeoUtil {
 
         return medtype;
     }
+
+    public static boolean matchBasic(YiBaoDiseaseName disease, int gender_code, int age){
+        boolean match = true;
+        String gender_neo4j = disease.getGender();
+        String age_neo4j = disease.getAge();
+        if((gender_neo4j != null && gender_neo4j.equals("男") && gender_code != 1) ||
+                (gender_neo4j != null && gender_neo4j.equals("女") && gender_code != 2)){
+            match = false;
+        }else if(age_neo4j != null){
+            String[] betweenAge = age_neo4j.split("-");
+            if(betweenAge.length == 2 && (age < Integer.parseInt(betweenAge[0])
+                    || age > Integer.parseInt(betweenAge[1]))){
+                match = false;
+            }
+        }
+        return match;
+    }
 }

+ 21 - 2
src/main/java/com/diagbot/util/RedisUtil.java

@@ -43,7 +43,7 @@ public class RedisUtil {
      * @param map
      * @param type
      */
-    public void updateValueByType(Map<String, String> map, String type) {
+    public void updateValue(Map<String, String> map, String type) {
         redisTemplate.opsForValue().set(type, map);
     }
 
@@ -53,10 +53,20 @@ public class RedisUtil {
      * @param key
      * @param list
      */
-    public void updateValueByType(String key, List<String> list) {
+    public void updateValue(String key, List<String> list) {
         redisTemplate.opsForValue().set(key, list);
     }
 
+    /**
+     * 更新指定的数据
+     *
+     * @param key
+     * @param str
+     */
+    public void updateValue(String key, String str) {
+        redisTemplate.opsForValue().set(key, str);
+    }
+
     /**
      * 根据前缀删除key
      *
@@ -79,6 +89,15 @@ public class RedisUtil {
         return redisTemplate.opsForValue().get(key);
     }
 
+    /**
+     * 根据指定key获取value
+     *
+     * @param key 键
+     */
+    public String getWithString(String key) {
+        return (String)redisTemplate.opsForValue().get(key);
+    }
+
     /**
      * 删除key
      *

+ 32 - 7
src/main/java/com/diagbot/util/StringUtil.java

@@ -65,7 +65,7 @@ public class StringUtil {
      */
     public static String remove_ctl(String str) {
         String trim = "";
-        if(StringUtils.isNotEmpty(str)){
+        if (StringUtils.isNotEmpty(str)) {
             trim = str.replaceAll("\r|\n|\r\n", "").trim();
         }
         return trim;
@@ -195,11 +195,11 @@ public class StringUtil {
      * @param target
      * @return
      */
-//    public static boolean isSameContent(List<String> source, List<String> target) {
-//        Set<String> sourceSet = Sets.newHashSet(source);
-//        Set<String> targetSet = Sets.newHashSet(target);
-//        return Sets.difference(sourceSet, targetSet).isEmpty() && Sets.difference(targetSet, sourceSet).isEmpty();
-//    }
+    //    public static boolean isSameContent(List<String> source, List<String> target) {
+    //        Set<String> sourceSet = Sets.newHashSet(source);
+    //        Set<String> targetSet = Sets.newHashSet(target);
+    //        return Sets.difference(sourceSet, targetSet).isEmpty() && Sets.difference(targetSet, sourceSet).isEmpty();
+    //    }
 
     /**
      * 解析时间
@@ -231,7 +231,7 @@ public class StringUtil {
      * @param datetime
      * @return
      */
-    public static Date parseDateTime(String datetime,String[] dateFormats) {
+    public static Date parseDateTime(String datetime, String[] dateFormats) {
         Date date = null;
         try {
             datetime = remove_ctl(datetime);
@@ -249,4 +249,29 @@ public class StringUtil {
         }
     }
 
+    /**
+     * 是否是纯字母
+     *
+     * @param word
+     * @return
+     */
+    public static Boolean isWord(String word) {
+        Boolean isWord = false;
+        if (word.trim().matches("[a-zA-Z]+")) {
+            isWord = true;
+        }
+        return isWord;
+    }
+
+    // 测试主函数
+    public static void main(String args[]) {
+        System.out.println(StringUtil.isWord("  "));
+        System.out.println(StringUtil.isWord(""));
+        System.out.println(StringUtil.isWord("高e"));
+        System.out.println(StringUtil.isWord("e e"));
+        System.out.println(StringUtil.isWord("ee"));
+        System.out.println(StringUtil.isWord("   ee   "));
+        System.out.println(StringUtil.isWord("Gao"));
+    }
+
 }

+ 9 - 1
src/main/java/com/diagbot/vo/StaticKnowledgeIndexVO.java

@@ -3,6 +3,7 @@ package com.diagbot.vo;
 import lombok.Getter;
 import lombok.Setter;
 
+import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 
@@ -17,10 +18,17 @@ public class StaticKnowledgeIndexVO {
     /**
      * 检索内容
      */
+    @NotBlank(message = "请输入检索内容")
     private String inputStr;
     /**
      * 检索类型(多选):0-全部、1-诊断、2-药品、3-检验、4-检查、5-手术和操作
      */
     @NotNull(message = "请输入检索类型")
     private List<Integer> types;
-}
+
+    /**
+     * 是否有静态知识:0-无,1-有
+     */
+    @NotNull(message = "请输入是否有静态知识")
+    private Integer hasInfo;
+}

+ 19 - 0
src/main/java/com/diagbot/vo/TestAllVO.java

@@ -0,0 +1,19 @@
+package com.diagbot.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 测试开单合理性
+ * </p>
+ *
+ * @author zhoutg
+ * @since 2020-07-28
+ */
+@Data
+public class TestAllVO implements Serializable {
+
+    private String path;
+}

+ 3 - 0
src/main/java/com/diagbot/vo/TestLineVO.java

@@ -21,4 +21,7 @@ public class TestLineVO implements Serializable {
 
     // sheet的索引,从0开始
     private int sheetIndex = 0;
+
+    // true 表示随机取一条,false表示取全部
+    private boolean getOne = false;
 }

+ 1 - 1
src/main/java/com/diagbot/web/CacheController.java

@@ -33,7 +33,7 @@ public class CacheController {
     @SysLogger("clear")
     public RespDTO<Boolean> clear() {
         cacheFacade.clear();
-        cacheFacade.clearLoadCache();
+        cacheFacade.loadDrugTypeCache();
         return RespDTO.onSuc(true);
     }
 

+ 1 - 1
src/main/java/com/diagbot/web/Cn2SpellController.java

@@ -27,7 +27,7 @@ public class Cn2SpellController {
     private Cn2SpellFacade cn2SpellFacade;
 
     @ApiOperation(value = "拼音转化拼音首字母[by:gaodm]",
-            notes = "")
+            notes = "cnList: 汉字列表")
     @PostMapping("/cn2Spell")
     @SysLogger("cn2Spell")
     public RespDTO<Cn2SpellDTO> cn2Spell(@RequestBody Cn2SpellVO cn2SpellVO) {

+ 1 - 1
src/main/java/com/diagbot/web/StaticKnowledgeController.java

@@ -30,7 +30,7 @@ public class StaticKnowledgeController {
     @ApiOperation(value = "更新是否有静态信息状态[zhaops]",
             notes = "type: 术语类型<br>" +
                     "name: 标准术语名称<br>" +
-                    "是否有静态知识:0-无,1-有<br>")
+                    "hasInfo:是否有静态知识:0-无,1-有<br>")
     @PostMapping("/updateHasInfoStatus")
     public RespDTO<Boolean> updateHasInfoStatus(@Valid @RequestBody HasStaticKnowledgeVO hasStaticKnowledgeVO) {
         Boolean data = staticKnowledgeFacade.updateHasInfoStatus(hasStaticKnowledgeVO);

+ 4 - 3
src/main/java/com/diagbot/web/TestController.java

@@ -5,6 +5,7 @@ import com.diagbot.dto.StandConvertCrfBatchDTO;
 import com.diagbot.dto.StandConvertCrfDTO;
 import com.diagbot.facade.TestFacade;
 import com.diagbot.vo.StandConvertCrfVO;
+import com.diagbot.vo.TestAllVO;
 import com.diagbot.vo.TestLineVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -125,10 +126,10 @@ public class TestController {
         return RespDTO.onSuc(testFacade.testHighRiskProcess(file, testLineVO));
     }
 
-    @ApiOperation(value = "批量测试[zhoutg]", notes = "")
+    @ApiOperation(value = "批量测试[zhoutg]", notes = "参数:目录所在路径,示例:D:\\newSVN\\2020新版CDSS\\05.其他资料\\数据")
     @PostMapping("/testAll")
-    public RespDTO<Map<String, Object>> testAll() {
-        return RespDTO.onSuc(testFacade.testAll());
+    public RespDTO<Map<String, Object>> testAll(TestAllVO testAllVO) {
+        return RespDTO.onSuc(testFacade.testAll(testAllVO));
     }
 }
 

+ 2 - 0
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"/>

+ 17 - 0
src/main/resources/mapper/FollowupPlanMappingMapper.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.diagbot.mapper.FollowupPlanMappingMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.FollowupPlanMapping">
+        <id column="id" property="id" />
+        <result column="is_deleted" property="isDeleted" />
+        <result column="gmt_create" property="gmtCreate" />
+        <result column="gmt_modified" property="gmtModified" />
+        <result column="creator" property="creator" />
+        <result column="modifier" property="modifier" />
+        <result column="operation_name" property="operationName" />
+        <result column="standard_name" property="standardName" />
+    </resultMap>
+
+</mapper>