基于轻易云平台的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)