轻松实现从金蝶云到管易云的数据写入:ETL技术案例

  • 轻易云集成顾问-黄宏棵
### 金蝶云星空与管易云的数据集成案例分享:kg_货品同步 在企业信息系统的对接过程中,数据集成是确保各业务系统顺畅运作的关键。本文聚焦于“kg_货品同步”方案的实现过程,此方案将金蝶云星空中的数据无缝集成至管易云。在这个技术案例中,我们主要探讨如何利用轻易云平台高效解决API接口调用、分页处理及异常重试等多个实际问题。 首先,为了确保从金蝶云星空获取准确完整的数据,我们使用了executeBillQuery API。该接口通过定时机制抓取库存和商品信息,避免任何可能漏单情况的发生。另外,通过批量读取和分页控制技术,我们有效解决了大数据量下的数据抓取效率和限流问题。 其次,在处理好来源端的数据后,需要将这些数据迅速而精准地写入到目标端——管易云。这一步骤利用gy.erp.item.add API完成,实现大量数据快速写入。同时,通过对不同格式间的数据映射,保证两边系统之间的数据结构差异不影响最终应用效果。如遇到传输过程中出现异常,也有完善的错误重试机制来保障整体流程顺利进行,不会因个别失败而中断整个任务。 总之,这一系列操作不仅需要解决实时监控与日志记录的问题,还得应对多种复杂场景,如接口限流、XML/JSON转换等。而轻易云提供的平台全部功能模块支持,让我们能够流畅执行每一个步骤,并为后续优化留出足够空间。 ![用友与SCM系统接口开发配置](https://pic.qeasy.cloud/D31.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成生命周期的第一步,我们需要调用源系统的接口以获取原始数据,并对其进行初步加工。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取货品信息并进行必要的数据处理。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。以下是我们使用的元数据配置: ```json { "api": "executeBillQuery", "method": "POST", "number": "FNumber", "id": "FMasterId", "pagination": { "pageSize": 100 }, "idCheck": true, "request": [ {"field":"FMasterId","label":"id","type":"string","value":"FMasterId"}, {"field":"FNumber","label":"编码","type":"string","value":"FNumber"}, {"field":"FName","label":"名称","type":"string","value":"FName"}, {"field":"FSpecification","label":"规格型号","type":"string","value":"FSpecification"}, {"field":"FMnemonicCode","label":"助记码","type":"string","value":"FMnemonicCode"}, {"field":"FOldNumber","label":"旧物料编码","type":"string","value":"FOldNumber"}, {"field":"FBARCODE","label":"条码","type":"string","value":"FBARCODE"}, {"field":"FDescription","label":"描述","type":"string","value":"FDescription"}, {"field":"FMaterialGroup_FNumber","label":"物料分组","type":"string","value":"FMaterialGroup.FNumber"}, {"field":"FErpClsID","label":"物料属性","type":"string","value":"FErpClsID"}, {"field":"FDocumentStatus","label":"数据状态","type":"string","value":"FDocumentStatus"}, {"field":"FForbidStatus","label":"禁用状态","type:""string,""value:""FForbidStatus""}, ... ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "value": "{PAGINATION_START_ROW}"}, {"field": "TopRowCount", "label": "返回总行数", "type": "int"}, {"field": "FilterString", "label": "过滤条件", "type": "string", "value": "FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' AND FErpClsID<>2" }, ... ] } ``` #### 请求参数解析 1. **API和方法**:指定了要调用的API为`executeBillQuery`,请求方法为`POST`。 2. **主键字段**:`number`和`id`分别对应货品编码和主键ID。 3. **分页设置**:每次请求的数据量为100条。 4. **请求字段**:包括了货品的各种属性,如编码、名称、规格型号、助记码等。 5. **其他请求参数**: - `Limit`: 最大行数,取自分页设置。 - `StartRow`: 开始行索引,用于分页。 - `FilterString`: 过滤条件,用于筛选特定时间段内的数据。 #### 数据获取与处理 在配置好元数据后,我们通过轻易云平台发起API请求。以下是一个示例代码片段,展示了如何构建请求并处理响应数据: ```python import requests import json url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'BD_MATERIAL', 'FieldKeys': 'FMasterId,FNumber,FName,FSpecification,FMnemonicCode,...', 'FilterString': f"FApproveDate>='{last_sync_time}' AND FErpClsID<>2", 'Limit': 100, 'StartRow': start_row } response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() # 数据处理 for item in data['Result']: process_item(item) ``` 在这个示例中,我们构建了一个POST请求,包含了所需的字段和过滤条件。响应数据返回后,我们对每一条记录进行处理。 #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换,以便后续写入目标系统。常见的数据清洗操作包括: 1. **字段映射**:将源系统字段映射到目标系统字段。 2. **格式转换**:如日期格式、数值格式等转换。 3. **数据校验**:检查必填字段是否为空,值是否符合预期范围等。 以下是一个简单的数据清洗示例: ```python def process_item(item): cleaned_data = { 'id': item['FMasterId'], 'code': item['FNumber'], 'name': item['FName'], # 更多字段映射... 'status': map_status(item['FDocumentStatus']) # 数据校验与转换... } def map_status(status): return { "AuditPass" : “已审核”, "AuditFail" : “审核不通过” }.get(status, status) ``` 在这个示例中,我们将源系统的字段映射到目标系统,并进行了简单的数据校验和转换。 通过上述步骤,我们完成了从金蝶云星空获取货品信息并进行初步加工,为后续的数据写入奠定了基础。这一步骤在整个数据集成生命周期中至关重要,确保了数据的一致性和准确性。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/S12.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行管易云API接口数据写入的ETL转换技术案例 在数据集成生命周期的第二阶段,我们需要将已经从源平台获取并清洗的数据进行ETL(Extract, Transform, Load)转换,使其符合目标平台——管易云API接口所能接收的格式,并最终写入目标平台。本文将详细探讨如何利用轻易云数据集成平台完成这一过程。 #### API接口与元数据配置解析 我们需要对接的管易云API接口为`gy.erp.item.add`,该接口用于新增商品信息。根据提供的元数据配置,我们需要发送一个POST请求,并且请求体中包含以下字段: - `code` (商品代码) - `name` (商品名称) - `simple_name` (商品简称) - `unit_code` (商品单位code) - `skus` (包含规格代码和规格名称的数组) 这些字段分别对应源平台中的不同字段,需要通过ETL过程进行映射和转换。 #### 数据请求与清洗 在此之前,我们已经完成了从源平台的数据请求与清洗工作。假设我们从源平台获取到以下结构的数据: ```json { "FNumber": "12345", "FSpecification": "高质量钢材", "FName": "钢材", "FStoreUnitID_FName": "吨", "Skus": [ { "FNumber": "12345-A", "FName": "规格A" }, { "FNumber": "12345-B", "FName": "规格B" } ] } ``` #### 数据转换与写入 接下来,我们使用轻易云数据集成平台将上述数据转换为管易云API所需的格式,并写入目标平台。具体步骤如下: 1. **字段映射**:根据元数据配置,将源数据字段映射到目标API字段。 2. **构建请求体**:按照API要求构建POST请求体。 3. **发送请求**:通过HTTP POST方法将构建好的请求体发送到管易云API。 ##### 字段映射 根据元数据配置,字段映射关系如下: - `code` 对应 `{FNumber}` - `name` 对应 `{FSpecification}` - `simple_name` 对应 `{FName}` - `unit_code` 对应 `{FStoreUnitID_FName}` - `skus` 数组中的每个对象需要分别处理其内部字段 ##### 构建请求体 根据上述映射关系,构建出的POST请求体如下: ```json { "code": "12345", "name": "高质量钢材", "simple_name": "钢材", "unit_code": "吨", "skus": [ { "sku_code": "12345-A", "sku_name": "规格A" }, { "sku_code": "12345-B", "sku_name": "规格B" } ] } ``` ##### 发送请求 使用轻易云提供的HTTP组件,配置POST方法并设置URL为管易云的API地址,然后将上述构建好的JSON作为请求体发送出去。 ```python import requests url = 'https://api.guanyiyun.com/gy.erp.item.add' headers = {'Content-Type': 'application/json'} data = { 'code': '12345', 'name': '高质量钢材', 'simple_name': '钢材', 'unit_code': '吨', 'skus': [ {'sku_code': '12345-A', 'sku_name': '规格A'}, {'sku_code': '12345-B', 'sku_name': '规格B'} ] } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print('Data successfully written to Guanyi Yun') else: print(f'Failed to write data: {response.text}') ``` 通过上述步骤,我们实现了从源平台到管易云API接口的数据ETL转换和写入。这一过程不仅保证了数据格式的正确性,也确保了数据能够无缝对接到目标系统中,为后续业务操作提供了可靠的数据基础。 #### 总结技术要点 1. **元数据配置解析**:理解元数据配置是成功进行ETL转换的关键。 2. **字段映射**:准确地将源平台字段映射到目标API字段。 3. **构建请求体**:按照目标API要求构建JSON格式的POST请求体。 4. **发送HTTP请求**:通过HTTP POST方法将构建好的JSON发送至目标API。 以上技术要点和操作步骤展示了如何利用轻易云数据集成平台实现复杂系统间的数据无缝对接,为企业级应用提供强有力的数据支持。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T8.png~tplv-syqr462i7n-qeasy.image)