从数据获取到ETL:旺店通与金蝶云星辰V2数据集成全面解析

  • 轻易云集成顾问-黄宏棵
### 案例解析:旺店通·企业奇门数据集成到金蝶云星辰V2 在企业信息系统集成过程中,实现不同平台间的数据对接是一项极具挑战的任务。本文将聚焦于一个实际运行的对接方案——从旺店通·企业奇门导出数据并集成到金蝶云星辰V2的案例,探讨如何通过轻易云数据集成平台高效可靠地完成这项工作。 #### 整体概览 本次项目涉及将“其他出库(生产)”类型的数据从旺店通·企业奇门,通过API接口`wdt.stockout.order.query`获取后,再批量写入到金蝶云星辰V2的新版本接口`/jdy/v2/scm/inv_other_out`中。其中需要解决的重要技术问题包括确保数据不漏单、实现大量数据的快速写入以及处理两者之间的数据格式差异等。 #### 数据抓取与转换 我们采用定时可靠抓取策略,每小时调用一次旺店通·企业奇门提供的API接口`wdt.stockout.order.query`,以获取最新的出库订单记录。在抓取过程中,我们特别关注分页和限流的问题。为此,在请求参数中加入了分页信息,并根据返回结果中的状态码进行限流判断,保证每次操作都在可控范围内顺利完成。 #### 快速批量写入与映射优化 为了应对大量数据快速稳定地写入至金蝶云星辰V2,我们设计了一套批量处理机制,将多条订单记录合并一组,通过轻易云的平台特性批量传输。同时,为了解决源端和目标端字段及格式的不一致问题,对每个字段进行了精细化映射。这包括简单字符型字段转换,以及复杂结构体字段重构,以确保最终提交给金蝶云的数据满足其严格要求。 #### 异常处理与重试机制 在整个对接过程中,不可避免会遇到网络波动或意外错误引起的失败事件。针对这些情况,我们使用了详细完整的日志监控系统来实时追踪操作进展和状态。一旦发现异常,可以触发自动重试机制,基于上一次失败时保存下来的上下文信息重新发起请求,从而保证整体流程的不间断性和准确性。 本系列文章开篇介绍了此次系统对接集成关键部分,其它具体技术实现细节将在后续章节全面展开,包括如何高效管理生命周期事件、更多分页策略优化方法及错误捕获技巧等。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/D17.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台调用旺店通·企业奇门接口获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockout.order.query`,并对获取的数据进行初步加工。 #### 接口概述 `wdt.stockout.order.query`接口用于查询出库单信息,支持按最后修改时间增量获取数据。该接口采用POST请求方式,返回的数据包含出库单的详细信息。为了确保数据的准确性和完整性,我们需要配置相关的元数据。 #### 元数据配置详解 以下是我们在轻易云平台上配置的元数据: ```json { "api": "wdt.stockout.order.query", "method": "POST", "number": "order_no", "id": "stockout_id", "pagination": { "pageSize": 30 }, "condition": [ [ { "field": "warehouse_no", "logic": "neq", "value": "WH2024052601" } ] ], "idCheck": true, "request": [ { "field": "start_time", "label": "开始时间", "type": "string", "describe": "按最后修改时间增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{LAST_SYNC_TIME|datetime}}" }, { "field": "end_time", "label": "结束时间", "type": "string", "describe": "按最后修改时间增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{CURRENT_TIME|datetime}}" }, { "field": "order_type", "label": "出库单类型", "type": "string", "describe":"2调拨出库,3采购退货出库,4盘亏出库,5生产出库,7其他出库,8多发出库,9纠错出库,10保修配件出库,11初始化出库,12jit拣货出库,13委外出库", "value":"5" }, { ... ``` #### 请求参数解析 1. **时间参数**: - `start_time` 和 `end_time` 分别表示查询的起始和结束时间,格式为 `yyyy-MM-dd HH:mm:ss`。这些参数通过模板变量 `{{LAST_SYNC_TIME|datetime}}` 和 `{{CURRENT_TIME|datetime}}` 动态生成。 2. **订单类型**: - `order_type` 固定为 `5`,表示生产出库。 3. **状态过滤**: - `status` 设置为 `95,110`,表示查询已发货和已完成的订单。 4. **仓库编号**: - `warehouse_no` 用于区分不同仓库,这里不传递具体值以支持多仓库查询。 5. **分页参数**: - `page_size` 和 `page_no` 用于控制分页,每页返回30条记录,从第0页开始。 #### 数据请求与清洗 在配置好元数据后,通过轻易云平台发送POST请求到旺店通·企业奇门接口。示例请求体如下: ```json { ... { ... {"start_time":"2023-10-01 00:00:00","end_time":"2023-10-01 23:59:59","order_type":"5","status":"95,110"}, {"page_size":"30","page_no":"0"} } } ``` 请求返回的数据需要经过清洗和转换,以便后续处理。以下是常见的数据清洗步骤: 1. **字段映射**:将返回的数据字段映射到目标系统所需的字段。例如,将返回的 `stockout_id` 映射为目标系统中的唯一标识符。 2. **数据过滤**:根据业务需求过滤掉不必要的数据。例如,只保留特定状态或特定仓库的数据。 3. **格式转换**:将日期、数值等字段转换为目标系统所需的格式。 #### 数据转换与写入 经过清洗后的数据可以进一步转换,并写入到目标系统中。这一步通常涉及到复杂的业务逻辑和规则,需要根据具体需求进行定制化开发。 通过上述步骤,我们成功地从旺店通·企业奇门接口获取了所需的生产出库单信息,并对其进行了初步加工,为后续的数据处理打下了坚实基础。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/S20.png~tplv-syqr462i7n-qeasy.image) ### 将源平台数据ETL转换并写入金蝶云星辰V2API接口的技术案例 在轻易云数据集成平台中,将源平台的数据进行ETL(提取、转换、加载)转换,并最终写入目标平台金蝶云星辰V2API接口,是一个复杂而关键的步骤。本文将详细探讨如何通过配置元数据,实现这一过程。 #### API接口配置与元数据解析 我们需要将源平台的数据转换为金蝶云星辰V2API接口所能接收的格式。根据提供的元数据配置,目标API接口为`/jdy/v2/scm/inv_other_out`,请求方法为POST。以下是关键字段及其对应关系: - `bill_date`(单据日期):映射到源数据中的`consign_time` - `bill_no`(单据编码):映射到源数据中的`order_no` - `trans_type_id`(业务类型id):固定值13 - `operation_key`(操作类型):固定值audit - `material_entity`(商品分录):这是一个数组,包含多个子字段,如商品ID、数量、单位和仓库等 #### 数据提取与清洗 首先,从源平台提取原始数据,并进行必要的清洗操作。假设源数据结构如下: ```json { "consign_time": "2023-10-01", "order_no": "ORD123456", "details_list": [ { "goods_no": "G001", "goods_count": 10, "warehouse_no": "W001" }, { "goods_no": "G002", "goods_count": 5, "warehouse_no": "W002" } ] } ``` #### 数据转换 根据元数据配置,我们需要将上述原始数据转换为目标API所需的格式。具体步骤如下: 1. **单据日期和单据编码**:直接映射 ```json { "bill_date": "{consign_time}", "bill_no": "{order_no}" } ``` 2. **业务类型和操作类型**:固定值填充 ```json { "trans_type_id": "13", "operation_key": "audit" } ``` 3. **商品分录**:复杂嵌套结构,需要进一步处理每个商品条目 - 商品ID (`material_id`) 和 单位 (`unit_id`) 需要通过MongoDB查询获取。 - 仓库ID (`stock_id`) 通过集合查询获取。 具体实现代码示例如下: ```javascript let transformedData = { bill_date: sourceData.consign_time, bill_no: sourceData.order_no, trans_type_id: '13', operation_key: 'audit', material_entity: sourceData.details_list.map(item => { return { material_id: queryMongoDB('d476a55d-acc7-3156-9c7f-b9f9dce596b5', 'content.id', { 'content.number': item.goods_no }), qty: item.goods_count.toString(), unit_id: queryMongoDB('d476a55d-acc7-3156-9c7f-b9f9dce596b5', 'content.base_unit_id', { 'content.number': item.goods_no }), stock_id: findCollection('9cf5314a-709f-3e72-b021-c9edae06888f', 'id', { number: item.warehouse_no }) }; }) }; function queryMongoDB(collectionId, field, query) { // 模拟MongoDB查询函数,根据实际情况实现 } function findCollection(collectionId, field, query) { // 模拟集合查询函数,根据实际情况实现 } ``` #### 数据加载 最后,将转换后的数据通过POST请求发送至金蝶云星辰V2API接口: ```javascript fetch('/jdy/v2/scm/inv_other_out', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(transformedData) }) .then(response => response.json()) .then(data => console.log('Success:', data)) .catch(error => console.error('Error:', error)); ``` #### 总结 通过以上步骤,我们成功地将源平台的数据进行了ETL转换,并写入了金蝶云星辰V2API接口。这一过程不仅涉及到简单的数据映射,还包括复杂的嵌套结构处理和多系统间的数据查询与整合。在实际应用中,根据具体需求和系统环境,可能还需要进一步优化和调整。 ![钉钉与MES系统接口开发配置](https://pic.qeasy.cloud/T16.png~tplv-syqr462i7n-qeasy.image)