集成京东数字人对话

dev_v1.0.1
liu 2 years ago
parent 3e6344f93b
commit 1b532ce628

Binary file not shown.

@ -3,7 +3,10 @@ version: "3.1"
intents:
- ask_wen_zhong_da_sheng_huo_shi_jian_1717735465479581698
- ask_wen_chu_xian_jian_ge_1717735465047568386
- tool_blood_pressure
- tool_heart_rate
- ask_wen_fa_zuo_pin_lv_1717735465211146241
- tool_thermometer
- ask_wen_dui_ri_chang_ying_xiang_1717735465357946881
- ask_wen_fu_yao_shi_1717735465630576641
- ask_wen_chou_yan_shi_1717735465680908289
@ -11,20 +14,28 @@ intents:
- ask_wen_bing_shi_1717735465420861442
- ask_wen_fa_bing_zhi_qian_de_dong_zuo_1717735465529913345
- ask_wen_zheng_zhuang_miao_shu_1717735465076928513
- ancillary_eye_ct
- ancillary_jia_zhuang_xian_chao_sheng
- ask_wen_jia_zu_shi_1717735465328586753
- ask_wen_chu_xian_duo_jiu_1717735464976265217
- ask_wen_jian_qing_huo_jia_zhong_qing_kuang_1717735465014013954
- ask_wen_fu_yao_shi_1717735465735434241
- ancillary_xi_dian_lv
- ask_wen_guo_min_shi_1717735465710268417
- tool_weight
- ancillary_blood_h-z
- ancillary_xin_dian_tu
- ask_wen_jiu_zhen_shi_1717735465299226626
- ask_wen_qi_ta_zheng_zhuang_1717735465173397505
- ask_wen_bu_shu_fu_1717735464913350658
- ask_wen_lei_si_qing_kuang_1717735465240506370
- ask_wen_ti_li_1717735465605410818
- tool_height
- ask_wen_zheng_zhuang_gai_bian_qing_kuang_1717735465269866497
- ask_wen_fu_xie_1717735465580244993
- ask_wen_zi_wo_gan_jue_1717735465504747522
- ask_wen_shou_shang_shi_1717735465450221569
- ancillary_blood_a-g
- ask_wen_zheng_zhuang_yan_zhong_cheng_du_1717735465135648770
- ask_wen_diao_tou_fa_1717735465555079170
- ask_wen_yin_jiu_shi_1717735465655742466
@ -34,8 +45,14 @@ responses:
- text: "没有"
utter_ask_wen_chu_xian_jian_ge_1717735465047568386:
- text: "基本上天天出现。"
utter_tool_blood_pressure:
- text: "---tool---2"
utter_tool_heart_rate:
- text: "---tool---9"
utter_ask_wen_fa_zuo_pin_lv_1717735465211146241:
- text: "反复发作,基本上天天出现,"
utter_tool_thermometer:
- text: "---tool---6"
utter_ask_wen_dui_ri_chang_ying_xiang_1717735465357946881:
- text: "影响到我的工作和生活了。"
utter_ask_wen_fu_yao_shi_1717735465630576641:
@ -50,6 +67,10 @@ responses:
- text: "没有"
utter_ask_wen_zheng_zhuang_miao_shu_1717735465076928513:
- text: "感觉心跳特别快,喘不上气,活动后更严重。"
utter_ancillary_eye_ct:
- text: "---ancillary---10"
utter_ancillary_jia_zhuang_xian_chao_sheng:
- text: "---ancillary---9"
utter_ask_wen_jia_zu_shi_1717735465328586753:
- text: "没有"
utter_ask_wen_chu_xian_duo_jiu_1717735464976265217:
@ -58,8 +79,16 @@ responses:
- text: "活动后会加重,双腿还会没劲。"
utter_ask_wen_fu_yao_shi_1717735465735434241:
- text: "之前身体很好,没吃过什么药。"
utter_ancillary_xi_dian_lv:
- text: "---ancillary---4"
utter_ask_wen_guo_min_shi_1717735465710268417:
- text: "没有"
utter_tool_weight:
- text: "---tool---8"
utter_ancillary_blood_h-z:
- text: "---ancillary---1"
utter_ancillary_xin_dian_tu:
- text: "---ancillary---2"
utter_ask_wen_jiu_zhen_shi_1717735465299226626:
- text: "没有"
utter_ask_wen_qi_ta_zheng_zhuang_1717735465173397505:
@ -70,6 +99,8 @@ responses:
- text: "之前没有。"
utter_ask_wen_ti_li_1717735465605410818:
- text: "体力好像比之前差了一些,最近这些天我经常喘不过气来,并且活动后感觉双腿乏力,感觉到非常虚弱。"
utter_tool_height:
- text: "---tool---7"
utter_ask_wen_zheng_zhuang_gai_bian_qing_kuang_1717735465269866497:
- text: "夏天很怕热,晚上也会睡不着。"
utter_ask_wen_fu_xie_1717735465580244993:
@ -78,39 +109,22 @@ responses:
- text: "我不知道"
utter_ask_wen_shou_shang_shi_1717735465450221569:
- text: "没有"
utter_ancillary_blood_a-g:
- text: "---ancillary---3"
utter_ask_wen_zheng_zhuang_yan_zhong_cheng_du_1717735465135648770:
- text: "比较严重。"
utter_ask_wen_diao_tou_fa_1717735465555079170:
- text: "似乎是比之前掉的多了。"
utter_ask_wen_yin_jiu_shi_1717735465655742466:
- text: "没有"
utter_tool_height:
- text: "---tool---7"
utter_tool_blood_pressure:
- text: "---tool---2"
utter_tool_heart_rate:
- text: "---tool---9"
utter_tool_thermometer:
- text: "---tool---6"
utter_tool_weight:
- text: "---tool---8"
utter_ancillary_eye_ct:
- text: "---ancillary---10"
utter_ancillary_blood_a-g:
- text: "---ancillary---3"
utter_ancillary_jia_zhuang_xian_chao_sheng:
- text: "---ancillary---9"
utter_ancillary_xi_dian_lv:
- text: "---ancillary---4"
utter_ancillary_blood_h-z:
- text: "---ancillary---1"
utter_ancillary_xin_dian_tu:
- text: "---ancillary---2"
actions:
- utter_ask_wen_zhong_da_sheng_huo_shi_jian_1717735465479581698
- utter_ask_wen_chu_xian_jian_ge_1717735465047568386
- utter_tool_blood_pressure
- utter_tool_heart_rate
- utter_ask_wen_fa_zuo_pin_lv_1717735465211146241
- utter_tool_thermometer
- utter_ask_wen_dui_ri_chang_ying_xiang_1717735465357946881
- utter_ask_wen_fu_yao_shi_1717735465630576641
- utter_ask_wen_chou_yan_shi_1717735465680908289
@ -118,34 +132,31 @@ actions:
- utter_ask_wen_bing_shi_1717735465420861442
- utter_ask_wen_fa_bing_zhi_qian_de_dong_zuo_1717735465529913345
- utter_ask_wen_zheng_zhuang_miao_shu_1717735465076928513
- utter_ancillary_eye_ct
- utter_ancillary_jia_zhuang_xian_chao_sheng
- utter_ask_wen_jia_zu_shi_1717735465328586753
- utter_ask_wen_chu_xian_duo_jiu_1717735464976265217
- utter_ask_wen_jian_qing_huo_jia_zhong_qing_kuang_1717735465014013954
- utter_ask_wen_fu_yao_shi_1717735465735434241
- utter_ancillary_xi_dian_lv
- utter_ask_wen_guo_min_shi_1717735465710268417
- utter_tool_weight
- utter_ancillary_blood_h-z
- utter_ancillary_xin_dian_tu
- utter_ask_wen_jiu_zhen_shi_1717735465299226626
- utter_ask_wen_qi_ta_zheng_zhuang_1717735465173397505
- utter_ask_wen_bu_shu_fu_1717735464913350658
- utter_ask_wen_lei_si_qing_kuang_1717735465240506370
- utter_ask_wen_ti_li_1717735465605410818
- utter_tool_height
- utter_ask_wen_zheng_zhuang_gai_bian_qing_kuang_1717735465269866497
- utter_ask_wen_fu_xie_1717735465580244993
- utter_ask_wen_zi_wo_gan_jue_1717735465504747522
- utter_ask_wen_shou_shang_shi_1717735465450221569
- utter_ancillary_blood_a-g
- utter_ask_wen_zheng_zhuang_yan_zhong_cheng_du_1717735465135648770
- utter_ask_wen_diao_tou_fa_1717735465555079170
- utter_ask_wen_yin_jiu_shi_1717735465655742466
- utter_tool_height
- utter_tool_blood_pressure
- utter_tool_heart_rate
- utter_tool_thermometer
- utter_tool_weight
- utter_ancillary_eye_ct
- utter_ancillary_blood_a-g
- utter_ancillary_jia_zhuang_xian_chao_sheng
- utter_ancillary_xi_dian_lv
- utter_ancillary_blood_h-z
- utter_ancillary_xin_dian_tu
session_config:
session_expiration_time: 60

@ -28,25 +28,25 @@ nlu:
examples: |
- 您第一次发现这个问题是在什么时候?它是从什么时候开始的?
- 当您首次察觉到这一问题是在什么日期?
- 您是何时开始意识到这个问题的存在?
- 您是在什么时间点首次察觉到这个问题?
- 您是何时首次觉察到这个问题的存在?
- 这个问题是在什么日期首次引起您的关注?
- 您是在什么时间首次察觉到这个问题的存在?
- 您是何时开始感知到这个问题的存在?
- 这个问题是在什么日期首次显现在您的视野中?
- 您是在什么时间点开始注意到这个问题?
- 这个问题何时首次引起您的注意?
- 您是在什么日期首次注意到这个问题?
- 这个问题是在什么时间点开始变得明显?
- 您是何时首次觉察到这个问题?
- 您是在什么日期开始感知到这个问题的存在?
- 这个问题何时首次显现在您的视野中?
- 您是在什么时间点首次发觉这个问题?
- 这个问题是在什么日期首次引起您的注意?
- 您是何时开始察觉到这个问题的存在?
- 您是在什么时间点首次注意到这个问题?
- 这个问题是在什么日期首次被您察
- 您是何时开始意识到这个问题的存在?
- 您是在什么时间点首次察觉到这个问题?
- 您是何时首次觉察到这个问题的存在?
- 这个问题是在什么日期首次引起您的关注?
- 您是在什么时间首次察觉到这个问题的存在?
- 您是何时开始感知到这个问题的存在?
- 这个问题是在什么日期首次显现在您的视野中?
- 您是在什么时间点开始注意到这个问题?
- 这个问题何时首次引起您的注意?
- 您是在什么日期首次注意到这个问题?
- 这个问题是在什么时间点开始变得明显?
- 您是何时首次觉察到这个问题?
- 您是在什么日期开始感知到这个问题的存在?
- 这个问题何时首次显现在您的视野中?
- 您是在什么时间点首次发觉这个问题?
- 这个问题是在什么日期首次引起您的注意?
- 您是何时开始察觉到这个问题的存在?
- 您是在什么时间点首次注意到这个问题?
- 这个问题是在什么日期首次被您察
- intent: ask_wen_jian_qing_huo_jia_zhong_qing_kuang_1717735465014013954
examples: |
- 您有没有注意过什么情况下症状会减轻或加重?

@ -10,10 +10,22 @@ rules:
steps:
- intent: ask_wen_chu_xian_jian_ge_1717735465047568386
- action: utter_ask_wen_chu_xian_jian_ge_1717735465047568386
- rule: 呼出-tool-水银血压计
steps:
- intent: tool_blood_pressure
- action: utter_tool_blood_pressure
- rule: 呼出-tool-心率
steps:
- intent: tool_heart_rate
- action: utter_tool_heart_rate
- rule: 问发作频率
steps:
- intent: ask_wen_fa_zuo_pin_lv_1717735465211146241
- action: utter_ask_wen_fa_zuo_pin_lv_1717735465211146241
- rule: 呼出-tool-体温计
steps:
- intent: tool_thermometer
- action: utter_tool_thermometer
- rule: 问对日常影响
steps:
- intent: ask_wen_dui_ri_chang_ying_xiang_1717735465357946881
@ -42,6 +54,14 @@ rules:
steps:
- intent: ask_wen_zheng_zhuang_miao_shu_1717735465076928513
- action: utter_ask_wen_zheng_zhuang_miao_shu_1717735465076928513
- rule: 呼出-ancillary-眼眶CT
steps:
- intent: ancillary_eye_ct
- action: utter_ancillary_eye_ct
- rule: 呼出-ancillary-甲状腺超声
steps:
- intent: ancillary_jia_zhuang_xian_chao_sheng
- action: utter_ancillary_jia_zhuang_xian_chao_sheng
- rule: 问家族史
steps:
- intent: ask_wen_jia_zu_shi_1717735465328586753
@ -58,10 +78,26 @@ rules:
steps:
- intent: ask_wen_fu_yao_shi_1717735465735434241
- action: utter_ask_wen_fu_yao_shi_1717735465735434241
- rule: 呼出-ancillary-吸碘率
steps:
- intent: ancillary_xi_dian_lv
- action: utter_ancillary_xi_dian_lv
- rule: 问过敏史
steps:
- intent: ask_wen_guo_min_shi_1717735465710268417
- action: utter_ask_wen_guo_min_shi_1717735465710268417
- rule: 呼出-tool-体重
steps:
- intent: tool_weight
- action: utter_tool_weight
- rule: 呼出-ancillary-Blood H-Z
steps:
- intent: ancillary_blood_h-z
- action: utter_ancillary_blood_h-z
- rule: 呼出-ancillary-心电图
steps:
- intent: ancillary_xin_dian_tu
- action: utter_ancillary_xin_dian_tu
- rule: 问就诊史
steps:
- intent: ask_wen_jiu_zhen_shi_1717735465299226626
@ -82,6 +118,10 @@ rules:
steps:
- intent: ask_wen_ti_li_1717735465605410818
- action: utter_ask_wen_ti_li_1717735465605410818
- rule: 呼出-tool-身高
steps:
- intent: tool_height
- action: utter_tool_height
- rule: 问症状改变情况
steps:
- intent: ask_wen_zheng_zhuang_gai_bian_qing_kuang_1717735465269866497
@ -98,6 +138,10 @@ rules:
steps:
- intent: ask_wen_shou_shang_shi_1717735465450221569
- action: utter_ask_wen_shou_shang_shi_1717735465450221569
- rule: 呼出-ancillary-Blood A-G
steps:
- intent: ancillary_blood_a-g
- action: utter_ancillary_blood_a-g
- rule: 问症状严重程度
steps:
- intent: ask_wen_zheng_zhuang_yan_zhong_cheng_du_1717735465135648770
@ -110,47 +154,3 @@ rules:
steps:
- intent: ask_wen_yin_jiu_shi_1717735465655742466
- action: utter_ask_wen_yin_jiu_shi_1717735465655742466
- rule: 身高
steps:
- intent: tool_height
- action: utter_tool_height
- rule: 水银血压计
steps:
- intent: tool_blood_pressure
- action: utter_tool_blood_pressure
- rule: 心率
steps:
- intent: tool_heart_rate
- action: utter_tool_heart_rate
- rule: 体温计
steps:
- intent: tool_thermometer
- action: utter_tool_thermometer
- rule: 体重
steps:
- intent: tool_weight
- action: utter_tool_weight
- rule: 眼眶CT
steps:
- intent: ancillary_eye_ct
- action: utter_ancillary_eye_ct
- rule: Blood A-G
steps:
- intent: ancillary_blood_a-g
- action: utter_ancillary_blood_a-g
- rule: 甲状腺超声
steps:
- intent: ancillary_jia_zhuang_xian_chao_sheng
- action: utter_ancillary_jia_zhuang_xian_chao_sheng
- rule: 吸碘率
steps:
- intent: ancillary_xi_dian_lv
- action: utter_ancillary_xi_dian_lv
- rule: Blood H-Z
steps:
- intent: ancillary_blood_h-z
- action: utter_ancillary_blood_h-z
- rule: 心电图
steps:
- intent: ancillary_xin_dian_tu
- action: utter_ancillary_xin_dian_tu

@ -3,6 +3,7 @@ package com.supervision.config;
import cn.hutool.json.JSONUtil;
import com.supervision.domain.GlobalResult;
import com.supervision.exception.BusinessException;
import com.supervision.exception.HumanException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.http.HttpStatus;
@ -70,6 +71,18 @@ public class ResponseConfig implements ResponseBodyAdvice<Object> {
return GlobalResult.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), exception.getMessage(), "业务异常");
}
/**
*
*
* @param exception
* @return
*/
@ExceptionHandler(HumanException.class)
public GlobalResult<?> humanExceptionResponse(HumanException exception) {
log.error(exception.getMessage(), exception);
return GlobalResult.error(exception.getCode(), exception.getMessage(), "数字人异常");
}
/**
*
@ -99,4 +112,5 @@ public class ResponseConfig implements ResponseBodyAdvice<Object> {
return GlobalResult.error(HttpStatus.INTERNAL_SERVER_ERROR.value(), "未知错误", exception.getMessage());
}
}

@ -0,0 +1,59 @@
/*
* : CustomException
* :
* : <>
* : RedName
* : 2022/8/5
* : <>
* : <>
* : <>
*/
package com.supervision.exception;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
/**
* <>
*
*
* @author ljt
* @version [, 2022/8/5]
* @see [/]
* @since [/]
*/
@Slf4j
public class HumanException extends RuntimeException {
/**
* ,,
*/
private static final Integer HUMAN_ERROR = 6001;
/**
*
*/
private final Integer code;
/**
*
*/
private final String message;
private HumanException(Integer code, String message) {
this.code = code;
this.message = message;
}
public static HumanException humanError(String message) {
return new HumanException(HUMAN_ERROR, message);
}
@Override
public String getMessage() {
return message;
}
public Integer getCode() {
return code;
}
}

@ -0,0 +1,18 @@
package com.supervision.mapper;
import com.supervision.model.Lock;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author flevance
* @description lock(,redis,使)Mapper
* @createDate 2023-11-01 13:11:34
* @Entity com.supervision.model.Lock
*/
public interface LockMapper extends BaseMapper<Lock> {
}

@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.extension.activerecord.Model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -18,7 +19,7 @@ import lombok.Data;
@TableName(value ="vp_diagnosis_qa_record")
@Data
@ApiModel
public class DiagnosisQaRecord implements Serializable {
public class DiagnosisQaRecord extends Model<DiagnosisQaRecord> implements Serializable {
/**
*
*/
@ -31,6 +32,9 @@ public class DiagnosisQaRecord implements Serializable {
@ApiModelProperty("诊断进程ID")
private String processId;
@ApiModelProperty("问答类型:default,disease")
private String questionAnswerType;
/**
* ID
*/

@ -0,0 +1,45 @@
package com.supervision.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import lombok.Data;
/**
* ,redis,使
* @TableName lock
*/
@TableName(value ="lock")
@Data
public class Lock implements Serializable {
/**
*
*/
@TableId
private String id;
/**
*
*/
private String lockCode;
/**
*
*/
private Long timestamp;
/**
*
*/
private Long expireMs;
/**
* 线ID,
*/
private String threadId;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}

@ -0,0 +1,13 @@
package com.supervision.service;
import com.supervision.model.Lock;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author flevance
* @description lock(,redis,使)Service
* @createDate 2023-11-01 13:11:34
*/
public interface LockService extends IService<Lock> {
}

@ -0,0 +1,22 @@
package com.supervision.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.supervision.model.Lock;
import com.supervision.service.LockService;
import com.supervision.mapper.LockMapper;
import org.springframework.stereotype.Service;
/**
* @author flevance
* @description lock(,redis,使)Service
* @createDate 2023-11-01 13:11:34
*/
@Service
public class LockServiceImpl extends ServiceImpl<LockMapper, Lock>
implements LockService{
}

@ -5,21 +5,24 @@
<mapper namespace="com.supervision.mapper.DiagnosisQaRecordMapper">
<resultMap id="BaseResultMap" type="com.supervision.model.DiagnosisQaRecord">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="processId" column="process_id" jdbcType="VARCHAR"/>
<result property="questionAnswerId" column="question_answer_id" jdbcType="VARCHAR"/>
<result property="question" column="question" jdbcType="VARCHAR"/>
<result property="questionWavId" column="question_wav_id" jdbcType="VARCHAR"/>
<result property="answer" column="answer" jdbcType="VARCHAR"/>
<result property="answerWavId" column="answer_wav_id" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="processId" column="process_id" jdbcType="VARCHAR"/>
<result property="questionAnswerType" column="question_answer_type" jdbcType="VARCHAR"/>
<result property="questionAnswerId" column="question_answer_id" jdbcType="VARCHAR"/>
<result property="question" column="question" jdbcType="VARCHAR"/>
<result property="questionWavId" column="question_wav_id" jdbcType="VARCHAR"/>
<result property="answer" column="answer" jdbcType="VARCHAR"/>
<result property="answerWavId" column="answer_wav_id" jdbcType="VARCHAR"/>
<result property="createUserId" column="create_user_id" jdbcType="VARCHAR"/>
<result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
<result property="updateUserId" column="update_user_id" jdbcType="VARCHAR"/>
<result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Base_Column_List">
id,process_id,question,question_answer_id
id
,question_answer_type
,process_id,question,question_answer_id
question_wav_id,answer,answer_wav_id,
create_user_id,create_time,update_user_id,
update_time

@ -0,0 +1,19 @@
<?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.supervision.mapper.LockMapper">
<resultMap id="BaseResultMap" type="com.supervision.model.Lock">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="lockCode" column="lock_code" jdbcType="VARCHAR"/>
<result property="timestamp" column="timestamp" jdbcType="INTEGER"/>
<result property="expireMs" column="expire_ms" jdbcType="INTEGER"/>
<result property="threadId" column="thread_id" jdbcType="VARCHAR"/>
</resultMap>
<sql id="Base_Column_List">
id,lock_code,timestamp,
expire_ms,thread_id
</sql>
</mapper>

@ -6,6 +6,10 @@ import com.supervision.rasa.service.RasaFileService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

@ -1,6 +1,6 @@
package com.supervision.rasa.controller;
import com.supervision.rasa.pojo.vo.RasaTalkVo;
import com.supervision.vo.rasa.RasaTalkVo;
import com.supervision.rasa.service.RasaTalkService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@ -1,6 +1,6 @@
package com.supervision.rasa.service;
import com.supervision.rasa.pojo.vo.RasaTalkVo;
import com.supervision.vo.rasa.RasaTalkVo;
import java.util.List;

@ -1,6 +1,5 @@
package com.supervision.rasa.service.impl;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
@ -8,7 +7,7 @@ import com.supervision.exception.BusinessException;
import com.supervision.model.RasaModelInfo;
import com.supervision.rasa.pojo.dto.RasaReqDTO;
import com.supervision.rasa.pojo.dto.RasaResDTO;
import com.supervision.rasa.pojo.vo.RasaTalkVo;
import com.supervision.vo.rasa.RasaTalkVo;
import com.supervision.rasa.service.RasaTalkService;
import com.supervision.service.RasaModeService;
import lombok.RequiredArgsConstructor;
@ -17,7 +16,6 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@Service
@Slf4j

@ -1,7 +1,7 @@
server:
port: 8890
servlet:
context-path: /
context-path: /virtual-patient-rasa
undertow:
# HTTP post内容的最大大小。当值为-1时默认值为大小是无限的
max-http-post-size: -1

@ -57,7 +57,6 @@
<scope>provided</scope>
</dependency>
</dependencies>
<build>

@ -7,7 +7,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
@EnableWebSocket
@SpringBootApplication
@MapperScan(basePackages = {"com.supervision.**.mapper"})
public class VirtualPatientApplication {

@ -1,17 +1,15 @@
package com.supervision.controller;
import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.service.AskService;
import com.supervision.websocket.cache.WebSocketUserCache;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.List;
@Api(tags = "问诊")
@RestController
@ -22,17 +20,14 @@ public class AskController {
private AskService askService;
@ApiOperation("发送消息到页面")
@GetMapping("/sendMessage")
public void sendMessage(String message, String sessionId) throws IOException {
WebSocketSession session = WebSocketUserCache.getSession(sessionId);
session.sendMessage(new TextMessage(message));
}
@ApiOperation("接收页面的语音消息(这个接口使用京东数字人接口来做)")
@PostMapping("/receiveVoiceFile")
public String receiveVoiceFile(@RequestParam("file") MultipartFile file) throws IOException {
return askService.receiveVoiceFile(file);
public TalkResultResVO receiveVoiceFile(@RequestParam("file") MultipartFile file,
@ApiParam("流程ID") String processId,
@ApiParam("数字人房间的数字人ID") String roomKey,
@ApiParam("数字人的TOKEN") String roomToken) throws IOException {
return askService.receiveVoiceFile(file, processId, roomKey, roomToken);
}
@ApiOperation("回复语音及文字消息")
@ -41,12 +36,6 @@ public class AskController {
return askService.replyVoice();
}
@ApiOperation("进行对话")
@GetMapping("conversation")
public List<String> conversation(String question, String sessionId) {
return askService.conversation(question, sessionId);
}
@ApiOperation("查询对话历史")
public void queryAskHistory(String processId) {

@ -65,7 +65,7 @@ public class TestController {
* @param roomId ID
*/
@GetMapping("shuZiRenSend")
public void shuZiRenSend(String text, String roomId) {
public String shuZiRenSend(String text, String roomId) {
HashMap<String, Object> param = new HashMap<>();
long timeStamp = System.currentTimeMillis();
@ -79,8 +79,7 @@ public class TestController {
(String) param.get("text"),
(String) param.get("actionId"),
(String) param.get("roomId")));
String s = HttpUtil.get("https://digital-human.jd.com/text_driven", param);
System.out.println(s);
return HttpUtil.get("https://digital-human.jd.com/text_driven", param);
}
private static String getSign(String timeStamp, String nonce, String text, String actionId, String roomId) {

@ -0,0 +1,18 @@
package com.supervision.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class TalkResultResVO {
@ApiModelProperty("若有动作,这是需要执行的动作内容")
private ActionDTO action;
/**
* 使,action,1,2
*/
@ApiModelProperty("后端返回给前端时使用,表示该是消息还是action动作,1消息,2动作")
private Integer type;
}

@ -1,20 +1,15 @@
package com.supervision.service;
import com.supervision.websocket.dto.SocketMessageDTO;
import com.supervision.pojo.vo.TalkResultResVO;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.List;
public interface AskService {
void handlerMessageBySocket(SocketMessageDTO socketMessageDTO) throws IOException;
String receiveVoiceFile(MultipartFile file) throws IOException;
TalkResultResVO receiveVoiceFile(MultipartFile file, String processId, String roomKey, String roomToken) throws IOException;
String replyVoice();
List<String> conversation(String question, String sessionId);
}

@ -1,104 +1,103 @@
package com.supervision.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.supervision.exception.BusinessException;
import com.supervision.util.AsrUtil;
import com.supervision.util.TtsUtil;
import com.supervision.util.RasaUtil;
import com.supervision.model.DiagnosisQaRecord;
import com.supervision.model.Process;
import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.service.AskDefaultQuestionAnswerService;
import com.supervision.service.AskDiseaseQuestionAnswerService;
import com.supervision.service.ProcessService;
import com.supervision.util.*;
import com.supervision.service.AskService;
import com.supervision.util.UserUtil;
import com.supervision.websocket.cache.WebSocketUserCache;
import com.supervision.websocket.dto.ActionDTO;
import com.supervision.websocket.dto.SocketMessageDTO;
import com.supervision.pojo.vo.ActionDTO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import java.io.IOException;
import java.util.List;
import java.util.Optional;
import java.util.Random;
@Slf4j
@Service
@RequiredArgsConstructor
public class AskServiceImpl implements AskService {
private final ProcessService processService;
@Override
public void handlerMessageBySocket(SocketMessageDTO socketMessageDTO) throws IOException {
// 首先获取消息的类型
String text;
if (0 == socketMessageDTO.getMessageType()) {
// 如果是语音消息
// 调用百度接口,语音转文字
text = AsrUtil.asrTransformByBytes(socketMessageDTO.getVoiceMessage());
} else {
text = socketMessageDTO.getTextMessage();
}
if (StrUtil.isBlank(text)) {
throw new BusinessException("语音消息不能为空");
}
// 进行rasa对话
List<String> rasaResultList = RasaUtil.talkRasa(text, socketMessageDTO.getSocketId());
log.info("问题:{},rasa回复:{}", text, JSONUtil.toJsonStr(rasaResultList));
WebSocketSession session = WebSocketUserCache.getSession(socketMessageDTO.getSocketId());
for (String rasaResult : rasaResultList) {
if (StrUtil.isNotBlank(rasaResult)) {
// 这里校验,rasa回复的结果是不是action
// 这里设置的模板,对于action的动作全部是用---进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain
// ---ancillary---xxx
// ---tool---xxx
if (rasaResult.startsWith("---")) {
// ["","ancillary","xxx"]
List<String> actionList = StrUtil.split(rasaResult, "---");
if (actionList.size() > 2) {
ActionDTO actionDTO = new ActionDTO();
actionDTO.setActionType(actionList.get(1));
actionDTO.setActionId(actionList.get(2));
// 在这里给socket回复,设置为动作
SocketMessageDTO res = new SocketMessageDTO();
res.setSocketId(socketMessageDTO.getSocketId());
res.setUserId(UserUtil.getUser().getId());
res.setAction(actionDTO);
res.setType(2);
session.sendMessage(new TextMessage(JSONUtil.toJsonStr(res)));
return;
}
} else {
// 走到这里,说明是文字,这个时候文字转语音
String replyVoiceResVO = TtsUtil.ttsTransform(rasaResult);
// 在这里给socket回复
SocketMessageDTO res = new SocketMessageDTO();
res.setSocketId(socketMessageDTO.getSocketId());
res.setUserId(UserUtil.getUser().getId());
res.setTextMessage(rasaResult);
res.setVoiceMessage(replyVoiceResVO);
res.setType(1);
session.sendMessage(new TextMessage(JSONUtil.toJsonStr(res)));
return;
}
}
}
// 兜底,如果走到了这里,就直接返回未识别
SocketMessageDTO res = new SocketMessageDTO();
res.setSocketId(socketMessageDTO.getSocketId());
res.setUserId(UserUtil.getUser().getId());
res.setTextMessage("医生,我没有听懂您说的什么意思");
res.setType(1);
session.sendMessage(new TextMessage(JSONUtil.toJsonStr(res)));
log.info("兜底话术,需要检查上面是不是出什么问题了");
}
private final AskDiseaseQuestionAnswerService askDiseaseQuestionAnswerService;
private final AskDefaultQuestionAnswerService askDefaultQuestionAnswerService;
@Override
public String receiveVoiceFile(MultipartFile file) throws IOException {
@Transactional(rollbackFor = Exception.class)
public TalkResultResVO receiveVoiceFile(MultipartFile file, String processId, String roomKey, String roomToken) throws IOException {
// 根据processId找到对应的病人
Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到诊疗进程"));
// 获取音频对应的文字
String askQuestion = AsrUtil.asrTransformByBytes(file.getBytes());
// 调用rasa获取文字内容
String rasaResult = RasaUtil.talkRasa(askQuestion, UserUtil.getUser().getId(), process.getPatientId());
TalkResultResVO talkResultResVO = new TalkResultResVO();
// 这里校验,rasa回复的结果是不是action
// 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain
// ancillary_ | tool_
if (rasaResult.startsWith("ancillary_") || rasaResult.startsWith("tool_")) {
List<String> actionList = StrUtil.split(rasaResult, '_');
if (actionList.size() > 1) {
ActionDTO actionDTO = new ActionDTO();
actionDTO.setActionType(actionList.get(0));
actionDTO.setActionId(actionList.get(1));
// 在这里给socket回复,设置为动作
talkResultResVO.setAction(actionDTO);
talkResultResVO.setType(2);
return talkResultResVO;
}
} else {
// 语音消息,这时调用京东的接口进行播放操作
// 这里调用京东数字人接口首先根据token获取房间号
String roomId = HumanUtil.queryRoomId(roomKey, roomToken);
// 区分
List<String> answerIdList = StrUtil.split(rasaResult, '_');
String qaId = null;
String qaType = "miss";
String answer = "您好,我没有听懂您说什么";
if (answerIdList.size() > 1) {
if (rasaResult.startsWith("default_")) {
qaType = "default";
List<String> answerList = Optional.ofNullable(askDefaultQuestionAnswerService.getById(answerIdList.get(1)).getAnswer())
.orElse(CollUtil.newArrayList("您好,我没有听懂您说什么"));
answer = answerList.get(new Random().nextInt(answerList.size()));
qaId = answerIdList.get(1);
throw new BusinessException("暂未实现");
} else if (rasaResult.startsWith("disease_")) {
qaType = "disease";
List<String> answerList = Optional.ofNullable(askDiseaseQuestionAnswerService.getById(answerIdList.get(1)).getAnswer())
.orElse(CollUtil.newArrayList("您好,我没有听懂您说什么"));
answer = answerList.get(new Random().nextInt(answerList.size()));
qaId = answerIdList.get(1);
}
}
// 然后这里进行播放
// 这里应该从对话中取结果
HumanUtil.textDriven(rasaResult, roomId);
// 保存记录
DiagnosisQaRecord record = new DiagnosisQaRecord();
record.setProcessId(processId);
record.setQuestionAnswerType(qaType);
record.setQuestionAnswerId(qaId);
record.setQuestion(askQuestion);
record.setAnswer(answer);
record.setCreateUserId(UserUtil.getUser().getId());
record.insert();
}
talkResultResVO.setType(1);
return talkResultResVO;
}
@ -109,8 +108,4 @@ public class AskServiceImpl implements AskService {
}
@Override
public List<String> conversation(String question, String sessionId) {
return RasaUtil.talkRasa(question, sessionId);
}
}

@ -93,7 +93,7 @@ public class RasaServiceImpl implements RasaService {
nlu.setExamples(defaultQA.getQuestion());
nluList.add(nlu);
// 添加到map中,key为意图编码,value为意图ID
intentCodeAndIdMap.put(intentCode, new QuestionAnswerDTO(defaultQA.getQuestion(), defaultQA.getAnswer(), defaultQA.getDescription()));
intentCodeAndIdMap.put(intentCode, new QuestionAnswerDTO(defaultQA.getQuestion(), CollUtil.newArrayList("default_" + defaultQA.getId()), defaultQA.getDescription()));
}
}
// 然后处理该疾病对应的意图
@ -124,7 +124,7 @@ public class RasaServiceImpl implements RasaService {
nlu.setIntent(intentCode);
nlu.setExamples(askTemplateQuestion.getQuestion());
nluList.add(nlu);
intentCodeAndIdMap.put(intentCode, new QuestionAnswerDTO(askTemplateQuestion.getQuestion(), askDiseaseQuestionAnswer.getAnswer(), askTemplateQuestion.getDescription()));
intentCodeAndIdMap.put(intentCode, new QuestionAnswerDTO(askTemplateQuestion.getQuestion(), CollUtil.newArrayList("disease_" + askDiseaseQuestionAnswer.getId()), askTemplateQuestion.getDescription()));
}
}
@ -144,7 +144,7 @@ public class RasaServiceImpl implements RasaService {
// answer格式为:---tool---工具ID
intentCodeAndIdMap.put(toolIntent,
new QuestionAnswerDTO(tool.getCallOutQuestion(),
CollUtil.newArrayList("---tool---" + tool.getId()), "呼出-tool-" + tool.getToolName()));
CollUtil.newArrayList("tool_" + tool.getId()), "tool-" + tool.getToolName()));
}
// 生成呼出的辅助检查
@ -162,7 +162,7 @@ public class RasaServiceImpl implements RasaService {
// answer格式为:---ancillary---工具ID
intentCodeAndIdMap.put(itemIntent,
new QuestionAnswerDTO(ancillary.getCallOutQuestion(),
CollUtil.newArrayList("---ancillary---" + ancillary.getId()), "呼出-ancillary-" + ancillary.getItemName()));
CollUtil.newArrayList("ancillary_" + ancillary.getId()), "呼出-ancillary-" + ancillary.getItemName()));
}
NluYmlTemplate nluYmlTemplate = new NluYmlTemplate();
nluYmlTemplate.setNlu(nluList);

@ -0,0 +1,101 @@
package com.supervision.util;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.crypto.digest.MD5;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.supervision.exception.BusinessException;
import com.supervision.exception.HumanException;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
import java.util.UUID;
@Slf4j
public class HumanUtil {
private static final Environment environment = SpringBeanUtil.getBean(Environment.class);
private static final String BASE_URL = environment.getProperty("human.base-url");
private static final String QUERY_ROOM_ID_URL = BASE_URL + environment.getProperty("human.room-id");
private static final String TEXT_DRIVEN_URL = BASE_URL + environment.getProperty("human.text-driven");
private static final String QUERY_TOKEN_STATUS = BASE_URL + environment.getProperty("human.talk-status");
public static String queryRoomId(String roomKey, String roomToken) {
Map<String, Object> param = new HashMap<>();
param.put("key", roomKey);
param.put("token", roomToken);
String res = HttpUtil.get(QUERY_ROOM_ID_URL, param);
HumanRes resDTO = JSONUtil.toBean(res, HumanRes.class);
if (!"200".equals(resDTO.code)) {
throw new BusinessException("获取房间号失败");
}
// 去过为true,则data是房间号
return resDTO.data;
}
/**
* ,,,,
*
* @param text
* @param roomId ID
*/
public static void textDriven(String text, String roomId) {
HashMap<String, Object> param = new HashMap<>();
long timeStamp = System.currentTimeMillis();
// 要播报的⽂本
param.put("text", text);
// 当前数字⼈房间id
param.put("roomId", roomId);
// 动作id默认-1
param.put("action", "-1");
// 请求唯⼀值使⽤uuid即可每次播报⽂本都要不同否则视为重复播报返回失败
param.put("nonce", UUID.randomUUID().toString());
// 毫秒
param.put("timeStamp", String.valueOf(timeStamp));
param.put("sign", getSign(String.valueOf(timeStamp),
(String) param.get("nonce"),
(String) param.get("text"),
(String) param.get("actionId"),
(String) param.get("roomId")));
String res = HttpUtil.get(TEXT_DRIVEN_URL, param);
HumanRes resDTO = JSONUtil.toBean(res, HumanRes.class);
if (!"200".equals(resDTO.code)) {
throw HumanException.humanError("播放语音失败");
}
}
/**
*
* timeStampnoncetextrootIdactionIdjsonMD516MD5
*/
private static String getSign(String timeStamp, String nonce, String text, String actionId, String roomId) {
Map<String, Object> paramMap = new TreeMap<>();
paramMap.put("action", actionId);
paramMap.put("nonce", nonce);
paramMap.put("roomId", roomId);
paramMap.put("text", text);
paramMap.put("timeStamp", timeStamp);
String paramJsonString = JSONUtil.toJsonStr(paramMap);
return new MD5().digestHex16(paramJsonString);
}
@Data
public static class HumanRes {
private String code;
private String data;
private String state;
}
}

@ -1,25 +1,35 @@
package com.supervision.util;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.supervision.pojo.rasa.train.dto.RasaReqDTO;
import com.supervision.pojo.rasa.train.dto.RasaResDTO;
import com.supervision.vo.rasa.RasaTalkVo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.env.Environment;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
public class RasaUtil {
private static final String RASA_URL = SpringBeanUtil.getBean(Environment.class).getProperty("rasa.url");
public static List<String> talkRasa(String question, String sessionId) {
RasaReqDTO rasaReqDTO = new RasaReqDTO();
rasaReqDTO.setSender(sessionId);
rasaReqDTO.setMessage(question);
String post = HttpUtil.post(RASA_URL, JSONUtil.toJsonStr(rasaReqDTO));
List<RasaResDTO> list = JSONUtil.toList(post, RasaResDTO.class);
return list.stream().map(RasaResDTO::getText).collect(Collectors.toList());
public static String talkRasa(String question, String sessionId, String patientId) {
RasaTalkVo rasaTalkVo = new RasaTalkVo();
rasaTalkVo.setQuestion(question);
rasaTalkVo.setSessionId(sessionId);
rasaTalkVo.setModelId(patientId);
String post = HttpUtil.post(RASA_URL, JSONUtil.toJsonStr(rasaTalkVo));
List<String> list = JSONUtil.toList(post, String.class);
log.info("调用rasa对话返回结果:{}",post);
if (CollUtil.isEmpty(list)){
return "对不起,我没有听懂您说的是什么意思";
}
return CollUtil.getFirst(list);
}

@ -1,39 +0,0 @@
package com.supervision.websocket.cache;
import cn.hutool.core.util.ObjectUtil;
import com.supervision.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.socket.WebSocketSession;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
@Slf4j
public class WebSocketUserCache {
private static final Map<String, WebSocketSession> map = new ConcurrentHashMap<>();
public static void login(String id, WebSocketSession socketSession) {
map.put(id, socketSession);
log.info("sessionId:{}注册成功", id);
}
public static void logout(String id) {
map.remove(id);
log.info("sessionId:{}注销成功", id);
}
public static WebSocketSession getSession(String id){
WebSocketSession webSocketSession = map.get(id);
if (ObjectUtil.isEmpty(webSocketSession)){
throw new BusinessException("未找到socket链接");
}
return webSocketSession;
}
}

@ -1,23 +0,0 @@
package com.supervision.websocket.config;
import com.supervision.websocket.handler.AskWebSocketHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
@Configuration
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(askWebSocketHandler(), "/askSocket")
.setAllowedOrigins("*");
}
@Bean
public WebSocketHandler askWebSocketHandler() {
return new AskWebSocketHandler();
}
}

@ -1,37 +0,0 @@
package com.supervision.websocket.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel
public class SocketMessageDTO {
@ApiModelProperty("socket链接ID")
private String socketId;
@ApiModelProperty("当前用户ID")
private String userId;
@ApiModelProperty("文字消息内容")
private String textMessage;
@ApiModelProperty("语音消息内容")
private String voiceMessage;
@ApiModelProperty("若有动作,这是需要执行的动作内容")
private ActionDTO action;
/**
* 使,action,1,2
*/
@ApiModelProperty("后端返回给前端时使用,表示该是消息还是action动作,1消息,2动作")
private Integer type;
/**
* action,0,1
*/
@ApiModelProperty("前端到后端使用,表示是语音还是文字,1语音,2文字")
private Integer messageType;
}

@ -1,60 +0,0 @@
package com.supervision.websocket.handler;
import cn.hutool.json.JSONUtil;
import com.supervision.service.AskService;
import com.supervision.util.SpringBeanUtil;
import com.supervision.util.UserUtil;
import com.supervision.websocket.cache.WebSocketUserCache;
import com.supervision.websocket.dto.SocketMessageDTO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNullApi;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;
import java.io.IOException;
@Slf4j
public class AskWebSocketHandler extends TextWebSocketHandler {
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
// 获取本次
String id = session.getId();
// 缓存sessionId
WebSocketUserCache.login(id, session);
// 返回sessionId到前端
SocketMessageDTO socketMessageDTO = new SocketMessageDTO();
socketMessageDTO.setSocketId(id);
session.sendMessage(new TextMessage(JSONUtil.toJsonStr(socketMessageDTO)));
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException {
// 处理接收到的消息
log.info("收到消息:{}", message.toString());
try {
// 这里反序列化消息,将消息形成固定的格式
SocketMessageDTO socketMessageDTO = JSONUtil.toBean(message.getPayload(), SocketMessageDTO.class);
AskService askService = SpringBeanUtil.getBean(AskService.class);
askService.handlerMessageBySocket(socketMessageDTO);
} catch (Exception e) {
log.error("对话出现异常", e);
SocketMessageDTO res = new SocketMessageDTO();
res.setSocketId(session.getId());
res.setUserId(UserUtil.getUser().getId());
res.setTextMessage("出错了");
res.setType(1);
session.sendMessage(new TextMessage(JSONUtil.toJsonStr(res)));
}
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) {
// 连接关闭时的处理逻辑
String id = session.getId();
WebSocketUserCache.logout(id);
}
}

@ -2,7 +2,7 @@
server:
port: 8899
servlet:
context-path: /
context-path: /virtual-patient
undertow:
# HTTP post内容的最大大小。当值为-1时默认值为大小是无限的
max-http-post-size: -1
@ -62,4 +62,9 @@ paddle-speech:
tts: http://192.168.10.137:8090/paddlespeech/tts
asr: http://192.168.10.137:8090/paddlespeech/asr
rasa:
url: 192.168.10.137:5005/webhooks/rest/webhook
url: http://192.168.10.137:8890/rasa/talkRasa
human:
base-url: https://digital-human.jd.com
room-id: /getRoomId
text-driven: /text_driven
talk-status: /talkStatus
Loading…
Cancel
Save