陈昶聿
9 小时以前 554b43b55ab6f50721f3ceb04ab9650950fdb9f7
【丽水】去掉入科-经管医生
已删除1个文件
已修改2个文件
已添加1个文件
232 ■■■■■ 文件已修改
.idea/encodings.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/DeepSeekApi.java 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/common/DeepSeekApi.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/encodings.xml
@@ -39,7 +39,8 @@
    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/ruoyi-system/src/main/resources" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/DeepSeekApi.java" charset="GBK" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/common/DeepSeekApi.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/common/DeepSeekApi.java" charset="GBK" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/domain/PatMedOuthospProvisional.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/domain/ServiceSubtaskPreachform.java" charset="UTF-8" />
    <file url="file://$PROJECT_DIR$/smartor/src/main/java/com/smartor/mapper/PatMedOuthospProvisionalMapper.java" charset="UTF-8" />
smartor/src/main/java/com/smartor/DeepSeekApi.java
ÎļþÒÑɾ³ý
smartor/src/main/java/com/smartor/common/DeepSeekApi.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.smartor.common;
;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.util.*;
@Slf4j
public class DeepSeekApi {
    // æ›¿æ¢ä¸ºä½ è‡ªå·±çš„key
    private static final String API_KEY = "sk-4e489637e105411596be6c72e2dacdbd";
    private static final String API_URL = "https://api.deepseek.com/v1/chat/completions";
    public static void main(String[] args) {
        String questionText = "您好,请问您是患者本人还是家属?\n";
        String voiceText = "我自己";
        List<String> options = new ArrayList<>(Arrays.asList("本人","亲属","其他"));
        Integer resp = matchOptionIndex(questionText, voiceText, options);
        System.out.println("DeepSeek返回结果:\n" + resp);
    }
    public static String chatCompletion(String systemPrompt, String userPrompt) {
        OkHttpClient client = new OkHttpClient();
        // 1. ç»„装消息体
        List<Map<String, String>> messages = new ArrayList<>();
        // ç³»ç»Ÿè§’色(可选,用于设定AI身份)
        Map<String, String> sysMsg = new HashMap<>();
        sysMsg.put("role", "system");
        sysMsg.put("content", systemPrompt);
        messages.add(sysMsg);
        // ç”¨æˆ·æé—®
        Map<String, String> userMsg = new HashMap<>();
        userMsg.put("role", "user");
        userMsg.put("content", userPrompt);
        messages.add(userMsg);
        // 2. è¯·æ±‚参数
        Map<String, Object> requestBody = new HashMap<>();
        requestBody.put("model", "deepseek-chat");
        requestBody.put("messages", messages);
        requestBody.put("temperature", 0.7); // éšæœºæ€§0~1,越低越严谨
        requestBody.put("max_tokens", 1024);
        // 3. æž„建请求
        String jsonBody = JSON.toJSONString(requestBody);
        RequestBody body = RequestBody.create(MediaType.parse("application/json"), jsonBody);
        Request request = new Request.Builder()
                .url(API_URL)
                .header("Authorization", "Bearer " + API_KEY)
                .header("Content-Type", "application/json")
                .post(body)
                .build();
        // 4. å‘送请求
        try (Response response = client.newCall(request).execute()) {
            if (!response.isSuccessful()) {
                return "请求失败,状态码:" + response.code() + ",错误信息:" + response.body().string();
            }
            String resJson = response.body().string();
            JSONObject jsonObj = JSON.parseObject(resJson);
            // æå–AI回答内容
            return jsonObj.getJSONArray("choices")
                    .getJSONObject(0)
                    .getJSONObject("message")
                    .getString("content");
        } catch (IOException e) {
            e.printStackTrace();
            return "接口调用异常:" + e.getMessage();
        }
    }
    /**
     * åˆ¤æ–­è¯­éŸ³æ–‡æœ¬æœ€æŽ¥è¿‘哪个选项,返回选项在列表中的下标。
     *
     * @param voiceText è¯­éŸ³è¯†åˆ«å¾—到的文本
     * @param options   å€™é€‰é€‰é¡¹åˆ—表
     * @return å‘½ä¸­é€‰é¡¹çš„下标(从 0 å¼€å§‹ï¼‰ï¼›æ— æ³•匹配任一选项时返回 {@code -1}
     */
    public static int matchOptionIndex(String questionText, String voiceText, List<String> options) {
        if (StringUtils.isBlank(voiceText) || options == null || options.isEmpty()) {
            return -1;
        }
        // åªæœ‰ä¸€ä¸ªé€‰é¡¹æ—¶æ— éœ€è°ƒç”¨æ¨¡åž‹
        if (options.size() == 1) {
            return 0;
        }
        StringBuilder optionText = new StringBuilder();
        for (int i = 0; i < options.size(); i++) {
            optionText.append(i + 1).append(". ").append(options.get(i)).append('\n');
        }
        String systemPrompt = "\"你是一个专业的语音识别文本语义匹配助手。你的任务是判断用户的语音文本在语义上最符合的选项。用户会给出一段语音识别文本和若干个带编号的选项,"
                + "请判断这段文本在语义上最接近哪一个选项。只允许从给定选项中选择,"
                + "不要做任何解释。直接输出最匹配选项的编号数字;若没有任何选项与文本相关,则输出 0。";
        String userPrompt = "请根据以下信息进行语义匹配判断:\n" +
                "- é—®é¢˜æ–‡æœ¬ï¼š" + questionText + "\n\n"
                + "- è¯­éŸ³è¯†åˆ«æ–‡æœ¬ï¼š" + voiceText + "\n\n"
                + "- é€‰é¡¹ï¼š\n" + optionText
                + "\n请只输出一个数字(最匹配选项的编号,没有匹配则输出 0)。";
        String content = chatCompletion(systemPrompt, userPrompt);
        if (StringUtils.isBlank(content)) {
            return -1;
        }
        Integer number = extractFirstNumber(content);
        if (number == null || number <= 0 || number > options.size()) {
            log.warn("DeepSeek é€‰é¡¹åŒ¹é…æœªå‘½ä¸­ï¼ŒvoiceText={}, options={}, modelReturn={}", voiceText, options, content);
            return -1;
        }
        return number - 1;
    }
    /**
     * ä»Žæ¨¡åž‹å›žå¤ä¸­æå–第一个整数。模型偶尔会回复 â€œé€‰é¡¹2” â€œ2。” ä¹‹ç±»ï¼Œåšä¸€æ¬¡å…œåº•解析。
     */
    private static Integer extractFirstNumber(String text) {
        List<Character> digits = new ArrayList<>();
        for (int i = 0; i < text.length(); i++) {
            char c = text.charAt(i);
            if (c >= '0' && c <= '9') {
                digits.add(c);
            } else if (!digits.isEmpty()) {
                break;
            }
        }
        if (digits.isEmpty()) {
            return null;
        }
        StringBuilder sb = new StringBuilder();
        for (char c : digits) {
            sb.append(c);
        }
        try {
            return Integer.parseInt(sb.toString());
        } catch (NumberFormatException e) {
            return null;
        }
    }
}
smartor/src/main/java/com/smartor/service/impl/ServiceExternalServiceImpl.java
@@ -434,12 +434,6 @@
        ExternalInHospPatientInfo externalInHospPatientInfo = BeanUtil.mapToBean(BingRenXX, ExternalInHospPatientInfo.class, true);
        ExternalInDeptPatientInfo externalInDeptPatientInfo = BeanUtil.mapToBean(RuKeXX, ExternalInDeptPatientInfo.class, true);
        ExternalInDeptPatientInfo externalJZInfo = BeanUtil.mapToBean(JiuZhenXX, ExternalInDeptPatientInfo.class, true);
        if(ObjectUtils.isNotEmpty(externalJZInfo)){
            externalInHospPatientInfo.setJingGuanYSID(externalJZInfo.getJingGuanYSID());
            externalInHospPatientInfo.setJingGuanYSXM(externalJZInfo.getJingGuanYSXM());
        }
        externalInHospPatientInfo.setZeRenHSID(externalInDeptPatientInfo.getZeRenHSID());
        externalInHospPatientInfo.setZeRenHSXM(externalInDeptPatientInfo.getZeRenHSXM());
        externalInHospPatientInfo.setZhuZhiYSID(externalInDeptPatientInfo.getZhuZhiYSID());