文章 / 公众号历史文章
【超级案例后续篇】超预期实现在WPS多维表格上与金蝶ERP实现订阅消息联动
昨天的推文中,联动方案第5点,在写推文时其实还没跑通的,很幸运,昨天的时间里,真正跑通了第5点的效果:使用WPS多维表格的webhook,接收到ERP采购订单的变更消息,在WPS多维表格里使用airscript实现了数据的同步操作。 【超级案例】数据工具全栈能手带你联动ERP与低零代码平台数据极致流
昨天的推文中,联动方案第5点,在写推文时其实还没跑通的,很幸运,昨天的时间里,真正跑通了第5点的效果:使用WPS多维表格的webhook,接收到ERP采购订单的变更消息,在WPS多维表格里使用airscript实现了数据的同步操作。
【超级案例】数据工具全栈能手带你联动ERP与低零代码平台数据极致流转
这个方案如果作为通用方案时它的难点在于:
1、ERP接口向webhook接口推送消息时,要求一定的格式响应内容返回。
在金蝶的接口文档里,有要求以下的响应内容
{"errcode": "0","description":xxx,"data": {"status": "0","msg": xxx,"type": xxx }}
在一般的webhook接口里,貌似没有办法定义它的返回响应内容。更要命的是,WPS的多维表格的webhook,还要对请求头有强制要求增加Origin参数。

结果很幸运的是,虽然有诸多的要求,但最后测试下来,都无感通过了。
2、发起ERP请求获取数据时,一般需要对请求头作签名处理,保护接口合规安全被调用。



上述金蝶文档里可看到,要实现这个签名,还真不容易,要有给定的算法,在本次项目里,之所以将影刀RPA引进来,也是基于影刀可以使用python脚本代码,将官方的python脚本的实现,在AI调整优化后,好不容易终于可以在调用起来,而本次的挑战是:虽然将这个签名算法,实现成js脚本代码,并且可以在WPS的airscript上使用。
万幸的是,投喂了已实现的python版本和airscript的开发文档后,终于成功了,可以在airscript上顺利发起金蝶ERP的接口访问,形成闭环,从webhook接收到订阅消息,从订阅消息里识别到哪个采购订单更新了,接着在airscript上向ERP发起这个采购订单的详细信息,获取到它的商品信息。
整个自动化流程如下:

这个webhook消息表,不是必须,只是为了方便测试,只有特定状态,特定单据类型的消息,才需要关注起来。

而在airscript层面的代码,就是先删除已有数据,再插入新的ERP接口返回的数据,颗粒度到商品级别。
function main() { try { let jsonObj = Context.argv.data; if (jsonObj.bizType && jsonObj.bizType == "pur_bill_order") { let billStatus = jsonObj.data.billstatus; if (billStatus && billStatus == true) { let bill_ID = jsonObj.data.id.toString(); let bill_number = jsonObj.data.number; console.log("bill_ID:"+bill_ID); console.log("bill_number:"+bill_number) let sht = Application.Sheets("采购订单表"); const critera1 = Criteria("@采购订单编号", "Equals", [bill_number]); const critera2 = Criteria("@采购订单ID", "Equals", [bill_ID]); const criterias = []; criterias.push(critera1); criterias.push(critera2); // 创建filters const filters = []; const filter = { Criterias: criterias, Op: "OR" }; filters.push(filter); const res = sht.Views(1).RecordRange.Condition(filters, "AND"); if (res) { console.log("筛选到已存在数据量:"+res.Value.length) res.Delete(); } else{ console.log("筛选不到数据") } let dataById = getPurchaseOrderDetail({ number: bill_number }); let billID = dataById.id; let billNumber = dataById.bill_no; let billDate = dataById.bill_date; let supplier_name = dataById.supplier_name; console.log(dataById); console.log("material_entity数组数量:"+dataById.material_entity.length); for (let i = 0; i < dataById.material_entity.length; i++) { let material_id = dataById.material_entity[i].material_id; let qty = dataById.material_entity[i].qty; let newRow = sht.Views(1).RecordRange.Add().Item(1); newRow.Item(1, "@商品ID").Value = material_id; newRow.Item(1, "@采购数量").Value = qty; newRow.Item(1, "@采购订单ID").Value = billID; newRow.Item(1, "@采购订单编号").Value = billNumber; newRow.Item(1, "@采购日期").Value = billDate; newRow.Item(1, "@供应商名称").Value = supplier_name; } } } } catch (e) { console.log("执行异常:", e.stack || e.message || e); }}main();
最后,成果大功告成,采购人员在ERP上创建完采购订单并审核后,WPS多维表格接收到ERP调用webhook后的消息推送,webhook的自动化流程的下游就是调用airscript脚本,实现向ERP发起请求,获取到此采购订单的完整数据,特别是商品信息,再将商品信息基础表里的商品的其他信息特别是图片、文件信息带到此表中,外部供应商就可以直接使用WPS多维表格的分享链接,获取到此订单的详细附件信息(可以简单设置下分享权限,不同供应商只能查看自己的采集订单信息,保证数据安全)。
