touyun-elderly-care/docs/superpowers/specs/2026-10-15-护理员APP-Flutter-design.md
liuyun fceb254571 docs: 护理员 APP Flutter 设计文档
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-15 08:41:29 +08:00

50 lines
3.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 护理员 APP(Flutter)· 设计文档
> 本文是护理员 APP 的设计背景,规范权威见 `openspec/changes/nurse-app-flutter/` 与 PRD §四(护理员移动端 APP)。
## Context
C0–C5 已落地后端(ec-nest)+ 机构管理后台(ec-admin)。护理员 APP(Flutter)是履约留痕的**录入主战场**——C3 的签到/签退/项目/照片/异常接口就是为它准备的。本期用 `nurse01` 测试账号 + `TY20261015` 测试机构验收。
## Goals / Non-Goals
**Goals**:登录、M1 今日任务、M2 服务执行(签到→勾项目→拍照→签退)、拍照分档(必拍强制+压疮标签+拒拍出路)、异常上报(9 宫格)、扑空(未遇)、离线队列+自动补传。
**Non-Goals**:家属端(UniAPP)、质控/派单(APP 不做,PRD 明确「改计划是质控员的事,APP 不提供」)、结算金额展示(本期无结算)。
## Decisions
1. **技术栈**:Riverpod(状态管理)+ dio(HTTP)+ sqflite(本地离线队列)+ go_router(路由)。shared_preferences 存 token。
2. **目录**:feature-first——`lib/core/`(api/db/router/theme/auth)+ `lib/features/{auth,today,service,abnormal}/`。
3. **API 对接**:base `http://localhost:3000/api/v1`(`--dart-define` 可覆盖);统一响应 `{code,message,data}`,`code=0` 成功、非 0 抛业务错误(`message` 含规则号如 3001/1001);token 走 `Authorization: Bearer`。
4. **离线队列**:签到/签退/勾项目/照片/异常全部本地 sqflite 落队 + 生成 `client_md5`;联网后 `POST /record/offline/sync` 幂等补传(md5 去重);照片文件本地暂存、补传后保留 ≥7 天。
5. **服务器取时**:签到/签退时间**不传**(后端生成);定位失败不阻塞(标「未获取」);必拍未拍后端 3001 硬拒 → APP 在签退按钮前置校验 + 拒拍出路(选原因放行)。
6. **措辞纪律**:留痕口径「签到/签退/服务执行」,禁用「打卡/考勤」;异常上报不禁用「报警」。
## 数据流
- 登录(租户 code + 账号 + 密码)→ token 落 shared_preferences → 之后请求带 token。
- M1:`GET /order/today` → 今日工单卡片(老人/时段/项目/状态)。
- M2:点卡片 → 签到 `POST /record/checkin`(定位+自动时间)→ 勾项目 `POST /record/item/save`(默认全勾 done,`exec_result ∈ done/undo_not_done/undo_refused`)→ 拍照 `POST /record/photo/upload`(必拍强制+压疮标签+拒拍出路)→ 签退 `POST /record/checkout`。
- 异常:`POST /abnormal`(abnormal_type 必选,其余可选)。
- 扑空:`POST /abnormal`(abnormal_type=not_met + 到访时间/定位/原因必留)→ 工单转 not_met。
- 离线:本地队列 + `client_md5` + `POST /record/offline/sync`。
## 界面(大字 ≥20pt、常态 ≤3 击、首屏即任务)
- 登录页:租户/账号/密码。
- 今日任务:卡片列表(今日待办 + 已完成 + 未遇),点卡片进服务执行。
- 服务执行:签到超大按钮 → 项目勾选列表(默认全勾)→ 签退超大按钮(必拍项未拍则禁用+提示)。
- 异常上报:9 宫格分类(必选)+ 描述/语音/照片(可选)。
- 扑空:未遇按钮 → 到访时间(自动)/定位(自动)/原因(必选下拉)。
## Risks / Trade-offs
- [离线补传幂等] → client_md5 唯一 + 后端幂等。
- [必拍未拍] → 前端签退前置校验 + 后端 3001 双保险。
- [照片体积] → 前端压缩 ≤500KB 再传。
## 验收(用 TY20261015 测试机构)
`nurse01` 登录 → 看到张护理今日工单 → 签到 → 勾项目 → 拍照 → 签退 → 后端留痕 submitted;异常上报/扑空落库;断网签到 → 恢复联网补传。