Files
platforms/docs/项目文档_用户端APP全量功能开发_v1.0.md

651 lines
40 KiB
Markdown
Raw 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 全量功能开发文档 v1.0
## 1. 项目概述
### 1.1 项目名称
瓶安芯用户端 App 产品设计落地与全量功能开发。
### 1.2 文档目标
本文档以 `doc/用户端APP-最新参考产品设计` 中 49 个主编号页面组、58 张 PNG 设计图为视觉事实源,结合现有 Flutter 用户端、Go Client API、平台总后台及正式需求指导研发完成以下工作
- 按设计图统一优化用户端 UI不改变已经确认的蓝白视觉方向。
- 保留现有真实登录、内容、商城、订单、合同、工单、钱包和地址能力。
- 补齐设备控制、安全闭环、押金、消息、发票、收藏、家庭共享和扩展服务能力。
- 完善用户端 Client API、平台后台配置、数据模型、状态机和异常处理。
- 建立逐页面验收、接口测试、Widget 测试和关键业务集成测试。
### 1.3 事实源优先级
发生冲突时按以下顺序处理:
1. 安全、支付、隐私、合同和设备控制的服务端规则。
2. `docs/03-用户端App需求.md``docs/02-核心业务流程.md``docs/11-数据接口与安全.md`
3. 本文档定义的接口与实施约束。
4. `doc/用户端APP-最新参考产品设计` 中对应页面设计图。
5. 当前 Flutter 页面实现。
设计图决定页面布局、信息层级和交互入口,不得用设计图中的示例金额、状态、日期或成功结果替代服务端事实。
### 1.4 当前状态
当前用户端已经具备以下真实基础能力:
- 手机号密码和验证码登录、注册、找回密码及会话失效处理。
- 首页公开内容、当前服务归属和下拉刷新。
- 公开商品列表、商城订单创建、订单列表、取消、支付、退款和确认收货。
- 供气合同列表、燃气订单列表、取消、支付和退款。
- 工单列表、创建、确认和取消。
- 用户资料、头像读取、地址列表与新增。
- 钱包余额、流水、充值、支付密码、银行卡和提现。
- 已发布内容查询和阅读确认。
当前用户端主要使用通用 `ClientRecord` 承载多个业务对象,页面集中在登录、首页、商城、订单、我的和两个记录列表,尚未形成与 58 张设计图对应的完整路由、领域模型和页面模块。
### 1.5 技术栈与运行环境
| 层级 | 当前技术 | 开发要求 |
| --- | --- | --- |
| 用户端 | Flutter、Dart 3.12、Material 3 | Android、iOS、Web 共用业务层,平台能力通过适配器隔离 |
| 路由 | `go_router` | 保留 `StatefulShellRoute.indexedStack` 四栏导航,二级页使用独立路由 |
| UI 基础 | `heqi_design_system` | 统一复用颜色、间距、圆角、按钮、状态和消息组件 |
| 网络 | `http`、现有 `ApiClient` | 保留统一响应解析、错误码和会话失效逻辑 |
| 安全存储 | `flutter_secure_storage` | 仅保存令牌及必要敏感临时凭据 |
| 支付 | `fluwx``tobias`、Web JSAPI | 客户端回传不推进支付事实,必须查询服务端状态 |
| 后端 | Go、Gin、GORM、PostgreSQL、Redis | 新接口继续放在 `/heqi/client/v1/user`,保持 v1 向下兼容 |
| 管理后台 | Vue 3、TypeScript、Arco Design | 补齐内容、通知、价格、规则和扩展服务配置 |
本地运行:
```bash
cd apps/user_app
flutter pub get
flutter run --dart-define=API_BASE_URL=http://10.0.2.2:12426
```
Release 环境必须通过 `--dart-define=API_BASE_URL=https://...` 注入 HTTPS API 地址。
## 2. 目录结构规划
在不破坏现有代码的前提下逐步扩展为按业务模块组织的结构:
```text
platforms/
├── apps/
│ ├── heqi_design_system/ # 多端共用设计 Token 和基础组件
│ └── user_app/
│ ├── lib/
│ │ ├── app/ # 启动、依赖、路由和根级守卫
│ │ ├── data/
│ │ │ ├── dto/ # Client API 请求与响应 DTO
│ │ │ ├── repositories/ # 领域仓储实现
│ │ │ └── services/ # HTTP、扫码、蓝牙、定位、推送和支付适配
│ │ ├── domain/
│ │ │ ├── models/ # 用户、设备、安全、内容、订单和资金模型
│ │ │ └── use_cases/ # 控阀、下单、退款、退押等关键业务编排
│ │ └── ui/
│ │ ├── core/ # 主题、公共状态页和可访问性组件
│ │ └── features/ # 按页面域拆分的 UI 和 ViewModel
│ ├── test/ # 单元、Widget 和契约测试
│ └── integration_test/ # 核心用户旅程测试
├── backend/
│ └── api/internal/
│ ├── models/ # 数据模型与迁移
│ ├── logic/client/user/ # 用户端 Client API 业务逻辑
│ └── routers/client.go # 用户端路由注册
├── frontend/platform_admin/ # 平台内容、规则和运营配置后台
├── doc/用户端APP-最新参考产品设计/ # 58 张视觉事实源
└── docs/ # 需求、技术、接口、验收和项目文档
```
迁移原则:先新增强类型 DTO、领域模型和 Feature不一次性删除 `ClientRecord`;旧页面完成迁移和回归后再清理无引用代码。
## 3. UI 优化实施规范
### 3.1 视觉基线
- 用户端主色使用 `HeqiColors.consumerPrimary`,值为 `#2563EB`
- 背景使用 `#F7F8FA`,成功、警告、危险色继续使用设计系统 Token。
- 间距以 4dp 为基础网格,页面水平安全边距默认 16dp。
- 触控区域不得小于 48dp主按钮高度使用 52dp。
- 一级页面保留“首页、商城、订单、我的”四栏底部导航;二级页面只保留返回导航。
- 禁止新增紫色、渐变、AI 元素、玻璃拟态、发光、Emoji 和无业务意义装饰。
- 业务图标优先使用 Material Icons商品、宣传和视频封面必须使用真实后台资源。
### 3.2 公共组件
`heqi_design_system` 或用户端 `ui/core` 中扩展以下组件,已存在的组件不得重复实现:
| 组件 | 用途 |
| --- | --- |
| `AppScaffold` | 统一 SafeArea、页面背景、标题栏和最大内容宽度 |
| `AsyncContent` | 统一 `initial/loading/content/empty/error/refreshing` 状态 |
| `StatusPill` | 订单、安全、设备、资金和阅读状态标签 |
| `SectionHeader` | 标题、说明和“查看全部”入口 |
| `ServiceRelationCard` | 所属气站与服务配送点展示 |
| `DeviceStatusCard` | 在线、阀门、电量、告警和更新时间 |
| `MoneyBreakdown` | 商品、优惠、运费、押金、退款和应付金额拆分 |
| `TimelineView` | 订单、配送、工单、安全事件和审核进度 |
| `SensitiveText` | 手机号、银行卡、证件和人员信息脱敏展示 |
| `EvidencePicker` | 图片、视频、定位和采集时间的受控取证 |
| `RiskConfirmationSheet` | 开阀、群控、解绑、退押和资金操作二次确认 |
### 3.3 页面状态要求
每个异步页面必须覆盖:
- 首次加载、骨架或进度状态。
- 正常内容、下拉刷新和分页加载。
- 空数据及明确的下一步入口。
- 网络失败、权限失败、会话失效和服务不可用。
- 写操作提交中、成功、失败、冲突、重复请求和结果待确认。
不得用 Toast 或静态成功页代替服务端最终状态。设备命令、支付、退款、提现和退押在无最终回执时只能显示“处理中”或“待确认”。
### 3.4 适配与无障碍
- 以 390×844 逻辑像素作为设计比对基准,同时验证 320、360、390、430 宽度。
- 文本缩放 1.3 倍时不得遮挡按钮、价格、状态和安全提示。
- 状态不能只依赖颜色,必须同时提供图标或文字。
- Tab、筛选、底部操作区和软键盘出现时不得导致内容重叠。
- Android 返回键、iOS 返回手势和 Web 浏览器前进后退必须保持路由一致。
## 4. 页面、路由与开发范围
状态说明:`保留优化` 表示已有主要 API 或页面;`接口扩展` 表示已有领域能力但不足以完成设计;`新增闭环` 表示需要新增用户端、Client API 和后台配置。
### 4.1 入口、首页与设备
| 编号 | 页面与设计图 | 建议路由 | 开发状态 | 主要工作 |
| --- | --- | --- | --- | --- |
| 01 | `01-登录页.png` | `/login` | 保留优化 | 对齐验证码/密码切换、协议、记住状态、忘记密码和错误定位 |
| 02 | `02-智能角阀功能介绍.png``02-1-安全案例.png``02-2-法律法规.png``02-3-气价信息.png` | `/onboarding/safety?tab=` | 接口扩展 | 内容版本、强制阅读、展示频率、气价信息和根级守卫 |
| 03 | `03-首页.png` | `/home` | 保留优化 | 合并服务归属、内容、设备摘要、快捷服务和公告入口 |
| 04 | `04-智能角阀控制.png` | `/devices/:identity` | 新增闭环 | 状态、遥测、安全检查、开关阀命令和最终回执 |
| 05 | `05-一键报修.png` | `/repairs/new` | 接口扩展 | 故障分类、证据、语音转写、地址、定位和紧急提示 |
| 06 | `06-1-扫码添加确认.png``06-2-蓝牙连接设备.png``06-3-手动输入设备码.png` | `/devices/add/:method` | 新增闭环 | 三种并存入口、设备校验、绑定确认和失败恢复 |
| 07 | `07-气瓶基本信息.png` | `/cylinders/:identity` | 新增闭环 | 气瓶规格、充装、制造、有效期、来源和异常提示 |
| 08 | `08-设备分组控制.png` | `/devices/groups` | 新增闭环 | 分组 CRUD、成员维护、逐设备群控结果和失败明细 |
| 09 | `09-安全告警与报警器.png` | `/safety/alarms` | 新增闭环 | 报警器状态、告警、测试、联动关阀和紧急电话 |
| 10 | `10-紧急联系人.png` | `/safety/contacts` | 新增闭环 | 联系顺序、通知渠道、设备查看/控制授权和审计 |
### 4.2 商城、押金与购买
| 编号 | 页面与设计图 | 建议路由 | 开发状态 | 主要工作 |
| --- | --- | --- | --- | --- |
| 11 | `11-燃气商城.png` | `/shop` | 保留优化 | 分类、搜索、商品卡、库存、收藏和购物车数量 |
| 12 | `12-商品详情.png` | `/shop/products/:identity` | 接口扩展 | 图片、规格、服务、售后、库存、收藏、加购和购买 |
| 13 | `13-购物车.png` | `/cart` | 接口扩展 | 选择、数量、删除、失效商品、价格试算和结算 |
| 14 | `14-提交订单.png` | `/checkout` | 接口扩展 | 地址、预约、优惠、费用、发票、备注和支付方式 |
| 15 | `15-我的收藏.png` | `/favorites` | 新增闭环 | 收藏列表、取消、下架保留和加入购物车 |
| 16 | `16-押金管理.png` | `/deposits` | 新增闭环 | 押金汇总、明细、使用中、退款中和已退回 |
| 17 | `17-退瓶退押金.png` | `/deposits/refund` | 新增闭环 | 对象选择、上门回收、验收、扣减和退款去向 |
| 18 | `18-气瓶下单.png` | `/gas-orders/new` | 新增闭环 | 气站、规格、库存、配送时段、换气和押金试算 |
| 19 | `19-支付确认.png` | `/payments/:identity` | 保留优化 | 渠道选择、余额密码、调起渠道和支付状态轮询 |
### 4.3 订单、配送与售后
| 编号 | 页面与设计图 | 建议路由 | 开发状态 | 主要工作 |
| --- | --- | --- | --- | --- |
| 20 | `20-订单中心.png` | `/orders` | 保留优化 | 气瓶/商城/报修聚合、状态筛选和可用操作 |
| 21 | `21-订单详情.png` | `/orders/:business/:identity` | 接口扩展 | 商品、金额、支付、合同、履约、人员和售后入口 |
| 22 | `22-配送详情.png` | `/orders/:business/:identity/delivery` | 接口扩展 | 配送员、车辆资质、受控联系、预约和交付状态 |
| 23 | `23-配送轨迹.png` | `/orders/:business/:identity/tracks` | 接口扩展 | 最近位置、简化轨迹、预计时间、更新时间和历史节点 |
| 24 | `24-电子发票.png` | `/invoices` | 新增闭环 | 可开票订单、抬头、申请、状态、预览和下载授权 |
| 35 | `35-安全记录详情.png` | `/safety/events/:identity` | 新增闭环 | 风险等级、关阀结果、证据、时间线、整改和复检 |
| 36 | `36-申请售后.png` | `/after-sales/new` | 接口扩展 | 类型、原因、方案、证据、联系人和退款审核 |
| 42 | `42-报修工单详情.png` | `/repairs/:identity` | 接口扩展 | 工单详情、进度、证据、工程师、改期、取消和确认 |
| 48 | `48-服务评价.png` | `/reviews/new` | 新增闭环 | 总体/分项评分、标签、凭证和安全交付确认 |
| 49 | `49-预约安全巡检.png` | `/inspections/new` | 新增闭环 | 服务、设备、日期时段、联系人、周期规则和取消改期 |
### 4.4 个人中心、账户与消息
| 编号 | 页面与设计图 | 建议路由 | 开发状态 | 主要工作 |
| --- | --- | --- | --- | --- |
| 25 | `25-个人中心.png` | `/me` | 保留优化 | 资料、钱包、订单、设备、安全家庭和常用入口 |
| 26 | `26-我的记录.png` | `/records` | 接口扩展 | 用气、设备、告警、报修、押金和发票聚合索引 |
| 27 | `27-用气统计.png` | `/usage` | 新增闭环 | 日周月年趋势、构成、安全趋势、明细和数据口径 |
| 28 | `28-我的钱包.png` | `/wallet` | 保留优化 | 余额、可提现余额、押金、充值、提现、银行卡和账单 |
| 29 | `29-地址管理.png` | `/addresses` | 接口扩展 | 列表、新增、编辑、删除、默认地址和服务范围校验 |
| 30 | `30-消息中心.png` | `/messages` | 新增闭环 | 安全、订单、服务、公告、已读和对象跳转 |
| 31 | `31-设置.png` | `/settings` | 接口扩展 | 账号、通知、权限、支付密码、协议、退出和注销 |
| 32 | `32-供气合同.png` | `/contracts` | 接口扩展 | 列表、详情、下载、签署、变更、到期和续签 |
| 33 | `33-家庭成员与设备共享.png` | `/family` | 新增闭环 | 成员邀请、设备范围、查看/控制授权和撤销 |
| 34 | `34-我的设备.png` | `/devices` | 新增闭环 | 搜索、筛选、分组、在线状态、快捷控制和添加 |
| 37 | `37-邀请注册.png` | `/invite/:token` | 接口扩展 | 邀请解析、登录/注册、地址确认、归属建立和异常提示 |
| 38 | `38-余额充值.png` | `/wallet/recharge` | 保留优化 | 套餐、自定义金额、渠道、限额和结果轮询 |
| 39 | `39-余额提现.png` | `/wallet/withdraw` | 保留优化 | 到账卡、金额、手续费、支付密码、审核和受限余额 |
| 40 | `40-银行卡管理.png` | `/wallet/banks` | 保留优化 | 列表、绑定、默认到账卡、实名校验和解绑二次确认 |
| 41 | `41-个人资料.png` | `/me/profile` | 接口扩展 | 头像、昵称、手机号、认证、服务归属和默认地址 |
### 4.5 内容、安全设置与扩展能力
| 编号 | 页面与设计图 | 建议路由 | 开发状态 | 主要工作 |
| --- | --- | --- | --- | --- |
| 43 | `43-安全内容中心.png``43-1-安全宣传.png``43-2-安全视频.png``43-3-法律法规.png``43-4-平台公告.png` | `/safety-content?tab=` | 接口扩展 | 宣传、视频、法规、公告、搜索、筛选、详情和阅读状态 |
| 44 | `44-自动关阀设置.png` | `/devices/:identity/close-schedules` | 新增闭环 | 规则、周期、提前提醒、启停、执行记录和告警优先 |
| 45 | `45-电子保修卡.png` | `/devices/:identity/warranty` | 新增闭环 | 保修期限、范围、服务商、维修记录和凭证 |
| 46 | `46-设备健康月报.png` | `/devices/:identity/reports/:period` | 新增闭环 | 健康评分、在线率、异常、趋势、来源和更新时间 |
| 47 | `47-安全知识考试.png` | `/safety/exams/:identity` | 新增闭环 | 题目版本、计时、进度、及格规则、提交和结果 |
## 5. Flutter 实施方案
### 5.1 分层与状态
- UI 只负责渲染与收集输入,不直接拼接接口请求。
- 每个 Feature 使用独立 ViewModel保持现有 `ChangeNotifier` 模式,状态对象不可变。
- Repository 返回强类型领域模型;新页面不得继续通过 `raw` Map 读取关键业务字段。
- 开阀、群控、支付、退款、退押和提现放入 Use Case统一处理幂等号、二次确认和状态轮询。
- 相机、相册、扫码、蓝牙、定位、推送、文件下载和支付均定义抽象接口,并分别提供 Android、iOS、Web 适配。
### 5.2 路由与守卫
- 根级公开路由:登录、注册、邀请解析、公开商品、公开内容。
- 登录保护路由:设备、订单、钱包、地址、合同、工单、消息、共享和个人资料。
- 首次宣导守卫在登录成功且会话恢复后执行;未完成当前强制版本阅读时跳转 `/onboarding/safety`
- 登录回跳只接受站内绝对路径,禁止外部 URL、协议相对路径和登录循环。
- 推送和深链只携带业务类型、对象 `identity` 和短期签名上下文,页面打开后重新读取服务端状态。
### 5.3 缓存策略
| 数据 | 缓存策略 |
| --- | --- |
| 内容、法规和公告 | 按内容版本和 ETag 缓存;后台上下架后允许失效 |
| 商品和分类 | 短时缓存;提交订单前必须重新询价和校验库存 |
| 服务归属 | 登录后缓存,切换地址、扫码邀请或服务关系变更后失效 |
| 设备遥测 | 仅保存最后展示快照,必须显示采集时间和数据延迟 |
| 订单、支付、资金、安全事件 | 本地只缓存展示数据,不得覆盖服务端事实 |
| 图片和视频 | 使用受控 URL、磁盘缓存上限和过期清理不持久化敏感取证资源 |
## 6. Client API 设计
### 6.1 通用约定
- 基础路径继续使用 `/heqi/client/v1/user`,现有接口不得改名或改变已有字段语义。
- 列表统一支持 `page``page_size`,响应包含 `items``page``page_size``total`;现有裸数组接口在兼容期继续返回原结构,新页面通过新增分页接口或 `view=page` 使用分页结构。
- 查询对象统一使用 UUID V7 `identity`,禁止向客户端暴露数据库自增主键。
- 时间使用 RFC 3339金额使用整数分数量使用明确单位。
- 写接口通过 `Idempotency-Key` 或请求体 `request_no` 保证幂等。
- 错误响应使用稳定业务码、中文安全文案和可选 `details`;前端不得解析英文错误文案驱动流程。
- 设备、资金、安全事件、合同和隐私数据全部执行服务端对象归属校验。
### 6.2 保留的现有接口
以下接口继续保持兼容,并按设计需要补充非破坏性字段:
| 接口族 | 现有能力 |
| --- | --- |
| `/auth/*` | 验证码、注册、登录、找回密码、资料、头像和修改密码 |
| `/public/gas-stations``/public/delivery-points` | 注册及邀请流程的服务组织选择 |
| `/public/contents` | 已发布内容列表和 `content_type` 筛选 |
| `/contents/read-confirmations` | 内容版本阅读确认 |
| `/public/products` | 已发布商品列表 |
| `/service-relation` | 当前所属气站和服务配送点 |
| `/gas/contracts``/gas/orders/*` | 供气合同、燃气订单、取消、支付和退款 |
| `/shop/orders/*` | 商城订单创建、列表、取消、支付、退款和确认收货 |
| `/tickets/*` | 工单列表、创建、确认和取消 |
| `/refunds` | 用户退款列表 |
| `/wallet/*` | 钱包、流水、充值、支付密码、银行卡和提现 |
### 6.3 内容与宣导接口
| 方法与路径 | 用途 | 实施类型 |
| --- | --- | --- |
| `GET /public/contents` | 增加关键词、分类、置顶、发布时间和服务范围筛选 | 扩展 |
| `GET /public/contents/:identity` | 内容详情,返回正文、媒体、版本和外链信息 | 新增 |
| `GET /contents/read-statuses` | 批量返回当前用户对内容版本的已读状态 | 新增 |
| `POST /contents/read-confirmations` | 保留现有阅读确认,增加展示场景字段 | 兼容扩展 |
| `GET /onboarding/current` | 返回当前宣导版本、标签、强制标志和展示频率 | 新增 |
| `GET /gas-prices/current` | 按服务归属返回气瓶价格、押金、配送费和更新时间 | 新增 |
内容类型保留现有 `notice``agreement`,新增 `onboarding``safety_case``safety_article``safety_video``regulation``price_notice`。未知历史类型不得静默转换。
### 6.4 设备与安全接口
| 方法与路径 | 用途 |
| --- | --- |
| `GET /devices` | 本人及已授权设备列表、筛选和设备摘要 |
| `GET /devices/:identity` | 设备详情、在线状态、阀门状态和最后更新时间 |
| `GET /devices/:identity/telemetry` | 当前遥测和趋势数据 |
| `POST /devices/verify` | 扫码或手工设备码预校验 |
| `POST /devices/bindings` | 确认安装地址、昵称和服务关系后绑定 |
| `DELETE /devices/:identity/binding` | 受限解绑,返回阻断原因和冷静期 |
| `POST /devices/:identity/commands` | 创建开阀、关阀或测试命令 |
| `GET /device-commands/:identity` | 查询命令投递、设备回执、失败或超时状态 |
| `GET/POST/PUT/DELETE /device-groups` | 设备分组及成员维护 |
| `POST /device-groups/:identity/commands` | 群控并返回逐设备结果 |
| `GET /devices/:identity/cylinder` | 当前关联气瓶及充装、制造和有效期信息 |
| `GET /alarm-devices` | 报警器列表、状态和最近告警 |
| `POST /alarm-devices/:identity/tests` | 发起报警器测试并查询结果 |
| `GET /safety/events` | 当前用户安全事件列表 |
| `GET /safety/events/:identity` | 事件详情、证据、处置和复检状态 |
| `POST /safety/events/:identity/rechecks` | 申请复检 |
| `GET/POST/PUT/DELETE /emergency-contacts` | 紧急联系人管理 |
| `PUT /emergency-contacts/:identity/permissions` | 通知顺序和设备查看/控制授权 |
| `GET/POST/PUT/DELETE /devices/:identity/close-schedules` | 自动关阀规则管理 |
| `GET /devices/:identity/close-schedules/executions` | 定时规则执行历史 |
设备命令响应必须包含 `command_identity``command_type``command_status``requested_at``sent_at``acknowledged_at``failure_code``failure_message``command_status` 至少支持 `pending``sent``acknowledged``failed``timeout``cancelled`
### 6.5 商城、气瓶、押金和支付接口
| 方法与路径 | 用途 |
| --- | --- |
| `GET /public/categories` | 商城一级分类和排序 |
| `GET /public/products` | 扩展关键词、分类、库存和分页,不破坏现有列表 |
| `GET /public/products/:identity` | 商品图片、规格、属性、服务和售后详情 |
| `GET/POST/PUT/DELETE /cart/items` | 购物车查询、加入、改量和删除 |
| `POST /cart/quote` | 库存、优惠、运费、服务费和押金试算 |
| `GET/POST/DELETE /favorites` | 收藏列表、添加和取消 |
| `POST /shop/orders/quote` | 商城结算前服务端询价 |
| `POST /gas/orders/quote` | 气站、气瓶规格、库存、换气和押金试算 |
| `POST /gas/orders` | 创建气瓶预约订单 |
| `GET /deposits` | 押金汇总和明细 |
| `POST /deposit-refunds/quote` | 按设备、气瓶和状态计算预计退款 |
| `POST /deposit-refunds` | 创建退瓶退押申请 |
| `GET /deposit-refunds/:identity` | 回收、验收、扣减和退款进度 |
| `GET /payments/:identity` | 查询统一支付尝试状态 |
金额响应至少拆分 `goods_amount``discount_amount``delivery_fee``service_fee``deposit_amount``payable_amount`。押金不能计入普通商品可开票收入。
### 6.6 订单、配送、售后和服务接口
| 方法与路径 | 用途 |
| --- | --- |
| `GET /orders` | 统一聚合商城、气瓶和报修订单摘要 |
| `GET /orders/:business/:identity` | 统一订单详情和允许操作 |
| `GET /orders/:business/:identity/delivery` | 配送人员、车辆、预约和交付状态 |
| `GET /orders/:business/:identity/tracks` | 本人订单的简化轨迹和历史节点 |
| `GET /tickets/:identity` | 用户工单详情、进度和证据 |
| `POST /tickets/:identity/reschedule` | 在规则允许时申请改期 |
| `POST /after-sales` | 创建完整售后申请 |
| `GET /after-sales/:identity` | 售后审核、退货、退款和处理记录 |
| `GET /invoices/eligible-orders` | 查询可开票订单和金额 |
| `POST /invoices` | 创建发票申请 |
| `GET /invoices/:identity` | 开具、作废、红冲和文件状态 |
| `POST /invoices/:identity/download-ticket` | 获取短期预览或下载凭证 |
| `POST /reviews` | 创建订单或服务评价,保证一单一次有效评价 |
| `GET /inspection-services` | 可预约巡检服务、规则和费用 |
| `POST /inspection-appointments` | 创建巡检预约 |
| `PUT /inspection-appointments/:identity` | 在规则允许时改期 |
| `DELETE /inspection-appointments/:identity` | 在规则允许时取消 |
轨迹响应只返回当前订单履约所需位置,不返回配送员非履约时间的个人轨迹。
### 6.7 用户、消息、共享与扩展接口
| 方法与路径 | 用途 |
| --- | --- |
| `PUT/DELETE /addresses/:identity` | 编辑、删除地址并校验默认地址约束 |
| `POST /addresses/:identity/default` | 设置默认地址 |
| `GET /messages` | 按安全、订单、服务和公告筛选消息 |
| `POST /messages/read` | 批量标记已读 |
| `GET/PUT /notification-preferences` | 通知偏好;安全通知不可关闭 |
| `GET /records/summary` | 我的记录各业务分类数量与最近记录 |
| `GET /usage-statistics` | 按日周月年返回用气量、单位、口径和更新时间 |
| `GET/POST/DELETE /family-members` | 家庭成员邀请、接受和移除 |
| `PUT /family-members/:identity/device-permissions` | 授予或撤销设备查看/控制权限 |
| `GET /devices/:identity/warranty` | 电子保修卡和维修历史 |
| `GET /devices/:identity/health-reports` | 健康月报列表和详情 |
| `GET /safety/exams/current` | 当前考试、题目版本和及格规则 |
| `POST /safety/exams/:identity/attempts` | 创建答题尝试 |
| `POST /safety/exam-attempts/:identity/submit` | 幂等提交并返回结果 |
| `POST /account/cancellation-requests` | 账号注销申请和阻断原因 |
## 7. 数据模型规划
### 7.1 内容域
现有 `cms_content` 保留 `content_type``title``body``version_no``publish_status`,通过迁移增加:
- `summary`:列表摘要。
- `category_code`:内容二级分类。
- `cover_uri`:受控封面资源。
- `video_uri``video_duration_seconds`:视频资源和时长。
- `external_url``external_domain`:法规或外部资料链接及展示域名。
- `published_at``effective_at`:发布时间和法规生效时间。
- `is_pinned``must_read``sort_no`:置顶、强制阅读和排序。
- `source_name`:发布来源。
新增 `cms_content_scope` 保存内容适用的平台、气站、配送点和服务区域;新增 `cms_content_media` 保存多媒体资源、排序、类型和完整性信息。阅读记录继续使用 `cms_content_read`,唯一约束保持“用户 + 内容 + 版本”。
### 7.2 用户、设备与安全域
| 实体 | 职责与关键字段 |
| --- | --- |
| `usr_device_binding` | 用户、设备、地址、昵称、绑定状态、来源和时间 |
| `usr_device_group` | 用户设备分组、名称、用途和排序 |
| `usr_device_group_member` | 分组和设备唯一关系 |
| `usr_emergency_contact` | 联系人、脱敏电话、通知顺序和启用状态 |
| `usr_device_share` | 所有者、成员、设备、查看/控制权限、有效期和撤销时间 |
| `dev_close_schedule` | 设备、执行时间、重复周期、提醒、时区和启停状态 |
| `dev_close_schedule_execution` | 每次调度、命令、回执和失败原因 |
| `saf_event` | 风险等级、来源设备、状态、自动关阀结果和 SLA |
| `saf_event_evidence` | 证据类型、受控 URI、采集时间、来源和哈希 |
| `dev_usage_stat` | 周期、用量、单位、数据来源、计算版本和更新时间 |
| `dev_health_report` | 报告周期、健康评分、在线率、异常和生成版本 |
| `dev_warranty` | 保修起止时间、范围、服务商和关联设备 |
### 7.3 交易、资金与服务域
| 实体 | 职责与关键字段 |
| --- | --- |
| `ec_favorite` | 用户与商品唯一收藏关系,下架后保留历史 |
| `wal_deposit` | 押金对象、规格、数量、单价、原始金额和状态 |
| `wal_deposit_refund` | 退押申请、预计金额、验收、扣减、实际退款和去向 |
| `ord_invoice` | 购买方、订单范围、可开票金额、状态和第三方回执 |
| `ord_invoice_file` | 发票文件、哈希、短期授权和版本 |
| `ord_after_sale` | 售后类型、原因、方案、审核和退款关系 |
| `ord_service_review` | 订单、服务人员、评分、标签和安全确认 |
| `ord_inspection_appointment` | 服务、设备、地址、日期、时段、周期和状态 |
| `msg_notification` | 消息类型、接收用户、对象、标题、正文、优先级和发送状态 |
| `msg_notification_read` | 用户消息阅读时间和设备信息 |
| `msg_notification_preference` | 用户通知渠道与免打扰配置 |
所有新增迁移必须为表和字段提供中文数据库 COMMENT枚举字段 COMMENT 必须列出所有允许值JSON 字段必须说明结构。
## 8. 平台总后台完善
平台后台不能只保留通用 `cms_content` 的“公告、协议”选择,需要扩展以下运营能力:
- 内容管理:类型、摘要、正文、封面、视频、法规链接、版本、适用范围、排序、置顶、强制阅读、草稿、发布和下架。
- 气价管理:气站、气瓶规格、商品价格、押金、配送费、有效期和变更记录。
- 安全规则:告警等级、自动关阀、开阀限制、紧急电话、通知升级和 SLA。
- 设备规则:绑定限制、分组上限、定时关阀、保修模板和健康报告口径。
- 消息与推送:模板、渠道、对象范围、跳转目标、发送状态和失败重试。
- 巡检服务:服务内容、可预约区域、时间段、周期、费用、改期和取消规则。
- 考试管理:题库、版本、考试时长、及格线、危险题约束和发布状态。
后台修改上述配置必须记录操作前后值、操作者、原因和发布时间。已被订单、报告、考试或阅读确认引用的版本不得物理删除。
## 9. 关键状态机与业务约束
### 9.1 设备命令
```text
pending -> sent -> acknowledged
-> failed
-> timeout
pending/sent -> cancelled仅服务端允许且设备尚未执行
```
开阀前服务端必须校验账户、设备归属、共享权限、在线状态、未解除高风险事件、传感器状态和安装条件。前端按钮禁用不能替代服务端校验。
### 9.2 订单与支付
- 订单状态和支付状态分离;订单创建成功不代表支付成功。
- 支付回调重复到达不得重复扣款、建单或推进履约。
- 支付超时、客户端退出或渠道返回未知结果时,页面轮询服务端支付状态。
- 商品、优惠、库存、押金和运费在提交前重新试算,客户端金额仅供展示。
### 9.3 押金退款
```text
draft -> submitted -> pickup_pending -> inspecting -> reviewing
-> refunded
-> rejected
-> cancelled
```
实际退款必须关联原始押金、回收对象、验收结果、扣减明细、审核记录和退款流水。
### 9.4 安全事件
```text
open -> acknowledged -> handling -> rectified -> recheck_pending -> closed
\-> escalated
```
安全事件不可由用户删除。高风险事件关闭前不得通过单设备、群控或定时规则重新开阀。
### 9.5 内容与考试
- 内容草稿不能进入用户端;发布新版本后按 `must_read` 和展示频率触发宣导。
- 法规外链跳转前展示域名与风险提示,只允许 HTTPS 和后台白名单域名。
- 考试尝试绑定题目版本;计时以服务端时间为准,提交操作幂等。
## 10. 安全、隐私与异常处理
- 用户只能读取本人、本人订单或明确授权家庭成员范围内的数据。
- 手机号、联系人、配送员、银行卡和证件默认脱敏;拨号使用受控联系能力。
- 定位只在用户主动选择地址、报修取证或查看本人配送订单时使用。
- 图片和视频上传校验扩展名、MIME、文件头、大小、完整解码和恶意内容下载使用短期授权。
- 日志、埋点、崩溃信息和剪贴板不得记录令牌、支付密码、完整手机号、地址、银行卡和精确定位。
- 401 及鉴权业务码继续由现有会话层统一清理,业务页面不得重复弹出英文错误。
- 429 展示稍后重试和剩余等待时间409 展示服务端当前状态和刷新入口;未知错误使用统一中文文案并保留 `request_id`
- 安全通知不可关闭;普通营销通知可按渠道关闭或进入免打扰时段。
## 11. 测试与验收
### 11.1 Flutter 测试
- Repository 测试:正常、空数据、错误码、分页、字段缺失和兼容旧响应。
- ViewModel 测试:加载、刷新、提交、防重复点击、失败恢复和会话失效。
- Widget 测试Tab、筛选、表单校验、键盘、长文本、文本缩放和无障碍语义。
- Golden 测试:以设计图归一化到 390×844对首页、四栏主页面、设备详情、内容中心和订单详情做像素比对。
- 集成测试:登录回跳、首次宣导、设备绑定、关阀/开阀、下单支付、订单配送、报修、退款、充值、提现和消息深链。
### 11.2 后端测试
- 路由测试覆盖匿名/登录、错误 Client claim、越权对象、归档对象和跨用户访问。
- 状态机测试覆盖非法跳转、重复请求、并发更新和超时恢复。
- 幂等测试覆盖订单、支付、退款、充值、提现、退押、报修、设备命令、内容确认和考试提交。
- 数据测试覆盖金额守恒、押金扣减、钱包流水、库存冻结、命令 Outbox 和审计日志。
- 上传测试覆盖伪造扩展名、超限文件、损坏媒体、病毒检测失败和过期授权。
### 11.3 UI 验收
每张设计图至少验证:
- 页面路由、返回行为和底部导航符合设计层级。
- 首屏结构、标题、间距、颜色、圆角、图标和主要信息层级与设计一致。
- 加载、空数据、错误、离线、无权限、禁用和长数据状态均可使用。
- 金额、单位、时间、更新时间、来源和状态来自真实接口。
- 危险操作有二次确认、明确阻断原因和最终回执。
- 320 至 430 宽度、Android、iOS 和 Web 不出现文字截断或控件重叠。
### 11.4 必跑命令
```bash
cd apps/user_app
flutter analyze
flutter test
flutter build apk --debug
flutter build ios --simulator --no-codesign
flutter build web --release --dart-define=API_BASE_URL=https://api.example.com
cd backend/api
go test ./...
go vet ./...
go build ./cmd/main
```
涉及平台后台时同时执行其类型检查、静态契约检查、单元测试和生产构建。
## 12. 分阶段交付
### 阶段 A基础架构与现有功能 UI 对齐
- 建立 Feature 目录、强类型 DTO、公共异步状态组件和完整路由骨架。
- 优化 01、03、11、14、19、20、25、28、29、32、37 至 42 页面。
- 保持现有 Client API 兼容,补齐详情、分页、地址编辑和支付状态查询。
完成标准现有真实能力全部可用Release 不出现静态成功功能,核心页面通过 Golden 与回归测试。
### 阶段 B设备安全闭环
- 开发 04 至 10、34、35、44 页面。
- 打通设备绑定、遥测、命令回执、告警、紧急联系人、分组和定时关阀。
- 完成高风险开阀拦截、自动关阀和审计链路。
完成标准:通过 AC-01 至 AC-05、AC-12、AC-15、AC-22 和 AC-25。
### 阶段 C交易、押金与服务履约
- 完善 12 至 18、21 至 24、36、48、49 页面。
- 打通购物车、收藏、气瓶下单、押金、配送详情、轨迹、发票、售后、评价和巡检预约。
完成标准:金额、库存、支付、履约、退押、退款和发票均以服务端事实为准,通过 AC-07、AC-11、AC-13、AC-14 和 AC-18。
### 阶段 D内容、消息与增值能力
- 完善 02、26、27、30、31、33、43、45、46、47 页面。
- 打通内容分类、气价、消息、家庭共享、保修、月报和考试后台配置。
完成标准:内容版本、阅读确认、通知偏好、授权撤销、报告口径和考试版本可追溯。
## 13. 上线与回滚
- 新接口、表字段和页面入口使用功能开关按用户、气站或区域灰度。
- 数据库迁移只新增表或可空字段;扩大枚举时先部署服务端兼容,再部署后台和 App。
- 旧 API 在至少一个稳定 App 版本周期内保留,禁止先删除再升级客户端。
- 设备控制、支付、押金和安全事件上线前完成故障演练、审计验证和人工回退流程。
- 回滚只关闭新入口和新写入,已产生的订单、资金、安全、阅读及审计事实继续可查。
## 14. 待确认事项
以下事项必须在对应阶段开发前确认:
1. 气价、押金和配送费的权威来源、适用区域、生效时间及历史版本。
2. 安全视频是宣教视频还是现场取证视频;两者必须使用不同权限和留存策略。
3. 法律法规外链白名单、地方适用范围和版本更新责任人。
4. 智能瓶阀厂商协议、设备证书、离线行为、命令回执和超时语义。
5. 开阀责任、自动关阀优先级、人工审批和安全事件关闭条件。
6. 微信、支付宝、余额支付及退款渠道的正式商户配置。
7. 退瓶验收、押金扣减、退款去向和争议处理规则。
8. 地图与受控联系供应商、轨迹刷新频率和定位留存周期。
9. 发票服务商、税务口径、文件授权和红冲流程。
10. 巡检服务范围、费用、周期、改期和取消规则。
未确认事项不得通过前端默认值固化为业务规则。
## 15. 核心文件说明
| 文件 | 职责 |
| --- | --- |
| `apps/user_app/lib/app/router.dart` | 当前用户端路由、四栏导航和鉴权回跳 |
| `apps/user_app/lib/data/services/api_client.dart` | HTTP、统一响应、业务错误和会话失效 |
| `apps/user_app/lib/data/repositories/client_repository.dart` | 当前用户端 Client API 访问入口 |
| `apps/user_app/lib/domain/models/client_models.dart` | 当前通用记录、用户和钱包模型 |
| `apps/user_app/lib/ui/core/app_theme.dart` | 用户端设计系统主题适配 |
| `apps/heqi_design_system/lib/src/tokens.dart` | 色彩、间距、圆角、尺寸和动效 Token |
| `backend/api/internal/routers/client.go` | 用户端和工作人员端 Client API 路由 |
| `backend/api/internal/logic/client/user/` | 用户端认证、内容、商城、订单、工单和服务归属逻辑 |
| `backend/api/internal/models/` | 现有业务数据模型和迁移注册 |
| `frontend/platform_admin/src/api/resources.ts` | 平台资源字段和内容管理配置 |
## 16. 维护指南
- 新页面先在本文件登记路由、业务对象、接口和验收,再进入开发。
- 新增接口必须同步请求/响应示例、错误码、鉴权范围和幂等要求。
- 新增状态值必须同时更新数据库 COMMENT、Go 常量、Flutter 枚举、后台中文映射和测试。
- 设计修改后只更新受影响页面及关联组件,不无关重构其他模块。
- 完成一个阶段后更新本文档版本、当前实现状态、测试结果和已知问题。
## 17. 变更记录
| 版本 | 日期 | 变更内容 |
| --- | --- | --- |
| v1.0 | 2026-09-06 | 根据 58 张最新参考设计图建立全量开发范围、路由、UI 规范、Client API、数据模型、测试和分阶段交付计划 |