# 通知接口 服务地址:`https://cmp-api.boss160.cn` 认证方式:`Bearer ` ## 通知枚举 ### 通知类别 | 值 | 说明 | | ---------- | --- | | `approval` | 审批 | | `expiry` | 临期 | | `sync` | 同步 | | `system` | 系统 | ### 通知级别 | 值 | 说明 | | ---------- | --- | | `info` | 提示 | | `warning` | 警告 | | `error` | 错误 | | `critical` | 严重 | ## 查询通知未读数 ### GET /api/admin/notifications/unread-count 查询当前认证后台账号的未过期未读通知数量,超过 99 条时显示 `99+`。 #### 成功响应 ```json { "code": 0, "data": { "count": 120, "display_count": "99+" }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` | 字段 | 类型 | 说明 | | ------------------ | ------- | --------------------- | | data.count | integer | 未读通知数量 | | data.display_count | string | 徽标显示文本,超过 99 时为 `99+` | ## 查询通知未读分类汇总 ### GET /api/admin/notifications/unread-summary 查询当前账号未过期通知的总未读数及分类数量。 #### 成功响应 ```json { "code": 0, "data": { "approval": 2, "expiry": 3, "sync": 1, "system": 0, "total": 6 }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` | 字段 | 类型 | 说明 | | ------------- | ------- | ------- | | data.approval | integer | 审批类未读数量 | | data.expiry | integer | 临期类未读数量 | | data.sync | integer | 同步类未读数量 | | data.system | integer | 系统类未读数量 | | data.total | integer | 未读通知总数 | ## 查询通知列表 ### GET /api/admin/notifications 查询当前认证后台账号的未过期通知,按创建时间和通知 ID 倒序返回。 #### 请求参数 | 参数 | 类型 | 必填 | 说明 | | --------- | ------- | --- | ---------------------------------------- | | category | string | 否 | 通知类别:`approval`、`expiry`、`sync`、`system` | | type | string | 否 | 稳定通知类型 | | severity | string | 否 | 通知级别:`info`、`warning`、`error`、`critical` | | is_read | boolean | 否 | 已读状态;不传查询全部 | | page | integer | 否 | 页码,默认 1,范围 1~10000 | | page_size | integer | 否 | 每页数量,默认 20,范围 1~50 | #### 成功响应 ```json { "code": 0, "data": { "items": [ { "id": 1, "category": "approval", "type": "refund_approval_pending", "severity": "warning", "title": "退款审批待处理", "body": "退款单 REFUND202607250001 正在审批中", "is_read": false, "read_at": null, "ref_type": "refund", "ref_id": "100", "ref_key": "REFUND202607250001", "created_at": "2026-07-25T00:00:00Z" } ], "page": 1, "size": 20, "total": 1 }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` #### 返回字段 | 字段 | 类型 | 说明 | | ------------------ | ----------- | ---------------- | | data.items | array | 通知列表 | | data.page | integer | 当前页码 | | data.size | integer | 每页数量 | | data.total | integer | 总数量 | | items[].id | integer | 通知 ID | | items[].category | string | 通知类别 | | items[].type | string | 稳定通知类型 | | items[].severity | string | 通知级别 | | items[].title | string | 纯文本标题 | | items[].body | string | 纯文本正文 | | items[].is_read | boolean | 是否已读 | | items[].read_at | string/null | 首次已读时间 | | items[].ref_type | string | 受控资源类型,不是前端路由 | | items[].ref_id | string | 受控资源数字 ID 字符串 | | items[].ref_key | string | 受控资源稳定 Key 或展示快照 | | items[].created_at | string | 创建时间 | ## 标记单条通知已读 ### PUT /api/admin/notifications/{id}/read 标记当前账号的一条通知为已读。通知不存在、属于其他账号或已经已读时均幂等成功。 #### 路径参数 | 参数 | 类型 | 必填 | 说明 | | --- | ------- | --- | ------------ | | id | integer | 是 | 通知 ID,最小值为 0 | #### 请求体 | 字段 | 类型 | 必填 | 说明 | | --- | ------- | --- | --------------- | | id | integer | 是 | 通知 ID,必须与路径参数一致 | 请求示例: ```json { "id": 1 } ``` #### 成功响应 ```json { "code": 0, "data": { "success": true }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` ## 批量标记通知已读 ### PUT /api/admin/notifications/read-all 批量标记当前账号通知为已读。未传类别时更新全部未过期未读通知,传类别时只更新对应类别。 #### 请求体 | 字段 | 类型 | 必填 | 说明 | | -------- | ------ | --- | ---------------------------------------- | | category | string | 否 | 通知类别:`approval`、`expiry`、`sync`、`system` | 请求示例: ```json { "category": "approval" } ``` #### 成功响应 ```json { "code": 0, "data": { "updated_count": 2 }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` | 字段 | 类型 | 说明 | | ------------------ | ------- | ----------- | | data.updated_count | integer | 本次实际更新的通知数量 | ## 解析通知受控目标 ### GET /api/admin/notifications/{id}/target 校验通知属于当前账号后,复核目标资源当前权限,返回白名单结构化目标。不会返回任意 URL。 #### 路径参数 | 参数 | 类型 | 必填 | 说明 | | --- | ------- | --- | ------------ | | id | integer | 是 | 通知 ID,最小值为 0 | #### 成功响应 ```json { "code": 0, "data": { "available": true, "target_type": "refund_detail", "target_id": 100, "target_key": "REFUND202607250001" }, "msg": "success", "timestamp": "2026-07-25T00:00:00Z" } ``` | 字段 | 类型 | 说明 | | ---------------- | ------------ | ------------------ | | data.available | boolean | 当前账号是否仍可访问目标 | | data.target_type | string | 前端白名单目标类型,空表示不支持跳转 | | data.target_id | integer/null | ID 型目标业务主键 | | data.target_key | string | Key 型目标稳定定位值 | ### target_type 白名单 | 值 | 说明 | | ----------------------- | ------- | | `refund_detail` | 退款详情 | | `agent_recharge_detail` | 代理充值详情 | | `wecom_approval_detail` | 企微审批详情 | | `iot_card_detail` | IoT 卡详情 | | `device_detail` | 设备详情 | | `expiring_asset_list` | 临期资产列表 | | `shop_fund_summary` | 店铺资金概况 | | `system_config` | 系统配置 | ## 业务规则 - 通知只返回当前认证后台账号的未过期通知。 - `ref_type`、`ref_id` 和 `ref_key` 是受控资源引用,不是前端 URL。 - 点击通知后必须调用目标解析接口,由 `target_type` 和 `available` 决定是否跳转。 - `available=false` 或 `target_type` 为空时,只展示通知正文,不执行跳转。 - 前端维护 `target_type` 到页面的白名单映射,不得根据通知字段拼接任意 URL。 - 已读操作必须支持幂等调用。 ## 错误响应 适用于以上接口: | HTTP 状态码 | 说明 | | -------- | --------- | | 400 | 请求参数错误 | | 401 | 未认证或认证已过期 | | 403 | 无权访问 | | 500 | 服务器内部错误 | 错误响应示例: ```json { "code": 1001, "data": {}, "msg": "参数验证失败", "timestamp": "2026-07-25T00:00:00Z" } ```