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;