Files
jsowell-charger-web/docs/PRD-待办事项功能.md

365 lines
12 KiB
Markdown
Raw Normal View History

2026-07-16 15:48:42 +08:00
# 待办事项中心 PRD
## 1. 文档信息
| 项目 | 内容 |
| --- | --- |
| 产品名称 | 运营商工作台待办事项中心 |
| 文档类型 | 产品需求文档PRD |
| 版本 | V1.0 |
| 状态 | 待评审 |
| 适用端 | RuoYi-Vue 管理后台、运营商工作台 |
## 2. 背景与目标
当前项目已有 RuoYi 的通知公告功能,支持管理员维护全平台公告,但不支持按用户生成业务任务、展示未处理数量和跳转处理业务。
截图中的“待办事项”属于业务任务中心:任务面向具体用户,用户需要进入业务页面完成处理,处理后任务应自动完成或由用户确认完成。
本需求目标:
1. 在运营商工作台首页增加待办事项卡片。
2. 展示当前登录用户未处理的待办数量。
3. 支持点击待办跳转到对应业务详情或处理页面。
4. 支持待办状态、优先级、已读状态和完成状态管理。
5. 建立统一待办能力,后续可接入开票、提现、汇付开户、清分异常等业务。
## 3. 产品定位
待办事项与通知公告、站内信的关系如下:
```text
消息中心
├── 待办事项:需要用户处理的业务任务
├── 业务通知:业务结果或状态变化提醒
├── 系统公告:面向全体用户的运营公告
└── 系统消息:登录、安全、权限等系统提醒
```
本期只建设“待办事项”,不替换现有 `sys_notice` 通知公告模块。
## 4. 用户与权限
### 4.1 用户角色
| 用户 | 权限 |
| --- | --- |
| 运营商负责人 | 查看和处理本人或本运营商范围内的待办 |
| 运营商财务人员 | 查看和处理财务类待办 |
| 平台运营人员 | 创建、分配、转派和关闭待办,可查看全量待办 |
| 系统管理员 | 管理待办类型、权限和异常任务 |
### 4.2 数据权限
默认只返回当前登录用户的待办。平台管理员是否可以查看全量待办,由现有 RuoYi 权限和数据权限控制,不允许通过修改请求参数绕过接收人过滤。
## 5. 首期业务范围
### 5.1 开票待办
首期优先实现截图中的开票场景:
| 待办类型 | 触发条件 | 处理页面 | 完成条件 |
| --- | --- | --- | --- |
| 平台采购开票 | 平台审核拒绝或要求补充材料 | 发票详情/开票申请页 | 用户重新提交或平台关闭任务 |
| 司机开票申请 | 收到司机开票申请 | 发票申请处理页 | 审核通过、驳回或关闭 |
### 5.2 预留业务类型
| 待办类型 | 触发条件 |
| --- | --- |
| 汇付企业开户审核 | 企业开户失败或需要补充资料 |
| 结算账户异常 | 结算账户创建失败、删除失败或状态不一致 |
| 提现处理 | 提现失败、人工审核或补充资料 |
| 清分异常 | 清分失败、分账配置错误或账单待处理 |
| 订单异常 | 订单退款、结算或支付异常需要人工介入 |
首期只实现开票待办,其他类型只完成通用模型和扩展接口,不要求全部接入。
## 6. 业务流程
### 6.1 创建流程
```text
业务事件发生
判断是否需要人工处理
确定接收人和业务权限
按幂等键创建待办
首页待办数量增加
用户点击待办
进入业务处理页面并标记已读
业务处理成功后自动完成待办
```
### 6.2 状态定义
待办状态和阅读状态分开保存:
| 字段 | 值 | 含义 |
| --- | --- | --- |
| `task_status` | `PENDING` | 待处理 |
| `task_status` | `PROCESSING` | 处理中 |
| `task_status` | `COMPLETED` | 已完成 |
| `task_status` | `CANCELLED` | 已取消 |
| `task_status` | `EXPIRED` | 已过期 |
| `read_status` | `0` | 未读 |
| `read_status` | `1` | 已读 |
已读只表示用户看过,不能代表业务已经处理完成。只有业务动作完成、平台关闭或管理员取消时,待办才进入完成或取消状态。
### 6.3 幂等规则
同一业务任务不能重复生成待办。建议使用以下幂等键:
```text
task_type + business_type + business_id + assignee_user_id
```
例如同一个发票申请给同一个用户只能有一条有效待办。任务完成或取消后,允许业务重新产生新的任务,但必须保留历史记录。
## 7. 首页交互设计
### 7.1 待办卡片
位置:运营商工作台首页右侧,与截图中的“待办事项”位置一致。
展示规则:
- 标题:`待办事项`
- 标题右侧显示未完成数量,最多显示 `99+`
- 默认展示最近 3 条未完成待办。
- 按优先级倒序、创建时间倒序排列。
- 每条显示:类型、标题、简要内容、时间和箭头。
- 无待办时显示“暂无待办事项”。
- 点击“查看全部”进入待办中心。
- 点击单条任务进入业务处理页面。
### 7.2 待办中心
页面建议:`src/views/system/todo/index.vue`
功能:
- 全部、待处理、已完成、已取消筛选。
- 全部、未读筛选。
- 按待办类型筛选。
- 关键字搜索标题和业务单号。
- 分页查询。
- 点击进入业务详情。
- 支持批量标记已读。
- 支持隐藏已完成待办,不直接物理删除历史任务。
### 7.3 详情处理
待办本身不重复实现业务处理表单。点击待办后跳转已有业务页面,并携带:
```text
businessType
businessId
todoId
```
业务页面处理成功后调用待办完成接口,或由后端业务事务自动完成待办。
## 8. 数据库设计
建议新增主表 `sys_todo_task`
| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `todo_id` | bigint | 主键 |
| `task_type` | varchar(64) | 待办类型编码 |
| `title` | varchar(200) | 待办标题 |
| `summary` | varchar(500) | 摘要 |
| `content` | text | 详细内容 |
| `business_type` | varchar(64) | 业务类型 |
| `business_id` | varchar(64) | 业务主键或单号 |
| `route_name` | varchar(100) | 前端路由名称 |
| `route_params` | varchar(1000) | 路由参数 JSON |
| `assignee_user_id` | bigint | 接收用户 ID |
| `assignee_merchant_id` | varchar(64) | 运营商 ID可为空 |
| `priority` | tinyint | 优先级1普通、2重要、3紧急 |
| `task_status` | varchar(20) | 任务状态 |
| `read_status` | char(1) | 0未读、1已读 |
| `read_time` | datetime | 阅读时间 |
| `due_time` | datetime | 截止时间,可为空 |
| `completed_time` | datetime | 完成时间 |
| `completed_by` | bigint | 完成人 |
| `cancel_reason` | varchar(500) | 取消原因 |
| `idempotent_key` | varchar(200) | 幂等键 |
| `create_time` | datetime | 创建时间 |
| `update_time` | datetime | 更新时间 |
| `del_flag` | char(1) | 逻辑删除 |
建议索引:
```sql
unique key uk_todo_idempotent (idempotent_key)
key idx_todo_user_status (assignee_user_id, task_status, read_status, create_time)
key idx_todo_merchant_status (assignee_merchant_id, task_status, create_time)
key idx_todo_business (business_type, business_id)
```
如果后续需要同一任务分配给多个用户,建议拆分为:
- `sys_todo_task`:任务主体。
- `sys_todo_recipient`:接收人和每个接收人的阅读状态、处理状态。
V1 只有单接收人时可以先使用单表,避免过早复杂化;但字段和 Service 设计应预留多接收人扩展。
## 9. 后端接口设计
### 9.1 用户端接口
```text
GET /system/todo/unreadCount
GET /system/todo/homeList?limit=3
GET /system/todo/list
GET /system/todo/{todoId}
PUT /system/todo/{todoId}/read
PUT /system/todo/readAll
PUT /system/todo/{todoId}/complete
PUT /system/todo/{todoId}/cancel
```
接口规则:
- 所有查询自动使用当前登录用户 ID不接收任意 `userId` 作为唯一权限依据。
- `read` 只能修改当前用户的阅读状态。
- `complete` 必须校验当前用户有对应业务处理权限。
- `complete` 和具体业务更新建议放在同一事务中,避免业务完成但待办仍为待处理。
- 已完成任务默认仍可查询,但不计入未读数量和首页待办数量。
### 9.2 管理端接口
```text
GET /system/todo/admin/list
POST /system/todo/admin/create
PUT /system/todo/admin/{todoId}/assign
PUT /system/todo/admin/{todoId}/cancel
DELETE /system/todo/admin/{todoId}
```
管理端用于异常任务处理和人工补发,普通业务待办优先由业务事件自动生成。
## 10. 待办服务设计
新增统一服务接口:
```java
TodoTaskService.createTask(TodoTaskCreateCommand command);
TodoTaskService.markRead(Long todoId, Long userId);
TodoTaskService.complete(Long todoId, Long userId);
TodoTaskService.cancel(Long todoId, Long operatorId, String reason);
TodoTaskService.countUnread(Long userId);
```
业务模块只依赖 `TodoTaskService`,不直接操作待办表。
例如开票业务:
```java
todoTaskService.createTask(TodoTaskCreateCommand.builder()
.taskType("INVOICE_REVIEW")
.title("司机开票申请")
.summary("有新的开票申请需要处理")
.businessType("INVOICE_APPLY")
.businessId(invoiceId.toString())
.assigneeUserId(operatorUserId)
.routeName("InvoiceApplyDetail")
.idempotentKey("INVOICE_REVIEW:" + invoiceId + ":" + operatorUserId)
.build());
```
## 11. 通知刷新策略
### V1 推荐:轮询
- 登录后加载未读数量。
- 首页每 3060 秒刷新一次数量和最近待办。
- 打开待办中心时立即刷新。
- 处理完成后主动刷新当前列表和数量。
轮询实现简单,不需要改造现有 Netty、RabbitMQ 或新增 WebSocket 基础设施,适合本项目首期落地。
### V2 可选:实时推送
当待办实时性要求提高时,再增加 WebSocket 或 SSE。实时推送只负责通知前端刷新不直接承载任务数据前端收到事件后仍通过接口重新查询。
## 12. 非功能要求
- 接口必须使用当前登录用户做数据权限过滤。
- 内容字段需要进行 XSS 处理,详情页禁止直接渲染未经处理的 HTML。
- 所有状态变更记录操作人、操作时间和操作原因。
- 待办创建必须幂等,避免重复点击或重复回调产生重复任务。
- 首页查询应使用索引,目标响应时间不超过 500ms。
- 默认保留已完成任务至少 180 天,定时任务归档或清理历史数据。
- 待办跳转路由必须使用服务端生成或白名单校验,禁止直接执行前端传入的任意路由。
## 13. 验收标准
### 首页
- 用户登录后可以看到待办事项卡片。
- 未完成数量准确,数量为 0 时不显示红色数字或显示 0。
- 默认最多展示 3 条待办。
- 点击“查看全部”可以进入待办中心。
- 点击单条待办可以跳转对应业务页面。
### 状态
- 首次进入列表时未读待办显示未读样式。
- 点击待办后变为已读,但仍保持待处理状态。
- 业务处理成功后变为已完成,不再计入首页数量。
- 取消或过期任务不再计入待办数量。
- 重复触发同一业务事件不会产生重复有效待办。
### 权限
- 用户无法查询其他用户的待办。
- 无业务处理权限的用户不能完成待办。
- 管理员可以按权限查看和关闭异常待办。
### 首期业务
- 平台采购开票待办可以正常生成、展示、跳转和完成。
- 司机开票申请待办可以正常生成、展示、跳转和完成。
- 原有 `sys_notice` 公告功能不受影响。
## 14. 实施拆分
### 第一期:基础能力
- 建表和索引。
- 实体、Mapper、Service、Controller。
- 未读数、首页列表、分页列表、已读和完成接口。
- 首页待办卡片和待办中心页面。
### 第二期:开票接入
- 接入平台采购开票事件。
- 接入司机开票申请事件。
- 配置业务路由和完成条件。
- 增加接口和页面联调测试。
### 第三期:平台业务扩展
- 接入汇付开户、结算账户和提现异常。
- 接入清分异常和订单异常。
- 评估 WebSocket/SSE 实时推送。
## 15. 与现有 RuoYi 模块的关系
- `sys_notice` 继续作为全平台通知公告管理。
- 新增 `sys_todo_task` 作为用户待办任务管理。
- 沿用 RuoYi 的 `SysUser`、权限注解、数据权限和分页组件。
- 沿用现有 `BaseController``AjaxResult``TableDataInfo` 和前端 `request` 封装。
- 不建议把待办字段直接塞入 `sys_notice`,避免公告和业务任务互相污染。