基于轻易云数据集成平台的ETL实践:写入金蝶云星空

  • 轻易云集成顾问-姚缘
### 旺店通·旗舰奇门销售退货单集成到金蝶云星空的实践案例 在本次技术分享中,我们将探讨如何基于06-ToB销售退货单集成方案,利用轻易云数据集成平台成功实现旺店通·旗舰奇门的数据无缝对接至金蝶云星空。 **步骤一:从旺店通·旗舰奇门获取销售退货单数据** 首先,通过调用 `wdt.wms.stockin.refund.querywithdetail` API 接口,从旺店通·旗舰奇门系统中批量抓取销售退货单的详细数据。为确保高效、可靠地获取这些信息,该接口支持分页请求和限流控制。从而能处理大规模返回数据,并避免因请求频率过高导致的接口异常。 **步骤二:清洗与转换数据** 考虑到供销两端系统的数据格式不一致性,接下来需要进行必要的数据清洗和转换。这一步骤可以通过平台提供的自定义数据转换逻辑功能来完成。例如,将旺店通中的字段名与金蝶云星空所要求的字段名进行映射,同时对某些特定业务逻辑做出相应调整,以适配目标系统需求。 **步骤三:写入金蝶云星空** 经过处理后的销售退货单记录准备完毕后,即可使用金蝶云星空提供的 `batchSave` API 进行批量写入。为了确保大量数据快速准确地导入目标系统,我们充分利用了该平台优化过的数据写入能力。此外,通过实时监控工具,可以追踪任务状态及性能表现,及时发现并解决可能出现的问题。 **结论** 此次实际运行过程中,实现了从API调取,到数据清洗转化,再到最终批量保存的一系列操作。不仅保障了重试机制,在面对突发异常时也能够稳妥处理,还具备良好的透明度与实时跟踪性。因此,本篇文章将进一步详述各关键环节以及具体配置细节,为大家提供完整、实用、高效的数据集成解决方案模板。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/D2.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·旗舰奇门接口wdt.wms.stockin.refund.querywithdetail获取并加工数据 在数据集成生命周期的第一步,我们需要从源系统获取数据并进行初步处理。本文将详细介绍如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口`wdt.wms.stockin.refund.querywithdetail`,并对获取的数据进行加工。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。以下是元数据配置的详细信息: ```json { "api": "wdt.wms.stockin.refund.querywithdetail", "method": "POST", "number": "order_no", "id": "order_no", "idCheck": true, "request": [ { "field": "pager", "label": "分页参数", "type": "object", "children": [ { "field": "page_size", "label": "分页大小", "type": "string", "value": "50", "parent": "pager" }, { "field": "page_no", "label": "页号", "type": "string", "value": "1", "parent": "pager" } ] }, { "field": "params", "label": "业务参数", "type": "object", ... } ], ... } ``` #### 请求参数解析 在请求参数中,我们主要关注两个部分:分页参数和业务参数。 1. **分页参数**: - `page_size`: 每页返回的数据条数,默认设置为50。 - `page_no`: 当前页码,默认设置为1。 2. **业务参数**: - `start_time` 和 `end_time`: 分别表示查询的开始时间和结束时间,使用动态变量`{{LAST_SYNC_TIME|datetime}}`和`{{CURRENT_TIME|datetime}}`来自动填充。 - `status`: 入库单状态,这里我们设置为80,即已完成状态。 - `time_type`: 时间条件类型,默认为0(修改时间)。 - `warehouse_no`, `shop_nos`, `stockin_no`: 分别表示仓库编码、店铺编号(多个店铺编号使用英文逗号分隔)和入库单号。 #### 数据请求与清洗 在调用接口获取数据后,我们需要对数据进行清洗,以确保其符合后续处理的要求。以下是一个简单的数据清洗流程: 1. **过滤无效数据**:根据业务需求过滤掉不符合条件的数据。例如,只保留状态为80(已完成)的入库单。 2. **字段映射与转换**:将原始数据中的字段映射到目标系统所需的字段,并进行必要的格式转换。例如,将时间字段转换为标准的ISO格式。 3. **去重与合并**:如果存在重复记录,需要进行去重操作。同时,对于同一订单的多条记录,可以进行合并处理。 #### 示例代码 以下是一个示例代码片段,用于调用接口并处理返回的数据: ```python import requests import json from datetime import datetime # 定义请求URL和头部信息 url = 'https://api.wangdian.cn/openapi2/wdt.wms.stockin.refund.querywithdetail' headers = {'Content-Type': 'application/json'} # 构建请求体 payload = { 'pager': { 'page_size': '50', 'page_no': '1' }, 'params': { 'start_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'end_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'status': '80', 'time_type': '0' } } # 发起POST请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与处理 cleaned_data = [] for record in data['data']: if record['status'] == '80': cleaned_record = { 'order_no': record['order_no'], 'warehouse_no': record['warehouse_no'], ... } cleaned_data.append(cleaned_record) # 输出清洗后的数据 print(json.dumps(cleaned_data, indent=4)) else: print(f"Error: {response.status_code}") ``` #### 小结 通过上述步骤,我们成功地调用了旺店通·旗舰奇门接口`wdt.wms.stockin.refund.querywithdetail`,并对获取的数据进行了初步清洗和加工。这一步骤为后续的数据转换与写入奠定了基础。在实际应用中,可以根据具体业务需求进一步优化和扩展数据处理逻辑。 ![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/S16.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口 在数据集成的生命周期中,ETL(提取、转换、加载)过程是至关重要的一环。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并转为金蝶云星空API接口所能够接收的格式,最终写入目标平台。 #### 元数据配置解析 元数据配置是ETL过程中的核心部分,它定义了如何将源数据映射到目标系统的数据结构中。以下是关键字段和配置的详细解析: 1. **API接口和请求方法** ```json {"api":"batchSave","method":"POST"} ``` 这里指定了目标API接口为`batchSave`,请求方法为`POST`。 2. **单据类型** ```json {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSTHD01_SYS"} ``` 单据类型字段`FBillTypeID`使用了`ConvertObjectParser`解析器,将值转化为金蝶云星空系统可识别的格式。 3. **单据编号** ```json {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"} ``` 单据编号直接从源数据中获取,并映射到目标字段`FBillNo`。 4. **销售组织** ```json {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"销售组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find zip from ec445d8c-9d91-3845-9175-79fb0588e1b3 where shop_no={shop_no}"} ``` 销售组织字段使用了复杂的查询语句,从另一个集合中查找对应的值,并通过解析器进行转换。 5. **日期** ```json {"field":"FDate","label":"日期","type":"date","describe":"日期","value":"{modified}"} ``` 日期字段直接从源数据中的修改时间字段获取,并映射到目标字段`FDate`。 6. **库存组织** ```json {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"库存组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find FRetorgId from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no}"} ``` 库存组织字段同样使用复杂查询语句,通过解析器转换后映射到目标字段。 #### 明细信息处理 明细信息部分包含多个子字段,每个子字段都需要进行相应的处理和映射: 1. **物料编码** ```json {"field":"FMaterialId","label":"物料编码","type":"string","describe":"物料编码","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{details_list.spec_no}}"} ``` 物料编码从明细列表中的规格编号字段获取,并通过解析器转换后映射到目标字段。 2. **实退数量** ```json {"field":"FRealQty","label":"实退数量","type": "int", "describe": "实退数量", "value": "{{details_list.num}}"} ``` 实退数量直接从明细列表中的数量字段获取,并映射到目标字段。 3. **含税单价** ```json {"field": "FTaxPrice", "label": "含税单价", "type": "float", "describe": "含税单价", "value": "_findCollection find FTAXPRICE from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no} FMaterialID={{details_list.spec_no}}"} ``` 含税单价通过复杂查询语句从另一个集合中查找对应值,并映射到目标字段。 4. **是否赠品** ```json {"field": "FIsFree", "label": "是否赠品", "type": "bool", "describe": "是否赠品", "value": "_findCollection find FISFREE from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no} FMaterialID={{details_list.spec_no}}"} ``` 是否赠品通过查询语句查找对应值,并映射到目标字段。 #### 财务信息处理 财务信息部分包含多个子字段,每个子字段也需要进行相应的处理和映射: 1. **结算组织** ```json {"field": "FSettleOrgId", "label": "结算组织", "type": "string", "describe": "结算组织", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "_findCollection find FSALEORGID from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no}"} ``` 结算组织通过复杂查询语句查找对应值,并通过解析器转换后映射到目标字段。 2. **整单折扣额、是否含税、价外税** ```json {"field": "FAllDisCount", "label": "整单折扣额", "type": "float", "describe": "整单折扣额"}, {"field": "FIsIncludedTax", "label": "是否含税", "type": "bool", "value": "true"}, {"field": "FIsPriceExcludeTax", "label": "价外税", "type": "bool", "value": "true"} ``` 这些财务信息直接从源数据或默认值中获取,并映射到相应的目标字段。 #### 操作配置 最后,我们需要配置一些操作相关的信息,以确保数据能够正确提交并审核: 1. **业务对象表单Id** ```json {"field": FormId, label: 业务对象表单Id, type: string, describe: 业务对象表单Id, value: SAL_RETURNSTOCK} ``` 2. **执行操作** ```json {"field": Operation, label: 执行操作, type: string, describe: 执行操作, value: BatchSave} ``` 3. **提交并审核、验证基础资料、负库存** ```json {"field": IsAutoSubmitAndAudit, label: 提交并审核, type: bool, describe: 提交并审核, value: true}, {"field": IsVerifyBaseDataField, label: 验证基础资料, type: bool, describe: 是否验证所有基础资料有效性,布尔类,默认false(非必录), value: false}, {"field": InterationFlags, label: 负库存, type: string, value: STK_InvCheckResult} ``` 这些操作配置确保了在完成ETL转换后,数据能够自动提交并审核,同时设置了一些必要的校验和标志位以保证数据完整性和一致性。 通过以上步骤,我们成功地将源平台的数据进行了ETL转换,使其符合金蝶云星空API接口所能接收的格式,最终实现了无缝的数据写入。 ![数据集成平台API接口配置](https://pic.qeasy.cloud/T11.png~tplv-syqr462i7n-qeasy.image)