271 lines
6.8 KiB
Markdown
271 lines
6.8 KiB
Markdown
|
|
# 产品动态时间线后端接口需求说明
|
|||
|
|
|
|||
|
|
日期:2026-04-23
|
|||
|
|
|
|||
|
|
## 1. 背景
|
|||
|
|
|
|||
|
|
当前产品对象首页中的“产品动态时间线”模块,用户期望不是展示几条前端拼装的摘要,而是一个可以在首页内直接查询的正式动态模块。
|
|||
|
|
|
|||
|
|
本轮已确认的目标能力包括:
|
|||
|
|
|
|||
|
|
- 首页内直接展示产品动态时间线
|
|||
|
|
- 默认查询最近 `30 天`
|
|||
|
|
- 支持自定义起止时间筛选
|
|||
|
|
- 支持事件类型多选筛选
|
|||
|
|
- 支持分页
|
|||
|
|
- 第一版事件范围收敛在产品对象与团队关系,不混入需求池事件
|
|||
|
|
|
|||
|
|
## 2. 当前前端现状
|
|||
|
|
|
|||
|
|
当前前端可直接使用的真实接口只有:
|
|||
|
|
|
|||
|
|
- `GET /project/product/get`
|
|||
|
|
- `GET /project/product/{id}/settings`
|
|||
|
|
- `GET /project/product/{id}/members`
|
|||
|
|
|
|||
|
|
这些接口目前只能提供:
|
|||
|
|
|
|||
|
|
- 产品当前状态
|
|||
|
|
- 最近一次状态原因
|
|||
|
|
- 产品经理
|
|||
|
|
- 成员加入时间
|
|||
|
|
- 成员退出时间
|
|||
|
|
- 当前成员角色
|
|||
|
|
|
|||
|
|
它们可以勉强拼出少量“最近动态摘要”,但不足以支撑正式时间线查询模块。
|
|||
|
|
|
|||
|
|
## 3. 当前接口为什么不够
|
|||
|
|
|
|||
|
|
如果继续只依赖现有接口,前端存在以下硬缺口:
|
|||
|
|
|
|||
|
|
1. 没有统一的产品动态分页接口
|
|||
|
|
2. 没有事件类型维度,无法支持类型筛选
|
|||
|
|
3. 没有统一发生时间字段集合,无法稳定支持时间筛选
|
|||
|
|
4. 没有事件操作人字段,无法明确展示“谁做了什么”
|
|||
|
|
5. 没有统一的事件摘要字段,前端只能自己硬拼文案
|
|||
|
|
6. 没有产品状态变更前后值,无法展示“从什么状态变更为什么状态”
|
|||
|
|
7. 没有产品经理变更前后值,无法展示交接关系
|
|||
|
|
8. 没有分页总数字段,无法做首页内翻页
|
|||
|
|
|
|||
|
|
因此,现有接口只适合做“概览摘要”,不适合做“可查询产品动态时间线”。
|
|||
|
|
|
|||
|
|
## 4. 后端接口交付要求
|
|||
|
|
|
|||
|
|
后端必须新增一条专用分页接口:
|
|||
|
|
|
|||
|
|
`GET /project/product/{id}/activities/page`
|
|||
|
|
|
|||
|
|
这条接口只服务“产品动态时间线”能力,不承担需求池动态,不承担首页其它概览指标。
|
|||
|
|
|
|||
|
|
前端要求后端单独提供这条接口,原因如下:
|
|||
|
|
|
|||
|
|
- 语义清晰,前后端都容易维护
|
|||
|
|
- 首页时间线可直接消费
|
|||
|
|
- 后续如果要做独立的产品动态页,也可以继续复用这条接口
|
|||
|
|
- 不需要继续让前端从多个接口里拼装事件
|
|||
|
|
|
|||
|
|
## 5. 第一版事件范围
|
|||
|
|
|
|||
|
|
第一版事件类型确认收敛为 5 类:
|
|||
|
|
|
|||
|
|
- `product_created`:产品创建
|
|||
|
|
- `product_status_changed`:产品状态变更
|
|||
|
|
- `product_manager_changed`:产品经理变更
|
|||
|
|
- `product_member_joined`:成员加入
|
|||
|
|
- `product_member_removed`:成员移出
|
|||
|
|
|
|||
|
|
第一版明确不纳入:
|
|||
|
|
|
|||
|
|
- 成员角色调整
|
|||
|
|
- 需求新增
|
|||
|
|
- 需求状态流转
|
|||
|
|
- 需求关闭
|
|||
|
|
- 里程碑事件
|
|||
|
|
- 风险点事件
|
|||
|
|
|
|||
|
|
## 6. 查询参数要求
|
|||
|
|
|
|||
|
|
接口必须支持以下查询参数:
|
|||
|
|
|
|||
|
|
- `pageNo`:页码
|
|||
|
|
- `pageSize`:每页数量
|
|||
|
|
- `startTime`:开始时间
|
|||
|
|
- `endTime`:结束时间
|
|||
|
|
- `types`:事件类型数组,多选
|
|||
|
|
|
|||
|
|
补充要求:
|
|||
|
|
|
|||
|
|
- 当前端未传时间范围时,后端默认按最近 `30 天` 返回
|
|||
|
|
- 返回结果按 `occurredAt desc` 倒序排列
|
|||
|
|
- `types` 支持多选,不要求前端单选
|
|||
|
|
|
|||
|
|
示例:
|
|||
|
|
|
|||
|
|
```http
|
|||
|
|
GET /project/product/1001/activities/page?pageNo=1&pageSize=10&startTime=2026-03-24 00:00:00&endTime=2026-04-23 23:59:59&types=product_status_changed&types=product_manager_changed
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 7. 返回结构要求
|
|||
|
|
|
|||
|
|
接口返回必须支持分页,分页结构至少应满足:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"total": 128,
|
|||
|
|
"list": [
|
|||
|
|
{
|
|||
|
|
"id": "act_001",
|
|||
|
|
"type": "product_status_changed",
|
|||
|
|
"title": "产品状态变更",
|
|||
|
|
"operatorId": "10001",
|
|||
|
|
"operatorName": "张敏",
|
|||
|
|
"occurredAt": "2026-04-23 10:32:15",
|
|||
|
|
"summary": "产品状态由暂停变更为启用",
|
|||
|
|
"reason": "测试恢复",
|
|||
|
|
"beforeStatus": "paused",
|
|||
|
|
"afterStatus": "active"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
分页顶层字段至少包括:
|
|||
|
|
|
|||
|
|
- `total`
|
|||
|
|
- `list`
|
|||
|
|
|
|||
|
|
如果后端已有统一分页模型,可以沿用现有分页结构,但前端必须能稳定拿到总数和列表。
|
|||
|
|
|
|||
|
|
## 8. 事件通用字段要求
|
|||
|
|
|
|||
|
|
无论哪种事件类型,后端都应统一返回以下字段:
|
|||
|
|
|
|||
|
|
- `id`:事件唯一 ID
|
|||
|
|
- `type`:事件类型编码
|
|||
|
|
- `title`:事件标题
|
|||
|
|
- `operatorId`:操作人 ID
|
|||
|
|
- `operatorName`:操作人名称
|
|||
|
|
- `occurredAt`:发生时间
|
|||
|
|
- `summary`:事件摘要
|
|||
|
|
- `reason`:原因或备注,可为空
|
|||
|
|
|
|||
|
|
这些字段是首页时间线最小可展示集合。
|
|||
|
|
|
|||
|
|
## 9. 各事件类型的专属字段要求
|
|||
|
|
|
|||
|
|
### 9.1 产品创建 `product_created`
|
|||
|
|
|
|||
|
|
必须补充:
|
|||
|
|
|
|||
|
|
- `creatorUserId`
|
|||
|
|
- `creatorUserName`
|
|||
|
|
|
|||
|
|
### 9.2 产品状态变更 `product_status_changed`
|
|||
|
|
|
|||
|
|
这是当前最关键的一类事件,后端必须返回:
|
|||
|
|
|
|||
|
|
- `beforeStatus`
|
|||
|
|
- `afterStatus`
|
|||
|
|
- `reason`
|
|||
|
|
|
|||
|
|
前端需要用这组字段明确表达:
|
|||
|
|
|
|||
|
|
- 变更前状态
|
|||
|
|
- 变更后状态
|
|||
|
|
- 本次变更原因
|
|||
|
|
|
|||
|
|
例如:
|
|||
|
|
|
|||
|
|
- `暂停 -> 启用`
|
|||
|
|
- `启用 -> 归档`
|
|||
|
|
|
|||
|
|
### 9.3 产品经理变更 `product_manager_changed`
|
|||
|
|
|
|||
|
|
必须返回:
|
|||
|
|
|
|||
|
|
- `beforeManagerUserId`
|
|||
|
|
- `beforeManagerUserName`
|
|||
|
|
- `afterManagerUserId`
|
|||
|
|
- `afterManagerUserName`
|
|||
|
|
- `reason`
|
|||
|
|
|
|||
|
|
否则前端无法准确展示交接关系,只能看到当前经理,不能看到变更前后关系。
|
|||
|
|
|
|||
|
|
### 9.4 成员加入 `product_member_joined`
|
|||
|
|
|
|||
|
|
必须返回:
|
|||
|
|
|
|||
|
|
- `memberUserId`
|
|||
|
|
- `memberUserName`
|
|||
|
|
- `roleId`
|
|||
|
|
- `roleName`
|
|||
|
|
- `remark`
|
|||
|
|
|
|||
|
|
### 9.5 成员移出 `product_member_removed`
|
|||
|
|
|
|||
|
|
必须返回:
|
|||
|
|
|
|||
|
|
- `memberUserId`
|
|||
|
|
- `memberUserName`
|
|||
|
|
- `roleId`
|
|||
|
|
- `roleName`
|
|||
|
|
- `reason`
|
|||
|
|
|
|||
|
|
## 10. 前端展示口径
|
|||
|
|
|
|||
|
|
前端首页时间线模块第一版会直接基于这条接口支持:
|
|||
|
|
|
|||
|
|
- 默认最近 `30 天`
|
|||
|
|
- 自定义时间范围筛选
|
|||
|
|
- 事件类型多选筛选
|
|||
|
|
- 分页切换
|
|||
|
|
|
|||
|
|
每条记录最少展示:
|
|||
|
|
|
|||
|
|
- 事件类型
|
|||
|
|
- 事件标题
|
|||
|
|
- 操作人
|
|||
|
|
- 发生时间
|
|||
|
|
- 变更摘要
|
|||
|
|
- 原因/备注
|
|||
|
|
|
|||
|
|
其中“产品状态变更”需要明确体现:
|
|||
|
|
|
|||
|
|
- 变更前状态
|
|||
|
|
- 变更后状态
|
|||
|
|
- 变更原因
|
|||
|
|
|
|||
|
|
## 11. 为什么不建议继续让前端拼装
|
|||
|
|
|
|||
|
|
如果继续沿用当前前端拼装方案,会有这些问题:
|
|||
|
|
|
|||
|
|
- 产品状态变更前后值无法补齐
|
|||
|
|
- 产品经理变更前后值无法补齐
|
|||
|
|
- 无法支持分页
|
|||
|
|
- 无法支持统一时间筛选
|
|||
|
|
- 无法支持统一类型筛选
|
|||
|
|
- 不同事件文案会在前端散落拼装,长期维护成本高
|
|||
|
|
|
|||
|
|
因此这里的前后端边界应明确为:
|
|||
|
|
|
|||
|
|
- 后端提供统一产品动态分页接口
|
|||
|
|
- 前端负责筛选条件组织、分页交互和时间线展示
|
|||
|
|
|
|||
|
|
## 12. 本轮需求结论
|
|||
|
|
|
|||
|
|
本轮给后端的结论可以直接收敛为:
|
|||
|
|
|
|||
|
|
1. 当前前端已有接口不满足正式产品动态时间线需求
|
|||
|
|
2. 后端新增 `GET /project/product/{id}/activities/page`
|
|||
|
|
3. 接口必须支持分页、默认最近 `30 天`、自定义时间范围、事件类型多选
|
|||
|
|
4. 第一版事件类型只做:
|
|||
|
|
- 产品创建
|
|||
|
|
- 产品状态变更
|
|||
|
|
- 产品经理变更
|
|||
|
|
- 成员加入
|
|||
|
|
- 成员移出
|
|||
|
|
5. 产品状态变更必须提供前后状态和原因
|
|||
|
|
6. 产品经理变更必须提供前后经理信息
|
|||
|
|
|
|||
|
|
这条接口交付后,前端才能把当前“产品动态时间线”从拼装摘要升级成正式可查询模块。
|