2026年软件学院创新项目实训|智能居家养老健康守护系统·第六周工作博客
·
一、本周工作概述
本周小组围绕"AI Agent 核心能力完善 + 前端交互重构 + 健康数据可视化"三条主线推进开发,主要完成了以下工作:
- 后端——家属辅诊 Agent 开发与上下文聚合层实现:完成家属辅诊 Agent 的 Prompt 工程、绑定关系权限校验、多源数据上下文聚合(ElderlyContext)以及多轮会话管理机制,同时记录了 AI 辅助开发过程中的 Bug 排查与修复。
- 后端——多维度健康数据聚合与实时大屏接口:基于现有
elderly_health_data表,新增健康分析专用 Service 与 REST 接口,支持每日健康指标录入及 7 天/30 天/3 个月三维度图表聚合输出,已具备与前端联调条件。 - 前端——交互架构重构与聊天会话持久化对接:将导航架构从 5Tab 精简为 3Tab,重新设计 AI 对话页面,完成会话持久化前端对接,统一全站设计风格,并适配 JWT 鉴权机制。
二、具体工作内容
2.1 后端——家属辅诊 Agent 与上下文聚合层
(1)家属辅诊 Agent Prompt 工程
- 设计"家护"角色 System Prompt,面向中青年家属,语言风格定位为"专业简洁、信息密集",区别于老人端 Agent 的"亲切温和"
- 核心设计要点:侧重家属可执行的照护建议(饮食搭配、复诊提醒、用药监督);加入焦虑管控指令,避免因异常指标引发家属过度紧张;明确区分"数据显示"与"建议就医确认"
- Temperature 设为 0.4,在准确性与灵活性之间取平衡
- 经 AI 生成初版后人工迭代修复两个问题:去除过于自信的数据访问声明,防止模型编造数据;补充"区分确定/不确定"指令,优化异常指标的表述方式
(2)绑定关系权限校验
- 家属辅诊是系统中唯一涉及跨用户数据访问的模块,通过查询
elderly_family表(familyId+elderlyId+bindStatus=1)实现绑定校验,不通过则抛出 403 异常 - 校验逻辑放在 Service 层而非 Controller 层,确保无论从 Controller、定时任务还是其他 Service 调用都必须经过权限检查
- SSE 流式接口中,校验在建立 SSE 连接之前于主线程完成,确保异常能被 Spring 全局异常处理器正常捕获返回标准 JSON 错误
(3)多源数据上下文聚合层(ElderlyContext)
- 设计
ElderlyContext数据模型,涵盖基本信息、疾病史、当前用药、近期就诊记录、最新体征数据 - 实现
ElderlyContextService,从elderly、disease、medication_plan、medical_record、elderly_health_data五张表聚合数据,提供全量(getFullContext)和精简版(getBasicContext)两种接口 - 输出采用自然语言格式(中文标签分隔,如【疾病史】【当前用药】)而非 JSON,经测试对比在推理准确率和回复自然度上均优于 JSON 格式
- 家属端采用显式数据注入(“请基于这些数据回答”),老人端采用隐式注入(“不要主动提及已知信息”),体现跨角色设计差异
(4)多轮会话管理
- 所有 5 个 Agent 共享
ChatSessionService,通过agentType字段逻辑隔离 - 会话生命周期:首次请求
sessionId=null时自动创建,后续通过sessionId恢复历史 - 消息构建遵循 OpenAI 兼容接口标准范式:
system → user → assistant → ...
(5)AI 辅助开发中的 Bug 与修复
| Bug | 原因 | 修复方案 |
|---|---|---|
| verifyBinding 放在异步线程导致 403 无法被全局处理器捕获 | AI 将校验放在 executor.execute() lambda 内 | 将校验提到主线程,SSE 连接建立前执行 |
| medication_plan 关联查询 N+1 问题 | 每条用药记录单独查 disease 表 | 批量查出所有 disease 后内存关联,9 次查询降为 2 次 |
currentMedications 空列表输出不一致 | 只判了 null 没判 isEmpty() | 补充 isEmpty() 判断 |
| 会话并发写入导致消息顺序错乱 | 两个线程同时操作同一 ChatSession 的 messages 列表 | 基于 ConcurrentHashMap 对同一 sessionId 加轻量锁 |
2.2 后端——多维度健康数据聚合与实时大屏接口
(1)设计思路
采用"每日录入 + 按时间窗口聚合 + 图表结构直出"策略:
- 老人端每日提交当日检测值,后端按
(elderly_id, check_date)做 upsert,同日重复提交自动覆盖 - 查询时补全缺失日期(无数据日指标为 null),前端折线图可直接断点展示
- 同时输出
series(各指标时间序列)与summaries(最新值/均值/极值/有效采样天数),一次请求支撑折线图 + 指标卡片
(2)核心实现
- 数据模型复用现有
ElderlyHealthData实体,覆盖身高、体重、收缩压、舒张压、心率、血糖、体温 7 项指标 - 录入 DTO
HealthDataTodayRequest,checkDate由服务端固定为当天,防止客户端篡改 - 多时间维度支持
LAST_7_DAYS、LAST_30_DAYS、LAST_3_MONTHS三种范围枚举 - 图表响应结构
HealthAnalyticsChartResponse包含dateLabels、dailyPoints、series、summaries等字段,前端可直接绑定 ECharts 组件
(3)新增接口
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/health-analytics/today | 录入今日健康数据,同日覆盖更新 |
| GET | /api/health-analytics/today?elderlyId= | 查询今日是否已录入 |
| GET | /api/health-analytics/chart?elderlyId=&range= | 获取指定时间范围图表数据 |
2.3 前端——交互架构重构与聊天会话持久化对接
(1)导航架构优化(5Tab → 3Tab)
- 精简为"首页 / AI对话 / 我的"三个 Tab,将 AI 对话提升为核心入口
- 原"记录"和"用药"功能整合到"我的"页面,通过快捷入口访问
(2)AI 对话页面重构
- Agent 选择页采用网格卡片布局,点击直接进入对话
- 聊天界面优化气泡样式、Agent 切换弹窗、输入区域交互
- 会话管理支持历史会话列表查看、加载恢复、删除操作
(3)会话持久化前端对接
- 5 个 Agent 服务均已完成
listSessions()、getSession(id)、deleteSession(id)接口对接 - 数据流:发送消息 →
chatStream()流式响应 → 增量渲染;查看历史 →listSessions()→ 列表展示;加载历史 →getSession()→ 恢复对话上下文
(4)设计风格统一与 JWT 鉴权
- 统一全站页面结构规范(根类名、背景色、内容容器、导航栏等),已覆盖全部主要页面
- 实现 JWT Token 自动携带与 401 状态自动跳转登录页
三、联调验证情况
| 模块 | 验证项 | 状态 |
|---|---|---|
| 聊天会话持久化 | 创建/查看/加载/删除会话 | ✅ 通过 |
| 导航架构 | 3Tab 切换、Agent 切换弹窗 | ✅ 通过 |
| JWT 鉴权 | Token 存储、请求携带、401 跳转 | ✅ 通过 |
| 健康数据接口 | 待前端联调(接口契约已就绪) | ⏳ 待验证 |
四、待解决问题与风险
| 问题 | 当前状态 | 处理计划 |
|---|---|---|
| 健康分析接口尚未与 JWT 身份强绑定,存在越权查询风险 | 优先完成核心聚合逻辑 | 下周补充权限校验 |
| 健康指标数值范围校验(血压/心率/体温合理区间)未实现 | 录入仅校验 ID 非空 | 与产品/医学侧确认阈值后补充 |
| 缺少连续多日 mock 数据,不便验证折线图连续性 | 可通过 Swagger 连续调用或 SQL 脚本补数据 | 下周联调时补充 |
| 多轮对话 Token 超限风险 | 当前限制 max_tokens 为 2000 | 后续引入消息裁剪或摘要压缩 |
五、下周计划
- 前后端联调:与健康大屏/小程序前端完成
/api/health-analytics三个接口联调,验证 7天/30天/3个月切换与折线图、指标卡片展示效果 - 权限增强:补充健康分析接口的 JWT 身份校验与家属绑定关系校验,防止越权访问
- 数据校验:完善健康指标数值范围校验及录入完成度统计
- 可视化优化:增加健康数据的图表展示,提升数据可视化效果
- 稳定性提升:优化弱网环境下的用户体验,增加重试机制
- 协同推进:配合病历上传模块进度,视需要为家属端提供只读健康趋势查询能力
更多推荐



所有评论(0)