采购订单撤销同步实战:钉钉审批撤回 → 金蝶云星空 CancelAssign
这个策略解决什么问题
在某制造企业的采购协同流程里,采购订单先在金蝶云星空创建并审核,再通过审批流分发到钉钉做线下确认。一旦申请人在钉钉端撤回或审批人撤销该流程,金蝶侧的订单必须同步撤销,否则就会出现「钉钉已撤回、金蝶还在跑」的孤儿单。这个策略就是把这一个撤销动作,干净利落地从钉钉传到金蝶。
数据流向与字段映射
数据流向:钉钉审批实例 → 轻易云(中间层) → 金蝶云星空 CancelAssign。源端不是订单本体,而是一条审批事件;目标端也不是写入新单,而是执行撤销。
| 源(钉钉表单/接口) | 目标(金蝶请求体) | 映射类型 | 说明 |
|---|---|---|---|
| 表单控件「单据编号」 | Numbers | DIRECT | {{单据编号}},作为编码集合传入 |
| — | Ids | COLLECTION | _findCollection find FID from {{查询方案ID}} where FBillNo={{单据编号}},由单据编号联查金蝶 FID |
| — | FormId | CONSTANT | PUR_PurchaseOrder,金蝶采购订单业务对象表单 ID |
| — | IgnoreInterationFlag | CONSTANT | true,允许忽略交互提示,避免弹窗阻塞 |
| — | NetworkCtrl | CONSTANT | false,不启用网控 |
| — | IsVerifyProcInst | CONSTANT | false,不校验关联工作流 |
这里最关键的两列是 Numbers 和 Ids。金蝶撤销接口允许用编码或 FID 任一传入,因此稳妥的做法是两者都填,编码走表单,FID 走联查,任意一个命中都能落库。
在轻易云上如何配置
在轻易云数据集成平台(Qeasy)的策略编辑器里,按以下要点配置:
- 源端:平台选「钉钉」,API 选
topapi/processinstance/get,效果QUERY,主键id。response 列表里把「单据编号」勾上,并在 describe 里标注_autoFillResponse,让钉钉表单控件值自动填充到变量。 - 目标端:平台选「金蝶云星空」,API 选
CancelAssign,效果EXECUTE。FormId写常量PUR_PurchaseOrder;Numbers用{{单据编号}}直接引用;Ids用 COLLECTION 类型,表达式填_findCollection find FID from {{查询方案ID}} where FBillNo={{单据编号}}。 - 联查依赖:确保平台里已经存在一个【查询】金蝶采购订单的方案,这是 _findCollection 的数据来源,审核策略与撤销策略可以共用同一个联查方案,这是我们给客户做集中管理时常用的模式——把所有「按单据编号找 FID」的需求都收口到一个查询方案,后续策略只引用不复制。
- 调度:两端均设为
*/3 * * * *,源端每 3 分钟拉一次新增/变更的审批实例,目标端同步执行。撤销是低频动作,3 分钟粒度足够,无需降到 1 分钟。 - 开关:把
IgnoreInterationFlag显式设为true,这是撤销类策略的标准做法,否则金蝶侧若有交互弹窗,任务会卡死。
实施步骤
- 联查方案前置化:先在轻易云里建好「【查询】金蝶采购订单」,确认能按
FBillNo返回FID,这是撤销与审核两个策略共用的底座。 - 撤销策略落地:新建策略,按上节完成源端、目标端与字段映射,先手动触发一次,观察
_findCollection是否能取到 FID、CancelAssign 是否返回成功。 - 增量起点配置:源端以「审批实例 id」去重,只处理状态变为「已撤销/已撤回」的实例,避免重复执行。
- 全量触发:首次上线时,用一次全量扫描兜底,把历史上「钉钉已撤、金蝶未撤」的孤儿单补齐;之后再回归增量。
- 调度频率:双方都按 3 分钟轮询;如果审批量很大,可以单独把源端调到 1 分钟,目标端保持 3 分钟,形成「上游快、下游稳」的节奏。
- 复核:上线后一周内,每天抽 3-5 单比对钉钉状态与金蝶状态,确认联动无误后再放宽监控。
踩坑复盘
- 单据编号拿不到,撤销直接失败。钉钉
topapi/processinstance/get返回的是审批流结构,单据编号藏在form_component_values或extend里。务必在 source response 里配_autoFillResponse,否则下游{{单据编号}}会是空字符串,金蝶侧直接报错「Numbers 不能为空」。 - 只传 Numbers 不传 Ids,接口偶发失败。金蝶某些版本在编码带前缀(如
PO-2024-xxx)时,纯编码匹配会落空。稳妥的做法是 Numbers 与 Ids 同时传,让金蝶自行判断,这是我们做客户项目时的默认配置。 _findCollection语法写错,联查返回空。典型错误是在where FBillNo = {{单据编号}}里加了空格,或者方案 ID 写错。该语法对空格敏感,字段名和值之间不能有空格,且方案 ID 必须是当前租户内可访问的查询方案。IgnoreInterationFlag没设 true,任务卡死。金蝶撤销在某些校验场景下会弹出交互框,如果不忽略,异步任务会被挂起,表象是「策略一直运行中但没结果」。- 撤销与审核共用联查方案,却忘了同步更新。如果查询方案里的字段被改了,审核和撤销会同时出问题。所以凡是共用底座,改一处就要回归两处,这是集中管理模式必须付出的纪律成本。
适用场景与不适用场景
适用:钉钉做审批入口、金蝶做业务系统,且审批状态需要反向联动业务单据(撤销、反审核、关闭)的场景。不适用:钉钉端没有「单据编号」表单控件、或者金蝶侧订单已发生过下游交易(如已收料、已入库)而无法直接撤销的场景,这类情况需要先做下游清理再走撤销。
本文为原创内容,转载请注明出处:https://www.qeasy.cloud/insights/solutions/strat-kingdee-cloud-dingtalk-9407-n7d5807b2-32ae00c9