ETL技术在钉钉与金蝶数据转换中的最佳实践

  • 轻易云集成顾问-陈洁琳
### 钉钉数据集成到金蝶云星空的技术案例分享 在企业日常运营中,如何高效地实现系统间的数据对接和无缝集成,是提升业务效率的重要环节。本文将详细探讨通过轻易云数据集成平台,将钉钉报销【项目报销类】的数据快速、可靠地迁移至金蝶付款单【炫涵】中的具体技术方案及实施细节。 首先,我们需要从钉钉获取报销申请相关的数据。利用钉钉提供的API接口`topapi/processinstance/get`可以精准抓取特定实例下的处理流程。在实现过程中,需特别关注如何确保这些数据不遗漏,以及应对接口分页和限流的问题,这样才能保证所有需要迁移的数据都能完整且准确地获取到。 为了将大量获取到的报销数据快速写入至金蝶云星空中,我们使用了其批量保存API`batchSave`。此过程中,不仅要考虑到不同系统间可能存在的数据格式差异,还需仔细设计映射规则,以确保各字段信息能够正确对应。此外,为避免因网络或其他异常情况导致部分数据同步失败,我们还引入了错误重试机制,可以自动检测并重新提交失败的请求,从而提高整体操作的成功率。 在整个集成流程中,一个不可忽视的重要环节是实时监控与日志记录。这不仅帮助我们了解每一步执行状态,也为后续故障排查和性能优化提供了宝贵的信息。例如,在处理过程中的任何异常情况,都能通过日志及时捕获,并触发相应的告警措施,以尽早介入解决问题。 以上概述了轻易云平台下,通过标准化API,实现从钉钉到金蝶这两个系统之间顺利对接的一些核心技术点。在实际操作层面,还有更多细节与技巧,此处略过不表;接下来将具体展示各步骤代码示例及配置详解。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/D5.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将深入探讨如何使用轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`,并对获取的数据进行加工处理。 #### API 接口调用配置 首先,我们需要配置元数据以便正确调用钉钉的API接口。以下是我们在轻易云平台上配置的元数据: ```json { "api": "topapi/processinstance/get", "method": "POST", "number": "number", "id": "id", "idCheck": true, "condition": [ [ { "field": "报销类别", "logic": "eq", "value": "项目报销类型" } ] ] } ``` 该配置指定了我们要调用的API接口为`topapi/processinstance/get`,请求方法为POST。同时,我们设定了一个条件,即只获取“报销类别”为“项目报销类型”的数据。 #### 数据请求与清洗 在实际操作中,首先需要通过HTTP POST请求来调用上述API接口。以下是一个示例代码片段,展示了如何发起这个请求: ```python import requests url = 'https://oapi.dingtalk.com/topapi/processinstance/get' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_ACCESS_TOKEN' } payload = { 'process_instance_id': 'YOUR_PROCESS_INSTANCE_ID' } response = requests.post(url, headers=headers, json=payload) data = response.json() ``` 在这个过程中,我们发送了一个包含`process_instance_id`的POST请求,并接收返回的数据。接下来,需要对返回的数据进行清洗和验证,以确保其符合我们的需求。 #### 数据转换与写入 一旦我们成功获取并清洗了数据,就需要将其转换为目标系统所需的格式,并写入到目标系统中。在本案例中,我们将数据从钉钉转移到金蝶付款单系统。 假设我们从钉钉获取的数据如下: ```json { "errcode": 0, "process_instance": { "title": "项目报销申请", "form_component_values": [ {"name": "报销金额", "value": "1000"}, {"name": "报销类别", "value": "项目报销类型"}, {"name": "申请人", "value": "张三"} ] } } ``` 我们需要提取其中的关键字段,并转换为金蝶付款单系统所需的格式。例如: ```python processed_data = { 'title': data['process_instance']['title'], 'amount': next(item['value'] for item in data['process_instance']['form_component_values'] if item['name'] == '报销金额'), 'category': next(item['value'] for item in data['process_instance']['form_component_values'] if item['name'] == '报销类别'), 'applicant': next(item['value'] for item in data['process_instance']['form_component_values'] if item['name'] == '申请人') } ``` 然后,将这些处理后的数据写入到金蝶付款单系统: ```python kingdee_url = 'https://kingdee.api.endpoint/payment' kingdee_headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_KINGDEE_ACCESS_TOKEN' } kingdee_response = requests.post(kingdee_url, headers=kingdee_headers, json=processed_data) ``` 通过上述步骤,我们实现了从钉钉到金蝶付款单系统的数据集成。 #### 小结 本文详细介绍了如何在轻易云数据集成平台上配置和调用钉钉API接口`topapi/processinstance/get`,并对获取的数据进行清洗、转换和写入目标系统。通过这种方式,可以高效地实现不同系统间的数据无缝对接,提高业务透明度和效率。 ![轻易云数据集成平台金蝶集成接口配置](https://pic.qeasy.cloud/S29.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现钉钉报销数据向金蝶云星空付款单的ETL转换 在数据集成生命周期的第二步中,我们将已经从源平台(钉钉报销系统)获取的数据进行ETL转换,转为目标平台(金蝶云星空API接口)所能够接收的格式,并最终写入目标平台。以下是详细的技术实现过程。 #### 配置元数据 首先,根据提供的元数据配置,我们需要将钉钉报销系统的数据字段映射到金蝶云星空付款单API接口所需的字段格式。以下是关键字段的映射和处理逻辑: 1. **单据编号(FBillNo)**: - 来源:`{{extend.business_id}}` - 类型:字符串 - 描述:单据编号 2. **单据类型(FBillTypeID)**: - 固定值:`FKDLX04_SYS` - 类型:字符串 - 描述:单据类型 - 解析器:`ConvertObjectParser`,参数为`FNUMBER` 3. **业务日期(FDATE)**: - 来源:`{{extend.create_time}}` - 类型:字符串 - 描述:业务日期 4. **结算组织(FSETTLEORGID)**: - 来源:`_findCollection find Number from 723e2cb6-f80f-3823-8b4f-6e98b9713ba3 where Name={{费用归属项目}}` - 类型:字符串 - 描述:100 - 解析器:`ConvertObjectParser`,参数为`FNumber` 5. **币别(FCURRENCYID)**: - 固定值:`PRE001` - 类型:字符串 - 描述:币别 - 解析器:`ConvertObjectParser`,参数为`FNumber` 6. **往来单位类型(FCONTACTUNITTYPE)**: - 固定值:`BD_Department` - 类型:字符串 - 描述:往来单位类型 7. **往来单位(FCONTACTUNIT)**: - 来源:`{{费用归属部门_关联}}` - 类型:字符串 - 描述:往来单位 - 解析器:`ConvertObjectParser`,参数为`FNumber` 8. **收款单位类型(FRECTUNITTYPE)**: - 固定值:`BD_Department` - 类型:字符串 - 描述:收款单位类型 9. **收款单位(FRECTUNIT)**: - 来源: `{{费用归属部门_关联}}` - 类型: 字符串 - 解析器: `ConvertObjectParser`, 参数为 `FNumber` 10. **备注(FREMARK)**: - 来源: `{title}&{{项目报销类型}}&{{报销明细.费用明细}}` - 类型: 字符串 - 描述: 备注 11. **付款单明细(FPAYBILLENTRY)**: 包含多个子字段,如下所示: a) **结算方式(FSETTLETYPEID)**: * 来源: `{{付款方式}}` * 类型: 字符串 * 解析器: `ConvertObjectParser`, 参数为 `FNumber` b) **付款用途(FPURPOSEID)**: * 固定值: `SFKYT002` * 类型: 字符串 * 解析器: `ConvertObjectParser`, 参数为 `FNumber` c) **应付金额(FPAYTOTALAMOUNTFOR)**: * 来源: `{{报销明细.报销金额(元)}}` * 类型: 字符串 d) **费用项目(FCOSTID)**: * 来源: `_findCollection find FNumber from b02f1e34-b500-3075-8b14-08fec61d08a4 where FName={{项目报销类型}}` * 类型: 字符串 * 解析器: `ConvertObjectParser`, 参数为 `FNumber` e) **对方银行账号(FOPPOSITEBANKACCOUNT)**: * 来源: `_function CASE LOCATE('ALIPAY_ACCOUNT','{{收款信息.identityType}}') WHEN 0 THEN '{{收款信息.cardNo}}' ELSE '{{收款信息.logonId}}' END` * 类型: 字符串 f) **对方账户名称(FOPPOSITECCOUNTNAME)**: * 来源: `{{收款信息.name}}` * 类型: 字符串 #### API请求配置 根据上述字段映射,我们构建API请求体。以下是一个示例请求体: ```json { "FormId": "AP_PAYBILL", "Operation": "BatchSave", "IsAutoSubmitAndAudit": false, "IsVerifyBaseDataField": false, "Model": { "FBillNo": "{{extend.business_id}}", "FBillTypeID": {"FNUMBER": "FKDLX04_SYS"}, "FDATE": "{{extend.create_time}}", "FSETTLEORGID": {"FNumber": "_findCollection find Number from ... where Name={{费用归属项目}}"}, "FPAYORGID": {"FNumber": "_findCollection find Number from ... where Name={{费用归属项目}}"}, "FCURRENCYID": {"FNumber": "PRE001"}, "FCONTACTUNITTYPE": "BD_Department", "FCONTACTUNIT": {"FNumber": "{{费用归属部门_关联}}"}, "FRECTUNITTYPE": "BD_Department", "FRECTUNIT": {"FNumber": "{{费用归属部门_关联}}"}, "FREMARK": "{title}&{{项目报销类型}}&{{报销明细.费用明细}}", ... } } ``` #### 数据转换与写入 在轻易云数据集成平台中,通过配置上述元数据和API请求体,可以实现从钉钉报销系统到金蝶云星空付款单的数据转换与写入。具体步骤如下: 1. 配置ETL任务,将源数据按上述映射规则进行转换。 2. 调用金蝶云星空API接口,将转换后的数据写入目标平台。 3. 实时监控数据流动和处理状态,确保每个环节都清晰可见。 通过这种方式,可以高效地完成异构系统间的数据集成,实现业务流程的自动化和透明化。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/T1.png~tplv-syqr462i7n-qeasy.image)