金蝶云星空API接口配置与钉钉数据写入教程

  • 轻易云集成顾问-陈洁琳
### 钉钉数据集成到金蝶云星空:付款申请单对接费用报销单 在企业信息系统的整合过程中,跨平台的数据同步常常是一个复杂且关键的环节。本文将分享一个实际案例:如何通过轻易云数据集成平台实现钉钉与金蝶云星空之间付款申请单对接费用报销单的数据集成。 #### 技术背景与挑战 本次技术方案需要解决的是从钉钉获取审批流中的付款申请数据,并将其批量写入到金蝶云星空的费用报销模块。这一过程涉及多个关键技术要点,包括API调用、分页处理、限流监控和数据格式转换等。 #### 针对问题的具体技术方案 1. **高吞吐量的数据写入**: 金蝶云星空开放了批量保存接口(batchSave),支持大容量的数据快速导入。在实施过程中,我们充分利用该特性,实现了每个支付请求的高速、高效录入,使得大量付款申请能够及时转化为正式记录。 2. **实时监控和告警机制**: 轻易云提供完善的集中监控系统,对每一次API调用以及整个数据流进行实时追踪。当发生异常时,立即触发告警机制,从而确保问题能被及时发现和处理,避免业务中断或延迟。 3. **自定义数据转换逻辑**: 由于钉钉与金蝶云星空之间存在不同的数据结构,我们使用了轻易云的平台能力,自定义了一套复杂但直观的数据映射规则。例如,将钉钢顶中的“实例ID”映射为“业务单号”,保证两端数据信息的一致性和准确性。 4. **调取数据接口topapi/processinstance/get**: 使用topapi/processinstance/get API来提取钉钢顶中各个流程节点及相关信息,其中我们遇到了分页及限流的问题。通过合理配置参数并设计智能重试机制,成功应对这些挑战,提高了任务执行效率。同时,为保障无遗漏,我们设立定期抓取策略,多层排查余漏部分情况,大幅度提高可靠性。 5. **处理异常和错误重试机制**: 在实际操作中,不可避免地会遇到网络波动或服务故障。因此,本次方案中特别引入了一套完善且灵活的异常检测及重试机制。一旦某条记录未能成功写入,将自动触发重新尝试,同时记录详细日志以供后续分析调整。 ![如何对接钉钉API接口](https://pic.qeasy.cloud/D11.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`,获取并加工数据,以实现付款申请单对接费用报销单的功能。 #### 接口配置与调用 首先,我们需要配置钉钉接口`topapi/processinstance/get`。该接口用于查询审批实例详情,支持POST请求方式。以下是元数据配置的关键点: - **API路径**:`topapi/processinstance/get` - **请求方式**:POST - **主要字段**: - `number`: 单据编号 - `id`: 审批实例ID - `name`: 单据名称(与编号相同) - **条件过滤**: - `condition_bk` 和 `condition` 均设置为单据类型等于“费用报销” 元数据配置示例如下: ```json { "api": "topapi/processinstance/get", "effect": "QUERY", "method": "POST", "number": "number", "id": "id", "name": "number", "idCheck": true, "autoFillResponse": true, "condition_bk": [ [ { "field": "单据类型", "logic": "eqv2", "value": "费用报销" } ] ], "condition": [ [ { "field": "单据类型", "logic": "eqv2", "value": "费用报销" } ] ] } ``` #### 数据请求与清洗 在实际操作中,首先需要通过POST请求向钉钉接口发送查询条件。由于我们只关心“费用报销”类型的单据,因此在请求体中添加相应的过滤条件。 ```json { "process_instance_id_list": ["your_process_instance_id"], // 添加其他必要的参数 } ``` 接收到响应后,需要对返回的数据进行清洗和初步处理。通常,响应数据包含多个字段,但我们只需提取与业务相关的信息,如审批状态、申请人、金额等。 示例代码如下: ```python import requests url = 'https://oapi.dingtalk.com/topapi/processinstance/get' headers = {'Content-Type': 'application/json'} payload = { 'process_instance_id_list': ['your_process_instance_id'] } response = requests.post(url, json=payload, headers=headers) data = response.json() # 数据清洗 cleaned_data = [] for instance in data['process_instance_list']: if instance['form_component_values'][0]['value'] == '费用报销': cleaned_data.append({ 'number': instance['process_instance_id'], 'applicant': instance['originator_userid'], 'amount': instance['form_component_values'][1]['value'], # 提取其他必要字段 }) ``` #### 数据转换与写入 清洗后的数据需要进一步转换,以符合目标系统(金蝶)的格式要求。可以使用轻易云平台提供的数据转换工具,将清洗后的数据映射到目标系统所需的字段格式。 示例代码如下: ```python transformed_data = [] for item in cleaned_data: transformed_data.append({ '单据编号': item['number'], '申请人': item['applicant'], '报销金额': item['amount'], # 映射其他字段 }) # 将转换后的数据写入金蝶系统 # 假设使用某个API或数据库连接进行写入操作 write_to_kingdee(transformed_data) ``` 通过上述步骤,我们完成了从调用钉钉接口获取数据,到清洗、转换并写入目标系统的全过程。这不仅确保了数据的一致性和准确性,也大大提升了业务处理效率。 以上技术案例展示了如何利用轻易云数据集成平台实现复杂的数据集成任务,为企业提供高效、可靠的数据对接解决方案。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S26.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行金蝶云星空API接口的数据转换与写入 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL(提取、转换、加载)转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。本文将详细介绍如何使用轻易云数据集成平台完成这一过程。 #### 1. API接口配置 首先,我们需要配置金蝶云星空的API接口。根据元数据配置,我们使用`batchSave`接口,通过POST方法提交数据。以下是关键配置项: - **api**: "batchSave" - **method**: "POST" - **idCheck**: true - **operation**: {"method":"batchArraySave","rows":1,"rowsKey":"array"} #### 2. 请求参数配置 请求参数是ETL过程中最重要的一环,它决定了数据如何从源系统转换并映射到目标系统。以下是主要字段及其配置: - **FBillNo** (单据编号): 从源系统直接映射,类型为字符串。 - **FDate** (申请日期): 映射自`extend.create_time`,类型为字符串。 - **FBillTypeID** (单据类型): 固定值"FYBXD001_SYS",通过`ConvertObjectParser`解析。 - **FOrgID** (申请组织): 固定值"100",通过`ConvertObjectParser`解析。 - **FRequestDeptID** (申请部门): 映射自`部门信息TextField-K2AD4O5B`,通过`ConvertObjectParser`解析。 - **FExpenseOrgId** (费用承担组织): 固定值"100",通过`ConvertObjectParser`解析。 - **FExpenseDeptID** (费用承担部门): 映射自`部门信息TextField-K2AD4O5B`,通过`ConvertObjectParser`解析。 - **FPaySettlleTypeID** (结算方式): 固定值"JSFS01_SYS",通过`ConvertObjectParser`解析。 - **FProposerID** (申请人): 通过复杂查询 `_findCollection find FNumber from ba3a0784-6df8-3184-b7b3-a1e33d754f58 where FName={{联系人}}` 获取并解析。 - **FPayOrgId** (付款组织): 固定值"100",通过`ConvertObjectParser`解析。 #### 3. 动态字段处理 对于一些需要动态处理的字段,如往来单位类型和往来单位,我们使用条件表达式进行处理: ```json { "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"} } ``` #### 4. 报销明细处理 报销明细是一个数组,需要特别处理每一行的数据映射: ```json { "field": "FEntity", "label": "报销明细", "type": "array", "value": "表格", "children":[ { "field":"FExpID", "label":"费用项目", "type":"string", "value":"CI010", "parser":{"name":"ConvertObjectParser","params":"FNumber"}, "default":"{{表格.费用项目信息TextField-K2AD4O5B}}" }, { "field":"FTaxSubmitAmt", "label":"付款金额", "type":"string", "value":"{{付款金额}}" }, { "field":"FRemark", "label":"备注", "type":"string", "value":"{{表格.备注}}" } ] } ``` #### 5. 提交和审核设置 最后,我们还需要设置一些操作参数,例如业务对象表单Id、执行操作、是否自动提交和审核等: ```json { "otherRequest":[ {"field":"FormId","label":"业务对象表单Id","type":"string","describe":"必须填写金蝶的表单ID如:PUR_PurchaseOrder","value":"ER_ExpReimbursement"}, {"field":"Operation","label":"执行的操作","type":"string","value":"BatchSave"}, {"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"bool","value":"true"}, {"field":"IsVerifyBaseDataField","label":"验证基础资料","type":"bool","describe":"是否验证所有的基础资料有效性,布尔类,默认false(非必录)","value":"false"} ] } ``` 通过以上步骤,我们完成了从源系统到金蝶云星空API接口的数据转换与写入配置。这些步骤确保了数据在不同系统之间的无缝对接,并保证了数据的一致性和完整性。 ![电商OMS与WMS系统接口开发配置](https://pic.qeasy.cloud/T16.png~tplv-syqr462i7n-qeasy.image)