ETL过程详解:云星空到旺店通的销售退货单数据转换

  • 轻易云集成顾问-姚缘
### 云星空销售退货单(渠道)对接旺店通其他入库单的技术案例 在系统集成领域,数据从一个平台流动到另一个平台时,往往会面临多种挑战。本文聚焦于如何将金蝶云星空的销售退货单(渠道)数据高效、可靠地集成到旺店通·企业奇门中的其他入库单环节。在这个过程中,我们遇到了API调用、分页限流、数据格式转换等一系列复杂问题。通过合理配置和使用轻易云数据集成平台,这些问题得到了有效解决。 首先,在获取金蝶云星空的数据时,我们充分利用其提供的`executeBillQuery`接口,以确保所有销售退货单信息不会遗漏。同时,为了应对大量数据传输的问题,我们采用了定时抓取机制,通过批量处理方式,将这些数据快速写入到旺店通·企业奇门。从而保证每一笔交易都能及时反映在库存系统中。 其次,在处理API调用方面,金蝶云星空的数据查询与旺店通·企业奇门的数据写入存在显著差异。例如,执行 `executeBillQuery` 时需要注意分页及限流策略,而在向 `wdt.stockin.order.push` 写入数据时,则需特别关注其字段映射和格式要求。另外,为防止因网络波动或服务器故障导致的数据丢失,我们还实现了一套异常处理与重试机制。这套机制能够自动记录失败操作,并在适当的时候重新尝试提交,从而增强整个流程的健壮性和容错能力。 最后,本次方案中我们不仅实现了实时监控与日志记录,还针对特定需求进行了接口优化,包括自定义的一些映射规则,使之更好地符合实际业务逻辑。本案例展示的不只是技术上的难题,更体现出精准设计、高效实施以及实时调优的重要性,希望能为类似项目提供有益参考。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/D19.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口来获取销售退货单数据,并进行初步加工。 #### 接口配置与请求参数 首先,我们需要配置`executeBillQuery`接口的请求参数。以下是元数据配置中的关键字段: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FEntity_FENTRYID", "pagination": { "pageSize": 100 }, "idCheck": true, "request": [ {"field":"FID","label":"实体主键","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","value":"FSaleOrgId"}, {"field":"FStockOrgId","label":"库存组织","type":"string","value":"FStockOrgId"}, {"field":"FSettleOrgId","label":"结算组织","type":"string","value":"FSettleOrgId"}, {"field":"FApproveDate","label":"日期","type":"string","value":"FApproveDate"}, {"field":"FRetcustId","label":"客户","type":"string","value":"FRetcustId"}, {"field":"FMaterialId_FNumber","label":"物料","type":"string","value":"FMaterialId.FNumber"}, {"field":"FOwnerIdHead","label":"货主","type":"string","value":"FOwnerIdHead"}, {"field":"FRealQty","label":"实发数量","type":"string","value":"FRealQty"}, {"field":"FStockId_FNumber","label":"仓库id","type":"string","value":"FStockId.FNumber"}, {"field": "FTaxPrice", "label": "含税单价", "type": "string", "value": "FTaxPrice"}, {"field": "FRetcustId_FNumber", "label": "投诉对应客户", "type": "string", "value": "FRetcustId.FNumber"}, {"field": "FSrcBillNo", "label": "源单编号", "type": "string", "value": "FSrcBillNo"}, {"field": "FSalesManId_FName", "label": "销售员", "type": "string", "value": "FSalesManId.FName"}, {"field": "FEntity_FENTRYID", "label": "", type: string, value: FEntity_FENTRYID}, {"field" : FPrice, label: 单价, type: string, value: FPrice}, { field: FBillTypeID, label: 单据类型, type: string, value: FBillTypeID} ], ... } ``` #### 请求示例 根据上述配置,我们构建一个请求示例: ```json { FormId: 'SAL_RETURNSTOCK', FieldKeys: 'FID,FBillNo,FSaleOrgId,FStockOrgId,FSettleOrgId,FApproveDate,FRetcustId,FMaterialId.FNumber,FOwnerIdHead,FRealQty,FStockId.FNumber,FTaxPrice,FRetcustId.FNumber,FSrcBillNo,FSalesManId.FName,FEntity_FENTRYID,FPrice,FBillTypeID', FilterString: 'FApproveDate>='2023-01-01' AND FDocumentStatus='C' AND FBillTypeID= '64674633836ae2' AND FStockId.FNumber != '037', Limit: 100, StartRow: 0, } ``` #### 数据处理与清洗 在获取到原始数据后,我们需要对其进行清洗和初步加工,以便后续的数据转换和写入。以下是一些常见的数据处理步骤: 1. **字段映射**:将金蝶云星空返回的数据字段映射到目标系统所需的字段。例如,将`FBillNo`映射为目标系统中的订单编号。 2. **数据格式转换**:将日期格式从金蝶云星空的格式转换为目标系统所需的格式。 3. **数据过滤**:根据业务需求过滤掉不必要的数据。例如,只保留状态为已审核(`C`)的记录。 #### 示例代码 以下是一个使用Python进行数据请求和处理的示例代码: ```python import requests import json # 定义请求参数 url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'SAL_RETURNSTOCK', 'FieldKeys': 'FID,FBillNo,...', # 完整字段列表 'FilterString': 'FApproveDate>=2023-01-01 AND FDocumentStatus=C AND ...', 'Limit': 100, 'StartRow': 0, } # 发起请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() # 数据处理 processed_data = [] for record in data: processed_record = { 'order_number': record['FBillNo'], # 映射其他字段... # 转换日期格式... # 数据过滤... } processed_data.append(processed_record) # 输出处理后的数据 print(json.dumps(processed_data, indent=4)) ``` 通过以上步骤,我们成功地调用了金蝶云星空的`executeBillQuery`接口,获取并初步加工了销售退货单的数据。这为后续的数据转换和写入打下了坚实的基础。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/S11.png~tplv-syqr462i7n-qeasy.image) ### 数据集成生命周期中的ETL转换:云星空销售退货单到旺店通其他入库单 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨这一过程,特别是如何利用元数据配置来实现这一目标。 #### API接口配置 我们使用的API接口为`wdt.stockin.order.push`,通过POST方法提交请求。以下是具体的元数据配置: ```json { "api": "wdt.stockin.order.push", "effect": "EXECUTE", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo", "bodyName": "goods_list", "bodySum": ["FRealQty"], "header": ["FBillNo", "FStockId_FNumber"], "body": ["FMaterialId_FNumber", "FRealQty", "FTaxPrice"] }, "request": [ {"field": "is_check", "label": "是否审核", "type": "string", "value": "1"}, {"field": "outer_no", "label": "外部单号", "type": "string", "value": "{FBillNo}"}, {"field": "warehouse_no", "label": "仓库编码", "type": "string", "value": "{FStockId_FNumber}"}, {"field": "remark", "label": "备注", "type": "string", "value":"销售退货单(渠道)"}, { "field":"goods_list", "label":"货品明细节点", "type":"array", ... ``` #### 数据转换过程 1. **提取(Extract)**: - 从源平台云星空中提取销售退货单的数据,包括单据编号(FBillNo)、仓库编码(FStockId_FNumber)、物料编码(FMaterialId_FNumber)、实际数量(FRealQty)和税价(FTaxPrice)。 2. **转换(Transform)**: - 将提取的数据映射到目标平台所需的字段。例如,将`FBillNo`映射为`outer_no`,`FStockId_FNumber`映射为`warehouse_no`。 - 对于货品明细节点,需要将每一项物料信息转换为目标平台所需的格式。在这个过程中,我们使用了模板字符串,例如:`{{goods_list.FMaterialId_FNumber}}`表示从源数据中获取物料编码。 3. **加载(Load)**: - 将转换后的数据通过POST方法提交到旺店通·企业奇门API接口。这里需要注意的是,我们设置了一个标志位`is_check=1`,表示该单据需要审核。 #### 请求示例 以下是一个完整的请求示例: ```json { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... ![数据集成平台API接口配置](https://pic.qeasy.cloud/T14.png~tplv-syqr462i7n-qeasy.image)