轻易云平台:ETL转换与金蝶云星空数据写入

  • 轻易云集成顾问-胡秀丛

案例分享:钉钉数据集成到金蝶云星空

在本技术案例中,我们将探讨如何通过轻易云数据集成平台,实现钉钉付款申请单与金蝶云星空差旅费报销单的无缝对接。在实际操作过程中,面临着多种技术挑战,例如确保数据不漏单、大量数据的快速写入、定时可靠的数据抓取等。

首先,为了从钉钉系统中获取付款申请单的数据,我们使用了topapi/processinstance/get API接口。该接口允许我们查询特定流程实例的信息。为了防止遗漏任何一个付款申请单,我们设计了一套机制来处理分页和限流问题,同时结合实时监控日志记录,以便随时掌握数据流动情况。

其次,在将获得的数据导入到金蝶云星空之前,需要仔细处理两者之间的数据格式差异。例如,钉钉返回的是结构化JSON,而金蝶云星空需要接受符合其数据库规范的格式。因此,我们采用轻易云提供的定制化数据映射功能,将每个字段精确转换。此外,通过批量处理API batchSave,实现高效的大量数据写入,从而提升整体性能。

在整个集成过程中,还必须关注异常处理和错误重试机制。一旦发生网络波动或接口调用失败,可以自动进行错误重试,并详细记录每次操作日志。这不仅确保了系统稳定性,也为后续维护提供了重要依据。

最后,为进一步优化流程,我们设置了定时任务,利用轻易云平台提供的调度能力,每隔一段时间自动抓取最新的数据并执行转换和上传操作。这一切都保证了业务流程的顺畅运行,使得企业能够更加专注于核心运营环节,提高整体生产效率。

如何开发企业微信API接口

调用钉钉接口topapi/processinstance/get获取并加工数据

在数据集成过程中,调用源系统的API接口是关键的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口topapi/processinstance/get来获取并加工数据,以实现付款申请单对接差旅费报销单的业务需求。

API接口配置

首先,我们需要配置元数据以调用钉钉的topapi/processinstance/get接口。以下是元数据配置的详细内容:

{
  "api": "topapi/processinstance/get",
  "effect": "QUERY",
  "method": "POST",
  "number": "number",
  "id": "id",
  "name": "number",
  "idCheck": true,
  "autoFillResponse": true,
  "condition": [
    [
      {
        "field": "单据类型",
        "logic": "eqv2",
        "value": "差旅费报销"
      }
    ]
  ]
}

配置解析

  1. API路径: api字段指定了我们要调用的API路径,即topapi/processinstance/get
  2. 请求方式: method字段定义了请求方式为POST。
  3. 查询条件: condition字段定义了查询条件,这里我们设置了一个条件,要求“单据类型”必须等于“差旅费报销”。
  4. 自动填充响应: autoFillResponse字段设置为true,表示我们希望自动填充响应数据。
  5. ID校验: idCheck字段设置为true,确保每个请求都有唯一的ID进行校验。

数据请求与清洗

在调用API获取数据后,我们需要对返回的数据进行清洗和处理。以下是一个典型的数据清洗流程:

  1. 验证响应: 确保API返回的数据结构符合预期,并检查是否包含所有必要的字段。
  2. 过滤无效数据: 根据业务逻辑过滤掉不符合条件的数据。例如,如果某些记录缺少必要的字段或值不合法,则将其排除在外。
  3. 格式转换: 将数据转换为目标系统所需的格式。这可能包括日期格式转换、数值单位转换等。

数据转换与写入

经过清洗后的数据需要进一步转换并写入目标系统。在本案例中,我们将清洗后的差旅费报销单数据写入金蝶系统。以下是一个简化的示例代码片段,展示如何进行数据转换和写入:

def transform_and_write(data):
    transformed_data = []
    for record in data:
        transformed_record = {
            'BillNumber': record['number'],
            'EmployeeID': record['employee_id'],
            'Amount': float(record['amount']),
            'Date': convert_date_format(record['date'])
        }
        transformed_data.append(transformed_record)

    # 写入金蝶系统
    write_to_kingdee(transformed_data)

def convert_date_format(date_str):
    # 假设输入日期格式为YYYY-MM-DD,目标格式为DD/MM/YYYY
    parts = date_str.split('-')
    return f"{parts[2]}/{parts[1]}/{parts[0]}"

def write_to_kingdee(data):
    # 实现写入金蝶系统的逻辑
    pass

实时监控与错误处理

在整个过程中,实时监控和错误处理至关重要。轻易云平台提供了实时监控功能,可以帮助我们跟踪每个步骤的数据流动和处理状态。一旦出现错误,可以及时捕获并进行处理。例如,如果API调用失败或返回的数据不符合预期,可以记录日志并发送告警通知。

通过以上步骤,我们可以高效地实现付款申请单对接差旅费报销单的数据集成过程,从而提升业务透明度和效率。 如何开发金蝶云星空API接口

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

在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。以下是详细的技术实现步骤。

元数据配置解析

我们使用的元数据配置如下:

{
  "api": "batchSave",
  "effect": "EXECUTE",
  "method": "POST",
  "idCheck": true,
  "request": [
    {"field":"FBillNo","label":"单据编号","type":"string","value":"{{单据编号}}"},
    {"field":"FDate","label":"申请日期","type":"string","value":"{{extend.create_time}}"},
    {"field":"FBillTypeID","label":"单据类型","type":"string","value":"CLFBX001_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FExpenseOrgId","label":"费用承担组织","type":"string","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FExpenseDeptID","label":"费用承担部门","type":"string","value":"{{部门信息TextField-K2AD4O5B}}","parser":{"name":"ConvertObjectParser","params":"FNumber"},"default":"{{部门信息TextField-K2AD4O5B}}"},
    {"field":"FOrgID","label":"申请组织","type":"string","value":"100","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FProposerID","label":"申请人","type":"string","value": "_findCollection find FNumber from ba3a0784-6df8-3184-b7b3-a1e33d754f58 where FName={{联系人}}", "parser":{"name": "ConvertObjectParser", "params": "FSTAFFNUMBER"}},
    {"field": "FRequestDeptID", "label": "申请部门", "type": "string", "value": "{{部门信息TextField-K2AD4O5B}}", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}},
    {"field": "FCONTACTUNITTYPE", "label": "往来单位类型", "type": "string", "value": "_function CASE '{{往来单位类型}}' WHEN '客户' THEN 'BD_Customer' WHEN '供应商' THEN 'BD_Supplier' WHEN '员工' THEN 'BD_Empinfo' WHEN '其他往来单位' THEN 'FIN_OTHERS' ELSE 900 END"},
    {"field": "FCONTACTUNIT", "label": "往来单位", "type": "string", "value": "_function CASE '{{往来单位类型}}' WHEN '客户' THEN '{{【往来单位】客户TextField-K2AD4O5B}}' WHEN '供应商' THEN '{{【往来单位】供应商TextField-K2AD4O5B}}' WHEN '员工' THEN '{{员工信息TextField-K2AD4O5B}}' WHEN '其他往来单位' THEN '{{【往来单位】其他往来单位TextField-K2AD4O5B}}' ELSE 900 END", 
        "parser":{"name" :  "ConvertObjectParser" ,"params" :   "FNumber"}},
    {"field" :  "FCurrencyID" , "label" :   "币别" ,  "type" :    "string" ,  "value" :   "_function CASE '{{币别}}' WHEN '人民币' THEN 'PRE001' WHEN '美元' THEN 'PRE007' ELSE ' ' END",
        "parser":{"name" :  "ConvertObjectParser" ,"params" :   "FNumber"}},
    {"field" :  "FPaySettlleTypeID",    "label" :   "结算方式", "type" :    "string",   "value" :   "JSFS01_SYS",
        "parser":{"name" :  "ConvertObjectParser ","params ":   “FNumber”}},
    {"field ":" FExchangeTypeID ",“ label ":" 汇率类型 ",“ type ":" string ",“ value ":" HLTX01_SYS ",
     “ parser ":{" name ":" ConvertObjectParser "," params ":" FNumber “}},
    {“ field ”:“ FCausa ”,“ label ”:“事由”,“ type ”:“ string ”,“ value ”:“ {{付款用途 }}”},
    {“ field ”:“ FRealPay ”,“ label ”:“实报实付”,“ type ”:“ string ”,“ value ”:“ 1 “},

   {“ field” :“ FEntity”,“ label” :“报销明细”,“ type” :“ array”,“ value” :“表格”,“ children” :[
        {“ field” :“ FExpID”,“ label” :“费用项目”,“ type” :“ string”,“ value” :“ {{表格.费用项目信息TextField-K2AD4O5B }}”,
         “ parser”:{“ name”: “ ConvertObjectParser”, “ params”: “ FNumber “}},
        {“ field” :“ FInvoiceType”,“ label” :“发票类型”,“ type” :“ string”,“ value” : “ 1 “},
        {“ field” :“ FTravelStartDate”,“ label” : “开始日期”,“ type”: “ string”, “ value”: “ {{表格.开始日期 }}”},
        {“ field”: “ FTravelEndDate”, “ label”: “结束日期”, “ type”: “ string”, “ value”: “ {{表格.结束日期 }}”},
        {“ field”: “ FTravelStartSite”, “ label”: “出发地”,
         ……
      ]}
   ],
   otherRequest: [
      {
         field: FormId,
         label:业务对象表单Id,
         type:string,
         describe:必须填写金蝶的表单ID如:PUR_PurchaseOrder,
         value:ER_ExpReimbursement_Travel
      },
      {
         field: Operation,
         label:执行的操作,
         type:string,
         describe:执行的操作,
         value:BatchSave
      },
      {
         field:IsAutoSubmitAndAudit,
         label:提交并审核,
         type:bool,
         describe:提交并审核,
         value:false
      },
      {
          field:IsVerifyBaseDataField ,
          label:验证基础资料 ,
          type:bool ,
          describe:是否验证所有的基础资料有效性,布尔类,默认false(非必录) ,
          value:false 
       }
   ],
   operation:{
       rowsKey:"array",
       rows:1,
       method:"batchArraySave"
   }
}

数据转换与写入步骤

  1. 字段映射与解析

    • FBillNoFDate等字段直接从源数据中提取。
    • FBillTypeIDFExpenseOrgId等字段需要通过ConvertObjectParser进行解析。
    • 特殊字段如FProposerID通过查找集合中的匹配项进行转换。
  2. 条件判断与函数调用

    • FCurrencyIDFCONTACTUNITTYPE等字段通过条件判断和函数调用实现动态映射。例如,币别为人民币时映射为PRE001
  3. 数组处理

    • 报销明细部分(即FEntity)为数组,需要逐个处理每个子字段,如费用项目、发票类型等。

示例代码

以下是一个示例代码片段,用于将源数据转换为目标格式,并通过API接口写入金蝶云星空:

import requests

# 源数据示例
source_data = {
    # 源数据内容...
}

# 转换后的目标数据结构
target_data = {
    # 根据元数据配置生成...
}

# API请求头和URL
headers = {
    'Content-Type': 'application/json',
}
url = 'https://api.kingdee.com/batchSave'

# 发起POST请求
response = requests.post(url, json=target_data, headers=headers)

if response.status_code == 200:
    print("数据成功写入金蝶云星空")
else:
    print(f"写入失败,错误码:{response.status_code}")

注意事项

  • 确保所有必填字段都已正确映射和解析。
  • 在实际操作中,需要根据具体业务需求调整字段映射和解析逻辑。
  • 实时监控API请求结果,以便及时处理可能出现的问题。

通过上述步骤,我们可以高效地将源平台的数据经过ETL转换后写入到金蝶云星空,实现不同系统间的数据无缝对接。 金蝶与CRM系统接口开发配置

更多系统对接方案