解析旺店通与金蝶云星辰V2的ETL数据转换与集成技术

  • 轻易云集成顾问-彭萍
### 旺店通销售出库单对接金蝶云星辰V2的技术案例分享 在电商快速发展的今天,高效、准确的数据集成成为企业优化业务流程必不可少的需求。本技术文章将详细解析如何通过旺店通·企业奇门数据集成到金蝶云星辰V2,实现销售出库单对接任务。本文特别聚焦于一线实际运行方案:**旺店通销售出库单对接(线下)**。 首先,我们需使用`wdt.stockout.order.query.trade`接口从旺店通·企业奇门获取销售信息,不仅要确保数据不漏单,且需处理分页和限流问题,以保证大规模数据提取的稳定性。由于两系统的数据格式有所差异,在写入之前必须进行必要的数据转换和映射。此外,通过定时可靠的抓取机制,可以自动化批量采集订单信息并将其快速写入到金蝶云星辰V2。 为了实现这一目标,轻易云数据集成平台提供了全方位支持,包括实时监控与日志记录功能。这不仅允许我们即时察觉并解决异常情况,还能通过错误重试机制大幅提升数据传输的成功率。同时,针对金蝶云星辰V2特殊化要求,我们采用/jdy/v2/scm/sal_out_bound API完成最终的信息提交。 以下章节将深入探讨具体实现步骤,包括API调用方法、分页与限流策略以及定制化映射对接等技术细节,为您呈现一个完整、高效、可靠的数据集成解决方案。 ![数据集成平台API接口配置](https://pic.qeasy.cloud/D10.png~tplv-syqr462i7n-qeasy.image) ### 调用源系统旺店通·企业奇门接口wdt.stockout.order.query.trade获取并加工数据 在轻易云数据集成平台的生命周期中,调用源系统接口是关键的第一步。本文将详细探讨如何通过调用旺店通·企业奇门接口`wdt.stockout.order.query.trade`获取销售出库单数据,并对其进行初步加工。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。根据提供的metadata,以下是具体的配置细节: - **API**: `wdt.stockout.order.query.trade` - **请求方法**: `POST` - **主要字段**: - `order_no`: 销售订单号 - `stockout_id`: 出库单ID - `start_time`: 数据增量获取的开始时间,格式为`yyyy-MM-dd HH:mm:ss` - `end_time`: 数据增量获取的结束时间,格式为`yyyy-MM-dd HH:mm:ss` - `status`: 销售订单状态,包括已取消、已审核、已发货、部分打款、已完成和异常发货等状态 - `shop_no`: 店铺编号,用于区分不同店铺的数据 - `warehouse_no`: 仓库编号,用于区分不同仓库的数据 #### 请求参数设置 为了实现增量数据获取,我们需要设置`start_time`和`end_time`参数。这两个参数分别代表上次同步时间和当前时间,可以通过模板变量动态填充: ```json { "start_time": "{{LAST_SYNC_TIME|datetime}}", "end_time": "{{CURRENT_TIME|datetime}}" } ``` 此外,为了确保我们只获取特定状态的订单,可以设置`status`参数: ```json { "status": "95,105,110,113" } ``` 分页参数也非常重要,以确保我们能够处理大量数据而不会遗漏: ```json { "page_size": "{PAGINATION_PAGE_SIZE}", "page_no": "{PAGINATION_START_PAGE}" } ``` #### 数据请求与清洗 在发送请求后,我们将接收到一批原始数据。为了便于后续处理,需要对这些数据进行初步清洗和转换。以下是一些常见的数据清洗步骤: 1. **字段映射**:将接口返回的数据字段映射到目标系统所需的字段。例如,将返回的`order_no`映射到目标系统中的订单号字段。 2. **数据过滤**:根据业务需求过滤掉不必要的数据。例如,只保留特定状态(如已发货、已完成)的订单。 3. **格式转换**:将日期时间等字段转换为目标系统所需的格式。 #### 示例代码 以下是一个简单的Python示例代码,用于调用接口并处理返回的数据: ```python import requests import json from datetime import datetime # 设置请求URL和头信息 url = "https://api.wangdian.cn/openapi2/wdt.stockout.order.query.trade" headers = { "Content-Type": "application/json" } # 设置请求参数 params = { "start_time": datetime.strftime(LAST_SYNC_TIME, "%Y-%m-%d %H:%M:%S"), "end_time": datetime.strftime(CURRENT_TIME, "%Y-%m-%d %H:%M:%S"), "status": "95,105,110,113", "shop_no": "KH01181", "page_size": 40, "page_no": 0 } # 发起POST请求 response = requests.post(url, headers=headers, data=json.dumps(params)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与转换示例 cleaned_data = [] for item in data['orders']: cleaned_item = { 'order_id': item['order_no'], 'stockout_id': item['stockout_id'], 'status': item['status'], 'shop_no': item['shop_no'], 'warehouse_no': item['warehouse_no'] } cleaned_data.append(cleaned_item) # 打印或保存清洗后的数据 print(cleaned_data) else: print(f"Error: {response.status_code}, {response.text}") ``` #### 小结 通过以上步骤,我们成功地从旺店通·企业奇门接口获取了销售出库单数据,并进行了初步清洗和转换。这一步骤为后续的数据转换与写入奠定了基础。在实际应用中,可以根据具体业务需求进一步优化和扩展这些操作。 ![如何对接钉钉API接口](https://pic.qeasy.cloud/S18.png~tplv-syqr462i7n-qeasy.image) ### 数据转换与写入金蝶云星辰V2API接口的技术案例 在数据集成生命周期的第二步,我们将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星辰V2API接口所能够接收的格式,并最终写入目标平台。本文将详细探讨这一过程中涉及的技术细节和实现方法。 #### API接口配置 首先,我们需要了解金蝶云星辰V2API接口的配置。根据提供的元数据配置,我们需要向`/jdy/v2/scm/sal_out_bound`接口发送POST请求。该接口要求的数据字段包括单据来源、出库日期、单据编号、客户ID、备注以及商品分录等。 以下是元数据配置中的主要字段及其描述: 1. **单据来源**:固定传入`ISV`。 2. **出库日期**:格式为`YYYY-MM-DD`,从源数据中的`consign_time`字段获取。 3. **单据编号**:从源数据中的`stockout_no`字段获取。 4. **客户ID**:通过MongoDB查询获取,查询条件为商品实体ID(`details_list.src_oid`)。 5. **备注**:从源数据中的`cs_remark`字段获取。 6. **商品分录**:包含商品编码、仓库编码、数量、含税单价等多个子字段。 #### 数据转换过程 在实际操作中,数据转换包括以下几个步骤: 1. **提取源数据**: 从源平台提取销售出库单的数据,包括基本信息和商品明细。 2. **映射字段**: 根据元数据配置,将源数据映射到目标API所需的字段。例如: - `bill_source`: 固定值 `ISV` - `bill_date`: 映射自 `consign_time` - `bill_no`: 映射自 `stockout_no` - `customer_id`: 通过MongoDB查询获取 - `remark`: 映射自 `cs_remark` 3. **处理数组类型字段**: 对于商品分录(即数组类型字段),需要逐一处理每个子项,并进行相应的映射和查询。例如: - `material_number`: 映射自 `details_list.spec_no` - `stock_number`: 映射自 `warehouse_no` - `qty`: 映射自 `details_list.goods_count` - 其他字段通过MongoDB查询或条件判断获取 #### MongoDB查询示例 对于需要通过MongoDB查询获取的数据,可以使用如下示例代码: ```javascript const mongoQuery = async (collection, query, field) => { const result = await db.collection(collection).findOne(query); return result ? result[field] : null; }; // 获取客户ID const customerId = await mongoQuery( 'customer_collection', { 'content.material_entity_id': details_list.src_oid }, 'content.customer_id' ); // 获取含税单价 const taxPrice = await mongoQuery( 'material_collection', { 'content.material_entity_id': details_list.src_oid }, 'content.material_entity_tax_price' ); ``` #### 数据写入目标平台 完成数据转换后,将其封装为符合金蝶云星辰V2API接口要求的JSON格式,并发送POST请求: ```javascript const axios = require('axios'); const payload = { bill_source: "ISV", bill_date: consign_time, bill_no: stockout_no, customer_id: customerId, remark: cs_remark, material_entity: details_list.map(item => ({ material_number: item.spec_no, stock_number: warehouse_no, qty: item.goods_count, tax_price: await mongoQuery('material_collection', { 'content.material_entity_id': item.src_oid }, 'content.material_entity_tax_price'), // 其他子项同理处理 })) }; axios.post('/jdy/v2/scm/sal_out_bound', payload) .then(response => { console.log('Data successfully written to Kingdee Cloud:', response.data); }) .catch(error => { console.error('Error writing data to Kingdee Cloud:', error); }); ``` #### 关键技术点总结 1. **元数据配置解析**:根据提供的元数据配置文件,准确解析每个字段及其来源。 2. **动态查询与映射**:利用MongoDB动态查询功能,根据条件获取所需的数据并进行映射。 3. **数组处理与嵌套结构**:对数组类型的数据进行逐项处理,并确保嵌套结构符合目标API要求。 4. **错误处理与日志记录**:在发送请求时,做好错误处理和日志记录,以便排查问题。 通过以上步骤,我们可以实现将源平台的数据成功转换并写入到金蝶云星辰V2API接口中,从而完成整个ETL过程。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/T17.png~tplv-syqr462i7n-qeasy.image)