基于轻易云平台的ETL应用实例:金蝶云销售数据写入技巧
### 金蝶云星空数据集成到轻易云集成平台——案例分享:[联动]-金蝶销售出库单查询
随着企业数字化转型的不断深入,各部门系统间的数据交互需求日益增多。在这一背景下,如何实现稳定、公正且高效的数据对接成为了各大企业亟待解决的问题。在本文中,我们将详细探讨一个真实运行中的技术方案——通过轻易云集成平台,实现金蝶云星空销售出库单数据的实时、高效同步。该方案的具体名称为:[联动]-金蝶销售出库单查询。
首先,为了确保从金蝶云星空系统获取的数据准确无误,我们调用其提供的`executeBillQuery`接口来进行销售出库单数据的抓取。这一步骤不仅涉及到接口调用和分页处理,同时需要注意限流机制,以避免频繁请求导致API服务端过载。此外,为应对潜在的数据格式差异问题,我们通过定制化的数据映射功能,将二者之间不同结构的数据转换为相同格式并进行后续操作。
接下来,在数据写入阶段,通过轻易云集成平台提供的写入API,把从金蝶云星空获取到的大量销售信息快速、批量地导入至目标数据库。为了增强可靠性,该过程中还引入了异常处理与错误重试机制,一旦出现网络延迟或其他不可预见的问题,可自动重新尝试连接并恢复传输,从而保障整个流程的不间断性。
最后,整个过程将在透明可视化的平台上监控,每个环节、每条数据流都能实时查看和跟踪。不仅有效提升业务透明度,还使得问题定位与解决变得更加直观迅速。
在此案例开头部分我们重点讲述了应用于[联动]-金蝶销售出库单查询项目中的关键技术点,其核心内容包括:如何利用`executeBillQuery`接口高效获取源数据、大规模快速写入、以及针对分页与限流等技术挑战提出解决方案。在接下来的部分中,我们会更详细地描述具体实施步骤及代码示例,以便读者能够参考借鉴实际操作经验。
![泛微OA与ERP系统接口开发配置](https://pic.qeasy.cloud/D24.png~tplv-syqr462i7n-qeasy.image)
### 调用金蝶云星空接口executeBillQuery获取并加工数据
在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取销售出库单数据并进行加工处理。
#### 接口配置与调用
首先,我们需要配置元数据以便正确调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置的详细信息:
```json
{
"api": "executeBillQuery",
"effect": "QUERY",
"method": "POST",
"number": "FBillNo",
"id": "FEntity_FENTRYID",
"name": "FBillNo",
"idCheck": true,
"request": [
{"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","describe":"单据类型","value":"FBillTypeID.FNumber"},
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"FBillNo"},
{"field":"FDate","label":"日期","type":"string","describe":"日期","value":"FDate"},
{"field":"FSaleOrgId_FNumber","label":"销售组织","type":"string","describe":"销售组织","value":"FSaleOrgId.FNumber"},
{"field":"FCustomerID_FNumber","label":"客户编码","type":"string","describe":"客户编码","value":"FCustomerID.F.Number"},
{"field":"FCustomerID_FName","label":"客户名称","type":"string","describe":"客户名称","value":"FCustomerID.FName"},
{"field":"FStockOrgId_FNumber","label":"发货组织","type":"string","describe":"发货组织","value":"FStockOrgId.FNumber"},
{"field":"FMaterialID_FNumber","label":"物料编码","type":"string","describe":"物料编码","value":"FMaterialID.F.Number"},
{"field": "FMustQty", "label": "应发数量", "type": "string", "describe": "应发数量", "value": "FMustQty"},
{"field": "FRealQty", "label": "实发数量", "type": "string", "describe": "实发数量", "value": "FRealQty"},
{"field": "FPrice", "label": "单价", "type": "string", "describe": "单价", "value": "FPrice"},
{"field": “FTaxPrice”, “label”: “含税单价”, “type”: “string”, “describe”: “含税单价”, “value”: “FTaxPrice”},
{"field”: “FIsFree”, “label”: “是否赠品”, “type”: “string”, “describe”: “是否赠品”, “value”: “FIsFree”},
{"field”: “FLot”, “label”: “批号”, “type”: “string”, “describe”: “批号”, “value”:“FLot”},
{"field”:“FProduceDate”,“label”:“生产日期”,“type”:“string”,“describe”:”生产日期”,”value”:” FProduceDate”},
{“field”:” FExpiryDate”,” label”:”有效期至”,” type”:” string”,” describe”:”有效期至”,” value”:” FExpiryDate”},
{“ field ”:” FEntryTaxRate ”,” label ”:”税率%”,” type ”:” string ”,” describe ”:”税率%”,” value ”:” FEntryTaxRate ”},
{“ field ”:” FEntryTaxAmount ”,” label ”:”税额”," type ":" string "," describe ":"税额"," value ":" FEntryTaxAmount "},
{“ field ”:" FAmount "," label ":"金额"," type ":" string "," describe ":"金额"," value ":" FAmount "},
{“ field ”:“ FAllAmount”,“ label ”:“价税合计”,“ type ”:“ string”,“ describe ”:“价税合计”,“ value ”:“ FAllAmount "},
{“ field ”:“ FStockID_FNumber”,“ label ”:“仓库”,“ type ”:“ string”,“ describe :”“仓库”,“ value :”“ FStockID.F.Number "},
{“ field :”“ FEntrynote”,“ label :”“备注”,“ type :”“ string”,“ describe :”“备注”,“ value :”“ FEntrynote "},
{“ field :”“ FSrcType”,“ label :”“源单类型”,“ type :”“ string”,“ describe :”“源单类型”,“ value :”“ FSrcType "},
{“ field :”“ FSrcBillNo”,“ label :”“源单编号”,“ type :”“ string”,“ describe :”“源单编号”,“ value :”“ FSrcBillNo "},
{“ field :”“ FSoorDerno”,“ label :”“订单单号”,“ type :”“ string”,“ describe :”“订单单号”," value ":" FSoorDerno "},
{“ field :"" FDiscountRate "," label ":"折扣率% "," type ":" string "," describe ":"折扣率% "," value ":" FDiscountRate "},
{“ field :"" FDiscount "," label ":"折扣额 "," type ":" string "," describe ":"折扣额 "," value ":"" FDiscount "},
{“ field :"" FPriceDiscount "," label ":"单价折扣 "," type ":"" string "," describe ":"" single price discount ", "" value ": "" PriceDiscount ""} ,
{""字段"": ""材料名称"", ""标签"": ""材料名称"", ""类型"": ""字符串"", ""描述"": ""材料名称"", ""值"": ""材料名称""} ,
{""字段"": ""FID"", ""标签"": ""主键 ID"", ""类型"": ""字符串"", ""描述"": ""主键 ID"", ""值"": ""FID""} ,
{""字段"": ""实体 _ENTRYID "", 标签:"明细 id",类型:"字符串",描述:"明细 id",值:"实体_ENTRYID"} ,
{"字段":"_TLWD_文本",标签:"平台订单号",类型:"字符串",值:"_TLWD_文本"}
],
其他请求:[{
字段:限制,标签:最大行数,类型:字符串,描述:金蝶的查询分页参数,值:"{PAGINATION_PAGE_SIZE}" },
字段: StartRow, 标签: 开始行索引, 类型: 字符串, 描述: 金蝶的查询分页参数, 值: "{PAGINATION_START_ROW}" },
字段: TopRowCount, 标签: 返回总行数, 类型: 字符串, 描述: 金蝶的查询分页参数 },
字段: FilterString, 标签: 过滤条件, 类型: 字符串, 描述: 示例写法 FSupplierId.F.Number = 'VEN00010' and ApproveDate>=," 值:" ApproveDate>='{{LAST_SYNC_TIME|datetime}}'" },
字段: FieldKeys, 标签: 需查询的字段 key 集合, 类型: 字符串, 描述: 金蝶分录主键 ID 格式:FPOOrderEntry_FEntryId ,其它格式 PurchaseOrgId.Number },
字段:FormId,标签:业务对象表单 Id,类型:字符串,描述:必须填写金蝶的表单 ID 如:PUR_PurchaseOrder,值:SAL_OUTSTOCK }
],
autoFillResponse:true
}
```
#### 请求参数解析
在上述配置中,我们定义了多个请求参数,这些参数用于指定我们希望从金蝶云星空获取的数据字段。以下是几个关键字段及其作用:
- `FBillTypeID_FNumber`: 单据类型编号,用于标识不同类型的销售出库单。
- `FBillNo`: 单据编号,是每个销售出库单的唯一标识。
- `FDate`: 日期,用于筛选特定时间范围内的销售出库单。
- `FSaleOrgId_FNumber`: 销售组织编号,用于区分不同销售部门的数据。
- `FCustomerID_FNumber` 和 `FCustomerID_FName`: 客户编码和客户名称,用于标识和显示客户信息。
- `FMaterialID_FNumber`: 物料编码,用于标识销售出库中的具体物料。
- `FMustQty` 和 `FRealQty`: 应发数量和实发数量,用于记录计划与实际发货量。
此外,还有一些辅助参数如`Limit`、`StartRow`、`FilterString`等,用于控制查询结果的分页和过滤条件。
#### 数据请求与清洗
在完成元数据配置后,我们可以通过轻易云平台发送POST请求来调用金蝶云星空接口。示例请求如下:
```json
{
"_apiName_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc",
"_method_": {
"_post_":{
"_url_":"",
"_data_":{
"_formid_":"",
"_data_":{
"_FieldKeys_":"",
"_FilterString_":"",
"_TopRowCount_":"",
"_Limit_":"",
"_StartRow_" :""
}
}
}
}
}
```
在接收到响应后,我们需要对数据进行清洗和转换,以确保其符合目标系统或业务需求。例如,可以对日期格式进行标准化处理,对数值字段进行单位转换等。
#### 数据转换与写入
清洗后的数据可以进一步转换为目标系统所需的数据格式,并通过轻易云平台写入到目标数据库或应用系统中。这一步通常包括将JSON格式的数据映射到关系数据库表结构中,并执行插入或更新操作。
通过上述步骤,我们实现了从金蝶云星空获取销售出库单数据并进行加工处理,为后续的数据分析和业务决策提供了可靠的数据支持。
![如何开发用友BIP接口](https://pic.qeasy.cloud/S16.png~tplv-syqr462i7n-qeasy.image)
### 使用轻易云数据集成平台进行ETL转换与写入的技术案例
在数据集成生命周期的第二步,我们重点关注将已经集成的源平台数据进行ETL转换,转为目标平台所能够接收的格式,并最终写入目标平台。本文将通过一个具体的技术案例来详细说明这一过程。
#### 数据请求与清洗
首先,我们需要从源平台获取销售出库单的数据。假设我们已经完成了这一阶段,获取到了原始数据。接下来,我们将重点放在如何将这些数据进行转换,以符合轻易云集成平台API接口所需的格式。
#### 数据转换与写入
在这个阶段,我们需要使用ETL(Extract, Transform, Load)工具对数据进行处理和转换。以下是一个具体的技术案例,展示如何配置和使用元数据,将数据转换并写入目标平台。
##### 元数据配置
根据提供的元数据配置,我们可以看到以下关键信息:
```json
{
"api": "写入空操作",
"effect": "EXECUTE",
"method": "POST",
"number": "number",
"id": "id",
"name": "编码",
"idCheck": true
}
```
这些信息指示我们需要通过POST方法调用“写入空操作”API,将处理后的数据发送到目标平台。以下是具体步骤:
1. **提取(Extract)**:从源平台提取销售出库单的数据。
2. **转换(Transform)**:根据目标API接口要求,对提取的数据进行格式化和转换。
3. **加载(Load)**:通过API接口将转换后的数据写入目标平台。
##### 实际操作步骤
1. **提取销售出库单数据**
假设我们从源系统中提取到了以下JSON格式的数据:
```json
[
{
"number": "SO12345",
"id": 1001,
"name": "产品A"
},
{
"number": "SO12346",
"id": 1002,
"name": "产品B"
}
]
```
2. **数据清洗与验证**
在清洗过程中,我们需要确保每条记录都包含必要的字段,如`number`、`id`和`name`。如果某些记录缺少这些字段,则需要进行补全或剔除。同时,根据元数据配置中的`idCheck: true`,我们需要确保每个ID都是唯一且有效的。
3. **数据转换**
根据元数据配置,我们需要将上述JSON格式的数据转换为符合目标API接口要求的格式。假设目标API接口要求如下:
```json
{
"operationType": "EXECUTE",
"data": [
{
"number": "SO12345",
"id": 1001,
"codeName": "产品A"
},
{
"number": "SO12346",
"id": 1002,
"codeName": "产品B"
}
]
}
```
在这个过程中,我们将原始字段`name`重命名为`codeName`,并添加一个新的字段`operationType`,其值为"EXECUTE"。
4. **加载到目标平台**
最后一步,通过POST方法调用“写入空操作”API,将处理后的数据发送到目标平台。以下是Python代码示例:
```python
import requests
import json
url = 'https://api.qingyiyun.com/write'
headers = {'Content-Type': 'application/json'}
data = {
'operationType': 'EXECUTE',
'data': [
{'number': 'SO12345', 'id': 1001, 'codeName': '产品A'},
{'number': 'SO12346', 'id': 1002, 'codeName': '产品B'}
]
}
response = requests.post(url, headers=headers, data=json.dumps(data))
if response.status_code == 200:
print('Data successfully written to the target platform.')
else:
print('Failed to write data:', response.text)
```
通过上述步骤,我们成功地将源平台的数据进行了ETL处理,并通过轻易云集成平台API接口将其写入到目标平台。这一过程不仅保证了数据的一致性和完整性,还提升了整体业务流程的效率和透明度。
![打通金蝶云星空数据接口](https://pic.qeasy.cloud/T21.png~tplv-syqr462i7n-qeasy.image)