使用轻易云平台实现钉钉与金蝶云的数据无缝对接

  • 轻易云集成顾问-卢剑航

钉钉数据集成到金蝶云星空案例解析:门店水电报销单【有借支】-->费用报销单

在系统对接与数据集成过程中,如何高效、可靠地将源系统的数据准确传输至目标平台是每个项目实施的关键。本文分享一个实际操作案例,通过轻易云数据集成平台实现了钉钉和金蝶云星空两个系统之间的无缝衔接,将钉钉上提交的门店水电报销单(含有借支情况)成功转换并存储到金蝶云星空中的费用报销单中。

钉钉数据获取及API调用

首先,我们需要从钉钉中抓取门店水电报销单数据。为了确保获取的数据完整且不漏单,我们使用了定时任务来周期性调用topapi/processinstance/get接口,从而稳定、可靠地获得最新提交的数据。在处理过程中需特别注意分页和限流问题,以避免请求失败或丢失部分重要信息。

def fetch_dingtalk_data():
    # 调用topapi/processinstance/get接口代码示例
    url = "https://oapi.dingtalk.com/topapi/processinstance/get"
    params = {
        'process_instance_id': '<your_process_instance_id>',
        'access_token': '<your_access_token>'
    }

    response = requests.get(url, params=params)

    if response.status_code == 200:
        data = response.json()
        return data['result']
    else:
        handle_error(response)

该段代码展示了如何通过API接口有效抓取所需的数据,并引入错误处理逻辑以应对各种可能的异常情况。这些步骤使得整个数据采集过程更加健壮。

数据格式转换及处理

不同系统之间常常存在着较大的数据格式差异。在本次集成案例中,为保证能够顺利将从钉钉获取的数据导入至金蝶云星空,我们需要进行必要的数据预处理和格式转换。其中包括字段映射、单位统一以及可能涉及的复杂业务规则应用等。

def transform_data(dingtalk_data):
    # 示例:将原始字段名映射为目标系统需求字段名
    transformed_data = {
        'expense_item_name': dingtalk_data['item_name'],
        'amount': dingtalk_data['cost'],
        'store_id': dingtalk_data['location']['store_no'],
        'date_time': convert_date_format(dingtalk_data['timestamp']),

...
       return transformed_data

def convert_date_format(timestamp):
     # 日期格式转换函数示例
     new_format_date = datetime.strptime(timestamp, '%Y-%m-%dT%H:%M:%SZ
![用友与WMS系统接口开发配置](https://pic.qeasy.cloud/D16.png~tplv-syqr462i7n-qeasy.image)
### 调用钉钉接口topapi/processinstance/get获取并加工数据

在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`,并对获取的数据进行加工处理,以实现从钉钉到金蝶的费用报销单集成。

#### 接口概述

钉钉接口`topapi/processinstance/get`用于获取指定审批实例的详细信息。该接口采用POST请求方式,主要参数包括审批实例ID等。以下是元数据配置:

```json
{
  "api": "topapi/processinstance/get",
  "effect": "QUERY",
  "method": "POST",
  "number": "name",
  "id": "id",
  "idCheck": true,
  "autoFillResponse": true
}

数据请求与清洗

首先,通过轻易云平台配置API调用,确保能够正确获取所需的审批实例数据。以下是具体步骤:

  1. 配置API调用: 在轻易云平台中,创建一个新的API调用任务,并根据元数据配置填写相关参数。

    {
     "api": "/topapi/processinstance/get",
     "method": "POST",
     "params": {
       "process_instance_id": "<审批实例ID>"
     }
    }
  2. 发送请求: 使用POST方法发送请求,并确保返回的数据结构符合预期。

  3. 数据清洗: 获取的数据可能包含多余或不必要的信息,需要进行清洗。例如,只保留与费用报销相关的字段,如申请人、金额、报销项目等。

数据转换与写入

在完成数据清洗后,需要将其转换为目标系统(如金蝶)所需的格式,并写入目标系统。以下是具体步骤:

  1. 数据映射: 根据金蝶费用报销单的字段要求,将钉钉返回的数据进行映射。例如,将“申请人”映射为“报销人”,将“金额”映射为“报销金额”。

  2. 格式转换: 将清洗后的JSON数据转换为金蝶系统所需的XML或其他格式。

  3. 写入目标系统: 调用金蝶系统的API,将转换后的数据写入。例如,可以使用金蝶提供的费用报销单创建接口。

实际案例

假设我们需要将一个门店水电报销单从钉钉集成到金蝶,以下是具体操作步骤:

  1. 获取审批实例ID: 从钉钉中获取待处理的审批实例ID,例如1234567890

  2. 调用API获取数据

    {
     "api": "/topapi/processinstance/get",
     "method": "POST",
     "params": {
       "process_instance_id": "1234567890"
     }
    }
  3. 清洗和转换数据

    {
     "applicant_name": "<申请人>",
     "amount": "<金额>",
     ...
    }
  4. 写入金蝶系统

    <ExpenseReport>
       <ApplicantName>张三</ApplicantName>
       <Amount>1000</Amount>
       ...
    </ExpenseReport>

通过上述步骤,我们成功地将一个门店水电报销单从钉钉集成到了金蝶,实现了跨系统的数据无缝对接。这一过程充分利用了轻易云平台的全生命周期管理和异构系统集成能力,大大提升了业务效率和透明度。 如何开发企业微信API接口

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

在数据集成生命周期的第二阶段,我们将已经从源平台(如钉钉)获取并清洗后的数据,通过ETL(Extract, Transform, Load)过程转换为目标平台(金蝶云星空)所能接受的格式,并最终写入目标系统。本文将详细介绍如何利用轻易云数据集成平台进行这一过程,特别是如何配置元数据以实现与金蝶云星空API接口的无缝对接。

配置元数据

元数据配置是整个ETL过程的核心,它定义了如何将源数据映射到目标系统所需的数据格式。在本案例中,我们需要将钉钉的门店水电报销单【有借支】的数据转换为金蝶云星空费用报销单的数据格式。以下是具体的元数据配置:

{
  "api": "batchSave",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "method": "batchArraySave",
    "rows": 1,
    "rowsKey": "array"
  },
  "request": [
    {"field":"FBillNo","label":"单据编号","type":"string","value":"{{extend.business_id}}"},
    {"field":"FDate","label":"申请日期","type":"string","value":"{{备用金报销明细.费用发生日期}}"},
    {"field":"FBillTypeID","label":"单据类型","type":"string","value":"FYBXD001_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FExpenseOrgId","label":"费用承担组织","type":"string","value":"{{企业主体}}","parser":{"name":"ConvertObjectParser","params":"FNumber"},"mapping":{"target":"6577ba6af82ea526c578f93c","direction":"positive"}},
    {"field":"FExpenseDeptID","label":"费用承担部门","type":"string","value":"_findCollection find FNumber from da721f4d-6c26-3cce-913a-95995e34543f where FName={{extend.originator_dept_name}} FFullName={{企业主体}}","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FOrgID","label":"申请组织","type":"string","value":"{{企业主体}}","parser":{"name":"ConvertObjectParser","params":"FNumber"},"mapping":{"target":"6577ba6af82ea526c578f93c","direction":"positive"}},
    {"field":"FProposerID","label":"申请人","type":"string","value":"_findCollection find FNumber from 16c4e534-8d99-371a-bd8f-92c5149c9b1f where FName={{收款人}} and FUseOrgId_FName={{企业主体}}", "parser":{"name": "ConvertObjectParser", "params": "FSTAFFNUMBER"}},
    {"field": "FCONTACTUNITTYPE", "label": "往来单位类型", "type": "string", "value": "BD_Empinfo"},
    {"field": "FRequestDeptID", "label": "申请部门", "type": "string", "value": "_findCollection find FNumber from da721f4d-6c26-3cce-913a-95995e34543f where FName={{extend.originator_dept_name}} FFullName={{企业主体}}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}},
    {"field": "FCONTACTUNIT", "label": "往来单位", "type": "string", 
"value" : "_findCollection find FNumber from 16c4e534-8d99-371a-bd8f-92c5149c9b1f where FName={{收款人}} and FUseOrgId_FName={{企业主体}}", 
"parser" : { 
"name" : 
"ConvertObjectParser" , 
"params" : 
"FNumber" }},
{"field" : 
"FContactPhoneNo" , 
"label" : 
"联系电话" , 
"type" : 
"string" , 
"value" : "_findCollection find FMobile from 16c4e534-8d99-371a-bd8f-92c5149c9b1f where FName={{收款人}} and FUseOrgId_FName={{企业主体}}" },
{"field" : 
"FCausa" , 
"label" : 
"事由" , 
"type" : 
"strings
"value
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" },
{"field
: {{备用金报销明细.费用说明}}" }

数据字段解析与映射

在上述配置中,使用了多个字段解析器(parsers)和查找集合(findCollection),这些工具帮助我们将源系统中的字段值转换为目标系统中所需的格式。例如:

  1. 字段解析器ConvertObjectParser用于将字符串值转换为目标系统所需的编码。例如,将FBillTypeID从字符串FYBXD001_SYS转换为相应的编码。
  2. 查找集合:通过_findCollection语法,可以在特定集合中查找匹配项,并返回相应的值。例如,查找申请人的编号时,使用了如下语法:
    {
     ...
     {"field": "_findCollection find FNumber from 16c4e534-8d99-371a-bd8f-92c5149c9b1f where FName={{收款人}} and FUseOrgId_FName={{企业主体}}"}
     ...
    }

数据结构与子对象

在处理复杂的数据结构时,例如包含子对象或数组的数据,我们可以使用嵌套结构来定义这些关系。在本案例中,FEntity字段定义了一个数组,其中包含多个子对象,这些子对象代表每一条具体的报销明细:

{
  ...
  {
    field: 'FEntity',
    label: '报销明细',
    type: 'array',
    value: '备用金报销明细',
    children: [
      {
        field: 'FExpID',
        label: '费用项目',
        type: 'string',
        value: '_function CASE \'{{项目}}\' WHEN \'水电费\' THEN \'CI030\' ELSE \'CI114\' END',
        parser: { name: 'ConvertObjectParser', params: 'FNumber' }
      },
      ...
      {
        field:'FEntity_Link',
        label:'关联关系表',
        type:'array',
        children:[
          {
            field:'FEntity_Link_FRuleId',
            label:'转换规则',
            type:'string',
            value:'ER_ExpRequestToExpReimb'
          },
          ...
        ]
      }
    ]
  }
}

通过这种嵌套结构,我们能够确保每个子对象都被正确地映射和处理。

执行操作

最后,我们需要定义执行操作和其他请求参数,以确保数据能够正确提交到目标系统。以下是相关配置:

{
  ...
  {
    field:"FormId",
    label:"业务对象表单Id",
    type:"string",
    describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder",
    value:"ER_ExpReimbursement"
  },
  {
    field:"Operation",
    label:"执行的操作",
    type:"string",
    value:"BatchSave"
  },
  {
    field:"IsAutoSubmitAndAudit",
    label:"提交并审核",
    type:"bool",
    value:"true"
  },
  {
     field:"IsVerifyBaseDataField",
     label:"验证基础资料",
     type:"bool",
     describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)",
     value:"false"
   }
}

这些参数确保了在提交数据时,系统会自动进行审核,并且不需要验证所有基础资料。

通过上述步骤和配置,我们可以实现从钉钉到金蝶云星空的数据无缝对接,并确保每个字段都被正确地映射和转换。这种方法不仅提高了数据处理效率,还保证了数据的一致性和准确性。 钉钉与ERP系统接口开发配置

更多系统对接方案