ETL转换与数据写入:轻易云平台技术案例分析

  • 轻易云集成顾问-彭亮
### 吉客云·奇门数据集成到金蝶云星空的技术分享 在数据处理全生命周期管理中,跨系统的数据集成常常面临不同平台间的数据格式差异、接口限流和分页等挑战。本文将聚焦于一个具体的系统对接案例:(吉客云奇门->金蝶)(线上)销售退货单->销售退货单_copy,通过轻易云数据集成平台配置元数据,实现吉客云·奇门与金蝶云星空之间高效、稳定的数据交互。 #### 数据获取及处理流程 首先,我们通过调用吉客云·奇门提供的API `jackyun.tradenotsensitiveinfos.list.get` 定时可靠地抓取接口数据。在此过程中,需要特别注意如何确保不漏单,并正确处理分页和限流问题。为了实现批量快速写入到金蝶云星空,使用其提供的API `batchSave`,我们实施了一系列定制化的数据映射操作,以适配两个系统之间的数据格式差异。此外,还加强了对整个处理过程实时监控与日志记录,以应对可能出现的异常并触发错误重试机制,从而保证数据对接过程中的高度可靠性与准确性。 ###### 确保不漏单 在从吉客云·奇门获取订单信息时,通过精准控制每次请求返回结果中的时间戳或其他唯一标识进行连续抓取,有效防止遗漏。同时,结合定期审查机制,可以进一步确认所有需要同步的数据均已成功提取。 ###### 快速批量写入金蝶 面对大量销售退货单,我们采用分批次方式将这些数据通过`batchSave` API写入至金蝶云星空,不仅提高了效率,还利用该平台自身具备的强大扩展能力来支撑高并发场景下的大规模数据迁移需求。 ###### 异常处理与重试机制 为应对网络波动或服务端约束造成的错误情况,我们设计出完整的一套异常捕获及自动重试策略。每当检测到失败事件,会及时记录日志并根据事先设定好的规则进行多轮重试直至成功,大幅减少人工干预成本,提高整体运作效率。 此次详细讲解涉及一系列实际执行细节,为两大平台顺利衔接打下稳固基础。在后续内容中,将更深入展示各关键节点具体配置方法以及遇到的问题和解决方案。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/D26.png~tplv-syqr462i7n-qeasy.image) ### 调用吉客云·奇门接口获取并加工数据 在数据集成生命周期的第一步,我们需要从源系统吉客云·奇门调用接口`jackyun.tradenotsensitiveinfos.list.get`来获取销售退货单的数据。以下是详细的技术实现过程和元数据配置解析。 #### 接口调用配置 我们使用POST方法来调用`jackyun.tradenotsensitiveinfos.list.get`接口,以下是具体的请求参数配置: - **startModified** 和 **endModified**:这两个字段分别表示数据同步的起始和结束时间,使用模板变量`{{LAST_SYNC_TIME|datetime}}`和`{{CURRENT_TIME|datetime}}`动态生成。 - **pageSize** 和 **pageIndex**:用于分页控制,分别表示每页的数据量和当前请求的页码。 - **fields**:指定需要返回的字段列表,这里包含了交易号、订单号、店铺名称、公司名称等多个字段,确保获取到足够的信息进行后续处理。 - **isDelete** 和 **tradeStatus**:用于过滤已删除的数据和指定交易状态的数据。 - **tradeTypeList**:指定交易类型列表,通过解析器将字符串转换为数组。 #### 请求参数示例 ```json { "startModified": "{{LAST_SYNC_TIME|datetime}}", "endModified": "{{CURRENT_TIME|datetime}}", "pageSize": "{PAGINATION_PAGE_SIZE}", "pageIndex": "{PAGINATION_START_PAGE}", "fields": "tradeNo,orderNo,shopName,companyName,warehouseName,logisticName,...", "isDelete": "", "tradeStatus": "9090", "tradeTypeList": ["8", "12"] } ``` #### 数据过滤条件 为了确保数据的准确性和有效性,我们设置了以下过滤条件: - **shopCode != '0007'** - **goodsDetail.goodsNo != '88888'** - **goodsDetail.goodsDelivery is not null** - **shopCode not like 'YF%'** 这些条件帮助我们排除不必要的数据,提高数据处理效率。 #### 数据清洗与转换 在获取到原始数据后,需要对其进行清洗与转换,以便适应目标系统的需求。以下是一些关键步骤: 1. **字段平铺(BeatFlat)**:将嵌套结构中的字段平铺展开,例如将`goodsDetail`和`goodsDelivery`中的字段提取出来,形成扁平化结构,便于后续处理。 2. **数据类型转换**:根据目标系统要求,将某些字段的数据类型进行转换,例如将字符串类型的日期转换为日期对象。 3. **缺失值处理**:对于某些关键字段,如果存在缺失值,需要进行填补或默认值处理。 #### 示例代码 以下是一个简单的Python示例代码,用于调用接口并处理返回的数据: ```python import requests import json from datetime import datetime # 定义请求参数 params = { "startModified": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "endModified": datetime.now().strftime('%Y-%m-%d %H:%M:%S'), "pageSize": 100, "pageIndex": 1, "fields": "tradeNo,orderNo,shopName,companyName,...", "isDelete": "", "tradeStatus": "9090", "tradeTypeList": ["8", "12"] } # 发起POST请求 response = requests.post("https://api.jackyun.com/tradenotsensitiveinfos/list/get", data=json.dumps(params)) # 检查响应状态 if response.status_code == 200: data = response.json() # 数据清洗与转换 cleaned_data = [] for item in data['result']: cleaned_item = { 'tradeNo': item['tradeNo'], 'orderNo': item['orderNo'], # 更多字段映射... } cleaned_data.append(cleaned_item) # 输出清洗后的数据 print(json.dumps(cleaned_data, indent=4)) else: print(f"Error: {response.status_code}") ``` 通过上述步骤,我们可以高效地从吉客云·奇门获取所需的数据,并进行必要的清洗与转换,为后续的数据写入做好准备。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/S4.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在本案例中,我们将详细探讨如何使用轻易云数据集成平台,将来自吉客云奇门的销售退货单数据进行ETL转换,并最终写入金蝶云星空API接口。整个过程涵盖了数据清洗、转换和写入的关键步骤。 #### 数据请求与清洗 首先,我们从吉客云奇门获取销售退货单的数据。该阶段主要涉及数据的提取和初步清洗,确保数据的完整性和一致性。在本文中,我们将重点放在后续的数据转换和写入阶段,因此不再赘述此部分。 #### 数据转换与写入 接下来,我们进入数据生命周期的第二步,即将已经集成的源平台数据进行ETL转换,并转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。 ##### 配置元数据 我们使用以下元数据配置来实现这一过程: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "tradeNo", "bodyName": "details", "bodySum": ["goodsDetail_goodsDelivery_sendCount"], "header": ["tradeNo", "shopCode", "warehouseCode", "sourceTradeNos", "consignTime", "customerCode", "onlineTradeNo"], "body": ["goodsDetail_goodsNo", "goodsDetail_goodsDelivery_sendCount", "goodsDetail_goodsDelivery_batchamount", "goodsDetail_goodsDelivery_batchNo", "goodsDetail_shareFavourableAfterFee", "goodsDetail_sellTotal", "goodsDetail_sellCount"] }, ... } ``` 此配置定义了API请求的基本信息、操作方法以及所需字段。具体字段如下: - `header`:包括交易编号(tradeNo)、店铺编码(shopCode)、仓库编码(warehouseCode)、来源交易编号(sourceTradeNos)、发货时间(consignTime)、客户编码(customerCode)和在线交易编号(onlineTradeNo)。 - `body`:包括商品编码(goodsDetail_goodsNo)、发货数量(goodsDetail_goodsDelivery_sendCount)、批次金额(goodsDetail_goodsDelivery_batchamount)、批号(goodsDetail_goodsDelivery_batchNo)、优惠后费用(goodsDetail_shareFavourableAfterFee)、销售总额(goodsDetail_sellTotal)和销售数量(goodsDetail_sellCount)。 ##### 请求参数映射 我们需要将上述字段映射到金蝶云星空API接口所需的参数格式。以下是具体的请求参数配置: ```json [ {"field":"FBillNo","label":"单据编号","type":"string","value":"{tradeNo}"}, {"field":"FDate","label":"日期","type":"string","value":"{consignTime}"}, {"field":"FRetcustId","label":"退货客户","type":"string","value":"{shopCode}","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FBillTypeID","label":"单据类型","type":"string","value":"XSTHD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FHeadNote","label":"备注","type":"string","value":"{onlineTradeNo}"}, {"field":"FEntity","label":"明细信息","type":"array","value":"details", ... } ] ``` 其中,`FEntity`字段包含了详细的信息,如物料编码、应退数量、实退数量等。这些字段需要通过特定的解析器进行转换,例如: - `ConvertObjectParser`:用于将某些字段值转换为金蝶系统所需的格式。 - `_function`:用于计算或处理某些字段值,例如应退数量和实退数量都需要取负值。 ##### 示例代码实现 以下是一个示例代码片段,展示如何通过轻易云平台发送POST请求,将转换后的数据写入金蝶云星空API接口: ```python import requests import json url = 'https://api.kingdee.com/batchSave' headers = {'Content-Type': 'application/json'} data = { # 转换后的请求参数 } response = requests.post(url, headers=headers, data=json.dumps(data)) if response.status_code == 200: print("Data successfully written to Kingdee Cloud") else: print(f"Failed to write data: {response.text}") ``` 在这个示例中,我们使用Python语言,通过HTTP POST请求将处理后的数据发送到金蝶云星空API接口。确保所有必要字段已正确映射并经过相应解析器处理。 #### 总结 通过以上步骤,我们成功地将吉客云奇门的销售退货单数据进行了ETL转换,并通过轻易云平台将其写入到金蝶云星空API接口。这个过程展示了如何利用元数据配置和解析器,实现不同系统间的数据无缝对接,从而提升业务效率和透明度。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T12.png~tplv-syqr462i7n-qeasy.image)