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("/favicon.ico");
paths.add("/user/login"); paths.add("/user/login");
paths.add("/webSocket/**"); paths.add("/webSocket/**");
paths.add("/ask/downloadTalkVideo");
// 开发环境,放开不校验token.每次修改这里需要重启(热部署不行) // 开发环境,放开不校验token.每次修改这里需要重启(热部署不行)
// paths.add("/**"); // paths.add("/**");
return paths; return paths;

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

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

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

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

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

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

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

@ -57,6 +57,7 @@
mr.patient_marriage as patientMarriage, mr.patient_marriage as patientMarriage,
mr.native_place as nativePlace, mr.native_place as nativePlace,
mr.patient_phone as patientPhone, mr.patient_phone as patientPhone,
mr.patient_postcode as patientPostcode,
mr.patient_birthplace as patientBirthplace, mr.patient_birthplace as patientBirthplace,
mr.patient_habitation as patientHabitation, mr.patient_habitation as patientHabitation,
mr.patient_postcode 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.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO; import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.pojo.vo.TalkVideoReqVO;
import com.supervision.service.AskService; import com.supervision.service.AskService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
@ -36,10 +37,17 @@ public class AskController {
@ApiOperation("使用本地视频的形式来做") @ApiOperation("使用本地视频的形式来做")
@PostMapping("/talkByVideo") @PostMapping("/talkByVideo")
public TalkResultResVO talkByVideo(@RequestBody TalkReqVO talkReqVO, HttpServletResponse response) throws IOException { public TalkResultResVO talkByVideo(@RequestBody TalkVideoReqVO talkReqVO) throws IOException {
return askService.talkByVideo(talkReqVO,response); 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("确认诊断页面,保存初步诊断以及鉴别依据") @ApiOperation("确认诊断页面,保存初步诊断以及鉴别依据")
@PostMapping("confirmPrimaryByAskEnd") @PostMapping("confirmPrimaryByAskEnd")
public void confirmPrimaryByAskEnd(@RequestBody @Valid List<PrimaryConfirmReqVO> reqVOList) { public void confirmPrimaryByAskEnd(@RequestBody @Valid PrimaryConfirmReqVO reqVO) {
askPrimaryService.confirmPrimaryByAskEnd(reqVOList); 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 @Data
public class PrimaryConfirmReqVO { public class PrimaryConfirmReqVO {
@ApiModelProperty("初步诊断ID")
@NotBlank(message = "初步诊断ID不能为空")
private String primaryId;
@NotBlank(message = "流程ID不能为空") @NotBlank(message = "流程ID不能为空")
private String processId; private String processId;
@ApiModelProperty("是否暂存,1是,0否(否就是直接诊毕)")
private Integer tempSaveFlag;
@ApiModelProperty("是否排除(0排除1确诊)") @ApiModelProperty("确认结果")
private Integer excludeFlag; private List<PrimaryConfirmNodeReqVO> primaryConfirmList;
@ApiModelProperty("诊断依据列表")
private List<DiagnosticBasisForPrimaryReqVO> diagnosticBasisList;
} }

@ -29,6 +29,10 @@ public class TalkResultResVO {
@ApiModelProperty("type='2' 是否需要检查部位 0否 1是") @ApiModelProperty("type='2' 是否需要检查部位 0否 1是")
private Integer requireLocation; 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); RecordForPrimaryChooseVO queryRecordForPrimaryChoose(String processId);
void confirmPrimaryByAskEnd(List<PrimaryConfirmReqVO> reqVOList); void confirmPrimaryByAskEnd(PrimaryConfirmReqVO reqVO);
void deletePrimary(String id); void deletePrimary(String id);

@ -2,6 +2,7 @@ package com.supervision.service;
import com.supervision.pojo.vo.TalkReqVO; import com.supervision.pojo.vo.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO; 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.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -16,7 +17,10 @@ public interface AskService {
TalkResultResVO talk(TalkReqVO talkReqVO) throws IOException; 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 diagnosisResultResVO = new DiagnosisResultResVO();
diagnosisResultResVO.setId(processId); diagnosisResultResVO.setId(processId);
Process process = processService.getById(processId); Process process = processService.getById(processId);
Patient patient = patientService.getById(process.getPatientId());
MedicalRec medicalRec = medicalRecService.getById(process.getMedicalRecId()); MedicalRec medicalRec = medicalRecService.getById(process.getMedicalRecId());
List<Disease> diseasesList = diseaseService.listDiseaseWithType(medicalRec.getDiseaseId()); List<Disease> diseasesList = diseaseService.listDiseaseWithType(medicalRec.getDiseaseId());
// 1.生成预期诊断结果 // 1.生成预期诊断结果
diagnosisResultResVO.setExpertDiagnosisResult(creatExpertDiagnosisResult(medicalRec, diseasesList, processId)); diagnosisResultResVO.setExpertDiagnosisResult(creatExpertDiagnosisResult(medicalRec, diseasesList, processId));
// 2.生成初步诊断依据 // 2.生成初步诊断依据
diagnosisResultResVO.setBasisPrimaryResultResVO(createBasisPrimaryResult(patient, medicalRec, process)); diagnosisResultResVO.setBasisPrimaryResultResVO(createBasisPrimaryResult(medicalRec, process));
// 3.生成证实诊断依据 // 3.生成证实诊断依据
diagnosisResultResVO.setBasisConfirmResultResVO(createBasisConfirmResult(medicalRec, processId)); diagnosisResultResVO.setBasisConfirmResultResVO(createBasisConfirmResult(medicalRec, processId));
// 4.生成鉴别诊断依据 // 4.生成鉴别诊断依据
@ -180,7 +179,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
return basisConfirmResultResVO; return basisConfirmResultResVO;
} }
private BasisPrimaryResultResVO createBasisPrimaryResult(Patient patient, MedicalRec medicalRec, Process process) { private BasisPrimaryResultResVO createBasisPrimaryResult( MedicalRec medicalRec, Process process) {
BasisPrimaryResultResVO basisPrimaryResultResVO = new BasisPrimaryResultResVO(); BasisPrimaryResultResVO basisPrimaryResultResVO = new BasisPrimaryResultResVO();
// 初步诊断依据 vp_medical_rec的primarily_diagnosis_criteria // 初步诊断依据 vp_medical_rec的primarily_diagnosis_criteria
basisPrimaryResultResVO.setPreliminaryDiagnosis(medicalRec.getPrimarilyDiagnosisCriteria()); basisPrimaryResultResVO.setPreliminaryDiagnosis(medicalRec.getPrimarilyDiagnosisCriteria());
@ -190,7 +189,7 @@ public class AskDiagnosisResultServiceImpl implements AskDiagnosisResultService
List<DiagnosisQaRecord> qaRecordList = diagnosisQaRecordService.lambdaQuery().eq(DiagnosisQaRecord::getProcessId, process.getId()).list(); List<DiagnosisQaRecord> qaRecordList = diagnosisQaRecordService.lambdaQuery().eq(DiagnosisQaRecord::getProcessId, process.getId()).list();
if (CollectionUtil.isNotEmpty(qaRecordList)) { if (CollectionUtil.isNotEmpty(qaRecordList)) {
List<AskPatientAnswer> list = askPatientAnswerService.lambdaQuery() 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()); Set<String> requireCheckIdSet = list.stream().map(AskPatientAnswer::getId).collect(Collectors.toSet());
List<BasisDiagnosisNodeResVO> qaList = qaRecordList.stream().map(e -> { List<BasisDiagnosisNodeResVO> qaList = qaRecordList.stream().map(e -> {

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

@ -4,9 +4,8 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert; import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; 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.exception.BusinessException;
import com.supervision.model.Process; import com.supervision.model.Process;
import com.supervision.model.*; import com.supervision.model.*;
@ -198,26 +197,41 @@ public class AskPrimaryServiceImpl implements AskPrimaryService {
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void confirmPrimaryByAskEnd(List<PrimaryConfirmReqVO> reqVOList) { public void confirmPrimaryByAskEnd(PrimaryConfirmReqVO reqVO) {
Optional<PrimaryConfirmReqVO> any = reqVOList.stream().findAny(); List<PrimaryConfirmNodeReqVO> reqVOList = reqVO.getPrimaryConfirmList();
Optional<PrimaryConfirmNodeReqVO> any = reqVOList.stream().findAny();
if (!any.isPresent()) { if (!any.isPresent()) {
throw new BusinessException("初步诊断不能为空"); throw new BusinessException("初步诊断不能为空");
} }
String processId = any.get().getProcessId(); // 如果 != 1 ,不是暂存,那么就校验电子病历是否填写
// 校验,如果没有填写病历,那么就不允许诊毕 if (ObjectUtil.isEmpty(reqVO.getTempSaveFlag()) || 1 != reqVO.getTempSaveFlag()){
Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processId).count(); // 校验,如果没有填写病历,那么就不允许诊毕
if (count < 1) { Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, reqVO.getProcessId()).count();
throw new BusinessException("电子病历未填写,请填写电子病例后诊毕"); 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()) diagnosisPrimaryService.lambdaUpdate().set(DiagnosisPrimary::getExcludeFlag, node.getExcludeFlag())
.eq(DiagnosisPrimary::getId, reqVO.getPrimaryId()).update(); .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) { private void saveDiagnosticBasis(List<DiagnosticBasisForPrimaryReqVO> diagnosticBasisList) {
@ -277,7 +291,7 @@ public class AskPrimaryServiceImpl implements AskPrimaryService {
vo.setPrimaryDiseaseName(""); 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(); List<DiagnosisPrimaryRelation> relationList = diagnosisPrimaryRelationService.lambdaQuery().eq(DiagnosisPrimaryRelation::getProcessId, processId).list();
// 根据relationId进行分组 // 根据relationId进行分组

@ -1,27 +1,27 @@
package com.supervision.service.impl; package com.supervision.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil; import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.MD5; import cn.hutool.crypto.digest.MD5;
import com.supervision.exception.BusinessException; import com.supervision.exception.BusinessException;
import com.supervision.model.*;
import com.supervision.model.Process; import com.supervision.model.Process;
import com.supervision.model.*;
import com.supervision.pojo.vo.TalkReqVO; import com.supervision.pojo.vo.TalkReqVO;
import com.supervision.pojo.vo.TalkResultResVO; import com.supervision.pojo.vo.TalkResultResVO;
import com.supervision.pojo.vo.TalkVideoReqVO;
import com.supervision.service.*; import com.supervision.service.*;
import com.supervision.util.*; import com.supervision.util.*;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
import java.io.OutputStream; import java.io.InputStream;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
@ -40,6 +40,14 @@ public class AskServiceImpl implements AskService {
private final ConfigAncillaryItemService configAncillaryItemService; private final ConfigAncillaryItemService configAncillaryItemService;
private final FileResourceService fileResourceService;
@Value("${defaultNoMatchId}")
private String defaultNoMatchId;
@Value("${video-url}")
private String videoUrl;
@Override @Override
public String receiveVoiceFile(MultipartFile file) { public String receiveVoiceFile(MultipartFile file) {
@ -65,7 +73,7 @@ public class AskServiceImpl implements AskService {
// 根据processId找到对应的病人 // 根据processId找到对应的病人
Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程"));
// 调用rasa获取文字内容 // 调用rasa获取文字内容
String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId(), process.getPatientId()); String rasaResult = RasaUtil.talkRasa(talkReqVO.getText(), UserUtil.getUser().getId());
// 如果rasa没有识别出来,则返回默认值 // 如果rasa没有识别出来,则返回默认值
if (StrUtil.isBlank(rasaResult)) { if (StrUtil.isBlank(rasaResult)) {
// 这里调用京东数字人接口首先根据token获取房间号 // 这里调用京东数字人接口首先根据token获取房间号
@ -95,7 +103,7 @@ public class AskServiceImpl implements AskService {
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId); HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么"); saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
} else { } 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(); .eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one();
// 如果没有找到回答,去默认回答里面看看有没有 // 如果没有找到回答,去默认回答里面看看有没有
if (ObjectUtil.isEmpty(askPatientAnswer)) { if (ObjectUtil.isEmpty(askPatientAnswer)) {
@ -188,20 +196,19 @@ public class AskServiceImpl implements AskService {
} }
@Override @Override
public TalkResultResVO talkByVideo(TalkReqVO talkReqVO, HttpServletResponse response) throws IOException { public TalkResultResVO talkByVideo(TalkVideoReqVO talkReqVO) throws IOException {
// 根据processId找到对应的病人 // 根据processId找到对应的病人
Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程"));
// 调用rasa获取文字内容 // 调用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没有识别出来,则返回默认值 // 如果rasa没有识别出来,则返回默认值
if (StrUtil.isBlank(rasaResult)) { if (StrUtil.isBlank(rasaResult)) {
// TODO 这里应该返回视频流 talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken());
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么"); saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
} }
TalkResultResVO talkResultResVO = new TalkResultResVO();
// 这里校验,rasa回复的结果是不是action // 这里校验,rasa回复的结果是不是action
// 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain // 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain
// ancillary_ | tool_ // ancillary_ | tool_
@ -216,32 +223,27 @@ public class AskServiceImpl implements AskService {
return talkResultResVO; return talkResultResVO;
} }
} else { } else {
String roomId = HumanUtil.queryRoomId(talkReqVO.getRoomKey(), talkReqVO.getRoomToken());
AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(rasaResult); AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(rasaResult);
if (ObjectUtil.isEmpty(library)) { if (ObjectUtil.isEmpty(library)) {
log.info("{}:未从问题库中找到,回答未识别语句", rasaResult); log.info("{}:未从问题库中找到,回答未识别语句", rasaResult);
// TODO 这里应该返回视频 talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId);
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么"); saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), null, "您好,我没有听懂您说什么");
} else { } 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(); .eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one();
// 如果没有找到回答,去默认回答里面看看有没有 // 如果没有找到回答,去默认回答里面看看有没有
if (ObjectUtil.isEmpty(askPatientAnswer)) { if (ObjectUtil.isEmpty(askPatientAnswer)) {
log.info("{}:病历配置,未从AskPatientAnswer中找到回答结果,尝试回答默认答案", rasaResult); log.info("{}:病历配置,未从AskPatientAnswer中找到回答结果,尝试回答默认答案", rasaResult);
// 首先看看default里面是不是存在,如果存在,就从default里面去找 // 首先看看default里面是不是存在,如果存在,就从default里面去找
if (StrUtil.isNotEmpty(library.getDefaultAnswer())) { if (StrUtil.isNotEmpty(library.getDefaultAnswer()) && StrUtil.isNotBlank(library.getDefaultAnswerResourceId())) {
String resText = library.getDefaultAnswer(); String resText = library.getDefaultAnswer();
// TODO 这里应该返回视频 talkResultResVO.setVideoUrl(videoUrl + library.getDefaultAnswerResourceId());
HumanUtil.textDriven(resText, roomId);
// 保存记录 // 保存记录
saveQaRecord(talkReqVO.getProcessId(), "default", library.getId(), talkReqVO.getText(), library, resText); saveQaRecord(talkReqVO.getProcessId(), "default", library.getId(), talkReqVO.getText(), library, resText);
log.info("{}:找到了默认答案:{}", rasaResult, talkReqVO.getText()); log.info("{}:找到了默认答案:{}", rasaResult, talkReqVO.getText());
} else { } else {
log.info("{}:没有从默认答案中找到找到默认内容,回复未识别语句", rasaResult); log.info("{}:没有从默认答案中找到找到默认内容,回复未识别语句", rasaResult);
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId); talkResultResVO.setVideoUrl(videoUrl + library.getDefaultAnswerResourceId());
saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), library, "您好,我没有听懂您说什么"); saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), library, "您好,我没有听懂您说什么");
} }
} else { } else {
@ -250,21 +252,20 @@ public class AskServiceImpl implements AskService {
if (StrUtil.isNotEmpty(library.getDefaultAnswer())) { if (StrUtil.isNotEmpty(library.getDefaultAnswer())) {
String resText = library.getDefaultAnswer(); String resText = library.getDefaultAnswer();
log.info("{}:病历配置的回答:{}:为空不为空不为空,但在获取的时候,答案为空,开始回复默认语句,默认语句内容:{}", rasaResult, askPatientAnswer.getId(), resText); 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); saveQaRecord(talkReqVO.getProcessId(), "default", library.getId(), talkReqVO.getText(), library, resText);
} else { } else {
log.info("{}:病历配置的回答:{}:为空不为空,但在获取的时候,答案为空,但是获取默认语句也为空,那么回复未识别语句", rasaResult, askPatientAnswer.getId()); log.info("{}:病历配置的回答:{}:为空不为空,但在获取的时候,答案为空,但是获取默认语句也为空,那么回复未识别语句", rasaResult, askPatientAnswer.getId());
// TODO 这里应该返回视频 talkResultResVO.setVideoUrl(videoUrl + defaultNoMatchId);
HumanUtil.textDriven("您好,我没有听懂您说什么", roomId); saveQaRecord(talkReqVO.getProcessId(), "default", null, talkReqVO.getText(), library, "您好,我没有听懂您说什么");
} }
} else { } else {
String resText = askPatientAnswer.getAnswer(); String resText = askPatientAnswer.getAnswer();
log.info("{}:找到了病历配置的回答语句:{},回答内容:{}", rasaResult, askPatientAnswer.getId(), resText); log.info("{}:找到了病历配置的回答语句:{},回答内容:{}", rasaResult, askPatientAnswer.getId(), resText);
// TODO 这里应该返回视频 talkResultResVO.setVideoUrl(videoUrl + askPatientAnswer.getAnswerResourceId());
HumanUtil.textDriven(resText, roomId);
// 保存记录 // 保存记录
saveQaRecord(talkReqVO.getProcessId(), "patient", askPatientAnswer.getId(), talkReqVO.getText(), library, resText); saveQaRecord(talkReqVO.getProcessId(), "patient", askPatientAnswer.getId(), talkReqVO.getText(), library, resText);
} }
@ -274,8 +275,19 @@ public class AskServiceImpl implements AskService {
} }
talkResultResVO.setType(1); talkResultResVO.setType(1);
return talkResultResVO; return talkResultResVO;
}
// IoUtil.copy(inputStream, response.getOutputStream()); @Override
// return null; 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 @Override
public ProcessMedicalResVo findByProcessId(String processId) { 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); return processMedicalService.findByProcessId(processId);
} }
@ -58,9 +61,9 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
public boolean saveOrUpdateMedicalRecord(ProcessMedical processMedical) { public boolean saveOrUpdateMedicalRecord(ProcessMedical processMedical) {
log.info(JSONUtil.toJsonStr(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(); List<ProcessMedical> list = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processMedical.getProcessId()).list();
if (CollUtil.isEmpty(list)){ if (CollUtil.isEmpty(list)) {
// 新增 // 新增
return saveMedicalRecord(processMedical); return saveMedicalRecord(processMedical);
} }
@ -73,11 +76,11 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
@Override @Override
public ProcessMedicalViewDetailResVo queryViewDetail(String processId) { public ProcessMedicalViewDetailResVo queryViewDetail(String processId) {
Assert.notEmpty(processId,"流程id不能为空"); Assert.notEmpty(processId, "流程id不能为空");
// 1.获取电子病例基本信息 // 1.获取电子病例基本信息
ProcessMedicalResVo processMedicalResVo = this.findByProcessId(processId); ProcessMedicalResVo processMedicalResVo = this.findByProcessId(processId);
if (Objects.isNull(processMedicalResVo)){ if (Objects.isNull(processMedicalResVo)) {
return null; return null;
} }
ProcessMedicalViewDetailResVo resultVo = BeanUtil.toBean(processMedicalResVo, ProcessMedicalViewDetailResVo.class); ProcessMedicalViewDetailResVo resultVo = BeanUtil.toBean(processMedicalResVo, ProcessMedicalViewDetailResVo.class);
@ -99,28 +102,28 @@ public class MedicalRecordServiceImpl implements MedicalRecordService {
// 4. 获取用户姓名 // 4. 获取用户姓名
User user = userService.getById(processMedicalResVo.getUserId()); User user = userService.getById(processMedicalResVo.getUserId());
if (Objects.nonNull(user)){ if (Objects.nonNull(user)) {
resultVo.setUserName(user.getName()); resultVo.setUserName(user.getName());
} }
return resultVo; return resultVo;
} }
private void saveAssert(ProcessMedical processMedical){ private void saveAssert(ProcessMedical processMedical) {
Assert.notEmpty(processMedical.getProcessId(),"流程id不为空"); Assert.notEmpty(processMedical.getProcessId(), "流程id不为空");
Process process = processService.getById(processMedical.getProcessId()); Process process = processService.getById(processMedical.getProcessId());
Assert.notNull(process,"流程数据不存在"); Assert.notNull(process, "流程数据不存在");
processMedical.setMedicalRecId(process.getMedicalRecId()); processMedical.setMedicalRecId(process.getMedicalRecId());
processMedical.setPatientId(process.getPatientId()); processMedical.setPatientId(process.getPatientId());
if (StrUtil.isEmpty(processMedical.getDiseaseId())){ if (StrUtil.isEmpty(processMedical.getDiseaseId())) {
processMedical.setDiseaseId(process.getDiseaseId()); processMedical.setDiseaseId(process.getDiseaseId());
} }
Integer count = processMedicalService.lambdaQuery().eq(ProcessMedical::getProcessId, processMedical.getProcessId()).count(); 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 Environment environment = SpringBeanUtil.getBean(Environment.class);
private static final String RASA_TALK_URL = environment.getProperty("rasa.base-url") + environment.getProperty("rasa.talk"); 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 rasaTalkVo = new RasaTalkVo();
rasaTalkVo.setQuestion(question); rasaTalkVo.setQuestion(question);
rasaTalkVo.setSessionId(sessionId); rasaTalkVo.setSessionId(sessionId);
rasaTalkVo.setModelId(patientId); // 默认为1
rasaTalkVo.setModelId("1");
String post = HttpUtil.post(RASA_TALK_URL, JSONUtil.toJsonStr(rasaTalkVo)); String post = HttpUtil.post(RASA_TALK_URL, JSONUtil.toJsonStr(rasaTalkVo));
log.info("调用rasa对话返回结果:{}", post); log.info("调用rasa对话返回结果:{}", post);
try { try {

@ -82,4 +82,8 @@ human:
ws: ws:
# nginx的wss地址(如果是wss的,那么带不带s都可以访问) # nginx的wss地址(如果是wss的,那么带不带s都可以访问)
nginx-ip: 192.168.10.138 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: ws:
# nginx的wss地址(如果是wss的,那么带不带s都可以访问) # nginx的wss地址(如果是wss的,那么带不带s都可以访问)
nginx-ip: 192.168.10.138 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