轻松实现数据对接:从金蝶云星空到轻易云平台的ETL流程

  • 轻易云集成顾问-曾平安

案例分享:金蝶云星空数据集成到轻易云平台

在复杂的数据集成项目中,确保数据的高效传输和准确性至关重要。本文将介绍一个实际运行中的案例——“物料查询_联查a”方案,此方案用于将金蝶云星空的数据无缝对接到轻易云数据集成平台。

任务背景及挑战

  1. 接口调用与分页处理: 金蝶云星空提供了API接口executeBillQuery用于获取物料数据。由于单次请求返回的数据量有限,需要进行分页处理。而每次调用都需要确保在限流范围内,以避免触发服务端的防火墙机制。

  2. 快速写入与批量导入: 为了满足业务需求,大量数据需要迅速且可靠地写入到轻易云集成平台。这要求我们不仅要优化网络传输,还需合理利用批量处理功能,以减少网络延迟和重复劳动。

  3. 定时抓取与异常重试: 数据更新频率较高,我们采用定时任务来抓取最新的金蝶云星空数据,并通过错误重试机制,保证即使出现临时故障也能再次尝试获取以达到最大可用性。

  4. 格式差异与映射对接: 金蝶云星空和轻易云平台之间存在一定的数据格式差异,这就要求我们在转换过程中有一套灵活且强大的自定义映射规则,使得两者之间的信息可以顺利对接并保持一致性。

  5. 实时监控与日志记录: 整个过程不但需要透明、可视化,还需要有详尽的实时监控和日志记录功能。借助这些工具,我们能够及时发现问题并快速解决,从而提升整体系统稳定性和运营效率。

下一部分内容将具体阐述如何通过API实现上述操作,包括详细步骤、代码示例以及常见问题应对策略,旨在为您提供全面、实用的技术参考。 钉钉与WMS系统接口开发配置

调用金蝶云星空接口executeBillQuery获取并加工数据

在数据集成的生命周期中,调用源系统接口获取数据是至关重要的第一步。本文将详细探讨如何使用轻易云数据集成平台调用金蝶云星空的executeBillQuery接口来获取物料信息,并对其进行初步加工。

配置元数据

首先,我们需要配置元数据以便正确调用金蝶云星空的API接口。以下是我们使用的元数据配置:

{
  "api": "executeBillQuery",
  "method": "POST",
  "number": "FNumber",
  "id": "FMasterId",
  "pagination": {
    "pageSize": 100
  },
  "request": [
    {"field":"FMasterId","label":"id","type":"string","value":"FMasterId"},
    {"field":"FNumber","label":"编码","type":"string","value":"FNumber"},
    {"field":"FName","label":"名称","type":"string","value":"FName"},
    {"field":"FSpecification","label":"规格型号","type":"string","value":"FSpecification"},
    {"field":"FMnemonicCode","label":"助记码","type":"string","value":"FMnemonicCode"},
    {"field":"FOldNumber","label":"旧物料编码","type":"string","value":"FOldNumber"},
    {"field":"FBARCODE","label":"条码","type":"string","value":"FBARCODE"},
    {"field":"FDescription","label":"描述","type":"string","value":"FDescription"},
    {"field":"FMaterialGroup_FNumber","label":"物料分组","type":"string","value":"FMaterialGroup.FNumber"},
    {"field":"FMaterialGroup_FName","label":"物料分组名称","type":"string","value":"FMaterialGroup.FName"},
    {"field":...}
  ],
  "otherRequest": [
    {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"},
    {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"},
    {"field":...}
  ]
}

调用API接口

根据上述元数据配置,我们可以构建请求体来调用executeBillQuery接口。以下是一个示例请求体:

{
  "FormId": "BD_MATERIAL",
  "FieldKeys": [
    "FMasterId", 
    "FNumber", 
    ...
  ],
  "FilterString": "(FSupplierId.FNumber = 'VEN00010' and FApproveDate >= '2023-01-01')",
  ...
}

在这个请求体中,FormId指定了业务对象表单ID为BD_MATERIALFieldKeys包含了我们需要查询的字段集合,而FilterString则定义了过滤条件。

数据清洗与转换

获取到原始数据后,我们需要对其进行清洗和转换,以便后续处理。以下是一个简单的数据清洗与转换示例:

import pandas as pd

# 假设我们已经通过API获取到了JSON格式的数据
raw_data = [
   {
      'id': '12345',
      '编码': 'MAT001',
      '名称': '物料A',
      ...
   },
   ...
]

# 转换为DataFrame进行处理
df = pd.DataFrame(raw_data)

# 清洗数据,例如去除空值、格式化日期等
df.dropna(inplace=True)
df['审核日期'] = pd.to_datetime(df['审核日期'])

# 转换字段名以便后续处理
df.rename(columns={
   '编码': 'material_code',
   '名称': 'material_name',
   ...
}, inplace=True)

# 输出清洗后的数据
cleaned_data = df.to_dict(orient='records')

分页处理

由于API返回的数据量可能较大,我们需要实现分页处理以确保每次请求的数据量在可控范围内。以下是分页处理的示例代码:

def fetch_data(page_size, start_row):
   request_body = {
      ...
      'Limit': page_size,
      'StartRow': start_row,
      ...
   }

   response = requests.post(api_url, json=request_body)
   data = response.json()

   return data

page_size = 100
start_row = 0
all_data = []

while True:
   data = fetch_data(page_size, start_row)

   if not data:
       break

   all_data.extend(data)
   start_row += page_size

# 对所有获取到的数据进行进一步处理
...

通过上述步骤,我们可以高效地调用金蝶云星空的API接口获取所需数据,并对其进行初步清洗和转换,为后续的数据处理奠定基础。 金蝶与WMS系统接口开发配置

将源平台数据转换并写入目标平台的ETL过程

在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台轻易云集成平台API接口所能够接收的格式,并最终写入目标平台。以下将详细探讨这一过程中涉及的技术细节和实现方法。

数据请求与清洗

首先,我们假设已经完成了数据请求与清洗阶段,获得了干净且结构化的数据。接下来,我们需要对这些数据进行转换,以符合目标平台API接口的要求。

数据转换

在进行数据转换时,需要特别注意元数据配置中的各项参数。例如,本次任务中的元数据配置如下:

{
  "api": "写入空操作",
  "effect": "EXECUTE",
  "method": "POST",
  "idCheck": true
}

这些配置参数决定了我们如何调用目标平台的API接口以及如何处理数据。

  1. API路径api字段指定了我们需要调用的API路径。在本例中是“写入空操作”。
  2. 操作类型effect字段表明了此次操作的类型,这里是“EXECUTE”,表示执行操作。
  3. HTTP方法method字段指定了HTTP方法,这里使用的是“POST”方法。
  4. ID检查idCheck字段为布尔值,表示是否需要对ID进行检查。这里设置为true,说明在写入数据前需要确保ID的唯一性或存在性。

数据格式化

为了使源数据符合目标平台API接口要求,我们需要对其进行格式化处理。假设源数据如下:

{
  "materialId": "12345",
  "materialName": "钢材",
  "quantity": 100,
  "unit": "kg"
}

根据元数据配置,我们可能需要将其转换为如下格式:

{
  "operationType": "EXECUTE",
  "data": {
    "idCheck": true,
    "materialId": "12345",
    "materialName": "钢材",
    "quantity": 100,
    "unit": "kg"
  }
}

API调用

完成数据格式化后,即可通过HTTP POST方法调用目标平台API接口。以下是一个示例代码片段,展示如何通过Python脚本实现这一过程:

import requests
import json

# 定义目标API URL
api_url = 'https://api.qingyiyun.com/execute/writeEmptyOperation'

# 构建请求头
headers = {
    'Content-Type': 'application/json'
}

# 构建请求体
payload = {
    'operationType': 'EXECUTE',
    'data': {
        'idCheck': True,
        'materialId': '12345',
        'materialName': '钢材',
        'quantity': 100,
        'unit': 'kg'
    }
}

# 发起POST请求
response = requests.post(api_url, headers=headers, data=json.dumps(payload))

# 检查响应状态码及内容
if response.status_code == 200:
    print('Data successfully written to the target platform.')
else:
    print(f'Failed to write data: {response.status_code}, {response.text}')

错误处理与日志记录

在实际应用中,错误处理和日志记录是必不可少的一环。我们可以在上述代码基础上添加更多的错误处理逻辑,例如重试机制、异常捕获等,以确保系统的健壮性。

try:
    response = requests.post(api_url, headers=headers, data=json.dumps(payload))
    response.raise_for_status() # 检查HTTP错误状态码
except requests.exceptions.RequestException as e:
    print(f'Error occurred: {e}')
    # 此处可以添加日志记录逻辑,将错误信息记录到日志文件或监控系统中
else:
    if response.status_code == 200:
        print('Data successfully written to the target platform.')
    else:
        print(f'Failed to write data: {response.status_code}, {response.text}')

通过以上步骤,我们完成了从源平台到目标平台的数据ETL转换和写入过程。这一过程不仅确保了数据格式的一致性,还提升了系统集成的效率和可靠性。在实际项目中,可以根据具体需求进一步优化和扩展这些步骤,以满足更复杂的数据集成场景。 如何开发金蝶云星空API接口

更多系统对接方案