技术案例分享:领星ERP数据集成到用友U8
在复杂的企业业务场景中,数据的高效流通和精准管理至关重要。本文将详细解析如何利用轻易云数据集成平台,将领星ERP系统中的FBA退货订单无缝对接到用友U8系统,实现退货单的数据同步。
流程概述与技术难点
为了确保每一笔FBA退货订单准确、及时地传输到用友U8,我们面临以下几个关键技术挑战:
-
API接口调用与分页处理: 从领星ERP获取FBA退货订单数据需要调用其提供的接口
/cost/center/api/cost/stream
。由于存在分页和限流问题,我们必须设计可靠的抓取策略,以防止遗漏任何一条记录。 -
自定义数据转换逻辑: 领星ERP与用友U8之间的数据格式存在差异,需要在传输过程中进行格式转换和映射。这就要求我们编写特定的转换规则,使得两套系统的数据能够顺利交互。
-
批量集成与高吞吐量支持: 为解决大量数据快速写入的问题,通过使用轻易云平台内置的大规模并行处理能力,把从领星ERP获取的大批量数据可靠地写入到用友U8的接口
/apilink/u8api
中。这一步骤不仅要考虑吞吐能力,还需保证事务的一致性和完整性。 -
实时监控与异常处理机制: 数据集成过程中,任何一个环节出现故障都有可能导致业务中断。因此,我们引入了集中式监控和告警系统,对每个任务节点进行实时跟踪。一旦发生异常,通过预先设定的重试机制进行自动恢复,以最大程度减少对业务产生的不良影响。
实现步骤简述
-
步骤一:API连接配置 配置并测试接入领星ERP API
/cost/center/api/cost/stream
和 用友U8 API/apilink/u8api
,确保基础通信正常。 -
步骤二:数据抓取策略设计 针对分页及限流,确定合理的数据提取频率,并实现可靠调度以保证所有页码均被成功读取。
-
步骤三:自定义字段映射 编写必要代码逻辑,实现从源端(领星ERP)字段向目标端(用友U8)的正确转化,包括必需字段缺失值补充等操作。
-
步骤四:大规模并行写入 基于高吞吐量支持功能,将清洗后的批量数据通过
调用领星ERP接口获取并加工数据的技术案例
在数据集成生命周期的第一步,我们需要调用源系统领星ERP的接口/cost/center/api/cost/stream
来获取并加工数据。本文将详细探讨如何配置和使用该接口,确保数据能够顺利从领星ERP传输到目标系统。
接口配置与调用
首先,我们需要了解接口的基本信息和请求参数。根据提供的元数据配置,接口采用POST方法进行调用,主要用于查询(effect: QUERY)。以下是请求参数的详细说明:
- wh_names(仓库名): 类型为字符串,通过逗号分隔多个仓库名。
- shop_names(店铺名): 类型为字符串,通过逗号分隔多个店铺名。
- skus(SKU): 类型为字符串,通过逗号分隔多个SKU。
- mskus(MSKU): 类型为字符串,通过逗号分隔多个MSKU。
- disposition_types(库存属性): 类型为字符串,通过逗号分隔不同库存属性值,如1表示可用在途,2表示可用,3表示次品。
- business_types(出入库类型): 类型为字符串,通过逗号分隔不同业务类型值,如30表示FBA无源单销售退货,31表示FBA有源单销售退货。
- query_type(日期查询类型): 类型为字符串,用于指定查询日期类型,如01表示库存动作日期。
- start_date(起始日期): 类型为字符串,格式为Y-m-d,不允许跨月。
- end_date(结束日期): 类型为字符串,格式为Y-m-d,不允许跨月。
- business_numbers(业务编号): 类型为字符串,用于指定业务编号。
- origin_accounts(源头单据号): 类型为字符串,用于指定源头单据号。
- offset(页码偏移量): 类型为字符串,默认值为1。
- length(分页长度): 类型为字符串,默认值为200条。
数据请求与清洗
在调用接口之前,需要对请求参数进行适当的处理和清洗。例如,对于仓库名、店铺名、SKU等字段,需要将其转换成数组格式,以便后续处理。以下是一个示例代码片段,用于构建请求参数:
import requests
import json
# 构建请求参数
params = {
"wh_names": "仓库A,仓库B",
"shop_names": "店铺A,店铺B",
"skus": "SKU1,SKU2",
"mskus": "MSKU1,MSKU2",
"disposition_types": "1,2,3",
"business_types": "30,31",
"query_type": "01",
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"offset": "1",
"length": "200"
}
# 转换字段格式
def string_to_array(field_value):
return field_value.split(',')
params['wh_names'] = string_to_array(params['wh_names'])
params['shop_names'] = string_to_array(params['shop_names'])
params['skus'] = string_to_array(params['skus'])
params['mskus'] = string_to_array(params['mskus'])
params['disposition_types'] = string_to_array(params['disposition_types'])
params['business_types'] = string_to_array(params['business_types'])
# 发送POST请求
response = requests.post("https://api.lingxing.com/cost/center/api/cost/stream", json=params)
data = response.json()
# 打印返回的数据
print(json.dumps(data, indent=4))
数据转换与写入
获取到数据后,需要对其进行必要的转换和写入操作。例如,将领星ERP返回的数据转换成目标系统U8所需的格式,并将其写入U8系统。以下是一个示例代码片段,用于处理返回的数据并写入目标系统:
def transform_data(data):
transformed_data = []
for item in data:
transformed_item = {
'unique_key': item.get('unique_key'),
'wo_number': item.get('wo_number'),
'business_number': item.get('business_number'),
# 其他字段转换逻辑
}
transformed_data.append(transformed_item)
return transformed_data
# 转换数据
transformed_data = transform_data(data)
# 写入目标系统U8
def write_to_u8(transformed_data):
for item in transformed_data:
# 构建U8 API请求参数
u8_params = {
'unique_key': item['unique_key'],
'wo_number': item['wo_number'],
'business_number': item['business_number'],
# 其他字段映射
}
# 发送POST请求到U8 API
u8_response = requests.post("https://api.u8.com/write", json=u8_params)
print(u8_response.status_code)
write_to_u8(transformed_data)
通过上述步骤,我们实现了从领星ERP获取数据、清洗和转换数据,并将其写入目标系统U8的全过程。这一过程不仅确保了数据的一致性和准确性,还提高了业务流程的自动化程度。
用友U8API接口的数据ETL转换与写入
在使用轻易云数据集成平台进行数据处理时,第二阶段的核心任务是将已经集成的源平台数据进行ETL转换,并转为目标平台用友U8API接口所能够接收的格式,最终写入目标平台。本文将详细探讨这一过程中的技术细节和关键步骤。
1. 数据请求与清洗
在数据集成生命周期的第一阶段,我们已经完成了数据请求与清洗。此时,源平台(如领星-FBA退货订单)的数据已经被提取并初步处理。接下来,我们需要将这些数据转换为用友U8系统能够理解和处理的格式。
2. 数据转换与写入
2.1 API接口配置
根据元数据配置,我们需要调用用友U8的API接口来创建和审核退货单。具体的API路径为/apilink/u8api
,请求方法为POST,且需要进行ID校验。
2.2 单据头配置
单据头部分包含了退货单的一些基本信息,如退货单号、退货日期、销售类型等。这些字段需要根据源平台的数据进行映射和转换。
{
"field": "data",
"label": "data参数",
"type": "object",
"describe": "data参数",
"children": [
{
"field": "单据头",
"label": "单据头",
"type": "object",
"describe": "单据头",
"children": [
{"field": "退货单号", "label": "退货单号", "type": "string", "describe": "发货单号"},
{"field": "退货日期", "label": "退货日期", "type": "date", "describe": "发货日期", "value":"2024-01-31"},
{"field": "销售类型", "label": "销售类型", "type": "string", "describe":"销售类型","value":"跨境零售"},
{"field":"客户简称","label":"客户简称","type":"string","describe":"客户简称","value":"{shop_name}"},
{"field":"销售部门","label":"销售部门","type":"string","describe":"销售部门","value":"跨境电商"},
{"field":"税率","label":"税率","type":"string","describe":"税率"},
{"field":"制单人","label":"制单人","type":"string","value":"钟艳珍"},
{"field":"备注","label":"备注","type":"string","describe":"备注"},
{"field":"订单号","label":"订单号","type":"string"},
{"field":"客户地址","label":"客户地址","type":"string"},
{"field":"币种","label":"币种","type":"string","value":
"_findCollection find name from 496859c4-a472-373d-849a-39dda60a2e62 where code={{币别}}"
},
{"field" : 业务员, label:业务员, type:string, value:{shop_name}, mapping:{target:65377d9e43cae608552f8d44,direction:positive}},
{"field" : 发货地址, label:发货地址, type:string},
{"field" : 审核人, label:审核人, type:string, value:袁忠平},
{"field" : 汇率, label:汇率, type:string,value:
"_findCollection find my_rate from 496859c4-a472-373d-849a-39dda60a2e62 where code={{币别}}"
},
{"field" : 制单时间,label:制单时间,type:string,value:"_function NOW()"},
{"field" : 审核日期,label:审核日期,type:string,value:"2024-01-31"}
]
}
]
}
2.3 单据体配置
单据体部分包含了具体的商品信息,如仓库名称、存货编码、数量等。这些字段同样需要根据源平台的数据进行映射和转换。
{
field: 单据体,
label: 单据体,
type: array,
describe: 单据体,
value: goods_list,
children:[
{
field: 行,
label: 行,
type: object,
describe: 行,
children:[
{
field: 仓库名称,
label: 仓库名称,
type: string,
describe: 仓库名称,
value:
"_function CASE '{wh_name}' WHEN 'DTECH Multimedia-IN印度仓' THEN 'DT-IN印度仓' ELSE '{wh_name}' END",
mapping:{target:"653b7cc955d9ff41c34d58a3",direction:"positive"}
},
{ field:"存货编码", label:"存货编码", type:"string", describe:"存货编码", value:"{sku}" },
{ field:"数量", label:"数量", type:"string", describe:"数量", value:"-{change_quantity}" },
{ field:"税率", label:"税率", type:"string", describe:"税率" },
{ field:"含税单价", label:"含税单价", type:"string", describe:"含税单价",
value:
"_function {{单价}}/{{数量}}"
},
{ field :"赠品" , label :"赠品" , type :" string ", value :
"_function CASE '{{单价}}' WHEN ' ' THEN '是' WHEN 0 THEN '是' ELSE '否' END"
}
]
}
]
}
2.4 数据写入
完成上述配置后,我们通过调用用友U8的API接口,将转换后的数据写入目标系统。具体操作包括:
- 创建退货单:调用
returnorder/create
接口,将构建好的JSON对象发送到用友U8系统。 - 审核退货单:调用
returnorder/audit
接口,对已创建的退货单进行审核。
{
apiurl:returnorder/create,
audit:returnorder/audit
}
总结
通过上述步骤,我们可以实现从源平台到目标平台的数据ETL转换,并成功将数据写入用友U8系统。这一过程不仅要求对各个字段进行精确映射,还需考虑不同系统间的数据格式差异,通过合理配置和调用API接口,实现无缝的数据集成。