ETL转换与写入:将调拨单数据导入旺店通API实战案例

  • 轻易云集成顾问-何语琴
### 金蝶云星空与旺店通·企业奇门数据集成案例分享:调拨单同步到其他出库单实现 在复杂多变的企业环境中,业务系统的数据打通是提高运营效率的关键。本文将深入探讨如何通过轻易云数据集成平台,实现金蝶云星空与旺店通·企业奇门的数据无缝对接,以“调拨单同步到旺店通其他出库单(大架小架)”为具体案例,详细解析技术细节及最佳实践。 首先,我们需要解决金蝶云星空executeBillQuery接口数据抓取的问题。由于该接口存在分页和限流机制,因此我们设计了一套定时可靠的抓取策略,以确保每条数据都能被及时、完整地获取。通过合理设置分页参数,并结合重试机制,避免因网络或系统波动而导致的漏单现象。 数据获取后,需要关注两端系统的数据格式差异问题。金蝶云星空的数据模型与旺店通·企业奇门有所不同,这就要求我们进行精确的字段映射和转换。在此过程中,我们采用了定制化映射规则,对所有字段进行一一对应匹配,并处理必要的格式转换,同时记录下所有操作日志,确保可追踪性。 接着,将处理好的大量数据快速写入到旺店通·企业奇门。这一步骤利用wdt.stockout.order.push接口来完成批量写入操作,为提升效率,我们并行化处理请求,同时加入速率控制逻辑以适应API调用频次限制。此外,通过实时监控功能,可以随时掌握每个订单从生成到推送完整流程中的状态,有效预警异常情况。 当面对意外错误时,如网络故障或目标系统不可用等突发事件,我们建立了完备的错误重试机制。一旦检测到失败状况,会按照设定好的策略自动重新尝试提交,直至成功为止。同时,在任何出现问题环节均会记录详细日志,以便事后分析原因和改进方案。 上述过程不仅提升了跨系统间的信息流畅性,还极大降低了人工干预成本,提高整体运营效率。这只是一个初步概述,下文将进一步展开具体技术实现细节,通过各个模块代码示例和配置说明,使读者能够灵活运用于实际项目中。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/D39.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据的技术案例 在数据集成过程中,调用源系统接口是关键的第一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取并加工调拨单数据。 #### 接口配置与调用 首先,我们需要配置元数据以便正确调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置的关键字段: - **api**: `executeBillQuery` - **method**: `POST` - **number**: `FBillNo` - **id**: `FBillEntry_FEntryID` - **idCheck**: `true` 这些配置确保了我们能够正确地发起请求并处理返回的数据。 #### 请求参数设置 为了成功调用接口,我们需要设置请求参数。这些参数包括调拨单的各种属性,如单号、状态、日期等。以下是部分关键请求参数及其描述: ```json [ {"field":"FBillEntry_FEntryID","label":"FBillEntry_FEntryID","type":"string","describe":"分录主键ID"}, {"field":"FID","label":"FID","type":"string","describe":"单据内码"}, {"field":"FBillNo","label":"FBillNo","type":"string","describe":"单据编号"}, {"field":"FDocumentStatus","label":"FDocumentStatus","type":"string","describe":"单据状态"}, {"field":"FStockOrgId_FNumber","label":"FStockOrgId_FNumber","type":"string","describe":"库存组织编码"}, {"field":"FDate","label":"FDate","type":"string","describe":"单据日期"}, {"field":"FMaterialId_FNumber","label":"FMaterialId_FNumber","type":"string","describe":"物料编码"}, {"field":"FLot","label":"FLot","type":"string","describe":"批号"} ] ``` 此外,还需要设置分页参数和过滤条件,以确保查询结果符合业务需求: ```json [ {"field": "Limit", "label": "Limit", "type": "string", "describe": "分页大小", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "StartRow", "type": "string", "describe": "起始行", "value": "{PAGINATION_START_ROW}"}, {"field": "FilterString", "label": "FilterString", "type": "string", "describe": "过滤条件", "value": "FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and FStockOrgId.FNumber='100' and FSrcStockId.FNumber ='01.08' and FDestStockId.FNumber <>'01.06' and FDestStockId.FNumber <>'CK001'"} ] ``` #### 数据获取与清洗 在成功发起请求后,系统会返回调拨单的数据。此时,需要对返回的数据进行清洗和加工,以便后续处理。以下是一个简单的数据清洗示例: ```python def clean_data(raw_data): cleaned_data = [] for entry in raw_data: cleaned_entry = { 'BillNo': entry['FBillNo'], 'Date': entry['FDate'], 'Material': entry['FMaterialId_FNumber'], 'Quantity': entry['FQty'], 'SourceStock': entry['FSrcStockId_FNumber'], 'DestinationStock': entry['FDestStockId_FNumber'] } cleaned_data.append(cleaned_entry) return cleaned_data ``` #### 数据转换与写入 清洗后的数据需要转换为目标系统所需的格式,并写入目标系统。在本案例中,目标系统为旺店通其他出库单。以下是一个简单的数据转换示例: ```python def transform_data(cleaned_data): transformed_data = [] for entry in cleaned_data: transformed_entry = { 'outboundOrderNo': entry['BillNo'], 'date': entry['Date'], 'itemCode': entry['Material'], 'quantity': entry['Quantity'], 'sourceWarehouse': entry['SourceStock'], 'destinationWarehouse': entry['DestinationStock'] } transformed_data.append(transformed_entry) return transformed_data ``` 最后,将转换后的数据通过API写入旺店通系统: ```python import requests def write_to_target_system(transformed_data): url = 'https://api.wangdiantong.com/outboundOrder' headers = {'Content-Type': 'application/json'} response = requests.post(url, json=transformed_data, headers=headers) if response.status_code == 200: print("Data successfully written to target system.") else: print("Failed to write data to target system.") ``` 通过上述步骤,我们完成了从金蝶云星空获取调拨单数据,并将其同步到旺店通其他出库单的全过程。这一过程展示了如何利用轻易云数据集成平台实现高效的数据集成和处理。 ![如何对接企业微信API接口](https://pic.qeasy.cloud/S5.png~tplv-syqr462i7n-qeasy.image) ### 将调拨单数据转换并写入旺店通·企业奇门API接口 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台——旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是详细的技术实现过程。 #### 接口配置与元数据解析 首先,我们需要了解目标API接口`wdt.stockout.order.push`的具体要求和参数配置。根据提供的元数据配置,我们可以看到以下关键字段: - `outer_no`(外部单号):对应源数据中的`FBillNo` - `warehouse_no`(仓库编号):固定值`005` - `remark`(备注):固定值`金蝶调拨单` - `is_check`(是否审核):固定值`1` - `detail_list`(货品明细节点):这是一个数组节点,包含多个子字段,如商家编码、出库数量、原价、批次和货位等。 #### 数据转换与映射 在数据转换过程中,我们需要将源平台的数据字段映射到目标平台所需的字段。以下是详细的映射规则: 1. **外部单号(outer_no)** ```json {"field":"outer_no","label":"外部单号","type":"string","value":"{FBillNo}"} ``` 该字段直接取自源数据中的`FBillNo`。 2. **仓库编号(warehouse_no)** ```json {"field":"warehouse_no","label":"仓库编号","type":"string","value":"005"} ``` 该字段为固定值`005`。 3. **备注(remark)** ```json {"field":"remark","label":"备注","type":"string","value":"金蝶调拨单"} ``` 该字段为固定值`金蝶调拨单`。 4. **是否审核(is_check)** ```json {"field":"is_check","label":"是否审核","type":"string","value":"1"} ``` 该字段为固定值`1`。 5. **货品明细节点(detail_list)** ```json { "field": "detail_list", "label": "货品明细节点{FBillEntry_FEntryID}", "type": "array", "value": "detail_listss", "children": [ {"field": "spec_no", "label": "商家编码", "type": "string", "value": "{{detail_listss.FMaterialId_FNumber}}"}, {"field": "num", "label": "出库数量", "type": "string", "value": "{{detail_listss.FQty}}"}, {"field": "price", "label": "原价", "type": "string"}, {"field": "batch_no", "label": "批次", "type": "string", "value": "{{details_listss.FLot_FNumber}}"}, {"field": "position_no", "label": "货位", "type": "string", "value": "_function IF('{{details_listss.FDestStockLocId_FNumber1}}'<>'','{{details_listss.FDestStockLocId_FNumber1}}.{{details_listss.FDestStockLocId_FNumber2}}.{{details_listss.FDestStockLocId_FNumber3}}.{{details_listss.FDestStockLocId_FNumber4}}','{{details_listss.FDestStockLocId_FNumber2}}.{{details_listss.FDestStockLocId_FNumber3}}.{{details_listss.FDestStockLocId_FNumber4}}')" } ] } ``` 在这里,货品明细节点是一个数组,每个元素包含以下子字段: - `spec_no`: 对应源数据中的商家编码 `FMaterialId_FNumber` - `num`: 对应源数据中的出库数量 `FQty` - `price`: 原价,这里没有具体映射,可能需要后续处理 - `batch_no`: 对应源数据中的批次 `FLot_FNumber` - `position_no`: 对应源数据中的货位,通过函数 `_function IF(...)` 实现复杂逻辑判断 #### 数据写入操作 在完成上述映射后,我们使用POST方法将转换后的数据推送到旺店通·企业奇门API接口。具体操作如下: ```python import requests import json # 构建请求体 payload = { 'outer_no': source_data['FBillNo'], 'warehouse_no': '005', 'remark': '金蝶调拨单', 'is_check': '1', 'detail_list': [ { 'spec_no': item['FMaterialId_FNumber'], 'num': item['FQty'], 'price': '', # 原价暂时为空 'batch_no': item['FLot_FNumber'], 'position_no': f"{item['FDestStockLocId_FNumber1']}.{item['FDestStockLocId_FNumber2']}.{item['FDestStockLocId_FNumber3']}.{item['FDestStockLocId_FNumber4']}" if item['FDestStockLocId_FNumber1'] else f"{item['FDestStockLocId_FNumber2']}.{item['FDestStockLocId_FNumber3']}.{item['FDestStockLocId_FNumber4']}" } for item in source_data['detail_list'] ] } # 发起POST请求 response = requests.post('https://api.wangdian.cn/wdt/stockout/order/push', data=json.dumps(payload)) # 检查响应状态 if response.status_code == 200: print("Data successfully pushed to WangDianTong API") else: print("Failed to push data:", response.text) ``` #### 总结 通过以上步骤,我们实现了从源平台到旺店通·企业奇门API接口的数据ETL转换和写入。这个过程包括了详细的数据映射和转换规则,以及实际的数据推送操作。在实际应用中,可以根据业务需求进一步优化和调整这些步骤,以确保数据集成的准确性和高效性。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/T8.png~tplv-syqr462i7n-qeasy.image)