从MySQL到金蝶云星空:ETL转换及数据写入方案

  • 轻易云集成顾问-曾平安
### 利用轻易云实现MySQL数据集成到金蝶云星空的技术案例分享 在企业系统间的数据对接需求中,如何高效、可靠地将MySQL数据库中的销售出库单(MOM-XSCKD)数据实时或定时同步至金蝶云星空batchSave接口,是一个值得深入探讨的问题。本篇文章将通过具体的技术案例:MOM-XSCKD-销售出库单保存,为大家详细解析这一过程。 首先,我们需要解决的是MySQL获取数据和金蝶云星空写入数据之间的API调用问题。为此,我们采用了select API从MySQL中抓取所需销售出库单的数据,通过批量处理,利用batchSave API将这些数据快速、准确地写入至金蝶云星空。这一过程中,关键技术要点包括: 1. **高吞吐量的数据写入能力**:大量销售出库单需要及时结算,因此我们的方案必须确保能够支持大规模的数据高速传输及处理。 2. **集中监控与告警系统**:为了实时追踪每个环节的状态及性能指标,本次集成方案搭载了集中监控与告警系统,保障任务透明度及可控性。 3. **自定义逻辑和映射对接**:不同于传统的一对一字段映射,本案根据业务需求设计了灵活的自定义转换逻辑,以适应两端系统特有的数据结构差异。 4. **异常处理与错误重试机制**:对于可能出现的网络波动、API调用失败等情况,我们部署了一整套完备的错误处理机制,在保证整体运行稳定性的同时,实现误操作后的自动恢复。 这项技术实施不仅仅是完成简单的数据搬迁,更重要的是如何实现全流程无缝衔接且不丢失任何关键信息。在后续内容里,我会逐步揭示整个集成方案中的各个步骤,包括API接口调用细节以及流程控制策略,从根本上说明如何确保集成质量,以及我们在实际应用中的经验总结。 ![如何对接钉钉API接口](https://pic.qeasy.cloud/D5.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台从MySQL接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将深入探讨如何通过轻易云数据集成平台调用MySQL接口`select`获取并加工数据,具体实现销售出库单保存的集成方案。 #### 元数据配置解析 在本次集成方案中,我们使用了以下元数据配置: ```json { "api": "select", "effect": "QUERY", "method": "POST", "id": "sourceid", "request": [ { "field": "main_params", "label": "主参数", "type": "object", "describe": "对应其它请求字段内SQL语句的主参数,必须一一对应。", "value": "1", "children": [ { "field": "limit", "label": "限制结果集返回的行数", "type": "int", "describe": "必要的参数!LIMIT 子句用于限制查询结果返回的行数。它指定了查询应该返回的最大行数。例如,LIMIT 10 表示查询结果只包含最多 10 行数据。这对于分页查询非常有用,可以在每次查询中返回一定数量的结果。", "value": 100 }, { "field": "offset", "label": "偏移量", "type": "int", "describe": "OFFSET 子句用于指定查询结果的起始位置或偏移量。它表示查询应该从结果集的哪一行开始返回数据。例如,OFFSET 20 表示查询应该从结果集的第 21 行开始返回数据。结合 LIMIT 子句使用时,OFFSET 指定了查询结果的起始行数。" } ] } ], ... } ``` #### 主SQL语句解析与优化 主SQL语句如下: ```sql select t2.instruction_doc_id as 'sourceid', t1.sd_code as '单据编号', t3.attr_value as '运输单号', t3.last_update_date as '更新时间' from ty_mes.mt_so_delivery_not_label_approve t1 left join ty_mes.mt_instruction_doc t2 on t1.sd_code = t2.instruction_doc_num left join ty_mes.mt_instruction_doc_attr t3 on t2.tenant_id = t3.tenant_id and t2.instruction_doc_id = t3.instruction_doc_id left join ty_mes.mt_instruction_doc_attr t4 on t2.tenant_id = t4.tenant_id and t2.instruction_doc_id = t4.instruction_doc_id and t4.attr_name = 'TRACKING_NUMBER_SYNC' where t2.tenant_id = 7 and t2.site_id = 8001 and t1.flag = 1 and t3.attr_name = 'TRACKING_NUMBER' and t3.attr_value <> '' and t1.sd_code not like 'XSCK%' and (t4.attr_value is null or t4.attr_value <> 1) limit :limit offset :offset ``` 为了提高SQL语句的可读性和维护性,我们采用参数绑定的方法,将动态字段`:limit`和`:offset`替换为占位符,并在执行查询之前进行参数绑定。 优化后的SQL语句如下: ```sql select t2.instruction_doc_id as 'sourceid', t1.sd_code as '单据编号', t3.attr_value as '运输单号', t3.last_update_date as '更新时间' from ty_mes.mt_so_delivery_not_label_approve t1 left join ty_mes.mt_instruction_doc t2 on t1.sd_code = t2.instruction_doc_num left join ty_mes.mt_instruction_doc_attr t3 on t2.tenant_id = t3.tenant_id and t2.instruction_doc_id = t3.instruction_doc_id left join ty_mes.mt_instruction_doc_attr t4 on t2.tenant_id = t4.tenant_id and t2.instruction_doc_id = t4.instruction_doc_id and t4.attr_name = 'TRACKING_NUMBER_SYNC' where (t2.tenant_id, t2.site_id, t1.flag, t3.attr_name, t3.attr_value, t1.sd_code, t4.attr_value) in (?, ?, ?, ?, ?, ?, ?) limit ? offset ? ``` #### 请求参数配置 在实际调用过程中,我们需要设置请求参数,以确保SQL语句中的占位符能够正确绑定相应的数据。以下是请求参数配置示例: ```json { ... "request":[ { ... // 主参数对象内包含两个子参数:limit 和 offset。 // limit 用于限制结果集返回的行数,offset 用于指定起始位置。 // 在实际调用时,这两个参数将被绑定到 SQL 查询中的占位符。 { ... // 设置 limit 参数为100,表示每次最多返回100行数据。 { ... // 设置 offset 参数为0,表示从第一行开始返回数据。 } ] } ], } ``` #### 数据请求与清洗 通过上述配置,我们可以通过POST方法发送请求,从MySQL数据库中获取所需的数据。在这个过程中,我们可以对原始数据进行初步清洗,例如去除空值、格式化日期等操作,以确保后续的数据转换与写入更加顺利。 #### 总结 通过轻易云数据集成平台,我们能够高效地调用MySQL接口获取并加工数据。在这个过程中,通过合理配置元数据和优化SQL语句,可以显著提升查询效率和代码可维护性,为后续的数据转换与写入打下坚实基础。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/S10.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口 在数据集成生命周期的第二步,我们将重点探讨如何将已经集成的源平台数据进行ETL(提取、转换、加载)处理,并转化为金蝶云星空API接口所能接收的格式,最终写入目标平台。本文将详细介绍如何配置元数据和调用API接口,以实现销售出库单的保存操作。 #### 元数据配置解析 在本案例中,我们需要将源平台的数据转换为金蝶云星空所需的格式,并通过其API接口进行保存。以下是元数据配置的详细解析: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field":"FID","label":"FID","type":"string","value":"{sourceid}"}, {"field":"F_FSYNCMOM","label":"同步标志","type":"string","value":"true"}, {"field":"FCarriageNO","label":"运输单号","type":"string","value":"{{运输单号}}"} ], "otherRequest": [ {"field":"FormId","label":"业务对象表单Id","type":"string","describe":"必须填写金蝶的表单ID如:PUR_PurchaseOrder","value":"SAL_OUTSTOCK"}, {"field":"Operation","label":"执行的操作","type":"string","describe":"执行的操作","value":"BatchSave"}, {"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"bool","describe":"提交并审核","value":"false"}, {"field":"IsVerifyBaseDataField","label":"验证基础资料","type":"bool","describe":"是否验证所有的基础资料有效性,布尔类,默认false(非必录)","value":"true"}, {"field":"IsDeleteEntry","label":"是否删除已存在的分录","type":"string","describe":"默认仓库模块","value":"false"} ], "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" } } ``` #### 数据请求与清洗 首先,我们需要从源平台提取数据,并进行必要的清洗和格式化。假设我们从源平台获取到如下数据: ```json { "sourceid": "12345", "运输单号": "TRK20231010" } ``` 在这个过程中,我们确保所有字段都符合目标平台要求。例如,将`sourceid`映射到`FID`字段,并将`运输单号`映射到`FCarriageNO`字段。 #### 数据转换与写入 接下来,我们使用轻易云数据集成平台提供的ETL工具,将清洗后的数据转换为金蝶云星空API能够接受的格式。根据元数据配置,我们需要构建一个POST请求,其中包含以下参数: - `FID`: 对应源平台中的`sourceid` - `F_FSYNCMOM`: 同步标志,固定值为`true` - `FCarriageNO`: 对应源平台中的`运输单号` - `FormId`: 固定值为`SAL_OUTSTOCK` - `Operation`: 固定值为`BatchSave` - `IsAutoSubmitAndAudit`: 固定值为`false` - `IsVerifyBaseDataField`: 固定值为`true` - `IsDeleteEntry`: 固定值为`false` 构建后的请求体如下: ```json { "FormId": "SAL_OUTSTOCK", "Operation": "BatchSave", "IsAutoSubmitAndAudit": false, "IsVerifyBaseDataField": true, "IsDeleteEntry": false, "Model": { "FID": "12345", "F_FSYNCMOM": true, "FCarriageNO": "{{运输单号}}" } } ``` #### 调用API接口 最后一步是通过HTTP POST方法调用金蝶云星空API接口,将转换后的数据写入目标平台。我们使用轻易云提供的异步处理机制,确保请求能够高效地被处理和响应。 以下是调用API接口的示例代码(假设使用JavaScript): ```javascript const axios = require('axios'); const requestData = { FormId: 'SAL_OUTSTOCK', Operation: 'BatchSave', IsAutoSubmitAndAudit: false, IsVerifyBaseDataField: true, IsDeleteEntry: false, Model: { FID: '12345', F_FSYNCMOM: true, FCarriageNO: 'TRK20231010' } }; axios.post('https://api.kingdee.com/batchSave', requestData) .then(response => { console.log('Data saved successfully:', response.data); }) .catch(error => { console.error('Error saving data:', error); }); ``` 通过上述步骤,我们成功地将源平台的数据经过ETL处理后,写入到了金蝶云星空系统中。这一过程充分利用了轻易云数据集成平台提供的强大功能,实现了不同系统间的数据无缝对接和高效处理。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/T24.png~tplv-syqr462i7n-qeasy.image)