从钉钉接口到MySQL的数据ETL转换与应用

  • 轻易云集成顾问-何语琴
### 供应商对账系统-鸿巢付款单(供应链费用退款)钉钉数据集成到MySQL案例分享 在现代企业的数据处理过程中,如何高效、精准地将业务数据进行整合,并实时监控和管理这些数据的流动,是一个重要的技术挑战。本文将分享一个实际应用案例,详细探讨如何通过轻易云数据集成平台,将钉钉的供应商对账系统—鸿巢付款单(供应链费用退款)中的数据无缝、高效地集成到MySQL数据库中。 此集成方案重点使用了以下几个技术特性: 1. **定时可靠抓取**:通过调用钉钉API `v1.0/yida/processes/instances` 实现定时可靠的数据抓取。 2. **高吞吐量写入**:利用 MySQL API `executeReturn` 支持大量数据快速写入,确保业务处理的及时性和一致性。 3. **异常处理与重试机制**:实现错误检测与重试机制,以保证整个流程不中断运行。 4. **分页与限流问题解决**:特别注意了接口调用过程中的分页及限流问题,通过优化设计,实现稳定且连续的数据获取。 接下来,我们将深入讲解该方案具体实施过程中所采用的方法、遇到的问题以及相应的解决策略。这既包括从基础架构层面的考虑,也涵盖一些关键技术细节,如自定义转换逻辑、实时监控等。 ![电商OMS与ERP系统接口开发配置](https://pic.qeasy.cloud/D23.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口获取并加工数据的技术实现 在数据集成生命周期的第一步中,调用源系统接口是至关重要的一环。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`v1.0/yida/processes/instances`获取并加工数据,以实现供应商对账系统中的鸿巢付款单(供应链费用退款)集成。 #### 接口调用配置 首先,我们需要配置元数据以正确调用钉钉接口。以下是元数据配置的关键字段及其作用: - `api`: 接口路径,`v1.0/yida/processes/instances` - `method`: 请求方法,`POST` - `pagination`: 分页配置,`pageSize`设置为100 - `idCheck`: 是否进行ID检查,设置为`true` 请求参数部分: ```json [ {"field":"pageSize","label":"分页大小","type":"string","describe":"分页大小","value":"50"}, {"field":"pageNumber","label":"分页页码","type":"string","describe":"分页页码","value":"1"}, {"field":"appType","label":"应用ID","type":"string","describe":"应用ID","value":"APP_WTSCMZ1WOOHGIM5N28BQ"}, {"field":"systemToken","label":"应用秘钥","type":"string","describe":"应用秘钥","value":"IS866HB1DXJ8ODN3EXSVD750RBTK2X72R8MELL4"}, {"field":"userId","label":"用户的userid","type":"string","describe":"用户的userid","value":"16000443318138909"}, {"field":"language","label":"语言","type":"string","describe":"语言,取值:zh_CN:中文(默认值)en_US:英文"}, {"field":"formUuid","label":"表单ID","type":"string","describe":"表单ID","value":"FORM-UX866Q61RUV939TLEWG9H4HX25523ZRQNXLGLW"}, {"field": "searchFieldJson", "label": "条件", "type": "object", "children": [ {"field": "selectField_lgm25d98", "label": "费用分类", "type": "array", "value": "供应链费用退款"}, {"parent": "searchFieldJson", "label": "流水号", "field": "serialNumberField_lgm25d8r", "type": "string"}, {"parent": "searchFieldJson", "label": "申请人", "field": "textField_lgm25d8t", "type": "string"} ]}, {"field": "createFromTimeGMT", "label": "创建时间起始值", "type": "string", "describe": "创建时间起始值", "value": "_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00')" }, {"field": "createToTimeGMT", "label": "创建时间终止值", "type": "string", "describe": "创建时间终止值", "value": "{{CURRENT_TIME|datetime}}" }, {"field": "modifiedFromTimeGMT", "label": "修改时间起始值", "type": "string", "describe": "", "value":"", }, {"field": "modifiedToTimeGMT", "label": "修改时间终止值", "type": "string", "describe": "", "value":"", }, { ``` #### 数据请求与清洗 在请求数据时,我们需要确保请求参数的准确性和完整性。通过POST方法发送请求,并使用上述配置中的参数来获取所需的数据。以下是一个示例请求体: ```json { "pageSize": 50, "pageNumber": 1, ... } ``` 接收到的数据可能包含多个字段,我们需要对这些数据进行清洗和筛选。例如,只保留与“供应链费用退款”相关的数据,并过滤掉无关信息。 #### 数据转换与写入 在清洗完数据后,需要将其转换为目标系统所需的格式。这个过程可能涉及字段映射、数据类型转换等操作。例如,将钉钉返回的JSON格式数据转换为供应商对账系统所需的XML或CSV格式。 最后,将处理后的数据写入目标系统。这一步通常通过API调用或数据库操作来完成。 #### 实例状态监控 为了确保整个过程的顺利进行,我们可以利用轻易云平台提供的实时监控功能,跟踪每个实例的状态。如果出现错误,可以及时进行调试和修复。 通过以上步骤,我们成功实现了从钉钉接口获取并加工数据,以满足供应商对账系统需求。在实际操作中,根据具体业务需求调整参数和处理逻辑,可以进一步优化集成效果。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/S27.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入MySQLAPI接口 在数据集成生命周期的第二步中,关键任务是将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,并将其转为目标平台 MySQLAPI 接口所能够接收的格式,最终写入目标平台。以下将详细探讨如何利用轻易云数据集成平台完成这一过程。 #### 数据请求与清洗 首先,我们需要从源系统中提取数据,并进行必要的清洗和预处理。假设我们已经完成了这一步,接下来我们重点关注如何将这些清洗后的数据进行转换和写入 MySQL。 #### 数据转换与写入 在轻易云数据集成平台中,我们可以通过配置元数据来定义数据转换和写入的规则。以下是一个典型的元数据配置示例: ```json { "api": "executeReturn", "method": "POST", "idCheck": true, "request": [ { "field": "main_params", "label": "主参数", "type": "object", "children": [ {"field": "serial_number", "label": "流水号", "type": "string", "value": "{serialNumberField_lgm25d8r}", "parent": "main_params"}, {"field": "applicant", "label": "申请人", "type": "string", "value": "{textField_lgm25d8p}", "parent": "main_params"}, {"field": "applicant_dept", "label": "申请部门", "type": "string", "value": "{selectField_lgm25d8q}", "parent": "main_params"}, {"field": "budget_dept", "label":"预算部门","type":"string","value":"{selectField_lgm25d99}","parent":"main_params"}, {"field":"budget_month","label":"预算月份","type":"string","value":"{textField_lgm25d9a}","parent":"main_params"}, {"parent":"main_params","label":"费用类型","field":"cost_type","type":"string","value":"{selectField_lgm25d98}"}, {"field":"remark","label":"备注","type":"string","value":"{textareaField_lgn3hejg}"}, {"field":"supplier_name","label":"供应商名称","type":"string","value":"{selectField_lgm25d9g}"}, {"field":"supplier_code","label":"供应商编码","type":"string","value":"{textField_lgm25d9i}"}, {"field":"account_name","label":"供应商账户","type":"string","value":"{selectField_lgn3hekc}"}, {"field":"bank","label":"开户行","type":"string","value":"{selectField_lgn3heke}"}, {"field":"account","label":"供应商账号","type":"string","value":"{selectField_lgn3hekf}"}, {"field":"payable_amount","label":"应付金额","type":"float","value":"{numberField_lgn3hel6}"}, {"field':'commission','label':'手续费合计','type':'float','value':'{numberField_lgn3hel7}'}, {"field':'pay_amount','label':'实付金额','type':'float','value':'{numberField_lgn3hel9}'}, {"field':'payorg','label':'付款组织','type':'string','value':'{textField_lgn3hekn}'}, {"field':'pay_date','label':'支付时间','type':'datetime','value':'_function FROM_UNIXTIME( ( {dateField_lgn3hela} \/ 1000 ) ,'%Y-%m-%d' )'}, {"field':'real_pay_date','label':'实际支付时间','type':'datetime','value':'_function FROM_UNIXTIME( ( {dateField_lgn3helb} \/ 1000 ) ,'%Y-%m-%d' )'}, {"field': 'bill_no', 'label': '台账编号', 'type': 'string', 'value': 'test1'}, {"field': 'create_time', 'label': '创建时间', 'type': 'datetime', 'value': '_function DATE_FORMAT('{gmtCreate}','%Y-%m-%d 00:00:00')'}, {"field': 'settle_org', 'label': '结算组织', 'type': 'string', 'value': '{{tableField_lgm25d9j.textField_lgm25d9w}}'} ] }, { ... } ], ... } ``` 上述配置定义了主参数`main_params`,其中包含多个字段如流水号、申请人、申请部门等。这些字段会被映射到相应的数据源字段,并在后续步骤中被用来生成 SQL 插入语句。 #### SQL 插入语句生成 为了将转换后的数据写入 MySQL,我们需要生成相应的 SQL 插入语句。以下是主表和扩展表的插入语句示例: ```sql INSERT INTO `lhhy_srm`.`supplier_payment_bill` (`serial_number`, `applicant`, `applicant_dept`, `cost_type`, `budget_dept`, `budget_month`, `remark`, `supplier_name`, `supplier_code`, `account_name`, `bank`, `account`, `payable_amount`, `commission`, `pay_amount`, `payorg`, `pay_date`, `real_pay_date`, `bill_no`, `create_time`, `settle_org`) VALUES (<{serial_number: }>, <{applicant: }>, <{applicant_dept: }>, <{cost_type: }>, <{budget_dept: }>, <{budget_month: }>, <{remark: }>, <{supplier_name: }>, <{supplier_code: }>, <{account_name: }>, <{bank: }>, <{account: }>, <{payable_amount: }>, <{commission: }>, <{pay_amount: }>, <{payorg: }>, <{pay_date: }>, <{real_pay_date: }>, <{bill_no: }>, <{create_time: }>, <{settle_org: }>); INSERT INTO `lhhy_srm`.`supplier_payment_bill_cost_detail` (`order_id`, `serial_number`, `bill_no`, `cost_class`, `cost_item`, `cost_undertake_dept`,`cost_undertake_org`,`amount`,`commission`,`purpose`,`cost_undertake_dept_code`,`cost_undertake_org_code`,`purpose_code`,`create_time`) VALUES (<{lastInsertId: }>,<{serial_number: }>,<{bill_no: }>,<{cost_class: }>,<{cost_item: }>,<{cost_undertake_dept :} >,<{cost_undertake_org :}> ,<{amount :}> ,<{commission :}> ,<{purpose :}> ,<{cost_undertake_dept_code :}> ,<{ cost_undertake_org_code :}> ,< { purpose_code :}> ,< { create_time :}>); ``` 这些 SQL 插入语句会在 ETL 流程中被执行,将转换后的数据写入 MySQL 数据库。 #### 执行 API 请求 最后,通过调用 API 接口,将生成的 SQL 插入语句发送到目标 MySQL 数据库。以下是 API 请求示例: ```json { api:"executeReturn", method:"POST", idCheck:true, request:[ { field:"main_sql", label:"主语句", type:"string", value:"INSERT INTO..." }, { field:"extend_sql_1", label:"1:1扩展语句", type:"string", value:"INSERT INTO..." } ], } ``` 通过这种方式,可以确保所有的数据都按照预期格式被写入目标数据库。 综上所述,通过轻易云数据集成平台,我们可以高效地完成从源系统到目标 MySQL 平台的数据 ETL 转换和写入过程。这个过程不仅保证了数据的一致性和完整性,还提高了整体业务流程的透明度和效率。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/T10.png~tplv-syqr462i7n-qeasy.image)