ETL转换技术案例:从MySQL数据集成至金蝶云星空

  • 轻易云集成顾问-张妍琪
#### MySQL数据集成到金蝶云星空:W物料分配-销售订单-成品物料自动分配 在本次技术案例中,我们探讨了如何通过轻易云数据集成平台实现MySQL与金蝶云星空的无缝对接,特别是针对"W物料分配-销售订单-成品物料自动分配"这一业务场景。该方案利用MySQL获取基础数据,并通过API接口实时将这些数据写入至金蝶云星空的目标系统。 在实际操作过程中,我们重点解决了以下几个关键问题: 1. **高效的数据抓取和写入**:通过定时可靠地调用MySQL API (`select`),我们确保所有相关的源数据及时准确地被抓取。同时,结合适应大吞吐量需求的数据写入能力,将批量处理后的信息快速传递给金蝶云星空(使用`allocate`接口)。 2. **分页和限流机制**:在处理大量数据时,为避免单次请求过大带来的性能瓶颈或网络阻塞,实施了分页策略及限流控制。这一部分内容涉及复杂逻辑,但有助于保证系统稳定性和性能最优。 3. **异常检测与重试机制**:为每个核心流程段配置完善的监控告警机制,一旦发现异常情况,比如网络连接中断或API响应失败,通过日志记录功能快速跟踪原因并触发相应重试动作,以减少业务影响。 4. **自定义转换逻辑及格式匹配**:为了使两者间的数据结构及格式得到完美融合,通过可视化设计工具对原数据进行必要转换,确保最终输入符合目标数据库要求。而这种方式不仅提升了开发效率,也降低了可能出现的人为错误风险。 5. **统一视图下的集中管理**:借助统一的平台视图有效掌握资源运用状况,对各API接口进行全面分析,有助于合理优化配置,提高整体集成灵活性以及资源利用率。 综上所述,本案例展示了强大的多元功能应用,从而保障整个“W物料分配-销售订单-成品物料自动分配”流程能够顺利、高效运行。在之后的具体方案介绍中,我们将进一步详细解析各步骤中的技术细节和最佳实践。 ![轻易云数据集成平台金蝶集成接口配置](https://pic.qeasy.cloud/D6.png~tplv-syqr462i7n-qeasy.image) ### 调用源系统MySQL接口select获取并加工数据 在轻易云数据集成平台中,调用源系统MySQL接口是数据集成生命周期的第一步。本文将详细探讨如何通过配置元数据来实现从MySQL数据库中获取并加工数据。 #### 元数据配置解析 首先,我们来看一下元数据配置的具体内容: ```json { "api": "select", "effect": "QUERY", "method": "POST", "id": "id", "idCheck": true, "request": [ { "field": "main_params", "label": "main_params", "type": "object", "describe": "111", "value": "1", "children": [ { "field": "limit", "label": "limit", "type": "string", "value": "2000" }, { "field": "offset", "label": "offset", "type": "string" } ] } ], "otherRequest": [ { "field": "main_sql", "label": "main_sql", "type": "string", "describe": "111", ... } ], ... } ``` #### 数据请求与清洗 在这个阶段,我们需要通过API接口从MySQL数据库中获取原始数据,并进行初步的清洗和过滤。元数据配置中的`api`字段指定了我们使用的操作类型为`select`,而`effect`字段则表明这是一个查询操作。 ##### 请求参数 - `main_params`: 包含两个子参数`limit`和`offset`,用于控制查询结果的分页。 - `limit`: 每次查询返回的数据条数,默认值为2000。 - `offset`: 查询结果的偏移量,用于分页。 这些参数通过POST方法传递给API接口,以确保我们能够灵活地控制查询结果的大小和位置。 ##### SQL语句 元数据中的`main_sql`字段定义了实际执行的SQL查询语句: ```sql select md5(uuid()) as id, a.part_no as 物料编号, '1' as is_success, a.bom_id as sourceid, a.delivery_org, b.sale_org, case when b.sale_org='T01' and a.delivery_org='T01.01' then '270615' when b.sale_org='T01' and a.delivery_org='T04' then '270615' when b.sale_org='T03' and a.delivery_org='T01.01' then '270622' when b.sale_org='T03' and a.delivery_org='T04' then '270622' else '' end useorg from mbs_order_bom a left join mbs_order b on b.order_uuid=a.order_uuid where a.is_success<>'1' and a.create_time>='2024-05-28' UNION select md5(uuid()) as id, a.part_no as 物料编号, '1' as is_success, a.bom_id as sourceid, a.delivery_org, b.sale_org, case when b.sale_org='T01' and a.delivery_org='T01.01' then '804995' when b.sale_org='T01' and a.delivery_org='T04' then '802345' when b.sale_org='T03' and a.delivery_org='T01.01' then '804995' when b.sale_org='T03' and a.delivery_org='T04' then '802345' else '' end useorg from mbs_order_bom a left join mbs_order b on b.order_uuid=a.order_uuid where a.is_success<>'1' and a.create_time>='2024-05-28' limit :limit offset :offset ``` 这段SQL语句从两个表(`mbs_order_bom` 和 `mbs_order`)中联合查询,并根据不同条件生成新的字段值。特别是使用了条件判断来生成不同的组织代码(useorg),并且通过UNION操作合并了两次相似的查询结果。 #### 数据转换与写入 虽然本文主要聚焦于调用源系统MySQL接口获取并加工数据,但为了完整性,简要提及下一步的数据转换与写入。在获取到原始数据后,我们可以利用轻易云平台提供的数据转换工具对其进行进一步处理,然后将处理后的数据写入目标系统。 #### 自动填充与补救措施 元数据配置中的`autoFillResponse: true`表示系统会自动填充响应结果,而`omissionRemedy`部分则定义了定时任务和补救措施,以确保在异常情况下能够及时恢复和补充遗漏的数据。 通过上述配置和操作,我们可以高效地从MySQL数据库中获取所需的数据,并进行初步加工,为后续的数据转换与写入奠定基础。这种全透明可视化的操作方式极大提升了业务流程的透明度和效率。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S16.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在本案例中,我们将详细探讨如何利用轻易云数据集成平台,将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,并转为金蝶云星空API接口所能够接收的格式,最终写入目标平台。我们将重点关注元数据配置及其在实际应用中的技术细节。 #### 元数据配置解析 元数据配置是实现数据转换和写入的核心部分。以下是本案例中使用的元数据配置: ```json { "api": "allocate", "effect": "EXECUTE", "method": "POST", "number": "number", "id": "id", "name": "name", "idCheck": true, "request": [ { "field": "FormId", "label": "业务对象表单Id", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": "BD_MATERIAL" }, { "field": "TOrgIds", "label": "目标组织内码", "type": "string", "describe": "需要分配的目标组织内码,字符串类型,格式:123,3123,5123,5123", "value": "{useorg}" }, { "field": "PkIds", "label": "需要分配的物料内码", "type": "string", "describe": "被分配的物料内码集合,字符串类型,格式:123,312,4123", "value": "_mongoQuery 9f845ce5-cf31-3ae6-ab67-21f2d881489b findField=content.FMasterId where={\"content.FNumber\":{\"$eq\":\"{{物料编号}}\"}}" }, { "field": "IsAutoSubmitAndAudit","label":"提交审核","type":"bool","value":"true" } ], "enforcedAssociation": true } ``` #### 数据请求与清洗 在ETL流程中,首先要从源系统请求并清洗数据。这一步通常涉及到从不同的数据源提取原始数据,并进行必要的数据清洗和预处理。在本案例中,我们假设已经完成了这一步,并且已经获得了所需的数据。 #### 数据转换 接下来,我们进入关键的转换阶段。此阶段需要将清洗后的数据转化为金蝶云星空API接口能够接受的格式。根据元数据配置,我们需要构建一个符合要求的请求体。 1. **业务对象表单Id (FormId)**: - 固定值为`BD_MATERIAL`,表示物料表单。 2. **目标组织内码 (TOrgIds)**: - 从上下文变量`{useorg}`获取,这通常是在前期的数据准备阶段通过某种逻辑或查询得到的目标组织编码。 3. **需要分配的物料内码 (PkIds)**: - 使用MongoDB查询语句,从数据库中获取对应物料编号`{{物料编号}}`所对应的主键ID集合。 - `_mongoQuery 9f845ce5-cf31-3ae6-ab67-21f2d881489b findField=content.FMasterId where={"content.FNumber":{"$eq":"{{物料编号}}"}}` 4. **提交审核 (IsAutoSubmitAndAudit)**: - 固定值为`true`,表示自动提交并审核。 #### 构建请求体 根据上述元数据配置,我们可以构建如下请求体: ```json { “FormId”: “BD_MATERIAL”, “TOrgIds”: “123,3123,5123,5123”, “PkIds”: “123,312,4123”, “IsAutoSubmitAndAudit”: true } ``` #### 数据写入 最后一步是将转换后的数据通过POST方法写入金蝶云星空API接口。以下是一个示例代码片段,用于实现这一操作: ```python import requests import json url = 'https://api.kingdee.com/allocate' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'BD_MATERIAL', 'TOrgIds': '123,3123,5123,5123', 'PkIds': '123,312,4123', 'IsAutoSubmitAndAudit': True } response = requests.post(url, headers=headers, data=json.dumps(payload)) if response.status_code == 200: print('Data successfully written to Kingdee Cloud.') else: print('Failed to write data:', response.text) ``` 通过上述步骤,我们成功地将源平台的数据进行了ETL转换,并通过金蝶云星空API接口写入了目标平台。在实际应用中,可以根据具体需求对元数据配置和请求体进行调整,以满足不同场景下的数据集成需求。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/T20.png~tplv-syqr462i7n-qeasy.image)