ETL转换:将金蝶数据同步到旺店通的详细案例

  • 轻易云集成顾问-冯潇
### 从金蝶云星空到旺店通·企业奇门:高效数据集成实践 在处理企业管理系统的集成任务时,如何确保数据流动的准确和高效是一个关键挑战。本案例将详细分享我们如何通过轻易云平台,将金蝶云星空的数据无缝对接到旺店通·企业奇门,实现“金蝶其他入库单 => 旺店通委外入库单(云仓)”的需求。 #### 确保集成过程中的不漏单问题 首先,我们使用了金蝶云星空提供的`executeBillQuery`接口来定时可靠地抓取数据。为了防止漏单现象,我们设置了严格的分页及限流机制,通过实时监控和日志记录功能,确保每次调用都能完整获取所需的数据。如果在调取过程中发生异常,则会触发自动重试机制,并生成相应的错误日志,以便后续排查和修正。 #### 批量快速写入与数据格式转换 获取到的原始数据需要批量写入到旺店通·企业奇门,这里我们采用其提供的API `wdt.vip.wms.stockinout.order.push`。由于两套系统之间的数据结构存在差异,因此必进行必要的数据转化。这一环节通过自定义映射规则实现,不仅保证了字段的一一对应,还解决了可能出现的数据类型兼容性问题。 #### 高并发环境下的大规模数据传输 为了解决大规模、高并发场景下的数据传输瓶颈,我们引入了分片技术,对大容量数据进行切块处理,以提高网络传输效率。同时,在轻易云平台强大的弹性扩展能力支持下,可以动态调整资源配置,从而应对突增的数据同步需求。 以上是本次系统对接项目中几个关键环节,而具体实施方案将在后续章节中详述,包括各个API调用细节、异常处理策略及性能优化技巧等。 ![钉钉与WMS系统接口开发配置](https://pic.qeasy.cloud/D7.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在轻易云数据集成平台中,调用源系统接口是数据集成生命周期的第一步。本文将详细介绍如何通过调用金蝶云星空的`executeBillQuery`接口来获取并加工数据。 #### 接口配置与请求参数 首先,我们需要配置接口和请求参数。根据提供的元数据配置,我们可以看到以下关键参数: - **API**: `executeBillQuery` - **Method**: `POST` - **Pagination**: 每页500条记录 - **条件过滤**: 单据类型为`ZYD-037`, `ZYD-113`, `ZYD-102` 请求参数包括以下字段: ```json [ {"field":"FEntity_FEntryID","label":"FEntryID","type":"string","value":"FEntity_FEntryID"}, {"field":"FID","label":"实体主键","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"}, {"field":"FStockOrgId_FNumber","label":"库存组织","type":"string","value":"FStockOrgId.FNumber"}, {"field":"FDate","label":"日期","type":"string","value":"FDate"}, {"field":"FBillTypeID","label":"单据类型","type":"string","value":"FBillTypeID.FNumber"}, {"field":"FSUPPLIERID_FNumber","label":"供应商","type":"string","value":"FSUPPLIERID.FNumber"}, {"field":"FNOTE","label":"备注","type":"string","value":"FNOTE"}, {"field":"FMATERIALID_FNumber","label":"物料编码","type":"string","value":"FMATERIALID.FNumber"}, {"field": "其他字段" } ] ``` #### 构建请求体 为了调用`executeBillQuery`接口,我们需要构建一个包含所有必要参数的请求体。以下是一个示例请求体: ```json { "FormId": "STK_MISCELLANEOUS", "FieldKeys": "FID,FBillNo,FDocumentStatus,FStockOrgId.FNumber,FDate,FBillTypeID.FNumber,FSUPPLIERID.FNumber,FNOTE,FMATERIALID.FNumber", "FilterString": "FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and FStockOrgId.FNumber = '7000' and (FBillTypeID.FNumber='ZYD-037' or FBillTypeID.FNumber='ZYD-102') and FSTOCKID.FNumber='1082'", "Limit": "{PAGINATION_PAGE_SIZE}", "StartRow": "{PAGINATION_START_ROW}", } ``` #### 数据清洗与转换 在获取到原始数据后,需要对数据进行清洗和转换,以便后续处理。以下是一些常见的数据清洗与转换操作: 1. **字段映射**:将金蝶云返回的数据字段映射到目标系统所需的字段。例如,将`FBillNo`映射为目标系统中的`OrderNo`。 2. **数据格式转换**:将日期格式从金蝶云的格式转换为目标系统所需的格式。 3. **数据过滤**:根据业务需求过滤掉不需要的数据。例如,只保留单据状态为“已审核”的记录。 #### 示例代码 以下是一个示例代码片段,展示了如何调用金蝶云星空的`executeBillQuery`接口并处理返回的数据: ```python import requests import json # 配置API URL和Headers api_url = "https://api.kingdee.com/executeBillQuery" headers = { "Content-Type": "application/json", "Authorization": "Bearer YOUR_ACCESS_TOKEN" } # 构建请求体 payload = { "FormId": "STK_MISCELLANEOUS", "FieldKeys": ",".join(["FID", "FBillNo", "FDocumentStatus", "FStockOrgId.FNumber", "FDate", "FBillTypeID.FNumber", "FSUPPLIERID.FNumber", "FNOTE", "FMATERIALID.FNumber"]), "FilterString": ("FApproveDate>='2023-01-01' and FStockOrgId.FNumber = '7000' " "and (FBillTypeID.FNumber='ZYD-037' or FBillTypeID.FNumber='ZYD-102') " "and FSTOCKID.FNumber='1082'"), "Limit": 500, "StartRow": 0, } # 发起POST请求 response = requests.post(api_url, headers=headers, data=json.dumps(payload)) # 检查响应状态码 if response.status_code == 200: data = response.json() # 数据清洗与转换 cleaned_data = [] for record in data: cleaned_record = { 'OrderNo': record['FBillNo'], 'Status': record['FDocumentStatus'], 'Organization': record['FStockOrgId_FNumber'], 'Date': record['FDate'], 'Supplier': record['FSUPPLIERID_FNumber'], 'Note': record['FNOTE'], 'MaterialCode': record['FMATERIALID_FNumber'] } cleaned_data.append(cleaned_record) # 后续处理... else: print(f"Error: {response.status_code} - {response.text}") ``` 通过上述步骤,我们成功地调用了金蝶云星空的`executeBillQuery`接口,并对返回的数据进行了清洗和转换,为后续的数据写入和处理打下了基础。 ![如何对接企业微信API接口](https://pic.qeasy.cloud/S13.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现金蝶其他入库单到旺店通委外入库单的ETL转换 在数据集成过程中,将源平台的数据转换为目标平台所需格式是至关重要的一步。本文将深入探讨如何使用轻易云数据集成平台将金蝶其他入库单的数据转换为旺店通·企业奇门API接口所能接收的格式,并最终写入目标平台。 #### API接口与元数据配置 在这个案例中,我们需要使用`wdt.vip.wms.stockinout.order.push` API接口来实现数据的写入。该接口要求我们提供一系列参数,包括接口外部单号、仓库编号、出入类型、自动审核标志、备注以及货品明细等。 以下是该API接口的元数据配置: ```json { "api": "wdt.vip.wms.stockinout.order.push", "effect": "EXECUTE", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo,FDate,FSTOCKID", "bodyName": "details_listss", "bodySum": ["F_UHZG_JJQty"], "header": ["FBillNo", "FSTOCKID", "FBillTypeID", "FNOTE"], "body": ["FMATERIALID_FNumber", "F_UHZG_JJQty", "FPrice", "FLOT", "FEntryNote"] }, "request": [ { "field": "api_outer_no", "label": "接口外部单号", "type": "string", "describe": "调用本接口时推送的唯一单据编号,避免重复推送数据", "value": "{FBillNo}" }, { "field": "warehouse_no", "label": "仓库编号", ... ``` #### 数据请求与清洗 首先,我们从金蝶系统请求原始数据。假设我们已经获取了包含多个字段(如`FBillNo`, `FDate`, `FSTOCKID`, `FMATERIALID_FNumber`, `F_UHZG_JJQty`, `FPrice`, `FLOT`, `FEntryNote`等)的JSON对象。 #### 数据转换与写入 接下来,我们需要根据元数据配置对这些原始数据进行ETL转换。具体步骤如下: 1. **合并操作**:根据`operation`部分的配置,我们需要将多个字段合并为一个对象。例如,将`FBillNo`, `FDate`, `FSTOCKID`合并为一个主键字段。 2. **构建请求体**:根据`request`部分的配置,构建API请求体。以下是一些关键字段的映射: - `api_outer_no`: 映射到金蝶系统中的`FBillNo` - `warehouse_no`: 映射到金蝶系统中的`FSTOCKID` - `order_type`: 固定值为"2",表示入库 - `auto_check`: 固定值为"1",表示自动审核 - `remark`: 根据不同的`FBillTypeID`生成不同的备注信息 3. **货品明细处理**:根据元数据中的定义,将货品明细列表映射到相应的字段: - `spec_no`: 映射到金蝶系统中的`FMATERIALID_FNumber` - `num`: 映射到金蝶系统中的`F_UHZG_JJQty` - `price`: 映射到金蝶系统中的`FPrice` - `batch_no`: 映射到金蝶系统中的`FLOT` - `remark`: 映射到金蝶系统中的`FEntryNote` 以下是构建后的请求体示例: ```json { "api_outer_no": "{FBillNo}", ... } ``` #### 实际操作示例 假设我们从金蝶系统获取了以下原始数据: ```json { ... } ``` 通过ETL转换后,生成如下请求体: ```json { ... } ``` 最后,通过HTTP POST方法将该请求体发送至旺店通·企业奇门API接口,实现数据写入。 #### 总结 通过上述步骤,我们成功地将金蝶其他入库单的数据转换为旺店通委外入库单所需的格式,并写入目标平台。这不仅提高了数据处理效率,还确保了数据的一致性和准确性。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/T4.png~tplv-syqr462i7n-qeasy.image)