# 通知设置改造设计 ## 目标 让通知设置展示真实的服务端状态,保存失败时明确提示并恢复原值;将五个健康指标开关收纳到底部选择弹窗中,同时修复通知总开关未真正参与后端投递判断的问题。 ## 页面结构 主页面保持四个区域:通知总开关、通知类型、健康录入提醒、免打扰时段。 健康录入提醒区域只展示: - “每日健康录入提醒”总开关。 - “提醒指标”入口,副标题展示当前已选指标摘要。 点击“提醒指标”后打开底部弹窗。弹窗使用复选框选择血压、心率、血糖、血氧和体重,至少保留一项,点击“保存”后一次性提交全部指标设置。 ## 状态与保存 前端使用明确的通知偏好状态对象,不再直接使用无类型的 Map。状态区分首次加载、单项保存、指标批量保存和错误信息。 - 首次加载成功后才展示设置内容。 - 首次加载失败展示错误页和重试按钮,不使用默认值冒充服务端数据。 - 普通开关修改时只锁定当前操作,后端成功后采用响应中的完整偏好更新页面。 - 保存失败恢复原值并显示错误提示。 - 指标弹窗先维护本地草稿,点击保存时一次提交五个字段,避免连续请求和部分成功。 - 免打扰时间采用相同的真实保存与失败恢复规则。 ## 后端行为 保留现有 `/api/notification-prefs` GET 和 PUT 接口。PUT 继续支持部分字段更新并返回保存后的完整偏好。 通知发送管线必须优先检查 `PushEnabled`。总开关关闭时,不生成或投递任何用户通知;健康录入、用药、随访、医生回复和异常提醒继续读取各自开关,免打扰规则继续生效。 ## 错误处理 - 网络或服务错误显示后端可读信息,无法解析时使用统一提示。 - 保存过程中禁止同一设置重复提交。 - 指标未选择任何一项时,弹窗内提示至少选择一项,不发送请求。 - 后端返回失败时不显示成功状态。 ## 测试 - Flutter 单元测试覆盖偏好解析、指标摘要、至少选择一项和失败回滚。 - Flutter 组件测试覆盖加载失败、指标弹窗批量选择和保存中禁用。 - 后端测试覆盖 `PushEnabled=false` 时所有通知类型均不投递,以及各分类开关和免打扰继续生效。 - 运行 `flutter analyze`、Flutter 全量测试和相关 .NET 测试。