ETL全流程:从钉钉数据到MySQL的集成方案

  • 轻易云集成顾问-彭萍

钉钉数据集成到MySQL的技术案例分享

在现代供应链管理中,及时、准确且高效的数据对接至关重要。本次我们将介绍如何通过轻易云数据集成平台,将钉钉中的鸿巢付款单(供应商对账系统)数据高效集成到MySQL数据库中,以实现支付信息的全面透明和快速处理。

首先,我们利用钉钉提供的API接口v1.0/yida/processes/instances从特定业务流程中抓取相关支付单据。为了确保不漏单,采用了定时调度机制,每小时调用一次API进行增量抓取,有效解决了遗漏问题。此外,通过分页策略以及限流控制来应对大规模数据同步需求。

获取的数据经过初步清洗后,需要被批量写入到MySQL环境。这一过程中,使用轻易云的平台自定义转换逻辑,针对性地处理因接口之间存在的数据格式差异。每条记录均通过平台预先配置好的映射规则,实现精准存储。

为保障整个过程的稳定性与可靠性,此方案还重点设计了异常处理与错误重试机制。一旦某批次写入失败或出现异常,可自动触发重试逻辑并生成日志记录,同时实时更新监控页面,使管理员能够迅速察觉并响应潜在的问题。

此外,为提升性能和扩展能力,这套方案采用分布式架构以支持高吞吐量的数据写入能力,并借助集中化的监控系统实施全程跟踪。所有这些措施共同确保从获取钉钉付款单据到最终落地于MySQL库,每一步都可以做到稳健、高效、不出错。在下一部分文章中,我们将详细探讨具体实现过程及关键技术细节。 金蝶云星空API接口配置

调用钉钉接口获取并加工数据的技术实现

在数据集成生命周期的第一步,我们需要调用源系统钉钉接口v1.0/yida/processes/instances来获取数据,并进行初步加工。本文将详细探讨这一过程中的技术细节,重点关注API接口的使用和数据处理。

API接口配置与调用

首先,我们需要配置API接口的元数据,以便正确地调用钉钉的v1.0/yida/processes/instances接口。以下是元数据配置的关键部分:

{
  "api": "v1.0/yida/processes/instances",
  "method": "POST",
  "number": "title",
  "id": "processInstanceId",
  "pagination": {
    "pageSize": 100
  },
  "idCheck": true,
  "request": [
    {"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":
        "修改时间起始值"
    },
    {"field":
        "modifiedToTimeGMT",
        "label":
        "修改时间终止值",
        "type":
        "string",
        "describe":
        "修改时间终止值"
    },
    {"field":
           taskId,
           label:
           任务ID,
           type:
           string,
           describe:
           任务ID
       },
       {
        field:
        instanceStatus,
        label:
          实例状态,
        type:
        string,
        describe:
          实例状态,
        value:
          COMPLETED
       },
       {
        field:
          approvedResult,
        label:
          流程审批结果,
        type:
        string,
        describe:
          流程审批结果,
        value:
          agree
       }
   ],
   condition:[
   []
 ]
}

数据请求与清洗

在调用API时,我们需要发送一个POST请求,其中包含多个参数。这些参数包括分页大小、页码、应用ID、应用秘钥、用户ID、语言、表单ID以及搜索条件等。以下是一个示例请求体:

{
  pageSize: '50',
  pageNumber: '1',
  appType: 'APP_WTSCMZ1WOOHGIM5N28BQ',
  systemToken: 'IS866HB1DXJ8ODN3EXSVD750RBTK2X72R8MELL4',
  userId: '16000443318138909',
  language: 'zh_CN',
  formUuid: 'FORM-UX866Q61RUV939TLEWG9H4HX25523ZRQNXLGLW',
  searchFieldJson: {
    selectField_lgm25d98: ['供应链款项'],
    serialNumberField_lgm25d8r: '',
    textField_lgm25d8t: ''
  },
  createFromTimeGMT: '_function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),\'%Y-%m-%d 00:00:00\')',
  createToTimeGMT: '{{CURRENT_TIME|datetime}}',
  modifiedFromTimeGMT: '',
  modifiedToTimeGMT: '',
  taskId: '',
  instanceStatus: 'COMPLETED',
  approvedResult: 'agree'
}

通过上述请求,我们可以从钉钉系统中获取到符合条件的数据实例。

数据转换与写入

在获取到原始数据后,需要对其进行清洗和转换,以便后续写入目标系统。在这个过程中,我们可以利用轻易云平台提供的数据处理功能,对数据进行格式化、字段映射和过滤等操作。例如:

def clean_data(raw_data):
    cleaned_data = []

    for item in raw_data['data']:
        cleaned_item = {
            'title': item['title'],
            'processInstanceId': item['processInstanceId'],
            'createdAt': item['createTime'],
            'status': item['status']
            # 添加更多字段映射和转换逻辑
        }

        cleaned_data.append(cleaned_item)

    return cleaned_data

# 假设raw_data是从API获取到的原始数据
cleaned_data = clean_data(raw_data)

通过上述代码,我们可以将原始数据转换为目标系统所需的格式,并进一步处理。

总结

通过调用钉钉接口v1.0/yida/processes/instances,我们能够高效地获取并加工所需的数据。本文详细介绍了API接口配置、数据请求与清洗以及数据转换与写入的技术细节,为实现不同系统间的数据无缝对接提供了坚实基础。 如何开发钉钉API接口

轻易云数据集成平台生命周期第二步:ETL转换与数据写入

在数据集成过程中,ETL(Extract, Transform, Load)是关键的一环。本文将深入探讨如何使用轻易云数据集成平台,将源平台的数据转换为目标平台 MySQL API 接口所能接收的格式,并最终写入目标数据库。

元数据配置解析

在进行ETL转换之前,我们需要理解元数据配置的结构。以下是一个典型的元数据配置示例:

{
  "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", ...},
        ...
      ]
    },
    {
      ...
    }
  ],
  ...
}

数据请求与清洗

在生命周期的第一步中,已经从源系统获取了原始数据,并进行了初步清洗。此时,我们需要将这些清洗后的数据按照目标平台的要求进行转换。

数据转换与写入

  1. 主参数处理

    主参数部分包含了付款单的基本信息,如流水号、申请人、预算部门等。这些字段需要根据源系统的数据进行映射和转换。例如:

    {
     ...
     {"field":"serial_number","label":"流水号","type":"string","value":"{serialNumberField_lgm25d8r}","parent":"main_params"},
     {"field":"applicant","label":"申请人","type":"string","value":"{textField_lgm25d8p}","parent":"main_params"},
     ...
    }

    在实际操作中,我们需要确保这些字段的数据类型和格式符合目标平台的要求。例如,将日期字段从Unix时间戳转换为MySQL支持的日期格式:

    {
     ...
     {"field":"pay_date","label":"支付时间","type":"datetime","value":"_function FROM_UNIXTIME(  ( {dateField_lgn3hela} \/ 1000 )  ,'%Y-%m-%d' )"},
     ...
    }
  2. 扩展参数处理

    扩展参数部分通常用于记录详细的费用信息,如费用类别、费用项目、金额等。这些字段同样需要进行映射和转换:

    {
     ...
     {"field":"cost_class","label":"费用类别","type":"string","value":"{{tableField_lgm25d9j.selectField_lgm25d9l}}","parent":"extend_params_1"},
     {"field":"amount","label":"金额","type":"string","value":"{{tableField_lgm25d9j.numberField_lgm25d9r}}"},
     ...
    }
  3. SQL语句生成

    转换后的数据需要通过SQL语句写入到MySQL数据库中。主表和扩展表分别对应不同的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 :}>);

通过上述步骤,我们可以将源系统的数据成功转换并写入到目标MySQL数据库中。每个字段都需要仔细映射和验证,以确保数据的一致性和完整性。

实际应用案例

在实际应用中,某供应商对账系统需要将其付款单信息集成到鸿巢付款单系统中。通过轻易云数据集成平台,我们首先从供应商对账系统提取付款单信息,然后按照上述步骤进行ETL转换,最终将数据写入鸿巢付款单系统的MySQL数据库中。

例如,对于一个具体的付款单,其流水号为123456789,申请人为张三,应付金额为10000.00元。在ETL过程中,我们会将这些信息按照元数据配置中的映射关系进行转换,并生成相应的SQL插入语句,将其写入到目标数据库中。

通过这种方式,可以实现不同系统间的数据无缝对接,提高业务处理效率和准确性。 泛微OA与ERP系统接口开发配置

更多系统对接方案