diff --git a/docker/virtual-patient-graph/Dockerfile b/docker/virtual-patient-graph/Dockerfile
new file mode 100644
index 00000000..f18bcf13
--- /dev/null
+++ b/docker/virtual-patient-graph/Dockerfile
@@ -0,0 +1,8 @@
+# 设置基础镜像
+FROM registry.cn-beijing.aliyuncs.com/longbei/jdk:latest
+
+# 暴漏服务端口
+EXPOSE 8892
+
+# 设置启动命令
+ENTRYPOINT ["java","-Xms256m","-Xmx1g","-Dspring.profiles.active=prod","-Dfile.encoding=utf-8","-Duser.timezone=Asia/Shanghai","-jar","/data/vp/virtual-patient-graph-1.0-SNAPSHOT.jar"]
\ No newline at end of file
diff --git a/docker/生产环境服务部署文档.md b/docker/生产环境服务部署文档.md
index 391a1e6f..d655b261 100644
--- a/docker/生产环境服务部署文档.md
+++ b/docker/生产环境服务部署文档.md
@@ -23,6 +23,29 @@ docker network create virtual-patient-network
```
+## nacos服务部署
+
+- 端口号:8848
+- 生产环境端口:18498
+- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
+
+### 首次部署
+
+~~~shell
+ # 拉取镜像
+ docker pull nacos/nacos-server:v1.4.5
+ # 运行容器
+ docker run -d -p 8848:8848 -e MODE=standalone -e NACOS_AUTH_IDENTITY_KEY=nacos -e NACOS_AUTH_IDENTITY_VALUE=nacos -v /data/nacos/:/home/nacos/data --name nacos --restart=always nacos/nacos-server:v1.4.5
+ # **启用网络环境服务,生产环境请使用**
+ # 生产环境端口号为18498
+ # 很奇怪,这里配置密码不生效,用nacos进去之后再手动改
+ docker run -d -p 18498:8848 -e MODE=standalone -e NACOS_AUTH_IDENTITY_KEY=nacos -e NACOS_AUTH_IDENTITY_VALUE='#Yaxin0504' -v /data/nacos/:/home/nacos/data --name nacos --network virtual-patient-network --restart=always nacos/nacos-server:v1.4.5
+ # 验证容器运行
+ docker ps | grep nacos
+ # 查看日志是否正常
+ docker logs -f nacos
+~~~
+
## mysql数据库
- 启动mysql
@@ -33,10 +56,11 @@ docker network create virtual-patient-network
# 拉取镜像
docker pull mysql:5.7
# 启动服务
- docker run -d -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql --name vp-mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
+ docker run -d -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql --name vp-mysql -e MYSQL_ROOT_PASSWORD='#Yaxin0504' mysql:5.7
# **启用网络环境服务,生产环境请使用**
- docker run -d -p 3306:3306 -v /var/lib/mysql:/var/lib/mysql --name virtual-patient-mysql -e MYSQL_ROOT_PASSWORD=123456 --network virtual-patient-network mysql:5.7
+ # 生产环境端口号为37088
+ docker run -d -p 37088:3306 -v /var/lib/mysql:/var/lib/mysql --name virtual-patient-mysql -e MYSQL_ROOT_PASSWORD='#Yaxin0504' --network virtual-patient-network mysql:5.7
~~~
@@ -89,10 +113,12 @@ docker run -it --name minio -p 9002:9000 -p 9001:9001 -d \
virtual-patient-minio:1.0.0 server /data --console-address ":9001"
# **启用网络环境服务,生产环境请使用**
-docker run -it --name virtual-patient-minio -p 9002:9000 -p 9001:9001 -d \
+# 生产环境密码#Yaxin0504
+# 生产环境端口修改 11900为s3 11901为web
+docker run -it --name virtual-patient-minio -p 11900:9000 -p 11901:9001 -d \
-v /data/minio:/data \
-e 'MINIO_ROOT_USER=admin' \
- -e 'MINIO_ROOT_PASSWORD=12345678' \
+ -e 'MINIO_ROOT_PASSWORD=#Yaxin0504' \
--network virtual-patient-network \
virtual-patient-minio:1.0.0 server /data --console-address ":9001"
@@ -114,7 +140,9 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
docker run --name virtual-patient-redis -p 6379:6379 -v /data/vp/redis/data:/data -d virtual-patient-redis:1.0.0
# **启用网络环境服务,生产环境请使用**
- docker run --name virtual-patient-redis -p 6379:6379 -v /data/vp/redis/data:/data --network virtual-patient-network -d virtual-patient-redis:1.0.0
+ # 生产环境的Redis端口修改为11379
+ # 密码:#Yaxin0504
+ docker run --name virtual-patient-redis -p 11379:6379 -v /data/vp/redis/data:/data -v /data/redis:/usr/local/redis --network virtual-patient-network -d virtual-patient-redis:1.0.0
# 查看容器运行
docker ps | grep virtual-patient-redis
@@ -133,7 +161,7 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
# 验证镜像是否存在
docker images | grep virtual-patient-rasa-manager
# 运行容器
- docker run --name virtual-patient-rasa-manager -p 8990:8890 -d virtual-patient-rasa-manager:1.0.0
+ docker run --name virtual-patient-rasa-manager -p 8990:8890 -v /data/vp:/data/vp -d virtual-patient-rasa-manager:1.0.0
# **启用网络环境服务,生产环境请使用**
docker run --name virtual-patient-rasa-manager -p 8990:8890 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-rasa-manager:1.0.0 --spring.profiles.active=prod
# 验证容器运行
@@ -166,7 +194,7 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
# 验证镜像是否存在
docker images | grep virtual-patient-web
# 运行容器
- docker run --name virtual-patient-web -p 8899:8899 -d virtual-patient-web
+ docker run --name virtual-patient-web -p 8899:8899 -v /data/vp:/data/vp -d virtual-patient-web
# **启用网络环境服务,生产环境请使用**
docker run --name virtual-patient-web -p 8899:8899 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-web:1.0.0 --spring.profiles.active=prod
# 验证容器运行
@@ -199,7 +227,7 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
# 验证镜像是否存在
docker images | grep virtual-patient-manage
# 运行容器
- docker run --name virtual-patient-manage -p 8891:8891 -d virtual-patient-manage:1.0.0
+ docker run --name virtual-patient-manage -p 8891:8891 -v /data/vp:/data/vp -d virtual-patient-manage:1.0.0
# **启用网络环境服务,生产环境请使用**
docker run --name virtual-patient-manage -p 8891:8891 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-manage:1.0.0 --spring.profiles.active=prod
# 验证容器运行
@@ -217,6 +245,39 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
docker restart virtual-patient-manage
~~~
+## Graph知识图谱系统部署
+
+- 端口号:8892
+- 首次部署使用dockerfile的形式,后期更新直接docker restart就可以了
+- 将代码包virtual-patient-graph-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
+
+### 首次部署
+
+~~~shell
+ # 进入virtual-patient-manage文件夹,依次执行命令
+ # 构建镜像
+ docker build -t virtual-patient-graph:1.0.0 .
+ # 验证镜像是否存在
+ docker images | grep virtual-patient-graph
+ # 运行容器
+ docker run --name virtual-patient-graph -p 8892:8892 -v /data/vp:/data/vp -d virtual-patient-graph:1.0.0
+ # **启用网络环境服务,生产环境请使用**
+ docker run --name virtual-patient-graph -p 8892:8892 -v /data/vp:/data/vp --network virtual-patient-network -d virtual-patient-manage:1.0.0 --spring.profiles.active=prod
+ # 验证容器运行
+ docker ps | grep virtual-patient-graph
+ # 查看日志是否正常
+ docker logs -f virtual-patient-graph
+~~~
+
+### 服务更新
+
+- 将代码包virtual-patient-graph-1.0-SNAPSHOT.jar拷贝到路径/data/vp下
+- 重启容器
+
+~~~shell
+ docker restart virtual-patient-graph
+~~~
+
## Nginx前端服务
~~~shell
@@ -227,7 +288,7 @@ mv virtual-patient-bucket-prod /data/vp/minio/data
# 验证镜像是否存在
docker images | grep virtual-patient-nginx
# 运行容器
- docker run --name virtual-patient-nginx -p 443:443 -d -e UPSTREAM_WEB_SERVERS={ip}:{port} -e UPSTREAM_MANAGE_SERVERS={ip}:{port} virtual-patient-nginx:1.0.0
+ docker run --name virtual-patient-nginx -p 443:443 -v /data/vp/dist:/usr/share/nginx/html/dist -d -e UPSTREAM_WEB_SERVERS={ip}:{port} -e UPSTREAM_MANAGE_SERVERS={ip}:{port} virtual-patient-nginx:1.0.0
# UPSTREAM_WEB_SERVERS:虚拟病人问诊系统服务的ip:port
# UPSTREAM_MANAGE_SERVERS:虚拟病人后端管理系统服务的ip:port
diff --git a/virtual-patient-graph/pom.xml b/virtual-patient-graph/pom.xml
index 11c19597..847186f2 100644
--- a/virtual-patient-graph/pom.xml
+++ b/virtual-patient-graph/pom.xml
@@ -20,6 +20,36 @@
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ com.alibaba
+ fastjson
+
+
+ com.alibaba.nacos
+ nacos-common
+
+
+
+
+
+ com.alibaba.nacos
+ nacos-common
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
org.nebula-contrib
ngbatis
@@ -83,4 +113,21 @@
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/virtual-patient-graph/src/main/java/com/supervision/VirtualPatientGraphApplication.java b/virtual-patient-graph/src/main/java/com/supervision/VirtualPatientGraphApplication.java
index 35c473c3..10965b97 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/VirtualPatientGraphApplication.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/VirtualPatientGraphApplication.java
@@ -3,11 +3,13 @@ package com.supervision;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.scheduling.annotation.EnableScheduling;
@EnableScheduling
@SpringBootApplication(scanBasePackages = {"com.supervision", "org.nebula"})
@MapperScan(basePackages = {"com.supervision.**.mapper"})
+@EnableDiscoveryClient
public class VirtualPatientGraphApplication {
public static void main(String[] args) {
diff --git a/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java b/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java
index bafce50c..b9fe54c7 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java
@@ -247,6 +247,11 @@ public class GraphNebulaServiceImpl implements GraphNebulaService {
@Override
public GraphVO queryGraph(String processId) {
Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程"));
+ // 如果图谱ID为空,则创建图谱
+ if (StrUtil.isEmpty(process.getGraphId())) {
+ creatGraphByNebula(processId);
+ process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程"));
+ }
List> subgraphList = medicalRecDao.selectSubgraph(process.getGraphId());
List nodeList = new ArrayList<>();
diff --git a/virtual-patient-graph/src/main/java/com/supervision/vo/EdgeVO.java b/virtual-patient-graph/src/main/java/com/supervision/vo/EdgeVO.java
index 9411fbe8..453522b1 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/vo/EdgeVO.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/vo/EdgeVO.java
@@ -1,5 +1,6 @@
package com.supervision.vo;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Map;
@@ -7,11 +8,15 @@ import java.util.Map;
@Data
public class EdgeVO {
+ @ApiModelProperty("来源节点ID")
private String source;
+ @ApiModelProperty("目标节点ID")
private String target;
+ @ApiModelProperty("连线展示的名称,可能为空")
private String name;
+ @ApiModelProperty("连线所拥有的属性")
private Map params;
}
diff --git a/virtual-patient-graph/src/main/java/com/supervision/vo/GraphVO.java b/virtual-patient-graph/src/main/java/com/supervision/vo/GraphVO.java
index 0139923d..fa0ca2cb 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/vo/GraphVO.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/vo/GraphVO.java
@@ -1,5 +1,7 @@
package com.supervision.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@@ -9,9 +11,12 @@ import java.util.List;
@Data
@NoArgsConstructor
@AllArgsConstructor
+@ApiModel
public class GraphVO {
+ @ApiModelProperty("节点")
private List nodes;
+ @ApiModelProperty("关系")
private List edges;
}
diff --git a/virtual-patient-graph/src/main/java/com/supervision/vo/NodeVO.java b/virtual-patient-graph/src/main/java/com/supervision/vo/NodeVO.java
index dad5f842..917842b8 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/vo/NodeVO.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/vo/NodeVO.java
@@ -1,24 +1,29 @@
package com.supervision.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.LinkedHashMap;
import java.util.Map;
@Data
+@ApiModel
public class NodeVO {
+ @ApiModelProperty("节点ID")
private String id;
-
+ @ApiModelProperty("节点值(页面展示)")
private String nodeValue;
-
+ @ApiModelProperty("节点颜色")
private String nodeColour;
-
+ @ApiModelProperty("节点级别 1 2 3 4级")
private Integer nodeLevel;
-
+ @ApiModelProperty("节点类型")
private String nodeType;
-
+ @ApiModelProperty("节点描述")
private String nodeDesc;
+ @ApiModelProperty("节点拥有的属性列表")
private Map params = new LinkedHashMap<>();
}
diff --git a/virtual-patient-graph/src/main/java/com/supervision/vo/TreeNodeVO.java b/virtual-patient-graph/src/main/java/com/supervision/vo/TreeNodeVO.java
index e81127a1..39384497 100644
--- a/virtual-patient-graph/src/main/java/com/supervision/vo/TreeNodeVO.java
+++ b/virtual-patient-graph/src/main/java/com/supervision/vo/TreeNodeVO.java
@@ -1,5 +1,7 @@
package com.supervision.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.LinkedHashMap;
@@ -7,24 +9,27 @@ import java.util.List;
import java.util.Map;
@Data
+@ApiModel
public class TreeNodeVO {
+ @ApiModelProperty("ID")
private String id;
-
+ @ApiModelProperty("节点值")
private String nodeValue;
-
+ @ApiModelProperty("节点颜色")
private String nodeColour;
-
+ @ApiModelProperty("节点级别")
private Integer nodeLevel;
-
+ @ApiModelProperty("节点类型")
private String nodeType;
-
+ @ApiModelProperty("节点描述")
private String nodeDesc;
-
+ @ApiModelProperty("节点的属性列表")
private Map params = new LinkedHashMap<>();
/**
* 子节点
*/
+ @ApiModelProperty("子节点")
private List childNodeList;
}
diff --git a/virtual-patient-graph/src/main/resources/application-dev.yml b/virtual-patient-graph/src/main/resources/application-dev.yml
deleted file mode 100644
index b3cc9b2f..00000000
--- a/virtual-patient-graph/src/main/resources/application-dev.yml
+++ /dev/null
@@ -1,105 +0,0 @@
-#服务器端口
-server:
- port: 8897
- servlet:
- context-path: /virtual-patient-graph
- undertow:
- # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
- max-http-post-size: -1
- # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
- # 每块buffer的空间大小,越小的空间被利用越充分
- buffer-size: 512
- # 是否分配的直接内存
- direct-buffers: true
-
-spring:
- application:
- name: virtual-patient-graph
- servlet:
- multipart:
- max-file-size: 100MB
- max-request-size: 100MB
- ##数据源配置
- datasource:
- type: com.alibaba.druid.pool.DruidDataSource
- druid:
- driver-class-name: com.mysql.cj.jdbc.Driver
- url: jdbc:mysql://192.168.10.137:3306/virtual_patient?useUnicode=true&characterEncoding=utf-8&useSSL=true&nullCatalogMeansCurrent=true&serverTimezone=GMT%2B8
- username: root
- password: '123456'
- initial-size: 5 # 初始化大小
- min-idle: 10 # 最小连接数
- max-active: 20 # 最大连接数
- max-wait: 60000 # 获取连接时的最大等待时间
- min-evictable-idle-time-millis: 300000 # 一个连接在池中最小生存的时间,单位是毫秒
- time-between-eviction-runs-millis: 60000 # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
- filters: stat,wall # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计
- validation-query: SELECT 1 # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
- test-on-borrow: true # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
- test-on-return: true # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
- test-while-idle: true # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
- stat-view-servlet:
- enabled: false # 是否开启 StatViewServlet
- filter:
- stat:
- enabled: true # 是否开启 FilterStat,默认true
- log-slow-sql: true # 是否开启 慢SQL 记录,默认false
- slow-sql-millis: 5000 # 慢 SQL 的标准,默认 3000,单位:毫秒
- merge-sql: false # 合并多个连接池的监控数据,默认false
- redis:
- host: 192.168.10.138
- port: 6379
- password: 123456
-
-nebula:
- ngbatis:
- use-session-pool: true
- # 127.0.0.1:9669, ip:port, ....
- hosts: 192.168.10.137:9669
- username: root
- password: 123456
- # 注意,新建使用的时候,必须有一个库
- space: virtual_patient
- # http客户端使用
- minConnSize: 5
- maxConnSize: 10
- timeout: 300000
- idleTime: 180000
- # ngbatis使用连接池配置
- pool-config:
- # 连接池中最小空闲连接数
- min-conns-size: 0
- # 连接池中最大空闲连接数
- max-conns-size: 10
- # 客户端同服务端建立连接的超时时间设置,单位为 ms;超过设定时间未建立起连接,则报错
- timeout: 0
- # 连接空闲时间,为 0 表示连接永不删除,单位为 ms
- idle-time: 0
- # 连接池检测空闲连接的时间间隔,为 -1 表示不进行检测
- interval-idle: -1
- # 连接等候时间,超过则不再等候连接
- wait-time: 0
- # 集群允许最小的服务可用率,1.0 表示为所有机器 graphd 可用,0.25 表示集群中 1/4 机器可用即可
- min-cluster-health-rate: 1.0
- # 是否允许 SSL 连接,目前暂不支持
- enable-ssl: false
-cql:
- parser:
- # 更换开发者自定义的 xml 所在位置
- mapper-locations: nebulaMapper/**/*.xml # 默认为 mapper/**/*.xml
-# nebula上传文件使用
-path:
- uploadFilePath: /opt/project/java/graphFile
- importerPath: /data1/opt
-
-mybatis-plus:
- mapper-locations: classpath*:mapper/**/*.xml
- configuration:
- log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-
-logging:
- level:
- org.nebula.contrib: DEBUG
-
-
-
diff --git a/virtual-patient-graph/src/main/resources/application.yml b/virtual-patient-graph/src/main/resources/application.yml
index caf4dfcd..e77fd98f 100644
--- a/virtual-patient-graph/src/main/resources/application.yml
+++ b/virtual-patient-graph/src/main/resources/application.yml
@@ -1,3 +1,48 @@
+#服务器端口
+server:
+ port: 8892
+ servlet:
+ context-path: /virtual-patient-graph
+ undertow:
+ # HTTP post内容的最大大小。当值为-1时,默认值为大小是无限的
+ max-http-post-size: -1
+ # 以下的配置会影响buffer,这些buffer会用于服务器连接的IO操作,有点类似netty的池化内存管理
+ # 每块buffer的空间大小,越小的空间被利用越充分
+ buffer-size: 512
+ # 是否分配的直接内存
+ direct-buffers: true
+
spring:
- profiles:
- active: dev
\ No newline at end of file
+ servlet:
+ multipart:
+ max-file-size: 100MB
+ max-request-size: 100MB
+ ##数据源配置
+ datasource:
+ type: com.alibaba.druid.pool.DruidDataSource
+ druid:
+ initial-size: 5 # 初始化大小
+ min-idle: 10 # 最小连接数
+ max-active: 20 # 最大连接数
+ max-wait: 60000 # 获取连接时的最大等待时间
+ min-evictable-idle-time-millis: 300000 # 一个连接在池中最小生存的时间,单位是毫秒
+ time-between-eviction-runs-millis: 60000 # 多久才进行一次检测需要关闭的空闲连接,单位是毫秒
+ filters: stat,wall # 配置扩展插件:stat-监控统计,log4j-日志,wall-防火墙(防止SQL注入),去掉后,监控界面的sql无法统计
+ validation-query: SELECT 1 # 检测连接是否有效的 SQL语句,为空时以下三个配置均无效
+ test-on-borrow: true # 申请连接时执行validationQuery检测连接是否有效,默认true,开启后会降低性能
+ test-on-return: true # 归还连接时执行validationQuery检测连接是否有效,默认false,开启后会降低性能
+ test-while-idle: true # 申请连接时如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效,默认false,建议开启,不影响性能
+ stat-view-servlet:
+ enabled: false # 是否开启 StatViewServlet
+ filter:
+ stat:
+ enabled: true # 是否开启 FilterStat,默认true
+ log-slow-sql: true # 是否开启 慢SQL 记录,默认false
+ slow-sql-millis: 5000 # 慢 SQL 的标准,默认 3000,单位:毫秒
+ merge-sql: false # 合并多个连接池的监控数据,默认false
+
+
+mybatis-plus:
+ mapper-locations: classpath*:mapper/**/*.xml
+ configuration:
+ log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
\ No newline at end of file
diff --git a/virtual-patient-graph/src/main/resources/bootstrap-dev.yml b/virtual-patient-graph/src/main/resources/bootstrap-dev.yml
new file mode 100644
index 00000000..b43e8800
--- /dev/null
+++ b/virtual-patient-graph/src/main/resources/bootstrap-dev.yml
@@ -0,0 +1,10 @@
+spring:
+ cloud:
+ nacos:
+ config:
+ server-addr: 192.168.10.137:8848
+ file-extension: yml
+ namespace: b9eea377-79ec-4ba5-9cc2-354f7bd5181e
+ discovery:
+ server-addr: 192.168.10.137:8848
+ namespace: b9eea377-79ec-4ba5-9cc2-354f7bd5181e
diff --git a/virtual-patient-graph/src/main/resources/bootstrap-test.yml b/virtual-patient-graph/src/main/resources/bootstrap-test.yml
new file mode 100644
index 00000000..71468fab
--- /dev/null
+++ b/virtual-patient-graph/src/main/resources/bootstrap-test.yml
@@ -0,0 +1,10 @@
+spring:
+ cloud:
+ nacos:
+ config:
+ server-addr: 192.168.10.137:8848
+ file-extension: yml
+ namespace: 88e1f674-1fbc-4021-9ff1-60b94ee13ef0
+ discovery:
+ server-addr: 192.168.10.137:8848
+ namespace: 88e1f674-1fbc-4021-9ff1-60b94ee13ef0
\ No newline at end of file
diff --git a/virtual-patient-graph/src/main/resources/bootstrap.yml b/virtual-patient-graph/src/main/resources/bootstrap.yml
new file mode 100644
index 00000000..524e3266
--- /dev/null
+++ b/virtual-patient-graph/src/main/resources/bootstrap.yml
@@ -0,0 +1,5 @@
+spring:
+ profiles:
+ active: dev
+ application:
+ name: virtual-patient-graph
\ No newline at end of file
diff --git a/virtual-patient-graph/src/main/resources/logback-spring.xml b/virtual-patient-graph/src/main/resources/logback-spring.xml
new file mode 100644
index 00000000..88cefa73
--- /dev/null
+++ b/virtual-patient-graph/src/main/resources/logback-spring.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ /data/vp/log/virtual-patient-graph.log
+
+
+ /data/vp/log/history/virtual-patient-graph-%d{yyyy-MM-dd}.log
+
+
+ %date [%thread] %-5level %logger{35} - %msg%n
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/virtual-patient-graph/src/main/resources/知识图谱test-1.xlsx b/virtual-patient-graph/src/main/resources/知识图谱test-1.xlsx
deleted file mode 100644
index e81adf83..00000000
Binary files a/virtual-patient-graph/src/main/resources/知识图谱test-1.xlsx and /dev/null differ
diff --git a/virtual-patient-rasa/src/main/resources/templates/config.ftl b/virtual-patient-rasa/src/main/resources/templates/config.ftl
index d87a0641..d398b7c4 100644
--- a/virtual-patient-rasa/src/main/resources/templates/config.ftl
+++ b/virtual-patient-rasa/src/main/resources/templates/config.ftl
@@ -5,24 +5,24 @@ pipeline:
- name: JiebaTokenizer
- name: LanguageModelFeaturizer
model_name: bert
- model_weights: bert-base-chinese
- - name: RegexFeaturizer
- - name: DIETClassifier
- epochs: 100
- learning_rate: 0.001
- tensorboard_log_directory: ./log
- - name: ResponseSelector
- epochs: 100
- learning_rate: 0.001
- - name: FallbackClassifier
- threshold: 0.87
- ambiguity_threshold: 0.1
- - name: EntitySynonymMapper
+model_weights: bert-base-chinese
+- name: RegexFeaturizer
+- name: DIETClassifier
+epochs: 100
+learning_rate: 0.001
+tensorboard_log_directory: ./log
+- name: ResponseSelector
+epochs: 100
+learning_rate: 0.001
+- name: FallbackClassifier
+threshold: 0.4
+ambiguity_threshold: 0.1
+- name: EntitySynonymMapper
policies:
- - name: MemoizationPolicy
- - name: TEDPolicy
- - name: RulePolicy
- core_fallback_threshold: 0.87
- core_fallback_action_name: "action_default_fallback"
- enable_fallback_prediction: True
+- name: MemoizationPolicy
+- name: TEDPolicy
+- name: RulePolicy
+core_fallback_threshold: 0.4
+core_fallback_action_name: "action_default_fallback"
+enable_fallback_prediction: True
diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ChartNodeVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ChartNodeVO.java
index 20961858..dc77eb26 100644
--- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ChartNodeVO.java
+++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/ChartNodeVO.java
@@ -1,34 +1,42 @@
package com.supervision.pojo.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
+@ApiModel
public class ChartNodeVO {
/**
* 属性占比
*/
+ @ApiModelProperty("属性占比")
private BigDecimal nodePer;
/**
* 总数=其他三项之和
*/
+ @ApiModelProperty("总数")
private Integer total;
/**
* 用户命中的数量
*/
+ @ApiModelProperty("用户命中的数量")
private Integer correct;
/**
* 不正确,用户未命中的数量=病例库中的总数-用户命中的数量
*/
+ @ApiModelProperty("不正确")
private Integer unCorrect;
/**
* 标准,病例库中配置的数量
*/
+ @ApiModelProperty("标准,病例库中配置的数量")
private Integer standard;
}
diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/RadarChartResVO.java b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/RadarChartResVO.java
index 16a2c59d..5911d657 100644
--- a/virtual-patient-web/src/main/java/com/supervision/pojo/vo/RadarChartResVO.java
+++ b/virtual-patient-web/src/main/java/com/supervision/pojo/vo/RadarChartResVO.java
@@ -1,18 +1,26 @@
package com.supervision.pojo.vo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
+@ApiModel
public class RadarChartResVO {
// 生成问诊雷达图
+ @ApiModelProperty("生成问诊雷达图")
private ChartNodeVO askChart;
// 生成体格检查雷达图
+ @ApiModelProperty("生成体格检查雷达图")
private ChartNodeVO physicalChart;
// 生成辅助检查雷达图
+ @ApiModelProperty("生成辅助检查雷达图")
private ChartNodeVO ancillaryChart;
// 生成处置计划雷达图
+ @ApiModelProperty("生成处置计划雷达图")
private ChartNodeVO treatmentPlanChart;
// 临床思维=前面几项和或平均值
+ @ApiModelProperty("临床思维")
private ChartNodeVO clinicalThinking;
}
diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
index 4e4a1e54..f67197a5 100644
--- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
+++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskDiagnosisResultServiceImpl.java
@@ -103,6 +103,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
ArrayList otherTreatmentPlanResults = new ArrayList<>();
for (TreatmentPlanRecord treatmentPlanRecord : treatmentPlanRecordList) {
TreatmentPlanRecordVo bean = BeanUtil.toBean(treatmentPlanRecord, TreatmentPlanRecordVo.class);
+ // 是否正确
boolean flag = StrUtil.isNotEmpty(bean.getDrugId()) ? drugIds.contains(bean.getDrugId()) : planIds.contains(bean.getTreatmentPlanId());
bean.setFlag(flag ? 1 : 0);
if (StrUtil.isNotEmpty(bean.getDrugId())) {
@@ -362,12 +363,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
// 过程数据3:问诊vs问诊正确率
BigDecimal num3 = BigDecimal.ZERO;
if (userTreatmentPlanCount > 0) {
- num3 = BigDecimal.valueOf(hitPlanCount).divide(BigDecimal.valueOf(userTreatmentPlanCount), 1, RoundingMode.HALF_UP);
+ num3 = BigDecimal.valueOf(hitPlanCount).divide(BigDecimal.valueOf(userTreatmentPlanCount), 2, RoundingMode.HALF_UP);
}
// 过程数据2:问诊vs标准正确率
BigDecimal num2 = BigDecimal.ZERO;
if (medicalCount > 0) {
- num2 = BigDecimal.valueOf(hitPlanCount).divide(BigDecimal.valueOf(medicalCount), 1, RoundingMode.HALF_UP);
+ num2 = BigDecimal.valueOf(hitPlanCount).divide(BigDecimal.valueOf(medicalCount), 2, RoundingMode.HALF_UP);
}
ChartNodeVO chartNodeVO = new ChartNodeVO();
chartNodeVO.setNodePer(num2.multiply(num3));
@@ -393,12 +394,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
// 过程数据3:问诊vs问诊正确率
BigDecimal num3 = BigDecimal.ZERO;
if (userCount > 0) {
- num3 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(userCount), 1, RoundingMode.HALF_UP);
+ num3 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(userCount), 2, RoundingMode.HALF_UP);
}
// 过程数据2:问诊vs标准正确率
BigDecimal num2 = BigDecimal.ZERO;
if (medicalCount > 0) {
- num2 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(medicalCount), 1, RoundingMode.HALF_UP);
+ num2 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(medicalCount), 2, RoundingMode.HALF_UP);
}
ChartNodeVO chartNodeVO = new ChartNodeVO();
@@ -427,12 +428,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
// 过程数据3:问诊vs问诊正确率
BigDecimal num3 = BigDecimal.ZERO;
if (userCount > 0) {
- num3 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(userCount), 1, RoundingMode.HALF_UP);
+ num3 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(userCount), 2, RoundingMode.HALF_UP);
}
// 过程数据2:问诊vs标准正确率
BigDecimal num2 = BigDecimal.ZERO;
if (medicalCount > 0) {
- num2 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(medicalCount), 1, RoundingMode.HALF_UP);
+ num2 = BigDecimal.valueOf(userHitCount).divide(BigDecimal.valueOf(medicalCount), 2, RoundingMode.HALF_UP);
}
ChartNodeVO chartNodeVO = new ChartNodeVO();
chartNodeVO.setNodePer(num2.multiply(num3));
@@ -474,12 +475,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
// 过程数据3:问诊vs问诊正确率
BigDecimal num3 = BigDecimal.ZERO;
if (userQuestionCount > 0) {
- num3 = BigDecimal.valueOf(userHitQuestionCount).divide(BigDecimal.valueOf(userQuestionCount), 1, RoundingMode.HALF_UP);
+ num3 = BigDecimal.valueOf(userHitQuestionCount).divide(BigDecimal.valueOf(userQuestionCount), 2, RoundingMode.HALF_UP);
}
// 过程数据2:问诊vs标准正确率
BigDecimal num2 = BigDecimal.ZERO;
if (medicalQuestionCount > 0) {
- num2 = BigDecimal.valueOf(userHitQuestionCount).divide(BigDecimal.valueOf(medicalQuestionCount), 1, RoundingMode.HALF_UP);
+ num2 = BigDecimal.valueOf(userHitQuestionCount).divide(BigDecimal.valueOf(medicalQuestionCount), 2, RoundingMode.HALF_UP);
}
ChartNodeVO chartNodeVO = new ChartNodeVO();
chartNodeVO.setNodePer(num2.multiply(num3));
diff --git a/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java b/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java
index f98cdb2d..4abd7794 100644
--- a/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java
+++ b/virtual-patient-web/src/test/java/com/supervision/AskTemplateIdTest.java
@@ -1,7 +1,6 @@
package com.supervision;
import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.http.HttpUtil;
@@ -30,6 +29,8 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@Slf4j
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@@ -87,6 +88,7 @@ public class AskTemplateIdTest {
}
}
+
@Test
public void generateQuestion() {
// 使用文心一言,这里是付费的,不要随便用哦,注意数量
@@ -94,31 +96,36 @@ public class AskTemplateIdTest {
System.out.println(post);
JSONObject parse = JSONUtil.parseObj(post);
String accessToken = parse.getStr("access_token");
-
+ List aqtList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").isNotNull(CommonDic::getParentId).ne(CommonDic::getParentId, 179).list();
+ Map dictMap = aqtList.stream().collect(Collectors.toMap(CommonDic::getId, Function.identity()));
List list = askTemplateQuestionLibraryService.list();
for (AskTemplateQuestionLibrary ask : list) {
try {
- String description = ask.getDescription();
- Map map = new HashMap<>();
- map.put("role", "user");
- map.put("content", "请把下面这句话以20种不同的方式提问,以JSONARRAY的形式输出:" + description);
- HashMap param = new HashMap<>();
- param.put("messages", CollUtil.newArrayList(map));
- String askAnswer = HttpUtil.post("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + accessToken, JSONUtil.toJsonStr(param));
- JSONObject answerJSON = JSONUtil.parseObj(askAnswer);
- String result = answerJSON.getStr("result");
- String s = ReUtil.get("\\[(.*?)\\]", result, 0);
- List question = JSONUtil.toList(s, String.class);
- question.add(0, description);
- askTemplateQuestionLibraryService.lambdaUpdate().set(AskTemplateQuestionLibrary::getQuestion, JSONUtil.toJsonStr(question)).eq(AskTemplateQuestionLibrary::getId, ask.getId()).update();
+ CommonDic dic = dictMap.get(ask.getDictId());
+ if (ObjectUtil.isNotEmpty(dic)) {
+ String description = ask.getDescription();
+ Map map = new HashMap<>();
+ map.put("role", "user");
+ map.put("content", "假设你是一个精通RASA NLU调优的工程师,我现在有一个意图,有一个问题示例,请你根据这个意图,针对这个问题示例,提出30条与这个问题示例类似的问题,注意,问题不要超出这个意图的范围,回答请使用json array的格式,示例:[\"相似问题1\",\"相似问题2\"]\n" +
+ "### 下面是意图和问题示例\n" + dic.getNameZhPath() + ":" + ask.getQuestion());
+ HashMap param = new HashMap<>();
+ param.put("messages", CollUtil.newArrayList(map));
+ String askAnswer = HttpUtil.post("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + accessToken, JSONUtil.toJsonStr(param));
+ JSONObject answerJSON = JSONUtil.parseObj(askAnswer);
+ String result = answerJSON.getStr("result");
+ String s = ReUtil.get("\\[(.*?)\\]", result, 0);
+ List question = JSONUtil.toList(s, String.class);
+ question.add(0, description);
+ askTemplateQuestionLibraryService.lambdaUpdate().set(AskTemplateQuestionLibrary::getQuestion, JSONUtil.toJsonStr(question)).eq(AskTemplateQuestionLibrary::getId, ask.getId()).update();
+ }
+
} catch (Exception e) {
log.error("{}生成错误", ask.getDescription(), e);
}
-
}
-
}
+
@Autowired
private AskService askService;