Merge remote-tracking branch 'origin/dev_2.1.0' into dev_2.1.0

dev_2.1.0
xueqingkun 1 year ago
commit 856ba27c19

@ -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"]

@ -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

@ -20,6 +20,36 @@
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</exclusion>
<exclusion>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-common</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.nebula-contrib</groupId>
<artifactId>ngbatis</artifactId>
@ -83,4 +113,21 @@
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -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) {

@ -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<NgSubgraph<String>> subgraphList = medicalRecDao.selectSubgraph(process.getGraphId());
List<NodeVO> nodeList = new ArrayList<>();

@ -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<String, Object> params;
}

@ -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<NodeVO> nodes;
@ApiModelProperty("关系")
private List<EdgeVO> edges;
}

@ -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<String, Object> params = new LinkedHashMap<>();
}

@ -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<String, Object> params = new LinkedHashMap<>();
/**
*
*/
@ApiModelProperty("子节点")
private List<TreeNodeVO> childNodeList;
}

@ -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

@ -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
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

@ -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

@ -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

@ -0,0 +1,5 @@
spring:
profiles:
active: dev
application:
name: virtual-patient-graph

@ -0,0 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="INFO"/>
<!-- 开发环境 -->
<springProfile name="local,dev">
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="INFO"/>
<logger name="com.supervision" level="DEBUG"/>
<logger name="org.springframework.scheduling" level="INFO"/>
</springProfile>
<!-- 测试环境,生产环境 -->
<springProfile name="prod">
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springboot.sample" level="INFO"/>
<logger name="com.supervision" level="INFO"/>
<logger name="org.springframework.scheduling" level="INFO"/>
<root level="INFO">
<appender name="DAILY_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 服务器中当天的日志 -->
<file>/data/vp/log/virtual-patient-graph.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 服务器归档日志 -->
<fileNamePattern>/data/vp/log/history/virtual-patient-graph-%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%date [%thread] %-5level %logger{35} - %msg%n</pattern>
</encoder>
</appender>
</root>
</springProfile>
</configuration>

@ -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

@ -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;
}

@ -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;
}

@ -103,6 +103,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
ArrayList<TreatmentPlanRecordVo> 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));

@ -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<CommonDic> aqtList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").isNotNull(CommonDic::getParentId).ne(CommonDic::getParentId, 179).list();
Map<Long, CommonDic> dictMap = aqtList.stream().collect(Collectors.toMap(CommonDic::getId, Function.identity()));
List<AskTemplateQuestionLibrary> list = askTemplateQuestionLibraryService.list();
for (AskTemplateQuestionLibrary ask : list) {
try {
String description = ask.getDescription();
Map<String, Object> map = new HashMap<>();
map.put("role", "user");
map.put("content", "请把下面这句话以20种不同的方式提问以JSONARRAY的形式输出:" + description);
HashMap<String, Object> 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<String> 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<String, Object> map = new HashMap<>();
map.put("role", "user");
map.put("content", "假设你是一个精通RASA NLU调优的工程师我现在有一个意图有一个问题示例请你根据这个意图针对这个问题示例提出30条与这个问题示例类似的问题注意问题不要超出这个意图的范围回答请使用json array的格式示例[\"相似问题1\",\"相似问题2\"]\n" +
"### 下面是意图和问题示例\n" + dic.getNameZhPath() + ":" + ask.getQuestion());
HashMap<String, Object> 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<String> 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;

Loading…
Cancel
Save