利用轻易云平台完成跨系统数据集成与优化

  • 轻易云集成顾问-吴伟
### 案例分析:销售出库单对接销售订单(线上)-p 在本次技术案例中,我们将探讨如何通过轻易云数据集成平台实现旺店通·企业奇门与用友BIP的系统集成,具体目标是将旺店通·企业奇门中的销售出库单数据顺利对接到用友BIP内部的销售订单。整个集成过程不仅需要确保数据准确无误,还需考虑性能优化、接口调用以及异常处理等关键技术细节。 首先,要抓取从旺店通·企业奇门获取的数据,这里我们使用了`wdt.stockout.order.query.trade`这个API接口,实现定时拉取待处理的销售出库单数据。为了应对分页和限流的问题,采用了循环抓取加分页参数调整的方法,提高了抓取效率并避免漏单。 其次,对于大量的数据写入需求,我们选择批量操作来提升写入速度。在实际应用中,通过轻易云平台内置的批量写入功能,将多个记录一次性提交到用友BIP,从而大幅度提高了整体执行效率,同时保证数据的一致性和完整性。 在进行跨系统的数据传输时,不可避免地会遇到格式差异的问题。比如,在从旺店通获取的数据结构与用友BIP接受的数据格式之间存在显著差别,需要做相应的映射转换。这部分工作主要基于自定义映射规则,通过灵活配置字段对应关系,对各项关键指标如商品编码、数量等进行精准转换,以满足目标系统要求。 此外,为确保整个流程不发生错误或出现遗漏,还须建立健全的异常处理机制。如果在调用用友BIP API录入数据时遇到了网络波动或者其他意外情况,会自动触发重试机制,并配有详细日志记录以便后续查找问题来源及快速恢复业务运行状态。最终,成功调用 /yonbip/sd/voucherorder/singleSave 这一路径实现了高效稳定的数据存储。 总之,本案例体现了一系列针对大规模数据集成所涉及的重要技术点,包括但不限于接口联调优化、高并发环境下的性能保障、多种异常场景下可靠性的设计等,为类似项目提供了一套完整且实用的解决方案。在后续章节中,将进一步深入解析每一个步骤及其背后的实现逻辑,希望能够为您的工作带来有效参考与支持。 ![电商OMS与ERP系统接口开发配置](https://pic.qeasy.cloud/D37.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口wdt.stockout.order.query.trade获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是关键的第一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockout.order.query.trade`,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置API接口的基本信息和请求参数。根据提供的元数据配置,接口调用采用POST方法,主要参数包括开始时间、结束时间、状态、系统订单编号等。 ```json { "api": "wdt.stockout.order.query.trade", "method": "POST", "number": "order_no", "id": "stockout_id", "pagination": { "pageSize": 100 }, "request": [ {"field": "start_time", "label": "开始时间", "type": "datetime", "describe": "增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{LAST_SYNC_TIME|datetime}}"}, {"field": "end_time", "label": "结束时间", "type": "datetime", "describe": "增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{CURRENT_TIME|datetime}}"}, {"field": "status", "label": "状态", "type": "string", "describe": "5已取消,55已审核,95已发货,105 部分打款,110已完成,113:异常发货"}, {"field": "src_order_no", "label": "系统订单编号", "type": "string"}, {"field": "src_tid", "label": "原始单号", "type": "string"}, {"field": "stockout_no", "label": "出库单号", "type": "string"}, {"field":"shop_no","label":"店铺编号","type":"string","describe":"代表店铺所有属性的唯一编码,用于店铺区分"}, {"field":"warehouse_no","label":"仓库编号","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分"} ], ... } ``` #### 数据请求与清洗 在数据请求阶段,我们需要确保请求参数的准确性和完整性。特别是增量获取数据时,需要设置好`start_time`和`end_time`。这些时间参数可以通过轻易云平台内置的变量如`{{LAST_SYNC_TIME|datetime}}`和`{{CURRENT_TIME|datetime}}`自动填充。 此外,为了保证数据的一致性和准确性,我们还需要设置分页参数,以便能够处理大批量的数据。这里我们设置每页返回的数据条数为100: ```json { ... 'otherRequest': [ {"field":"page_size","label":"分页大小","type":"string","value":"100"}, {"field":"page_no","label":"页号","type":"string","value":"0"} ] } ``` #### 数据转换与写入 在获取到原始数据后,需要对其进行必要的转换和清洗。例如,将字段`consign_time`重命名为`consign_time_new`并将其格式化为日期类型: ```json { ... 'formatResponse': [ {"old":"consign_time","new":"consign_time_new","format":"date"} ] } ``` 此外,对于返回的数据中包含的嵌套结构,如`details_list`,我们可以使用扁平化处理将其展开,以便后续处理更加方便: ```json { ... 'beatFlat': ["details_list"] } ``` #### 异常处理与补偿机制 为了确保数据集成过程中的可靠性,我们需要设置异常处理和补偿机制。例如,通过定时任务(crontab)定期检查并重新请求失败的数据: ```json { ... 'omissionRemedy': { 'crontab': '0 0 * * *', 'takeOverRequest': [ { 'id':'4623d86a-46bc-303d-8f30-30945add6e62', 'field':'start_time', 'label':'开始时间', 'type':'datetime', 'is_required':true, 'describe':'增量获取数据,start_time作为开始时间', 'value':'{{DAYS_AGO_1|datetime}}' }, { 'id':'189afb22-1012-3a81-9c16-e5ac86c0382b', 'field':'end_time', 'label':'结束时间', 'type':'datetime', 'is_required':true, 'describe':'增量获取数据,end_time作为结束时间', 'value':'{{CURRENT_TIME|datetime}}' } ] } } ``` 通过上述配置和处理步骤,我们可以高效地调用旺店通·企业奇门接口获取销售出库单数据,并对其进行初步加工,为后续的数据转换与写入奠定基础。这一过程不仅提高了数据集成的效率,也确保了业务流程的透明度和可控性。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/S24.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:将销售出库单数据转换并写入用友BIP 在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL(提取、转换、加载)转换,最终写入目标平台用友BIPAPI接口。本文将详细探讨如何利用轻易云数据集成平台的元数据配置,实现这一过程。 #### 数据请求与清洗 首先,我们需要确保从源系统获取的数据是完整且准确的。通过轻易云的数据请求模块,可以实现对源系统数据的高效提取和初步清洗。假设我们已经完成了这一步,接下来重点讨论如何将这些数据转换为用友BIPAPI接口所能接受的格式。 #### 数据转换与写入 根据提供的元数据配置,我们需要将销售出库单的数据映射到用友BIPAPI接口所需的字段,并进行必要的数据转换。 ##### API接口配置 目标API接口为`/yonbip/sd/voucherorder/singleSave`,请求方法为POST。以下是主要字段及其配置: 1. **幂等性保证**: ```json {"field":"resubmitCheckKey","value":"{random}"} ``` 该字段用于保证请求的幂等性,由客户端生成全局唯一值。 2. **销售组织**: ```json {"field":"salesOrgId","value":"_findCollection find mapping_sale_org from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}"} ``` 通过查找映射关系获取销售组织ID或代码。 3. **交易类型**: ```json {"field":"transactionTypeId","value":"SO021"} ``` 固定值为`SO021`,表示特定交易类型。 4. **单据日期**: ```json {"field":"vouchdate","value":"{consign_time_new}"} ``` 使用源数据中的发货时间作为单据日期,格式为`yyyy-MM-dd HH:mm:ss`。 5. **客户信息**: ```json {"field":"agentId","value":"_findCollection find mapping_customer from 4769a428-14c4-33b8-91fd-e8da3b39d5cb where shop_no={shop_no}"} ``` 根据店铺编号查找客户ID或代码。 ##### 子表(销售订单子表)配置 子表字段较多,需要逐一映射和计算: 1. **仓库**: ```json {"field":"stockId","value":"{{details.warehouse_no}}"} ``` 2. **本币含税金额**: ```json {"field":"orderDetailPrices!natSum","value":"_function round({{details.details_list_total_amount}},2)"} ``` 3. **商品ID**: ```json {"field":"productId","value":"{{details.details_list_spec_no}}"} ``` 4. **主计量单位**: ```json {"field":"masterUnitId","value":"_findCollection find code from f9eedcc9-f1ff-31c0-9081-6aee9cf21740 where name={{details.details_list_unit_name}}"} ``` 5. **本币无税金额**: ```json {"field":"orderDetailPrices!natMoney","value":"_function round(round({{details.details_list_total_amount}},2)/(1+{{details.details_list_tax_rate}}),2)"} ``` 6. **税额计算**: ```json {"field":"orderDetailPrices!oriTax","value":"_function abs(round(round({{details.details_list_total_amount}},2)/(1+{{details.details_list_tax_rate}}),2)-round({{details.details_list_total_amount}},2))"} ``` 7. **数量及其他字段**: - 销售数量、计价数量等均直接从详情列表中提取。 - 例如:`{"field":"subQty","value":"{{details.details_list_goods_count}}"}` ##### 汇总计算 在所有子表记录处理完毕后,需要进行汇总计算。例如: ```json "groupCalculate": { "headerGroup": ["consign_time_new", "shop_no", "warehouse_no"], "bodyGroup": ["details_list_spec_no", "details_list_unit_name", "details_list_tax_rate"], "bodyName": "details", "calculate": { "details_list_share_amount": "$sum", "details_list_goods_count": "$sum", "receivable": "$sum", "details_list_paid": "$sum", "details_list_total_amount": "$sum" } } ``` 以上配置确保了在最终写入目标平台前,对各个字段进行必要的求和操作,以满足业务需求。 #### 数据写入目标平台 完成上述配置后,通过调用API接口,将转换后的数据提交到用友BIP系统。由于采用POST方法,请求体中包含所有必要的字段及其对应值。示例请求体如下: ```json { "resubmitCheckKey": "{random}", "salesOrgId": "...", "transactionTypeId": "SO021", ... "orderDetails": [ { "stockId": "...", ... "_status": "Insert" } ], "_status": "Insert" } ``` #### 审核与校验 最后,根据业务需求,可以调用审核API(如`/yonbip/sd/voucherorder/batchaudit`)对提交的数据进行审核,以确保其有效性和完整性。 通过以上步骤,我们成功地将源平台的数据进行了ETL转换,并通过轻易云数据集成平台无缝对接到了用友BIP系统。这不仅提高了数据处理效率,也确保了业务流程的一致性和可靠性。 ![金蝶云星空API接口配置](https://pic.qeasy.cloud/T21.png~tplv-syqr462i7n-qeasy.image)