实现数据ETL转换并推送到金蝶云星空的技术流程

  • 轻易云集成顾问-曹润
### 每刻付款查询对接金蝶下推生成付款单① 在现代企业中,数据集成是一项关键任务。尤其是将不同系统之间的数据无缝对接,无论是在提升效率还是确保数据准确性方面,都具有重要意义。在本次技术案例中,我们聚焦于如何将每刻平台的付款信息**高效且可靠地集成到金蝶云星空**,最终实现自动化生成付款单。 首先,我们需要处理从每刻获取数据的API接口:/api/openapi/paymenttransaction/paid/list。这一接口能够提供详细的付款交易列表,但为了确保不漏单,需要定时调用该接口并妥善处理分页和限流问题。同时,要保证大量数据能快速写入到金蝶云星空,需要使用其Push API进行批量操作,并支持某些特定情况下的自定义映射。 例如,每次执行定时抓取任务时,我们会通过深度分页机制(如基于时间戳或流水号)逐步拉取所有新产生的数据,通过轻易云平台实时监控与日志记录功能,追踪每一笔交易,从而避免遗漏。此外,为解决两者之间存在的数据格式差异,可以设计相应的转换逻辑,使得每个字段都能正确映射到金蝶目标表结构。 在可能产生异常情况的时候,比如网络延迟或API响应错误,通过配置重试机制和失败通知策略以便及时发现并解决问题,进一步确保整个流程平稳运行。总之,对接过程中充分考虑各环节细节及潜在风险,是保证系统集成成功不可或缺的一环。 ![用友与WMS系统接口开发配置](https://pic.qeasy.cloud/D39.png~tplv-syqr462i7n-qeasy.image) ### 调用源系统每刻接口/api/openapi/paymenttransaction/paid/list获取并加工数据 在数据集成的生命周期中,调用源系统接口是关键的第一步。本文将详细探讨如何通过轻易云数据集成平台调用每刻接口`/api/openapi/paymenttransaction/paid/list`,并对获取的数据进行加工处理。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。以下是具体的配置细节: ```json { "api": "/api/openapi/paymenttransaction/paid/list", "method": "POST", "number": "payeeTargetBusinessCode", "id": "paymentBizCode", "idCheck": true, "omissionRemedy": { "crontab": "1 1 * * *", "takeOverRequest": [ { "field": "startPaidTime", "label": "修改时间开始段", "type": "string", "is_required": true, "describe": null, "value": "_function ({LAST_SYNC_TIME}-3600*336) * 1000" } ] }, "condition": [ [ {"field":"formSubTypeName","logic":"neq","value":"供应商货款付款申请单"}, {"field":"payerAccountType","logic":"neq","value":"通过其他方式付款"}, {"field":"payerAccountType","logic":"neq","value":"从公司现金付款"}, {"field":"payerAccountNumber","logic":"neq","value":"3602005009200684740"}, {"field":"payerAccountNumber","logic":"neq","value":"111"} ] ], "request": [ { "label": "支付完成时间-开始范围,毫秒的时间戳,非必填", "field": "startPaidTime", "type": "string", "value": "_function ({LAST_SYNC_TIME}-2505600) * 1000" }, { "label": "支付完成时间-结束范围,毫秒的时间戳,非必填", "field": "endPaidTime", "type": "string", "value": "{CURRENT_TIME}000" }, { "label": "分页条数", "field": "pageSize", "type": "string", "value": "50" }, { "label": "当前页首条数据在所有数据中的偏移量", "field": "pageNum", "type": "string", "value": "1" }, { "label": “付款单ID,非必填,对应form_pay_order中的payment_order_id”, “field”: “paymentNo”, “type”: “string”, “describe”: “可选值: APPROVING(审批中),AUDITING(审核中),SIGNING(签收等待)(仅支持报销单),SETTLEMENT(结算中),COMPLETED(已完成),DELETED(已删除),ABANDON(已作废),REJECTED(被驳回)SUBMIT_FAILED(提交失败),DRAFT(草稿)。默认值为所有未删除单据。” } ] } ``` #### 数据请求与清洗 在进行数据请求时,我们需要特别注意以下几点: 1. **时间参数**:`startPaidTime`和`endPaidTime`是两个关键的时间参数,用于限定支付完成时间的范围。`startPaidTime`使用了一个函数来计算上次同步时间减去2505600秒,而`endPaidTime`则直接使用当前时间。 2. **分页处理**:为了避免一次性请求过多数据导致性能问题,我们设置了分页参数`pageSize`和`pageNum`。每次请求50条记录,并通过调整`pageNum`来遍历所有数据。 3. **条件过滤**:我们使用了一系列条件过滤掉不需要的数据,例如排除“供应商货款付款申请单”、“通过其他方式付款”等类型的数据。这些条件确保了我们只获取到符合业务需求的数据。 #### 数据转换与写入 在获取到原始数据后,需要对其进行转换和清洗,以便后续写入目标系统。以下是一些常见的数据处理步骤: 1. **字段映射**:将源系统中的字段映射到目标系统。例如,将每刻返回的字段名与金蝶系统所需字段名进行对应。 2. **数据格式转换**:根据目标系统要求,对日期、金额等字段进行格式转换。例如,将Unix时间戳转换为标准日期格式。 3. **异常处理**:对于缺失或异常的数据进行补救或标记,以确保数据完整性。例如,对于缺失的支付单ID,可以设置默认值或记录日志以便后续人工处理。 #### 实时监控与调度 为了确保数据集成过程的稳定性和及时性,我们配置了定时任务(crontab)和实时监控机制: - **定时任务**:通过crontab表达式设置每天凌晨1点执行一次同步任务。 - **实时监控**:利用平台提供的监控工具实时跟踪数据流动和处理状态,及时发现并解决潜在问题。 以上是关于如何通过轻易云数据集成平台调用每刻接口获取并加工数据的详细技术案例。在实际应用中,根据具体业务需求可能还需要进一步调整和优化配置,以达到最佳效果。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/S14.png~tplv-syqr462i7n-qeasy.image) ### 将源平台数据转换并写入金蝶云星空API接口 在使用轻易云数据集成平台进行数据处理的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。以下是具体的技术实现过程。 #### 配置元数据 首先,我们需要配置元数据,以便正确地将源平台的数据转换并写入金蝶云星空。以下是一个典型的元数据配置示例: ```json { "api": "Push", "method": "POST", "idCheck": true, "request": [ { "field": "Ids", "label": "id集合", "type": "string", "value": "_findCollection find FID from 9fbe5009-1e10-3ec2-95e6-2173cd49ee29 where FBillNo={payeeTargetBusinessCode}" }, { "field": "FormId", "label": "业务对象表单Id", "type": "string", "describe": "必须填写金蝶的表单ID如:PUR_PurchaseOrder", "value": "CN_PAYAPPLY" }, { "field": "Numbers", "label": "编码集合", "type": "string", "value": "{payeeTargetBusinessCode}" }, { "field": "RuleId", "label": "单据转换规则内码", "type": "string", "describe": "\"flag1;flag2;...\"(非必录) 例如(允许负库存标识:STK_InvCheckResult)", "value": "994f9913-a23f-46fb-b5d9-f1f271b4ef6c" }, { "label": "目标组织内码", "field": "TargetOrgId", "type": "string", "value": "_findCollection find FUseOrgId from c2b5e68c-1b80-398b-bec8-59612f54e804 where FNumber={payerAccountNumber}" }, { "label": "TargetFormId", "field": ":TargetFormId", ":type":"string", ":value":"AP_PAYBILL" }, { ":field":"IsEnableDefaultRule", ":label":"是否启用默认单据转换", ":type":"string", ":describe":"布尔类型,默认true(非必录)", ":value":"true" }, { ":label":"IsDraftWhenSaveFail", ":field":"IsDraftWhenSaveFail", ":type":"string", ":value":"false" } ], enforcedAssociation: true } ``` #### 数据请求与清洗 在这个阶段,我们从源平台获取原始数据,并对其进行清洗和预处理。通过`_findCollection`函数,我们可以根据特定条件查询到所需的数据。例如: ```sql _findCollection find FID from 9fbe5009-1e10-3ec2-95e6-2173cd49ee29 where FBillNo={payeeTargetBusinessCode} ``` 该语句从指定的表中查找符合条件的记录,并返回其`FID`。类似地,我们可以获取其他必要的信息,如目标组织内码等。 #### 数据转换 接下来,我们需要将清洗后的数据按照金蝶云星空API接口要求的格式进行转换。这一步骤非常关键,因为不同系统的数据格式和结构可能有很大差异。 在元数据配置中,`FormId`、`Numbers`、`RuleId`等字段都是为了确保我们能够正确地映射和转换数据。例如: ```json { field: 'FormId', label: '业务对象表单Id', type: 'string', describe: '必须填写金蝶的表单ID如:PUR_PurchaseOrder', value: 'CN_PAYAPPLY' } ``` 这里我们指定了业务对象表单ID为`CN_PAYAPPLY`,确保生成的付款单符合金蝶系统的要求。 #### 数据写入 完成数据转换后,最后一步是将处理好的数据通过API接口写入金蝶云星空。我们使用POST方法,将构造好的请求体发送到指定API端点: ```json { api: 'Push', method: 'POST', idCheck: true, request: [ // 请求体内容 ] } ``` 在请求体中,我们包含了所有必要的信息,如ID集合、业务对象表单ID、编码集合、单据转换规则内码等。这些信息确保我们的请求能够被金蝶系统正确解析和处理。 #### 接口调用示例 以下是一个完整的接口调用示例: ```javascript const axios = require('axios'); const data = { Ids: "_findCollection find FID from ... where FBillNo=...", FormId: 'CN_PAYAPPLY', Numbers: '{payeeTargetBusinessCode}', RuleId: '994f9913-a23f-46fb-b5d9-f1f271b4ef6c', TargetOrgId: '_findCollection find FUseOrgId from ... where FNumber={payerAccountNumber}', TargetFormId: 'AP_PAYBILL', IsEnableDefaultRule: 'true', IsDraftWhenSaveFail: 'false' }; axios.post('https://api.kingdee.com/Push', data) .then(response => { console.log(response.data); }) .catch(error => { console.error(error); }); ``` 通过以上步骤,我们成功实现了从源平台到金蝶云星空的数据ETL转换和写入。这一过程不仅提高了系统间的数据互通性,也显著提升了业务流程的自动化程度。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T2.png~tplv-syqr462i7n-qeasy.image)