开发时间:2026.5.10-5.17

 一、前言

大家好,这是我们“智愈”医疗自助服务系统的第五篇开发博客。在上一期中,我们完成了药品购买跳转和分析历史记录功能。本期我将重点介绍智能扫描与智能医生的联动功能——让AI诊断结果能够无缝衔接到智能医生对话中,实现从“识别”到“咨询”的服务闭环。

 二、本期功能概述

诊断结果联动: 智能扫描分析完成后,一键跳转智能医生 
上下文传递: 诊断结果自动带入智能医生对话 
消息预填:诊断报告内容自动填充到输入框,用户确认后发送 
智能追问:基于诊断结果提供“询问用药”、“询问预防”等快捷追问 

三、功能设计思路

3.1 为什么需要联动?

在之前的版本中:
- 智能扫描:可以识别诊断书,输出结构化分析结果
- 智能医生:可以回答用户的各种医疗问题

问题:两个功能是独立的。用户拿到诊断结果后,需要手动输入大量信息才能咨询医生,体验不佳。

3.2 解决方案

实现数据流转:
智能扫描分析结果 → URL参数传递 → 智能医生页面 → 自动填充到输入框 → 用户确认后发送

四、技术实现

4.1 智能扫描页面:添加咨询按钮与数据传递

在 medical-scan.html中添加“咨询智能医生”按钮:

<button class="btn btn-primary" onclick="consultDoctor()" id="consultBtn" style="display: none;">
    <i class="fa fa-stethoscope"></i> 咨询智能医生
</button>

数据传递函数:

function consultDoctor() {
    if (!currentAnalysisData) {
        layer.msg('没有可咨询的分析结果', {icon: 2});
        return;
    }

    // 提取关键信息用于对话上下文
    const consultContext = {
        patientName: currentAnalysisData.patient_name || '未知',
        primaryDiagnosis: currentAnalysisData.diagnosis?.primary_diagnosis || '未知',
        symptoms: currentAnalysisData.symptoms || [],
        medications: currentAnalysisData.medications || [],
        recommendations: currentAnalysisData.recommendations || ''
    };

    // 通过URL参数传递(Base64编码)
    const encodedContext = encodeURIComponent(JSON.stringify(consultContext));
    window.location.href = `/doctor?consultContext=${encodedContext}`;
}

分析完成后显示咨询按钮:

function displayAnalysisResult(data) {
    // ... 原有渲染逻辑 ...
    
    // 显示咨询按钮
    document.getElementById('consultBtn').style.display = 'inline-block';
}

4.2 后端:接收咨询上下文

修改SystemController.java中的 /doctor 接口:

@GetMapping("/doctor")
public String doctor(Map<String, Object> map,
                     @RequestParam(required = false) String consultContext,
                     HttpSession session) {
    if (Assert.isEmpty(loginUser)) {
        return "redirect:/index.html";
    }
    
    // 保存咨询上下文到session(备用)
    if (consultContext != null && !consultContext.isEmpty()) {
        session.setAttribute("consultContext", consultContext);
    }
    
    return "doctor";
}

4.3 智能医生页面:接收并填充消息在doctor.html中实现:

// 页面加载时检查是否有咨询上下文
$(document).ready(function() {
    checkConsultContext();
});

function checkConsultContext() {
    const urlParams = new URLSearchParams(window.location.search);
    let consultContext = urlParams.get('consultContext');

    if (consultContext) {
        try {
            const context = JSON.parse(decodeURIComponent(consultContext));
            fillInputWithConsultMessage(context);
        } catch(e) {
            console.error('解析咨询上下文失败', e);
        }
    }
}

// 填充消息到输入框(不自动发送)
function fillInputWithConsultMessage(context) {
    const userMessage = buildUserMessage(context);
    
    // 填充到输入框
    $('#message').val(userMessage);
    
    // 提示用户
    layer.msg('诊断报告已整理,点击"发送"咨询智能医生', {icon: 1, time: 3000});
    
    // 聚焦输入框
    $('#message').focus();
    
    // 选中文本(方便用户修改)
    $('#message')[0].select();
}

// 构建咨询消息
function buildUserMessage(context) {
    let message = `我有一份诊断报告想咨询一下:\n\n`;
    message += `患者:${context.patientName}\n`;
    message += `诊断:${context.primaryDiagnosis}\n`;

    if (context.symptoms && context.symptoms.length > 0) {
        message += `症状:${context.symptoms.join('、')}\n`;
    }

    if (context.recommendations) {
        message += `医生建议:${context.recommendations}\n`;
    }

    message += `\n请帮我分析一下这个诊断结果,并给出更详细的建议。`;
    return message;
}

4.4 智能追问功能

 function askAboutMedication() {
        if (!currentConsultContext) {
            layer.msg('没有可用的诊断上下文,请先上传诊断书', {icon: 2});
            return;
        }

        // 基于诊断结果构建追问消息
        const question = `根据我的诊断结果(${currentConsultContext.primaryDiagnosis}),有什么用药建议?`;
        $('#message').val(question);
        send();  // 调用 custom.js 中的 send() 函数
    }

    // 询问预防建议
    function askAboutPrevention() {
        if (!currentConsultContext) {
            layer.msg('没有可用的诊断上下文,请先上传诊断书', {icon: 2});
            return;
        }

        // 基于诊断结果构建追问消息
        const question = `根据我的诊断结果(${currentConsultContext.primaryDiagnosis}),平时需要注意什么?如何预防病情加重?`;
        $('#message').val(question);
        send();
    }

    // 询问饮食建议
    function askAboutDiet() {
        if (!currentConsultContext) {
            layer.msg('没有可用的诊断上下文,请先上传诊断书', {icon: 2});
            return;
        }

        const question = `根据我的诊断结果(${currentConsultContext.primaryDiagnosis}),饮食上有什么需要注意的?`;
        $('#message').val(question);
        send();
    }

    // 询问康复周期
    function askAboutRecovery() {
        if (!currentConsultContext) {
            layer.msg('没有可用的诊断上下文,请先上传诊断书', {icon: 2});
            return;
        }

        const question = `根据我的诊断结果(${currentConsultContext.primaryDiagnosis}),大概需要多长时间康复?有什么康复建议?`;
        $('#message').val(question);
        send();
    }

五、交互流程

 六、核心代码结构
smart-medicine/
├── src/main/java/world/
│   ├── controller/
│   │   ├── MedicalScanController.java      # 智能扫描API
│   │   ├── SystemController.java           # 页面路由(接收consultContext)
│   │   └── MessageController.java          # 智能医生对话API
│   └── service/
│       ├── MedicalRecordAnalysisService.java # 诊断书分析
│       └── ApiService.java                  # 通义千问对话
└── src/main/resources/templates/
    ├── medical-scan.html                    # 智能扫描页面
    └── doctor.html                          # 智能医生页面

七、效果展示

8.1 智能扫描完成页面(新添加咨询智能医生选项跳转)

 8.2 自动填充消息

跳转到智能医生页面后,诊断报告内容自动填充到输入框:

8.3 AI医生回复

用户点击发送后,AI医生基于诊断结果给出详细建议:

8.4 快捷追问

AI回复下方附带“询问用药”、“询问预防等”快捷按钮:

九、可能的后续优化计划



对话历史保存:保存用户与AI医生的完整对话记录 
诊断报告复用:支持从历史记录直接发起新的咨询 
多轮对话上下文:AI能记住对话历史,支持多轮深入讨论 
语音输入: 支持语音输入咨询内容 

十、总结

本期开发完成了智能扫描与智能医生的联动功能:

1. 数据传递:诊断结果通过URL参数无缝传递到智能医生页面
2. 消息预填:自动构建咨询消息并填充到输入框,用户确认后发送
3. 快捷追问:基于诊断结果提供“询问用药”、“询问预防”等快捷按钮
4. 交互优化:输入框自动聚焦、文本选中、提示消息等细节优化

至此,“智愈”医疗自助服务系统的核心功能已基本完善:
- ✅ 疾病百科与药品查询
- ✅ 智能医生对话
- ✅ 智能诊断书扫描
- ✅ PDF报告导出
- ✅ 分析历史记录
- ✅ 智能扫描与智能医生联动(本期)

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐