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

dev_2.0.0
xueqingkun 1 year ago
commit 43c881f1c0

@ -42,6 +42,7 @@ public class WebConfig implements WebMvcConfigurer {
paths.add("/favicon.ico");
paths.add("/user/login");
paths.add("/webSocket/**");
paths.add("/ask/downloadTalkVideo");
// 开发环境,放开不校验token.每次修改这里需要重启(热部署不行)
// paths.add("/**");
return paths;

@ -95,7 +95,6 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
askPatientAnswer.setLibraryQuestionId(medicalRecQaVO.getLibraryQuestionId());
askPatientAnswer.setAnswer(medicalRecQaVO.getMedicalRecAnswer());
askPatientAnswer.setMedicalId(medicalRec.getId());
askPatientAnswer.setPatientId(patient.getId());
askPatientAnswer.insert();
}
}
@ -184,7 +183,6 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService {
askPatientAnswer.setLibraryQuestionId(medicalRecQaVO.getLibraryQuestionId());
askPatientAnswer.setAnswer(medicalRecQaVO.getMedicalRecAnswer());
askPatientAnswer.setMedicalId(medicalRec.getId());
askPatientAnswer.setPatientId(patient.getId());
askPatientAnswer.insert();
}
}

@ -26,11 +26,6 @@ public class AskPatientAnswer extends Model<AskPatientAnswer> implements Seriali
@TableId
private String id;
/**
* ID
*/
private String patientId;
@ApiModelProperty("病例id")
private String medicalId;

@ -29,6 +29,9 @@ public class AskAncillaryHistoryResVO {
@ApiModelProperty("辅助检查项结果")
private String result;
@ApiModelProperty("位置名称")
private String locationName;
@ApiModelProperty("关联的初步诊断ID")
private String primaryId;

@ -31,6 +31,9 @@ public class AskPhysicalHistoryResVO {
@ApiModelProperty("体格检查结果")
private String result;
@ApiModelProperty("关联的初步诊断的疾病名称")
private String diseaseName;
@ApiModelProperty("检查时间")
private LocalDateTime createTime;
}

@ -6,7 +6,6 @@
<resultMap id="BaseResultMap" type="com.supervision.model.AskPatientAnswer">
<id property="id" column="id" jdbcType="VARCHAR"/>
<result property="patientId" column="patient_id" jdbcType="VARCHAR"/>
<result property="medicalId" column="medical_id" jdbcType="VARCHAR"/>
<result property="libraryQuestionId" column="library_question_id" jdbcType="VARCHAR"/>
<result property="answer" column="answer" jdbcType="VARCHAR"/>
@ -18,7 +17,7 @@
</resultMap>
<sql id="Base_Column_List">
id,patient_id,medical_id,library_question_id,
id,medical_id,library_question_id,
answer,answer_resources_id,create_user_id,
create_time,update_user_id,update_time
</sql>

@ -12,6 +12,7 @@
<result property="question" column="question" jdbcType="ARRAY"
typeHandler="com.supervision.handler.StringListTypeHandler"/>
<result property="defaultAnswer" column="default_answer" jdbcType="VARCHAR"/>
<result property="defaultAnswerResourceId" column="default_answer_resources_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"/>
@ -21,7 +22,7 @@
<sql id="Base_Column_List">
id
,dict_id,code,description,
question,default_answer,create_user_id,
question,default_answer,default_answer_resources_id,create_user_id,
create_time,update_user_id,update_time
</sql>

@ -47,6 +47,7 @@
t1.result as result,
t1.assessment_result as assessmentResult,
t1.id as id,
t2.location_name as locationName,
t3.diagnosis_assessment_flag as diagnosisAssessmentFlag,
t1.create_time as createTime
from vp_diagnosis_ancillary_record t1

@ -57,6 +57,7 @@
mr.patient_marriage as patientMarriage,
mr.native_place as nativePlace,
mr.patient_phone as patientPhone,
mr.patient_postcode as patientPostcode,
mr.patient_birthplace as patientBirthplace,
mr.patient_habitation as patientHabitation,
mr.patient_postcode as patientHabitation,

@ -2,6 +2,7 @@ package com.supervision.controller;
import com.supervision.pojo.vo.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.pojo.vo.TalkVideoReqVO;
import com.supervision.service.AskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -36,10 +37,17 @@ public class AskController {
@ApiOperation("使用本地视频的形式来做")
@PostMapping("/talkByVideo")
public TalkResultResVO talkByVideo(@RequestBody TalkReqVO talkReqVO, HttpServletResponse response) throws IOException {
return askService.talkByVideo(talkReqVO,response);
public TalkResultResVO talkByVideo(@RequestBody TalkVideoReqVO talkReqVO) throws IOException {
return askService.talkByVideo(talkReqVO);
}
@ApiOperation("获取本地视频的文件流")
@GetMapping("/downloadTalkVideo")
public void downloadTalkVideo(String fileResourceId, HttpServletResponse response) {
askService.downloadTalkVideo(fileResourceId, response);
response.setContentType("video/mp4");
}
}

@ -83,7 +83,8 @@ public class AskPrimaryController {
@ApiOperation("确认诊断页面,保存初步诊断以及鉴别依据")
@PostMapping("confirmPrimaryByAskEnd")
public void confirmPrimaryByAskEnd(@RequestBody @Valid List<PrimaryConfirmReqVO> reqVOList) {
askPrimaryService.confirmPrimaryByAskEnd(reqVOList);
public void confirmPrimaryByAskEnd(@RequestBody @Valid PrimaryConfirmReqVO reqVO) {
askPrimaryService.confirmPrimaryByAskEnd(reqVO);
}
}

@ -0,0 +1,21 @@
package com.supervision.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.util.List;
@Data
public class PrimaryConfirmNodeReqVO {
@ApiModelProperty("初步诊断ID")
@NotBlank(message = "初步诊断ID不能为空")
private String primaryId;
@ApiModelProperty("是否排除(0排除1确诊)")
private Integer excludeFlag;
@ApiModelProperty("诊断依据列表")
private List<DiagnosticBasisForPrimaryReqVO> diagnosticBasisList;
}

@ -9,17 +9,12 @@ import java.util.List;
@Data
public class PrimaryConfirmReqVO {
@ApiModelProperty("初步诊断ID")
@NotBlank(message = "初步诊断ID不能为空")
private String primaryId;
@NotBlank(message = "流程ID不能为空")
private String processId;
@ApiModelProperty("是否暂存,1是,0否(否就是直接诊毕)")
private Integer tempSaveFlag;
@ApiModelProperty("是否排除(0排除1确诊)")
private Integer excludeFlag;
@ApiModelProperty("诊断依据列表")
private List<DiagnosticBasisForPrimaryReqVO> diagnosticBasisList;
@ApiModelProperty("确认结果")
private List<PrimaryConfirmNodeReqVO> primaryConfirmList;
}

@ -29,6 +29,10 @@ public class TalkResultResVO {
@ApiModelProperty("type='2' 是否需要检查部位 0否 1是")
private Integer requireLocation;
@ApiModelProperty("视频预览URL,本地视频的形式需要")
private String videoUrl;
}

@ -0,0 +1,15 @@
package com.supervision.pojo.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class TalkVideoReqVO {
@ApiModelProperty("对话内容")
private String text;
@ApiModelProperty("流程ID")
private String processId;
}

@ -27,7 +27,7 @@ public interface AskPrimaryService {
RecordForPrimaryChooseVO queryRecordForPrimaryChoose(String processId);
void confirmPrimaryByAskEnd(List<PrimaryConfirmReqVO> reqVOList);
void confirmPrimaryByAskEnd(PrimaryConfirmReqVO reqVO);
void deletePrimary(String id);

@ -2,6 +2,7 @@ package com.supervision.service;
import com.supervision.pojo.vo.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.pojo.vo.TalkVideoReqVO;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
@ -16,7 +17,10 @@ public interface AskService {
TalkResultResVO talk(TalkReqVO talkReqVO) throws IOException;
TalkResultResVO talkByVideo(TalkReqVO talkReqVO, HttpServletResponse response) throws IOException;
TalkResultResVO talkByVideo(TalkVideoReqVO talkReqVO) throws IOException;
void downloadTalkVideo(String fileResourceId, HttpServletResponse response);
}

@ -56,13 +56,12 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
DiagnosisResultResVO diagnosisResultResVO = new DiagnosisResultResVO();
diagnosisResultResVO.setId(processId);
Process process = processService.getById(processId);
Patient patient = patientService.getById(process.getPatientId());
MedicalRec medicalRec = medicalRecService.getById(process.getMedicalRecId());
List<Disease> diseasesList = diseaseService.listDiseaseWithType(medicalRec.getDiseaseId());
// 1.生成预期诊断结果
diagnosisResultResVO.setExpertDiagnosisResult(creatExpertDiagnosisResult(medicalRec, diseasesList, processId));
// 2.生成初步诊断依据
diagnosisResultResVO.setBasisPrimaryResultResVO(createBasisPrimaryResult(patient, medicalRec, process));
diagnosisResultResVO.setBasisPrimaryResultResVO(createBasisPrimaryResult(medicalRec, process));
// 3.生成证实诊断依据
diagnosisResultResVO.setBasisConfirmResultResVO(createBasisConfirmResult(medicalRec, processId));
// 4.生成鉴别诊断依据
@ -180,7 +179,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
return basisConfirmResultResVO;
}
private BasisPrimaryResultResVO createBasisPrimaryResult(Patient patient, MedicalRec medicalRec, Process process) {
private BasisPrimaryResultResVO createBasisPrimaryResult( MedicalRec medicalRec, Process process) {
BasisPrimaryResultResVO basisPrimaryResultResVO = new BasisPrimaryResultResVO();
// 初步诊断依据 vp_medical_rec的primarily_diagnosis_criteria
basisPrimaryResultResVO.setPreliminaryDiagnosis(medicalRec.getPrimarilyDiagnosisCriteria());
@ -190,7 +189,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
List<DiagnosisQaRecord> qaRecordList = diagnosisQaRecordService.lambdaQuery().eq(DiagnosisQaRecord::getProcessId, process.getId()).list();
if (CollectionUtil.isNotEmpty(qaRecordList)) {
List<AskPatientAnswer> list = askPatientAnswerService.lambdaQuery()
.eq(AskPatientAnswer::getPatientId, patient.getId()).list();
.eq(AskPatientAnswer::getMedicalId, medicalRec.getId()).list();
// 获取配置了答案的项目(配置了答案的,认为是正确,没有配置答案的,走默认回答的,不标记为以正确)
Set<String> requireCheckIdSet = list.stream().map(AskPatientAnswer::getId).collect(Collectors.toSet());
List<BasisDiagnosisNodeResVO> qaList = qaRecordList.stream().map(e -> {

@ -124,9 +124,8 @@ public class AskPhysicalServiceImpl implements AskPhysicalService {
diseaseNameList.add(diseaseName);
}
}
node.setResult(StrUtil.join(";", diseaseNameList));
node.setDiseaseName(StrUtil.join(";", diseaseNameList));
}
return res;
}

@ -4,9 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.druid.sql.visitor.functions.If;
import com.sun.media.sound.AiffFileReader;
import com.supervision.exception.BusinessException;
import com.supervision.model.Process;
import com.supervision.model.*;
@ -198,26 +197,41 @@ public class AskPrimaryServiceImpl implements AskPrimaryService {
@Override
@Transactional(rollbackFor = Exception.class)
public void confirmPrimaryByAskEnd(List<PrimaryConfirmReqVO> reqVOList) {
Optional<PrimaryConfirmReqVO> any = reqVOList.stream().findAny();
public void confirmPrimaryByAskEnd(PrimaryConfirmReqVO reqVO) {
List<PrimaryConfirmNodeReqVO> reqVOList = reqVO.getPrimaryConfirmList();
Optional<PrimaryConfirmNodeReqVO> any = reqVOList.stream().findAny();
if (!any.isPresent()) {
throw new BusinessException("初步诊断不能为空");
}
String processId = any.get().getProcessId();
// 校验,如果没有填写病历,那么就不允许诊毕
Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processId).count();
if (count < 1) {
throw new BusinessException("电子病历未填写,请填写电子病例后诊毕");
// 如果 != 1 ,不是暂存,那么就校验电子病历是否填写
if (ObjectUtil.isEmpty(reqVO.getTempSaveFlag()) || 1 != reqVO.getTempSaveFlag()){
// 校验,如果没有填写病历,那么就不允许诊毕
Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, reqVO.getProcessId()).count();
if (count < 1) {
throw new BusinessException("电子病历未填写,请填写电子病例后诊毕");
}
}
for (PrimaryConfirmReqVO reqVO : reqVOList) {
for (PrimaryConfirmNodeReqVO node : reqVOList) {
// 如果 != 1 ,不是暂存,那么就校验初步诊断是否填写
if (ObjectUtil.isEmpty(reqVO.getTempSaveFlag()) || 1 != reqVO.getTempSaveFlag()){
if (ObjectUtil.isEmpty(node.getExcludeFlag()) && 0 != node.getExcludeFlag() && 1 != node.getExcludeFlag()) {
throw new BusinessException("是否排除不能为空或诊断不正确");
}
}
// 修改初步诊断是否被排除
diagnosisPrimaryService.lambdaUpdate().set(DiagnosisPrimary::getExcludeFlag, reqVO.getExcludeFlag())
.eq(DiagnosisPrimary::getId, reqVO.getPrimaryId()).update();
diagnosisPrimaryService.lambdaUpdate().set(DiagnosisPrimary::getExcludeFlag, node.getExcludeFlag())
.eq(DiagnosisPrimary::getId, node.getPrimaryId()).update();
// 保存证实诊断依据
saveDiagnosticBasis(reqVO.getDiagnosticBasisList());
saveDiagnosticBasis(node.getDiagnosticBasisList());
}
// 如果 != 1 ,说明是诊毕,这时就诊毕
if (ObjectUtil.isEmpty(reqVO.getTempSaveFlag()) || 1 != reqVO.getTempSaveFlag()) {
// 然后将process的状态改为诊毕
processService.lambdaUpdate().set(Process::getStatus, 1).eq(Process::getId, reqVO.getProcessId()).update();
}
// 然后将process的状态改为诊毕
processService.lambdaUpdate().set(Process::getStatus, 1).eq(Process::getId, processId).update();
}
private void saveDiagnosticBasis(List<DiagnosticBasisForPrimaryReqVO> diagnosticBasisList) {
@ -277,7 +291,7 @@ public class AskPrimaryServiceImpl implements AskPrimaryService {
vo.setPrimaryDiseaseName("");
}
})
.collect(Collectors.toMap(DiagnosisPrimaryVO::getId, DiagnosisPrimaryVO::getPrimaryDiseaseName));
.collect(Collectors.toMap(DiagnosisPrimaryVO::getId, DiagnosisPrimaryVO::getPrimaryDiseaseName));
// 查询诊疗记录对应的所有检查记录
List<DiagnosisPrimaryRelation> relationList = diagnosisPrimaryRelationService.lambdaQuery().eq(DiagnosisPrimaryRelation::getProcessId, processId).list();
// 根据relationId进行分组

@ -1,27 +1,27 @@
package com.supervision.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5;
import com.supervision.exception.BusinessException;
import com.supervision.model.*;
import com.supervision.model.Process;
import com.supervision.model.*;
import com.supervision.pojo.vo.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.pojo.vo.TalkVideoReqVO;
import com.supervision.service.*;
import com.supervision.util.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Optional;
@ -40,6 +40,14 @@ public class AskServiceImpl implements AskService {
private final ConfigAncillaryItemService configAncillaryItemService;
private final FileResourceService fileResourceService;
@Value("${defaultNoMatchId}")
private String defaultNoMatchId;
@Value("${video-url}")
private String videoUrl;
@Override
public String receiveVoiceFile(MultipartFile file) {
@ -65,7 +73,7 @@ public class AskServiceImpl implements AskService {
// 根据processId找到对应的病人
Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程"));
// 调用rasa获取文字内容
String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId(), process.getPatientId());
String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId());
// 如果rasa没有识别出来,则返回默认值
if (StrUtil.isBlank(rasaResult)) {
// 这里调用京东数字人接口首先根据token获取房间号
@ -95,7 +103,7 @@ public class AskServiceImpl implements AskService {
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
} else {
AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getPatientId, process.getPatientId())
AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, process.getMedicalRecId())
.eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one();
// 如果没有找到回答,去默认回答里面看看有没有
if (ObjectUtil.isEmpty(askPatientAnswer)) {
@ -188,20 +196,19 @@ public class AskServiceImpl implements AskService {
}
@Override
public TalkResultResVO talkByVideo(TalkReqVO talkReqVO, HttpServletResponse response) throws IOException {
public TalkResultResVO talkByVideo(TalkVideoReqVO talkReqVO) throws IOException {
// 根据processId找到对应的病人
Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程"));
// 调用rasa获取文字内容
String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId(), process.getPatientId());
String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId());
log.info("rasa的回复是:{}", rasaResult);
TalkResultResVO talkResultResVO = new TalkResultResVO();
// 如果rasa没有识别出来,则返回默认值
if (StrUtil.isBlank(rasaResult)) {
// TODO 这里应该返回视频流
String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken());
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
}
TalkResultResVO talkResultResVO = new TalkResultResVO();
// 这里校验,rasa回复的结果是不是action
// 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain
// ancillary_ | tool_
@ -216,32 +223,27 @@ public class AskServiceImpl implements AskService {
return talkResultResVO;
}
} else {
String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken());
AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(rasaResult);
if (ObjectUtil.isEmpty(library)) {
log.info("{}:未从问题库中找到,回答未识别语句", rasaResult);
// TODO 这里应该返回视频
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
} else {
AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getPatientId, process.getPatientId())
AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, process.getMedicalRecId())
.eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one();
// 如果没有找到回答,去默认回答里面看看有没有
if (ObjectUtil.isEmpty(askPatientAnswer)) {
log.info("{}:病历配置,未从AskPatientAnswer中找到回答结果,尝试回答默认答案", rasaResult);
// 首先看看default里面是不是存在,如果存在,就从default里面去找
if (StrUtil.isNotEmpty(library.getDefaultAnswer())) {
if (StrUtil.isNotEmpty(library.getDefaultAnswer()) && StrUtil.isNotBlank(library.getDefaultAnswerResourceId())) {
String resText = library.getDefaultAnswer();
// TODO 这里应该返回视频
HumanUtil.textDriven(resText, roomId);
talkResultResVO.setVideoUrl(videoUrl + library.getDefaultAnswerResourceId());
// 保存记录
saveQaRecord(talkReqVO.getProcessId(), "default", library.getId(), talkReqVO.getText(), library, resText);
log.info("{}:找到了默认答案:{}", rasaResult, talkReqVO.getText());
} else {
log.info("{}:没有从默认答案中找到找到默认内容,回复未识别语句", rasaResult);
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
talkResultResVO.setVideoUrl(videoUrl + library.getDefaultAnswerResourceId());
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), library, "您好,我没有听懂您说什么");
}
} else {
@ -250,21 +252,20 @@ public class AskServiceImpl implements AskService {
if (StrUtil.isNotEmpty(library.getDefaultAnswer())) {
String resText = library.getDefaultAnswer();
log.info("{}:病历配置的回答:{}:为空不为空不为空,但在获取的时候,答案为空,开始回复默认语句,默认语句内容:{}", rasaResult, askPatientAnswer.getId(), resText);
// TODO 这里应该返回视频
HumanUtil.textDriven(resText, roomId);
// 这里返回视频
talkResultResVO.setVideoUrl(videoUrl + library.getDefaultAnswerResourceId());
// 保存记录
saveQaRecord(talkReqVO.getProcessId(), "default", library.getId(), talkReqVO.getText(), library, resText);
} else {
log.info("{}:病历配置的回答:{}:为空不为空,但在获取的时候,答案为空,但是获取默认语句也为空,那么回复未识别语句", rasaResult, askPatientAnswer.getId());
// TODO 这里应该返回视频
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), library, "您好,我没有听懂您说什么");
}
} else {
String resText = askPatientAnswer.getAnswer();
log.info("{}:找到了病历配置的回答语句:{},回答内容:{}", rasaResult, askPatientAnswer.getId(), resText);
// TODO 这里应该返回视频
HumanUtil.textDriven(resText, roomId);
talkResultResVO.setVideoUrl(videoUrl + askPatientAnswer.getAnswerResourceId());
// 保存记录
saveQaRecord(talkReqVO.getProcessId(), "patient", askPatientAnswer.getId(), talkReqVO.getText(), library, resText);
}
@ -274,8 +275,19 @@ public class AskServiceImpl implements AskService {
}
talkResultResVO.setType(1);
return talkResultResVO;
}
// IoUtil.copy(inputStream, response.getOutputStream());
// return null;
@Override
public void downloadTalkVideo(String fileResourceId, HttpServletResponse response) {
FileResource fileResource = fileResourceService.getById(fileResourceId);
if (ObjectUtil.isEmpty(fileResource)) {
throw new BusinessException("未找到回复视频");
}
try (InputStream inputStream = MinioUtil.download(fileResource.getMinioId())) {
IoUtil.copy(inputStream, response.getOutputStream());
} catch (Exception e) {
log.error("获取视频失败", e);
throw new BusinessException("未找到回复视频");
}
}
}

@ -48,9 +48,12 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
@Override
public ProcessMedicalResVo findByProcessId(String processId) {
Assert.notEmpty(processId,"流程id不允许为空");
Assert.notEmpty(processId, "流程id不允许为空");
// 每次查询电子病历,就等于进到页面了,这时进行更新最后问诊时间
processService.lambdaUpdate().set(Process::getUpdateTime, LocalDateTime.now()).eq(Process::getId, processId).update();
processService.lambdaUpdate().set(Process::getUpdateTime, LocalDateTime.now())
// 已评估的,不更新
.ne(Process::getStatus, 2)
.eq(Process::getId, processId).update();
return processMedicalService.findByProcessId(processId);
}
@ -58,9 +61,9 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
public boolean saveOrUpdateMedicalRecord(ProcessMedical processMedical) {
log.info(JSONUtil.toJsonStr(processMedical));
Assert.notEmpty(processMedical.getProcessId(),"流程id不为空");
Assert.notEmpty(processMedical.getProcessId(), "流程id不为空");
List<ProcessMedical> list = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processMedical.getProcessId()).list();
if (CollUtil.isEmpty(list)){
if (CollUtil.isEmpty(list)) {
// 新增
return saveMedicalRecord(processMedical);
}
@ -73,11 +76,11 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
@Override
public ProcessMedicalViewDetailResVo queryViewDetail(String processId) {
Assert.notEmpty(processId,"流程id不能为空");
Assert.notEmpty(processId, "流程id不能为空");
// 1.获取电子病例基本信息
ProcessMedicalResVo processMedicalResVo = this.findByProcessId(processId);
if (Objects.isNull(processMedicalResVo)){
if (Objects.isNull(processMedicalResVo)) {
return null;
}
ProcessMedicalViewDetailResVo resultVo = BeanUtil.toBean(processMedicalResVo, ProcessMedicalViewDetailResVo.class);
@ -99,28 +102,28 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
// 4. 获取用户姓名
User user = userService.getById(processMedicalResVo.getUserId());
if (Objects.nonNull(user)){
if (Objects.nonNull(user)) {
resultVo.setUserName(user.getName());
}
return resultVo;
}
private void saveAssert(ProcessMedical processMedical){
Assert.notEmpty(processMedical.getProcessId(),"流程id不为空");
private void saveAssert(ProcessMedical processMedical) {
Assert.notEmpty(processMedical.getProcessId(), "流程id不为空");
Process process = processService.getById(processMedical.getProcessId());
Assert.notNull(process,"流程数据不存在");
Assert.notNull(process, "流程数据不存在");
processMedical.setMedicalRecId(process.getMedicalRecId());
processMedical.setPatientId(process.getPatientId());
if (StrUtil.isEmpty(processMedical.getDiseaseId())){
if (StrUtil.isEmpty(processMedical.getDiseaseId())) {
processMedical.setDiseaseId(process.getDiseaseId());
}
Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processMedical.getProcessId()).count();
Assert.isFalse(count > 0,"当前实例已经存在电子病例信息");
Assert.isFalse(count > 0, "当前实例已经存在电子病例信息");
}
}

@ -24,11 +24,12 @@ public class RasaUtil {
private static final Environment environment = SpringBeanUtil.getBean(Environment.class);
private static final String RASA_TALK_URL = environment.getProperty("rasa.base-url") + environment.getProperty("rasa.talk");
public static String talkRasa(String question, String sessionId, String patientId) {
public static String talkRasa(String question, String sessionId) {
RasaTalkVo rasaTalkVo = new RasaTalkVo();
rasaTalkVo.setQuestion(question);
rasaTalkVo.setSessionId(sessionId);
rasaTalkVo.setModelId(patientId);
// 默认为1
rasaTalkVo.setModelId("1");
String post = HttpUtil.post(RASA_TALK_URL, JSONUtil.toJsonStr(rasaTalkVo));
log.info("调用rasa对话返回结果:{}", post);
try {

@ -82,4 +82,8 @@ human:
ws:
# nginx的wss地址(如果是wss的,那么带不带s都可以访问)
nginx-ip: 192.168.10.138
nginx-port: 443
nginx-port: 443
# 对于没有匹配上的缺省回答ID,关联的是vp_file_resource的ID
defaultNoMatchId: 1739173836351885313
# 视频预览,NGINX的地址,https的地址
video-url: https://192.168.10.138:443/virtual-patient/ask/downloadTalkVideo?fileResourceId=

@ -83,4 +83,8 @@ human:
ws:
# nginx的wss地址(如果是wss的,那么带不带s都可以访问)
nginx-ip: 192.168.10.138
nginx-port: 443
nginx-port: 443
# 对于没有匹配上的缺省回答ID,关联的是vp_file_resource的ID
defaultNoMatchId: 1739173836351885313
# 视频预览
video-url: http://192.168.10.138:8899/virtual-patient/ask/downloadTalkVideo?fileResourceId=
Loading…
Cancel
Save