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

广东省
浏览 312
收藏
4
分享
4 +1
3
+1
全部评论 3
 
欲水
学习
· 四川省
回复
 
杯莫停
过来学习一下
· 浙江省
回复
 
Vicky
学习
· 上海
回复