|
|
@@ -2,8 +2,11 @@ package org.ruoyi.chat.service.chat.impl;
|
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.ruoyi.chat.service.chat.ISseService;
|
|
|
import org.ruoyi.chat.service.chat.MedicalRecSevice;
|
|
|
import org.ruoyi.chat.service.chat.VitalSignsService;
|
|
|
+import org.ruoyi.common.chat.entity.chat.SchemaMessage;
|
|
|
+import org.ruoyi.common.chat.request.SchemaRequest;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.http.*;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
@@ -20,12 +23,25 @@ public class VitalSignsServiceImpl implements VitalSignsService {
|
|
|
|
|
|
@Autowired
|
|
|
private MedicalRecSevice medicalRecSevice;
|
|
|
+ @Autowired
|
|
|
+ private ISseService sseService;
|
|
|
+ @Autowired
|
|
|
+ private ThinkVitalSignsServiceImpl thinkVitalSignsService;
|
|
|
@Override
|
|
|
public String handleVitalSigns(Map<String, Object> vitalSignsData) {
|
|
|
+ StringBuilder stringBuilder = new StringBuilder();
|
|
|
// 查询所有病历记录
|
|
|
Map<String, Object> queryMap = new HashMap<>();
|
|
|
queryMap.put("patVisitInfoId", vitalSignsData.get("number"));
|
|
|
List<Map<String, Object>> medicalRecList = medicalRecSevice.findMedicalRec(queryMap);
|
|
|
+ int i = thinkVitalSignsService.addVitalSigns(vitalSignsData);
|
|
|
+ if(i>= 0){
|
|
|
+ stringBuilder.append("异常体征数据存储成功-》");
|
|
|
+ }else {
|
|
|
+ stringBuilder.append("异常体征数据存储失败。");
|
|
|
+ return stringBuilder.toString();
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
// 初始化模型输入参数
|
|
|
Map<String, Object> modelInput = new HashMap<>();
|
|
|
@@ -59,7 +75,14 @@ public class VitalSignsServiceImpl implements VitalSignsService {
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ SchemaRequest schemaRequest = new SchemaRequest();
|
|
|
+ schemaRequest.setMaxDistance(0.7f);
|
|
|
+ schemaRequest.setModel("lag-m3");
|
|
|
+ schemaRequest.setMessages(ruYuanContent);
|
|
|
+ schemaRequest.setKid("1948572151787782146");
|
|
|
+ SchemaMessage schema = sseService.getSchema(schemaRequest, null);
|
|
|
+ List<String> nearest = schema.getNearest();
|
|
|
+ modelInput.put("nearest",nearest);
|
|
|
// 整理为模型要求格式
|
|
|
List<Map<String, Object>> medicalRecords = new ArrayList<>();
|
|
|
if (!ruYuanContent.isEmpty()) {
|
|
|
@@ -76,45 +99,71 @@ public class VitalSignsServiceImpl implements VitalSignsService {
|
|
|
|
|
|
// 调用模型
|
|
|
Map<String, Object> modelResponse = callDeepSeekModel(modelInput);
|
|
|
+ stringBuilder.append("健康报告生成成功-》");
|
|
|
System.out.println(modelResponse);
|
|
|
- return null;
|
|
|
+
|
|
|
+ stringBuilder.append("健康报告推送成功。");
|
|
|
+ return stringBuilder.toString();
|
|
|
}
|
|
|
|
|
|
public Map<String, Object> callDeepSeekModel(Map<String, Object> modelInput) {
|
|
|
String url = "http://60.164.133.40:19997/v1/chat/completions";
|
|
|
-
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
|
|
- // 构造 messages 内容,将体征和病历转成文本拼接
|
|
|
- String prompt = "请根据以下患者生命体征信息和病历,仅生成【健康评估】与【健康指导】两部分内容的健康管理报告,禁止输出其他段落或模板内容:\n\n"
|
|
|
- + "体征数据:" + modelInput.get("patientInfo").toString() + "\n"
|
|
|
- + "病历数据:" + modelInput.get("medicalRecord").toString() + "\n\n"
|
|
|
- + "请按照如下格式输出:\n"
|
|
|
- + "一、健康评估:...\n"
|
|
|
- + "二、健康指导:...\n";
|
|
|
+ // 获取各部分数据
|
|
|
+ String patientInfo = String.valueOf(modelInput.get("patientInfo"));
|
|
|
+ String medicalRecord = String.valueOf(modelInput.get("medicalRecord"));
|
|
|
+ Object nearestObj = modelInput.get("nearest");
|
|
|
+
|
|
|
+ // 构建提示词
|
|
|
+ StringBuilder promptBuilder = new StringBuilder();
|
|
|
+ promptBuilder.append("请根据以下患者生命体征信息和病历,仅生成【健康评估】与【健康指导】两部分内容的健康管理报告,禁止输出其他段落或模板内容:\n\n");
|
|
|
+ promptBuilder.append("体征数据:").append(patientInfo).append("\n");
|
|
|
+ promptBuilder.append("病历数据:").append(medicalRecord).append("\n");
|
|
|
+
|
|
|
+ // 可选添加 RAG 知识库内容
|
|
|
+ if (nearestObj instanceof List && !((List<?>) nearestObj).isEmpty()) {
|
|
|
+ @SuppressWarnings("unchecked")
|
|
|
+ List<String> nearestList = (List<String>) nearestObj;
|
|
|
+ promptBuilder.append("相关知识片段:\n");
|
|
|
+ for (int i = 0; i < nearestList.size(); i++) {
|
|
|
+ promptBuilder.append(i + 1).append("、").append(nearestList.get(i)).append("\n");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 输出格式要求
|
|
|
+ promptBuilder.append("\n请按照如下格式输出:\n");
|
|
|
+ promptBuilder.append("一、健康评估:...\n");
|
|
|
+ promptBuilder.append("二、健康指导:...");
|
|
|
|
|
|
+ String prompt = promptBuilder.toString();
|
|
|
+
|
|
|
+ // 构造请求体
|
|
|
Map<String, Object> requestBody = new HashMap<>();
|
|
|
- requestBody.put("model", "qwen3-32B"); // 替换为你实际模型名
|
|
|
+ requestBody.put("model", "qwen3-32B");
|
|
|
requestBody.put("temperature", 0.5);
|
|
|
requestBody.put("max_tokens", 10240);
|
|
|
+ requestBody.put("stream", false);
|
|
|
+
|
|
|
Map<String, Object> chatTemplateKwargs = new HashMap<>();
|
|
|
chatTemplateKwargs.put("enable_thinking", false);
|
|
|
requestBody.put("chat_template_kwargs", chatTemplateKwargs);
|
|
|
- requestBody.put("stream", false);
|
|
|
|
|
|
+ // 构造 messages 数组
|
|
|
List<Map<String, String>> messages = new ArrayList<>();
|
|
|
Map<String, String> userMessage = new HashMap<>();
|
|
|
userMessage.put("role", "user");
|
|
|
userMessage.put("content", prompt);
|
|
|
messages.add(userMessage);
|
|
|
-
|
|
|
requestBody.put("messages", messages);
|
|
|
|
|
|
+ // 构造请求头
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
headers.setContentType(MediaType.APPLICATION_JSON);
|
|
|
|
|
|
HttpEntity<Map<String, Object>> entity = new HttpEntity<>(requestBody, headers);
|
|
|
|
|
|
+ // 执行请求
|
|
|
ResponseEntity<Map> response = restTemplate.postForEntity(url, entity, Map.class);
|
|
|
|
|
|
if (response.getStatusCode() == HttpStatus.OK) {
|