diff --git a/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java b/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java index 4866dd08..16da077e 100644 --- a/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java +++ b/virtual-patient-common/src/main/java/com/supervision/config/WebConfig.java @@ -47,6 +47,7 @@ public class WebConfig implements WebMvcConfigurer { paths.add("/fileManage/downloadFile"); paths.add("/aqLibrary/downloadQuestionLibraryTemplate"); paths.add("/medicalRecManage/downloadMedicalAnswerTemplate"); + paths.add("/qaKnowledge/**"); // 开发环境,放开不校验token.每次修改这里需要重启(热部署不行) // paths.add("/**"); return paths; diff --git a/virtual-patient-graph/src/main/java/com/supervision/enums/TagEnum.java b/virtual-patient-graph/src/main/java/com/supervision/enums/TagEnum.java index 08006acc..176b0942 100644 --- a/virtual-patient-graph/src/main/java/com/supervision/enums/TagEnum.java +++ b/virtual-patient-graph/src/main/java/com/supervision/enums/TagEnum.java @@ -1,41 +1,41 @@ package com.supervision.enums; public enum TagEnum { - medical_rec("病例", 1, "#00B8F5"), + medical_rec("病例", 1, "#2F7CFF"), - process_medical("电子病历", 2, "#00B8F5"), + process_medical("电子病历", 2, "#55CBAD"), - self_desc("主诉", 3, "#00B8F5"), + self_desc("主诉", 3, "#55CBAD"), - previous_history("既往病史", 3, "#00B8F5"), + previous_history("既往病史", 3, "#55CBAD"), - illness_history("现病史", 3, "#00B8F5"), + illness_history("现病史", 3, "#55CBAD"), - personal_history("个人史", 3, "#00B8F5"), + personal_history("个人史", 3, "#55CBAD"), - allergy_history("过敏史", 3, "#00B8F5"), + allergy_history("过敏史", 3, "#55CBAD"), - family_history("家族史", 3, "#00B8F5"), + family_history("家族史", 3, "#55CBAD"), - marriage_child_history("婚育史", 3, "#00B8F5"), + marriage_child_history("婚育史", 3, "#55CBAD"), - operation_history("手术史", 3, "#00B8F5"), + operation_history("手术史", 3, "#55CBAD"), - symptoms("症状", 2, "#00B8F5"), + symptoms("症状", 2, "#55CBAD"), - patient("患者信息", 2, "#00B8F5"), + patient("患者信息", 2, "#55CBAD"), - physical("体格检查", 2, "#00B8F5"), + physical("体格检查", 2, "#8D8BFF"), - physical_result("体格检查结果", 2, "#00B8F5"), + physical_result("体格检查结果", 2, "#8D8BFF"), - ancillary("辅助检查", 2, "#00B8F5"), + ancillary("辅助检查", 2, "#4E8CFF"), - ancillary_result("辅助检查结果", 2, "#00B8F5"), + ancillary_result("辅助检查结果", 2, "#4E8CFF"), - treatment_plan("处置计划", 2, "#00B8F5"), + treatment_plan("处置计划", 2, "#2BCCFF"), - diagnosis("诊断", 2, "#00B8F5"); + diagnosis("诊断", 2, "#FF6667"); private final String type; diff --git a/virtual-patient-graph/src/main/java/com/supervision/service/GraphNebulaService.java b/virtual-patient-graph/src/main/java/com/supervision/service/GraphNebulaService.java index 009af60c..60113101 100644 --- a/virtual-patient-graph/src/main/java/com/supervision/service/GraphNebulaService.java +++ b/virtual-patient-graph/src/main/java/com/supervision/service/GraphNebulaService.java @@ -7,7 +7,7 @@ import java.util.List; public interface GraphNebulaService { - void creatGraphByNebula(String processId); + String creatGraphByNebula(String processId); GraphVO queryGraph(String processId, Integer level); diff --git a/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java b/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java index d94e33b5..22a3d866 100644 --- a/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java +++ b/virtual-patient-graph/src/main/java/com/supervision/service/impl/GraphNebulaServiceImpl.java @@ -4,10 +4,12 @@ import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; +import cn.hutool.core.lang.Snowflake; +import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; -import com.alibaba.nacos.common.utils.UuidUtils; +import cn.hutool.json.JSONUtil; import com.supervision.dao.*; import com.supervision.domain.*; import com.supervision.enums.TagEnum; @@ -78,7 +80,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService { private AncillaryResultDao ancillaryResultDao; @Override - public void creatGraphByNebula(String processId) { + public String creatGraphByNebula(String processId) { Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到流程,创建图谱失败")); // 根据processId找到对应的诊疗计划,如果没有找到,说明治疗流程未完成,诊断失败 List treatmentPlanRecordList = treatmentPlanRecordService.lambdaQuery().eq(TreatmentPlanRecord::getProcessId, processId).list(); @@ -242,6 +244,7 @@ public class GraphNebulaServiceImpl implements GraphNebulaService { } log.info("病历图谱ID:{}", medicalRecVertex.getId()); processService.lambdaUpdate().set(Process::getGraphId, medicalRecVertex.getId()).eq(Process::getId, processId).update(); + return medicalRecVertex.getId(); } @@ -250,8 +253,8 @@ public class GraphNebulaServiceImpl implements GraphNebulaService { Process process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程")); // 如果图谱ID为空,则创建图谱 if (StrUtil.isEmpty(process.getGraphId())) { - creatGraphByNebula(processId); - process = Optional.ofNullable(processService.getById(processId)).orElseThrow(() -> new BusinessException("未找到对应的问诊流程")); + String graphId = creatGraphByNebula(processId); + process.setGraphId(graphId); } List> subgraphList = medicalRecDao.selectSubgraph(process.getGraphId()); @@ -279,7 +282,14 @@ public class GraphNebulaServiceImpl implements GraphNebulaService { Map map = (Map) value; Object nodeValue = map.get("nodeValue"); if (ObjectUtil.isNotEmpty(nodeValue)) { - nodeVO.setNodeValue(String.valueOf(nodeValue)); + // 判断是不是富文本,如果是富文本,则desc放数据值 + if (StrUtil.startWith(String.valueOf(nodeValue), "<")) { + nodeVO.setNodeDesc(String.valueOf(nodeValue)); + nodeVO.setNodeValue(tagEnum.getType()); + } else { + nodeVO.setNodeValue(String.valueOf(nodeValue)); + } + } map.forEach((k, v) -> { if (ObjectUtil.isNotEmpty(k)) { @@ -337,22 +347,27 @@ public class GraphNebulaServiceImpl implements GraphNebulaService { recursionBuildTree(nodeVO, treeNodeMap, graphVO.getEdges()); } // 为所有节点分配新的唯一ID(前端需要ID字段为唯一ID) - recursionGenerateSingleId(firstNodeList); - return firstNodeList; + Snowflake snowflake = IdUtil.getSnowflake(1); + // 先转JSON,再转回去.为了避免出现对象复用的情况,导致ID不能分配为唯一ID + String jsonStr = JSONUtil.toJsonStr(firstNodeList); + List newTreeNodeList = JSONUtil.toList(jsonStr, TreeNodeVO.class); + + recursionGenerateSingleId(newTreeNodeList, snowflake); + return newTreeNodeList; } /** * 为属性结构构建新的唯一ID,把原先的ID迁移到GraphId */ - private void recursionGenerateSingleId(List firstNodeList) { + private void recursionGenerateSingleId(List firstNodeList, Snowflake snowflake) { for (TreeNodeVO treeNodeVO : firstNodeList) { - String uuid = UuidUtils.generateUuid(); if (StrUtil.isBlank(treeNodeVO.getGraphId())) { treeNodeVO.setGraphId(treeNodeVO.getId()); } - treeNodeVO.setId(uuid); + String nextId = snowflake.nextIdStr() + "-id"; + treeNodeVO.setId(nextId); if (CollUtil.isNotEmpty(treeNodeVO.getChildren())) { - recursionGenerateSingleId(treeNodeVO.getChildren()); + recursionGenerateSingleId(treeNodeVO.getChildren(), snowflake); } } } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/qaKnowledge/QaKnowledgeManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/qaKnowledge/QaKnowledgeManageController.java new file mode 100644 index 00000000..233a19ca --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/qaKnowledge/QaKnowledgeManageController.java @@ -0,0 +1,34 @@ +package com.supervision.manage.controller.qaKnowledge; + +import com.supervision.dto.QaKnowledgeDTO; +import com.supervision.manage.service.QaKnowledgeManageService; +import com.supervision.service.AskTemplateQuestionLibraryService; +import io.swagger.annotations.ApiOperation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@RestController +@RequestMapping("qaKnowledge") +@RequiredArgsConstructor +public class QaKnowledgeManageController { + + private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + + private final QaKnowledgeManageService qaKnowledgeManageService; + + @ApiOperation("获取问答知识库") + @GetMapping("queryQaKnowledge") + public List queryQaKnowledge() { + return askTemplateQuestionLibraryService.queryQaKnowledge(); + } + + @ApiOperation("手动刷新知识库") + @GetMapping("refreshQaKnowledge") + public void refreshQaKnowledge() { + qaKnowledgeManageService.refreshQaKnowledge(); + } +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/feign/QaKnowledgeManageClient.java b/virtual-patient-manage/src/main/java/com/supervision/manage/feign/QaKnowledgeManageClient.java new file mode 100644 index 00000000..3927c6ec --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/feign/QaKnowledgeManageClient.java @@ -0,0 +1,18 @@ +package com.supervision.manage.feign; + +import com.supervision.dto.QaKnowledgeDTO; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient(name = "qaKnowledgeManageClient", url = "${qaSimilarity}") +public interface QaKnowledgeManageClient { + + + @PostMapping("updateDatabase") + void refreshQuestionList(@RequestBody List qaKnowledgeVOList); + + +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/QaKnowledgeVO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/QaKnowledgeVO.java new file mode 100644 index 00000000..8fd0dd97 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/QaKnowledgeVO.java @@ -0,0 +1,13 @@ +package com.supervision.manage.pojo.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class QaKnowledgeVO { + + private String questionCode; + + private List questionList; +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java new file mode 100644 index 00000000..f163e540 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/QaKnowledgeManageService.java @@ -0,0 +1,6 @@ +package com.supervision.manage.service; + +public interface QaKnowledgeManageService { + + void refreshQaKnowledge(); +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java index 5e8f92fc..bce13f7d 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AskQuestionLibraryManageServiceImpl.java @@ -15,7 +15,10 @@ import com.supervision.manage.dto.UploadQuestionLibraryDTO; import com.supervision.manage.pojo.vo.UploadQuestionLibraryResVo; import com.supervision.manage.service.AskQuestionLibraryManageService; import com.supervision.manage.service.FileManageService; -import com.supervision.model.*; +import com.supervision.manage.service.QaKnowledgeManageService; +import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.CommonDic; +import com.supervision.model.FileResource; import com.supervision.service.AskTemplateQuestionLibraryService; import com.supervision.service.CommonDicService; import com.supervision.util.RedisSequenceUtil; @@ -53,8 +56,11 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa private final FileManageService fileManageService; + private final QaKnowledgeManageService qaKnowledgeManageService; + private final String ASK_QUESTION_LIBRARY_TEMPLATE_ERROR_EXCEL_PATH = "classpath:template/ask_question_library_template_error.xlsx"; private final String ASK_QUESTION_LIBRARY_TEMPLATE_EXCEL_PATH = "classpath:template/ask_question_library_template.xlsx"; + @Override public List queryList(AskQuestionLibraryReqVo askQuestionLibraryReqVo) { @@ -93,14 +99,16 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa if (CollUtil.isEmpty(question)){ question = CollUtil.newArrayList(askTemplateQuestionLibrary.getDescription()); one.setDefaultAnswer(askTemplateQuestionLibrary.getDefaultAnswer()); - }else if (!question.contains(askTemplateQuestionLibrary.getDescription())){ - question.add(0,askTemplateQuestionLibrary.getDescription()); + } else if (!question.contains(askTemplateQuestionLibrary.getDescription())) { + question.add(0, askTemplateQuestionLibrary.getDescription()); } - if (StrUtil.isNotEmpty(askTemplateQuestionLibrary.getDefaultAnswer())){ + if (StrUtil.isNotEmpty(askTemplateQuestionLibrary.getDefaultAnswer())) { one.setDefaultAnswer(askTemplateQuestionLibrary.getDefaultAnswer()); } one.setQuestion(question); askTemplateQuestionLibraryService.updateById(one); + // 对问题库进行更新操作 + qaKnowledgeManageService.refreshQaKnowledge(); return one.getId(); }else { // 新增数据 @@ -131,29 +139,36 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa askTemplateQuestionLibrary.setDefaultAnswerCode(nextDefaultCode); askTemplateQuestionLibraryService.save(askTemplateQuestionLibrary); + // 对问题库进行更新操作 + qaKnowledgeManageService.refreshQaKnowledge(); return askTemplateQuestionLibrary.getId(); } } @Override public boolean updateQuestionLibrary(AskTemplateQuestionLibrary askTemplateQuestionLibrary) { - Assert.notEmpty(askTemplateQuestionLibrary.getId(),"id不能为空"); + Assert.notEmpty(askTemplateQuestionLibrary.getId(), "id不能为空"); assertSave(askTemplateQuestionLibrary); // 不允许修改类目 fix bug 197 AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(askTemplateQuestionLibrary.getId()); - Assert.notNull(library,"知识库不存在"); - Assert.isTrue(askTemplateQuestionLibrary.getDictId().equals(library.getDictId()),"不允许修改类目"); + Assert.notNull(library, "知识库不存在"); + Assert.isTrue(askTemplateQuestionLibrary.getDictId().equals(library.getDictId()), "不允许修改类目"); this.saveQuestionLibrary(askTemplateQuestionLibrary); + // 对问题库进行更新操作 + qaKnowledgeManageService.refreshQaKnowledge(); return true; } @Override public boolean deleteQuestionLibrary(String id) { - Assert.notEmpty(id,"id不能为空"); + Assert.notEmpty(id, "id不能为空"); - return askTemplateQuestionLibraryService.removeById(id); + askTemplateQuestionLibraryService.removeById(id); + // 对问题库进行更新操作 + qaKnowledgeManageService.refreshQaKnowledge(); + return true; } @Override @@ -174,16 +189,18 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa // 更新知识库 List currentDTOS = uploadQuestionLibraryDTOS.stream().filter(dto -> CollUtil.isEmpty(dto.getErrorCodeEnums())).collect(Collectors.toList()); - if (CollUtil.isNotEmpty(currentDTOS)){ + if (CollUtil.isNotEmpty(currentDTOS)) { for (UploadQuestionLibraryDTO currentDTO : currentDTOS) { AskTemplateQuestionLibrary questionLibrary = new AskTemplateQuestionLibrary(); - if (StrUtil.isNotEmpty(currentDTO.getDictId())){ + if (StrUtil.isNotEmpty(currentDTO.getDictId())) { questionLibrary.setDictId(Long.parseLong(currentDTO.getDictId())); } questionLibrary.setDescription(currentDTO.getQuestion()); questionLibrary.setDefaultAnswer(currentDTO.getAnswer()); this.saveQuestionLibrary(questionLibrary); } + // 对问题库进行更新操作 + qaKnowledgeManageService.refreshQaKnowledge(); } timer.restart(); @@ -261,6 +278,7 @@ public class AskQuestionLibraryManageServiceImpl implements AskQuestionLibraryMa // 查询类目字段 List questionTypeDicList = commonDicService.lambdaQuery().eq(CommonDic::getGroupCode, "AQT").list(); uploadQuestionLibraryDTOS.forEach(dto->dto.doAction(questionLibraryList,questionTypeDicList)); + } /** diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java new file mode 100644 index 00000000..599225ab --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/QaKnowledgeManageServiceImpl.java @@ -0,0 +1,26 @@ +package com.supervision.manage.service.impl; + +import com.supervision.dto.QaKnowledgeDTO; +import com.supervision.manage.feign.QaKnowledgeManageClient; +import com.supervision.manage.service.QaKnowledgeManageService; +import com.supervision.service.AskTemplateQuestionLibraryService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +@Slf4j +public class QaKnowledgeManageServiceImpl implements QaKnowledgeManageService { + + private final AskTemplateQuestionLibraryService askTemplateQuestionLibraryService; + + private final QaKnowledgeManageClient qaKnowledgeManageClient; + + public void refreshQaKnowledge() { + List queryQaKnowledge = askTemplateQuestionLibraryService.queryQaKnowledge(); + qaKnowledgeManageClient.refreshQuestionList(queryQaKnowledge); + } +} diff --git a/virtual-patient-manage/src/main/resources/bootstrap.yml b/virtual-patient-manage/src/main/resources/bootstrap.yml index 55945d90..ea66490a 100644 --- a/virtual-patient-manage/src/main/resources/bootstrap.yml +++ b/virtual-patient-manage/src/main/resources/bootstrap.yml @@ -1,5 +1,5 @@ spring: profiles: - active: test + active: dev application: name: virtual-patient-manage \ No newline at end of file diff --git a/virtual-patient-model/src/main/java/com/supervision/dto/QaKnowledgeDTO.java b/virtual-patient-model/src/main/java/com/supervision/dto/QaKnowledgeDTO.java new file mode 100644 index 00000000..6ad32680 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/dto/QaKnowledgeDTO.java @@ -0,0 +1,13 @@ +package com.supervision.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class QaKnowledgeDTO { + + private String questionCode; + + private List questionList; +} diff --git a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionLibraryService.java b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionLibraryService.java index b73177bc..ff23d8a9 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionLibraryService.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/AskTemplateQuestionLibraryService.java @@ -1,8 +1,9 @@ package com.supervision.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.supervision.model.AskTemplateQuestionLibrary; import com.baomidou.mybatisplus.extension.service.IService; +import com.supervision.dto.QaKnowledgeDTO; +import com.supervision.model.AskTemplateQuestionLibrary; import com.supervision.vo.manage.AskQuestionLibraryReqVo; import com.supervision.vo.manage.AskQuestionLibraryResVo; @@ -23,4 +24,11 @@ public interface AskTemplateQuestionLibraryService extends IService queryQaKnowledge(); } diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java index ac6e0fb3..c65d3914 100644 --- a/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java +++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/AskTemplateQuestionLibraryServiceImpl.java @@ -1,26 +1,41 @@ package com.supervision.service.impl; +import cn.hutool.core.collection.CollUtil; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.supervision.dto.QaKnowledgeDTO; +import com.supervision.mapper.AskTemplateQuestionLibraryMapper; import com.supervision.model.AskTemplateQuestionLibrary; +import com.supervision.model.ConfigAncillaryItem; +import com.supervision.model.ConfigPhysicalTool; import com.supervision.service.AskTemplateQuestionLibraryService; -import com.supervision.mapper.AskTemplateQuestionLibraryMapper; +import com.supervision.service.ConfigAncillaryItemService; +import com.supervision.service.ConfigPhysicalToolService; import com.supervision.vo.manage.AskQuestionLibraryReqVo; import com.supervision.vo.manage.AskQuestionLibraryResVo; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.Objects; /** -* @author flevance -* @description 针对表【vp_ask_template_question_library(诊断问询意图问题库)】的数据库操作Service实现 -* @createDate 2023-11-03 11:13:26 -*/ + * @author flevance + * @description 针对表【vp_ask_template_question_library(诊断问询意图问题库)】的数据库操作Service实现 + * @createDate 2023-11-03 11:13:26 + */ +@Slf4j @Service +@RequiredArgsConstructor public class AskTemplateQuestionLibraryServiceImpl extends ServiceImpl - implements AskTemplateQuestionLibraryService{ + implements AskTemplateQuestionLibraryService { + + private final ConfigPhysicalToolService configPhysicalToolService; + + private final ConfigAncillaryItemService configAncillaryItemService; @Override public List queryList(AskQuestionLibraryReqVo askQuestionLibraryReqVo) { @@ -44,16 +59,69 @@ public class AskTemplateQuestionLibraryServiceImpl extends ServiceImpl() .select("max(default_answer_code) as default_answer_code")); - if (Objects.isNull(askTemplateQuestionLibrary)){ + if (Objects.isNull(askTemplateQuestionLibrary)) { return null; } return askTemplateQuestionLibrary.getDefaultAnswerCode(); } + + @Override + public List queryQaKnowledge() { + // 查询所有的问题,忽略错误和静默视频 + List libraryList = this.lambdaQuery() + .ne(AskTemplateQuestionLibrary::getDictId, 180).ne(AskTemplateQuestionLibrary::getDictId, 182).list(); + List knowledgeList = new ArrayList<>(); + + for (AskTemplateQuestionLibrary library : libraryList) { + QaKnowledgeDTO qaKnowledgeDTO = new QaKnowledgeDTO(); + qaKnowledgeDTO.setQuestionCode(library.getId()); + qaKnowledgeDTO.setQuestionList(library.getQuestion()); + knowledgeList.add(qaKnowledgeDTO); + } + + // 这里处理呼出体格检查的问题 + List physicalToolList = configPhysicalToolService.lambdaQuery() + .isNotNull(ConfigPhysicalTool::getCode) + .isNotNull(ConfigPhysicalTool::getCallOutQuestion).list(); + + for (ConfigPhysicalTool tool : physicalToolList) { + if (CollUtil.isEmpty(tool.getCallOutQuestion())) { + log.warn("getIntentCodeAndIdMap: toolId:{},toolName:{},tool.getCallOutQuestion() is empty", tool.getId(), tool.getToolName()); + continue; + } + // 把呼出的问题全部加进去 + String toolIntent = "tool_" + tool.getCode(); + QaKnowledgeDTO qaKnowledgeDTO = new QaKnowledgeDTO(); + qaKnowledgeDTO.setQuestionCode(toolIntent); + qaKnowledgeDTO.setQuestionList(tool.getCallOutQuestion()); + knowledgeList.add(qaKnowledgeDTO); + } + + // 生成呼出的辅助检查的问题 + List ancillaryItemList = configAncillaryItemService.lambdaQuery() + .isNotNull(ConfigAncillaryItem::getCode) + .isNotNull(ConfigAncillaryItem::getCallOutQuestion).list(); + + for (ConfigAncillaryItem ancillary : ancillaryItemList) { + if (CollUtil.isEmpty(ancillary.getCallOutQuestion())) { + log.warn("getIntentCodeAndIdMap: ancillaryId:{},itemName:{},ancillary.getCallOutQuestion() is empty", ancillary.getId(), ancillary.getItemName()); + continue; + } + // 把辅助问诊的问题全部加进去 + String ancillaryIntent = "ancillary_" + ancillary.getCode(); + QaKnowledgeDTO qaKnowledgeDTO = new QaKnowledgeDTO(); + qaKnowledgeDTO.setQuestionCode(ancillaryIntent); + qaKnowledgeDTO.setQuestionList(ancillary.getCallOutQuestion()); + knowledgeList.add(qaKnowledgeDTO); + } + return knowledgeList; + } } diff --git a/virtual-patient-web/src/main/java/com/supervision/feign/AskQaSimilarityFeignClient.java b/virtual-patient-web/src/main/java/com/supervision/feign/AskQaSimilarityFeignClient.java new file mode 100644 index 00000000..838a7820 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/feign/AskQaSimilarityFeignClient.java @@ -0,0 +1,19 @@ +package com.supervision.feign; + +import com.supervision.domain.GlobalResult; +import com.supervision.pojo.qaSimilarity.QaSimilarityQuestion; +import com.supervision.pojo.qaSimilarity.QaSimilarityQuestionAnswer; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +import java.util.List; + +@FeignClient(name = "askQaSimilarityFeignClient", url = "${qaSimilarity}") +public interface AskQaSimilarityFeignClient { + + @PostMapping("matchQuestion") + GlobalResult> askQuestionSimilarityAnswer(@RequestBody QaSimilarityQuestion question); + + +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestion.java b/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestion.java new file mode 100644 index 00000000..1f192334 --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestion.java @@ -0,0 +1,11 @@ +package com.supervision.pojo.qaSimilarity; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class QaSimilarityQuestion { + + private String question; +} diff --git a/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestionAnswer.java b/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestionAnswer.java new file mode 100644 index 00000000..2d018a7b --- /dev/null +++ b/virtual-patient-web/src/main/java/com/supervision/pojo/qaSimilarity/QaSimilarityQuestionAnswer.java @@ -0,0 +1,13 @@ +package com.supervision.pojo.qaSimilarity; + +import lombok.Data; + +@Data +public class QaSimilarityQuestionAnswer { + + private String matchQuestion; + + private String matchQuestionCode; + + private Double matchScore; +} diff --git a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java index c49897e0..84b18b19 100644 --- a/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java +++ b/virtual-patient-web/src/main/java/com/supervision/service/impl/AskServiceImpl.java @@ -9,17 +9,21 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.digest.MD5; import com.supervision.domain.GlobalResult; import com.supervision.exception.BusinessException; +import com.supervision.feign.AskQaSimilarityFeignClient; import com.supervision.feign.RasaManageFeignClient; import com.supervision.model.Process; import com.supervision.model.*; +import com.supervision.pojo.qaSimilarity.QaSimilarityQuestion; +import com.supervision.pojo.qaSimilarity.QaSimilarityQuestionAnswer; import com.supervision.pojo.vo.TalkResultResVO; import com.supervision.pojo.vo.TalkVideoReqVO; import com.supervision.service.*; -import com.supervision.util.*; +import com.supervision.util.AsrUtil; +import com.supervision.util.MinioUtil; +import com.supervision.util.UserUtil; import com.supervision.vo.rasa.RasaTalkVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -46,6 +50,8 @@ public class AskServiceImpl implements AskService { private final RasaManageFeignClient rasaManageFeignClient; + private final AskQaSimilarityFeignClient askQaSimilarityFeignClient; + private final CommonDicService commonDicService; @Override @@ -117,12 +123,13 @@ public class AskServiceImpl implements AskService { // 根据processId找到对应的病人 Process process = Optional.ofNullable(processService.getById(talkReqVO.getProcessId())).orElseThrow(() -> new BusinessException("未找到诊疗进程")); + String talkResult = talkQaSimilarity(talkReqVO.getText(), UserUtil.getUser().getId()); // 调用rasa获取文字内容 - String rasaResult = talkRasa(talkReqVO.getText(), UserUtil.getUser().getId()); - log.info("rasa的回复是:{}", rasaResult); + //String rasaResult = talkRasa(talkReqVO.getText(), UserUtil.getUser().getId()); + log.info("调用对话的回复是:{}", talkResult); TalkResultResVO talkResultResVO = new TalkResultResVO(); // 如果rasa没有识别出来,则返回默认值 - if (StrUtil.isBlank(rasaResult)) { + if (StrUtil.isBlank(talkResult)) { AskPatientAnswer medicalRecErrorAnswer = getMedicalRecErrorAnswer(process.getMedicalRecId()); talkResultResVO.setVideoBase64(getAnswerVideoBase64OrDefault(medicalRecErrorAnswer.getAnswerResourceId())); talkResultResVO.setAnswerMessage(medicalRecErrorAnswer.getAnswer()); @@ -134,20 +141,20 @@ public class AskServiceImpl implements AskService { // 这里校验,rasa回复的结果是不是action // 这里设置的模板,对于action的动作全部是用ancillary_ | tool_进行标记,详情看生成rasa的yml的代码:RasaServiceImpl.generateDomain // ancillary_ | tool_ - if (rasaResult.startsWith("ancillary_") || rasaResult.startsWith("tool_")) { - log.info("呼出语句:{}", rasaResult); - List actionList = StrUtil.split(rasaResult, '_'); + if (talkResult.startsWith("ancillary_") || talkResult.startsWith("tool_")) { + log.info("呼出语句:{}", talkResult); + List actionList = StrUtil.split(talkResult, '_'); if (actionList.size() > 1) { - // 在这里给socket回复,设置为动作 + // 在这里设置为动作 talkResultResVO.setActionId(actionList.get(1)); talkResultResVO.setType("ancillary".equals(actionList.get(0)) ? 3 : 2); setActionRelation(talkResultResVO); return talkResultResVO; } } else { - AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(rasaResult); + AskTemplateQuestionLibrary library = askTemplateQuestionLibraryService.getById(talkResult); if (ObjectUtil.isEmpty(library)) { - log.info("{}:未从问题库中找到,回答未识别语句", rasaResult); + log.info("{}:未从问题库中找到,回答未识别语句", talkResult); AskPatientAnswer medicalRecErrorAnswer = getMedicalRecErrorAnswer(process.getMedicalRecId()); talkResultResVO.setVideoBase64(getAnswerVideoBase64OrDefault(medicalRecErrorAnswer.getAnswerResourceId())); talkResultResVO.setAnswerMessage(medicalRecErrorAnswer.getAnswer()); @@ -157,15 +164,15 @@ public class AskServiceImpl implements AskService { AskPatientAnswer askPatientAnswer = askPatientAnswerService.lambdaQuery().eq(AskPatientAnswer::getMedicalId, process.getMedicalRecId()) .eq(AskPatientAnswer::getLibraryQuestionId, library.getId()).last("limit 1").one(); - if (ObjectUtil.isNotEmpty(askPatientAnswer) && StrUtil.isNotEmpty(askPatientAnswer.getAnswerResourceId())){ + if (ObjectUtil.isNotEmpty(askPatientAnswer) && StrUtil.isNotEmpty(askPatientAnswer.getAnswerResourceId())) { String resText = askPatientAnswer.getAnswer(); - log.info("{}:找到了病历配置的回答语句:{},回答内容:{}", rasaResult, askPatientAnswer.getId(), resText); + log.info("{}:找到了病历配置的回答语句:{},回答内容:{}", talkResult, askPatientAnswer.getId(), resText); talkResultResVO.setVideoBase64(getAnswerVideoBase64OrDefault(askPatientAnswer.getAnswerResourceId())); talkResultResVO.setAnswerMessage(askPatientAnswer.getAnswer()); // 保存记录 saveQaRecord(talkReqVO.getProcessId(), "patient", askPatientAnswer.getId(), talkReqVO.getText(), library, resText); - }else { - log.info("{}:病历配置,从AskPatientAnswer中未找到回答结果,回复未识别到语句", rasaResult); + } else { + log.info("{}:病历配置,从AskPatientAnswer中未找到回答结果,回复未识别到语句", talkResult); AskPatientAnswer medicalRecErrorAnswer = getMedicalRecErrorAnswer(process.getMedicalRecId()); talkResultResVO.setVideoBase64(getAnswerVideoBase64OrDefault(medicalRecErrorAnswer.getAnswerResourceId())); talkResultResVO.setAnswerMessage(medicalRecErrorAnswer.getAnswer()); @@ -196,6 +203,14 @@ public class AskServiceImpl implements AskService { return null; } + public String talkQaSimilarity(String question, String sessionId) { + GlobalResult> result = askQaSimilarityFeignClient.askQuestionSimilarityAnswer(new QaSimilarityQuestion(question)); + if (200 != result.getCode()) { + throw new BusinessException("相似度匹配失败"); + } + return CollUtil.getFirst(result.getData()).getMatchQuestionCode(); + } + private AskPatientAnswer getMedicalRecErrorAnswer(String medicalRecId) { //Optional.ofNullable(medicalRecErrorAnswer).orElseGet(() ->new AskPatientAnswer()).getAnswer() Assert.notEmpty(medicalRecId, "病历id不能为空");