使用轻易云实现金蝶云星空API数据ETL转换的最佳实践

  • 轻易云集成顾问-黄宏棵

聚水潭数据集成到金蝶云星空:聚水潭盘亏=>金蝶其他出库

在这篇技术案例中,我们将深入探讨如何有效地实现聚水潭数据与金蝶云星空的对接,特别是通过轻易云数据集成平台,将聚水潭的盘亏信息快速、准确、高效地写入到金蝶云星空中的其他出库模块中。具体方案命名为“聚水潭盘亏=>金蝶其他出库”。

首先,为了确保数据不漏单,我们需要从聚水潭获取最新的库存盘点结果。这一步骤可以通过调用API接口 /open/inventory/count/query 来定时抓取最新的数据,并实时监控和记录日志,以便在发生异常时能够及时重试。处理接口的分页和限流问题是关键,因为这些限制直接影响到大量数据能否顺利被抓取。

紧接着,处理完来自聚水潭的数据后,需要考虑如何将这些数据批量高效地导入到金蝶云星空。在这个环节,通过调用 batchSave API,我们可以实现大规模数据写入。但需要注意的是,由于两个系统之间可能存在的数据格式差异,我们必须进行必要的数据映射和转换,使得传输过程平稳无误。

最后,在整个过程中,对任何潜在错误都要有完善的异常处理机制,包括自动重试功能,确保在遭遇问题时不会丢失关键信息。此外,为保持业务流程的一致性,应对每个步骤进行实时监控并记录详细日志,以便随时追踪和审计。

本技术方案还将在后续章节中详述具体实施步骤及配置细节,从而帮助您更好地理解并应用这一集成解决方案。 用友与SCM系统接口开发配置

调用聚水潭接口获取并加工数据的技术实现

在数据集成生命周期的第一步,我们需要调用源系统聚水潭的接口/open/inventory/count/query来获取数据,并对其进行初步加工。本文将详细探讨如何配置和调用该接口,以及如何处理返回的数据。

接口配置与请求参数

根据提供的元数据配置,我们需要向聚水潭接口发送一个POST请求。以下是请求参数的详细配置:

  • page_index: 开始页码,默认为1。
  • page_size: 每页条数,默认为30,最大50。
  • modified_begin: 修改开始时间,使用上次同步时间({{LAST_SYNC_TIME|datetime}})。
  • modified_end: 修改结束时间,使用当前时间({{CURRENT_TIME|datetime}})。
  • io_ids: 指定盘点单号,可选参数,多个单号用逗号分隔。
  • status: 单据状态,默认值为"Confirmed"。

这些参数确保我们能够分页获取在指定时间段内已确认的盘点单数据。

请求示例

以下是一个POST请求的示例:

{
  "page_index": "1",
  "page_size": "50",
  "modified_begin": "2023-10-01T00:00:00Z",
  "modified_end": "2023-10-07T23:59:59Z",
  "status": "Confirmed"
}

数据过滤条件

根据元数据配置中的条件,我们需要对返回的数据进行过滤。具体条件如下:

  • items.qty < 0: 仅保留数量小于0的记录。这一条件用于筛选出盘亏的数据。

数据处理流程

  1. 发送请求并获取响应:通过HTTP客户端发送上述POST请求,并接收聚水潭接口返回的数据。
  2. 解析响应数据:将响应数据解析为JSON格式,以便后续处理。
  3. 应用过滤条件:遍历响应中的每一条记录,根据条件items.qty < 0进行筛选。
  4. 转换与写入:将筛选后的数据转换为目标系统所需的格式,并写入金蝶其他出库系统。

以下是一个Python代码示例,用于实现上述流程:

import requests
import json
from datetime import datetime, timedelta

# 配置请求参数
last_sync_time = (datetime.now() - timedelta(days=7)).strftime('%Y-%m-%dT%H:%M:%SZ')
current_time = datetime.now().strftime('%Y-%m-%dT%H:%M:%SZ')

payload = {
    "page_index": "1",
    "page_size": "50",
    "modified_begin": last_sync_time,
    "modified_end": current_time,
    "status": "Confirmed"
}

# 发送POST请求
response = requests.post('https://api.jushuitan.com/open/inventory/count/query', json=payload)
data = response.json()

# 筛选并处理数据
filtered_data = [item for item in data['items'] if item['qty'] < 0]

# 转换并写入目标系统(示例)
for record in filtered_data:
    transformed_record = {
        'item_id': record['item_id'],
        'quantity': abs(record['qty']),
        'timestamp': record['modified']
    }
    # 假设write_to_kingdee是一个写入金蝶系统的函数
    write_to_kingdee(transformed_record)

注意事项

  1. 分页处理:如果返回的数据量较大,需要实现分页逻辑,逐页获取并处理所有数据。
  2. 错误处理:需要添加错误处理机制,以应对网络问题或API调用失败等情况。
  3. 性能优化:对于大批量数据,可以考虑批量处理和异步操作以提高效率。

通过以上步骤,我们可以高效地从聚水潭系统中获取所需的数据,并将其加工后导入到目标系统,实现不同系统间的数据无缝对接。 如何开发金蝶云星空API接口

使用轻易云数据集成平台实现金蝶云星空API接口的数据ETL转换

在数据集成的过程中,ETL(提取、转换、加载)是关键步骤之一。本文将详细探讨如何利用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。

数据请求与清洗

在数据集成生命周期的第一步,我们已经完成了数据请求与清洗工作。接下来,我们将重点关注如何将清洗后的数据进行转换并写入金蝶云星空。

元数据配置解析

元数据配置是实现ETL过程的核心,通过对元数据的解析和处理,可以确保数据格式符合目标平台的要求。以下是我们在轻易云数据集成平台中配置的元数据:

{
  "api": "batchSave",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "rowsKey": "array",
    "rows": 1,
    "method": "batchArraySave"
  },
  "request": [
    {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{io_id}"},
    {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"QTCKD01_SYS"},
    {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"},
    {"field":"FPickOrgId","label":"领用组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100"},
    {"field":"FStockDirect","label":"库存方向","type":"string","describe":"下拉列表","value":"GENERAL"},
    {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{io_date}"},
    {"field":"FDeptId","label":"领料部门","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"01.05"},
    {"field": "FOwnerTypeIdHead", "label": "货主类型", "type": "string", "describe": "多类别基础资料列表", "value": "BD_OwnerOrg"},
    {"field": "FOwnerIdHead", "label": "货主", "type": "string", "describe": "多类别基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "100"},
    {"field": "FNote", "label": "备注", "type": "string", "describe": “多行文本”, “value”: “聚水潭盘亏单同步,备注:{remark}”},
    {
      “field”: “FEntity”,
      “label”: “明细信息”,
      “type”: “array”,
      “children”: [
        {“field”: “FMaterialId”, “label”: “物料编码”, “type”: “string”, “describe”: “基础资料”, “parser”: {“name”: “ConvertObjectParser”, “params”: “FNumber”}, “value”: "{{items.sku_id}}",“parent”:"FEntity","mapping":{"target:"64a3807b7d4864662c12cee5","direction:"positive"}},
        {“field”:"FQty","label”:"实发数量","type”:"string","describe”:"数量","value”:"_function {{items.qty}} *(-1)","parent:" FEntity""},
        {“field”:"FStockId","label”:"发货仓库","type”:"string","describe”:"基础资料","parser:{"name:"ConvertObjectParser","params:"FNumber"},""value:"01.03""parent:" FEntity""},
        {“field”:FAmount”,” label:“总成本”,” type:“ string”,” describe:“金额”, parent:“ FEntity”},
        {“ field: FPrice”,“ label: 成本价”,“ type: string”,“ describe: 单价”,“ parent: FEntity”},
        {“ field: FOwnerTypeId”,“ label: 货主类型”,“ type: string”,“ describe: 多类别基础资料列表”,“ value: BD_OwnerOrg”,“ parent: FEntity”},
        {“ field: FOwnerId”,“ label: 货主”,“ type: string”,“ describe: 多类别基础资料”,“ parser:{ name:“ ConvertObjectParser”, params:“ FNumber”, value:“ 100”, parent:“ FEntity”},
        {“ field:FEntryNote”,“ label:备注”,“ type: string”,“ describe:多行文本”, parent:“ FEntity”}
      ],
      value:“ items”
    }
  ],
  otherRequest:[
     {
       field:“ FormId”,
       label:“业务对象表单 Id”,
       type:“ string”,
       describe:“必须填写金蝶的表单 ID 如: PUR_PurchaseOrder”,
       value:“ STK_MisDelivery”
     },
     {
       field:“ IsAutoSubmitAndAudit”,
       label:“提交并审核”,
       type:“ bool”,
       value:“ true”
     },
     {
       field:“ IsVerifyBaseDataField”,
       label:“验证基础资料”,
       type:“ bool”,
       describe:“是否验证所有的基础资料有效性,布尔类,默认 false(非必录)”,
       value:“ true”
     },
     {
       field:“ Operation”,
       label:“执行的操作”,
       type:“ string”,
       value:“ Save”
     },
     {
      label:”允许负库存“,
      field:”InterationFlags“,
      type:”string“,
      value:”STK_InvCheckResult“
   }
 ]
}

配置解析与应用

  1. API与方法

    • api字段指定了调用金蝶云星空API的方法为batchSave
    • method字段指定了HTTP请求方法为POST
  2. 请求参数

    • FBillNoFBillTypeID等字段分别对应金蝶云星空API接口中的具体参数。
    • parser字段用于指定如何将源系统的数据转换为目标系统所需的数据格式,例如将物料编码通过ConvertObjectParser进行转换。
  3. 明细信息

    • FEntity字段定义了一个数组,用于存储多个明细记录。
    • 每个明细记录包含多个子字段,如物料编码(FMaterialId)、实发数量(FQty)等。
  4. 其他请求参数

    • FormId指定了业务对象表单ID。
    • IsAutoSubmitAndAudit设置为true,表示自动提交并审核。
    • IsVerifyBaseDataField设置为true,表示验证所有基础资料的有效性。

实现ETL转换

在实现ETL转换时,需要特别注意以下几点:

  1. 字段映射: 确保源系统与目标系统之间的数据字段一一对应,并通过适当的解析器(如ConvertObjectParser)进行转换。

  2. 数组处理: 对于明细信息,需要将每个子项都正确地映射到目标系统中对应的数组结构中。

  3. 特殊逻辑处理: 对于一些特殊逻辑,如实发数量需要乘以-1,可以通过自定义函数(如 _function {{items.qty}} *(-1))来实现。

数据写入

完成上述配置和转换后,即可通过调用金蝶云星空API接口,将处理后的数据写入目标平台。确保HTTP请求方法、URL及请求体格式正确无误,以保证数据成功写入。

通过上述步骤,我们可以高效地利用轻易云数据集成平台,实现源平台到金蝶云星空之间的数据ETL转换,并确保数据格式符合目标平台要求,从而顺利完成数据集成任务。 钉钉与CRM系统接口开发配置

更多系统对接方案