返回公众号历史文章目录

文章 / 公众号历史文章

【超级案例后续篇】超预期实现在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多维表格的分享链接,获取到此订单的详细附件信息(可以简单设置下分享权限,不同供应商只能查看自己的采集订单信息,保证数据安全)。

公众号文章插图