使用轻易云实现从金蝶到MySQL的数据ETL转换

  • 轻易云集成顾问-孙传友
### 金蝶云星空数据集成到MySQL:高效数据管理的解决方案 在企业信息化过程中,精准的数据集成是保障系统间无缝协作的关键。本文将详细探讨如何通过轻易云数据集成平台,将金蝶云星空系统中的费用申请单数据,批量且高效地集成到MySQL数据库中。本案例实际运行的方案名称为“kd-金蝶查询费用申请单-->mysql(鸿巢)”。 首先,需要从金蝶云星空获取费用申请单的数据,这里将调用其提供的数据API接口`executeBillQuery`。该接口支持分页和限流功能,因此,在实现过程中需要特别注意这些技术要点,以确保稳定性和性能。 为了实现大量数据快速写入,我们采用了并行处理机制,通过多线程方式来提高吞吐量,并利用MySQL的批量写入操作进行优化。接下来,我们重点关注几个核心步骤: 1. **定时可靠抓取**:使用轻易云的平台设定周期任务,通过调度器每隔一定时间自动调用`executeBillQuery`接口,从金蝶云星空实时拉取最新的费用申请单数据。 2. **自定义转换与格式适配**:由于金蝶云星空与MySQL之间存在数据格式差异,我们必须先对拉取到的数据进行预处理。例如,对日期格式、金额单位等字段进行统一转换,以符合目标数据库表结构要求。 3. **高吞吐量写入**:配置轻易云的数据传输模块,实现大批量、高频次的数据导入。在此过程中,利用事务控制确保即便出现异常,也能保证数据的一致性和完整性。 4. **监控与告警机制**:借助平台提供的集中监控功能,对整个流程进行全方位实时跟踪。一旦检测到任何异常情况,如网络波动导致请求失败或API返回错误等,可以第一时间发出告警并自动触发重试机制。 以上各个环节不仅提升了整体效率,还极大降低了人为干预成本,使得复杂的跨系统数据同步变得更加快捷和可靠。 接下来,将深入解析具体实施细节,包括如何精确调用`executeBillQuery` API、对接中遇到的问题及其解决方法等,为您的实践提供切实可行的指导。 ![数据集成平台API接口配置](https://pic.qeasy.cloud/D31.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在轻易云数据集成平台中,调用源系统的API接口是数据集成生命周期的第一步。本文将详细介绍如何通过调用金蝶云星空的`executeBillQuery`接口获取费用申请单数据,并进行初步加工处理。 #### 接口配置与请求参数 首先,我们需要配置元数据以便正确调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置的关键部分: ```json { "api": "executeBillQuery", "effect": "QUERY", "method": "POST", "number": "FBillNo", "id": "FEntity_FEntryID", "idCheck": true, "formatResponse": [ { "old": "FDate", "new": "FDate_new", "format": "date" } ], "request": [ {"field":"FEntity_FEntryID","label":"FEntryID","type":"string","describe":"111","value":"FEntity_FEntryID"}, {"field":"FBillNo","label":"FBillNo","type":"string","describe":"111","value":"FBillNo"}, {"field":"FDocumentStatus","label":"FDocumentStatus","type":"string","describe":"111","value":"FDocumentStatus"}, {"field":"FDate","label":"FDate","type":"string","describe":"111","value":"FDate"}, {"field":"FOrgAmount","label":"FOrgAmount","type":"string","describe":"111","value":"FOrgAmount"} ], "otherRequest": [ {"field":"Limit","label":"Limit","type":"string","describe":"金蝶的查询分页参数","value":"{PAGINATION_PAGE_SIZE}"}, {"field":"StartRow","label":"StartRow","type":"string","describe":"金蝶的查询分页参数","value":"{PAGINATION_START_ROW}"}, {"field":"TopRowCount","label":"TopRowCount","type":"int"}, {"field":"FilterString","label":"FilterString","type":"string", "describe": "示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=", "value": "FAPPROVEDATE>='{{LAST_SYNC_TIME|date}}' and FCreatorId= '100796'"}, {"field": "FieldKeys", "label": "FieldKeys", "type": "array", "describe": "金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber", "value": "{MAIN_REQUEST}"}, {"field": "FormId", "label": "FormId", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": "ER_ExpenseRequest"} ], "autoFillResponse": true } ``` #### 请求参数详解 1. **基本请求字段**: - `FEntity_FEntryID`: 分录唯一标识。 - `FBillNo`: 单据编号。 - `FDocumentStatus`: 单据状态。 - `FDate`: 单据日期。 - `FOrgAmount`: 原币金额。 2. **其他请求字段**: - `Limit` 和 `StartRow`: 用于分页查询。 - `FilterString`: 用于过滤条件,例如筛选特定供应商和审批日期。 - `FieldKeys`: 指定需要返回的字段列表。 - `FormId`: 表单ID,这里为费用申请单(ER_ExpenseRequest)。 #### 数据请求与清洗 在发起请求时,我们需要确保请求参数正确填充,并且符合金蝶云星空API的要求。以下是一个示例请求体: ```json { "_apiName_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_apiMethod_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_apiParams_":{ "_formId_":"", "_filterString_":"", "_limit_":"", "_startRow_":"", "_topRowCount_":"", "_fieldKeys_":[] } } ``` 在实际操作中,我们会根据元数据配置自动填充这些参数。例如: ```json { "_apiName_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_apiMethod_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_apiParams_":{ "_formId_": "{ER_ExpenseRequest}", "_filterString_": "{LAST_SYNC_TIME|date}", "_limit_":"", "_startRow_":"", "_topRowCount_":"", "_fieldKeys_":["FBillNo", ...] } } ``` #### 数据转换与写入 在接收到响应后,我们需要对数据进行初步清洗和转换。例如,将日期字段`FDate`转换为新的格式`FDate_new`。这一步可以通过配置中的`formatResponse`来实现: ```json "formatResponse":[{"old":"FDate","new":"FDate_new","format":"date"}] ``` 此配置将原始日期字段`FDate`转换为新的字段名`FDate_new`,并应用日期格式化。 #### 实践案例 假设我们要获取所有状态为“已审核”的费用申请单,并将其写入MySQL数据库。我们可以设置如下过滤条件: ```json "FilterString":{ ... ,"value":"'已审核'" } ``` 然后,通过轻易云平台的数据流管理功能,将清洗后的数据写入目标MySQL数据库,实现数据集成。 通过上述步骤,我们成功完成了从调用源系统API接口到初步加工处理数据的全过程,为后续的数据转换与写入奠定了基础。这种全透明可视化的数据处理方式极大提升了业务效率和透明度。 ![系统集成平台API接口配置](https://pic.qeasy.cloud/S20.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台ETL转换与MySQLAPI接口写入技术案例 在数据集成生命周期的第二步中,重点在于将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,并最终写入目标平台MySQL。本文将深入探讨这一过程中的技术细节,特别是如何通过配置元数据来实现这一目标。 #### 数据请求与清洗 首先,我们需要从源平台(如金蝶)获取原始数据。这一步通常涉及到对原始数据进行初步的清洗和整理,以确保后续处理的顺利进行。在这个阶段,我们会使用轻易云提供的全透明可视化操作界面来监控和管理数据流动,确保每个环节都清晰易懂。 #### 数据转换与写入 接下来,我们进入本文的重点:将清洗后的数据转换为目标平台MySQLAPI接口所能够接收的格式,并最终写入目标数据库。 ##### 元数据配置解析 以下是一个典型的元数据配置示例: ```json { "api": "execute", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ { "field": "main_params", "label": "main_params", "type": "object", "describe": "111", "children": [ {"field": "FEntity_FEntryID", "label": "明细id", "type": "string", "value": "{FEntity_FEntryID}"}, {"field": "order_no_new", "label": "单号", "type": "string", "value": "{FBillNo}"}, {"field": "FDocumentStatus", "label": "状态", "type": "string", "value": "{FDocumentStatus}"}, {"field": "qty_count", "label": "数量", "type": "string", "value":"1"}, {"field":"sales_count","label":"金额","type":"string","value":"{FOrgAmount}"}, {"field":"datetime_new","label":"时间","type":"date","value":"{FDate_new}"}, {"field":"Document_Type","label":"单据类型","type":"string","value":"费用申请"} ] } ], ... } ``` 上述配置定义了一个POST请求,用于将数据写入MySQL数据库。以下是关键字段的详细解释: - `api`: 指定要调用的API,这里是`execute`。 - `effect`: 表示操作类型,这里是`EXECUTE`。 - `method`: HTTP请求方法,这里使用`POST`。 - `idCheck`: 是否进行ID检查,这里设置为`true`。 - `request`: 定义了请求参数,其中包含一个对象`main_params`,该对象包含多个子字段,每个子字段对应源平台的数据字段。 ##### SQL语句配置 在元数据配置中,还定义了一条SQL插入语句,用于将转换后的数据写入MySQL数据库: ```json { ... ,"otherRequest":[ { field: 'main_sql', label: 'main_sql', type: 'string', describe: '111', value: 'INSERT INTO `hc_kd_fysq`(`FEntity_FEntryID`,`order_no_new`,`FDocumentStatus`,`qty_count`,`sales_count`,`datetime_new`, `Document_Type`) VALUES (:FEntity_FEntryID,:order_no_new,:FDocumentStatus,:qty_count,:sales_count,:datetime_new,:Document_Type)' } ] } ``` 这条SQL语句将把从源平台获取并转换后的字段值插入到目标表`hc_kd_fysq`中。每个占位符(如`:FEntity_FEntryID`)对应于前面定义的请求参数中的字段值。 ##### 实际应用案例 假设我们从金蝶系统中获取了一条费用申请单,其原始数据如下: ```json { FEntity_FEntryID: '12345', FBillNo: 'FB20231001', FDocumentStatus: 'Approved', FOrgAmount: '1000.00', FDate_new: '2023-10-01' } ``` 根据元数据配置和SQL语句,该记录将被转换并插入到MySQL数据库中的过程如下: 1. 提取并映射字段: - `明细id`: `'12345'` - `单号`: `'FB20231001'` - `状态`: `'Approved'` - `数量`: `'1'` - `金额`: `'1000.00'` - `时间`: `'2023-10-01'` - `单据类型`: `'费用申请'` 2. 执行SQL插入语句: ```sql INSERT INTO `hc_kd_fysq` (`FEntity_FEntryID`, `order_no_new`, `FDocumentStatus`, `qty_count`, `sales_count`, `datetime_new`, `Document_Type`) VALUES ('12345', 'FB20231001', 'Approved', '1', '1000.00', '2023-10-01', '费用申请'); ``` 通过上述步骤,我们实现了从金蝶系统到MySQL数据库的数据无缝对接。这一过程不仅保证了数据的一致性和完整性,还大大提高了业务处理效率。 在实际应用中,轻易云平台提供的全异步、多异构系统支持,使得这一过程更加灵活和高效。通过合理配置元数据,我们可以轻松实现复杂的数据集成需求。 ![如何对接金蝶云星空API接口](https://pic.qeasy.cloud/T24.png~tplv-syqr462i7n-qeasy.image)