从MySQL到金蝶云星空的数据转换及写入技术详解

  • 轻易云集成顾问-林峰
### MySQL数据集成到金蝶云星空案例分享:GX-广东天一销售出库单-新增 在本次技术案例中,我们将详细探讨如何通过轻易云数据集成平台,将MySQL中的销售出库单数据高效地集成到金蝶云星空。本方案命名为“GX-广东天一销售出库单-新增”,旨在展示从MySQL获取并转换特定业务的数据,并实现批量写入金蝶云系统的全过程。 #### 数据采集与转换策略 首先,通过调用MySQL的API接口`select`,我们能够实时、定时和可靠地抓取所需的销售出库单数据。为了确保信息完整性,每一次的数据提取都包括分页处理和限流控制,以防止因大规模查询而导致数据库压力过大或网络阻塞。 #### 数据映射与格式转换 由于MySQL与金蝶云星空之间存在数据结构和格式上的差异,必须进行自定义的数据转换逻辑。在此过程中,我们采用可视化的数据流设计工具,对源表字段与目标表字段进行精准映射。同时,考虑到两端API对接时可能出现的数据类型不匹配问题,通过制定特殊规则进行处理,确保每条记录都能被正确解析并写入。 #### 实现高吞吐量批量写入 为了应对大量数据快速写入需求,本方案利用了金蝶云星空提供的`batchSave` API接口。通过优化提交频率和合理划分批次大小,在保障性能稳定性的同时,实现了高效、大规模的数据导入。此外,还配置了一套集中监控及告警机制,实时跟踪任务状态和性能指标,从而做到全流程透明管控。 ### 异常处理与错误重试 在实际运行过程中,不可避免会遇到诸如网络中断、服务超时等异常情况。因此,我们设计了一套健壮的异常处理及错误重试机制。当某个批次出现失败时,该机制会自动捕捉相应错误信息并触发重试操作,同时将关键日志记录下来以供后续分析。这不仅提高了系统可靠性,也确保了所有待同步的数据最终都能准确无误地传递至目标终端——即金蝶云星空系统中。 这就是我们在本案例中采用的一些主要技术策略。具体实施步骤将在后续部分详细讲解。 ![打通用友BIP数据接口](https://pic.qeasy.cloud/D16.png~tplv-syqr462i7n-qeasy.image) ### 调用MySQL接口获取并加工数据的技术实现 在数据集成生命周期的第一步,我们需要调用源系统MySQL接口,通过`select`语句获取并加工数据。本文将详细探讨如何利用轻易云数据集成平台进行这一过程的配置和实现。 #### 元数据配置解析 首先,我们来看一下元数据配置中的关键字段和参数: ```json { "api": "select", "effect": "QUERY", "method": "POST", "number": "id", "id": "id", "request": [ { "field": "main_params", "label": "主参数", "type": "object", "describe": "对应其它请求字段内SQL语句的主参数,必须一一对应。", "value": "1", "children": [ { "field": "limit", "label": "限制结果集返回的行数", "type": "int", "describe": "必要的参数!LIMIT 子句用于限制查询结果返回的行数。它指定了查询应该返回的最大行数。例如,LIMIT 10 表示查询结果只包含最多 10 行数据。这对于分页查询非常有用,可以在每次查询中返回一定数量的结果。", "value": "{PAGINATION_PAGE_SIZE}" }, { "field": "offset", "label": "偏移量", "type": "int", "describe": "OFFSET 子句用于指定查询结果的起始位置或偏移量。它表示查询应该从结果集的哪一行开始返回数据。例如,OFFSET 20 表示查询应该从结果集的第 21 行开始返回数据。结合 LIMIT 子句使用时,OFFSET 指定了查询结果的起始行数。", "value": "{PAGINATION_START_ROW}" } ] } ], ... } ``` #### SQL语句动态参数绑定 在元数据配置中,主SQL语句采用了动态参数绑定的方法。这种方法不仅提高了SQL语句的可读性和维护性,还确保了动态字段与请求参数的一一对应关系。 ```json { ... “otherRequest”: [ { “field”: “main_sql”, “label”: “主SQL语句”, “type”: “string”, “describe”: “主SQL查询语句中使用 :limit 这种动态语法字段的赋值,以确保字段与请求参数一一对应,我们可以采用参数绑定的方式。下面是具体的优化步骤:\n1.将主SQL查询语句中的动态字段 :limit 替换为占位符(例如 ?),表示参数的位置。\n2.在执行查询之前,使用参数绑定的方法,将请求参数的值与占位符进行对应绑定。\n通过这种优化方式,我们能够提高查询语句的可读性和维护性,并确保动态语法字段与请求参数的正确对应关系。这样可以更好地保证查询的准确性和安全性。”, “value”: “select a.sales_out_no,\n a.create_time,\n c.customer_code,\n\t\t\t b.part_no,\n\t\t\t b.current_out_stock_numb,\n\t\t\t d.price,\n\t\t\t b.kingdee_FID,\n\t\t\t b.kingdee_FEntryID,\n d.bom_no,\n d.order_no,\n a.supplier_code,\n a.delivery_no,\n a.id as sourceid,\n b.id\nfrom oms_sales_out_head a \nleft join oms_sales_out_detail b on a.kingdee_FID=b.kingdee_FID\nleft join basic_customer_info c on c.customer_uuid=a.customer_uuid\nleft join oms_order_bom d on b.kingdee_FEntryID=d.kingdee_fentryid\nwhere a.is_success<>'1' and kingdee_so_type='XSDD01_SYS' and d.kingdee_salseORG='T04'\n limit :limit offset :offset” } ], ... } ``` #### 请求和响应处理 在实际操作中,我们通过POST方法发送请求,并传递必要的分页参数`limit`和`offset`。这些参数在元数据配置中已经定义好,并会在实际调用时自动填充。 ```json { ... “autoFillResponse”: true, ... } ``` 这个配置项确保了响应自动填充到预定义的数据结构中,从而简化了后续的数据处理步骤。 #### 实际操作步骤 1. **定义主SQL语句**:将SQL中的动态字段`:limit`和`:offset`替换为占位符。 2. **绑定请求参数**:在执行查询之前,将分页参数值绑定到占位符上。 3. **发送请求**:通过POST方法发送带有分页参数的请求。 4. **处理响应**:自动填充响应数据到预定义结构中。 通过上述步骤,我们可以高效地从MySQL数据库中获取所需的数据,并为后续的数据清洗、转换和写入做好准备。这种方法不仅提高了操作效率,还确保了数据处理过程中的准确性和安全性。 ![如何对接企业微信API接口](https://pic.qeasy.cloud/S5.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,并转为目标平台能够接收的格式。本文将详细探讨如何使用轻易云数据集成平台将销售出库单数据转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 元数据配置是ETL过程中的核心部分,它定义了如何将源数据映射到目标API接口所需的数据格式。以下是一个完整的元数据配置示例: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field": "FBillTypeID", "label": "单据类型", "type": "string", "describe": "单据类型", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}, "value": "XSCKD01_SYS"}, {"field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "{sales_out_no}"}, {"field": "FDate", "label": "日期", "type": "string", "describe": "日期", "value": "{create_time}"}, {"field": ...} ], ... } ``` 该配置定义了多个字段及其对应的属性,包括字段名称、标签、类型、描述和值等。下面我们逐一解析这些字段及其作用。 #### 主要字段解析 1. **FBillTypeID(单据类型)**: - **字段**:`FBillTypeID` - **标签**:`单据类型` - **类型**:`string` - **描述**:`单据类型` - **值**:`XSCKD01_SYS` - **解析器**:`ConvertObjectParser` 该字段指定了单据类型,使用了 `ConvertObjectParser` 解析器,将 `FNumber` 转换为系统识别的编码。 2. **FBillNo(单据编号)**: - **字段**:`FBillNo` - **标签**:`单据编号` - **类型**:`string` - **描述**:`单据编号` - **值**:`{sales_out_no}` 该字段用于指定销售出库单的编号,直接从源数据中获取 `sales_out_no`。 3. **FDate(日期)**: - **字段**:`FDate` - **标签**:`日期` - **类型**:`string` - **描述**:`日期` - **值**:`{create_time}` 该字段用于指定销售出库单的创建时间,从源数据中获取 `create_time`。 4. **FStockOrgId(发货组织)和 FSaleOrgId(销售组织)**: - 这两个字段均指定了组织信息,使用 `ConvertObjectParser` 将 `FNumber` 转换为系统识别的编码,值均为 `T04`. 5. **FOwnerTypeIdHead 和 FOwnerIdHead(货主类型和货主)** - 指定货主类型和货主,同样使用 `ConvertObjectParser`. 6. **FCustomerID 和 FCarrierID(客户和承运商)** - 分别从源数据中获取客户代码 `{customer_code}` 和承运商代码 `{supplier_code}`. 7. **FEntity(明细信息)** - 包含多个子字段,如物料编码、实发数量、含税单价等。 #### 子实体与关联关系表 子实体 `SubHeadEntity` 和 `FEntity_Link` 定义了复杂对象和数组结构。以下是明细信息中的一个子实体示例: ```json { ... { field: 'FMaterialID', label: '物料编码', type: 'string', describe: '基础资料', parser: { name: 'ConvertObjectParser', params: 'FNumber' }, value: '{part_no}' }, ... } ``` 该子实体定义了物料编码,并使用 `ConvertObjectParser`. #### 操作与其他请求参数 - 操作部分定义了如何合并请求体,如: ```json { method: 'merge', field: 'sales_out_no', bodyName: 'items', header: ['sales_out_no', 'create_time', 'customer_code', 'supplier_code', 'delivery_no'], body: ['part_no', 'current_out_stock_numb', 'price', 'kingdee_FID', 'kingdee_FEntryID', 'bom_no', 'order_no', 'FSrcType'] } ``` - 其他请求参数如表单ID、执行操作、提交并审核等也在配置中明确规定。 #### 实际应用 在实际应用中,通过轻易云数据集成平台,我们可以快速完成从源系统到金蝶云星空API接口的数据转换和写入。以下是一个简化后的请求示例: ```json { FormId: 'SAL_OUTSTOCK', Operation: 'BatchSave', IsAutoSubmitAndAudit: true, IsVerifyBaseDataField: true, SubSystemId: 21, InterationFlags: 'STK_InvCheckResult', Model: { FBillTypeID: { FNumber: 'XSCKD01_SYS' }, FBillNo: '{sales_out_no}', FDate: '{create_time}', ... } } ``` 通过上述配置,我们能够确保每个环节的数据都符合金蝶云星空API接口要求,从而实现高效的数据集成和处理。 ![用友与MES系统接口开发配置](https://pic.qeasy.cloud/T9.png~tplv-syqr462i7n-qeasy.image)