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