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

  • 轻易云集成顾问-何语琴

用友BIP数据集成到旺店通·企业奇门案例分享:采购订单(红字)=>采购退料单-p

在本次技术案例中,我们将重点讨论如何高效地实现用友BIP系统中的采购订单(红字)数据与旺店通·企业奇门的采购退料单的数据对接。该解决方案旨在确保数据传输过程中的准确性、及时性和可靠性。

集成需求分析

首先,我们需要从用友BIP系统获取特定条件下的采购订单(红字)信息,并通过API接口/yonbip/scm/purchaseorder/list进行实时抓取。随后,这些数据将按照业务规则转化为旺店通·企业奇门所需的格式,通过API接口wdt.purchase.return.push批量写入。

数据获取与处理策略

为了保证集成过程中不漏单且不引起性能瓶颈,采用了以下关键措施:

  1. 分页和限流处理:由于用友BIP接口存在分页限制,需要针对大批量数据进行分页抓取,同时考虑到限流问题,在每次请求之间设置合理间隔,以避免触发API调用限制。

  2. 实时监控与日志记录:对整个数据处理过程进行实时监控,并详细记录日志。一旦出现错误或异常情况,可以快速定位并解决问题,确保数据完整传输。

  3. 定时任务调度:设计并实现定时任务,每隔固定时间段自动执行一次全流程操作,保证最新的数据能够及时同步至旺店通·企业奇门。

  4. 异常处理与重试机制:集成过程中难免会遇到网络抖动或服务临时不可用等情况,为此加入了全面的异常捕捉逻辑及重试机制,对于失败的操作会按照预设次数和间隔再次尝试,最大程度提高成功率。

数据格式转换与映射

由于用友BIP和旺店通·企业奇门两者的数据结构存在差异,我们必须对原始返回的数据做适当的数据转换和映射。如统一字段名称、调整数值精度等工作必不可少。同时,还要根据业务需求自定义一些必要字段,从而满足目标系统对于输入参数的严格要求。在这一过程中使用了灵活易懂的数据映射工具,提高开发效率及可维护性。

本文接下来将详细介绍具体实施步骤,包括如何调用上述两个核心API进行有效通讯,以及应对此类复杂场景中的实际代码示例。我们着力于让整套方案具备良好的鲁棒性,同时保留尽可能高的性能表现。 如何开发企业微信API接口

调用用友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调用配置后,我们需要发送请求并处理返回的数据。以下是一个示例请求体:

{
  "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

以下是一个示例转换后的数据结构:

{
  "new_id": "<string>",
  "new_purchaseOrders_id": "<string>",
  "new_headFreeItem": "<string>",
  "new_vendor": "<string>",
  "new_warehouse": "<string>"
}

实际应用案例

假设我们从用友BIP接口获取到如下原始数据:

{
  "id": 12345,
  "purchaseOrders_id": 67890,
  "headFreeItem.define1": null,
  "vendor": {
    // Vendor details
  },
  "warehouse": {
    // Warehouse details
  }
}

经过格式转换后,最终的数据结构如下:

{
  "new_id": "12345",
  "new_purchaseOrders_id": "67890",
  "new_headFreeItem": "",
  // Assuming vendor and warehouse are complex objects, they would be handled accordingly.
}

通过上述步骤,我们成功地调用了用友BIP接口获取采购订单数据,并进行了必要的数据清洗和格式转换,为后续的数据处理和写入打下了坚实的基础。这种全透明可视化的操作方式,不仅提升了业务透明度,还极大提高了效率。 企业微信与ERP系统接口开发配置

轻易云数据集成平台ETL转换至旺店通·企业奇门API接口的技术案例

在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台——旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是一个详细的技术案例,展示如何使用轻易云数据集成平台完成这一过程。

元数据配置解析

首先,我们需要了解元数据配置中的各个字段及其作用:

{
  "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请求中。

请求参数解析与映射

元数据配置中定义了多个请求参数,每个参数都包含字段名、标签、类型、描述和值等信息。例如:

{
  "field": "provider_no",
  ...
  "value": "{vendor_code}"
},
{
  ...
}

这些参数将源数据中的字段映射到目标API的请求参数中。具体来说,provider_no对应源数据中的vendor_code,这确保了供应商编号能够正确传递给目标系统。

明细列表节点处理

一个关键部分是处理明细列表节点(detail_list),这是一个数组类型的数据节点,包含采购退货单所有货品明细属性信息:

{
  ...
  {
    "field": "spec_no",
    ...
    "value": "{{detail_list.product_cCode}}"
  },
  {
    ...
    }
]

每个子节点代表采购退货单中的一个属性,例如商品编码(spec_no)、退货数量(num)、单价(price)等。这些子节点通过模板语法从源数据中提取相应的值。

数据转换逻辑实现

在ETL过程中,我们需要实现以下关键步骤:

  1. 提取与清洗:从源系统提取原始数据,并进行必要的数据清洗和预处理。
  2. 转换:根据元数据配置,将清洗后的数据转换为目标系统所需的格式。
  3. 写入:将转换后的数据通过API接口写入目标系统。

以下是一个示例代码片段,展示如何实现这些步骤:

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}")

转换函数示例

具体的转换函数可能如下所示:

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接口

更多系统对接方案