ソースを参照

经典病历及诊疗指南代码合并

wangsy 10 ヶ月 前
コミット
26b7b25e32
55 ファイル変更2500 行追加175 行削除
  1. 29 58
      pom.xml
  2. 39 0
      src/main/java/com/diagbot/dto/CaseBatchDTO.java
  3. 40 0
      src/main/java/com/diagbot/dto/ClassicCaseDTO.java
  4. 43 0
      src/main/java/com/diagbot/dto/ClassicCaseDetailDTO.java
  5. 42 0
      src/main/java/com/diagbot/dto/ClassicCaseIndexDTO.java
  6. 1 1
      src/main/java/com/diagbot/dto/ConceptDetailDTO.java
  7. 1 0
      src/main/java/com/diagbot/dto/DiseaseItemDTO.java
  8. 68 0
      src/main/java/com/diagbot/dto/KlClassicCaseDTO.java
  9. 1 1
      src/main/java/com/diagbot/dto/KlConceptDetailDTO.java
  10. 5 0
      src/main/java/com/diagbot/dto/PushDTO.java
  11. 1 1
      src/main/java/com/diagbot/dto/StaticKnowledgeDetailDTO.java
  12. 4 0
      src/main/java/com/diagbot/dto/StaticKnowledgeIndexDTO.java
  13. 1 1
      src/main/java/com/diagbot/entity/GraphConceptDetail.java
  14. 195 0
      src/main/java/com/diagbot/entity/KlCaseDetail.java
  15. 139 0
      src/main/java/com/diagbot/entity/KlClassicCase.java
  16. 42 0
      src/main/java/com/diagbot/entity/KlClassicCaseInfo.java
  17. 1 1
      src/main/java/com/diagbot/entity/KlConceptDetail.java
  18. 81 0
      src/main/java/com/diagbot/entity/KlDiagHospital.java
  19. 2 1
      src/main/java/com/diagbot/enums/LexiconEnum.java
  20. 2 1
      src/main/java/com/diagbot/enums/PushRelationTypeEnum.java
  21. 35 0
      src/main/java/com/diagbot/facade/KlCaseDetailFacade.java
  22. 560 0
      src/main/java/com/diagbot/facade/KlClassicCaseFacade.java
  23. 15 0
      src/main/java/com/diagbot/facade/KlClassicCaseInfoFacade.java
  24. 44 7
      src/main/java/com/diagbot/facade/KlConceptStaticFacade.java
  25. 15 0
      src/main/java/com/diagbot/facade/KlDiagHospitalFacade.java
  26. 23 0
      src/main/java/com/diagbot/facade/KlRelationFacade.java
  27. 3 0
      src/main/java/com/diagbot/facade/OtherTipFacade.java
  28. 17 0
      src/main/java/com/diagbot/mapper/KlCaseDetailMapper.java
  29. 32 0
      src/main/java/com/diagbot/mapper/KlClassicCaseInfoMapper.java
  30. 26 0
      src/main/java/com/diagbot/mapper/KlClassicCaseMapper.java
  31. 16 0
      src/main/java/com/diagbot/mapper/KlDiagHospitalMapper.java
  32. 54 11
      src/main/java/com/diagbot/process/OtherTipProcess.java
  33. 30 14
      src/main/java/com/diagbot/process/PushProcess.java
  34. 17 0
      src/main/java/com/diagbot/service/KlCaseDetailService.java
  35. 25 0
      src/main/java/com/diagbot/service/KlClassicCaseInfoService.java
  36. 25 0
      src/main/java/com/diagbot/service/KlClassicCaseService.java
  37. 16 0
      src/main/java/com/diagbot/service/KlDiagHospitalService.java
  38. 23 0
      src/main/java/com/diagbot/service/impl/KlCaseDetailServiceImpl.java
  39. 48 0
      src/main/java/com/diagbot/service/impl/KlClassicCaseInfoServiceImpl.java
  40. 34 0
      src/main/java/com/diagbot/service/impl/KlClassicCaseServiceImpl.java
  41. 1 1
      src/main/java/com/diagbot/service/impl/KlConceptDetailServiceImpl.java
  42. 21 0
      src/main/java/com/diagbot/service/impl/KlDiagHospitalServiceImpl.java
  43. 33 0
      src/main/java/com/diagbot/vo/KlClassicCasePageVO.java
  44. 63 0
      src/main/java/com/diagbot/vo/KlClassicCaseVO.java
  45. 1 1
      src/main/java/com/diagbot/vo/KlConceptDetailVO.java
  46. 1 1
      src/main/java/com/diagbot/vo/StaticKnowledgeVO.java
  47. 68 14
      src/main/java/com/diagbot/web/KlConceptStaticController.java
  48. 9 9
      src/main/resources/application-dev.yml
  49. 21 0
      src/main/resources/mapper/KlCaseDetailMapper.xml
  50. 134 0
      src/main/resources/mapper/KlClassicCaseInfoMapper.xml
  51. 67 0
      src/main/resources/mapper/KlClassicCaseMapper.xml
  52. 47 0
      src/main/resources/mapper/KlConceptMapper.xml
  53. 149 0
      src/main/resources/mapper/KlConceptStaticMapper.xml
  54. 20 0
      src/main/resources/mapper/KlDiagHospitalMapper.xml
  55. 70 52
      src/main/resources/mapper/KlRelationMapper.xml

+ 29 - 58
pom.xml

@@ -220,63 +220,34 @@
 
 
     <build>
-    <plugins>
-        <plugin>
-            <artifactId>maven-dependency-plugin</artifactId>
-            <executions>
-                <execution>
-                    <id>copy</id>
-                    <phase>package</phase>
-                    <goals>
-                        <goal>copy-dependencies</goal>
-                    </goals>
-                    <configuration>
-                        <outputDirectory>${project.build.directory}/lib</outputDirectory>
-                    </configuration>
-                </execution>
-            </executions>
-        </plugin>
-        <plugin>
-            <artifactId>maven-resources-plugin</artifactId>
-            <executions>
-                <execution>
-                    <id>copy-resources</id>
-                    <phase>package</phase>
-                    <goals>
-                        <goal>copy-resources</goal>
-                    </goals>
-                    <configuration>
-                        <resources>
-                            <resource>
-                                <directory>src/main/resources</directory>
-                            </resource>
-                        </resources>
-                        <outputDirectory>${project.build.directory}/resources</outputDirectory>
-                    </configuration>
-                </execution>
-            </executions>
-        </plugin>
-        <plugin>
-            <artifactId>maven-jar-plugin</artifactId>
-            <configuration>
-                <excludes>
-                    <exclude>mapper</exclude>
-                    <exclude>*.**</exclude>
-                    <exclude>**/*.xml</exclude>
-                    <exclude>**/*.yml</exclude>
-                </excludes>
-                <archive>
-                    <manifest>
-                        <mainClass>${main-class}</mainClass>
-                        <addClasspath>true</addClasspath>
-                        <classpathPrefix>lib/</classpathPrefix>
-                        <useUniqueVersions>false</useUniqueVersions>
-                    </manifest>
-                </archive>
-                <outputDirectory>${project.build.directory}</outputDirectory>
-            </configuration>
-        </plugin>
-    </plugins>
-</build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <!-- 添加docker-maven插件 -->
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>1.1.1</version>
+                <configuration>
+                    <imageName>${docker.image.prefix}/${project.artifactId}:${project.version}</imageName>
+                    <forceTags>true</forceTags>
+                    <!--镜像的FROM,使用压缩的小镜像-->
+                    <baseImage>frolvlad/alpine-oraclejre8:slim</baseImage>
+                    <entryPoint>["java", "-jar", "-Xms256m", "-Xmx4096m", "-Duser.timezone=GMT+8", "/${project.build.finalName}.jar"]</entryPoint>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                    <serverId>docker-registry</serverId>
+                    <registryUrl>${registryUrl}</registryUrl>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
 
 </project>

+ 39 - 0
src/main/java/com/diagbot/dto/CaseBatchDTO.java

@@ -0,0 +1,39 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/6/7 10:27
+ */
+@Getter
+@Setter
+public class CaseBatchDTO {
+    private Long id;
+    private Integer status;
+    private String name;
+    private String synonyms;
+    private Integer type;
+    private Integer age;
+    private String sex;
+    private String dept;
+    //病例标题
+    private String title;
+    private String chief;
+    private String present;
+    private String pasts;
+    private String personal;
+    private String family;
+    private String marital;
+    private String vital;
+    private String lis;
+    private String pacs;
+    //西医诊断
+    private String diag;
+    //中医诊断
+    private String tcmdiag;
+    //医嘱
+    private String drug;
+}

+ 40 - 0
src/main/java/com/diagbot/dto/ClassicCaseDTO.java

@@ -0,0 +1,40 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/8/20 15:51
+ */
+@Getter
+@Setter
+public class ClassicCaseDTO {
+    /**
+     * 标准术语id
+     */
+    private Long id;
+    /**
+     * 标准术语
+     */
+    private String name;
+
+    /**
+     * 词性
+     */
+    private String type;
+
+    /**
+     * 静态知识明细
+     */
+    private Map<String, List<ClassicCaseDetailDTO>> details;
+
+    /**
+     * 量表结构
+     */
+    private ConceptScaleDTO scale;
+}

+ 43 - 0
src/main/java/com/diagbot/dto/ClassicCaseDetailDTO.java

@@ -0,0 +1,43 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/2/24 13:39
+ */
+@Getter
+@Setter
+public class ClassicCaseDetailDTO {
+    /**
+     * 提示概念id
+     */
+    private Long conceptId;
+
+    /**
+     * 提示明细标题
+     */
+    private String title;
+
+    /**
+     * 提示明细内容
+     */
+    private String content;
+
+    /**
+     * 纯文本
+     */
+    private String text;
+
+    /**
+     * 提示明细序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案,5-诊疗指南
+     */
+    private String contentType;
+}

+ 42 - 0
src/main/java/com/diagbot/dto/ClassicCaseIndexDTO.java

@@ -0,0 +1,42 @@
+package com.diagbot.dto;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2020/8/18 15:59
+ */
+@Getter
+@Setter
+public class ClassicCaseIndexDTO {
+    /**
+     * 术语id
+     */
+    private Long id;
+    /**
+     * 术语名称
+     */
+    private String name;
+    /**
+     * 词性
+     */
+    private Integer type;
+    /**
+     * 词性
+     */
+    private String typeName;
+    /**
+     * 同义词
+     */
+    private String retrievalName;
+    /**
+     * 是否有静态知识
+     */
+    private Integer hasInfo = 0;
+    /**
+     * 启用禁用
+     */
+    private Integer status;
+}

+ 1 - 1
src/main/java/com/diagbot/dto/ConceptDetailDTO.java

@@ -37,7 +37,7 @@ public class ConceptDetailDTO {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private String contentType;
 }

+ 1 - 0
src/main/java/com/diagbot/dto/DiseaseItemDTO.java

@@ -14,4 +14,5 @@ public class DiseaseItemDTO {
     private String diseaseName;
     private Long relationId;
     private String itemName;
+    private String DrugC;
 }

+ 68 - 0
src/main/java/com/diagbot/dto/KlClassicCaseDTO.java

@@ -0,0 +1,68 @@
+package com.diagbot.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/2/24 13:38
+ */
+@Getter
+@Setter
+public class KlClassicCaseDTO {
+    /**
+     * 术语id
+     */
+    private Long id;
+    /**
+     * 术语名称
+     */
+    private String name;
+    /**
+     * 关联标题
+     */
+    private String title;
+    /**
+     * 术语类型(词性)
+     */
+    private Integer type;
+    /**
+     * 术语类型(词性)
+     */
+    private String typeName;
+    /**
+     * 临床路径名称
+     */
+    private String clinicalPathwayName;
+    /**
+     * 注意事项名称
+     */
+    private String noticeName;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date gmtModified;
+    /**
+     * 修改人
+     */
+    private String modifier;
+    /**
+     * 启用状态
+     */
+    private Integer status;
+    /**
+     * 明细
+     */
+    private List<KlConceptDetailDTO> details;
+    /**
+     * 量表结构
+     */
+    private KlScaleByIdDTO scale;
+
+}

+ 1 - 1
src/main/java/com/diagbot/dto/KlConceptDetailDTO.java

@@ -37,7 +37,7 @@ public class KlConceptDetailDTO {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private String contentType;
 }

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

@@ -28,6 +28,8 @@ public class PushDTO {
     private List<PushBaseDTO> operations = Lists.newArrayList();
     // 药品
     private List<PushBaseDTO> medicines = Lists.newArrayList();
+    // 分类后的药品
+    private Map<String, List<PushBaseDTO>> medicine = new LinkedHashMap<>();
     // 并发症
     private List<PushBaseDTO> complications = Lists.newArrayList();
     // 量表
@@ -38,6 +40,9 @@ public class PushDTO {
     private Map<String, List<PushBaseDTO>> dis = new LinkedHashMap<>();
     // 一般治疗
     private List<TreatDTO> treat = Lists.newArrayList();
+    //经典病例
+    private List<PushBaseDTO> classicCase = Lists.newArrayList();
+
 
     // 记录调试信息
     private Map<String, Object> debug = new LinkedHashMap<>();

+ 1 - 1
src/main/java/com/diagbot/dto/StaticKnowledgeDetailDTO.java

@@ -37,7 +37,7 @@ public class StaticKnowledgeDetailDTO {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private String contentType;
 }

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

@@ -64,6 +64,10 @@ public class StaticKnowledgeIndexDTO {
      * 是否有治疗方案静态知识
      */
     private Integer hasTreatInfo = 0;
+    /**
+     * 是否有诊疗指南静态知识
+     */
+    private Integer hasGuideInfo = 0;
     /**
      * 启用禁用
      */

+ 1 - 1
src/main/java/com/diagbot/entity/GraphConceptDetail.java

@@ -74,7 +74,7 @@ public class GraphConceptDetail implements Serializable {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private String contentType;
 

+ 195 - 0
src/main/java/com/diagbot/entity/KlCaseDetail.java

@@ -0,0 +1,195 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 静态知识内容表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-21
+ */
+public class KlCaseDetail implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 提示概念id
+     */
+    private Long conceptId;
+
+    /**
+     * 提示明细标题
+     */
+    private String title;
+
+    /**
+     * 提示明细内容
+     */
+    private String content;
+
+    /**
+     * 纯文本
+     */
+    private String text;
+
+    /**
+     * 提示明细序号
+     */
+    private Integer orderNo;
+
+    /**
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     */
+    private String contentType;
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getConceptId() {
+        return conceptId;
+    }
+
+    public void setConceptId(Long conceptId) {
+        this.conceptId = conceptId;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getContent() {
+        return content;
+    }
+
+    public void setContent(String content) {
+        this.content = content;
+    }
+
+    public String getText() {
+        return text;
+    }
+
+    public void setText(String text) {
+        this.text = text;
+    }
+
+    public Integer getOrderNo() {
+        return orderNo;
+    }
+
+    public void setOrderNo(Integer orderNo) {
+        this.orderNo = orderNo;
+    }
+
+    public String getContentType() {
+        return contentType;
+    }
+
+    public void setContentType(String contentType) {
+        this.contentType = contentType;
+    }
+
+    @Override
+    public String toString() {
+        return "KlConceptDetail{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", conceptId=" + conceptId +
+                ", title=" + title +
+                ", content=" + content +
+                ", text=" + text +
+                ", orderNo=" + orderNo +
+                ", contentType=" + contentType +
+                "}";
+    }
+}

+ 139 - 0
src/main/java/com/diagbot/entity/KlClassicCase.java

@@ -0,0 +1,139 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 经典病例标准术语表
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-21
+ */
+public class KlClassicCase {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 是否删除,N:未删除,Y:删除
+     */
+    private String isDeleted;
+
+    /**
+     * 记录创建时间
+     */
+    private Date gmtCreate;
+
+    /**
+     * 记录修改时间,如果时间是1970年则表示纪录未修改
+     */
+    private Date gmtModified;
+
+    /**
+     * 创建人,0表示无创建人值
+     */
+    private String creator;
+
+    /**
+     * 修改人,如果为0则表示纪录未修改
+     */
+    private String modifier;
+
+    /**
+     * 提示概念id
+     */
+    private Long conceptId;
+
+    /**
+     * 启用状态(0:禁用,1:启用)
+     */
+    private Integer status;
+
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getIsDeleted() {
+        return isDeleted;
+    }
+
+    public void setIsDeleted(String isDeleted) {
+        this.isDeleted = isDeleted;
+    }
+
+    public Date getGmtCreate() {
+        return gmtCreate;
+    }
+
+    public void setGmtCreate(Date gmtCreate) {
+        this.gmtCreate = gmtCreate;
+    }
+
+    public Date getGmtModified() {
+        return gmtModified;
+    }
+
+    public void setGmtModified(Date gmtModified) {
+        this.gmtModified = gmtModified;
+    }
+
+    public String getCreator() {
+        return creator;
+    }
+
+    public void setCreator(String creator) {
+        this.creator = creator;
+    }
+
+    public String getModifier() {
+        return modifier;
+    }
+
+    public void setModifier(String modifier) {
+        this.modifier = modifier;
+    }
+
+    public Long getConceptId() {
+        return conceptId;
+    }
+
+    public void setConceptId(Long conceptId) {
+        this.conceptId = conceptId;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    @Override
+    public String toString() {
+        return "KlConceptStatic{" +
+                "id=" + id +
+                ", isDeleted=" + isDeleted +
+                ", gmtCreate=" + gmtCreate +
+                ", gmtModified=" + gmtModified +
+                ", creator=" + creator +
+                ", modifier=" + modifier +
+                ", conceptId=" + conceptId +
+                ", status=" + status +
+                "}";
+    }
+}

+ 42 - 0
src/main/java/com/diagbot/entity/KlClassicCaseInfo.java

@@ -0,0 +1,42 @@
+package com.diagbot.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/6/7 10:27
+ */
+@Getter
+@Setter
+public class KlClassicCaseInfo implements Serializable {
+    private Long id;
+    private String isDeleted;
+    private Date gmtCreate;
+    private Date gmtModified;
+    private String creator;
+    private String modifier;
+    private Long conceptId;
+    private Integer age;
+    private String sex;
+    private String dept;
+    //病例标题
+    private String title;
+    private String chief;
+    private String present;
+    private String pasts;
+    private String personal;
+    private String family;
+    private String marital;
+    private String vital;
+    private String lis;
+    private String pacs;
+    private String diag;
+    private String tcmdiag;
+    private String drug;
+    private Integer status;
+}

+ 1 - 1
src/main/java/com/diagbot/entity/KlConceptDetail.java

@@ -75,7 +75,7 @@ public class KlConceptDetail implements Serializable {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案,5-诊疗指南
      */
     private String contentType;
 

+ 81 - 0
src/main/java/com/diagbot/entity/KlDiagHospital.java

@@ -0,0 +1,81 @@
+package com.diagbot.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * <p>
+ * 基层医院诊断信息表
+ * </p>
+ *
+ * @author dsYun
+ * @since 2024-08-01
+ */
+@Getter
+@Setter
+public class KlDiagHospital 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 disType;
+
+    /**
+     * 医院诊断编码
+     */
+    private String disCode;
+
+    /**
+     * 诊断名称
+     */
+    private String disName;
+
+    /**
+     * 国家诊断编码
+     */
+    private String countryCode;
+
+    /**
+     * 国家诊断名称
+     */
+    private String countryName;
+
+}

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

@@ -83,7 +83,8 @@ public enum LexiconEnum implements KeyedNamed {
     OperationClassNode(407,"手术和操作类别根节点"),
     LisClassNode(408,"实验室检查类别根节点"),
     PacsClassNode(409,"辅助检查类别根节点"),
-    Age(410,"年龄");
+    Age(410,"年龄"),
+    ClassicCase(411,"经典病例");
 
 
     @Setter

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

@@ -18,7 +18,8 @@ public enum PushRelationTypeEnum {
     OPERATION(507L, "疾病相关手术治疗"),
     DIFFDIAGNOSE(508L, "疾病相关鉴别诊断"),
     SCALE(509L, "疾病相关量表"),
-    NURSE(510L, "疾病相关护理");
+    NURSE(510L, "疾病相关护理"),
+    CLASSICCASE(516L, "经典病例");
 
     @Setter
     private long key;

+ 35 - 0
src/main/java/com/diagbot/facade/KlCaseDetailFacade.java

@@ -0,0 +1,35 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.diagbot.dto.KlClassicCaseDTO;
+import com.diagbot.dto.KlConceptDetailDTO;
+import com.diagbot.dto.KlScaleByIdDTO;
+import com.diagbot.entity.KlCaseDetail;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlConcept;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.enums.LexiconEnum;
+import com.diagbot.service.KlConceptDetailService;
+import com.diagbot.service.impl.KlCaseDetailServiceImpl;
+import com.diagbot.service.impl.KlConceptDetailServiceImpl;
+import com.diagbot.util.BeanUtil;
+import com.diagbot.util.ListUtil;
+import com.diagbot.vo.IdVO;
+import com.diagbot.vo.KlScaleByIdVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/2/24 11:25
+ */
+@Component
+public class KlCaseDetailFacade extends KlCaseDetailServiceImpl {
+
+}

+ 560 - 0
src/main/java/com/diagbot/facade/KlClassicCaseFacade.java

@@ -0,0 +1,560 @@
+package com.diagbot.facade;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.*;
+import com.diagbot.entity.*;
+import com.diagbot.enums.IsDeleteEnum;
+import com.diagbot.enums.LexiconEnum;
+import com.diagbot.enums.StatusEnum;
+import com.diagbot.exception.CommonErrorCode;
+import com.diagbot.exception.CommonException;
+import com.diagbot.service.KlCaseDetailService;
+import com.diagbot.service.KlConceptDetailService;
+import com.diagbot.service.KlConceptService;
+import com.diagbot.service.KlDiseaseService;
+import com.diagbot.service.impl.KlClassicCaseServiceImpl;
+import com.diagbot.service.impl.KlDiseaseServiceImpl;
+import com.diagbot.util.*;
+import com.diagbot.vo.*;
+import com.google.common.collect.Lists;
+import io.micrometer.core.instrument.util.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2021/1/26 13:07
+ */
+@Component
+public class KlClassicCaseFacade extends KlClassicCaseServiceImpl {
+    @Autowired
+    private KlConceptFacade klConceptFacade;
+    @Autowired
+    private KlRelationFacade klRelationFacade;
+    @Autowired
+    private KlConceptDetailFacade klConceptDetailFacade;
+    @Autowired
+    private KlConceptScaleFacade klConceptScaleFacade;
+    @Autowired
+    private KlDictionaryInfoFacade klDictionaryInfoFacade;
+    @Autowired
+    private KlScaleFacade klScaleFacade;
+    @Autowired
+    private KlClassicCaseFacade klClassicCaseFacade;
+    @Autowired
+    private KlCaseDetailFacade klCaseDetailFacade;
+    @Autowired
+    private KlClassicCaseInfoFacade klClassicCaseInfoFacade;
+    @Autowired
+    @Qualifier("klConceptDetailServiceImpl")
+    private KlConceptDetailService klConceptDetailService;
+    @Autowired
+    @Qualifier("klCaseDetailServiceImpl")
+    private KlCaseDetailService klCaseDetailService;
+    @Autowired
+    private DictionaryFacade dictionaryFacade;
+    @Autowired
+    private MedRetrievalFacade medRetrievalFacade;
+    @Autowired
+    KlRegulationBaseFacade klRegulationBaseFacade;
+    KlConceptService klConceptService;
+
+    /**
+     * 获取经典病历
+     *
+     * @param staticKnowledgeVO
+     * @return
+     */
+    public StaticKnowledgeDTO getClassicCaseInfo(StaticKnowledgeVO staticKnowledgeVO) {
+        StaticKnowledgeDTO classicCaseDTO = new StaticKnowledgeDTO();
+        Integer type = convertType(staticKnowledgeVO.getType(), 1);
+        if (type == null) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确类型(11-经典病例)");
+        }
+        staticKnowledgeVO.setType(type);
+
+        KlConcept concept = klConceptFacade.getOne(new QueryWrapper<KlConcept>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("lib_name", staticKnowledgeVO.getName())
+                .eq("status", StatusEnum.Enable.getKey())
+                .eq("lib_type", type), false);
+
+        Integer sameType = 0;
+
+        KlClassicCase caseInfo = this.getOne(new QueryWrapper<KlClassicCase>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("concept_id", concept.getId())
+                .eq("status", StatusEnum.Enable.getKey()), false);
+        if (caseInfo != null) {
+            staticKnowledgeVO.setType(sameType);
+        }
+
+        //经典病例详情
+//        String sql = "";
+//        if (ListUtil.isNotEmpty(staticKnowledgeVO.getContentTypes())) {
+//
+//            for (Integer contentType : staticKnowledgeVO.getContentTypes()) {
+//                if (contentType.equals(0)) {
+//                    sql = "";
+//                    break;
+//                }
+//                if (StringUtil.isNotBlank(sql)) {
+//                    sql += " or ";
+//                }
+//                sql += "find_in_set(" + contentType + ",content_type)";
+//            }
+//            if (StringUtil.isNotBlank(sql)) {
+//                sql = "(" + sql + ")";
+//            }
+//        }
+        List<KlCaseDetail> details = klCaseDetailFacade.list(new QueryWrapper<KlCaseDetail>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("concept_id", concept.getId())
+//                .apply(sql)
+                .orderByAsc("order_no"));
+
+        List<StaticKnowledgeDetailDTO> detailList
+                = BeanUtil.listCopyTo(details, StaticKnowledgeDetailDTO.class);
+        List<StaticKnowledgeDetailDTO> introduceList = detailList
+                .stream()
+                .collect(Collectors.toList());
+        //Map<String, List<StaticKnowledgeDetailDTO>> detailMap = new HashMap<>();
+        Map<String, List<StaticKnowledgeDetailDTO>> detailMap = new HashMap<>();
+        if (ListUtil.isNotEmpty(introduceList) && staticKnowledgeVO.getContentTypes().contains(1)) {
+            detailMap.put("经典病历", introduceList);
+        }
+
+        if (type.equals(LexiconEnum.Scale.getKey())) {
+            //量表详情
+            ScaleVO scaleVO = new ScaleVO();
+            BeanUtil.copyProperties(staticKnowledgeVO, scaleVO);
+            classicCaseDTO.setScale(getScaleStructure(scaleVO, concept.getId()));
+        }
+
+        classicCaseDTO.setDetails(detailMap);
+        classicCaseDTO.setId(concept.getId());
+        classicCaseDTO.setName(concept.getLibName());
+        Integer retType = convertType(concept.getLibType(), 2);
+        classicCaseDTO.setType(retType == null ? "" : retType.toString());
+
+        return classicCaseDTO;
+    }
+
+    /**
+     * 经典病例分页查询
+     *
+     * @param klClassicCasePageVO
+     * @return
+     */
+    @Override
+    public IPage<KlClassicCaseDTO> getClassicCase(KlClassicCasePageVO klClassicCasePageVO) {
+        Integer type = convertType(klClassicCasePageVO.getType(), 1);
+        klClassicCasePageVO.setType(type);
+
+        List<DictionaryInfoDTO> dicTypeName = dictionaryFacade.getListByGroupType(13);
+        Map<String, String> dicTypeNameMap
+                = EntityUtil.makeMapWithKeyValue(dicTypeName, "val", "name");
+
+        IPage<KlClassicCaseDTO> page = super.getClassicCase(klClassicCasePageVO);
+        List<KlClassicCaseDTO> records = page.getRecords();
+        List<Long> conceptIds = page.getRecords()
+                .stream()
+                .map(KlClassicCaseDTO::getId)
+                .collect(Collectors.toList());
+        if (ListUtil.isNotEmpty(conceptIds)) {
+            QueryWrapper<KlCaseDetail> qw = new QueryWrapper<>();
+            qw.in("concept_id", conceptIds)
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .orderByAsc("concept_id")
+                    .orderByAsc("order_no");
+            Map<Long, List<KlCaseDetail>> detailMap = klCaseDetailFacade.list(qw)
+                    .stream().collect(Collectors.groupingBy(KlCaseDetail::getConceptId));
+
+            records.forEach(record -> {
+                String typeName = LexiconEnum.getName(record.getType());
+                record.setTypeName(dicTypeNameMap.get(typeName));
+                Integer retType = convertType(record.getType(), 2);
+                record.setType(retType);
+                if (null != detailMap
+                        && detailMap.containsKey(record.getId())
+                        && ListUtil.isNotEmpty(detailMap.get(record.getId()))) {
+                    record.setTitle(detailMap.get(record.getId())
+                            .stream()
+                            .map(KlCaseDetail::getTitle)
+                            .collect(Collectors.joining("、")));
+                }
+            });
+        }
+        page.setRecords(records);
+        return page;
+    }
+
+    /**
+     * 启用禁用
+     *
+     * @param changeStatusVO
+     * @return
+     */
+    public Boolean changeCaseStatus(ChangeStatusVO changeStatusVO) {
+        //String userId = SysUserUtils.getCurrentPrincipleID();
+        if (changeStatusVO.getUserId() == null) {
+            changeStatusVO.setUserId(0L);
+        }
+        Date now = DateUtil.now();
+        //更新主表
+        this.update(new UpdateWrapper<KlClassicCase>()
+                .eq("concept_id", changeStatusVO.getId())
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .set("gmt_modified", now)
+                .set("modifier", changeStatusVO.getUserId())
+                .set("status", changeStatusVO.getStatus()));
+        //更新明细表
+        klCaseDetailService.update(new UpdateWrapper<KlCaseDetail>()
+                .eq("concept_id", changeStatusVO.getId())
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .set("gmt_modified", now)
+                .set("modifier", changeStatusVO.getUserId()));
+        return true;
+    }
+
+    /**
+     * 根据经典病历id获取病历信息
+     *
+     * @param idVO
+     * @return
+     */
+    public KlClassicCaseDTO getCaseById(IdVO idVO) {
+        KlClassicCaseDTO klClassicCaseDTO = new KlClassicCaseDTO();
+
+        List<DictionaryInfoDTO> dicTypeName = dictionaryFacade.getListByGroupType(13);
+        Map<String, String> dicTypeNameMap
+                = EntityUtil.makeMapWithKeyValue(dicTypeName, "val", "name");
+
+        KlConcept concept = klConceptFacade.getById(idVO.getId());
+        if (concept == null) {
+            return null;
+        }
+
+        KlClassicCase classicCase = this.getOne(new QueryWrapper<KlClassicCase>()
+                .eq("concept_id", idVO.getId()), false);
+
+        if (classicCase == null) {
+            return null;
+        }
+
+        List<KlCaseDetail> details = klCaseDetailFacade.list(new QueryWrapper<KlCaseDetail>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("concept_id", idVO.getId())
+                .orderByAsc("order_no"));
+
+        klClassicCaseDTO.setId(concept.getId());
+        klClassicCaseDTO.setName(concept.getLibName());
+        klClassicCaseDTO.setType(convertType(concept.getLibType(), 2));
+        klClassicCaseDTO.setTypeName(dicTypeNameMap.get(LexiconEnum.getName(concept.getLibType())));
+
+        klClassicCaseDTO.setStatus(classicCase.getStatus());
+        klClassicCaseDTO.setGmtModified(classicCase.getGmtModified());
+        klClassicCaseDTO.setModifier(classicCase.getModifier());
+
+        klClassicCaseDTO.setTitle(ListUtil.isNotEmpty(details)
+                ? details.stream().map(i -> i.getTitle()).collect(Collectors.joining("、"))
+                : "");
+        klClassicCaseDTO.setDetails(ListUtil.isNotEmpty(details)
+                ? BeanUtil.listCopyTo(details, KlConceptDetailDTO.class)
+                : new ArrayList<>());
+
+        //获取量表结构
+        if (concept.getLibType().equals(LexiconEnum.Scale.getKey())) {
+            KlScaleByIdVO klScaleByIdVO = new KlScaleByIdVO();
+            klScaleByIdVO.setId(classicCase.getId());
+            List<KlScaleByIdDTO> scaleList = klScaleFacade.getKlScaleById(klScaleByIdVO);
+            if (ListUtil.isNotEmpty(scaleList)) {
+                klClassicCaseDTO.setScale(scaleList.get(0));
+            }
+        }
+        return klClassicCaseDTO;
+    }
+
+    /**
+     * 保存记录(新增or修改)
+     *
+     * @param klClassicCaseVO
+     * @return
+     */
+    public Boolean saveOrUpdateCase(KlClassicCaseVO klClassicCaseVO) {
+        if (klClassicCaseVO.getUserId() == null) {
+            klClassicCaseVO.setUserId(0L);
+        }
+        Date now = DateUtil.now();
+
+        Integer type = convertType(klClassicCaseVO.getType(), 1);
+        klClassicCaseVO.setType(type);
+
+        KlConcept concept = new KlConcept();
+        if (klClassicCaseVO.getId() != null) {
+            concept = klConceptFacade.getById(klClassicCaseVO.getId());
+        } else {
+            concept = klConceptFacade.getOne(new QueryWrapper<KlConcept>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("lib_name", klClassicCaseVO.getName())
+                    .eq("lib_type", klClassicCaseVO.getType()), false);
+        }
+        if (concept == null) {
+            throw new CommonException(CommonErrorCode.NOT_EXISTS, "标准术语不存在");
+        }
+        if (!concept.getLibName().equals(klClassicCaseVO.getName())) {
+            throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "标准术语名称不允许修改");
+        }
+
+        Long conceptId = concept.getId();
+        KlClassicCase classicCase = this.getOne(new QueryWrapper<KlClassicCase>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("concept_id", concept.getId()), false);
+
+        if (classicCase == null) {
+            classicCase = new KlClassicCase();
+            classicCase.setId(null);
+            classicCase.setConceptId(concept.getId());
+            classicCase.setStatus(StatusEnum.Enable.getKey());
+            classicCase.setCreator(klClassicCaseVO.getUserId().toString());
+            classicCase.setGmtCreate(now);
+        }
+        classicCase.setModifier(klClassicCaseVO.getUserId().toString());
+        classicCase.setGmtModified(now);
+
+        List<KlCaseDetail> details = Lists.newLinkedList();
+        if (ListUtil.isNotEmpty(klClassicCaseVO.getDetails())) {
+            details = BeanUtil.listCopyTo(klClassicCaseVO.getDetails(), KlCaseDetail.class);
+        }
+        details.forEach(detail -> {
+            detail.setConceptId(conceptId);
+            detail.setCreator(klClassicCaseVO.getUserId().toString());
+            detail.setGmtCreate(now);
+            detail.setModifier(klClassicCaseVO.getUserId().toString());
+            detail.setGmtModified(now);
+        });
+
+        //保存经典病例基础信息
+        this.saveOrUpdate(classicCase);
+
+        //删除已有明细
+        klCaseDetailService.remove(new QueryWrapper<KlCaseDetail>()
+                .eq("concept_id", concept.getId()));
+
+        //保存新的明细
+        klCaseDetailService.saveBatch(details);
+
+        //保存量表明细
+        if (klClassicCaseVO.getSource() != null
+                && klClassicCaseVO.getSource().equals(1)
+                && klClassicCaseVO.getType().equals(LexiconEnum.Scale.getKey())) {
+            if (klClassicCaseVO.getScale() != null) {
+                klClassicCaseVO.getScale().setConceptId(concept.getId());
+                klClassicCaseVO.getScale().setModifier(concept.getModifier());
+                klScaleFacade.saveUpKlScaleAll(klClassicCaseVO.getScale());
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 页面展示类型转换
+     *
+     * @param type
+     * @param flag
+     * @return
+     */
+    public Integer convertType(Integer type, Integer flag) {
+        Integer retType = null;
+        if (type == null) {
+            return retType;
+        }
+        if (flag.equals(1)) {
+            //1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项、7-手术和操作
+            switch (type) {
+                case 1:
+                    retType = LexiconEnum.Disease.getKey();
+                    break;
+                case 2:
+                    retType = LexiconEnum.Medicine.getKey();
+                    break;
+                case 3:
+                    retType = LexiconEnum.LisName.getKey();
+                    break;
+                case 4:
+                    retType = LexiconEnum.LisSubName.getKey();
+                    break;
+                case 5:
+                    retType = LexiconEnum.PacsName.getKey();
+                    break;
+                case 6:
+                    retType = LexiconEnum.PacsSubName.getKey();
+                    break;
+                case 7:
+                    retType = LexiconEnum.Operation.getKey();
+                    break;
+                case 8:
+                    retType = LexiconEnum.Scale.getKey();
+                    break;
+                case 9:
+                    retType = LexiconEnum.Nurse.getKey();
+                    break;
+                case 10:
+                    retType = LexiconEnum.Law.getKey();
+                    break;
+                case 11:
+                    retType = LexiconEnum.ClassicCase.getKey();
+                    break;
+                default:
+                    break;
+            }
+        } else if (flag.equals(2)) {
+            if (type.equals(LexiconEnum.Disease.getKey())) {
+                retType = 1;
+            } else if (type.equals(LexiconEnum.Medicine.getKey())) {
+                retType = 2;
+            } else if (type.equals(LexiconEnum.LisName.getKey())) {
+                retType = 3;
+            } else if (type.equals(LexiconEnum.LisSubName.getKey())) {
+                retType = 4;
+            } else if (type.equals(LexiconEnum.PacsName.getKey())) {
+                retType = 5;
+            } else if (type.equals(LexiconEnum.PacsSubName.getKey())) {
+                retType = 6;
+            } else if (type.equals(LexiconEnum.Operation.getKey())) {
+                retType = 7;
+            } else if (type.equals(LexiconEnum.Scale.getKey())) {
+                retType = 8;
+            } else if (type.equals(LexiconEnum.Nurse.getKey())) {
+                retType = 9;
+            } else if (type.equals(LexiconEnum.Law.getKey())) {
+                retType = 10;
+            } else if (type.equals(LexiconEnum.ClassicCase.getKey())) {
+                retType = 11;
+            }
+        }
+        return retType;
+    }
+    /**
+     * 获取量表结构
+     *
+     * @param conceptId
+     * @return
+     */
+    public ConceptScaleDTO getScaleStructure(ScaleVO scaleVO, Long conceptId) {
+        ConceptScaleDTO retDTO = new ConceptScaleDTO();
+        List<KlConceptScale> scaleList = klConceptScaleFacade.list(new QueryWrapper<KlConceptScale>()
+                .eq("is_deleted", IsDeleteEnum.N.getKey())
+                .eq("concept_id", conceptId)
+                .orderByAsc("text_type", "group_num", "order_no"));
+        if (ListUtil.isEmpty(scaleList)) {
+            return null;
+        }
+        List<ConceptScaleDetailDTO> scaleDetailList = BeanUtil.listCopyTo(scaleList, ConceptScaleDetailDTO.class);
+        if (null != scaleVO) {
+            List<String> codeList = new ArrayList<>();
+            codeList = scaleDetailList.stream().filter(s -> StringUtils.isNotBlank(s.getRuleCode())).map(ac -> ac.getRuleCode()).collect(Collectors.toList());
+            scaleVO.setCodeList(codeList);
+            ScaleDTO scaleDTO = klRegulationBaseFacade.process(scaleVO);
+            List<String> codeListNew = scaleDTO.getCodeList(); //Arrays.asList("100001", "100013");
+            if (ListUtil.isNotEmpty(codeListNew)) {
+                for (String str : codeListNew) {
+                    for (ConceptScaleDetailDTO data2 : scaleDetailList) {
+                        if (null != data2.getRuleCode() && data2.getRuleCode().equals(str)) {
+                            data2.setMatch(1);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (null != scaleVO) {
+            List<String> codeList = new ArrayList<>();
+            codeList = scaleDetailList.stream().map(ac -> ac.getRuleCode()).collect(Collectors.toList());
+            scaleVO.setCodeList(codeList);
+            ScaleDTO scaleDTO = klRegulationBaseFacade.process(scaleVO);
+            List<String> codeListNew = scaleDTO.getCodeList(); //Arrays.asList("100001", "100013");
+            if (ListUtil.isNotEmpty(codeListNew)) {
+                for (String str : codeListNew) {
+                    for (ConceptScaleDetailDTO data2 : scaleDetailList) {
+                        if (null != data2.getRuleCode() && data2.getRuleCode().equals(str)) {
+                            data2.setMatch(1);
+                        }
+                    }
+                }
+            }
+        }
+
+        Map<Long, List<ConceptScaleDetailDTO>> parentMap
+                = scaleDetailList.stream().sorted(Comparator.comparing(ConceptScaleDetailDTO::getTextType).thenComparing(ConceptScaleDetailDTO::getGroupNum)).collect(Collectors.groupingBy(ConceptScaleDetailDTO::getParentId));
+        List<ConceptScaleDetailDTO> retScacleDetailList = parentMap.get(-1L);
+        if (ListUtil.isEmpty(retScacleDetailList)) {
+            return null;
+        }
+        List<ConceptScaleSubDTO> retList = Lists.newLinkedList();
+        Map<Integer, List<ConceptScaleDetailDTO>> groupMap
+                = retScacleDetailList.stream().collect(Collectors.groupingBy(ConceptScaleDetailDTO::getGroupNum));
+        for (Map.Entry<Integer, List<ConceptScaleDetailDTO>> entry : groupMap.entrySet()) {
+            ConceptScaleSubDTO subItem = new ConceptScaleSubDTO();
+            subItem.setGroupNum(entry.getKey());
+            subItem.setDetailList(entry.getValue());
+            retList.add(subItem);
+        }
+        for (ConceptScaleSubDTO subDTO : retList) {
+            scaleRecursion(subDTO, parentMap);
+        }
+        //排序
+        for (ConceptScaleSubDTO data : retList) {
+            if (ListUtil.isNotEmpty(data.getDetailList())) {
+                for (ConceptScaleDetailDTO datasub : data.getDetailList()) {
+                    if (ListUtil.isNotEmpty(datasub.getSubList())) {
+                        datasub.setSubList(datasub.getSubList().stream().sorted(Comparator.comparing(ConceptScaleSubDTO::getGroupNum)).collect(Collectors.toList()));
+                    }
+
+                }
+            }
+        }
+        retDTO.setScaleDetails(retList);
+        return retDTO;
+    }
+
+    /**
+     * 递归
+     *
+     * @param item
+     * @param treeMap
+     */
+    public ConceptScaleSubDTO scaleRecursion(ConceptScaleSubDTO item,
+                                             Map<Long, List<ConceptScaleDetailDTO>> treeMap) {
+        List<ConceptScaleDetailDTO> list = item.getDetailList();
+        if (ListUtil.isNotEmpty(list)) {
+            for (ConceptScaleDetailDTO detail : list) {
+                List<ConceptScaleDetailDTO> subDetailList = treeMap.get(detail.getId());
+                if (ListUtil.isNotEmpty(subDetailList)) {
+                    Map<Integer, List<ConceptScaleDetailDTO>> subMap
+                            = subDetailList.stream().collect(Collectors.groupingBy(ConceptScaleDetailDTO::getGroupNum));
+                    List<ConceptScaleSubDTO> subList = Lists.newLinkedList();
+                    for (Map.Entry<Integer, List<ConceptScaleDetailDTO>> subEntry : subMap.entrySet()) {
+                        ConceptScaleSubDTO subDTO = new ConceptScaleSubDTO();
+                        subDTO.setGroupNum(subEntry.getKey());
+                        subDTO.setDetailList(subEntry.getValue());
+                        scaleRecursion(subDTO, treeMap);
+                        subList.add(subDTO);
+                    }
+                    detail.setSubList(subList);
+                }
+            }
+        }
+        return item;
+    }
+
+}

+ 15 - 0
src/main/java/com/diagbot/facade/KlClassicCaseInfoFacade.java

@@ -0,0 +1,15 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.KlClassicCaseInfoServiceImpl;
+import com.diagbot.service.impl.KlClassicCaseServiceImpl;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Description:
+ * @author: gaodm
+ * @time: 2021/1/26 13:07
+ */
+@Component
+public class KlClassicCaseInfoFacade extends KlClassicCaseInfoServiceImpl {
+
+}

+ 44 - 7
src/main/java/com/diagbot/facade/KlConceptStaticFacade.java

@@ -15,11 +15,7 @@ import com.diagbot.dto.ScaleDTO;
 import com.diagbot.dto.StaticKnowledgeDTO;
 import com.diagbot.dto.StaticKnowledgeDetailDTO;
 import com.diagbot.dto.StaticKnowledgeIndexPageDTO;
-import com.diagbot.entity.KlConcept;
-import com.diagbot.entity.KlConceptDetail;
-import com.diagbot.entity.KlConceptScale;
-import com.diagbot.entity.KlConceptStatic;
-import com.diagbot.entity.KlRelation;
+import com.diagbot.entity.*;
 import com.diagbot.enums.IsDeleteEnum;
 import com.diagbot.enums.LexiconEnum;
 import com.diagbot.enums.StatusEnum;
@@ -75,6 +71,10 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
     private KlDictionaryInfoFacade klDictionaryInfoFacade;
     @Autowired
     private KlScaleFacade klScaleFacade;
+    @Autowired
+    private KlClassicCaseFacade klClassicCaseFacade;
+    @Autowired
+    private KlCaseDetailFacade klCaseDetailFacade;
 
     @Autowired
     @Qualifier("klConceptDetailServiceImpl")
@@ -253,6 +253,10 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                 .stream()
                 .filter(i -> Arrays.asList(i.getContentType().split(",")).contains("4"))
                 .collect(Collectors.toList());
+        List<StaticKnowledgeDetailDTO> guidelineList = detailList
+                .stream()
+                .filter(i -> Arrays.asList(i.getContentType().split(",")).contains("5"))
+                .collect(Collectors.toList());
         //Map<String, List<StaticKnowledgeDetailDTO>> detailMap = new HashMap<>();
         Map<String, List<StaticKnowledgeDetailDTO>> detailMap = new HashMap<>();
         if (ListUtil.isEmpty(staticKnowledgeVO.getContentTypes()) || staticKnowledgeVO.getContentTypes().contains(0)) {
@@ -268,6 +272,9 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
             if (ListUtil.isNotEmpty(treatInfoList)) {
                 detailMap.put("治疗方案", treatInfoList);
             }
+            if (ListUtil.isNotEmpty(guidelineList)) {
+                detailMap.put("诊疗指南", guidelineList);
+            }
         } else {
             if (ListUtil.isNotEmpty(introduceList) && staticKnowledgeVO.getContentTypes().contains(1)) {
                 detailMap.put("静态知识", introduceList);
@@ -281,6 +288,9 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
             if (ListUtil.isNotEmpty(treatInfoList) && staticKnowledgeVO.getContentTypes().contains(4)) {
                 detailMap.put("治疗方案", treatInfoList);
             }
+            if (ListUtil.isNotEmpty(guidelineList) && staticKnowledgeVO.getContentTypes().contains(5)) {
+                detailMap.put("诊疗指南", guidelineList);
+            }
         }
         if (type.equals(LexiconEnum.Scale.getKey())) {
             //量表详情
@@ -381,7 +391,8 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                     LexiconEnum.Operation.getKey(),
                     LexiconEnum.Scale.getKey(),
                     LexiconEnum.Nurse.getKey(),
-                    LexiconEnum.Law.getKey()));
+                    LexiconEnum.Law.getKey(),
+                    LexiconEnum.ClassicCase.getKey()));
         } else {
             if (types.contains(1)) {
                 staticKnowledgeIndexPageVO.getTypeIds().add(LexiconEnum.Disease.getKey());
@@ -409,6 +420,9 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
             if (types.contains(10)) {
                 staticKnowledgeIndexPageVO.getTypeIds().add(LexiconEnum.Law.getKey());
             }
+            if (types.contains(11)) {
+                staticKnowledgeIndexPageVO.getTypeIds().add(LexiconEnum.ClassicCase.getKey());
+            }
         }
         if (ListUtil.isEmpty(staticKnowledgeIndexPageVO.getTypeIds())) {
             throw new CommonException(CommonErrorCode.PARAM_IS_ERROR, "请输入正确的检索类型(多选):0-全部、1-诊断、2-药品、3-检验、4-检查、7-手术和操作、8-量表、9-护理、10-政策法规");
@@ -730,6 +744,9 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                 case 10:
                     retType = LexiconEnum.Law.getKey();
                     break;
+                case 11:
+                    retType = LexiconEnum.ClassicCase.getKey();
+                    break;
                 default:
                     break;
             }
@@ -754,6 +771,8 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                 retType = 9;
             } else if (type.equals(LexiconEnum.Law.getKey())) {
                 retType = 10;
+            } else if (type.equals(LexiconEnum.ClassicCase.getKey())) {
+                retType = 11;
             }
         }
         return retType;
@@ -789,7 +808,15 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                     .eq("is_deleted", IsDeleteEnum.N.getKey())
                     .eq("status", 1)
                     .in("concept_id", conceptIds));
-
+            List<KlClassicCase> caseList = klClassicCaseFacade.list(new QueryWrapper<KlClassicCase>()
+                    .eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .eq("status", 1)
+                    .in("concept_id", conceptIds));
+            for (KlClassicCase record : caseList) {
+                KlConceptStatic klConceptStatic = new KlConceptStatic();
+                BeanUtil.copyProperties(record,klConceptStatic);
+                staticList.add(klConceptStatic);
+            }
             if (ListUtil.isEmpty(staticList)) {
                 return retMap;
             }
@@ -808,6 +835,16 @@ public class KlConceptStaticFacade extends KlConceptStaticServiceImpl {
                 });
             }
             List<KlConceptDetail> conceptDetailList = klConceptDetailFacade.list(conceptDetailQueryWrapper);
+
+            QueryWrapper<KlCaseDetail> caseDetailQueryWrapper = new QueryWrapper<>();
+            caseDetailQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey())
+                    .in("concept_id", conceptIds);
+            List<KlCaseDetail> caseDetailList = klCaseDetailFacade.list(caseDetailQueryWrapper);
+            for (KlCaseDetail caseDetail : caseDetailList) {
+                KlConceptDetail klConceptDetail = new KlConceptDetail();
+                BeanUtil.copyProperties(caseDetail,klConceptDetail);
+                conceptDetailList.add(klConceptDetail);
+            }
             Map<Long, List<KlConceptDetail>> detailMap
                     = EntityUtil.makeEntityListMap(conceptDetailList, "conceptId");
 

+ 15 - 0
src/main/java/com/diagbot/facade/KlDiagHospitalFacade.java

@@ -0,0 +1,15 @@
+package com.diagbot.facade;
+
+import com.diagbot.service.impl.KlDiagHospitalServiceImpl;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * @Description:
+ * @author: dsYun
+ * @time: 2024/08/01 13:07
+ */
+@Component
+public class KlDiagHospitalFacade extends KlDiagHospitalServiceImpl {
+
+}

+ 23 - 0
src/main/java/com/diagbot/facade/KlRelationFacade.java

@@ -33,4 +33,27 @@ public class KlRelationFacade extends KlRelationServiceImpl {
         }
         return map;
     }
+
+    /**
+     * @Description:
+     * @param diseaseItemVO
+     * @return Map<Long, List<DiseaseItemDTO>>
+     * @author SGTY
+     * @create 2024.07.30
+     **/
+    public Map<Long, List<DiseaseItemDTO>> getInfoByDiseaseMap(DiseaseItemVO diseaseItemVO){
+        Map<Long, List<DiseaseItemDTO>> map = new HashMap<>();
+        List<DiseaseItemDTO> dtoList = this.getItemByDisease(diseaseItemVO);
+        if (ListUtil.isNotEmpty(dtoList)) {
+            for (DiseaseItemDTO diseaseItemDTO : dtoList) {
+                List<DiseaseItemDTO> items = new ArrayList<>();
+                if (null != map.get(diseaseItemDTO.getRelationId())) {
+                    items.addAll(map.get(diseaseItemDTO.getRelationId()));
+                }
+                items.add(diseaseItemDTO);
+                map.put(diseaseItemDTO.getRelationId(), items);
+            }
+        }
+        return map;
+    }
 }

+ 3 - 0
src/main/java/com/diagbot/facade/OtherTipFacade.java

@@ -40,6 +40,9 @@ public class OtherTipFacade {
         // 特殊规则——VTE结果
         otherTipProcess.processSpecial(wordCrfDTO, res);
 
+        // 特殊规则——超过基层医院诊治范围
+        otherTipProcess.processGrassroots(wordCrfDTO, res);
+
         // 结果去重处理
         commonFacade.dealMsg(res.getOtherList());
     }

+ 17 - 0
src/main/java/com/diagbot/mapper/KlCaseDetailMapper.java

@@ -0,0 +1,17 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.KlCaseDetail;
+import com.diagbot.entity.KlConceptDetail;
+
+/**
+ * <p>
+ * 经典病例内容表 Mapper 接口
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-21
+ */
+public interface KlCaseDetailMapper extends BaseMapper<KlCaseDetail> {
+
+}

+ 32 - 0
src/main/java/com/diagbot/mapper/KlClassicCaseInfoMapper.java

@@ -0,0 +1,32 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.vo.MappingConfigPageVO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经典病例表 Mapper 接口
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+public interface KlClassicCaseInfoMapper extends BaseMapper<KlClassicCaseInfo> {
+    /**
+     * 查询病例信息
+     *
+     * @param ids
+     * @return
+     */
+    List<KlClassicCaseInfo> listInfo(@Param("ids") List<Long> ids);
+
+    KlClassicCaseInfo getOneCase(@Param("conceptId") Long conceptId);
+
+}

+ 26 - 0
src/main/java/com/diagbot/mapper/KlClassicCaseMapper.java

@@ -0,0 +1,26 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.diagbot.dto.KlClassicCaseDTO;
+import com.diagbot.dto.KlConceptStaticDTO;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.entity.KlOperation;
+import com.diagbot.vo.KlClassicCasePageVO;
+import com.diagbot.vo.KlConceptStaticPageVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 经典病例表 Mapper 接口
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+public interface KlClassicCaseMapper extends BaseMapper<KlClassicCase> {
+
+    IPage<KlClassicCaseDTO> getClassicCase(@Param("klClassicCasePageVO") KlClassicCasePageVO klClassicCasePageVO);
+
+}

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

@@ -0,0 +1,16 @@
+package com.diagbot.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.diagbot.entity.KlDiagHospital;
+
+
+/**
+ * <p>
+ * 基层医院诊断信息表 Mapper 接口
+ * </p>
+ *
+ * @author dsYun
+ * @since 2024-08-01
+ */
+public interface KlDiagHospitalMapper extends BaseMapper<KlDiagHospital> {
+}

+ 54 - 11
src/main/java/com/diagbot/process/OtherTipProcess.java

@@ -1,5 +1,6 @@
 package com.diagbot.process;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.biz.push.entity.Scale;
@@ -9,11 +10,10 @@ import com.diagbot.dto.RuleBaseDTO;
 import com.diagbot.dto.RuleConditionDTO;
 import com.diagbot.dto.RuleExtDTO;
 import com.diagbot.dto.WordCrfDTO;
-import com.diagbot.enums.LexiconEnum;
-import com.diagbot.enums.RedisEnum;
-import com.diagbot.enums.RuleTypeEnum;
-import com.diagbot.enums.TypeEnum;
+import com.diagbot.entity.KlDiagHospital;
+import com.diagbot.enums.*;
 import com.diagbot.facade.CommonFacade;
+import com.diagbot.facade.KlDiagHospitalFacade;
 import com.diagbot.model.entity.PacsNum;
 import com.diagbot.model.label.PacsLabel;
 import com.diagbot.rule.AgeRule;
@@ -21,19 +21,14 @@ import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.GroupRule;
 import com.diagbot.rule.LisRule;
 import com.diagbot.rule.PacsRule;
-import com.diagbot.util.CoreUtil;
-import com.diagbot.util.DateUtil;
-import com.diagbot.util.ListUtil;
-import com.diagbot.util.MsgUtil;
-import com.diagbot.util.RedisUtil;
-import com.diagbot.util.ReflectUtil;
-import com.diagbot.util.StringUtil2B;
+import com.diagbot.util.*;
 import com.diagbot.vo.ItemExt;
 import com.diagbot.vo.RuleVO;
 import com.google.common.collect.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
@@ -59,6 +54,9 @@ public class OtherTipProcess {
     RedisUtil redisUtil;
     @Autowired
     AgeRule ageRule;
+    @Autowired
+    private KlDiagHospitalFacade klDiagHospitalFacade;
+
 
     /**
      * 处理业务——化验
@@ -292,6 +290,51 @@ public class OtherTipProcess {
         }
     }
 
+    /**
+     * 处理业务——超过基层医院诊治范围
+     *
+     * @param wordCrfDTO
+     * @param res
+     */
+    public void processGrassroots(WordCrfDTO wordCrfDTO, IndicationDTO res) {
+        List<BillMsg> otherList = res.getOtherList();
+        // 诊断
+        List<Item> diagList = wordCrfDTO.getDiag();
+        if (ListUtil.isEmpty(diagList)) {
+            diagList = wordCrfDTO.getDiagOrder();
+        }
+        // 诊断名称结果
+        List<String> diagNameList = new ArrayList<>();
+        if (ListUtil.isNotEmpty(diagList)) {
+            for (Item diag : diagList) {
+                String name = diag.getName();
+                if (StringUtil.isNotBlank(name)) {
+                    diagNameList.add(name);
+                }
+            }
+        }
+
+        // 获取基层医院不能真正的疾病
+        if (ListUtil.isNotEmpty(diagNameList)) {
+            QueryWrapper<KlDiagHospital> diagQueryWrapper = new QueryWrapper<>();
+            diagQueryWrapper.eq("is_deleted", IsDeleteEnum.N.getKey());
+            List<KlDiagHospital> diagHospitalList = klDiagHospitalFacade.list(diagQueryWrapper);
+            List<String> diagLists = new ArrayList<>();
+            diagHospitalList.forEach(item -> {
+                if (StringUtil.isNotEmpty(item.getDisName())) {
+                    diagLists.add(item.getDisName());
+                }
+            });
+            for (String name : diagNameList) {
+                if (diagLists.contains(name)) {
+                    String msg = name + "已超出基层诊治范围,建议转诊";
+                    BillMsg billMsg = MsgUtil.getCommonOtherMsg(TypeEnum.other.getName(), msg, null, null, null);
+                    CoreUtil.addBeanToList(otherList, billMsg);
+                }
+            }
+        }
+    }
+
     /**
      * 是否有效医嘱(6天)
      *

+ 30 - 14
src/main/java/com/diagbot/process/PushProcess.java

@@ -4,14 +4,7 @@ import com.diagbot.biz.push.entity.Item;
 import com.diagbot.biz.push.entity.Lis;
 import com.diagbot.biz.push.entity.Pacs;
 import com.diagbot.client.IcssPushServiceClient;
-import com.diagbot.dto.BaseDiagnoseDTO;
-import com.diagbot.dto.DiagnoseDTO;
-import com.diagbot.dto.NeoPushDTO;
-import com.diagbot.dto.PushBaseDTO;
-import com.diagbot.dto.PushDTO;
-import com.diagbot.dto.ReverseDTO;
-import com.diagbot.dto.TreatDTO;
-import com.diagbot.dto.WordCrfDTO;
+import com.diagbot.dto.*;
 import com.diagbot.dto.icss.FeatureRate;
 import com.diagbot.dto.icss.Response;
 import com.diagbot.dto.icss.ResponseData;
@@ -35,12 +28,7 @@ import com.diagbot.rule.CommonRule;
 import com.diagbot.rule.GroupRule;
 import com.diagbot.rule.LisRule;
 import com.diagbot.rule.VitalRule;
-import com.diagbot.util.BeanUtil;
-import com.diagbot.util.CoreUtil;
-import com.diagbot.util.EntityUtil;
-import com.diagbot.util.ListUtil;
-import com.diagbot.util.RedisUtil;
-import com.diagbot.util.StringUtil2B;
+import com.diagbot.util.*;
 import com.diagbot.vo.DiagnoseVO;
 import com.diagbot.vo.DiseaseItemVO;
 import com.diagbot.vo.IcssVo;
@@ -177,8 +165,29 @@ public class PushProcess {
             DiseaseItemVO diseaseItemVO = new DiseaseItemVO();
             diseaseItemVO.setDiseaseName(uniqueName);
             Map<Long, List<String>> items = klRelationFacade.getItemByDiseaseMap(diseaseItemVO);
+            Map<Long, List<DiseaseItemDTO>> infos = klRelationFacade.getInfoByDiseaseMap(diseaseItemVO);
             if (MapUtils.isNotEmpty(items)) {
                 if (ruleTypeList.contains("8") && ListUtil.isNotEmpty(items.get(PushRelationTypeEnum.DRUG.getKey()))) {
+                    // 将infos中键值为506的数据取出,以drugC聚合,如果drugC为空,则给map中的key赋值为“未分类药品”,“未分类药品”放在最后
+                    Map<String, List<PushBaseDTO>> unclassifiedDrugs = new LinkedHashMap<>();
+                    infos.get(PushRelationTypeEnum.DRUG.getKey()).forEach(x -> {
+                        PushBaseDTO pushBaseDTO = new PushBaseDTO();
+                        pushBaseDTO.setName(x.getItemName());
+                        // 确定药品分类,如果药品分类不为空则使用药品分类,否则使用"其他"
+                        String Classification = StringUtil.isNotBlank(x.getDrugC()) ? x.getDrugC() : "其他";
+                        // 根据药品分类,选择对应的Map进行操作
+                        Map<String, List<PushBaseDTO>> targetMap = Classification.equals("其他") ? unclassifiedDrugs : pushDTO.getMedicine();
+                        if (targetMap.containsKey(Classification)) {
+                            targetMap.get(Classification).add(pushBaseDTO);
+                        } else {
+                            List<PushBaseDTO> pushBaseDTOS = new ArrayList<>();
+                            pushBaseDTOS.add(pushBaseDTO);
+                            targetMap.put(Classification, pushBaseDTOS);
+                        }
+                    });
+                    if (MapUtils.isNotEmpty(unclassifiedDrugs)) {
+                        pushDTO.getMedicine().putAll(unclassifiedDrugs);
+                    }
                     pushDTO.setMedicines(items.get(PushRelationTypeEnum.DRUG.getKey()).stream().map(x -> {
                         PushBaseDTO pushBaseDTO = new PushBaseDTO();
                         pushBaseDTO.setName(x);
@@ -199,6 +208,13 @@ public class PushProcess {
                         return pushBaseDTO;
                     }).collect(Collectors.toList()));
                 }
+                if (ruleTypeList.contains("14") && ListUtil.isNotEmpty(items.get(PushRelationTypeEnum.CLASSICCASE.getKey()))) {
+                    pushDTO.setClassicCase(items.get(PushRelationTypeEnum.CLASSICCASE.getKey()).stream().map(x -> {
+                        PushBaseDTO pushBaseDTO = new PushBaseDTO();
+                        pushBaseDTO.setName(x);
+                        return pushBaseDTO;
+                    }).collect(Collectors.toList()));
+                }
             }
         }
         //        if (reverseInfoByDisName != null) {

+ 17 - 0
src/main/java/com/diagbot/service/KlCaseDetailService.java

@@ -0,0 +1,17 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.KlCaseDetail;
+import com.diagbot.entity.KlConceptDetail;
+
+/**
+ * <p>
+ * 静态知识内容表 服务类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-21
+ */
+public interface KlCaseDetailService extends IService<KlCaseDetail> {
+
+}

+ 25 - 0
src/main/java/com/diagbot/service/KlClassicCaseInfoService.java

@@ -0,0 +1,25 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.model.entity.Lis;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经典病例表 服务类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+public interface KlClassicCaseInfoService extends IService<KlClassicCaseInfo> {
+    public List<KlClassicCaseInfo> listInfo(@Param("conceptIds") List<Long> conceptIds);
+
+    public KlClassicCaseInfo getOneCase(@Param("conceptId") Long conceptId);
+
+}

+ 25 - 0
src/main/java/com/diagbot/service/KlClassicCaseService.java

@@ -0,0 +1,25 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.dto.KlClassicCaseDTO;
+import com.diagbot.dto.KlConceptStaticDTO;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.entity.KlOperation;
+import com.diagbot.vo.KlClassicCasePageVO;
+import com.diagbot.vo.KlConceptStaticPageVO;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * <p>
+ * 经典病例表 服务类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+public interface KlClassicCaseService extends IService<KlClassicCase> {
+
+    IPage<KlClassicCaseDTO> getClassicCase(@Param("klClassicCasePageVO") KlClassicCasePageVO klClassicCasePageVO);
+}

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

@@ -0,0 +1,16 @@
+package com.diagbot.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.diagbot.entity.KlDiagHospital;
+
+/**
+ * <p>
+ * 基层医院诊断信息表 服务类
+ * </p>
+ *
+ * @author dsYun
+ * @since 2024-08-01
+ */
+public interface KlDiagHospitalService extends IService<KlDiagHospital> {
+
+}

+ 23 - 0
src/main/java/com/diagbot/service/impl/KlCaseDetailServiceImpl.java

@@ -0,0 +1,23 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.entity.KlCaseDetail;
+import com.diagbot.entity.KlConceptDetail;
+import com.diagbot.mapper.KlCaseDetailMapper;
+import com.diagbot.mapper.KlConceptDetailMapper;
+import com.diagbot.service.KlCaseDetailService;
+import com.diagbot.service.KlConceptDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 经典病例内容表 服务实现类
+ * </p>
+ *
+ * @author gaodm
+ * @since 2021-01-21
+ */
+@Service
+public class KlCaseDetailServiceImpl extends ServiceImpl<KlCaseDetailMapper, KlCaseDetail> implements KlCaseDetailService {
+
+}

+ 48 - 0
src/main/java/com/diagbot/service/impl/KlClassicCaseInfoServiceImpl.java

@@ -0,0 +1,48 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.entity.wrapper.MappingConfigWrapper;
+import com.diagbot.mapper.KlClassicCaseInfoMapper;
+import com.diagbot.mapper.KlClassicCaseMapper;
+import com.diagbot.service.KlClassicCaseInfoService;
+import com.diagbot.service.KlClassicCaseService;
+import com.diagbot.vo.MappingConfigPageVO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 经典病例表 服务实现类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+@Service
+public class KlClassicCaseInfoServiceImpl extends ServiceImpl<KlClassicCaseInfoMapper, KlClassicCaseInfo> implements KlClassicCaseInfoService {
+    @Autowired
+    KlClassicCaseInfoMapper klClassicCaseInfoMapper;
+    /**
+     * 查询病例信息
+     *
+     * @param ids
+     * @return
+     */
+    @Override
+    public List<KlClassicCaseInfo> listInfo(@Param("conceptIds") List<Long> ids) {
+        return klClassicCaseInfoMapper.listInfo(ids);
+    }
+
+    @Override
+    public KlClassicCaseInfo getOneCase(@Param("conceptId") Long conceptId) {
+        return klClassicCaseInfoMapper.getOneCase(conceptId);
+    }
+}

+ 34 - 0
src/main/java/com/diagbot/service/impl/KlClassicCaseServiceImpl.java

@@ -0,0 +1,34 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.dto.KlClassicCaseDTO;
+import com.diagbot.dto.KlConceptStaticDTO;
+import com.diagbot.entity.KlClassicCase;
+import com.diagbot.entity.KlClassicCaseInfo;
+import com.diagbot.entity.KlOperation;
+import com.diagbot.mapper.KlClassicCaseMapper;
+import com.diagbot.mapper.KlOperationMapper;
+import com.diagbot.service.KlClassicCaseService;
+import com.diagbot.service.KlOperationService;
+import com.diagbot.vo.KlClassicCasePageVO;
+import com.diagbot.vo.KlConceptStaticPageVO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 经典病例表 服务实现类
+ * </p>
+ *
+ * @author zhaops
+ * @since 2021-06-15
+ */
+@Service
+public class KlClassicCaseServiceImpl extends ServiceImpl<KlClassicCaseMapper, KlClassicCase> implements KlClassicCaseService {
+
+    @Override
+    public IPage<KlClassicCaseDTO> getClassicCase(@Param("klClassicCasePageVO") KlClassicCasePageVO klClassicCasePageVO) {
+        return baseMapper.getClassicCase(klClassicCasePageVO);
+    }
+}

+ 1 - 1
src/main/java/com/diagbot/service/impl/KlConceptDetailServiceImpl.java

@@ -8,7 +8,7 @@ import org.springframework.stereotype.Service;
 
 /**
  * <p>
- * 静态知识内容表 服务实现类
+ * 经典病例内容表 服务实现类
  * </p>
  *
  * @author gaodm

+ 21 - 0
src/main/java/com/diagbot/service/impl/KlDiagHospitalServiceImpl.java

@@ -0,0 +1,21 @@
+package com.diagbot.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.diagbot.entity.KlDiagHospital;
+import com.diagbot.mapper.KlDiagHospitalMapper;
+import com.diagbot.service.KlDiagHospitalService;
+import org.springframework.stereotype.Service;
+
+
+/**
+ * <p>
+ * 基层医院诊断信息表 服务实现类
+ * </p>
+ *
+ * @author dsYun
+ * @since 2024-08-01
+ */
+@Service
+public class KlDiagHospitalServiceImpl extends ServiceImpl<KlDiagHospitalMapper, KlDiagHospital> implements KlDiagHospitalService {
+
+}

+ 33 - 0
src/main/java/com/diagbot/vo/KlClassicCasePageVO.java

@@ -0,0 +1,33 @@
+package com.diagbot.vo;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/2/24 13:41
+ */
+@Getter
+@Setter
+public class KlClassicCasePageVO extends Page {
+    /**
+     * 标准术语
+     */
+    private String name;
+    /**
+     * 术语类型
+     */
+    private Integer type;
+    /**
+     * 术语类型
+     */
+    @ApiModelProperty(hidden = true)
+    private String typeName;
+    /**
+     * 启用状态
+     */
+    private Integer status;
+}

+ 63 - 0
src/main/java/com/diagbot/vo/KlClassicCaseVO.java

@@ -0,0 +1,63 @@
+package com.diagbot.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.models.auth.In;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.List;
+
+/**
+ * @Description:
+ * @Author:zhaops
+ * @time: 2021/2/24 15:03
+ */
+@Getter
+@Setter
+public class KlClassicCaseVO {
+    private Long id;
+    /**
+     * 标准术语
+     */
+    private String name;
+    /**
+     * 术语类型
+     */
+    private Integer type;
+    /**
+     * 术语类型
+     */
+    @ApiModelProperty(hidden = true)
+    private String typeName;
+    /**
+     * 临床路径名称
+     */
+    private String clinicalPathwayName;
+
+    /**
+     * 注意事项名称
+     */
+    private String noticeName;
+
+    /**
+     * 经典病例明细
+     */
+    private List<KlConceptDetailVO> details;
+
+    /**
+     * 操作id
+     */
+    @ApiModelProperty(hidden = true)
+    private Long userId;
+
+    /**
+     * 量表结构
+     */
+    private KlScaleSaveUpVO scale;
+
+    /**
+     * 数据来源:0-医院端、1-云平台,默认0
+     */
+    private Integer source = 0;
+
+}

+ 1 - 1
src/main/java/com/diagbot/vo/KlConceptDetailVO.java

@@ -41,7 +41,7 @@ public class KlConceptDetailVO {
     private Integer orderNo;
 
     /**
-     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型(多选):1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private String contentType;
 }

+ 1 - 1
src/main/java/com/diagbot/vo/StaticKnowledgeVO.java

@@ -24,7 +24,7 @@ public class StaticKnowledgeVO extends ScaleVO{
     @NotNull(message = "请输入术语类型:1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项、7-手术和操作")
     private Integer type;
     /**
-     * 内容类型:1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案
+     * 内容类型:1-化验、辅检、手术和操作、诊断、药品静态信息,2-注意事项,3-临床路径,4-治疗方案, 5-诊疗指南
      */
     private List<Integer> contentTypes;
 

+ 68 - 14
src/main/java/com/diagbot/web/KlConceptStaticController.java

@@ -3,21 +3,12 @@ package com.diagbot.web;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.diagbot.annotation.SysLogger;
-import com.diagbot.dto.ConceptDetailDTO;
-import com.diagbot.dto.ConceptScaleDTO;
-import com.diagbot.dto.KlConceptStaticDTO;
-import com.diagbot.dto.RespDTO;
-import com.diagbot.dto.StaticKnowledgeDTO;
-import com.diagbot.dto.StaticKnowledgeIndexPageDTO;
+import com.diagbot.dto.*;
+import com.diagbot.facade.KlCaseDetailFacade;
+import com.diagbot.facade.KlClassicCaseFacade;
 import com.diagbot.facade.KlConceptStaticFacade;
 import com.diagbot.util.BeanUtil;
-import com.diagbot.vo.ChangeStatusVO;
-import com.diagbot.vo.GetDetailVO;
-import com.diagbot.vo.IdVO;
-import com.diagbot.vo.KlConceptStaticPageVO;
-import com.diagbot.vo.KlConceptStaticVO;
-import com.diagbot.vo.StaticKnowledgeIndexPageVO;
-import com.diagbot.vo.StaticKnowledgeVO;
+import com.diagbot.vo.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,10 +34,14 @@ import java.util.Map;
 public class KlConceptStaticController {
     @Autowired
     KlConceptStaticFacade klConceptStaticFacade;
+    @Autowired
+    private KlCaseDetailFacade klCaseDetailFacade;
+    @Autowired
+    private KlClassicCaseFacade klClassicCaseFacade;
 
     @ApiOperation(value = "获取静态知识[zhaops]",
             notes = "type: 类型:1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项、7-手术和操作、8-量表、9-护理、10-政策法规 <br>" +
-                    "contentTypes: 内容类型(多选):1-静态信息、2-注意事项、3-临床路径、4-治疗方案<br>" +
+                    "contentTypes: 内容类型(多选):1-静态信息、2-注意事项、3-临床路径、4-治疗方案、5-诊疗指南<br>" +
                     "name: 标准术语名称<br>")
     @PostMapping("/getStaticKnowledge")
     @SysLogger("getStaticKnowledge")
@@ -55,6 +50,17 @@ public class KlConceptStaticController {
         return RespDTO.onSuc(data);
     }
 
+    @ApiOperation(value = "获取经典病历",
+            notes = "type: 类型:11-经典病历 <br>" +
+                    "contentTypes: 内容类型:11-经典病历<br>" +
+                    "name: 标准术语名称<br>")
+    @PostMapping("/getClassicCaseInfo")
+    @SysLogger("getClassicCaseInfo")
+    public RespDTO<StaticKnowledgeDTO> getClassicCaseInfo(@Valid @RequestBody StaticKnowledgeVO staticKnowledgeVO) {
+        StaticKnowledgeDTO data = klClassicCaseFacade.getClassicCaseInfo(staticKnowledgeVO);
+        return RespDTO.onSuc(data);
+    }
+
     @ApiOperation(value = "获取静态知识列表[zhaops]",
             notes = "type: 类型:1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项、7-手术和操作、8-量表、9-护理、10-政策法规  <br>" +
                     "name: 术语名称<br>" +
@@ -69,6 +75,20 @@ public class KlConceptStaticController {
         return RespDTO.onSuc(page);
     }
 
+    @ApiOperation(value = "获取经典病例列表",
+            notes = "type: 类型:11-经典病例  <br>" +
+                    "name: 术语名称<br>" +
+                    "status: 启用状态:1-启用、0-禁用<br>")
+    @PostMapping("/getClassicCase")
+    @SysLogger("getClassicCase")
+    @SuppressWarnings("unchecked")
+    public RespDTO<Page<KlClassicCaseDTO>> getClassicCase(@Valid @RequestBody KlClassicCasePageVO klClassicCasePageVO) {
+        IPage<KlClassicCaseDTO> data = klClassicCaseFacade.getClassicCase(klClassicCasePageVO);
+        Page<KlClassicCaseDTO> page = new Page<>();
+        BeanUtil.copyProperties(data, page);
+        return RespDTO.onSuc(page);
+    }
+
     @ApiOperation(value = "静态知识检索(分页返回)[zhaops]",
             notes = "types: 类型(多选):0-全部、1-诊断、2-药品、3-检验、5-检查、6-手术和操作、8-量表、9-护理、10-政策法规  <br>" +
                     "inputStr: 检索内容<br>")
@@ -100,6 +120,21 @@ public class KlConceptStaticController {
         return RespDTO.onSuc(data);
     }
 
+    @ApiOperation(value = "保存经典病例-新增或修改",
+            notes = "id: id <br>" +
+                    "name: 术语名称 <br>" +
+                    "type: 类型:11-经典病例  <br>" +
+                    "source:数据来源:0-医院端、1-云平台,默认0 <br>" +
+                    "details: 明细<br>" +
+                    "scale:评估量表<br>")
+    @PostMapping("/saveOrUpdateCase")
+    @SysLogger("saveOrUpdateCase")
+    @Transactional
+    public RespDTO<Boolean> saveOrUpdateCase(@Valid @RequestBody KlClassicCaseVO klClassicCaseVO) {
+        Boolean data = klClassicCaseFacade.saveOrUpdateCase(klClassicCaseVO);
+        return RespDTO.onSuc(data);
+    }
+
     @ApiOperation(value = "静态知识启用禁用[zhaops]",
             notes = "id: 术语id <br>" +
                     "status: 启用状态(0:禁用,1:启用)<br>")
@@ -111,6 +146,17 @@ public class KlConceptStaticController {
         return RespDTO.onSuc(data);
     }
 
+    @ApiOperation(value = "经典病例启用禁用",
+            notes = "id: 术语id <br>" +
+                    "status: 启用状态(0:禁用,1:启用)<br>")
+    @PostMapping("/changeCaseStatus")
+    @SysLogger("changeCaseStatus")
+    @Transactional
+    public RespDTO<Boolean> changeCaseStatus(@Valid @RequestBody ChangeStatusVO changeStatusVO) {
+        Boolean data = klClassicCaseFacade.changeCaseStatus(changeStatusVO);
+        return RespDTO.onSuc(data);
+    }
+
     @ApiOperation(value = "根据术语id获取静态信息[zhaops]",
             notes = "id: 术语id <br>")
     @PostMapping("/getRecordById")
@@ -120,6 +166,14 @@ public class KlConceptStaticController {
         return RespDTO.onSuc(data);
     }
 
+    @ApiOperation(value = "根据经典病例id获取静态信息",
+            notes = "id: 术语id <br>")
+    @PostMapping("/getCaseById")
+    @SysLogger("getCaseById")
+    public RespDTO<KlClassicCaseDTO> getCaseById(@Valid @RequestBody IdVO idVO) {
+        KlClassicCaseDTO data = klClassicCaseFacade.getCaseById(idVO);
+        return RespDTO.onSuc(data);
+    }
     @ApiOperation(value = "静态知识是否存在[zhaops]",
             notes = "name: 术语名称 <br>" +
                     "type: 类型:1-诊断、2-药品、3-检验套餐、4-检验细项、5-检查、6-检查子项、7-手术和操作、8-量表、9-护理、10-政策法规  <br>")

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

@@ -92,7 +92,7 @@ spring:
         cdss:
           driver-class-name: com.mysql.cj.jdbc.Driver
           platform: mysql
-          url: jdbc:mysql://192.168.2.31:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://173.18.12.191:3306/cdss?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
           username: root
           password: dsYun8!@#
           druid:
@@ -100,7 +100,7 @@ spring:
         med:
           driver-class-name: com.mysql.cj.jdbc.Driver
           platform: mysql
-          url: jdbc:mysql://192.168.2.31:3306/med_2021?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&allowPublicKeyRetrieval=true&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
+          url: jdbc:mysql://173.18.12.191:3306/med_2021?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&characterSetResults=utf8&useSSL=false&allowMultiQueries=true&rewriteBatchedStatements=true
           username: root
           password: dsYun8!@#
           druid:
@@ -115,9 +115,9 @@ spring:
     database:
       cache: 11 # cache索引
       similar: 11 # similar索引
-    host: 192.168.2.31  #Redis服务器地址
+    host: 173.18.12.191  #Redis服务器地址
     port: 6379 # Redis服务器连接端口(本地环境端口6378,其他环境端口是6379)
-    password:  # Redis服务器连接密码(默认为空)
+    password: # Redis服务器连接密码(默认为空)
     lettuce:
       pool:
         max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
@@ -168,21 +168,21 @@ swagger:
   enable: true
 
 CRF:
-  url: http://192.168.2.33:3456
+  url: http://173.18.12.190:3456
 
 StandConvert:
-  url: http://192.168.2.33:23232
+  url: http://173.18.12.190:23232
   rate: 0.9
 
 StandConvertNew:
-  url: http://192.168.3.33:7000
+  url: http://192.168.3.150:7000
   rate: 0.9
 
 IcssPush:
-  url: http://192.168.2.33:5008
+  url: http://173.18.12.192:5008
 
 # 新版推送:9212【本地,236】,9211【241】,9210【121,122】
 PushNew:
-  url: http://192.168.2.33:9212
+  url: http://173.18.12.190:9210
 
 debugFlag: true

+ 21 - 0
src/main/resources/mapper/KlCaseDetailMapper.xml

@@ -0,0 +1,21 @@
+<?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.KlCaseDetailMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlCaseDetail">
+        <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="concept_id" property="conceptId" />
+        <result column="title" property="title" />
+        <result column="content" property="content" />
+        <result column="text" property="text" />
+        <result column="order_no" property="orderNo" />
+        <result column="content_type" property="contentType" />
+    </resultMap>
+
+</mapper>

+ 134 - 0
src/main/resources/mapper/KlClassicCaseInfoMapper.xml

@@ -0,0 +1,134 @@
+<?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.KlClassicCaseInfoMapper">
+
+    <resultMap id="listInfo" type="com.diagbot.entity.KlClassicCaseInfo">
+        <id column="id" property="id" />
+        <result column="age" property="age" />
+        <result column="sex" property="sex" />
+        <result column="dept" property="dept" />
+        <result column="concept_id" property="conceptId" />
+        <result column="chief" property="chief" />
+        <result column="present" property="present" />
+        <result column="pasts" property="pasts" />
+        <result column="personal" property="personal" />
+        <result column="family" property="family" />
+        <result column="marital" property="marital" />
+        <result column="vital" property="vital" />
+        <result column="lis" property="lis" />
+        <result column="pacs" property="pacs" />
+        <result column="diag" property="diag" />
+        <result column="tcmdiag" property="tcmdiag" />
+        <result column="drug" property="drug" />
+    </resultMap>
+
+    <select id="listInfo" resultType="com.diagbot.entity.KlClassicCaseInfo">
+        SELECT age,sex,dept,t1.concept_id concept_id,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '主诉' AND t2.concept_id = t1.concept_id
+        ) AS chief,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '现病史' AND t2.concept_id = t1.concept_id
+        ) AS present,
+        (SELECT content
+        FROM kl_case_detail t2
+        WHERE title = '既往史' AND t2.concept_id = t1.concept_id
+        ) AS pasts,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '个人史' AND t2.concept_id = t1.concept_id
+        ) AS personal,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '家族史' AND t2.concept_id = t1.concept_id
+        ) AS family,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '婚育史' AND t2.concept_id = t1.concept_id
+        ) AS marital,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '查体' AND t2.concept_id = t1.concept_id
+        ) AS vital,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '检验' AND t2.concept_id = t1.concept_id
+        ) AS lis,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '检查' AND t2.concept_id = t1.concept_id
+        ) AS pacs,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '西医诊断' AND t2.concept_id = t1.concept_id
+        ) AS diag,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '中医诊断' AND t2.concept_id = t1.concept_id
+        ) AS tcmdiag,
+        (SELECT content
+        FROM kl_case_detail  t2
+        WHERE title = '医嘱' AND t2.concept_id = t1.concept_id
+        ) AS drug
+        FROM kl_classic_case t1 where is_deleted = 'N' and t1.concept_id in
+        <foreach item="id" collection="ids" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <select id="getOneCase" resultType="com.diagbot.entity.KlClassicCaseInfo">
+        SELECT age,sex,dept,t1.concept_id concept_id,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '主诉' AND t2.concept_id = t1.id
+               ) AS chief,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '现病史' AND t2.concept_id = t1.id
+               ) AS present,
+               (SELECT content
+                FROM kl_case_detail t2
+                WHERE title = '既往史' AND t2.concept_id = t1.id
+               ) AS pasts,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '个人史' AND t2.concept_id = t1.id
+               ) AS personal,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '家族史' AND t2.concept_id = t1.id
+               ) AS family,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '婚育史' AND t2.concept_id = t1.id
+               ) AS marital,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '查体' AND t2.concept_id = t1.id
+               ) AS vital,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '检验' AND t2.concept_id = t1.id
+               ) AS lis,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '检查' AND t2.concept_id = t1.id
+               ) AS pacs,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '西医诊断' AND t2.concept_id = t1.id
+               ) AS diag,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '中医诊断' AND t2.concept_id = t1.id
+               ) AS tcmdiag,
+               (SELECT content
+                FROM kl_case_detail  t2
+                WHERE title = '医嘱' AND t2.concept_id = t1.id
+               ) AS drug
+        FROM kl_classic_case t1 where is_deleted = 'N' and t1.concept_id = #{conceptId}
+    </select>
+
+</mapper>

+ 67 - 0
src/main/resources/mapper/KlClassicCaseMapper.xml

@@ -0,0 +1,67 @@
+<?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.KlClassicCaseMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlClassicCase">
+        <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="concept_id" property="conceptId" />
+        <result column="age" property="age" />
+        <result column="sex" property="sex" />
+        <result column="dept" property="dept" />
+        <result column="title" property="title" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 经典病例分页查询 -->
+    <select id="getClassicCase" resultType="com.diagbot.dto.KlClassicCaseDTO">
+        SELECT
+        t1.id,
+        t1.NAME,
+        --         t1.clinicalPathwayName,
+        --         t1.noticeName,
+        t1.type,
+        t1.status,
+        t1.title,
+        t1.gmtModified,
+        t1.modifier
+        FROM
+        (
+        SELECT
+        a.id,
+        a.lib_name as NAME ,
+        --         b.clinical_pathway_name AS clinicalPathwayName,
+        --         b.notice_name AS noticeName,
+        a.lib_type as type,
+        b.status,
+        "" AS title,
+        b.gmt_modified AS gmtModified,
+        b.modifier
+        FROM
+        kl_concept a,
+        kl_classic_case b
+        WHERE
+        a.id = b.concept_id
+        and a.is_deleted = 'N'
+        and b.is_deleted = 'N'
+        <if test="klClassicCasePageVO.status!=null ">
+            AND b.status = #{klClassicCasePageVO.status}
+        </if>
+        <if test="klClassicCasePageVO.name!=null and klClassicCasePageVO.name!=''">
+            AND a.lib_name like concat('%', #{klClassicCasePageVO.name},'%')
+        </if>
+        <if test="klClassicCasePageVO.type!=null and klClassicCasePageVO.type!=''">
+            AND a.lib_type = #{klClassicCasePageVO.type}
+        </if>
+        ) t1
+        ORDER BY
+        t1.status DESC,
+        t1.gmtModified DESC
+    </select>
+
+</mapper>

+ 47 - 0
src/main/resources/mapper/KlConceptMapper.xml

@@ -829,6 +829,53 @@
         </if>
     </select>
 
+    <select id="caseIndex" resultType="com.diagbot.dto.ClassicCaseIndexDTO">
+        SELECT DISTINCT t.*
+        FROM
+        (SELECT
+        t1.id AS id,
+        t1.lib_name AS NAME,
+        --         t2.NAME AS retrievalName,
+        t1.lib_type AS type,
+        t3.name AS typeName,
+        t1.status AS status
+        FROM
+        kl_concept t1
+        INNER JOIN kl_library_info t2 ON t1.id = t2.concept_id
+        INNER JOIN kl_lexicon t3 ON t1.lib_type = t3.code
+        WHERE
+        t1.is_deleted = 'N'
+        AND t2.is_deleted = 'N'
+        AND t3.is_deleted = 'N'
+        AND t1.status = 1
+        <if test="inputStr!=null and inputStr!=''">
+            AND ( t2.name LIKE concat('%',#{inputStr},'%')
+            OR
+            LOWER(t2.spell) LIKE LOWER( concat('%',#{inputStr},'%')))
+        </if>
+        ) t
+        LEFT JOIN kl_classic_case t4 ON t.id = t4.concept_id
+        WHERE
+        <if test="hasInfo!=null ">
+            <choose>
+                <when test="hasInfo==0">
+                    t4.concept_id IS NULL
+                </when>
+                <when test="hasInfo==1">
+                    t4.concept_id IS NOT NULL
+                </when>
+            </choose>
+        </if>
+        <if test="typeIds != null and typeIds.size > 0">
+            <foreach item="typeId" collection="typeIds" open="and(" separator="or" close=")">
+                t.type =#{typeId}
+            </foreach>
+        </if>
+        <if test="size!=null">
+            LIMIT #{size}
+        </if>
+    </select>
+
     <select id="getLisDetaisByNames" parameterType="com.diagbot.vo.KllisDetailVO"
             resultType="com.diagbot.dto.KllisDetailDTO">
         SELECT

+ 149 - 0
src/main/resources/mapper/KlConceptStaticMapper.xml

@@ -64,6 +64,8 @@
 
     <!-- 静态知识检索分页返回 -->
     <select id="staticIndexPage" resultType="com.diagbot.dto.StaticKnowledgeIndexPageDTO">
+        <if test="(staticKnowledgeIndexPageVO.typeIds != null and !staticKnowledgeIndexPageVO.typeIds.contains(411) and staticKnowledgeIndexPageVO.typeIds.size > 0)
+        ||(staticKnowledgeIndexPageVO.typeIds != null and staticKnowledgeIndexPageVO.typeIds.contains(411) and staticKnowledgeIndexPageVO.typeIds.size > 1)">
         SELECT
         f.*
         FROM
@@ -600,6 +602,153 @@
         LIMIT 1000
         )f
         GROUP BY f.id
+        </if>
+        <if test="staticKnowledgeIndexPageVO.typeIds.contains(411) ">
+            <if test="staticKnowledgeIndexPageVO.typeIds.size > 1">
+                UNION
+            </if>
+            SELECT
+            f.*
+            FROM
+            (
+            SELECT
+            s.moduleNo,
+            s.id,
+            s.name,
+            s.retrievalName,
+            s.isConcept,
+            s.type,
+            s.typeName,
+            s.code,
+            s1.concept_id AS conceptId,
+            null AS clinicalPathwayName,
+            null AS noticeName,
+            s1.`status` AS status
+            FROM
+            (
+            SELECT
+            t.moduleNo,
+            t.id,
+            t.NAME,
+            IF ( t.isConcept = 0, t.retrievalName, '' ) AS retrievalName,
+            t.isConcept,
+            t.type,
+            t.typeName,
+            t1.icd10_code AS code
+            FROM
+            (
+            SELECT
+            concat( '1', b.lib_type ) AS moduleNo,
+            a.NAME AS retrievalName,
+            a.spell AS spell,
+            a.is_concept AS isConcept,
+            b.id AS id,
+            b.lib_name AS NAME,
+            b.lib_type AS type,
+            c.NAME AS typeName
+            FROM
+            kl_library_info a,
+            kl_concept b,
+            kl_lexicon c
+            WHERE
+            a.is_deleted = 'N'
+            AND b.is_deleted = 'N'
+            AND c.is_deleted = 'N'
+            AND a.concept_id = b.id
+            AND b.lib_type = c.code
+            AND b.`status` = 1
+            AND a.type_id = 411
+            <if test="staticKnowledgeIndexPageVO.inputStr!=null and staticKnowledgeIndexPageVO.inputStr!=''">
+                AND ( a.name LIKE concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%') OR LOWER(a.spell) LIKE LOWER(
+                concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%')))
+            </if>
+            ) t left join kl_disease t1 on t.id = t1.concept_id and t1.is_deleted='N'
+            UNION
+            SELECT
+            t.moduleNo,
+            t.id,
+            t.NAME,
+            IF ( t.isConcept = 0, t.retrievalName, '' ) AS retrievalName,
+            t.isConcept,
+            t.type,
+            t.typeName,
+            t1.icd10_code AS code
+            FROM
+            (
+            SELECT
+            concat( '2', b.lib_type ) AS moduleNo,
+            a.NAME AS retrievalName,
+            a.spell AS spell,
+            a.is_concept AS isConcept,
+            b.id AS id,
+            b.lib_name AS NAME,
+            b.lib_type AS type,
+            c.NAME AS typeName
+            FROM
+            kl_library_info a,
+            kl_concept b,
+            kl_lexicon c
+            WHERE
+            a.is_deleted = 'N'
+            AND b.is_deleted = 'N'
+            AND c.is_deleted = 'N'
+            AND a.concept_id = b.id
+            AND b.lib_type = c.code
+            AND b.`status` = 1
+            <if test="staticKnowledgeIndexPageVO.inputStr!=null and staticKnowledgeIndexPageVO.inputStr!=''">
+                AND ( a.name LIKE concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%') OR LOWER(a.spell) LIKE LOWER(
+                concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%')))
+            </if>
+            ) t left join kl_disease t1 on t.id = t1.concept_id and t1.is_deleted='N'
+            UNION
+            SELECT
+            t.moduleNo,
+            t.id,
+            t.NAME,
+            IF ( t.isConcept = 0, t.retrievalName, '' ) AS retrievalName,
+            t.isConcept,
+            t.type,
+            t.typeName,
+            t1.icd10_code AS code
+            FROM
+            (
+            SELECT
+            concat( '3', b.lib_type ) AS moduleNo,
+            a.NAME AS retrievalName,
+            a.spell AS spell,
+            a.is_concept AS isConcept,
+            b.id AS id,
+            b.lib_name AS NAME,
+            b.lib_type AS type,
+            c.NAME AS typeName
+            FROM
+            kl_library_info a,
+            kl_concept b,
+            kl_lexicon c
+            WHERE
+            a.is_deleted = 'N'
+            AND b.is_deleted = 'N'
+            AND c.is_deleted = 'N'
+            AND a.concept_id = b.id
+            AND b.lib_type = c.code
+            AND b.`status` = 1
+            <if test="staticKnowledgeIndexPageVO.inputStr!=null and staticKnowledgeIndexPageVO.inputStr!=''">
+                AND ( a.name LIKE concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%') OR LOWER(a.spell) LIKE LOWER(
+                concat('%',#{staticKnowledgeIndexPageVO.inputStr},'%')))
+            </if>
+            ) t left join kl_disease t1 on t.id = t1.concept_id and t1.is_deleted='N'
+            ) s,
+            kl_classic_case s1
+            WHERE s.id = s1.concept_id
+            AND s1.is_deleted = 'N'
+            AND s1.status = 1
+            ORDER BY s.type ASC,
+            s.moduleNo ASC,
+            s.isConcept DESC
+            LIMIT 1000
+            )f
+            GROUP BY f.id
+        </if>
     </select>
 
     <select id="getKlScaleInfoPage" resultType="com.diagbot.dto.KlScaleInfoDTO">

+ 20 - 0
src/main/resources/mapper/KlDiagHospitalMapper.xml

@@ -0,0 +1,20 @@
+<?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.KlDiagHospitalMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.diagbot.entity.KlDiagHospital">
+        <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="dis_type" property="disType"/>
+        <result column="dis_code" property="disCode"/>
+        <result column="dis_name" property="disName"/>
+        <result column="country_code" property="countryCode"/>
+        <result column="country_name" property="countryName"/>
+    </resultMap>
+
+</mapper>

+ 70 - 52
src/main/resources/mapper/KlRelationMapper.xml

@@ -51,67 +51,85 @@
 
     <select id="getItemByDisease" resultType="com.diagbot.dto.DiseaseItemDTO" parameterType="com.diagbot.vo.DiseaseItemVO">
         SELECT
-            t7.diseaseName,
-            t7.relationId,
-            t7.itemName
+        t9.diseaseName,
+        t9.relationId,
+        t9.itemName,
+        t9.drug_c
         FROM
-            (
-                SELECT
-                    t5.diseaseId,
-                    t5.diseaseName,
-                    t5.relationId,
-                    t5.itemName,
-                    t5.itemId,
-                    t5.order_no,
-                    IFNULL(t6.min_age, 0) AS min_age,
-                    IFNULL(t6.max_age, 200) AS max_age,
-                    IFNULL(t6.sex_type, 3) AS sex_type
-                FROM
-                    (
-                        SELECT
-                            t1.id AS diseaseId,
-                            t1.lib_name AS diseaseName,
-                            t2.relation_id AS relationId,
-                            t3.lib_name AS itemName,
-                            t3.id AS itemId,
-                            t4.order_no
-                        FROM
-                            kl_concept t1,
-                            kl_relation t2,
-                            kl_concept t3,
-                            kl_relation_order t4
-                        WHERE
-                            t1.is_deleted = "N"
-                        AND t2.is_deleted = "N"
-                        AND t3.is_deleted = "N"
-                        AND t4.is_deleted = "N"
-                        AND t1.lib_type = 100
-                        AND t1.id = t2.start_id
-                        AND t3.id = t2.end_id
-                        AND t2.id = t4.t_relation_id
-                        AND t2.relation_id IN (501,502,503,504,505,506,507,508,509,510)
-                        AND t1.lib_name = #{diseaseName}
-                        AND t1.`status` = 1
-                        AND t3.`status` = 1
-                    ) t5
-                LEFT JOIN kl_concept_common t6 ON t6.is_deleted = "N"
-                AND t5.itemId = t6.concept_id
-            ) t7
+        (
+        SELECT
+        t7.diseaseName,
+        t7.relationId,
+        t7.itemName,
+        t8.drug_c,
+        IFNULL(t7.min_age, 0) AS min_age,
+        IFNULL(t7.max_age, 200) AS max_age,
+        IFNULL(t7.sex_type, 3) AS sex_type,
+        t7.diseaseId as diseaseId,
+        t7.order_no as order_no
+        FROM
+        (
+        SELECT
+        t5.diseaseId,
+        t5.diseaseName,
+        t5.relationId,
+        t5.itemName,
+        t5.itemId,
+        t5.order_no,
+        IFNULL(t6.min_age, 0) AS min_age,
+        IFNULL(t6.max_age, 200) AS max_age,
+        IFNULL(t6.sex_type, 3) AS sex_type,
+        t6.concept_id as concept_id
+        FROM
+        (
+        SELECT
+        t1.id AS diseaseId,
+        t1.lib_name AS diseaseName,
+        t2.relation_id AS relationId,
+        t3.lib_name AS itemName,
+        t3.id AS itemId,
+        t4.order_no
+        FROM
+        kl_concept t1,
+        kl_relation t2,
+        kl_concept t3,
+        kl_relation_order t4
+        WHERE
+        t1.is_deleted = "N"
+        AND t2.is_deleted = "N"
+        AND t3.is_deleted = "N"
+        AND t4.is_deleted = "N"
+        AND t1.lib_type = 100
+        AND t1.id = t2.start_id
+        AND t3.id = t2.end_id
+        AND t2.id = t4.t_relation_id
+        AND t2.relation_id IN (501,502,503,504,505,506,507,508,509,510,516)
+        AND t1.lib_name = #{diseaseName}
+        AND t1.`status` = 1
+        AND t3.`status` = 1
+        ) t5
+        LEFT JOIN kl_concept_common t6 ON t6.is_deleted = "N"
+        AND t5.itemId = t6.concept_id
+        ) t7
+        LEFT JOIN kl_drug t8 ON t8.is_deleted = "N"
+        AND t8.concept_id = t7.concept_id
+        )t9
         WHERE 1=1
         <if test="sexType == 3">
-            AND t7.sex_type in ('1','2','3')
+            AND t9.sex_type in ('1','2','3')
         </if>
         <if test="sexType != 3">
-            AND t7.sex_type in ('3',#{sexType})
+            AND t9.sex_type in ('3',#{sexType})
         </if>
         <if test="age != null and age != ''">
-            AND <![CDATA[ t7.min_age <= #{age} ]]>
-            AND <![CDATA[ t7.max_age >= #{age} ]]>
+            AND <![CDATA[ t9.min_age <= #{age} ]]>
+            AND <![CDATA[ t9.max_age >= #{age} ]]>
         </if>
         ORDER BY
-            t7.diseaseId,
-            t7.relationId,
-            t7.order_no
+        t9.diseaseId,
+        t9.relationId,
+        t9.order_no,
+        t9.drug_c
     </select>
 
 </mapper>