二期-旺店通跨境其他出库单&星空其他出库单---11 数据集成案例分享
在系统对接与数据集成的过程中,确保数据的准确性和实时性是一项极具挑战性的任务。本文将分享一个具体的技术案例,即如何高效地实现旺店通·跨境版的数据集成到金蝶云星空中。本次工作主要涵盖了从获取旺店通·跨境版接口中的出库单详情,到将这些数据批量写入到金蝶云星空数据库的一系列操作。
首先,对于此次项目,“二期-旺店通跨境其他出库单&星空其他出库单---11” 的核心目标是能够定时可靠地抓取旺店通·跨境版接口提供的数据,并快速且无误地写入到金蝶云星空中,以支援企业在国际物流环节中的管理需求。
接口调用与抓取机制
为了获取所需的数据,我们使用了 旺店通·跨境版 提供的 /api/openservices/stock/v1/getStockOutOrderDetails
API。该API允许我们按需调取出口订单明细,为后续的数据处理打下基础。然而,由于网络环境及供应商API本身特性的限制,数据分页和限流问题不容忽视。因此,需要设计一个稳定且高效的调用计划,以避免因请求过多或过频导致服务不可用。
批量写入与映射规则
从 旺店通 获取数据之后,这些信息需要被及时、安全地传输并存储至 金蝶云星空 中。为此,我们采用了 金蝶云 提供的 batchSave
API进行批量写入。在此过程中,一个关键点是处理两者之间存在的数据格式差异。例如,字段名称不一致、数据类型不同等情况,需要通过定制化映射解决这些问题,以保证每一条记录都能对应正确的位置。此外,还要注意设置适当的错误重试机制,当出现异常情况时能自动恢复,提高整体流程的鲁棒性。
以上便是此次系统对接方案中的核心步骤,在随后的部分内容中,我们将详细解析具体实施过程,包括调度策略、日志监控,以及性能优化等方面,实现业务场景下最佳实践效果。
调用旺店通·跨境版接口获取并加工数据
在数据集成的生命周期中,调用源系统接口是关键的第一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·跨境版的接口 /api/openservices/stock/v1/getStockOutOrderDetails
来获取并加工数据。
接口概述
该接口主要用于查询出库单的详细信息,支持多种查询条件,包括出库单号、出库单状态、业务类型、SKU编码、时间范围等。请求方式为 POST
,返回的数据可以自动填充到目标系统中。
请求参数配置
根据元数据配置,我们需要设置以下请求参数:
-
stockout_no_list: 出库单号列表,类型为字符串。
-
order_status: 出库单状态,类型为字符串。可选值包括:
- 5已取消
- 48编辑中
- 50待审核
- 52待推送
- 53推送失败
- 54获取面单号
- 55已审核
- 60待出库
- 90部分发货
- 95已发货
- 100已签收
- 105部分打款
- 110已完成
-
src_order_type: 业务类型,类型为字符串。可选值包括:
- 1-销售出库
- 2-调拨出库
- 3-采购退货出库
- 4-盘亏出库
- 7-其他出库(本次集成选择此项)
- 12-委外出库
- 13-FBA调拨出库
-
spec_no: SKU编码,类型为字符串。
-
start_time: 起始时间,类型为日期时间。使用模板变量
{{LAST_SYNC_TIME|datetime}}
自动填充。 -
end_time: 结束时间,类型为日期时间。使用模板变量
{{CURRENT_TIME|datetime}}
自动填充。 -
status: 时间状态,类型为字符串。0表示按出库时间,1表示按创建时间。本次集成选择按创建时间。
此外,还需要配置分页参数:
- pageNo: 当前页码,类型为字符串。使用函数
_function {PAGINATION_START_PAGE}+1
自动计算。 - pageSize: 分页大小,类型为字符串。使用模板变量
{PAGINATION_PAGE_SIZE}
自动填充。
数据请求与清洗
在发送请求之前,需要确保所有参数都已正确设置,并且符合接口要求。以下是一个示例请求体:
{
"stockout_no_list": "123456,789012",
"order_status": "95,100,105,110",
"src_order_type": "7",
"spec_no": "SKU12345",
"start_time": "{{LAST_SYNC_TIME|datetime}}",
"end_time": "{{CURRENT_TIME|datetime}}",
"status": "1",
"pageNo": "_function {PAGINATION_START_PAGE}+1",
"pageSize": "{PAGINATION_PAGE_SIZE}"
}
发送请求后,需要对返回的数据进行清洗和转换,以便后续处理和写入目标系统。例如,可以过滤掉不需要的字段,只保留必要的信息,并根据业务需求进行格式转换。
数据转换与写入
在清洗后的数据基础上,可以进行进一步的转换操作,如字段映射、数据格式调整等。轻易云平台提供了丰富的数据转换工具,可以方便地实现这些操作。
最终,将处理好的数据写入目标系统,实现数据的无缝对接和集成。
通过上述步骤,我们成功调用了旺店通·跨境版的接口 /api/openservices/stock/v1/getStockOutOrderDetails
获取并加工了所需的数据。这是数据集成生命周期中的关键一步,为后续的数据处理和分析奠定了基础。
使用轻易云数据集成平台将源数据转换为金蝶云星空API接口格式并写入
在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。本文将详细探讨这一过程中的技术细节和实现方法。
配置元数据
首先,我们需要根据金蝶云星空API接口的要求配置元数据。以下是我们使用的元数据配置:
{
"api": "batchSave",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{stockoutNo}"},
{"field":"FBillTypeID","label":"单据类型","type":"string","describe":"标准其他出库单:QTCKD01_SYS\n资产出库:QTCKD02_SYS\nVMI出库:QTCKD03_SYS\n费用物料出库:QTCKD04_SYS\n库存调整:QTCKD05_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"QTCKD01_SYS"},
{"field":"FPickOrgId","label":"领用组织","type":"string","describe":"领用组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{warehouseNo}"},
{"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{warehouseNo}"},
{"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{consignTime}"},
{"field":"FOwnerTypeIdHead","label":"货主类型","type":"string","describe":"多类别基础资料列表","value":"BD_OwnerOrg"},
{"field":"FOwnerIdHead","label":"货主","type":"string","describe":"多类别基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{warehouseNo}"},
{"field":"FDeptId","label":"领料部门","type":"","describe":"","parser":{"name":"","params":""},"value":""},
{"field":"","label":"","type":"","describe":"","parser":{"name":"","params":""},"value":""},
{"field":"","label":"","type":"","describe":"","parser":{"name":"","params":""},"value":""},
{"field":"","label":"","type":"","describe":"","parser":{"name":"","params":""},"value":""},
{"field":"","label":"","type":"","describe":"","parser":{"name":"","params":""},"value":""},
{"field":"","label":"","type":"","describe":"","parser":{"name":"","params":""},"value":""}
],
"otherRequest":[
{"field":"",
"label":"",
"type":"",
"describe":"",
"parser":{
"name":"",
"params":[]
},
"mapping":{
"target":"",
"direction":[]
},
"children":[]
}
],
"operation":{
"rowsKey":"",
"rows":"",
"method":[]
}
}
数据转换与写入
-
解析和转换字段:
FBillNo
(单据编号):直接映射到源数据的stockoutNo
字段。FBillTypeID
(单据类型):固定值为QTCKD01_SYS
,使用ConvertObjectParser
进行解析。FPickOrgId
(领用组织)和FStockOrgId
(库存组织):均映射到源数据的warehouseNo
字段,并使用ConvertObjectParser
进行解析。FDate
(日期):映射到源数据的consignTime
字段。FOwnerTypeIdHead
(货主类型):固定值为BD_OwnerOrg
。FOwnerIdHead
(货主):映射到源数据的warehouseNo
字段,并使用ConvertObjectParser
进行解析。
-
处理明细信息: 明细信息部分需要特别处理,因为它是一个数组结构。每个明细项包含以下字段:
FMaterialId
(物料编码):映射到明细项中的spectNo
字段,并使用ConvertObjectParser
进行解析。FQty
(实发数量):映射到明细项中的num
字段。FStockId
(发货仓库):映射到明细项中的spectNo
.
-
其他请求参数:
FormId
: 固定值为业务对象表单ID,如"STK_MisDelivery"。IsAutoSubmitAndAudit
: 布尔值,表示是否自动提交并审核,设置为true。IsVerifyBaseDataField
: 布尔值,表示是否验证基础资料有效性,设置为true。Operation
: 固定值为"Save"。
实现代码示例
以下是一个基于上述元数据配置的实现代码示例:
import requests
import json
def transform_and_write_data(source_data):
# 构建请求体
request_body = {
'FormId': 'STK_MisDelivery',
'IsAutoSubmitAndAudit': True,
'IsVerifyBaseDataField': True,
'Operation': 'Save',
'Model': {
'FBillNo': source_data['stockoutNo'],
'FBillTypeID': {'FNumber': 'QTCKD01_SYS'},
'FPickOrgId': {'FNumber': source_data['warehouseNo']},
'FStockOrgId': {'FNumber': source_data['warehouseNo']},
'FDate': source_data['consignTime'],
'FOwnerTypeIdHead': 'BD_OwnerOrg',
'FOwnerIdHead': {'FNumber': source_data['warehouseNo']},
'FDeptId': {'FNumber':'BM000002'},
'FNote':'备注信息',
'FStockDirect':'GENERAL',
'FEntity': []
}
}
for detail in source_data['stockOutOrderDetailsVOList']:
entity = {
'FMaterialId': {'FNumber': detail['specNo']},
'FQty': detail['num'],
'FStockId': {'FNumber': source_data['warehouseNo']},
'FEntryNote':'备注信息',
'F_ZMKJ_Text': detail['costPrice']
}
request_body['Model']['FEntity'].append(entity)
# 发起POST请求
response = requests.post(
url='https://api.kingdee.com/k3cloud/batchSave',
headers={'Content-Type':'application/json'},
data=json.dumps(request_body)
)
if response.status_code == 200:
print("Data successfully written to Kingdee Cloud")
else:
print(f"Failed to write data: {response.text}")
# 示例源数据
source_data = {
...
}
transform_and_write_data(source_data)
通过上述步骤和代码示例,我们可以实现将源平台的数据经过ETL转换后,以金蝶云星空API接口所能接收的格式写入目标平台。这不仅确保了数据的一致性和准确性,还大大提升了系统集成的效率。