全面解析钉钉数据整合到金蝶云星空的关键技术

  • 轻易云集成顾问-姚缘

Ioan_新借款单(费用申请单)V4.0:钉钉数据集成到金蝶云星空的技术实现

在实际业务环境中,如何高效地将钉钉中的各类申请表、审批记录等数据集成到企业内部系统,如金蝶云星空,是每个信息化管理团队急需解决的问题。本文将详细探讨Ioan_新借款单(费用申请单)V4.0方案的具体实施过程,包括API接口调用、数据转换和异常处理等关键技术要点。

首先,我们使用了钉钉的数据获取API v1.0/yida/processes/instances 定时可靠地抓取最新的申请单据,通过轻易云数据集成平台支持自定义的数据转换逻辑,将这些原始数据进行标准化处理。由于不同系统间存在格式差异,通过平台提供的可视化设计工具,直接在界面上配置并映射两者之间的数据结构,使得复杂的数据转换操作直观且易于管理。

为确保大量数据能够快速和无遗漏地写入金蝶云星空,我们利用其批量写入API batchSave 实现高吞吐量的数据写入能力;这一性能特性不仅提升了整体处理速度,同时保证了业务连续性。此外,为应对钉钉接口可能出现的分页及限流问题,实现了一套完整的分页抓取与重试机制,以确保所有需要同步的信息都能准确无误地传输至目标系统。

实时监控是另一个至关重要的环节。通过集中监控和告警系统,我们能够实时跟踪每次任务执行状态,一旦发现异常情况,立即发出告警信息并启动错误重试机制。这种做法有效避免因临时故障造成的数据丢失或重复,提高整个流程运行的稳定性和可靠性。同时,对于非预期类型或内容格式不符的数据,可以通过事前自定义规则进行质量检测,并自动筛查掉问题条目,从源头上保障最终进入金蝶云星空数据库中的信息准确度。

本篇文章开端即从技术细节切入,为您剖析如何通过优化配对及流线型操作,在短时间内完成两个大型企业应用之间高效安全、灵活可拓展的数据整合任务。接下来我们会逐步深入分析具体步骤,以便更好理解全流程中涉及到的重要技术实现与最佳实践。 金蝶与MES系统接口开发配置

调用钉钉接口获取并加工数据

在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口v1.0/yida/processes/instances来获取并加工数据。

API 接口配置

首先,我们需要了解API接口的基本配置。根据提供的元数据配置,API接口采用POST方法,主要字段如下:

  • api: v1.0/yida/processes/instances
  • method: POST
  • number: title
  • id: processInstanceId
  • idCheck: true

请求参数包含分页信息、应用ID、用户ID、语言、表单ID等。具体字段如下:

[
    {"field":"pageNumber","label":"分页页码","type":"string","describe":"分页页码","value":"{PAGINATION_START_PAGE}"},
    {"field":"pageSize","label":"分页大小","type":"string","describe":"分页大小","value":"{PAGINATION_PAGE_SIZE}"},
    {"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-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF"},
    {"label": "条件", "field": "searchFieldJson", "type": "object", "children": [
        {"parent": "searchFieldJson", "label": "流水号", "field": "serialNumberField_lgek80ou", "type": "string"}
    ]},
    {"field": "originatorId", "label": "根据流程发起人工号查询", "type": "string", "describe": "根据流程发起人工号查询"},
    {"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": 
     ...

数据请求与清洗

在调用API获取数据时,需要特别注意以下几个关键点:

  1. 分页处理:通过pageNumberpageSize字段控制每次请求的数据量,确保能够处理大规模数据。
  2. 时间过滤:使用createFromTimeGMTcreateToTimeGMT字段过滤指定时间范围内的数据。这里使用了函数 _function DATE_FORMAT(DATE_ADD(NOW(),INTERVAL - 25 DAY),'%Y-%m-%d 00:00:00') 来动态计算起始时间。
  3. 状态过滤:通过instanceStatusapprovedResult字段过滤已完成且审批通过的实例。

数据转换与写入

在获取到原始数据后,需要对其进行必要的清洗和转换,以便后续写入目标系统。以下是一些常见的数据清洗操作:

  1. 字段映射:将源系统中的字段映射到目标系统所需的字段。例如,将钉钉中的processInstanceId映射为目标系统中的唯一标识符。
  2. 格式转换:将日期、金额等字段转换为目标系统所需的格式。例如,将日期格式从"yyyy-MM-dd HH:mm:ss"转换为"MM/dd/yyyy"。
  3. 数据过滤:根据业务需求过滤掉不必要的数据。例如,只保留审批通过的记录。

实际案例

假设我们需要集成一个新借款单(费用申请单),以下是具体步骤:

  1. 配置API请求参数

    {
       ...
       {"field": "formUuid", 
        ...
    }
  2. 调用API获取数据

    import requests
    url = 'https://oapi.dingtalk.com/v1.0/yida/processes/instances'
    headers = {'Content-Type': 'application/json'}
    payload = {
       ...
       'formUuid': 'FORM-3C866TC1BRT9L2XMCY5N4DXDM51B2HLXGEEGLF',
       ...
    }
    response = requests.post(url, json=payload, headers=headers)
    data = response.json()
  3. 清洗和转换数据

    cleaned_data = []
    for item in data['data']:
       cleaned_item = {
           'id': item['processInstanceId'],
           'title': item['title'],
           ...
       }
       cleaned_data.append(cleaned_item)
  4. 写入目标系统

    target_url = 'https://target-system/api/write'
    for item in cleaned_data:
       response = requests.post(target_url, json=item, headers=headers)
       if response.status_code != 200:
           print(f'Failed to write item {item["id"]}')

通过上述步骤,我们实现了从钉钉获取新借款单(费用申请单)并将其写入目标系统的全过程。这一过程不仅提高了数据处理效率,还确保了数据的一致性和准确性。 如何对接企业微信API接口

使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口

在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能够接收的格式。本文将详细探讨如何通过轻易云数据集成平台,将源数据转换为金蝶云星空API接口所需的格式,并最终写入目标平台。

配置元数据与API接口

在轻易云数据集成平台中,我们使用以下元数据配置来实现与金蝶云星空API接口的对接:

{
  "api": "batchSave",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "method": "batchArraySave",
    "rows": 1,
    "rowsKey": "array"
  },
  "request": [
    {"field":"FBillNo","label":"单据编号","type":"string","value":"{serialNumberField_lgek80ou}(FYSQ)"},
    {"field":"FDate","label":"日期","type":"string","value":"_function FROM_UNIXTIME( ( {dateField_lgfwstn8} \/ 1000 ) ,'%Y-%m-%d' )"},
    {"field":"FOrgID","label":"申请组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end"},
    {"field":"FStaffID","label":"申请人","type":"string","parser":{"name":"ConvertObjectParser","params":"FSTAFFNUMBER"},"value":"{textField_lhh040dd}"},
    {"field":"FDeptID","label":"申请部门","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{tableField_lgek80p9.textField_lgfwstkz}}"},
    {"field":"FReason","label":"事由","type":"string","value":"{textareaField_lgfwstli}"},
    {"field":"FCurrencyID","label":"币别","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"PRE001"},
    {"field":"FSettleTypeID","label":"结算方式","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"JSFS04_SYS"},
    {"field":"FPayOrgID","label":"付款组织","type":"string","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{textField_lgfwstmo}"},
    {"field\":\"FCostOrgID\",\"label\":\"费用承担组织\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstky}}\"},
    {"field\":\"FCostDeptID\",\"label\":\"费用承担部门\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{{tableField_lgek80p9.textField_lgfwstkz}}\"},
    {"field\":\"FIsBorrow\",\"label\":\"申请借款\",\"type\":\"string\",\"value\":\"true\"},
    {"field\":\"FTOCONTACTUNITTYPE\",\"label\":\"往来单位类型\",\"type\":\"string\",\"value\":\"BD_Empinfo\"},
    {"field\":\"FTOCONTACTUNIT\",\"label\":\"往来单位\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"{textField_lhh040dd}\"},
    {"field\":\"FLocCurrencyID\",\"label\":\"本位币\",\"type\":\"string\",\"parser\":{\"name\":\"ConvertObjectParser\",\"params\":\"FNumber\"},\"value\":\"PRE001\"},
    {"field\": \" FExchangeRate \", \" label \": \" 汇率 \", \" type \": \" string \", \" value \": \" 1 \"},
    {"field\": \" FExchangeTypeID \", \" label \": \" 汇率类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": \" HLTX01_SYS \" },
    {"field\": \" FBillTypeID \", \" label \": \" 单据类型 \", \" type \": \" string \", \" parser \": {\" name \": \" ConvertObjectParser \", \" params \": \" FNumber \" }, \" value \": `` FYSQ001_SYS `` },
    {`` field``:````FBankName``,`` label``:````银行名称``,`` type``:`` `` string ``, `` value ``: `` { select Field _lg fwstmq } `` },
   { `` field ``: `` FBankAcctName ``, `` label ``: `` 账户名 ``, `` type ``: `` string ``, `` value ``: `` { select Field _lg fwstmp } `` },
   { `` field ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``, ``
   {``
   {``
   {``
   {``
   {``
   {``
   {``
   {``
   {
   {
       {
           {
               {
                   {
                       {
                           {
                               {
                                   {
                                       {
                                           {
                                               {
                                                   {
                                                       {
                                                           {
                                                               {
                                                                   {

数据转换与写入过程

  1. 单据编号(FBillNo):使用 {serialNumberField_lgek80ou} 字段生成唯一的单据编号,并附加后缀“(FYSQ)”。

  2. 日期(FDate):通过 _function FROM_UNIXTIME( ( {dateField_lgfwstn8} / 1000 ) ,'%Y-%m-%d' ) 将 Unix 时间戳转换为标准日期格式。

  3. 申请组织(FOrgID):根据 {selectField_lgfwstml} 的值选择相应的组织编码,使用条件表达式 _function case '{selectField_lgfwstml}' when '是' then '{{tableField_lgek80p9.textField_lgfwstky}}' when '否' then '{textField_lgfwstmo}' end

  4. 申请人(FStaffID):直接映射 {textField_lhh040dd} 字段值,并通过 ConvertObjectParser 转换为金蝶系统识别的员工编号。

  5. 申请部门(FDeptID):同样使用 ConvertObjectParser,将 {tableField_lgek80p9.textField_lgfwstkz} 转换为金蝶系统中的部门编号。

  6. 事由(FReason):简单映射 {textareaField_lgfwstli} 字段值。

  7. 币别、结算方式、付款组织、费用承担组织和部门等字段:这些字段均通过 ConvertObjectParser 转换为金蝶系统中的相应编码,如 PRE001、JSFS04_SYS 等。

  8. 明细字段处理:对于数组类型的明细字段,如费用项目(FExpenseItemID)、费用承担部门(FEntryCostDeptID)、金额(FOrgAmount)、备注(FRemark),我们使用嵌套结构进行处理,确保每个子字段都能正确映射和转换。

提交与审核

最后,我们通过设置以下参数实现自动提交并审核:

{
  "FormId": "ER_ExpenseRequest",
  "Operation": "BatchSave",
  "IsAutoSubmitAndAudit": true,
  "IsVerifyBaseDataField": false
}

这些配置确保了数据在写入金蝶云星空后能够自动提交并进行审核,从而简化了流程,提高了效率。

通过上述步骤,我们成功地将源平台的数据转换为金蝶云星空API接口所需的格式,并顺利写入目标平台。这一过程充分展示了轻易云数据集成平台在ETL转换和异构系统集成中的强大能力。 企业微信与OA系统接口开发配置

更多系统对接方案