从用友BIP到旺店通:采购订单数据无缝对接方案

  • 轻易云集成顾问-何语琴
### 用友BIP数据集成到旺店通·企业奇门案例分享:采购订单(红字)=>采购退料单-p 在本次技术案例中,我们将重点讨论如何高效地实现用友BIP系统中的采购订单(红字)数据与旺店通·企业奇门的采购退料单的数据对接。该解决方案旨在确保数据传输过程中的准确性、及时性和可靠性。 #### 集成需求分析 首先,我们需要从用友BIP系统获取特定条件下的采购订单(红字)信息,并通过API接口`/yonbip/scm/purchaseorder/list`进行实时抓取。随后,这些数据将按照业务规则转化为旺店通·企业奇门所需的格式,通过API接口`wdt.purchase.return.push`批量写入。 #### 数据获取与处理策略 为了保证集成过程中不漏单且不引起性能瓶颈,采用了以下关键措施: 1. **分页和限流处理**:由于用友BIP接口存在分页限制,需要针对大批量数据进行分页抓取,同时考虑到限流问题,在每次请求之间设置合理间隔,以避免触发API调用限制。 2. **实时监控与日志记录**:对整个数据处理过程进行实时监控,并详细记录日志。一旦出现错误或异常情况,可以快速定位并解决问题,确保数据完整传输。 3. **定时任务调度**:设计并实现定时任务,每隔固定时间段自动执行一次全流程操作,保证最新的数据能够及时同步至旺店通·企业奇门。 4. **异常处理与重试机制**:集成过程中难免会遇到网络抖动或服务临时不可用等情况,为此加入了全面的异常捕捉逻辑及重试机制,对于失败的操作会按照预设次数和间隔再次尝试,最大程度提高成功率。 #### 数据格式转换与映射 由于用友BIP和旺店通·企业奇门两者的数据结构存在差异,我们必须对原始返回的数据做适当的数据转换和映射。如统一字段名称、调整数值精度等工作必不可少。同时,还要根据业务需求自定义一些必要字段,从而满足目标系统对于输入参数的严格要求。在这一过程中使用了灵活易懂的数据映射工具,提高开发效率及可维护性。 本文接下来将详细介绍具体实施步骤,包括如何调用上述两个核心API进行有效通讯,以及应对此类复杂场景中的实际代码示例。我们着力于让整套方案具备良好的鲁棒性,同时保留尽可能高的性能表现。 ![如何开发企业微信API接口](https://pic.qeasy.cloud/D1.png~tplv-syqr462i7n-qeasy.image) ### 调用用友BIP接口获取并加工采购订单数据 在数据集成的生命周期中,第一步是调用源系统接口获取数据,并对其进行初步加工。本文将详细探讨如何通过轻易云数据集成平台调用用友BIP接口`/yonbip/scm/purchaseorder/list`来获取采购订单数据,并进行相应的数据清洗和转换。 #### 接口调用配置 首先,我们需要配置API请求的元数据。根据提供的元数据配置,我们可以看到该接口使用POST方法,以下是具体的请求参数: - **页码 (pageIndex)**: 默认值为1。 - **每页数 (pageSize)**: 默认值为1000。 - **查询表头 (isSum)**: 默认值为false。 - **查询条件 (simpleVOs)**: - **过滤条件1**: 查询字段为`totalQuantity`,比较符为`elt`(小于等于)。 - **过滤条件2**: 查询字段为`auditTime`,比较符为`egt`(大于等于),值为上次同步时间。 - **过滤条件3**: 查询字段为`org`,比较符为`eq`(等于),值为特定组织ID `1553156871271481351`。 - **排序字段 (queryOrders)**: - 排序条件字段为 `id`,顺序为 `asc`(正序)。 #### 数据请求与清洗 在完成API调用配置后,我们需要发送请求并处理返回的数据。以下是一个示例请求体: ```json { "pageIndex": "1", "pageSize": "1000", "isSum": "false", "simpleVOs": { "field1": { "field": "totalQuantity", "op": "elt" }, "field2": { "field": "auditTime", "op": "egt", "value1": "{{LAST_SYNC_TIME|datetime}}" }, "field3": { "field": "org", "op": "eq", "value1": "1553156871271481351" } }, "queryOrders": [ { "field": "id", "order": "asc" } ] } ``` #### 数据格式转换 为了确保数据能被目标系统正确识别和处理,我们需要对返回的数据进行格式转换。根据元数据配置中的 `formatResponse` 字段,我们需要将返回的数据字段进行重命名和格式化。例如: - 将返回的 `id` 字段重命名为 `new_id` - 将 `purchaseOrders_id` 重命名为 `new_purchaseOrders_id` - 将 `headFreeItem.define1` 重命名为 `new_headFreeItem` - 将 `vendor` 重命名为 `new_vendor` - 将 `warehouse` 重命名为 `new_warehouse` 以下是一个示例转换后的数据结构: ```json { "new_id": "<string>", "new_purchaseOrders_id": "<string>", "new_headFreeItem": "<string>", "new_vendor": "<string>", "new_warehouse": "<string>" } ``` #### 实际应用案例 假设我们从用友BIP接口获取到如下原始数据: ```json { "id": 12345, "purchaseOrders_id": 67890, "headFreeItem.define1": null, "vendor": { // Vendor details }, "warehouse": { // Warehouse details } } ``` 经过格式转换后,最终的数据结构如下: ```json { "new_id": "12345", "new_purchaseOrders_id": "67890", "new_headFreeItem": "", // Assuming vendor and warehouse are complex objects, they would be handled accordingly. } ``` 通过上述步骤,我们成功地调用了用友BIP接口获取采购订单数据,并进行了必要的数据清洗和格式转换,为后续的数据处理和写入打下了坚实的基础。这种全透明可视化的操作方式,不仅提升了业务透明度,还极大提高了效率。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/S22.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台ETL转换至旺店通·企业奇门API接口的技术案例 在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台——旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是一个详细的技术案例,展示如何使用轻易云数据集成平台完成这一过程。 #### 元数据配置解析 首先,我们需要了解元数据配置中的各个字段及其作用: ```json { "api": "wdt.purchase.return.push", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "vendor,warehouse,code,new_headFreeItem,new_memo", "bodyName": "detail_list", "header": ["new_vendor", "new_warehouse", "code", "new_headFreeItem", "new_memo", "vendor_code"], "body": ["product_cCode", "purchaseOrders_subQty", "listOriSum", "oriTaxUnitPrice", "listOriSum", "new_purchaseOrders_memo", "listTaxRate", "oriUnitPrice"] }, ... } ``` 这里定义了API接口`wdt.purchase.return.push`,采用POST请求方法,并启用了ID检查(`idCheck: true`)。操作部分指定了合并(`merge`)方法,将源数据中的特定字段映射到目标API请求中。 #### 请求参数解析与映射 元数据配置中定义了多个请求参数,每个参数都包含字段名、标签、类型、描述和值等信息。例如: ```json { "field": "provider_no", ... "value": "{vendor_code}" }, { ... } ``` 这些参数将源数据中的字段映射到目标API的请求参数中。具体来说,`provider_no`对应源数据中的`vendor_code`,这确保了供应商编号能够正确传递给目标系统。 #### 明细列表节点处理 一个关键部分是处理明细列表节点(`detail_list`),这是一个数组类型的数据节点,包含采购退货单所有货品明细属性信息: ```json { ... { "field": "spec_no", ... "value": "{{detail_list.product_cCode}}" }, { ... } ] ``` 每个子节点代表采购退货单中的一个属性,例如商品编码(`spec_no`)、退货数量(`num`)、单价(`price`)等。这些子节点通过模板语法从源数据中提取相应的值。 #### 数据转换逻辑实现 在ETL过程中,我们需要实现以下关键步骤: 1. **提取与清洗**:从源系统提取原始数据,并进行必要的数据清洗和预处理。 2. **转换**:根据元数据配置,将清洗后的数据转换为目标系统所需的格式。 3. **写入**:将转换后的数据通过API接口写入目标系统。 以下是一个示例代码片段,展示如何实现这些步骤: ```python import requests import json # 提取与清洗 source_data = get_source_data() # 假设这是从源系统获取的数据 cleaned_data = clean_data(source_data) # 数据清洗 # 转换 transformed_data = transform_data(cleaned_data, metadata_config) # 根据元数据配置进行转换 # 写入 api_url = 'https://api.wangdian.cn/erp/openapi2/wdt.purchase.return.push' headers = {'Content-Type': 'application/json'} response = requests.post(api_url, headers=headers, data=json.dumps(transformed_data)) if response.status_code == 200: print("Data successfully written to target system.") else: print(f"Failed to write data: {response.text}") ``` #### 转换函数示例 具体的转换函数可能如下所示: ```python def transform_data(data, config): transformed = {} for field in config['request']: transformed[field['field']] = evaluate_expression(field['value'], data) detail_list = [] for item in data['detail_list']: detail_item = {} for field in config['request'][5]['children']: detail_item[field['field']] = evaluate_expression(field['value'], item) detail_list.append(detail_item) transformed['detail_list'] = detail_list return transformed def evaluate_expression(expression, context): # 简单实现模板表达式解析,可以使用更复杂的模板引擎如Jinja2 return expression.format(**context) ``` 上述代码展示了如何根据元数据配置将源数据转换为目标API所需的格式,并通过POST请求将其写入目标系统。通过这种方式,我们能够实现不同系统间的数据无缝对接,确保业务流程顺畅高效。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/T15.png~tplv-syqr462i7n-qeasy.image)