数据转换与清洗:将旺店通数据高效写入金蝶云星辰V2的关键步骤

  • 轻易云集成顾问-谢楷斌
### 旺店通·企业奇门数据对接金蝶云星辰V2的技术实现 在本次系统集成案例中,我们将焦点集中于如何利用轻易云数据集成平台,实现旺店通·企业奇门的数据无缝对接到金蝶云星辰V2。在整个过程中,解决了多个关键问题,如分页和限流处理、数据格式差异以及异常重试机制等。 #### 数据不漏单与高效写入 首先,为确保从旺店通·企业奇门接口(wdt.stockout.order.query)获取的数据不发生遗漏,我们设置了定时任务,周期性调用接口并可靠抓取订单信息。同时,通过批量处理实现大量数据快速写入到金蝶云星辰V2(/jdy/v2/scm/inv_other_out),极大提升了数据传输效率。 #### 分页和限流问题的解决方案 由于旺店通·企业奇门API存在分页返回结果及频率限制的特性,在调度设计上我们采用了高效的分页机制,并通过合理配置请求间隔来规避限流问题,以保证数据长期稳定获取。这一策略不仅稳健,而且灵活,可适应不同业务需求变动。 #### 数据格式与映射转换 两套系统的数据结构存在较大差异。针对这一挑战,我们应用了一系列自定义映射规则,将源数据进行标准化转换,使其符合目标系统的要求。同时借助轻易云提供的平台能力,在映射过程中的每个步骤都可以进行实时监控与日志记录,方便调试及后期维护。 #### 异常处理与重试机制 在实际操作中,不可避免地会遇到网络波动或服务不可用等导致接口调用失败的问题。为此,我们引入了一套完善的错误重试机制,当出现异常时自动重新尝试连接,从而保证最终所有有效单据均能成功写入目标系统。此外,通过实时监控功能,可以及时发现并处理各种潜在问题,提高整体流程可靠性。 以上是此次项目部分核心技术环节介绍,下文将详细探讨具体实施步骤及注意事项。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/D4.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口wdt.stockout.order.query获取并加工数据 在数据集成生命周期的第一步,我们需要调用源系统的API接口以获取原始数据。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockout.order.query`,并对获取的数据进行初步加工。 #### 接口概述 `wdt.stockout.order.query`是一个POST请求接口,用于查询出库单信息。该接口支持多种参数配置,以满足不同的业务需求。以下是关键参数及其配置: - **api**: `wdt.stockout.order.query` - **method**: `POST` - **number**: `order_no` - **id**: `stockout_id` - **pagination**: 支持分页,默认每页返回30条数据 - **condition**: 过滤条件,例如排除特定仓库编号 - **idCheck**: 是否检查ID字段 #### 请求参数配置 为了实现增量数据获取和分页处理,我们需要配置以下请求参数: 1. **时间范围参数** - `start_time`: 按最后修改时间增量获取数据的开始时间,格式为`yyyy-MM-dd HH:mm:ss`。 - `end_time`: 按最后修改时间增量获取数据的结束时间,格式为`yyyy-MM-dd HH:mm:ss`。 2. **出库单类型** - `order_type`: 7(其他出库) 3. **出库单状态** - `status`: 95(已发货)和110(已完成) 4. **仓库编号** - `warehouse_no`: 用于区分不同仓库,不支持一次推送多个仓库编号。 5. **分页参数** - `page_size`: 每页返回的数据条数,默认值为30。 - `page_no`: 页号,从0页开始。 以下是具体的请求参数配置: ```json { "start_time": "{{LAST_SYNC_TIME|datetime}}", "end_time": "{{CURRENT_TIME|datetime}}", "order_type": "7", "status": "95,110", "warehouse_no": "", "src_order_no": "", "stockout_no": "", "page_size": "{PAGINATION_PAGE_SIZE}", "page_no": "{PAGINATION_START_PAGE}" } ``` #### 数据过滤与清洗 在获取到原始数据后,我们需要对数据进行初步清洗和过滤。根据元数据配置中的条件部分,我们排除了特定仓库编号`WH2024052601`的数据: ```json "condition":[[{"field":"warehouse_no","logic":"neq","value":"WH2024052601"}]] ``` 这一步确保了我们只处理符合业务需求的数据,从而提高了后续处理的效率和准确性。 #### 数据转换与写入准备 在完成初步清洗后,我们需要将数据转换为目标系统所需的格式,并准备写入操作。这一步通常包括字段映射、数据类型转换等操作。例如,将源系统中的字段名映射到目标系统中的相应字段名,并确保数据类型一致。 以下是一个简单的字段映射示例: ```json { "source_field_1": "target_field_1", "source_field_2": "target_field_2" } ``` 通过这种方式,我们可以确保数据在不同系统之间无缝对接,实现高效的数据集成。 #### 实时监控与错误处理 在整个过程中,实时监控和错误处理至关重要。轻易云平台提供了全透明可视化的操作界面,可以实时监控数据流动和处理状态。一旦出现错误,可以及时捕获并处理,例如记录日志、发送告警等。 总结来说,通过调用旺店通·企业奇门接口`wdt.stockout.order.query`,我们能够高效地获取并加工出库单信息,为后续的数据转换与写入奠定了坚实基础。在实际操作中,合理配置请求参数、进行有效的数据清洗和转换,以及实时监控和错误处理,是确保整个流程顺利进行的关键。 ![系统集成平台API接口配置](https://pic.qeasy.cloud/S27.png~tplv-syqr462i7n-qeasy.image) ### 将源平台数据ETL转换为金蝶云星辰V2API接口格式并写入目标平台 在数据集成生命周期的第二步中,我们将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,转为目标平台金蝶云星辰V2 API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨这一过程中的技术细节和实现方法。 #### 数据请求与清洗 首先,我们需要从源系统中提取相关数据,并进行初步清洗。这一阶段确保我们获取的数据是准确且完整的,为后续的转换和写入奠定基础。 #### 数据转换与写入 在数据转换阶段,我们需要将清洗后的数据映射到金蝶云星辰V2 API接口所需的格式。以下是具体的元数据配置: ```json { "api": "/jdy/v2/scm/inv_other_out", "effect": "EXECUTE", "method": "POST", "number": "id", "id": "id", "name": "id", "idCheck": true, "request": [ { "field": "bill_date", "label": "单据日期", "type": "string", "value": "{consign_time}" }, { "field": "bill_no", "label": "单据编码", "type": "string", "value": "{order_no}" }, { "field": "trans_type_id", "label": "业务类型id", "type": "string", "value": "13" }, { "field": "operation_key", "label": "操作类型", "type": "string", "value": "audit" }, { "field": "material_entity", ... ``` #### 元数据字段解析与映射 1. **单据日期(bill_date)** - 类型:字符串 - 来源字段:`{consign_time}` - 转换逻辑:直接映射源系统中的`consign_time`字段到目标系统的`bill_date`字段。 2. **单据编码(bill_no)** - 类型:字符串 - 来源字段:`{order_no}` - 转换逻辑:直接映射源系统中的`order_no`字段到目标系统的`bill_no`字段。 3. **业务类型ID(trans_type_id)** - 类型:字符串 - 固定值:`13` - 转换逻辑:此字段在目标系统中固定为值 `13`,无需从源系统获取。 4. **操作类型(operation_key)** - 类型:字符串 - 固定值:`audit` - 转换逻辑:此字段在目标系统中固定为值 `audit`,无需从源系统获取。 5. **商品分录(material_entity)** - 类型:数组 - 来源字段:`details_list` - 转换逻辑: - **商品ID(material_id)**: 使用 `_mongoQuery d476a55d-acc7-3156-9c7f-b9f9dce596b5 findField=content.id where={"content.number":{"$eq":"{{details_list.goods_no}}"}}` 查询商品ID。 - **数量(qty)**: 映射 `details_list.goods_count` 到 `qty`。 - **单位ID(unit_id)**: 使用 `_mongoQuery d476a55d-acc7-3156-9c7f-b9f9dce596b5 findField=content.base_unit_id where={"content.number":{"$eq":"{{details_list.goods_no}}"}}` 查询单位ID。 - **仓库ID(stock_id)**: 使用 `_findCollection find id from 9cf5314a-709f-3e72-b021-c9edae06888f where number={{details_list.warehouse_no}}` 查询仓库ID。 #### 实现细节 为了实现上述元数据配置,我们需要编写相应的数据转换脚本。以下是一个示例代码片段: ```python import requests import json def transform_and_load(data): transformed_data = { 'bill_date': data['consign_time'], 'bill_no': data['order_no'], 'trans_type_id': '13', 'operation_key': 'audit', 'material_entity': [] } for detail in data['details_list']: material = { 'material_id': query_material_id(detail['goods_no']), 'qty': detail['goods_count'], 'unit_id': query_unit_id(detail['goods_no']), 'stock_id': query_stock_id(detail['warehouse_no']) } transformed_data['material_entity'].append(material) response = requests.post( url='https://api.kingdee.com/jdy/v2/scm/inv_other_out', headers={'Content-Type': 'application/json'}, data=json.dumps(transformed_data) ) return response.json() def query_material_id(goods_no): # 实现查询逻辑 pass def query_unit_id(goods_no): # 实现查询逻辑 pass def query_stock_id(warehouse_no): # 实现查询逻辑 pass ``` 通过上述代码,我们实现了将源平台的数据转换为金蝶云星辰V2 API接口所需的格式,并成功发送POST请求以完成数据写入。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T27.png~tplv-syqr462i7n-qeasy.image)