解析旺店通与金蝶云星辰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)