轻易云平台如何实现钉钉到金蝶的ETL转换

  • 轻易云集成顾问-何语琴
### 钉钉数据集成到金蝶云星空:技术实现与最佳实践 在系统对接和数据集成的过程中,一个常见且具有挑战性的需求是将企业内部多个平台的数据无缝连接。本文将深入探讨一个具体案例——如何通过轻易云数据集成平台,将钉钉上的付款单信息实时、高效地同步到金蝶云星空中的费用申请单(对公请款单,供应商)。 #### 确保集成钉钉数据不漏单 首先,我们需要确保从钉钉接口获取的数据完整性。在本方案中,我们使用了`topapi/processinstance/get` API,该接口能稳定抓取到所有需要处理的付款单实例。为了保证没有遗漏,我们设计了一套定时任务机制,每隔固定时间段调用一次接口,并保存上次成功获取的位置索引。 ```javascript // 调用topapi/processinstance/get 以分页方式获取订单 const fetchData = async (lastInstanceId) => { const response = await dingTalkAPI.topapi.processinstance.get({ start_instance_id: lastInstanceId, // 其他必要参数... }); return response.data; }; ``` #### 大量数据快速写入到金蝶云星空 处理完来自钉钉的数据后,需要高效地转化并批量写入金蝶云星空。这里我们利用了其提供的 `batchSave` API 来进行批量操作,大大提高了写入速度和效率,同时也减少了频繁请求带来的网络开销。 ```json { "model": "AP_OtherPayable", "data": [ { // 转换后的费用申请单数据格式... }, ... ] } ``` #### 处理分页和限流问题 由于涉及大量订单信息,API请求需考虑分页与限流问题。在每次请求中,我们根据返回值中的标识来判断是否有下一页,如有则继续抓取;同时为避免触发API使用限制,可采用指数退避算法调整请求间隔,以降低被限流风险。 ```javascript let hasMorePages = true; while (hasMorePages) { try { const data = await fetchData(lastInstanceId); if (data.nextPageToken) { lastInstanceId = data.nextPageToken; // 数据存储及转换逻辑... processBatch(data.items); } else { hasMorePages=false; } // 异常重试机制可加入此处... } catch(err){ handleError(err); } } const processBatch=(items)=>{ try{ // 编排映射逻辑 write2Kingdee(items.map(convertToKingdeeFormat)); }catch(write ![打通用友BIP数据接口](https://pic.qeasy.cloud/D32.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成生命周期的第一步中,调用源系统的API接口获取数据是至关重要的一环。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`,并对获取的数据进行初步加工处理。 #### 钉钉接口配置 首先,我们需要了解钉钉接口`topapi/processinstance/get`的基本配置。根据提供的元数据配置,以下是该接口的具体参数: - **API路径**: `topapi/processinstance/get` - **请求方式**: `POST` - **主要字段**: - `number`: 对应于单据名称 - `id`: 对应于单据ID - **其他配置**: - `idCheck`: 确保ID字段的唯一性检查 - `autoFillResponse`: 自动填充响应数据 #### 请求与清洗数据 在调用API之前,我们需要构建一个有效的请求体。假设我们需要获取某个特定付款单的详细信息,可以构建如下请求体: ```json { "process_instance_id": "example-instance-id" } ``` 通过轻易云平台,我们可以使用POST方法发送上述请求体到`topapi/processinstance/get`接口。成功调用后,钉钉会返回一个包含付款单详细信息的JSON响应。 示例响应可能如下: ```json { "errcode": 0, "errmsg": "ok", "process_instance": { "title": "付款单", "create_time": "2023-10-01 12:00:00", "finish_time": "2023-10-02 12:00:00", "status": "COMPLETED", "form_component_values": [ { "name": "供应商名称", "value": "供应商A" }, { "name": "金额", "value": "1000.00" } ] } } ``` #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换,以便后续写入目标系统。在本例中,我们需要将付款单的数据转换为金蝶系统所需的费用申请单格式。 首先,提取关键字段: ```json { "title": response.process_instance.title, "create_time": response.process_instance.create_time, "finish_time": response.process_instance.finish_time, "status": response.process_instance.status, "supplier_name": response.process_instance.form_component_values[0].value, "amount": response.process_instance.form_component_values[1].value } ``` 然后,根据金蝶系统要求,将这些字段映射到相应的费用申请单格式。例如: ```json { "document_type": "对公请款单", "supplier_name": extracted_data.supplier_name, "amount_requested": extracted_data.amount, ... } ``` #### 自动填充与ID检查 根据元数据配置中的`autoFillResponse`和`idCheck`选项,我们可以确保在处理过程中自动填充必要的数据,并进行ID唯一性检查。这些操作可以通过轻易云平台内置的功能实现,无需手动干预。 例如,自动填充响应数据可以确保在转换过程中不会遗漏任何关键字段,而ID唯一性检查则保证了每个记录在目标系统中的唯一性,从而避免重复和冲突。 #### 实践案例 假设我们已经成功获取并清洗了一个付款单的数据,现在需要将其写入金蝶系统。可以通过轻易云平台提供的数据转换工具,将上述清洗后的JSON对象转换为金蝶系统所需的格式,并通过相应的API接口完成写入操作。 总结来说,通过轻易云平台调用钉钉接口`topapi/processinstance/get`,我们能够高效地获取、清洗和转换数据,为后续的数据集成打下坚实基础。这一过程不仅提升了业务透明度和效率,也确保了数据的一致性和准确性。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S15.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL转换,并将其转为目标平台——金蝶云星空API接口所能够接收的格式,最终写入目标平台。本文将通过一个具体的技术案例,详细探讨这一过程中的关键步骤和技术细节。 #### 1. API接口配置 首先,我们需要配置金蝶云星空API接口的元数据。以下是一个典型的元数据配置示例: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "batchArraySave", "rows": 1, "rowsKey": "array" }, "request": [ { "field": "FBillTypeID", "label": "单据类型", "type": "string", "value": "FYSQ003_SYS", "parser": { "name": "ConvertObjectParser", "params": "FNumber" } }, { "field": "FBillNo", "label": "单据编号", "type": "string", "value": "{{extend.business_id}}" }, // 更多字段配置... ], // 更多配置... } ``` #### 2. 数据字段解析与映射 在配置过程中,关键的一步是对各个字段进行解析和映射。例如,对于`FBillTypeID`字段,我们使用了`ConvertObjectParser`来解析其值,并指定了参数`FNumber`。类似地,对于其他字段,我们也需要根据具体需求进行相应的解析和映射。 ```json { "field": "FOrgID", "label": "申请组织", "type": "string", "value": "{{企业主体}}", "parser": { "name": "ConvertObjectParser", "params": "FNumber" }, // 映射关系 'mapping': { 'target': '6577ba6af82ea526c578f93c', 'direction': 'positive' } } ``` #### 3. 动态数据填充 在实际操作中,许多字段需要动态填充。例如,`FStaffID`和`FPhoneNumber`字段需要根据归属人信息动态获取。这可以通过以下方式实现: ```json { 'field': 'FStaffID', 'label': '申请人', 'type': 'string', 'value': '_findCollection find FNumber from some_collection where FName={{归属人}}', 'parser': { 'name': 'ConvertObjectParser', 'params': 'FSTAFFNUMBER' } }, { 'field': 'FPhoneNumber', 'label': '联系电话', 'type': 'string', 'value': '_findCollection find FMobile from some_collection where FName={{归属人}}' } ``` #### 4. 子表数据处理 对于复杂的数据结构,如包含子表的数据,我们需要特别处理。例如,报销明细信息可以通过以下方式处理: ```json { 'field':'FEntity', 'label':'明细信息', 'type':'array', 'value':'报销明细', children:[ { field:'FExpenseItemID', label:'费用项目', type:'string', value:'CI114', parser:{ name:'ConvertObjectParser', params:'FNumber' } }, { field:'FOrgAmount', label:'申请金额', type:'string', value:'{{付款明细.付款金额(元)}}' }, // 更多子表字段... ] } ``` #### 5. 最终请求构建与发送 完成所有字段的解析与映射后,我们将构建最终的请求体,并通过POST方法发送至金蝶云星空API接口: ```json { FormId: ER_ExpenseRequest, Operation: BatchSave, IsAutoSubmitAndAudit: false, IsVerifyBaseDataField: false, Model: { FBillTypeID: { FNumber: FYSQ003_SYS }, FBillNo: extend.business_id, // 更多字段... FEntity: [ { FExpenseItemID: { FNumber: CI114 }, FOrgAmount: some_amount, // 更多子表字段... } ] } } ``` 通过上述步骤,我们成功地将源平台的数据经过ETL转换后写入到了目标平台——金蝶云星空,实现了不同系统间的数据无缝对接。 ![金蝶与WMS系统接口开发配置](https://pic.qeasy.cloud/T6.png~tplv-syqr462i7n-qeasy.image)