ETL转换至旺店通·旗舰版API接口的技术细节及实现

  • 轻易云集成顾问-胡秀丛
### 金蝶云星空采购入库单数据高效集成到旺店通·旗舰版 在本篇技术案例中,我们将分享一个具体的系统对接集成解决方案,旨在通过轻易云数据集成平台,将金蝶云星空中的采购入库单数据无缝快速地传输到旺店通·旗舰版的委外仓入库业务模块。以下是本次案例流程及重要技术点解析。 首先,我们需要调用金蝶云星空的`executeBillQuery`接口抓取采购入库单的数据。为了确保数据获取过程中的准确性与完整性,我们实现了定时调度和分页处理功能,以有效应对接口限流问题,并减少漏单风险。此外,为了保证实时监控和日志记录,可针对每一次API调用进行详细日志记录,方便后续追溯与排查。 接着,为了解决大批量数据写入的问题,通过分片处理机制,将从金蝶云星空获取的大量采购入库单数据,分批次可靠、快速地写入到旺店通·旗舰版的`wms.stockother.In.push`接口。在此过程中,需要特别注意两端系统之间的数据格式差异,通过定制化的数据映射策略,实现格式统一与兼容,从而顺利完成从源头至目标端的数据转换。 最后,在整个对接过程中特别关注异常处理与错误重试机制,实现当任意步骤出现异常时自动报警并尝试重发。同时,通过实时监控界面可以清晰看到所有操作环节,确保每一笔业务都能得到及时、准确且高效的处理反馈。这种全透明可视化管理进一步提升了整体业务运作效率以及数据安全可靠性。 通过上述方法,本案例成功实现了金蝶云星空采购入库单向旺店通·旗舰版委外仓入(入库业务)的无缝连接,高速、高效且低误差率地完成各节点操作,大幅提升企业日常运营效率。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/D37.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成过程中,调用源系统接口是关键的第一步。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空接口`executeBillQuery`,以获取并加工采购入库单的数据。 #### 接口配置与请求参数 首先,我们需要配置接口的元数据。以下是元数据配置的详细内容: ```json { "api": "executeBillQuery", "effect": "QUERY", "method": "POST", "number": "FBillNo", "id": "FInStockEntry_FEntryId", "name": "FBillNo", "idCheck": true, "request": [ {"field":"FInStockEntry_FEntryId","label":"id","type":"string","describe":"id","value":"FInStockEntry_FEntryId"}, {"field":"FID","label":"实体主键","type":"string","describe":"实体主键","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","describe":"单据状态\n暂存:Z\n创建:A\n审核中:B\n已审核:C","value":"FDocumentStatus"}, {"field":"FStockOrgId_FNumber","label":"收料组织","type":"string","describe":"收料组织","value":"FStockOrgId.FNumber"}, {"field":"FDate","label":"入库日期","type":"string","describe":"入库日期","value":"FDate"}, {"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","describe":"标准采购入库:RKD01 SYS\n采购入库单:RKD02 SYS\n委外入库单:RKD03 SYS\n分销购销入库单:RKD04 SYS\n资产入库单:RKD05 SYS\n费用入库单:RKD06 SYS\nVMI入库单:RKD07 SYS\n现购入库单:RKD08 SYS\n直运入库单:RKD09 SYS","value":"FBillTypeID.FNumber"}, {"field":"FOwnerTypeIdHead","label":"货主类型","type":"string","describe":"货主类型\n业务组织:BD_OwnerOrg\n供应商:BD_Customer\n客户:BD_Customer","value":"FOwnerTypeIdHead"}, {"field":"FOwnerIdHead_FNumber","label":"货主","type":"","describe":"","value":""}, // ...(省略部分字段) ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "", value: "{PAGINATION_START_ROW}"}, {"field": "TopRowCount", label: "", type: "", describe: ""}, {"field": "", label: "", type: "", describe: ""}, // ...(省略部分字段) ], // ... } ``` #### 请求示例 为了获取采购入库单的数据,我们需要构建一个POST请求。以下是一个示例请求体: ```json { "FormId": "STK_InStock", "FieldKeys": [ // 列出需要查询的字段 FInStockEntry_FEntryId, FID, FBillNo, FDocumentStatus, FStockOrgId.FNumber, FDate, FBillTypeID.FNumber, FOwnerTypeIdHead, FOwnerIdHead.FNumber // ...(其他字段) ], // 设置过滤条件和分页参数 FilterString: `FPurchaseOrgId.FNumber='101' and FStockId.F_TBIK_Assistant_qtr = '委外仓' and FDate>='2024-08-05'`, Limit: '100', StartRow: '0' } ``` #### 数据清洗与转换 在获取到原始数据后,需要对其进行清洗和转换,以便后续处理。以下是一些常见的数据清洗和转换操作: 1. **字段映射**: 将金蝶云返回的数据字段映射到目标系统所需的字段。例如,将`FBillNo`映射为目标系统中的`OrderNumber`。 2. **数据格式转换**: 将日期格式从金蝶云的格式转换为目标系统所需的格式。例如,将`2024-08-05T00:00:00Z`转换为`2024/08/05`。 3. **数据过滤**: 根据业务需求过滤掉不需要的数据。例如,只保留状态为“已审核”的记录。 4. **计算新字段**: 根据现有字段计算新的字段。例如,根据`实收数量`和`含税单价`计算总金额。 #### 示例代码 以下是一个简单的Python示例代码,用于调用接口并处理返回的数据: ```python import requests import json # 定义请求URL和头部信息 url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} # 构建请求体 payload = { 'FormId': 'STK_InStock', 'FieldKeys': ['FInStockEntry_FEntryId', 'FID', 'FBillNo', 'FDocumentStatus', 'FStockOrgId.FNumber', 'FDate', 'FBillTypeID.FNumber', 'FOwnerTypeIdHead', 'FOwnerIdHead.FNumber'], 'FilterString': `FPurchaseOrgId.FNumber='101' and FStockId.F_TBIK_Assistant_qtr = '委外仓' and FDate>='2024-08-05'`, 'Limit': '100', 'StartRow': '0' } # 发起POST请求 response = requests.post(url, headers=headers, data=json.dumps(payload)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与转换 for record in data: record['OrderNumber'] = record.pop('FBillNo') record['OrderDate'] = record['FDate'].split('T')[0].replace('-', '/') # ...(其他清洗与转换操作) else: print(f"Error: {response.status_code}") ``` 通过上述步骤,我们成功地调用了金蝶云星空接口,获取并加工了采购入库单的数据。这只是轻易云数据集成平台生命周期中的第一步,后续还需进行数据写入等操作。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S28.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台ETL转换至旺店通·旗舰版API接口 在数据集成生命周期的第二步,我们重点关注如何将已经集成的源平台数据进行ETL转换,并转为目标平台——旺店通·旗舰版API接口所能够接收的格式,最终写入目标平台。本文将详细探讨这一过程中的技术细节和实现方法。 #### API接口配置 首先,我们需要了解目标平台——旺店通·旗舰版的API接口配置。根据元数据配置,API接口为`wms.stockother.In.push`,请求方法为`POST`,具体的请求字段如下: ```json { "api": "wms.stockother.In.push", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "order", "label": "单据头", "type": "object", "children": [ {"field": "outer_no", "label": "外部单号", "type": "string", "value": "{FBillNo}"}, {"field": "warehouse_no", "label": "仓库编号", "type": "string", "value": "{FStockId_FNumber}"}, {"field": "reason", "label": "入库原因", "type": "string", "value":"采购入库"}, {"field": "is_check", "label":"是否审核","type":"string","value":"true"}, {"field":"remark","label":"备注","type":"string","value":"{FSupplierId_FName} {F_TBIK_BZ}"} ] }, { "field":"order_details", "label":"单据明细", "type":"array", "value":"list", ... } ], ... } ``` #### 数据转换与映射 在进行ETL转换时,需要将源平台的数据字段映射到目标平台所需的字段。以下是主要的映射关系: - `FBillNo` 映射到 `outer_no` - `FStockId_FNumber` 映射到 `warehouse_no` - `FSupplierId_FName` 和 `F_TBIK_BZ` 拼接后映射到 `remark` - `FMaterialId_FNumber` 映射到 `spec_no` - `FRealQty` 映射到 `num` - `FMaterialId_FRefCost` 映射到 `price` - `F_TBIK_PH` 映射到 `remark` 和 `batch_no` #### 数据清洗与聚合 在数据清洗阶段,需要对原始数据进行必要的处理和聚合。例如,将多个订单明细按特定规则进行汇总计算。根据元数据配置中的groupCalculate部分,我们需要对订单明细中的数量字段(`FRealQty`)进行求和操作。 ```json "groupCalculate":{ ... ,"calculate":{"FRealQty":"$sum"} } ``` 这意味着我们需要将相同订单下的所有商品数量进行求和,以便生成符合要求的数据结构。 #### 构建请求模型 根据元数据配置,我们可以构建一个完整的请求模型。以下是一个示例模型: ```json { "order":{ ... ,"outer_no":"123456" ,"warehouse_no":"WH001" ,"reason":"采购入库" ,"is_check":"true" ,"remark":"供应商A 备注信息" }, ... } ``` #### 数据写入目标平台 完成上述步骤后,即可通过HTTP POST请求将构建好的JSON对象发送至旺店通·旗舰版API接口,实现数据写入操作。 ```python import requests import json url = 'https://api.wangdian.cn/openapi2/wms.stockother.In.push' headers = {'Content-Type': 'application/json'} data = { ... } response = requests.post(url, headers=headers, data=json.dumps(data)) if response.status_code == 200: print("Data successfully pushed to Wangdian.") else: print("Failed to push data. Status code:", response.status_code) ``` 通过以上步骤,我们成功地将源平台的数据进行了ETL转换,并按照旺店通·旗舰版API接口要求完成了数据写入。这一过程不仅确保了数据的一致性和准确性,还极大提升了业务处理效率。 ![数据集成平台API接口配置](https://pic.qeasy.cloud/T24.png~tplv-syqr462i7n-qeasy.image)