利用轻易云实现钉钉报销数据向金蝶付款单的ETL流程

  • 轻易云集成顾问-孙传友
### 钉钉报销数据集成至金蝶云星空实现方案 在本案例中,我们将分享如何通过轻易云数据集成平台,将钉钉的行政报销类数据无缝集成到金蝶云星空。在实际运行的过程中,方案被命名为“钉钉报销【行政报销类】->金蝶付款单【一臣】”。以下是一些关键技术点和实施细节。 #### 确保数据不漏单 首先,为了确保从钉钉获取的数据不会遗漏,我们调用了`topapi/processinstance/get`接口。这一步骤可以定时可靠地抓取到最新的流程实例,保证所有需要处理的报销申请都能成功提取。为了应对API分页和限流的问题,我们设计了一套高效分页机制,并对返回结果进行详细校验,以避免任何可能的数据丢失。 #### 快速写入大量数据 接下来是如何将这些已获取的数据快速而又批量地写入到金蝶云星空。我们利用了其提供的`batchSave`接口,实现高效批量操作。在这个过程中,通过自定义字段映射,对接双方系统间异构格式进行了转换。同时,针对大批量并发操作,采用队列管理方式来优化传输性能,提高整体效率。 #### 错误重试与异常处理机制 整个流程中的另一重要环节是错误重试与异常处理。当遇到网络波动或者API调用失败时,我们设置了详细的日志记录功能,并配置了基于规则的重试机制。例如,对于特定类型或次数范围内的错误,会自动重新尝试发送请求,从而提高系统稳健性和容错能力。 #### 数据监控与日志记录 此外,为提升系统透明度和监控效率,每个步骤都会实时生成日志并进行状态报告。同样,在轻易云平台上部署的一系列监控面板,使得运维人员能够直观了解每笔交易动态状况,有效防范潜在问题发生。 ###### 总结: 通过以上几个技术要点及具体实现策略,本案例展示了一个完整且高效地将企业级别应用——钉钉及金蝶云星空之间建立起紧密联通的方法。接下来的内容将进一步详解每一个关键步骤及核心代码示例,以便更好理解其背后的逻辑以及最佳实践。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/D13.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成生命周期的第一步,我们需要从源系统钉钉中调用接口`topapi/processinstance/get`,以获取并加工数据。本文将深入探讨如何通过轻易云数据集成平台配置元数据,实现这一过程。 #### 配置元数据 首先,我们需要配置元数据,以便正确调用钉钉接口并处理返回的数据。以下是我们使用的元数据配置: ```json { "api": "topapi/processinstance/get", "method": "POST", "number": "number", "id": "id", "idCheck": true, "condition": [ [ { "field": "报销类别", "logic": "eq", "value": "行政报销类" } ] ] } ``` #### 调用API接口 根据上述配置,我们将使用POST方法调用钉钉的`topapi/processinstance/get`接口。这个接口主要用于获取指定流程实例的详细信息。在我们的场景中,目标是获取“行政报销类”的报销单信息。 ##### 请求参数 - `number`: 报销单号 - `id`: 流程实例ID - `condition`: 查询条件,这里我们设置为“报销类别”字段等于“行政报销类” 请求示例如下: ```json { "process_instance_id": "<具体流程实例ID>" } ``` #### 数据清洗与转换 在成功调用API并获取到原始数据后,下一步是对数据进行清洗和转换,以确保其符合目标系统(如金蝶付款单)的要求。 ##### 数据清洗 1. **字段筛选**:仅保留必要的字段,如报销金额、报销人、报销日期等。 2. **格式转换**:将日期格式统一为目标系统所需的格式,例如将"YYYY-MM-DD"转换为"YYYYMMDD"。 3. **异常处理**:过滤掉不符合条件的数据,例如缺少关键字段或字段值不合法的数据。 示例代码: ```python def clean_data(raw_data): cleaned_data = [] for record in raw_data: if '报销金额' in record and '报销人' in record: cleaned_record = { 'amount': record['报销金额'], 'person': record['报销人'], 'date': convert_date_format(record['报销日期']) } cleaned_data.append(cleaned_record) return cleaned_data def convert_date_format(date_str): # 假设输入格式为"YYYY-MM-DD",输出格式为"YYYYMMDD" return date_str.replace("-", "") ``` ##### 数据转换与写入 清洗后的数据需要进一步转换,以适应目标系统的结构和要求。这里,我们将清洗后的数据转换为金蝶付款单所需的格式,并通过轻易云平台写入目标系统。 示例代码: ```python def transform_to_kingdee_format(cleaned_data): transformed_data = [] for record in cleaned_data: transformed_record = { 'FNumber': record['number'], 'FDate': record['date'], 'FAmount': record['amount'], 'FPerson': record['person'] } transformed_data.append(transformed_record) return transformed_data def write_to_kingdee(transformed_data): # 假设有一个函数可以将数据写入金蝶系统 for data in transformed_data: kingdee_api.write(data) ``` 通过上述步骤,我们实现了从钉钉获取“行政报销类”数据并将其转换和写入金蝶付款单系统的全过程。这一过程不仅提高了数据处理效率,还确保了各环节的数据准确性和一致性。 ![用友与WMS系统接口开发配置](https://pic.qeasy.cloud/S25.png~tplv-syqr462i7n-qeasy.image) ### 利用轻易云数据集成平台实现钉钉报销数据向金蝶付款单的ETL转换 在数据集成过程中,ETL(提取、转换、加载)是关键步骤之一。本文将深入探讨如何利用轻易云数据集成平台,将钉钉报销【行政报销类】的数据转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 数据请求与清洗 在ETL流程中,首先需要从源系统(如钉钉)提取数据,并进行初步清洗。这一步骤确保了数据的一致性和准确性,为后续的转换和写入奠定基础。 #### 数据转换与写入 接下来,重点介绍如何将清洗后的数据进行转换,并通过金蝶云星空API接口写入目标平台。以下是具体的元数据配置和操作细节: ##### API接口配置 我们使用金蝶云星空的`batchSave` API接口,通过POST方法批量保存数据。配置如下: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "batchArraySave", "rows": 1, "rowsKey": "array" }, "request": [ { "field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号", "value": "{{extend.business_id}}" }, { "field": "FBillTypeID", "label": "单据类型", "type": "string", "describe": "单据类型", "parser": { "name": "ConvertObjectParser", "params": "FNUMBER" }, "value": "FKDLX04_SYS" }, { ... } ], ... } ``` ##### 字段映射与转换 1. **单据编号(FBillNo)**:直接映射自`{{extend.business_id}}`。 2. **单据类型(FBillTypeID)**:固定值`FKDLX04_SYS`,并通过`ConvertObjectParser`解析为金蝶系统识别的格式。 3. **业务日期(FDATE)**:映射自`{{extend.finish_time}}`。 4. **结算组织(FSETTLEORGID)**和**付款组织(FPAYORGID)**:均映射自`{{费用归属项目}}`,并通过相应的解析器转换。 5. **币别(FCURRENCYID)**:固定值`PRE001`,同样需要解析。 6. **往来单位类型(FCONTACTUNITTYPE)**和**收款单位类型(FRECTUNITTYPE)**:均为固定值`BD_Department`。 7. **往来单位(FCONTACTUNIT)**和**收款单位(FRECTUNIT)**:映射自`{{费用归属部门_关联}}`,并通过解析器转换。 8. **结算币别(FSETTLECUR)**:固定值`PRE001`。 ##### 子表明细配置 对于付款单明细部分,我们使用数组结构进行配置: ```json { ... { "field":"FPAYBILLENTRY", ... ,"children":[ { ... ,"value":"{{付款方式}}" ,"parent":"FPAYBILLENTRY" ,"mapping":"629460bc1dc0083d491e60b4" ,"mappingDirection":"positive" }, { ... ,"value":"SFKYT001" ,"parent":"FPAYBILLENTRY" ,"parser":{"name":"ConvertObjectParser","params":"FNumber"} }, { ... ,"value":"{{报销明细.报销金额(元)}}" ,"parent":"FPAYBILLENTRY" }, ... ] } } ``` 子表字段包括结算方式、付款用途、应付金额等,每个字段都需根据具体业务需求进行相应的映射和解析。 ##### 特殊字段处理 - **对方银行账号(FOPPOSITEBANKACCOUNT)**:根据条件判断选择支付宝账号或银行卡号。 - **对方账户名称(FOPPOSITECCOUNTNAME)**:直接映射自收款信息中的名称。 ```json { ... {"parent":"FPAYBILLENTRY","label":"对方银行账号","field":"FOPPOSITEBANKACCOUNT","type":"string","value":"_function CASE LOCATE('ALIPAY_ACCOUNT','{{收款信息.identityType}}') WHEN 0 THEN '{{收款信息.cardNo}}' ELSE '{{收款信息.logonId}}' END"}, {"parent":"FPAYBILLENTRY","label":"对方账户名称","field":"FOPPOSITECCOUNTNAME","type":"string","value":"{{收款信息.name}}"} } ``` #### 执行操作与提交审核 最后,在配置中指定业务对象表单ID、执行操作、是否自动提交并审核等参数: ```json { ... {"field":"FormId","label":"业务对象表单Id","type":"string","describe":"必须填写金蝶的表单ID如:PUR_PurchaseOrder","value":"AP_PAYBILL"}, {"field":"Operation","label":"执行的操作","type":"string","value":"BatchSave"}, {"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"bool","value":"false"}, {"field":"IsVerifyBaseDataField","label":"验证基础资料","type":"bool","describe":"是否验证所有的基础资料有效性,布尔类,默认false(非必录)","value":"false"} } ``` 通过以上配置,我们可以实现从钉钉报销到金蝶付款单的数据无缝对接,并确保每个字段都能正确映射和解析,从而保证数据的一致性和准确性。 ![打通钉钉数据接口](https://pic.qeasy.cloud/T16.png~tplv-syqr462i7n-qeasy.image)