金蝶销售出库单对接管易云:技术案例分享
在数据高度互联的商业环境中,确保不同系统的数据无缝集成对于提高业务效率、减少人为错误至关重要。本次技术案例将探讨如何通过轻易云数据集成平台实现金蝶云星空与管易云之间的高效对接,具体以金蝶销售出库单的数据导入为例。
确保集成金蝶云星空数据不漏单
为了保证每一笔销售出库单能够准确从金蝶云星空传输到管易云,我们采用了executeBillQuery API接口来抓取订单数据。利用轻易云平台的定时任务功能,可以周期性地调用该API接口,从而定时可靠地获取最新的订单信息并避免漏单现象。
API: executeBillQuery
作用: 获取销售出库单列表
处理分页和限流问题
由于executeBillQuery接口通常会返回大量的数据,为了应对分页和限流,我们设计了一套自动分页处理机制。通过构造适当的请求参数,使得多个小批量请求可以连续不断获取全部所需的数据。同时,通过监控接口返回码及速率限制,配合重试机制,有效防止因超频访问导致的重要数据信息丢失。
示例代码片段:
function fetchPagedData(pageNum) {
// 设置页码和其他必要参数
let params = { pageIndex: pageNum };
// 调用executeBillQuery API
let response = callExecuteBillQuery(params);
if (response.success) {
processFetchedData(response.data);
if (response.hasMorePages) {
return fetchPagedData(pageNum + 1);
}
} else if (response.rateLimited) {
wait(1000); // 等待一秒重新尝试
return fetchPagedData(pageNum);
}
}
批量快速写入到管易云
为了将获取到的大量出库数据快速、高效地写入到管易云,我们使用gy.erp.trade.add这个API进行批量操作。借助于轻易云平台提供的大规模并行计算能力,能够大幅加快数据写入速度,同时保障操作的一致性及成功率。
API: gy.erp.trade.add
作用: 向管易提交新的订单信息
在整个过程中,每一个处理步骤都被实时监控和日志记录,以便掌握并追溯所有细节,一旦发生异常,可迅速定位问题所在,并触发错误重试机制,从而达到尽可能完全无间断的数据传输体验。
调用金蝶云星空接口executeBillQuery获取并加工数据
在数据集成过程中,调用源系统的API接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的executeBillQuery
接口,以获取销售出库单数据并进行初步加工。
API接口配置
首先,我们需要了解executeBillQuery
接口的基本配置和元数据。根据提供的元数据配置,可以看到该接口采用POST方法,主要用于查询操作(effect: QUERY)。以下是该接口的关键字段:
- 单据类型 (
FBillTypeID_FNumber
) - 单据编号 (
FBillNo
) - 日期 (
FDate
) - 销售组织 (
FSaleOrgId_FNumber
) - 客户 (
FCustomerID_FNumber
) - 销售员 (
FSalesManID_FNumber
) - 单据状态 (
FDocumentStatus
) - 物料编码 (
FMaterialID_FNumber
) - 物料条码 (
FMATERIALID_FBARCODE
) - 零售条形码 (
FBarcode
) - 应发数量 (
FMustQty
) - 实发数量 (
FRealQty
) - 单价 (
FPrice
) - 含税单价 (
FTaxPrice
) - 有效期至 (
FExpiryDate
) - 税率% (
FEntryTaxRate
) - 税额 (
FEntryTaxAmount
) - 金额 (
FAmount
) - 价税合计 (
FAllAmount
) - 仓库 (
FStockID_FNumber
) - 库存状态 (
FStockStatusID_FNumber
)
请求参数构建
在实际调用过程中,我们需要根据业务需求构建请求参数。以下是一个示例请求参数构建过程:
{
"FormId": "SAL_OUTSTOCK",
"FieldKeys": [
"FBillTypeID.FNumber",
"FBillNo",
"FDate",
"FSaleOrgId.FNumber",
"FCustomerID.FNumber",
"FSalesManID.FNumber",
"FDocumentStatus",
"FMaterialID.FNumber",
"FMATERIALID.FBARCODE",
"FBarcode",
"FMustQty",
"FRealQty",
"FPrice",
"FTaxPrice",
"FExpiryDate",
"FEntryTaxRate",
"FEntryTaxAmount",
"FAmount",
"FAllAmount",
"FStockID.FNumber",
"FStockStatusID.FNumber"
],
"FilterString": "FBillTypeID.FNUMBER = 'XSCKD09_SYS' and FApproveDate >= '{{LAST_SYNC_TIME|datetime}}'",
"Limit": "{PAGINATION_PAGE_SIZE}",
"StartRow": "{PAGINATION_START_ROW}"
}
数据清洗与转换
在获取到原始数据后,需要对其进行清洗和转换,以便后续处理。以下是一些常见的数据清洗和转换操作:
-
字段映射与重命名 将API返回的数据字段映射到目标系统所需的字段名称。例如,将
FBillNo
映射为OrderNo
,将FCustomerID_FNumber
映射为CustomerCode
等。 -
数据类型转换 根据目标系统要求,将字符串类型的数据转换为相应的数据类型。例如,将日期字符串转换为日期对象,将数字字符串转换为浮点数等。
-
缺失值处理 对于缺失值,可以根据业务规则进行填充或删除。例如,对于缺失的数量字段,可以填充为0;对于缺失的客户信息,可以标记为“未知客户”。
实际案例
假设我们需要从金蝶云星空中获取所有状态为“已审核”的销售出库单,并将其导入到目标系统中。具体步骤如下:
- 构建请求参数,设置过滤条件为
"FDocumentStatus = 'C'"
。 - 调用
executeBillQuery
接口获取数据。 - 对返回的数据进行清洗和转换。
- 将处理后的数据写入目标系统。
以下是一个示例代码片段:
import requests
import json
# 构建请求参数
payload = {
"FormId": "SAL_OUTSTOCK",
"FieldKeys": ["FBillNo", ...], # 省略其他字段
"FilterString": "FDocumentStatus = 'C'",
...
}
# 调用API接口
response = requests.post("https://api.kingdee.com/executeBillQuery", data=json.dumps(payload))
data = response.json()
# 数据清洗与转换
cleaned_data = []
for record in data:
cleaned_record = {
'OrderNo': record['FBillNo'],
'CustomerCode': record['FCustomerID_FNumber'],
...
}
cleaned_data.append(cleaned_record)
# 写入目标系统(示例)
write_to_target_system(cleaned_data)
通过上述步骤,我们可以高效地从金蝶云星空中获取并处理销售出库单数据,为后续的数据集成奠定基础。
轻易云数据集成平台:ETL转换与管易云API接口对接技术案例
在数据集成生命周期的第二步中,我们将重点探讨如何使用轻易云数据集成平台将已经集成的源平台数据进行ETL转换,并最终写入目标平台——管易云API接口。本文将详细解析元数据配置和具体操作步骤,以确保数据能够无缝对接并符合目标平台的格式要求。
元数据配置解析
元数据配置是整个ETL过程中的核心部分,决定了如何将源平台的数据转换为目标平台所需的格式。以下是关键配置项的解析:
-
API接口与请求方法
{"api":"gy.erp.trade.add","effect":"EXECUTE","method":"POST"}
api
:指定了管易云的API接口。method
:HTTP请求方法,这里使用的是POST
方法。
-
字段映射与转换规则
-
平台单号
{"field":"platform_code","label":"平台单号","type":"string"}
直接映射源字段,无需额外处理。
-
店铺代码
{"field":"shop_code","label":"店铺代码","type":"string","value":"_function CASE WHEN '{F_VVYO_BaseProperty}' = 'lipro 渠道分销商' THEN 'XXQD001' WHEN '{F_VVYO_BaseProperty}' = 'lipro 渠道经销商' THEN 'XXQD001' WHEN '{FCustomerID_FNumber}' ='6000030' THEN '6000030' when '{FCustomerID_FNumber}' ='枫华内购平台' then 'FH001' ELSE 'XX001' END"}
使用条件表达式,根据不同的业务属性和客户编号动态生成店铺代码。
-
拍单时间
{"field":"deal_datetime","label":"拍单时间","type":"string","value":"_function REPLACE( '{FDate}' ,'T',' ')"}
将日期时间格式中的
T
替换为空格,以符合目标平台的时间格式要求。
-
-
商品明细数组
{"field":"details","label":"商品明细","type":"array","value":"items","children":[{"field":"item_code","label":"商品代码","type":"string","value":"{{items.FMaterialID_FNumber}}"},{"field":"price","label":"实际单价","type":"string","value":"{{items.FTaxPrice}}"},{"field":"qty","label":"商品数量","type":"string","value":"{{items.FRealQty}}"}]}
details
字段是一个数组,包含多个子字段,如商品代码、实际单价和商品数量。- 每个子字段都从源数据中的相应字段映射而来。
ETL转换过程
-
数据提取与清洗 在此阶段,我们从金蝶销售出库单中提取原始数据,并进行必要的清洗操作。例如,去除无效字符、标准化日期格式等。这一步确保了后续转换操作能够顺利进行。
-
数据转换与映射 根据元数据配置,将清洗后的源数据字段映射到目标平台所需的字段。以下是几个关键步骤:
- 使用条件表达式动态生成店铺代码和会员代码。
- 替换日期时间格式中的特定字符以符合目标平台要求。
- 将复杂结构(如商品明细数组)进行拆解和重新组合,确保每个子字段都正确映射。
-
写入目标平台 最终,将转换后的数据通过HTTP POST请求发送到管易云API接口。以下是一个示例请求体:
{ "platform_code": "123456", "shop_code": "XXQD001", "vip_code": "XXQD001", "warehouse_code": "WH001", "deal_datetime": "2023-10-01 12:00:00", "order_type_code": "Sales", "receiver_name": "张三", "receiver_mobile": "13800000000", "receiver_province": "北京市", "receiver_city": "北京市", "receiver_district": "朝阳区", "receiver_address": "某街道某小区", "express_code": "", "seller_memo": "备注信息", "details": [ { "item_code": "ITEM001", "price": 100, "qty": 2 }, { "item_code": "ITEM002", "price": 200, "qty": 1 } ] }
通过以上步骤,我们成功地将金蝶销售出库单的数据转化为管易云API接口能够接收的格式,并顺利写入目标平台。这不仅提升了业务流程的自动化程度,还确保了数据的一致性和准确性。