diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/human/HumanManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java similarity index 56% rename from virtual-patient-manage/src/main/java/com/supervision/manage/human/HumanManageController.java rename to virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java index 960bd342..6aefa943 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/human/HumanManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/human/HumanManageController.java @@ -1,4 +1,4 @@ -package com.supervision.manage.human; +package com.supervision.manage.controller.human; import com.supervision.manage.service.HumanManageService; import com.supervision.model.Human; @@ -6,6 +6,7 @@ import com.supervision.vo.manage.HumanCreateReqVo; import com.supervision.vo.manage.HumanReqVo; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; @@ -23,9 +24,19 @@ public class HumanManageController { @Operation(summary = "新增数字人") - @PostMapping(value = "/createHuman",consumes = "multipart/form-data") + @PostMapping(value = "/createHuman", consumes = "multipart/form-data") public boolean createHuman(@RequestParam("file") MultipartFile imageFile, String medicalId) { return humanManageService.createHuman(imageFile, medicalId); } + + @Operation(summary = "生成数字人问诊问题回复视频") + @PostMapping(value = "/createHumanVideo", consumes = "multipart/form-data") + public boolean createHuman(@RequestParam("file") MultipartFile imageFile, + @RequestParam("file") MultipartFile videoFile, + String answer, + HttpServletResponse response) throws Exception { + return humanManageService.createHumanAnswerVideo(imageFile, videoFile, answer, response); + } + } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalAiDicController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalAiDicController.java new file mode 100644 index 00000000..8ced8686 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalAiDicController.java @@ -0,0 +1,56 @@ +package com.supervision.manage.controller.medicalrec; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.manage.service.MedicalManageAiDicService; +import com.supervision.vo.manage.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + + +/** + * @Author:longbao + * @Date:2024/11/14 9:28 + * @Description: 病例提示词控制器 + */ + +@Tag(name = "病例提示词管理") +@RestController +@RequestMapping("/medicalRecAiManage") +@RequiredArgsConstructor +public class MedicalAiDicController { + + + @Autowired + private MedicalManageAiDicService medicalAiDicService; + + + @Operation(summary = "分页查询") + @GetMapping("/query") + public IPage queryMedicalRecManagePage(@Parameter(name = "attribute_name", description = "属性名称") String attributeName, + Integer pageNum, Integer pageSize) { + return medicalAiDicService.queryPage(attributeName, pageNum, pageSize); + } + + @Operation(summary = "创建") + @PostMapping("/create") + public void createMedicalRec(@RequestBody MedicalRecAiManageCreateVO reqVO) { + medicalAiDicService.create(reqVO); + } + + @Operation(summary = "修改") + @PutMapping("/modify") + public void modifyMedicalRec(@RequestBody MedicalRecAiManageUpdateVO reqVO) { + medicalAiDicService.modify(reqVO); + } + + + @Operation(summary = "删除") + @GetMapping("/delete") + public void deleteMedicalRec(String id) { + medicalAiDicService.delete(id); + } +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java index c034620e..37cdfb92 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/controller/medicalrec/MedicalRecManageController.java @@ -1,10 +1,13 @@ package com.supervision.manage.controller.medicalrec; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.manage.pojo.vo.*; import com.supervision.manage.service.MedicalRecManageService; import com.supervision.model.Disease; import com.supervision.model.MedicalRec; +import com.supervision.model.MedicalRecAi; import com.supervision.vo.manage.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -123,7 +126,6 @@ public class MedicalRecManageController { @Operation(summary = "查询病例默认问题") @GetMapping("/queryMedicalDefaultAnswer") public List queryMedicalDefaultAnswer(@Parameter(name = "medicalRecId", description = "病例id") String medicalRecId) { - return medicalRecManageService.queryMedicalDefaultAnswer(medicalRecId); } @@ -151,11 +153,19 @@ public class MedicalRecManageController { } + + + @Operation(summary = "查询病例提示词属性") + @GetMapping("/queryMedicalPromptStats") + public MedicalPromptStatsResVo queryMedicalPromptStats() { + return medicalRecManageService.queryMedicalPromptStats(); + } + + @Operation(summary = "生成病历模型提示词") @PutMapping("/uploadMedicalAiById") - public void uploadMedicalAi(@Parameter(name = "medicalRecId", description = "病例id") String medicalRecId, - @Parameter(name = "medicalRecAi", description = "提示词") String medicalRecAi) throws Exception { - medicalRecManageService.uploadMedicalAi(medicalRecId, medicalRecAi); + public void uploadMedicalAi(@RequestBody MedicalRecCreateAiManageVO medicalRecAi) { + medicalRecManageService.uploadMedicalAi(medicalRecAi); } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/ai/AiMangeTalkAnswerDTO.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/ai/AiMangeTalkAnswerDTO.java new file mode 100644 index 00000000..253f9540 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/ai/AiMangeTalkAnswerDTO.java @@ -0,0 +1,10 @@ +package com.supervision.manage.pojo.ai; + + +import lombok.Data; + +@Data +public class AiMangeTalkAnswerDTO { + + private String answer; +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalPromptStatsResVo.java b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalPromptStatsResVo.java new file mode 100644 index 00000000..e28a813b --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/pojo/vo/MedicalPromptStatsResVo.java @@ -0,0 +1,22 @@ +package com.supervision.manage.pojo.vo; + +import com.supervision.model.MedicalRecAi; +import lombok.Data; + +import java.util.List; + +/** + * @Author:longbao + * @Date:2024/11/14 11:18 + * @Description: + */ +@Data +public class MedicalPromptStatsResVo { + + // 模板名称 + private List medicalRecAisCommon; + + // 其他属性 + private List medicalRecAisPara; + +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/AiMangeService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AiMangeService.java new file mode 100644 index 00000000..b1fe0a9c --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/AiMangeService.java @@ -0,0 +1,6 @@ +package com.supervision.manage.service; + +public interface AiMangeService { + + String talk(String question, String medicalRecord); +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java index 2c7a01b1..01274a51 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/HumanManageService.java @@ -2,6 +2,7 @@ package com.supervision.manage.service; import com.supervision.model.Human; import com.supervision.vo.manage.HumanReqVo; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -24,10 +25,28 @@ public interface HumanManageService { boolean createHuman(HumanReqVo humanReqVo); + /** + * 病历模板中的生成数字人按钮接口 + * @param imageFile + * @param medicalId + * @return + */ boolean createHuman(MultipartFile imageFile, String medicalId); boolean updateHuman(HumanReqVo human); boolean deleteHuman(String id); + + + /** + * 根据病历问题的回复+克隆音色=创建视频数字人 + * @param imageFile 数字人照片 + * @param videoFile 被克隆着音色 + * @param answer 数字人视频内容 + * @param response 完整数字人视频 + * @return + */ + boolean createHumanAnswerVideo(MultipartFile imageFile, MultipartFile videoFile, String answer, HttpServletResponse response); + } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalManageAiDicService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalManageAiDicService.java new file mode 100644 index 00000000..0a0c7983 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalManageAiDicService.java @@ -0,0 +1,34 @@ +package com.supervision.manage.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.model.MedicalRecAi; +import com.supervision.vo.manage.MedicalRecAiManageCreateVO; +import com.supervision.vo.manage.MedicalRecAiManageReqVO; +import com.supervision.vo.manage.MedicalRecAiManageUpdateVO; +import com.supervision.vo.manage.MedicalRecPageResVO; + +import java.util.List; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +public interface MedicalManageAiDicService { + void delete(String id); + + void modify(MedicalRecAiManageUpdateVO reqVO); + + void create(MedicalRecAiManageCreateVO reqVO); + + IPage queryPage(String attributeName, Integer pageNum, Integer pageSize); + + + List queryAi(); + + + List queryByCodeList(String codeList); + + + MedicalRecAi queryByCode(); +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java index c855c75f..99b47452 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/MedicalRecManageService.java @@ -1,9 +1,10 @@ package com.supervision.manage.service; +import com.alibaba.fastjson.JSONArray; import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.manage.pojo.vo.*; import com.supervision.model.Disease; -import com.supervision.model.MedicalRec; +import com.supervision.model.MedicalRecAi; import com.supervision.vo.manage.*; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; @@ -66,11 +67,15 @@ public interface MedicalRecManageService { /** - * 修改病历提示词 - * - * @param medicalRecId - * @param medicalRecAi + * 查询模板数据 + * @return */ - void uploadMedicalAi(String medicalRecId, String medicalRecAi); + MedicalPromptStatsResVo queryMedicalPromptStats(); + + /** + * 生成病例模板提示词 + * @param medicalRecAi + */ + void uploadMedicalAi(MedicalRecCreateAiManageVO medicalRecAi); } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AiServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AiServiceImpl.java new file mode 100644 index 00000000..15751cb5 --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/AiServiceImpl.java @@ -0,0 +1,60 @@ +package com.supervision.manage.service.impl; + +import cn.hutool.core.util.StrUtil; +import com.supervision.manage.pojo.ai.AiMangeTalkAnswerDTO; +import com.supervision.manage.service.AiMangeService; +import com.supervision.util.AiChatUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.stereotype.Service; + +import java.util.*; + +@Slf4j +@Service +public class AiServiceImpl implements AiMangeService { + + public static final String userPromptTemplate = """ + 预设病人的详细情况的如下: + --- + {medicalRecord} + --- + 回复格式为json:{"answer":"你是一个总结提取专家,根据详细情况,进行归纳总结提取"} + """; + + private static final String systemPrompt = """ + 我们现在来进行一个角色扮演连续对话场景。 + 需要进行信息提取。 + 我会给你设定病人的详细情况,你结合问题,从内容中找到答案。 + 如果详细情况中的信息不能回该问题,则对于该问题,应是一个正常人的情况,则由你生成一个正常的回答,但回答必须且简洁! + """; + + /** + * 根据病历进行回复 + * + * @param question 医生的问题 + * @return 大模型回答的问题 + */ + public String talk(String question, String medicalRecord) { + Map paramMap = new HashMap<>(); + paramMap.put("medicalRecord", medicalRecord); + List messageHistoryList = new ArrayList<>(); + messageHistoryList.add(new SystemMessage(systemPrompt)); + messageHistoryList.add(new UserMessage(StrUtil.format(userPromptTemplate, paramMap))); + messageHistoryList.add(new AssistantMessage("好的,已了解我要扮演病人的详细情况。已准备好对话了。")); + messageHistoryList.add(new UserMessage(question)); + Optional chat = AiChatUtil.chat(messageHistoryList, AiMangeTalkAnswerDTO.class); + if (chat.isPresent()) { + AiMangeTalkAnswerDTO aiTalkAnswerDTO = chat.get(); + if (StrUtil.isNotBlank(aiTalkAnswerDTO.getAnswer())) { + return aiTalkAnswerDTO.getAnswer(); + } + } + return "医生,我没有听懂你说的是什么"; + } + + +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java index 0095427b..e8440ef7 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/HumanManageServiceImpl.java @@ -22,6 +22,7 @@ import com.supervision.service.MedicalRecService; import com.supervision.util.OkHttpUtils; import com.supervision.util.UserUtil; import com.supervision.vo.manage.HumanReqVo; +import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -289,6 +290,10 @@ public class HumanManageServiceImpl implements HumanManageService { .one(); Assert.isTrue(null != medicalRec, "请先导入病例后再操作"); + String name = imageFile.getName(); + // 限制文件名称必须大于等于三个字符 + Assert.isTrue(name.length() > 3, "请先导入病例后再操作"); + // 上传图片 FileResource fileResource = fileManageService.uploadFile(imageFile, imageFile.getContentType()); @@ -321,4 +326,28 @@ public class HumanManageServiceImpl implements HumanManageService { }); return true; } + + + /** + * 根据病历问题的回复+克隆音色=创建视频数字人 + * + * @param imageFile 数字人照片 + * @param videoFile 被克隆着音色 + * @param answer 数字人视频内容 + * @param response 完整数字人视频 + * @return + */ + @Override + public boolean createHumanAnswerVideo(MultipartFile imageFile, + MultipartFile videoFile, + String answer, + HttpServletResponse response) { + + // 1. 生成特色语音内容 + + // 2. 根据语音生成视频 + + // 3. 返回视频下载 + return false; + } } diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalManageAiDicServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalManageAiDicServiceImpl.java new file mode 100644 index 00000000..24c0cb8d --- /dev/null +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalManageAiDicServiceImpl.java @@ -0,0 +1,69 @@ +package com.supervision.manage.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.manage.service.MedicalManageAiDicService; +import com.supervision.model.MedicalRecAi; +import com.supervision.service.MedicalAiDicService; +import com.supervision.vo.manage.MedicalRecAiManageCreateVO; +import com.supervision.vo.manage.MedicalRecAiManageReqVO; +import com.supervision.vo.manage.MedicalRecAiManageUpdateVO; +import com.supervision.vo.manage.MedicalRecPageResVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MedicalManageAiDicServiceImpl implements MedicalManageAiDicService { + + + @Autowired + private MedicalAiDicService medicalAiDicService; + + @Override + public void delete(String id) { + medicalAiDicService.delete(id); + } + + @Override + public void modify(MedicalRecAiManageUpdateVO reqVO) { + medicalAiDicService.modify(reqVO); + } + + @Override + public void create(MedicalRecAiManageCreateVO reqVO) { + medicalAiDicService.create(reqVO); + } + + @Override + public IPage queryPage(String attributeName, Integer pageNum, Integer pageSize) { + return medicalAiDicService.queryPage(attributeName, pageNum, pageSize); + } + + + @Override + public List queryAi() { + return medicalAiDicService.queryAi(); + } + + + @Override + public List queryByCodeList(String codeList) { + return medicalAiDicService.queryByCodeList(codeList); + } + + + @Override + public MedicalRecAi queryByCode() { + return medicalAiDicService.queryByCode(); + } +} diff --git a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java index 0cc16461..01231446 100644 --- a/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java +++ b/virtual-patient-manage/src/main/java/com/supervision/manage/service/impl/MedicalRecManageServiceImpl.java @@ -10,8 +10,11 @@ import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.poi.excel.ExcelReader; import cn.hutool.poi.excel.ExcelUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.supervision.dto.*; +import com.supervision.enums.MedicalCommonTemplateEnum; import com.supervision.exception.BusinessException; import com.supervision.manage.pojo.vo.*; import com.supervision.manage.service.*; @@ -21,6 +24,7 @@ import com.supervision.model.*; import com.supervision.model.Process; import com.supervision.service.*; import com.supervision.service.MedicalRecService; +import com.supervision.util.AiChatUtil; import com.supervision.util.UserUtil; import com.supervision.vo.manage.*; import jakarta.servlet.ServletOutputStream; @@ -29,6 +33,11 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.Sheet; +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.messages.Message; +import org.springframework.ai.chat.messages.SystemMessage; +import org.springframework.ai.chat.messages.UserMessage; +import org.springframework.ai.vectorstore.RedisVectorStore; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.stereotype.Service; @@ -48,6 +57,14 @@ import java.util.stream.Collectors; public class MedicalRecManageServiceImpl implements MedicalRecManageService { + private static final String systemPrompt = """ + 我们现在来进行一个角色扮演连续对话场景。 + 需要你现在扮演一个病人,我来扮演医生,我们进行模拟问诊。 + 我会给你设定病人的详细情况,你结合问题,从内容中找到答案原文回复。 + 如果详细情况中的信息不能回该问题,则对于该问题,应是一个正常人的情况,则由你生成一个正常的回答,但回答必须且简洁! + 如果医生说'你好'等礼貌用语,你就回复'你好,医生'!!! + """; + private final String CASE_TEMPLATE_TEMPLATE_EXCEL_PATH = "classpath:template/虚拟病例信息模板v3.0.xlsx"; private final String MEDICAL_ANSWER_TEMPLATE_EXCEL_PATH = "classpath:template/medical_answer_template.xlsx"; @@ -78,10 +95,12 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { private final AnswerVideoResourceService answerVideoResourceService; - private final MaterialLibraryService materialLibraryService; - private final ProcessService processService; + private final MedicalManageAiDicService medicalManageAiDicService; + + private final AiMangeService aiService; + public List queryDiseaseListByDropList() { return diseaseService.lambdaQuery().list(); } @@ -112,6 +131,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { // 然后保存病历 MedicalRec medicalRec = BeanUtil.toBean(reqVO, MedicalRec.class); medicalRec.setDiseaseId(reqVO.getDiseaseId()); + medicalRec.setAi(); medicalRec.insert(); // 这里生成一个新的编号(首先去数据库里面查询编号,然后用最大的编号+1)(可能存在并发修改导致编码重复问题,不是重点,等有问题再说) medicalRecService.updateMedicalRecNo("QL", "男".equals(reqVO.getPatientGender()) ? "M" : "F", medicalRec.getId()); @@ -570,7 +590,7 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { medicalRec.setMedicalStatus(MedicalStatusEnum.CREATE.getCode()); medicalRec.setMedicalImportType(MedicalTypeEnum.TEMPLATE_IMPORT.getCode()); medicalRec.setMedicalRecordAi("姓名:" + name + "\n性别:" + sex + "\n年龄:" + ageStar - + "\n婚育史:" + maritalStatus + "\n职业:" + occupation + "\n家庭住址:" + address + "\n病史叙述者:本人"); + + "\n婚育史:" + maritalStatus + "\n职业:" + occupation + "\n家庭住址:" + address + "\n病史叙述者:本人\n"); medicalRecService.save(medicalRec); medicalRecService.updateMedicalRecNo("QL", "男".equals(sex) ? "M" : "F", medicalRec.getId()); return medicalRec; @@ -737,16 +757,56 @@ public class MedicalRecManageServiceImpl implements MedicalRecManageService { /** - * 修改病历提示词 + * 查询病历提示词模板 * - * @param medicalRecId - * @param medicalRecAi + * @return */ @Override - public void uploadMedicalAi(String medicalRecId, String medicalRecAi) { + public MedicalPromptStatsResVo queryMedicalPromptStats() { + MedicalPromptStatsResVo medicalPromptStatsResVo = new MedicalPromptStatsResVo(); + List medicalRecAisCommon = medicalManageAiDicService.queryByCodeList(MedicalCommonTemplateEnum.COMMON_TEMPLATE_ENUM.getCode()); + List medicalRecAisPara = medicalManageAiDicService.queryByCodeList(MedicalCommonTemplateEnum.PARA_TEMPLATE_ENUM.getCode()); + medicalPromptStatsResVo.setMedicalRecAisCommon(medicalRecAisCommon); + medicalPromptStatsResVo.setMedicalRecAisPara(medicalRecAisPara); + return medicalPromptStatsResVo; + } + + + @Override + public void uploadMedicalAi(MedicalRecCreateAiManageVO medicalRecCreateAiManageVO) { + String medicalRecId = medicalRecCreateAiManageVO.getMedicalRecId(); + String ai = ""; + String patientAnswerString = ""; + + // 通用模板属性 + String commonModelParam = medicalRecCreateAiManageVO.getCommonModelParam(); + + List askPatientAnswers = askPatientAnswerService.lambdaQuery() + .select(AskPatientAnswer::getQuestion, AskPatientAnswer::getAnswer) + .eq(AskPatientAnswer::getMedicalId, medicalRecId) + .list(); + for (AskPatientAnswer askPatientAnswer : askPatientAnswers) { + if (null != askPatientAnswer){ + patientAnswerString = patientAnswerString + askPatientAnswer.getQuestion() + "," + askPatientAnswer.getAnswer() + ","; + } + } + + // 其他属性集合 + List medicalRecCreateListAiManageVOS = medicalRecCreateAiManageVO.getMedicalRecCreateListAiManageVOS(); + for (MedicalRecCreateListAiManageVO medicalRecCreateListAiManageVO : medicalRecCreateListAiManageVOS) { + String attributeName = medicalRecCreateListAiManageVO.getAttributeName(); + String attributeParam = medicalRecCreateListAiManageVO.getAttributeParam(); + String answer = aiService.talk(attributeParam, patientAnswerString); + ai = attributeName + ":" + answer + "\n"; + } + + MedicalRec byId = medicalRecService.getById(medicalRecId); + String medicalRecordAi = byId.getMedicalRecordAi(); + + MedicalRec medicalRec = new MedicalRec(); medicalRec.setId(medicalRecId); - medicalRec.setMedicalRecordAi(medicalRecAi); - this.medicalRecService.updateById(medicalRec); + medicalRec.setMedicalRecordAi(medicalRecordAi + ai); + medicalRecService.updateById(medicalRec); } } diff --git a/virtual-patient-model/src/main/java/com/supervision/enums/MedicalCommonTemplateEnum.java b/virtual-patient-model/src/main/java/com/supervision/enums/MedicalCommonTemplateEnum.java new file mode 100644 index 00000000..167c161d --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/enums/MedicalCommonTemplateEnum.java @@ -0,0 +1,26 @@ +package com.supervision.enums; + +import lombok.Getter; + +/** + * @Author:longbao + * @Date:2024/11/13 16:44 + * @Description: 病例提示词模板 + */ +@Getter +public enum MedicalCommonTemplateEnum { + + COMMON_TEMPLATE_ENUM("00", "病历提示词模板-通用模板"), + PARA_TEMPLATE_ENUM("01", "病历提示词模板-属性模板"), + ; + + private String description; + private String code; + + MedicalCommonTemplateEnum(String code, String description) { + this.description = description; + this.code = code; + } + + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/mapper/MedicalAiMapper.java b/virtual-patient-model/src/main/java/com/supervision/mapper/MedicalAiMapper.java new file mode 100644 index 00000000..8159fcd4 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/mapper/MedicalAiMapper.java @@ -0,0 +1,22 @@ +package com.supervision.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.supervision.model.MedicalRecAi; +import com.supervision.vo.manage.MedicalRecAiManageReqVO; +import com.supervision.vo.manage.MedicalRecPageResVO; +import org.apache.ibatis.annotations.Param; + +/** + * @Author:longbao + * @Date:2024/11/14 9:51 + * @Description: vp_medical_ai_dic + */ +public interface MedicalAiMapper extends BaseMapper { + + + IPage queryPage(@Param("medicalRecAiManageVO") MedicalRecAiManageReqVO medicalRecAiManageVO, + @Param("page") Page page); + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java index 6af564ac..7276075a 100644 --- a/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java +++ b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRec.java @@ -7,6 +7,7 @@ import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.activerecord.Model; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.apache.commons.lang3.StringUtils; import java.io.Serializable; import java.time.LocalDateTime; @@ -19,163 +20,149 @@ import java.time.LocalDateTime; @TableName(value = "vp_medical_rec", autoResultMap = true) @Data public class MedicalRec extends Model implements Serializable { + @TableField(exist = false) + private static final long serialVersionUID = 1L; /** * 主键 */ @TableId private String id; - /** * 病例编号 */ private String no; - - @Schema(description = "数字人id") private String humanId; - /** * 病人头像 */ private String patientHeadPic; - /** * 数字人类型 0:离线数字人 1:在线数字人 */ private int digitalHumanType; - /** * 姓名 */ private String patientName; - /** * 性别 女 / 男 */ private String patientGender; - /** * 年龄 */ private Integer patientAge; - /** * 婚姻状况 0:未婚 1:已婚 */ private String patientMarriage; - /** * 职业 */ private String patientProfession; - /** * 电话 */ private String patientPhone; - /** * 籍贯 */ private String nativePlace; - /** * 民族 */ private String patientNation; - /** * 邮编 */ private String patientPostcode; - /** * 出生地 */ private String patientBirthplace; - /** * 现居住地址 */ private String patientHabitation; - /** * 病人ID */ @Deprecated private String patientId; - /** * 疾病id */ private String diseaseId; - /** * 患者主诉 */ private String patientSelfDesc; - /** * 症状 */ private String symptoms; - @Schema(description = "初步诊断依据") private String primarilyDiagnosisCriteria; - @Schema(description = "证实诊断依据") private String confirmDiagnosisCriteria; - @Schema(description = "鉴别诊断依据") private String differentialDiagnosisCriteria; - // 2024.11.05:与周霞沟通后修改全面检查字段为 *预期诊断结果 @Schema(description = "预期诊断结果") private String fullCheck; - @Schema(description = "提交给大模型的病历") private String medicalRecordAi; - @Schema(description = "上线状态 1:未上线 2:已经上线 状态为未上线且病历未出现在vp_process表中使用可以进行删除") private Integer status; - /** * 创建人ID */ @TableField(fill = FieldFill.INSERT) private String createUserId; - /** * 创建时间 */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; - /** * 更新人 */ @TableField(fill = FieldFill.INSERT_UPDATE) private String updateUserId; - /** * 更新时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; - /** - *病例生成状态 + * 病例生成状态 */ @Schema(description = "病例生成状态") private String medicalStatus; - /** * 病例创建类型 */ @Schema(description = "病例创建类型") private String medicalImportType; - - @TableField(exist = false) - private static final long serialVersionUID = 1L; + // 设置ai值 + public void setAi() { + if (StringUtils.isNotEmpty(this.getPatientName())) { + this.setMedicalRecordAi("姓名:" + this.getPatientName() + "\n"); + } + if (StringUtils.isNotEmpty(this.getPatientGender())) { + this.setMedicalRecordAi("性别:" + this.getPatientName() + "\n"); + } + if (StringUtils.isNotEmpty(String.valueOf(this.getPatientAge()))) { + this.setMedicalRecordAi("年龄:" + String.valueOf(this.getPatientAge()) + "\n"); + } + if (StringUtils.isNotEmpty(this.getPatientMarriage())) { + this.setMedicalRecordAi("婚育史:" + this.getPatientMarriage() + "\n"); + } + if (StringUtils.isNotEmpty(this.getPatientHabitation())) { + this.setMedicalRecordAi("家庭住址:" + this.getPatientHabitation() + "\n"); + } + this.setMedicalRecordAi(this.getMedicalRecordAi() + "\n病史叙述者:本人:"); + } } \ No newline at end of file diff --git a/virtual-patient-model/src/main/java/com/supervision/model/MedicalRecAi.java b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRecAi.java new file mode 100644 index 00000000..635cd1ef --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/model/MedicalRecAi.java @@ -0,0 +1,53 @@ +package com.supervision.model; + +import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.extension.activerecord.Model; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +/** + * @Author:longbao + * @Date:2024/11/14 9:40 + * @Description: vp_medical_ai_dic + */ +@TableName(value = "vp_medical_ai_dic", autoResultMap = true) +@Data +public class MedicalRecAi extends Model implements Serializable { + + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + @TableId(type = IdType.AUTO) + private Long id; + + private String attributeName; + + private String attributeParam; + + private String commonName; + + private String commonType; + + private String createUserId; + + private String updateUserId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/service/MedicalAiDicService.java b/virtual-patient-model/src/main/java/com/supervision/service/MedicalAiDicService.java new file mode 100644 index 00000000..41bebc50 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/service/MedicalAiDicService.java @@ -0,0 +1,32 @@ +package com.supervision.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.supervision.model.MedicalRecAi; +import com.supervision.vo.manage.MedicalRecAiManageCreateVO; +import com.supervision.vo.manage.MedicalRecAiManageReqVO; +import com.supervision.vo.manage.MedicalRecAiManageUpdateVO; +import com.supervision.vo.manage.MedicalRecPageResVO; + +import java.util.List; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +public interface MedicalAiDicService { + void delete(String id); + + void modify(MedicalRecAiManageUpdateVO reqVO); + + void create(MedicalRecAiManageCreateVO reqVO); + + IPage queryPage(String attributeName, Integer pageNum, Integer pageSize); + + List queryAi(); + + List queryByCodeList(String codeList); + + MedicalRecAi queryByCode(); + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/service/impl/MedicalAiDicServiceImpl.java b/virtual-patient-model/src/main/java/com/supervision/service/impl/MedicalAiDicServiceImpl.java new file mode 100644 index 00000000..15bd458d --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/service/impl/MedicalAiDicServiceImpl.java @@ -0,0 +1,93 @@ +package com.supervision.service.impl; + +import cn.hutool.core.lang.Assert; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.supervision.enums.MedicalCommonTemplateEnum; +import com.supervision.mapper.MedicalAiMapper; +import com.supervision.model.CommonDic; +import com.supervision.model.MedicalRecAi; +import com.supervision.service.CommonDicService; +import com.supervision.service.MedicalAiDicService; +import com.supervision.util.UserUtil; +import com.supervision.vo.manage.MedicalRecAiManageCreateVO; +import com.supervision.vo.manage.MedicalRecAiManageReqVO; +import com.supervision.vo.manage.MedicalRecAiManageUpdateVO; +import com.supervision.vo.manage.MedicalRecPageResVO; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class MedicalAiDicServiceImpl extends ServiceImpl implements MedicalAiDicService { + + + @Autowired + private CommonDicService commonDicService; + + @Override + public void delete(String id) { + this.removeById(id); + } + + @Override + public void modify(MedicalRecAiManageUpdateVO reqVO) { + + MedicalRecAi medicalRecAi = new MedicalRecAi(); + medicalRecAi.setId(reqVO.getId()); + medicalRecAi.setAttributeName(reqVO.getAttributeName()); + medicalRecAi.setAttributeParam(reqVO.getAttributeParam()); + medicalRecAi.setCommonType(reqVO.getCommonType()); + medicalRecAi.setCommonName(reqVO.getCommonName()); + medicalRecAi.setUpdateUserId(UserUtil.getUser().getUpdateUserId()); + this.updateById(medicalRecAi); + } + + @Override + public void create(MedicalRecAiManageCreateVO reqVO) { + MedicalRecAi medicalRecAi = new MedicalRecAi(); + medicalRecAi.setAttributeName(reqVO.getAttributeName()); + medicalRecAi.setAttributeParam(reqVO.getAttributeParam()); + medicalRecAi.setCommonName(reqVO.getCommonName()); + medicalRecAi.setCommonType(reqVO.getCommonType()); + medicalRecAi.setCreateUserId(UserUtil.getUser().getCreateUserId()); + medicalRecAi.setUpdateUserId(UserUtil.getUser().getUpdateUserId()); + this.save(medicalRecAi); + } + + @Override + public IPage queryPage(String attributeName, Integer pageNum, Integer pageSize) { + MedicalRecAiManageReqVO medicalRecPageReqVO = new MedicalRecAiManageReqVO(); + medicalRecPageReqVO.setAttributeName(attributeName); + return this.baseMapper.queryPage(medicalRecPageReqVO, new Page<>(pageNum, pageSize)); + } + + + @Override + public List queryAi() { + return this.lambdaQuery().list(); + } + + + @Override + public List queryByCodeList(String code) { + return this.lambdaQuery().eq(MedicalRecAi::getCommonType, code).list(); + } + + + @Override + public MedicalRecAi queryByCode() { + return this.lambdaQuery().eq(MedicalRecAi::getCommonType, MedicalCommonTemplateEnum.COMMON_TEMPLATE_ENUM.getCode()).one(); + } +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageCreateVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageCreateVO.java new file mode 100644 index 00000000..b09da3fb --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageCreateVO.java @@ -0,0 +1,26 @@ +package com.supervision.vo.manage; + +import com.supervision.model.MedicalRecAi; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +@Data +public class MedicalRecAiManageCreateVO { + + @Schema(description = "模板类型") + private String commonType; + + @Schema(description = "模板名称") + private String commonName; + + @Schema(description = "属性名称") + private String attributeName; + + @Schema(description = "提示词") + private String attributeParam; +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageReqVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageReqVO.java new file mode 100644 index 00000000..c55fa5f9 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageReqVO.java @@ -0,0 +1,18 @@ +package com.supervision.vo.manage; + +import com.supervision.model.MedicalRecAi; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +@Data +@Schema(description = "病历管理创建及新建", implementation = MedicalRecAi.class) +public class MedicalRecAiManageReqVO { + + @Schema(description = "属性名称") + private String attributeName; +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageUpdateVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageUpdateVO.java new file mode 100644 index 00000000..cb6c47be --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiManageUpdateVO.java @@ -0,0 +1,29 @@ +package com.supervision.vo.manage; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: + */ +@Data +public class MedicalRecAiManageUpdateVO { + + @Schema(description = "id") + private Long id; + + @Schema(description = "属性名称") + private String attributeName; + + @Schema(description = "提示词") + private String attributeParam; + + @Schema(description = "模板名称") + private String commonName; + + @Schema(description = "模板类型") + private String commonType; + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiPageResVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiPageResVO.java new file mode 100644 index 00000000..b784e3d0 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecAiPageResVO.java @@ -0,0 +1,37 @@ +package com.supervision.vo.manage; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + + +/** + * @Author:longbao + * @Date:2024/11/14 9:51 + * @Description: + */ +@Data +public class MedicalRecAiPageResVO { + + private String id; + + private String commonType; + + private String commonName; + + private String attributeName; + + private String attributeParam; + + private String createUserId; + + private String updateUserId; + + private LocalDateTime createTime; + + private LocalDateTime updateTime; + +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateAiManageVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateAiManageVO.java new file mode 100644 index 00000000..18026b42 --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateAiManageVO.java @@ -0,0 +1,25 @@ +package com.supervision.vo.manage; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: 生成病历模型提示词 + */ +@Data +public class MedicalRecCreateAiManageVO { + + @Schema(description = "病例id") + private String medicalRecId; + + @Schema(description = "通用模板属性") + private String commonModelParam; + + @Schema(description = "属性") + private List medicalRecCreateListAiManageVOS; +} diff --git a/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateListAiManageVO.java b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateListAiManageVO.java new file mode 100644 index 00000000..f8d3c55c --- /dev/null +++ b/virtual-patient-model/src/main/java/com/supervision/vo/manage/MedicalRecCreateListAiManageVO.java @@ -0,0 +1,23 @@ +package com.supervision.vo.manage; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.util.List; +import java.util.Map; + +/** + * @Author:longbao + * @Date:2024/11/14 9:32 + * @Description: 生成病历模型提示词-类的子类 + */ +@Data +public class MedicalRecCreateListAiManageVO { + + @Schema(description = "属性提示词") + private String attributeParam; + + @Schema(description = "属性名称") + private String attributeName; + +} diff --git a/virtual-patient-model/src/main/resources/mapper/MedicalAiMapper.xml b/virtual-patient-model/src/main/resources/mapper/MedicalAiMapper.xml new file mode 100644 index 00000000..353b2f45 --- /dev/null +++ b/virtual-patient-model/src/main/resources/mapper/MedicalAiMapper.xml @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,medical_id,library_question_id,code,question, + answer,answer_resources_id,answer_type,create_user_id, + create_time,update_user_id,update_time + + + + + + diff --git a/virtual-patient-model/src/main/resources/mapper/AskCirculationDetailMapper.xml b/virtual-patient-model/src/main/resources/mapper/MedicalManageAiDicService.xml similarity index 100% rename from virtual-patient-model/src/main/resources/mapper/AskCirculationDetailMapper.xml rename to virtual-patient-model/src/main/resources/mapper/MedicalManageAiDicService.xml