# 云函数 API 接口清单

基于 `软件系统说明.docx` 整理。本文档用于把已知云函数职责推进到“接口草案”层，便于后续继续拆成真实路由和字段定义。

本文档仍然遵循一个原则：不把文档未确认的 URL、字段值、错误码和业务规则写成既定事实。以下内容中的“建议”是为了便于继续设计，不代表已定方案。

## 已确认云端职责

文档已确认云函数负责：

- 用户认证（微信登录）
- 设备绑定/解绑
- 订阅管理
- 护理记录同步
- 设备注册（动态获取 `DeviceSecret`）
- 试用订阅管理
- 数据统计

## 设计目标

当前阶段，这份接口文档的目标不是给出最终 API，而是统一以下边界：

- 哪些接口是一定需要的
- 每类接口由谁调用
- 每类接口最少要交换哪些信息
- 每类接口执行时会影响哪些业务对象

## 调用方划分

当前系统至少存在四类调用方：

- 小程序
- 管理后台
- 设备或设备接入链路
- 云内部任务或异步处理链路

## 建议接口分组

### 1. 认证接口

至少需要：

- 微信登录
- Token 校验或续期
- 当前用户信息查询

### 2. 设备接口

至少需要：

- 设备绑定
- 设备解绑
- 当前绑定设备查询
- 设备详情查询

### 3. 订阅接口

至少需要：

- 当前订阅状态查询
- 试用订阅发放
- 订阅列表查询
- 订阅创建或续期

### 4. 护理记录接口

至少需要：

- 护理记录上传
- 护理记录列表查询
- 单条护理记录详情查询

### 5. 设备注册与 IoT 接口

至少需要：

- 设备注册
- `DeviceSecret` 下发
- 设备状态同步或查询

### 6. 统计接口

至少需要：

- 用户统计
- 设备统计
- 治疗统计
- 订阅统计

## 接口命名草案

下表中的“接口标识”仅用于当前设计阶段统一讨论，不代表最终路由。

| 分组 | 接口标识 | 主要调用方 | 文档是否确认需要 | 说明 |
| --- | --- | --- | --- | --- |
| 认证 | `auth.wx_login` | 小程序 | 是 | 微信登录换取系统身份 |
| 认证 | `auth.refresh_token` | 小程序 | 间接确认 | Token 续期 |
| 认证 | `auth.get_profile` | 小程序 | 间接确认 | 获取当前用户基础信息 |
| 设备 | `device.bind` | 小程序 | 是 | 绑定设备 |
| 设备 | `device.unbind` | 小程序 / 后台 | 是 | 解绑设备 |
| 设备 | `device.get_current_binding` | 小程序 | 间接确认 | 查询当前绑定设备 |
| 设备 | `device.get_detail` | 小程序 / 后台 | 间接确认 | 查询设备详情 |
| 订阅 | `subscription.get_current` | 小程序 | 间接确认 | 查询当前订阅状态 |
| 订阅 | `subscription.grant_trial` | 云内部任务 / 小程序链路 | 是 | 发放 7 天试用 |
| 订阅 | `subscription.list` | 后台 | 间接确认 | 查询订阅列表 |
| 订阅 | `subscription.create_or_renew` | 后台 | 是 | 创建或续期订阅 |
| 护理记录 | `record.sync` | 小程序 / 设备链路 | 是 | 同步护理记录 |
| 护理记录 | `record.list` | 小程序 / 后台 | 间接确认 | 查询护理记录列表 |
| 护理记录 | `record.detail` | 小程序 / 后台 | 间接确认 | 查询护理记录详情 |
| IoT | `iot.register_device` | 设备链路 / 云内部任务 | 是 | 注册设备 |
| IoT | `iot.issue_device_secret` | 设备链路 / 云内部任务 | 是 | 下发 `DeviceSecret` |
| IoT | `iot.get_device_status` | 后台 / 云内部任务 | 间接确认 | 查询设备状态 |
| 统计 | `stats.user_overview` | 后台 | 是 | 用户统计 |
| 统计 | `stats.device_overview` | 后台 | 是 | 设备统计 |
| 统计 | `stats.treatment_overview` | 后台 | 是 | 治疗统计 |
| 统计 | `stats.subscription_overview` | 后台 | 是 | 订阅统计 |

## 统一接口契约建议

后续细化每个接口时，建议统一补齐以下字段：

- 接口标识
- 调用方
- 请求方式
- 路由
- 鉴权要求
- 幂等要求
- 请求参数
- 返回结构
- 错误码
- 侧效应
- 依赖数据表

## 建议统一响应包络

当前文档没有确认具体返回格式，但为了后续接口设计一致，建议统一采用一个最小响应包络。

| 字段 | 是否建议保留 | 说明 |
| --- | --- | --- |
| `code` | 是 | 业务结果码 |
| `message` | 是 | 成功或失败说明 |
| `data` | 是 | 业务数据 |
| `request_id` | 建议 | 便于日志追踪 |

## 各接口组的最小信息集合

### 认证接口

#### `auth.wx_login`

最小目标：

- 接收小程序登录凭证
- 识别或创建用户身份
- 返回系统可识别的登录态

至少需要定义：

- 输入凭证类型
- 返回 token 结构
- 是否同时返回用户资料和订阅状态

可能影响的对象：

- `users`
- 登录态或会话存储

#### `auth.refresh_token`

最小目标：

- 延长有效登录态或重新签发 token

至少需要定义：

- 续期条件
- 旧 token 处理方式
- 是否支持滑动过期

### 设备接口

#### `device.bind`

最小目标：

- 建立用户与设备的绑定关系

至少需要定义：

- 设备标识来源
- 是否依赖扫码
- 是否要求设备在线
- 绑定成功后的试用发放关系

可能影响的对象：

- `devices`
- `bindings`
- `subscriptions`
- `operation_logs`

#### `device.unbind`

最小目标：

- 解除当前用户与设备的有效绑定关系

至少需要定义：

- 谁可发起解绑
- 解绑是否影响订阅归属
- 历史绑定如何保留

#### `device.get_current_binding`

最小目标：

- 返回当前用户的绑定设备摘要

至少需要定义：

- 是否允许无绑定返回空对象
- 返回摘要字段范围

### 订阅接口

#### `subscription.get_current`

最小目标：

- 返回当前用户或当前设备的有效订阅状态

至少需要定义：

- 查询口径是按用户还是按设备
- 返回是否包含试用信息

#### `subscription.grant_trial`

最小目标：

- 在满足条件时发放 7 天试用

至少需要定义：

- 触发时机
- 幂等规则
- 发放对象

#### `subscription.create_or_renew`

最小目标：

- 后台创建或续期订阅

至少需要定义：

- 是否存在订单概念
- 生效时间规则
- 是否允许覆盖现有有效期

### 护理记录接口

#### `record.sync`

最小目标：

- 接收一次护理记录并落入后续处理链路

至少需要定义：

- 上传主体
- 请求是完整记录还是过程数据
- 幂等键
- 同步成功与异步入库成功的关系

可能影响的对象：

- `sessions`
- `treatment_records`
- `pd_data`
- `operation_logs`
- `CMQ` 或其他异步链路

#### `record.list`

最小目标：

- 查询治疗记录列表

至少需要定义：

- 小程序和后台是否共用同一查询能力
- 过滤条件
- 排序字段

### IoT 接口

#### `iot.register_device`

最小目标：

- 为设备建立平台侧可识别身份

至少需要定义：

- 调用方
- 调用时机
- 注册成功后的返回值

#### `iot.issue_device_secret`

最小目标：

- 为设备签发或返回 `DeviceSecret`

至少需要定义：

- 签发条件
- 是否只可获取一次
- 返回方式与安全控制

### 统计接口

统计接口当前只确认“后台需要”，最先要补的是统计口径：

- 时间范围
- 去重规则
- 试用与正式订阅是否分开统计
- 设备在线数是否为实时值

## 建议接口字段模板

后续继续细化某个接口时，可直接套用以下模板：

| 项目 | 内容 |
| --- | --- |
| 接口标识 | 待定义 |
| 调用方 | 待定义 |
| 请求方式 | 待定义 |
| 路由 | 待定义 |
| 鉴权要求 | 待定义 |
| 幂等要求 | 待定义 |
| 请求参数 | 待定义 |
| 返回结构 | 待定义 |
| 错误码 | 待定义 |
| 侧效应 | 待定义 |
| 依赖数据表 | 待定义 |

## 最先需要定下来的横切规则

在继续细化具体接口前，建议先统一这几项横切规则：

- 统一响应包络
- 统一错误码风格
- 统一分页结构
- 统一时间字段格式
- 统一幂等键规则
- 统一日志追踪字段，如 `request_id`

## 关键接口待确认问题

### 微信登录

- 小程序提交给云端的是 `code` 还是其他凭证
- 云端返回自有 token 还是复用微信态
- Token 7 天有效期是否支持续期

### 设备绑定

- 绑定是否必须基于扫码
- 绑定时是否校验设备在线状态
- 重复绑定、换绑、解绑是否有限制

### 试用订阅

- 发放时机是否严格绑定在首次绑定成功后
- 试用对象是用户还是设备
- 到期后是否自动降级为不可治疗

### 护理记录同步

- 上传主体是小程序还是设备侧
- 同步是实时提交还是治疗结束后提交
- 异步写入与接口返回成功的关系

### 设备注册

- 调用方是生产工具、设备首次上线，还是小程序触发
- `DeviceSecret` 是否只签发一次

## 当前结论

当前说明已经足够把云函数职责推进到“接口草案”层，但还不能直接生成真实 API。最优先要继续细化的是 `auth.wx_login`、`device.bind`、`subscription.get_current`、`subscription.grant_trial`、`record.sync` 这五个核心接口。
