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

  • 轻易云集成顾问-胡秀丛
### 案例分享:钉钉数据集成到金蝶云星空 在本技术案例中,我们将探讨如何通过轻易云数据集成平台,实现钉钉付款申请单与金蝶云星空差旅费报销单的无缝对接。在实际操作过程中,面临着多种技术挑战,例如确保数据不漏单、大量数据的快速写入、定时可靠的数据抓取等。 首先,为了从钉钉系统中获取付款申请单的数据,我们使用了`topapi/processinstance/get` API接口。该接口允许我们查询特定流程实例的信息。为了防止遗漏任何一个付款申请单,我们设计了一套机制来处理分页和限流问题,同时结合实时监控日志记录,以便随时掌握数据流动情况。 其次,在将获得的数据导入到金蝶云星空之前,需要仔细处理两者之间的数据格式差异。例如,钉钉返回的是结构化JSON,而金蝶云星空需要接受符合其数据库规范的格式。因此,我们采用轻易云提供的定制化数据映射功能,将每个字段精确转换。此外,通过批量处理API `batchSave`,实现高效的大量数据写入,从而提升整体性能。 在整个集成过程中,还必须关注异常处理和错误重试机制。一旦发生网络波动或接口调用失败,可以自动进行错误重试,并详细记录每次操作日志。这不仅确保了系统稳定性,也为后续维护提供了重要依据。 最后,为进一步优化流程,我们设置了定时任务,利用轻易云平台提供的调度能力,每隔一段时间自动抓取最新的数据并执行转换和上传操作。这一切都保证了业务流程的顺畅运行,使得企业能够更加专注于核心运营环节,提高整体生产效率。 ![如何开发企业微信API接口](https://pic.qeasy.cloud/D29.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成过程中,调用源系统的API接口是关键的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`来获取并加工数据,以实现付款申请单对接差旅费报销单的业务需求。 #### API接口配置 首先,我们需要配置元数据以调用钉钉的`topapi/processinstance/get`接口。以下是元数据配置的详细内容: ```json { "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. **格式转换**: 将数据转换为目标系统所需的格式。这可能包括日期格式转换、数值单位转换等。 #### 数据转换与写入 经过清洗后的数据需要进一步转换并写入目标系统。在本案例中,我们将清洗后的差旅费报销单数据写入金蝶系统。以下是一个简化的示例代码片段,展示如何进行数据转换和写入: ```python 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接口](https://pic.qeasy.cloud/S4.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。以下是详细的技术实现步骤。 #### 元数据配置解析 我们使用的元数据配置如下: ```json { "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. **字段映射与解析**: - `FBillNo`、`FDate`等字段直接从源数据中提取。 - `FBillTypeID`、`FExpenseOrgId`等字段需要通过`ConvertObjectParser`进行解析。 - 特殊字段如`FProposerID`通过查找集合中的匹配项进行转换。 2. **条件判断与函数调用**: - `FCurrencyID`、`FCONTACTUNITTYPE`等字段通过条件判断和函数调用实现动态映射。例如,币别为人民币时映射为`PRE001`。 3. **数组处理**: - 报销明细部分(即`FEntity`)为数组,需要逐个处理每个子字段,如费用项目、发票类型等。 #### 示例代码 以下是一个示例代码片段,用于将源数据转换为目标格式,并通过API接口写入金蝶云星空: ```python 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系统接口开发配置](https://pic.qeasy.cloud/T9.png~tplv-syqr462i7n-qeasy.image)