瀏覽代碼

收录商家门店分管账号接口文档

qmj 2 天之前
父節點
當前提交
a0fe718de2
共有 1 個文件被更改,包括 501 次插入0 次删除
  1. 501 0
      docs/merchant-subaccount-api.md

+ 501 - 0
docs/merchant-subaccount-api.md

@@ -0,0 +1,501 @@
+# 商家门店管理账号 API 接口文档
+
+> 更新时间:2026-08-31
+> 适用范围:商家端门店分管账号管理、分管账号登录,以及平台端查看和强制启停分管账号。
+> 本文档以当前后端实现为准。
+
+## 1. 公共约定
+
+### 1.1 账号类型
+
+| `userType` | 含义 |
+|---|---|
+| `1` | 商家主账号 |
+| `5` | 商家门店分管账号 |
+
+只有 `userType = 1` 的商家主账号可以新增、编辑、重置密码和启停分管账号。分管账号不能调用账号管理接口。
+
+### 1.2 请求格式
+
+- 商家端接口使用 `Content-Type: application/json`。
+- 除登录接口外,请求头必须携带商家端登录返回的 `token`。
+- `token` 直接放在请求头中,不添加 `Bearer` 前缀。
+
+```http
+token: 登录接口返回的 token
+Content-Type: application/json
+```
+
+平台端接口沿用若依后台现有认证方式。
+
+### 1.3 通用响应
+
+成功响应:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功",
+  "data": {}
+}
+```
+
+没有返回数据的成功响应不包含 `data`:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功"
+}
+```
+
+业务失败响应:
+
+```json
+{
+  "code": 500,
+  "msg": "具体错误信息"
+}
+```
+
+前端应以响应体中的 `code === 200` 判断业务是否成功,不要只依赖 HTTP 状态码。
+
+### 1.4 分管账号返回对象
+
+| 字段 | 类型 | 说明 |
+|---|---|---|
+| `userId` | `number` | 分管账号用户 ID |
+| `name` | `string` | 姓名 |
+| `phone` | `string` | 登录手机号,同时也是登录账号 |
+| `merchantOwnerId` | `number` | 所属商家主账号用户 ID |
+| `ownerEnabled` | `boolean` | 主账号控制状态,`true` 为启用 |
+| `platformEnabled` | `boolean` | 平台控制状态,`true` 为启用 |
+| `online` | `boolean` | 当前是否存在有效商家端登录会话 |
+| `lastLoginAt` | `string \| null` | 最后登录时间,未登录过时可能为 `null` |
+| `createdAt` | `string \| null` | 创建时间 |
+| `stores` | `array` | 当前负责的门店列表 |
+| `stores[].storeId` | `number` | 门店 ID |
+| `stores[].storeName` | `string` | 门店名称 |
+
+账号实际可用条件:
+
+```text
+ownerEnabled === true && platformEnabled === true
+```
+
+## 2. 商家端接口汇总
+
+基础路径:`/merchant/subaccounts`
+
+| 功能 | 方法 | 地址 | 调用方 |
+|---|---|---|---|
+| 查询分管账号列表 | `GET` | `/merchant/subaccounts` | 商家主账号 |
+| 创建分管账号 | `POST` | `/merchant/subaccounts` | 商家主账号 |
+| 编辑姓名和负责门店 | `PUT` | `/merchant/subaccounts/{subaccountUserId}` | 所属商家主账号 |
+| 重置密码 | `PUT` | `/merchant/subaccounts/{subaccountUserId}/password` | 所属商家主账号 |
+| 启用或停用账号 | `PUT` | `/merchant/subaccounts/{subaccountUserId}/status` | 所属商家主账号 |
+
+## 3. 获取可分配门店
+
+创建或编辑分管账号前,可调用现有“我的门店”接口取得门店选择数据。
+
+### `GET /chanting/store/getmystorelist`
+
+请求头:
+
+```http
+token: 商家主账号 token
+```
+
+请求参数:无。
+
+成功响应示例:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功",
+  "data": [
+    {
+      "id": 101,
+      "posName": "台北一店"
+    },
+    {
+      "id": 102,
+      "posName": "台北二店"
+    }
+  ]
+}
+```
+
+该接口实际会返回完整门店对象。账号管理页面至少使用以下两个字段:
+
+| 门店字段 | 用途 |
+|---|---|
+| `id` | 提交到账号接口的 `storeIds` |
+| `posName` | 门店名称展示 |
+
+## 4. 查询分管账号列表
+
+### `GET /merchant/subaccounts`
+
+仅商家主账号可调用。接口不分页,返回当前主账号名下全部未删除的分管账号。
+
+请求头:
+
+```http
+token: 商家主账号 token
+```
+
+请求参数:无。
+
+成功响应示例:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功",
+  "data": [
+    {
+      "userId": 501,
+      "name": "张三",
+      "phone": "+886900000001",
+      "merchantOwnerId": 10001,
+      "ownerEnabled": true,
+      "platformEnabled": true,
+      "online": true,
+      "lastLoginAt": "2026-08-28T10:30:00",
+      "createdAt": "2026-08-20T09:00:00",
+      "stores": [
+        {
+          "storeId": 101,
+          "storeName": "台北一店"
+        },
+        {
+          "storeId": 102,
+          "storeName": "台北二店"
+        }
+      ]
+    }
+  ]
+}
+```
+
+## 5. 创建分管账号
+
+### `POST /merchant/subaccounts`
+
+仅商家主账号可调用。
+
+请求头:
+
+```http
+token: 商家主账号 token
+Content-Type: application/json
+```
+
+请求体:
+
+```json
+{
+  "phone": "+886900000001",
+  "name": "张三",
+  "password": "前端 RSA 加密后的密码",
+  "storeIds": [101, 102]
+}
+```
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `phone` | `string` | 是 | 登录手机号,同时作为登录账号;服务端会移除其中的空白字符;最长 32 个字符;全局不可重复 |
+| `name` | `string` | 是 | 分管账号姓名,不能只包含空白字符 |
+| `password` | `string` | 是 | 使用商家端现有登录密码相同的 RSA 加密方式提交 |
+| `storeIds` | `number[]` | 是 | 至少一个门店 ID;所有门店必须属于当前主账号;重复 ID 会被去重 |
+
+成功响应的 `data` 为完整的分管账号对象:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功",
+  "data": {
+    "userId": 501,
+    "name": "张三",
+    "phone": "+886900000001",
+    "merchantOwnerId": 10001,
+    "ownerEnabled": true,
+    "platformEnabled": true,
+    "online": false,
+    "lastLoginAt": null,
+    "createdAt": "2026-08-31T11:00:00",
+    "stores": [
+      {
+        "storeId": 101,
+        "storeName": "台北一店"
+      },
+      {
+        "storeId": 102,
+        "storeName": "台北二店"
+      }
+    ]
+  }
+}
+```
+
+## 6. 编辑姓名和负责门店
+
+### `PUT /merchant/subaccounts/{subaccountUserId}`
+
+只能修改当前主账号所属的分管账号。
+
+路径参数:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `subaccountUserId` | `number` | 是 | 分管账号的 `userId` |
+
+请求体:
+
+```json
+{
+  "name": "张三",
+  "storeIds": [102, 103]
+}
+```
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `name` | `string` | 是 | 修改后的姓名 |
+| `storeIds` | `number[]` | 是 | 修改后的完整门店 ID 集合,至少一个;不是增量添加 |
+
+成功响应的 `data` 为修改后的完整分管账号对象。
+
+注意:当前接口不支持修改手机号。`storeIds` 会整体覆盖原门店授权,提交前必须传入希望保留的全部门店 ID。
+
+## 7. 重置密码
+
+### `PUT /merchant/subaccounts/{subaccountUserId}/password`
+
+只能重置当前主账号所属分管账号的密码。
+
+请求体:
+
+```json
+{
+  "password": "前端 RSA 加密后的新密码"
+}
+```
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `password` | `string` | 是 | 使用商家端现有登录密码相同的 RSA 加密方式提交 |
+
+成功响应:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功"
+}
+```
+
+密码重置成功后,后端会立即撤销该分管账号已有的 App 和 PC 会话,账号需要使用新密码重新登录。
+
+## 8. 启用或停用账号
+
+### `PUT /merchant/subaccounts/{subaccountUserId}/status`
+
+该接口只修改主账号控制状态,即返回对象中的 `ownerEnabled`。
+
+请求体:
+
+```json
+{
+  "enabled": false
+}
+```
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `enabled` | `boolean` | 是 | `true` 启用,`false` 停用 |
+
+成功响应:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功"
+}
+```
+
+- 停用后,后端会立即撤销该分管账号已有的 App 和 PC 会话。
+- 主账号重新启用账号时,只能把 `ownerEnabled` 改为 `true`,不能覆盖平台的 `platformEnabled` 状态。
+- 如果 `platformEnabled === false`,即使主账号已启用,该账号仍然不可登录和使用。
+
+## 9. 分管账号登录
+
+分管账号复用现有商家登录接口,不使用单独的登录地址。
+
+### `POST /infouser/user/shanglodeing`
+
+该接口不需要 `token`。
+
+请求体示例:
+
+```json
+{
+  "userName": "+886900000001",
+  "password": "前端 RSA 加密后的密码",
+  "cid": "推送客户端标识",
+  "cidType": "ios",
+  "deviceToken": "设备推送 token",
+  "voIPToken": "iOS VoIP token"
+}
+```
+
+| 字段 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `userName` | `string` | 是 | 创建分管账号时提交的手机号 |
+| `password` | `string` | 是 | RSA 加密后的密码 |
+| `cid` | `string` | 否 | 当前商家端使用的推送客户端标识 |
+| `cidType` | `string` | 否 | 设备类型,例如 `ios`、`android` |
+| `deviceToken` | `string` | 否 | 普通设备推送 token |
+| `voIPToken` | `string` | 否 | iOS VoIP 推送 token |
+
+分管账号登录成功响应示例:
+
+```json
+{
+  "code": 200,
+  "msg": "登录成功",
+  "token": "登录 token",
+  "data": {
+    "userId": 501,
+    "userName": "+886900000001",
+    "nickName": "张三",
+    "userType": "5",
+    "storeId": null,
+    "merchantOwnerId": 10001,
+    "status": "0",
+    "subaccountStatus": "0",
+    "lastLoginAt": "2026-08-31T11:30:00"
+  }
+}
+```
+
+前端可使用 `data.userType === "5"` 识别分管账号。分管账号只能访问其被授权的门店;门店权限由后端校验,前端不能通过修改门店 ID 扩大权限。
+
+登录时以下任一情况都会失败:
+
+- 分管账号被主账号停用;
+- 分管账号被平台停用;
+- 所属商家主账号不可用;
+- 账号或密码错误。
+
+## 10. 退出登录
+
+### `POST /infouser/user/merchantLogout`
+
+请求头:
+
+```http
+token: 当前商家端 token
+```
+
+请求体:无。
+
+成功响应:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功"
+}
+```
+
+前端应先调用退出接口,再清除本地 token。
+
+## 11. 平台端接口
+
+平台端只允许查看分管账号以及强制启用或停用。平台不能新增分管账号、重置密码或修改门店授权。
+
+### 11.1 查询指定商家的分管账号
+
+#### `GET /infouser/merchant-subaccounts?merchantUserId={id}`
+
+权限标识:`infouser:user:list`
+
+查询参数:
+
+| 参数 | 类型 | 必填 | 说明 |
+|---|---|---|---|
+| `merchantUserId` | `number` | 是 | 商家主账号用户 ID,必须是 `userType = 1` 的有效账号 |
+
+成功响应的 `data` 与商家端“查询分管账号列表”一致。
+
+### 11.2 平台强制启用或停用
+
+#### `PUT /infouser/merchant-subaccounts/{subaccountUserId}/platform-status`
+
+权限标识:`infouser:user:edit`
+
+请求体:
+
+```json
+{
+  "enabled": false
+}
+```
+
+该接口只修改返回对象中的 `platformEnabled`。平台停用账号后会立即撤销该账号已有的 App 和 PC 会话。
+
+成功响应:
+
+```json
+{
+  "code": 200,
+  "msg": "操作成功"
+}
+```
+
+## 12. 常见业务错误
+
+错误消息会根据服务端当前语言返回对应的简体中文、繁体中文、英文或越南语。以下为简体中文示例:
+
+| `msg` 示例 | 触发情况 |
+|---|---|
+| `仅商家主账号可执行此操作` | 分管账号或非商家主账号调用账号管理接口 |
+| `商家主账号不存在` | 平台查询的 `merchantUserId` 不是有效商家主账号 |
+| `请求数据不能为空` | 创建或编辑请求体为空 |
+| `分管账号姓名不能为空` | `name` 为空或只有空白字符 |
+| `分管账号手机号不能为空` | `phone` 为空 |
+| `分管账号手机号格式无效` | 去除空白后的手机号长度超过 32 个字符 |
+| `该手机号已被使用` | 手机号或同名登录账号已存在 |
+| `分管账号密码不能为空` | `password` 为空或只有空白字符 |
+| `请至少选择一个负责店铺` | `storeIds` 为空数组或未提交 |
+| `无权访问该店铺` | `storeIds` 包含不属于当前主账号的门店 |
+| `分管账号状态不能为空` | `enabled` 未提交或为 `null` |
+| `分管账号不存在` | 目标 ID 不是有效分管账号 |
+| `无权管理该分管账号` | 主账号尝试修改其他商家的分管账号 |
+| `商家账号不可用` | 账号被平台停用 |
+| `所属商家主账号不可用` | 分管账号所属主账号不可用 |
+
+## 13. 前端调用顺序
+
+```text
+进入账号管理页
+  -> GET /chanting/store/getmystorelist
+  -> GET /merchant/subaccounts
+
+创建账号
+  -> POST /merchant/subaccounts
+  -> 成功后使用响应 data 更新列表,或重新查询列表
+
+编辑账号
+  -> PUT /merchant/subaccounts/{userId}
+  -> 成功后使用响应 data 更新列表
+
+重置密码或启停账号
+  -> 调用对应 PUT 接口
+  -> 成功后重新查询列表,刷新 online 和状态字段
+```