山东大学软件学院项目实训-创新实训-医院自助服务系统(五)———智能扫描与智能医生联动功能开发
开发时间: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报告导出
- ✅ 分析历史记录
- ✅ 智能扫描与智能医生联动(本期)
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)