金蝶云星空数据集成到轻易云平台案例分享:KD4 查询发货通知单-关联查询
在企业信息化系统之间进行高效的数据对接,一直是提升业务效率的关键。本文将重点介绍如何通过轻易云数据集成平台,将金蝶云星空中的发货通知单数据无缝、可靠地集成到我们的系统中。此次共享的方案名为“KD4 查询发货通知单-关联查询”,旨在确保不漏单、高效快速并且稳定地实现数据同步。
确保集成过程中的一致性与完整性
为了保障从金蝶云星空获取的数据完整,我们利用了金蝶提供的executeBillQuery接口,此接口支持批量查询和过滤条件,能精确获取需要的数据。然而,处理大量调用时分页和限流是不可避免的问题。在此过程中,通过设计合理的分页参数与限流机制,以及定时调度任务,保证每次抓取操作都能够按预期顺利完成,不遗漏任何一条记录。此外,对不同类型错误设定对应重试策略,提高了整个流程异常情况下恢复能力。
处理大规模数据写入
当成功从金蝶云星空取得相关数据后,需要将其高效写入到轻易云平台。我们采用了一套批量写入策略,这种方式不仅减少API调用次数,也显著加快了数据库操作速度。同时,为应对可能出现的数据格式差异问题,在轻易云平台端建立了一整套自定义映射规则,并通过可视化工具实时调整查看,有力保障了最终存储结果的一致性。
实时监控与日志记录
整个流程中,每一次API请求和数据库操作都会被实时监控,并详细记录至日志文件。这不但便于后续运维人员排查故障,更有助于分析潜在优化点。例如,通过观察日志,可以及时发现某次请求处理时间过长,从而反向追踪具体原因并改进相应环节。
此次技术文章开头即聚焦这些核心步骤,希望能为类似场景下的系统集成需求提供实用参考。在接下来的内容中,我们将更详尽地探讨各个技术细节及实际应用效果。
调用金蝶云星空接口executeBillQuery获取并加工数据
在轻易云数据集成平台中,调用源系统接口是数据处理生命周期的第一步。本文将详细介绍如何通过调用金蝶云星空的executeBillQuery
接口来获取并加工发货通知单的数据。
接口配置与请求参数
金蝶云星空提供了丰富的API接口,其中executeBillQuery
用于查询业务单据。该接口采用POST方法,支持复杂的查询条件和分页参数。以下是元数据配置中的关键字段及其含义:
- api:
executeBillQuery
- method:
POST
- number:
FBillNo
- id:
FEntity_FEntryID
请求参数分为两类:主请求参数和其他请求参数。
主请求参数
这些参数主要用于指定需要查询的字段和过滤条件:
[
{"field":"FEntity_FEntryID","label":"FEntity_FEntryID","type":"string","describe":"FEntity_FEntryID","value":"FEntity_FEntryID"},
{"field":"FID","label":"FID","type":"string","describe":"FID","value":"FID"},
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"FBillNo"},
{"field":"FDate","label":"日期","type":"string","describe":"日期","value":"FDate"},
{"field":"FSaleOrgId_Fname","label":"销售组织名称","type":"string","describe":"销售组织","value":"FSaleOrgId.Fname"},
// 更多字段...
]
其他请求参数
这些参数用于控制查询行为,如分页、过滤等:
[
{"field":"Limit","label":"最大行数","type":"int","describe":"金蝶的查询分页参数","value":100},
{"field":"StartRow","label":"开始行索引","type":"int"},
{"field":"TopRowCount","label":"返回总行数","type": "int"},
{"field": "FilterString", "label": "过滤条件", "type": "string", "describe": "示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=", "value": "FApproveDate>='{{LAST_SYNC_TIME|datetime}}'"},
{"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "parser":{"name": "ArrayToString", "params": ","}},
{"field": "FormId", "label": "业务对象表单Id", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": "SAL_DELIVERYNOTICE"}
]
数据请求与清洗
在实际操作中,首先需要构建请求体,将上述配置中的字段映射到实际的API调用中。例如:
{
"FormId": "SAL_DELIVERYNOTICE",
"FieldKeys": ["FBillNo", "FDate", ...],
"FilterString": "FApproveDate>='2023-01-01'",
// 分页参数
"Limit": 100,
...
}
通过轻易云的数据集成平台,可以方便地将这些配置转化为实际的API调用。平台会自动处理分页、过滤等逻辑,并将结果返回。
数据转换与写入
获取到数据后,需要对其进行清洗和转换,以便后续处理。例如,将日期格式统一、将金额字段转换为标准货币格式等。这些操作可以通过轻易云平台内置的数据转换工具实现。
{
// 清洗后的数据示例
{
"单据编号": "DN20230101001",
...
// 转换后的字段
...
}
}
实际案例
以下是一个实际调用金蝶云星空executeBillQuery
接口并处理返回数据的案例:
-
构建请求体:
{ "FormId": "SAL_DELIVERYNOTICE", ... // 请求体内容 }
-
调用API:
response = requests.post(api_url, json=request_body) data = response.json()
-
数据清洗与转换:
cleaned_data = clean_data(data)
-
将清洗后的数据写入目标系统或存储:
save_to_target_system(cleaned_data)
通过以上步骤,可以高效地从金蝶云星空获取所需的数据,并进行必要的清洗和转换,为后续的数据处理打下坚实基础。
KD4 查询发货通知单-关联查询的ETL转换与写入
在数据集成生命周期的第二步,我们将已经从源平台集成的数据进行ETL(提取、转换、加载)处理,转化为目标平台轻易云集成平台API接口所能够接收的格式,并最终写入目标平台。本文将重点探讨这一过程中的技术细节和实现方法。
数据提取与清洗
首先,我们需要从源系统中提取发货通知单的数据。在这个阶段,数据可能存在各种不一致性和冗余信息,因此需要进行清洗操作。清洗操作包括但不限于:
- 去除重复记录
- 处理缺失值
- 格式标准化
例如,假设我们从源系统中提取到的原始数据如下:
[
{"order_id": "123", "shipment_date": "2023-10-01", "status": "delivered"},
{"order_id": "124", "shipment_date": null, "status": "pending"},
{"order_id": "123", "shipment_date": "2023-10-01", "status": "delivered"}
]
在清洗过程中,我们会去除重复的订单记录,并处理缺失的发货日期:
[
{"order_id": "123", "shipment_date": "2023-10-01", "status": "delivered"},
{"order_id": "124", "shipment_date": "", "status": "pending"}
]
数据转换
接下来,我们需要将清洗后的数据转换为目标平台能够接受的格式。根据元数据配置,目标平台的API接口要求如下:
{
"api":"写入空操作",
"effect":"EXECUTE",
"method":"POST",
"idCheck":true
}
这意味着我们需要通过HTTP POST方法,将数据发送到指定的API接口,并且在发送之前需要进行ID检查,以确保每条记录都具有唯一标识符。
假设目标平台要求的数据格式如下:
{
"operation": {
"type": "insert",
"data": [
{"id": 1, "order_id": 123, "shipment_date": "2023-10-01", "status": 1},
{"id": 2, "order_id": 124, "shipment_date": "", "status": 0}
]
}
}
我们需要对清洗后的数据进行进一步转换,确保字段名和数据类型符合目标平台的要求。例如,将status
字段从字符串类型转换为整数类型(1表示已发货,0表示待发货),并为每条记录生成唯一的id
。
转换后的数据如下:
{
"operation": {
"type": "insert",
"data":[
{"id": 1, "order_id":"123", "shipment_date":"2023-10-01", "status" :1},
{"id" :2, "order_id":"124", "shipment_date":"", "status" :0}
]
}
}
数据加载
最后一步是将转换后的数据通过API接口写入目标平台。根据元数据配置,我们使用HTTP POST方法发送请求:
POST /api/execute HTTP/1.1
Host: target-platform.com
Content-Type: application/json
{
...
}
在发送请求之前,需要确保每条记录都经过ID检查,以防止重复插入或更新错误。可以使用数据库或者内存缓存来维护一个已处理ID列表,每次插入新记录前检查该ID是否已经存在。
实现代码示例
以下是一个简单的Python代码示例,展示了如何实现上述ETL过程:
import requests
import json
# 清洗函数示例
def clean_data(data):
cleaned_data = []
seen_ids = set()
for record in data:
if record['order_id'] not in seen_ids:
seen_ids.add(record['order_id'])
record['shipment_date'] = record['shipment_date'] or ""
cleaned_data.append(record)
return cleaned_data
# 转换函数示例
def transform_data(data):
transformed_data = []
for idx, record in enumerate(data):
transformed_record = {
'id': idx + 1,
'order_id': int(record['order_id']),
'shipment_date': record['shipment_date'],
'status': 1 if record['status'] == 'delivered' else 0
}
transformed_data.append(transformed_record)
return {
'operation': {
'type': 'insert',
'data': transformed_data
}
}
# 加载函数示例
def load_data(api_url, data):
headers = {'Content-Type': 'application/json'}
response = requests.post(api_url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print("Data loaded successfully")
else:
print(f"Failed to load data: {response.status_code}")
# 主程序示例
if __name__ == "__main__":
raw_data = [
{"order_id":"123","shipment_date":"2023-10-01","status":"delivered"},
{"order_id":"124","shipment_date":"","status":"pending"},
{"order_id":"123","shipment_date":"2023-10-01","status":"delivered"}
]
cleaned_data = clean_data(raw_data)
transformed_data = transform_data(cleaned_data)
api_url = 'http://target-platform.com/api/execute'
load_data(api_url, transformed_data)
通过上述步骤和代码示例,我们可以高效地完成从源系统到目标平台的数据ETL转换与加载。这不仅提高了数据处理效率,还确保了数据的一致性和准确性。