轻易云平台中MySQL到金蝶云的ETL流程与案例分享

  • 轻易云集成顾问-吕修远
### MySQL数据集成到金蝶云星空案例——GR不合格品生产入库单新增 在本篇技术文章中,我们将深入探讨如何通过轻易云数据集成平台,将MySQL数据库中的数据高效、可靠地集成到金蝶云星空,具体以"GR不合格品生产入库单新增"为案例。 #### 方案背景与目标 在制造业领域,质量管理是一个至关重要的环节。为了提升对不合格品的处理效率并确保库存记录的准确性,我们需要将生成的不合格品信息实时同步到金蝶云星空系统中,从而实现自动化的数据处理和业务流转。 #### 系统对接思路 我们此次实施方案利用了高吞吐量的数据写入能力和全透明可视化操作界面,通过逐步配置MySQL接口调用及金蝶云batchSave API,实现快速、批量、高效地完成数据同步过程。整个过程中,我们重点关注以下技术要点: 1. **MySQL接口调用与分页处理**: - 利用select语句从MySQL获取所需的“不合格品”生产数据。 - 考虑到大规模数据读取可能导致系统瓶颈,对API进行分页和限流设置,以确保稳定性和效率。 2. **自定义数据转换逻辑**: - 根据业务需求设计特定的数据映射规则,使得提取出的MySQL数据信息能够完整且无误地适配于金蝶云starSky(即“星空”) batchSave API格式要求。 3. **集中监控与告警机制**: - 通过提供集中式监控系统,全程跟踪每一步骤的数据集成功能模块运行状态,并设置预警阀值,一旦发生异常情况及时通知运维团队采取措施。 4. **实时日志记录与错误重试机制**: - 在执行过程中详细记录每一次API调用情况及其结果,对于出现故障或异常的操作,自动触发重试程序,以保证最终任务正确完成,不漏单、不丢失任何关键业务信息。 5. **性能优化策略**: - 针对大量连续写入场景,通过分片传输等方式加快整体速度,同时避免因瞬时数据爆增而造成计划外宕机或者延迟现象。 通过以上步骤及多种高级功能配置,本次案例有效解决了企业传统手工操作费时费力、人工更新频繁出错等问题,大幅度提升了整体管理水平与工作效益。在后续章节,将更细致具体展示各项参数设定及实际开发代码实现过程。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/D4.png~tplv-syqr462i7n-qeasy.image) ### 调用MySQL接口select获取并加工数据 在数据集成生命周期的第一步中,调用源系统MySQL接口select获取并加工数据是至关重要的一环。本文将详细探讨如何利用轻易云数据集成平台的元数据配置,实现从MySQL数据库中高效获取所需数据,并进行初步加工。 #### 元数据配置解析 元数据配置是实现数据请求与清洗的基础,以下是我们需要关注的关键配置项: 1. **API类型**:`select` 2. **方法**:`SQL` 3. **主查询语句**:用于从MySQL数据库中提取数据 4. **主参数**:包含动态参数对象,如`limit`和`offset` 以下是具体的元数据配置: ```json { "api": "select", "effect": "QUERY", "method": "SQL", "number": "入库单号", "id": "入库单号", "name": "name", "request": [ { "field": "main_params", "label": "主参数", "type": "object", "describe": "对应主查询语句内的动态参数对象", "children": [ { "field": "limit", "label": "返回的记录数", "type": "int", "describe": "你可以使用 LIMIT 属性来设定返回的记录数。", "value": 100 }, { "field": "offset", "label": "数据偏移量", "type": "int", "describe": "你可以通过OFFSET指定SELECT语句开始查询的数据偏移量。默认情况下偏移量为0。" } ] } ], ... } ``` #### 主查询语句解析 主查询语句是整个数据请求过程的核心部分,它定义了从MySQL数据库中提取哪些字段以及如何进行初步加工。以下是具体的SQL查询语句: ```sql select a.dispatch_prefix as 生产订单号, d.bom_uuid, CONCAT('RKBLP_',a.id) as 入库单号, date(a.update_time) as 日期, a.part_no as 成品编号, d.bom_no as 计划跟踪号, a.instock_numb as 入库数量, a.id as sourceid, (select sum(f.man_hour) from eng_craft_card_item f where f.card_id=f1.id)*a.instock_numb/3600 as 工时 from wms_instock_confirm_main_task_detail a left join oms_order_bom d on d.bom_uuid=(select bom_uuid from mes_dispatch_record_process where company_code='gdty' and dispatch=a.dispatch_prefix LIMIT 1) left join wms_instock_confirm_task e on a.confirm_task_uuid=e.confirm_task_uuid left join eng_craft_card f1 on f1.oms_order_bom_uuid=d.bom_uuid where a.company_code='gdTY' and a.confirm_status='20' and a.matterial_type=4 and d.material_source='2' and a.is_defect='1' and a.is_success1 !='1' and a.is_success='1' limit :limit offset :offset ``` 该查询语句主要完成以下任务: - 从多个表中提取相关字段,并进行必要的关联(如`LEFT JOIN`)。 - 使用动态参数`:limit`和`:offset`控制返回记录数和偏移量。 - 对某些字段进行初步计算和格式化(如使用`CONCAT`函数生成入库单号)。 #### 动态参数应用 在实际操作中,我们需要根据具体需求设置动态参数,如下所示: ```json { "main_params": { "limit": 100, "offset": 0 } } ``` 这些参数将被自动填充到主查询语句中的相应位置,确保查询结果符合预期。 #### 数据请求与清洗流程 通过上述元数据配置和主查询语句,我们可以实现以下流程: 1. **发送请求**:根据配置向MySQL数据库发送查询请求。 2. **获取结果**:接收并处理数据库返回的数据。 3. **初步清洗**:对获取的数据进行初步清洗和格式化,如计算工时、生成入库单号等。 #### 实践案例 假设我们需要获取最近更新的100条不合格品生产入库单信息,可以通过如下方式实现: ```json { ... // 前述元数据配置部分省略 , { // 设置动态参数 main_params: { limit: 100, offset: 0 } } } ``` 执行上述配置后,将会调用MySQL接口,执行定义好的主查询语句,从而获取并加工所需的数据。 通过这种方式,我们能够高效地从源系统中提取并处理大量业务数据,为后续的数据转换与写入奠定坚实基础。 ![钉钉与WMS系统接口开发配置](https://pic.qeasy.cloud/S30.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口 在数据集成的生命周期中,将源平台的数据转换为目标平台所需的格式并写入,是一个至关重要的步骤。本文将详细探讨如何利用轻易云数据集成平台,将不合格品生产入库单的数据转换为金蝶云星空API接口可接受的格式,并最终写入目标系统。 #### 数据请求与清洗 首先,我们需要从源系统获取相关数据,并对其进行必要的清洗和预处理。这一步骤确保了数据的一致性和准确性,为后续的ETL(Extract, Transform, Load)过程打下基础。 #### 数据转换与写入 接下来,我们进入数据转换与写入阶段。根据提供的元数据配置,我们需要将源数据映射到金蝶云星空API接口所需的字段格式,并通过API接口将其写入目标系统。 以下是具体的元数据配置及其应用解析: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ { "field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "{{入库单号}}" }, { ... } ], ... } ``` #### 核心字段解析与映射 1. **单据编号 (FBillNo)**: ```json { "field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "{{入库单号}}" } ``` - 将源系统中的`入库单号`直接映射到目标系统中的`FBillNo`字段。 2. **单据类型 (FBillType)**: ```json { ... "parser": {"name":"ConvertObjectParser","params":"FNumber"}, ... "value":"SCRKD01_SYS" } ``` - 使用`ConvertObjectParser`进行对象转换,确保`SCRKD01_SYS`符合金蝶云星空API的格式要求。 3. **日期 (FDate)**: ```json { ... "value":"{{日期}}" } ``` - 将源系统中的日期字段直接映射到目标系统中的`FDate`字段。 4. **生产组织 (FPrdOrgId) 和 入库组织 (FStockOrgId)**: ```json { ... "parser":{"name":"ConvertObjectParser","params":"FNumber"}, ... "value":"T04" } ``` - 使用相同的解析器进行对象转换,确保组织编码符合目标系统要求。 5. **明细 (FEntity)**: 明细部分包含了多个子字段,如下所示: ```json { ... { ... { ... { ... {"field":"FMustQty","label":"应收数量","type":"string","describe":"应收数量","value":"{{入库数量}}"}, {"field":"FRealQty","label":"实收数量","type":"string","describe":"实收数量","value":"{{入库数量}}"} } } ... } ... } ``` 6. **关联关系表 (FEntity_Link)**: ```json { ... {"field":"FEntity_Link_FRuleId","label":"转换规则","type":"string","describe":"SaleOrder-OutStock T_SAL_ORDERENTRY DeliveryNotice-OutStock T_SAL_DELIVERYNOTICEENTRY","value":"PRD_MORPT2INSTOCK"}, {"field":"FEntity_Link_FSTableName","label":"源单表","type":"string","describe":"源单表","value":"T_PRD_MORPTENTRY"}, {"field":"FEntity_Link_FSBillId","label":"源单内码","type":"string","describe":"源单内码","value":"_findCollection find FID from a181f16f-5319-37e2-a02f-13938e5f1e33 where FBillNo={{入库单号}}"} } ``` - 设置关联关系表,确保在转换过程中保留源单信息,以便于后续追溯和验证。 #### API调用与执行 最后,通过POST方法调用金蝶云星空API接口,将处理好的数据批量保存到目标系统中: ```json { ... {"field":"FormId","label":"业务对象表单Id","type":"string","describe":"必须填写金蝶的表单ID如:PUR_PurchaseOrder","value":"PRD_INSTOCK"}, {"field":"Operation","label":"执行的操作","type":"string","describe":"执行的操作","value":"BatchSave"}, {"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"","describe":"","value":true}, } ``` 以上配置确保了自动提交并审核功能,使得整个流程更加高效和自动化。 通过上述步骤,我们成功实现了从源平台到金蝶云星空API接口的数据ETL转换和写入。这不仅提升了数据处理效率,还保证了数据的一致性和准确性。 ![打通企业微信数据接口](https://pic.qeasy.cloud/T14.png~tplv-syqr462i7n-qeasy.image)