furniture-3d-system-Wu/furniture-3d-system/docs/架构设计/OA看板-钉钉待办接入方案-20260729.md

311 lines
7.7 KiB
Markdown

# OA 看板钉钉待办接入方案
## 结论
正式系统**不能只靠新增环境变量**就直接发送钉钉待办。
原因:
1. 仓库当前只实现了钉钉登录与用户识别,没有“创建 / 更新 / 删除钉钉待办”的服务代码。
2. 当前没有“业务流程记录 <-> 钉钉待办 ID”的持久化表。
3. 当前没有发送幂等、失败重试、关闭待办、升级提醒等基础能力。
但从现有代码基础看,**补一层服务实现后,再由正式环境配置环境变量即可上线**。
## 现有基础
### 已具备
1. 钉钉 OAuth 登录能力
- 文件:`src/server/services/dingtalk-auth.service.ts`
- 已能完成:
- 构建授权地址
- 获取用户 access token
- 获取 unionId
- 获取 app access token
- 用 unionId 换取 userId
- 获取用户详情
2. 用户钉钉身份字段
- 系统已保存并使用:
- `dingtalkUserId`
- `dingtalkUnionId`
3. OA 看板责任人映射
- OA 看板已经能把不同阶段映射到默认责任角色 / 人员字段。
- 例如首单下单待发起时可兜底为 `采购/跟单`。
4. 责任与跟进界面基础
- 页面已有“责任与跟进”区域,适合作为钉钉待办的业务入口。
### 尚缺失
1. 钉钉待办发送 service
2. 待办投递日志表
3. 待办幂等规则
4. 待办关闭 / 更新规则
5. 定时升级提醒任务
6. 正式环境待办配置项
## 官方能力判断
根据钉钉开放平台官方文档,待办能力当前支持:
1. 创建工作待办
2. 更新待办
3. 删除待办
4. 查询用户待办
与本项目相关的关键点:
1. 创建待办时需要应用身份和用户身份,不能只知道姓名。
2. 待办通常需要可回跳的 `detailUrl`,跳回本系统详情页或看板页。
3. 如果要做闭环,流程状态变更后还要同步更新或关闭钉钉侧待办。
官方文档参考:
- [待办概述](https://open.dingtalk.com/document/development/dingtalk-todo-task-overview)
- [创建钉钉待办任务](https://open.dingtalk.com/document/development/add-dingtalk-to-do-task)
- [更新钉钉待办任务](https://open.dingtalk.com/document/development/updates-dingtalk-to-do-tasks)
- [删除钉钉待办任务](https://open.dingtalk.com/document/development/delete-dingtalk-to-do-tasks)
- [更新钉钉待办执行者状态](https://open.dingtalk.com/document/development/update-dingtalk-to-do-status)
## 正式环境建议新增的环境变量
下面这些变量建议作为**待办功能正式接入专用配置**。当前代码尚未消费它们。
```env
# 是否启用 OA 看板钉钉待办
DINGTALK_TODO_ENABLED=false
# 钉钉开放平台 API 应用配置(待办、审批等服务端调用)
DINGTALK_API_CLIENT_ID=
DINGTALK_API_CLIENT_SECRET=
# 钉钉网页登录使用独立 OAuth 应用配置,不与 API 应用混用
DINGTALK_LOGIN_CLIENT_ID=
DINGTALK_LOGIN_CLIENT_SECRET=
DINGTALK_CALLBACK_ORIGIN=
# 待办跳转回系统的基础地址
DINGTALK_TODO_DETAIL_BASE_URL=
# 用于构造钉钉待办来源标识 / 业务空间
DINGTALK_TODO_SOURCE_APP=oa-board
# 是否开启超时升级提醒
DINGTALK_TODO_ESCALATION_ENABLED=false
# 超时升级阈值(天)
DINGTALK_TODO_ESCALATION_DAYS=3
```
如果最终接入方案要求额外的应用标识,还可能需要:
```env
DINGTALK_AGENT_ID=
```
是否必须取决于最终选用的钉钉待办接口版本与应用类型。
## 建议新增的数据表
建议新增一张专门的待办投递表,避免把钉钉待办状态散落在 JSON 里。
建议表名:
- `oa_board_dingtalk_todo_dispatch`
用途:
1. 记录某个业务流程 / 阶段是否已创建钉钉待办
2. 保存钉钉待办 ID / 执行人 / 状态
3. 支持去重、重试、关闭、审计
SQL 草案见:
- `scripts/sql/create-oa-board-dingtalk-todo-dispatch-table.sql`
## 建议的发送时机
### 第一阶段:最小闭环
先只做一类待办:
1. 当流程进入新的“当前审批阶段”
2. 且解析出了唯一责任人
3. 且该阶段还没有有效待办
4. 则创建一条钉钉待办
建议首批接入阶段:
1. `产品设计-外观`
2. `产品设计-结构`
3. `产品生产-首单下单`
4. `限价-发起`
原因:
1. 这些阶段责任人相对清晰
2. 都已经有字段或规则可映射负责人
3. 业务价值高,适合先验证
### 第二阶段:关闭与更新
当以下任一情况发生时,同步钉钉待办:
1. 当前阶段变化
- 关闭旧待办
- 为新阶段责任人创建新待办
2. 流程完成 / 驳回 / 终止
- 关闭对应待办
3. 负责人变更
- 更新执行人,或关闭旧待办后重建
### 第三阶段:升级提醒
当流程满足以下条件时再发升级提醒:
1. 阶段超时
2. 原待办已创建
3. 距离上次提醒超过冷却时间
4. 升级接收人可解析
升级对象建议:
1. 当前负责人
2. 当前负责人上级
3. 商品企划 / 荆川 / 管理员可选兜底
## 负责人解析策略
待办发送目标不能只靠中文名,必须最终落到钉钉身份。
建议解析顺序:
1. 当前运行任务的 `userId`
- 直接映射 `dingtalkUserId`
2. 表单中责任人字段
- 如 `appearanceDesigner`、`structureDesigner`、`merchandiserOwner`、`pricingOwner`
- 用姓名匹配本地用户 / 员工目录,取 `dingtalkUserId`
3. 阶段默认角色兜底
- 例如 `采购/跟单`
- 通过角色到成员名单的映射表进一步解析
如果一个阶段只能解析到“角色名”而不能解析到唯一员工,建议:
1. 不直接发待办
2. 记录 `NEEDS_OWNER_MAPPING`
3. 在看板中提示“负责人映射未完成”
## 需要新增的服务模块
建议至少拆成这几个文件:
1. `src/server/services/dingtalk-todo.service.ts`
- 创建 / 更新 / 删除待办
- 管理 app token
2. `src/server/services/oa-board-dingtalk-todo-dispatch.service.ts`
- 负责业务规则
- 判断是否该发待办
- 生成 payload
- 落库记录
3. `src/server/services/oa-board-owner-resolution.service.ts`
- 负责将阶段负责人解析成钉钉用户
4. `scripts/sync-oa-board-todos.ts`
- 用于定时补发、关闭、升级
## 需要新增的 API / 任务
### 后台任务
建议新增定时任务:
1. `sync:oa-board:todos`
- 扫描当前有效流程
- 创建缺失待办
- 关闭失效待办
- 触发升级提醒
### 管理接口
如有需要,可新增:
1. `POST /api/intake/oa-board/todo-dispatch/retry`
- 手工重试失败待办
2. `GET /api/intake/oa-board/todo-dispatch`
- 查看待办发送日志
## 幂等与重试建议
待办系统必须做幂等。
建议唯一业务键:
```text
board_key + stage_key + receiver_dingtalk_user_id
```
规则:
1. 同一个业务键,只允许存在 1 条 `OPEN / PENDING / RETRYING` 记录
2. 接口超时后不立即重发,先查日志状态
3. 网络失败按指数退避重试
## 正式环境能否“只配置就开”
最终判断:
1. **现在不能**
- 因为缺少待办发送代码和日志表
2. **补完代码后可以**
- 正式系统只需配置环境变量
- 再开启定时任务即可
## 推荐落地顺序
### P1
1. 新增待办投递表
2. 新增 `dingtalk-todo.service.ts`
3. 先打通“创建待办”
4. 先只接 `产品生产-首单下单`
### P2
1. 接入更多阶段
2. 做关闭 / 更新逻辑
3. 做负责人映射异常日志
### P3
1. 做超时升级提醒
2. 做看板内待办发送状态可视化
3. 做手工重试与运维面板
## 建议的产品口径
为了降低误发风险,建议待办文案统一包含:
1. 开款编号
2. 当前阶段
3. 目标动作
4. 超时状态
5. 跳转链接
示例:
```text
【OA 新品流程看板】XP2026070900000291 已进入“产品生产-首单下单”,请尽快处理。
```