ETL转换与钉钉API接口集成技术案例

  • 轻易云集成顾问-曹润

金蝶云星空与钉钉的系统对接集成案例分享:实现高效数据同步

在企业信息化过程中,数据集成是至关重要的一环。本文将分享一个实际运行的技术方案——basic-(新环境)KY长期股权投资者(V4.0),如何通过轻易云数据集成平台,将金蝶云星空的数据无缝集成到钉钉中,并探讨具体的技术实现过程。

接口调用与数据传输

首先,通过金蝶云星空接口ExecuteBillQuery获取所需业务数据。在这个步骤中,我们采用分批次、多线程抓取的方法,以便最大程度地提高数据提取效率。由于金蝶云星空接口存在分页和限流的问题,需要设计合理的参数和重试机制来确保完整性和稳定性。

// Java 代码片段示例
String apiUrl = "https://api.kingdee.com/ExecuteBillQuery";
Map<String, Object> params = new HashMap<>();
params.put("pageNo", currentPage);
params.put("pageSize", pageSize);
HttpResponse response = HttpClient.post(apiUrl, params);

数据转换与格式处理

从金蝶云星空获取的数据需要经过自定义的数据转换逻辑,以适应钉钉接受的数据结构。这一步骤不仅涉及字段映射,还需处理不同系统间可能存在的编码、日期格式等差异。

# Python 代码片段示例
def transform_data(kingdee_data):
    dingding_data = []
    for record in kingdee_data:
        transformed_record = {
            'field1': record['source_field1'],
            'field2': convert_date_format(record['source_field2']),
            # 更多字段映射...
        }
        dingding_data.append(transformed_record)
    return dingding_data

批量写入与实时监控

借助轻易云提供的大量数据快速写入能力,我们将转换后的数据批量导入到钉钉系统中,使用其API v1.0/yida/forms/instances进行表单实例创建。同时,利用集中监控和告警系统,对整个集成过程进行实时跟踪,确保每一条记录都能准确、安全地传输并落地到目标系统。

// 钉钉 API 调用示例 
String ddApiUrl = "https://api.dingtalk.com/v1.0/yida/forms/instances";
for (DingDingData data : dataList) {
    HttpResponse response = HttpClient.post(ddApiUrl, data.toJson());
}

这种全生命周期管理模式,大大提升了业务透明度及运维效率,并有效规避了漏单风险。这套解决方案为企业真实 用友与CRM系统接口开发配置

调用金蝶云星空接口ExecuteBillQuery获取并加工数据

在轻易云数据集成平台中,调用源系统的API接口是数据处理生命周期的第一步。本文将详细探讨如何通过调用金蝶云星空的ExecuteBillQuery接口获取并加工数据。

接口配置与请求参数

首先,我们需要了解如何配置和使用ExecuteBillQuery接口。根据元数据配置,以下是具体的请求参数:

  • api: ExecuteBillQuery
  • method: POST
  • number: FNumber
  • id: FId
  • pagination:
    • pageSize: 10
  • idCheck: true

请求参数包括分页、过滤条件和字段集合等信息。以下是具体的字段及其描述:

  1. Limit

    • label: 最大行数
    • type: string
    • describe: 金蝶的查询分页参数
    • value: {PAGINATION_PAGE_SIZE}
  2. StartRow

    • label: 开始行索引
    • type: string
    • describe: 金蝶的查询分页参数
    • value: {PAGINATION_START_ROW}
  3. TopRowCount

    • label: 返回总行数
    • type: int
    • describe: 金蝶的查询分页参数
  4. FilterString

    • label: 过滤条件
    • type: string
    • describe: 示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=
    • value: FCreateDate>='{{LAST_SYNC_TIME|datetime}}'
  5. FieldKeys

    • label: 需查询的字段key集合
    • type: array
    • describe: 金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber
    • parser:
      • name: ArrayToString
      • params: ","
  6. FormId

    • label: 业务对象表单Id
    • type: string
    • describe: 必须填写金蝶的表单ID如:PUR_PurchaseOrder
    • value: BAS_PreBaseDataTwo

请求示例

基于上述配置,构建一个实际请求示例如下:

{
  "api": "ExecuteBillQuery",
  "method": "POST",
  "params": {
    "Limit": "10",
    "StartRow": "0",
    "TopRowCount": 100,
    "FilterString": "FCreateDate>='2023-01-01'",
    "FieldKeys": ["FPOOrderEntry_FEntryId", "FPurchaseOrgId.FNumber"],
    "FormId": "BAS_PreBaseDataTwo"
  }
}

数据清洗与转换

在获取到原始数据后,需要进行清洗和转换,以便后续的数据处理和分析。以下是一些常见的数据清洗与转换操作:

  1. 数据类型转换:确保所有字段的数据类型一致,例如将日期字符串转换为标准日期格式。
  2. 数据过滤:根据业务需求进一步过滤不需要的数据。
  3. 字段映射:将源系统中的字段映射到目标系统中的相应字段。

例如,对于从金蝶云星空获取到的一条记录,可以进行如下处理:

import datetime

def clean_and_transform(record):
    # 转换日期格式
    record['FCreateDate'] = datetime.datetime.strptime(record['FCreateDate'], '%Y-%m-%d %H:%M:%S')

    # 映射字段名称
    transformed_record = {
        'entry_id': record['FPOOrderEntry_FEntryId'],
        'purchase_org_number': record['FPurchaseOrgId.FNumber'],
        'create_date': record['FCreateDate']
    }

    return transformed_record

# 示例记录
record = {
    'FPOOrderEntry_FEntryId': '12345',
    'FPurchaseOrgId.FNumber': 'ORG001',
    'FCreateDate': '2023-01-01 12:00:00'
}

cleaned_record = clean_and_transform(record)
print(cleaned_record)

通过以上步骤,我们可以确保从金蝶云星空获取的数据经过清洗和转换后,能够无缝对接到目标系统中。

实时监控与调试

在实际操作中,实时监控和调试是确保数据集成过程顺利进行的重要环节。轻易云数据集成平台提供了全透明可视化的操作界面,可以实时监控数据流动和处理状态。

例如,可以通过日志记录每次API调用的请求和响应,以便在出现问题时快速定位和解决:

import logging

logging.basicConfig(level=logging.INFO)

def log_api_call(api_name, request_params, response):
    logging.info(f"API Call to {api_name}")
    logging.info(f"Request Params: {request_params}")
    logging.info(f"Response: {response}")

# 示例API调用日志记录
log_api_call("ExecuteBillQuery", {"Limit": "10", "StartRow": "0"}, {"status": "success"})

通过以上方法,我们可以有效地管理和监控整个数据集成过程,确保每个环节都清晰易懂,并及时发现和解决问题。 打通金蝶云星空数据接口

轻易云数据集成平台ETL转换与写入钉钉API接口技术案例

在数据集成的生命周期中,ETL(Extract, Transform, Load)过程是将源平台的数据转换为目标平台可接收格式的关键步骤。本文将详细探讨如何使用轻易云数据集成平台,将源平台的数据通过ETL转换后,写入钉钉API接口。

钉钉API接口元数据配置解析

在本案例中,我们需要将长期股权投资者的信息从源平台转换并写入钉钉API接口。根据提供的元数据配置,目标平台的API接口为v1.0/yida/forms/instances,请求方法为POST。以下是具体的字段配置:

{
    "api": "v1.0/yida/forms/instances",
    "method": "POST",
    "idCheck": true,
    "request": [
        {"field": "textField_lgg53q3l", "label": "长期股权投资者名称", "type": "string", "value": "{Name}"},
        {"label": "编码", "field": "textField_lgg53q3n", "type": "string", "value": "{Number}"},
        {"label": "类型", "field": "textField_lgg53q3j", "type": "string", "value":"长期股权投资者"},
        {"field": "textField_lhbf2v06", "label":"类型编码","type":"string","value":"BAS_PreBaseDataTwo","default":"BAS_PreBaseDataTwo"}
    ],
    "otherRequest":[
        {"field":"appType","label":"应用编码","type":"string","describe":"应用编码","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:英文","value":"zh_CN"},
        {"field":"formUuid","label":"表单ID","type":"string","describe":"表单ID","value":"FORM-6W9667D1OWS9850AFKPOR7CO1IXA3ZB515GGL11"}
    ]
}

数据转换与写入步骤详解

  1. 提取数据(Extract): 从源平台提取长期股权投资者的数据,包括名称和编码等字段。这些数据通常以JSON格式或其他结构化格式存储。

  2. 数据清洗与转换(Transform): 在这个阶段,需要对提取的数据进行清洗和格式转换,使其符合钉钉API接口要求。例如,将源数据中的Name字段映射到目标字段textField_lgg53q3l,将Number字段映射到textField_lgg53q3n

    {
       "textField_lgg53q3l": "{Name}",
       "textField_lgg53q3n": "{Number}",
       "textField_lgg53q3j": "长期股权投资者",
       "textField_lhbf2v06": {
           "$defaultValue": true,
           "$defaultValueType": {
               "$defaultValueTypeName" : { 
                   "$defaultValueTypeName" : {
                       "$defaultValueTypeName" : {
                           "$defaultValueTypeName" : {
                               "$defaultValueTypeName" : {
                                   "$defaultValueTypeName" : {
                                       "$defaultValueTypeName" : {
                                           "$defaultValueTypeName" : { 
                                               "$defaultValueTypeName" : {
                                                   "$defaultValueTypeName" : { 
                                                       "$defaultValueTypeName" : { 
                                                           "$defaultValueTypeName" : { 
                                                               "$defaultValueTypeName" : { 
                                                                   "$defaultValueTypeName" : { 
                                                                       "$defaultValueTypeName" : { 
                                                                           "$defaultValueTypeName" : { 
                                                                               "$defaultValueTypeName" : { 
                                                                                   ...
                                                                                   }
                                                                               }
                                                                           }
                                                                       }
                                                                   }
                                                               }
                                                           }
                                                       }
                                                   }
                                               }
                                           }
                                       }
                                   }
                               }
                           }
                       }
                   }  
               },
               ...
           },
           ...
       },
       ...
  3. 加载数据(Load): 将清洗和转换后的数据通过HTTP POST请求发送到钉钉API接口。需要注意的是,在发送请求时必须包含必要的认证信息,如应用编码、应用秘钥、用户ID等。

    import requests
    import json
    
    url = 'https://oapi.dingtalk.com/v1.0/yida/forms/instances'
    
    headers = {
       'Content-Type': 'application/json'
    }
    
    payload = {
       'appType': 'APP_WTSCMZ1WOOHGIM5N28BQ',
       'systemToken': 'IS866HB1DXJ8ODN3EXSVD750RBTK2X72R8MELL4',
       'userId': '16000443318138909',
       'language': 'zh_CN',
       'formUuid': 'FORM-6W9667D1OWS9850AFKPOR7CO1IXA3ZB515GGL11',
       'data': [
           {'field': 'textField_lgg53q3l', 'value': source_data['name']},
           {'field': 'textField_lgg53q3n', 'value': source_data['number']},
           {'field': 'textField_lgg53q3j', 'value':'长期股权投资者'},
           {'field':'textField_lhbf2v06','value':'BAS_PreBaseDataTwo'}
       ]
    }
    
    response = requests.post(url, headers=headers, data=json.dumps(payload))
    
    if response.status_code == 200:
       print("Data successfully written to DingTalk API")
    else:
       print(f"Failed to write data: {response.status_code}, {response.text}")

关键技术点总结

  • 字段映射与转换: 确保源数据字段正确映射到目标API接口字段,并进行必要的格式转换。
  • 认证信息配置: 在发送请求时,必须包含所有必要的认证信息,如应用编码、应用秘钥、用户ID等,以确保请求能够被目标平台接受。
  • 错误处理与日志记录: 在实际操作中,应加入错误处理机制和日志记录,以便及时发现并解决问题。

通过上述步骤,我们可以高效地将源平台的数据通过轻易云数据集成平台进行ETL转换,并成功写入钉钉API接口,实现系统间的数据无缝对接。 金蝶与外部系统打通接口

更多系统对接方案