基于轻易云数据集成平台的ETL实践:写入金蝶云星空
### 旺店通·旗舰奇门销售退货单集成到金蝶云星空的实践案例
在本次技术分享中,我们将探讨如何基于06-ToB销售退货单集成方案,利用轻易云数据集成平台成功实现旺店通·旗舰奇门的数据无缝对接至金蝶云星空。
**步骤一:从旺店通·旗舰奇门获取销售退货单数据**
首先,通过调用 `wdt.wms.stockin.refund.querywithdetail` API 接口,从旺店通·旗舰奇门系统中批量抓取销售退货单的详细数据。为确保高效、可靠地获取这些信息,该接口支持分页请求和限流控制。从而能处理大规模返回数据,并避免因请求频率过高导致的接口异常。
**步骤二:清洗与转换数据**
考虑到供销两端系统的数据格式不一致性,接下来需要进行必要的数据清洗和转换。这一步骤可以通过平台提供的自定义数据转换逻辑功能来完成。例如,将旺店通中的字段名与金蝶云星空所要求的字段名进行映射,同时对某些特定业务逻辑做出相应调整,以适配目标系统需求。
**步骤三:写入金蝶云星空**
经过处理后的销售退货单记录准备完毕后,即可使用金蝶云星空提供的 `batchSave` API 进行批量写入。为了确保大量数据快速准确地导入目标系统,我们充分利用了该平台优化过的数据写入能力。此外,通过实时监控工具,可以追踪任务状态及性能表现,及时发现并解决可能出现的问题。
**结论**
此次实际运行过程中,实现了从API调取,到数据清洗转化,再到最终批量保存的一系列操作。不仅保障了重试机制,在面对突发异常时也能够稳妥处理,还具备良好的透明度与实时跟踪性。因此,本篇文章将进一步详述各关键环节以及具体配置细节,为大家提供完整、实用、高效的数据集成解决方案模板。
![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/D2.png~tplv-syqr462i7n-qeasy.image)
### 调用旺店通·旗舰奇门接口wdt.wms.stockin.refund.querywithdetail获取并加工数据
在数据集成生命周期的第一步,我们需要从源系统获取数据并进行初步处理。本文将详细介绍如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口`wdt.wms.stockin.refund.querywithdetail`,并对获取的数据进行加工。
#### 接口调用配置
首先,我们需要配置接口调用的元数据。以下是元数据配置的详细信息:
```json
{
"api": "wdt.wms.stockin.refund.querywithdetail",
"method": "POST",
"number": "order_no",
"id": "order_no",
"idCheck": true,
"request": [
{
"field": "pager",
"label": "分页参数",
"type": "object",
"children": [
{
"field": "page_size",
"label": "分页大小",
"type": "string",
"value": "50",
"parent": "pager"
},
{
"field": "page_no",
"label": "页号",
"type": "string",
"value": "1",
"parent": "pager"
}
]
},
{
"field": "params",
"label": "业务参数",
"type": "object",
...
}
],
...
}
```
#### 请求参数解析
在请求参数中,我们主要关注两个部分:分页参数和业务参数。
1. **分页参数**:
- `page_size`: 每页返回的数据条数,默认设置为50。
- `page_no`: 当前页码,默认设置为1。
2. **业务参数**:
- `start_time` 和 `end_time`: 分别表示查询的开始时间和结束时间,使用动态变量`{{LAST_SYNC_TIME|datetime}}`和`{{CURRENT_TIME|datetime}}`来自动填充。
- `status`: 入库单状态,这里我们设置为80,即已完成状态。
- `time_type`: 时间条件类型,默认为0(修改时间)。
- `warehouse_no`, `shop_nos`, `stockin_no`: 分别表示仓库编码、店铺编号(多个店铺编号使用英文逗号分隔)和入库单号。
#### 数据请求与清洗
在调用接口获取数据后,我们需要对数据进行清洗,以确保其符合后续处理的要求。以下是一个简单的数据清洗流程:
1. **过滤无效数据**:根据业务需求过滤掉不符合条件的数据。例如,只保留状态为80(已完成)的入库单。
2. **字段映射与转换**:将原始数据中的字段映射到目标系统所需的字段,并进行必要的格式转换。例如,将时间字段转换为标准的ISO格式。
3. **去重与合并**:如果存在重复记录,需要进行去重操作。同时,对于同一订单的多条记录,可以进行合并处理。
#### 示例代码
以下是一个示例代码片段,用于调用接口并处理返回的数据:
```python
import requests
import json
from datetime import datetime
# 定义请求URL和头部信息
url = 'https://api.wangdian.cn/openapi2/wdt.wms.stockin.refund.querywithdetail'
headers = {'Content-Type': 'application/json'}
# 构建请求体
payload = {
'pager': {
'page_size': '50',
'page_no': '1'
},
'params': {
'start_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'end_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'),
'status': '80',
'time_type': '0'
}
}
# 发起POST请求
response = requests.post(url, headers=headers, data=json.dumps(payload))
# 检查响应状态码
if response.status_code == 200:
data = response.json()
# 数据清洗与处理
cleaned_data = []
for record in data['data']:
if record['status'] == '80':
cleaned_record = {
'order_no': record['order_no'],
'warehouse_no': record['warehouse_no'],
...
}
cleaned_data.append(cleaned_record)
# 输出清洗后的数据
print(json.dumps(cleaned_data, indent=4))
else:
print(f"Error: {response.status_code}")
```
#### 小结
通过上述步骤,我们成功地调用了旺店通·旗舰奇门接口`wdt.wms.stockin.refund.querywithdetail`,并对获取的数据进行了初步清洗和加工。这一步骤为后续的数据转换与写入奠定了基础。在实际应用中,可以根据具体业务需求进一步优化和扩展数据处理逻辑。
![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/S16.png~tplv-syqr462i7n-qeasy.image)
### 使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口
在数据集成的生命周期中,ETL(提取、转换、加载)过程是至关重要的一环。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并转为金蝶云星空API接口所能够接收的格式,最终写入目标平台。
#### 元数据配置解析
元数据配置是ETL过程中的核心部分,它定义了如何将源数据映射到目标系统的数据结构中。以下是关键字段和配置的详细解析:
1. **API接口和请求方法**
```json
{"api":"batchSave","method":"POST"}
```
这里指定了目标API接口为`batchSave`,请求方法为`POST`。
2. **单据类型**
```json
{"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSTHD01_SYS"}
```
单据类型字段`FBillTypeID`使用了`ConvertObjectParser`解析器,将值转化为金蝶云星空系统可识别的格式。
3. **单据编号**
```json
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"}
```
单据编号直接从源数据中获取,并映射到目标字段`FBillNo`。
4. **销售组织**
```json
{"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"销售组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find zip from ec445d8c-9d91-3845-9175-79fb0588e1b3 where shop_no={shop_no}"}
```
销售组织字段使用了复杂的查询语句,从另一个集合中查找对应的值,并通过解析器进行转换。
5. **日期**
```json
{"field":"FDate","label":"日期","type":"date","describe":"日期","value":"{modified}"}
```
日期字段直接从源数据中的修改时间字段获取,并映射到目标字段`FDate`。
6. **库存组织**
```json
{"field":"FStockOrgId","label":"库存组织","type":"string","describe":"库存组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_findCollection find FRetorgId from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no}"}
```
库存组织字段同样使用复杂查询语句,通过解析器转换后映射到目标字段。
#### 明细信息处理
明细信息部分包含多个子字段,每个子字段都需要进行相应的处理和映射:
1. **物料编码**
```json
{"field":"FMaterialId","label":"物料编码","type":"string","describe":"物料编码","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{details_list.spec_no}}"}
```
物料编码从明细列表中的规格编号字段获取,并通过解析器转换后映射到目标字段。
2. **实退数量**
```json
{"field":"FRealQty","label":"实退数量","type": "int", "describe": "实退数量", "value": "{{details_list.num}}"}
```
实退数量直接从明细列表中的数量字段获取,并映射到目标字段。
3. **含税单价**
```json
{"field": "FTaxPrice", "label": "含税单价", "type": "float", "describe": "含税单价", "value": "_findCollection find FTAXPRICE from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no} FMaterialID={{details_list.spec_no}}"}
```
含税单价通过复杂查询语句从另一个集合中查找对应值,并映射到目标字段。
4. **是否赠品**
```json
{"field": "FIsFree", "label": "是否赠品", "type": "bool", "describe": "是否赠品", "value": "_findCollection find FISFREE from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no} FMaterialID={{details_list.spec_no}}"}
```
是否赠品通过查询语句查找对应值,并映射到目标字段。
#### 财务信息处理
财务信息部分包含多个子字段,每个子字段也需要进行相应的处理和映射:
1. **结算组织**
```json
{"field": "FSettleOrgId", "label": "结算组织", "type": "string", "describe": "结算组织", "parser":{"name": "ConvertObjectParser", "params": "FNumber"},
"value": "_findCollection find FSALEORGID from 3164206c-5f8d-3e8b-be49-752e25070e6f where F_KD_WDTRundNo={refund_no}"}
```
结算组织通过复杂查询语句查找对应值,并通过解析器转换后映射到目标字段。
2. **整单折扣额、是否含税、价外税**
```json
{"field": "FAllDisCount",
"label":
"整单折扣额",
"type":
"float",
"describe":
"整单折扣额"},
{"field":
"FIsIncludedTax",
"label":
"是否含税",
"type":
"bool",
"value":
"true"},
{"field":
"FIsPriceExcludeTax",
"label":
"价外税",
"type":
"bool",
"value":
"true"}
```
这些财务信息直接从源数据或默认值中获取,并映射到相应的目标字段。
#### 操作配置
最后,我们需要配置一些操作相关的信息,以确保数据能够正确提交并审核:
1. **业务对象表单Id**
```json
{"field":
FormId,
label:
业务对象表单Id,
type:
string,
describe:
业务对象表单Id,
value:
SAL_RETURNSTOCK}
```
2. **执行操作**
```json
{"field":
Operation,
label:
执行操作,
type:
string,
describe:
执行操作,
value:
BatchSave}
```
3. **提交并审核、验证基础资料、负库存**
```json
{"field":
IsAutoSubmitAndAudit,
label:
提交并审核,
type:
bool,
describe:
提交并审核,
value:
true},
{"field":
IsVerifyBaseDataField,
label:
验证基础资料,
type:
bool,
describe:
是否验证所有基础资料有效性,布尔类,默认false(非必录),
value:
false},
{"field":
InterationFlags,
label:
负库存,
type:
string,
value:
STK_InvCheckResult}
```
这些操作配置确保了在完成ETL转换后,数据能够自动提交并审核,同时设置了一些必要的校验和标志位以保证数据完整性和一致性。
通过以上步骤,我们成功地将源平台的数据进行了ETL转换,使其符合金蝶云星空API接口所能接收的格式,最终实现了无缝的数据写入。
![数据集成平台API接口配置](https://pic.qeasy.cloud/T11.png~tplv-syqr462i7n-qeasy.image)