用友U8API的数据转换与集成详解

  • 轻易云集成顾问-张妍琪
### 技术案例分享:领星ERP数据集成到用友U8 在复杂的企业业务场景中,数据的高效流通和精准管理至关重要。本文将详细解析如何利用轻易云数据集成平台,将领星ERP系统中的FBA退货订单无缝对接到用友U8系统,实现退货单的数据同步。 #### 流程概述与技术难点 为了确保每一笔FBA退货订单准确、及时地传输到用友U8,我们面临以下几个关键技术挑战: 1. **API接口调用与分页处理**: 从领星ERP获取FBA退货订单数据需要调用其提供的接口`/cost/center/api/cost/stream`。由于存在分页和限流问题,我们必须设计可靠的抓取策略,以防止遗漏任何一条记录。 2. **自定义数据转换逻辑**: 领星ERP与用友U8之间的数据格式存在差异,需要在传输过程中进行格式转换和映射。这就要求我们编写特定的转换规则,使得两套系统的数据能够顺利交互。 3. **批量集成与高吞吐量支持**: 为解决大量数据快速写入的问题,通过使用轻易云平台内置的大规模并行处理能力,把从领星ERP获取的大批量数据可靠地写入到用友U8的接口`/apilink/u8api`中。这一步骤不仅要考虑吞吐能力,还需保证事务的一致性和完整性。 4. **实时监控与异常处理机制**: 数据集成过程中,任何一个环节出现故障都有可能导致业务中断。因此,我们引入了集中式监控和告警系统,对每个任务节点进行实时跟踪。一旦发生异常,通过预先设定的重试机制进行自动恢复,以最大程度减少对业务产生的不良影响。 #### 实现步骤简述 - **步骤一:API连接配置** 配置并测试接入领星ERP API `/cost/center/api/cost/stream` 和 用友U8 API `/apilink/u8api`,确保基础通信正常。 - **步骤二:数据抓取策略设计** 针对分页及限流,确定合理的数据提取频率,并实现可靠调度以保证所有页码均被成功读取。 - **步骤三:自定义字段映射** 编写必要代码逻辑,实现从源端(领星ERP)字段向目标端(用友U8)的正确转化,包括必需字段缺失值补充等操作。 - **步骤四:大规模并行写入** 基于高吞吐量支持功能,将清洗后的批量数据通过 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/D38.png~tplv-syqr462i7n-qeasy.image) ### 调用领星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等字段,需要将其转换成数组格式,以便后续处理。以下是一个示例代码片段,用于构建请求参数: ```python 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系统。以下是一个示例代码片段,用于处理返回的数据并写入目标系统: ```python 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的全过程。这一过程不仅确保了数据的一致性和准确性,还提高了业务流程的自动化程度。 ![用友与SCM系统接口开发配置](https://pic.qeasy.cloud/S10.png~tplv-syqr462i7n-qeasy.image) ### 用友U8API接口的数据ETL转换与写入 在使用轻易云数据集成平台进行数据处理时,第二阶段的核心任务是将已经集成的源平台数据进行ETL转换,并转为目标平台用友U8API接口所能够接收的格式,最终写入目标平台。本文将详细探讨这一过程中的技术细节和关键步骤。 #### 1. 数据请求与清洗 在数据集成生命周期的第一阶段,我们已经完成了数据请求与清洗。此时,源平台(如领星-FBA退货订单)的数据已经被提取并初步处理。接下来,我们需要将这些数据转换为用友U8系统能够理解和处理的格式。 #### 2. 数据转换与写入 ##### 2.1 API接口配置 根据元数据配置,我们需要调用用友U8的API接口来创建和审核退货单。具体的API路径为`/apilink/u8api`,请求方法为POST,且需要进行ID校验。 ##### 2.2 单据头配置 单据头部分包含了退货单的一些基本信息,如退货单号、退货日期、销售类型等。这些字段需要根据源平台的数据进行映射和转换。 ```json { "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 单据体配置 单据体部分包含了具体的商品信息,如仓库名称、存货编码、数量等。这些字段同样需要根据源平台的数据进行映射和转换。 ```json { 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接口,将转换后的数据写入目标系统。具体操作包括: 1. **创建退货单**:调用`returnorder/create`接口,将构建好的JSON对象发送到用友U8系统。 2. **审核退货单**:调用`returnorder/audit`接口,对已创建的退货单进行审核。 ```json { apiurl:returnorder/create, audit:returnorder/audit } ``` #### 总结 通过上述步骤,我们可以实现从源平台到目标平台的数据ETL转换,并成功将数据写入用友U8系统。这一过程不仅要求对各个字段进行精确映射,还需考虑不同系统间的数据格式差异,通过合理配置和调用API接口,实现无缝的数据集成。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/T14.png~tplv-syqr462i7n-qeasy.image)