轻松实现钉钉到金蝶的数据同步与集成

  • 轻易云集成顾问-李国敏
### 钉钉报销【月结贷款】集成到金蝶付款单【玥变】:技术案例分享 在企业的财务数据管理中,实现不同系统间的数据无缝对接,是提高效率和保证数据准确性的关键。本案例聚焦于如何将钉钉(DingTalk)的报销数据,精确、高效地集成到金蝶云星空(Kingdee Cloud Galaxy)中的付款单模块。本文我们将详细探讨这一过程中使用的核心API接口、分页处理方案及错误重试机制等技术细节。 为了实现这一目标,我们选用了`topapi/processinstance/get` API从钉钉获取报销流程实例的数据,并通过`batchSave` API批量写入至金蝶云星空。在具体实施过程中,确保数据不漏单和及时性是我们的首要任务。因此,我们引入了定时抓取机制,通过配置轻易云平台每日定时调用钉钉API,以便持续可靠地获取最新的待处理报销记录。 此外,由于两个系统间存在一定的数据格式差异,这对转换和映射带来了一些挑战。我们基于轻易云平台提供的一系列工具,实现了高效的数据转换与清洗,确保每一笔交易都能正确映射至相应的字段位置。同时,为了解决批量操作过程中可能出现的大量临时失败情况,我们设计并实现了一套稳健的错误重试策略,当某条记录写入失败后,可以即刻进行重新尝试,从而保障整体过程不中断且最终成功率达标。 以下内容将进一步深入介绍这些技术点,包括但不限于:处理接口限流问题、分页读取大规模数据、实时监控与日志记录,以及金蝶云星空针对特定业务需求所做的定制化调整与优化。在实际项目运行中,各种意外情况总会不可避免,因此我们也特别建立了一套异常预警机制,用以应对各种突发状况。这不仅极大提升了系统稳定性,也为运维人员提供了强有力的支持。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/D17.png~tplv-syqr462i7n-qeasy.image) ### 调用钉钉接口topapi/processinstance/get获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用钉钉接口`topapi/processinstance/get`,并对获取的数据进行加工处理。 #### 接口调用配置 首先,我们需要配置调用钉钉接口的元数据。以下是具体的配置项: ```json { "api": "topapi/processinstance/get", "method": "POST", "idCheck": true, "condition": [ [ { "field": "报销类别", "logic": "eq", "value": "月结货款" } ] ], "formatResponse": [ { "old": "付款方式", "new": "付款方式_new", "format": "string" } ], "request": [ { "label": "审批流的唯一码", "field": "process_code", "type": "string", "value": "PROC-A37CB912-0424-4584-AB8B-70F8D17DDFBC" }, { "label": "审批实例开始时间。Unix时间戳,单位毫秒。", "field": "start_time", "type": "string", "value": "_function ( {LAST_SYNC_TIME} - ( 3600 * 96) ) * 1000" }, { "label": "审批实例结束时间,Unix时间戳,单位毫秒", "field": "end_time", "type": "string", "value": "{CURRENT_TIME}000" }, { "label": "分页参数,每页大小,最多传20。", "field": "size", "type": "string", "value": 20 }, { "label": “分页查询的游标,最开始传0,后续传返回参数中的next_cursor值。", “field”: “cursor”, “type”: “string” } ] } ``` #### 请求参数详解 1. **process_code**: 审批流的唯一码,用于标识具体的审批流程。 2. **start_time**: 审批实例开始时间,以Unix时间戳表示。这里使用了一个函数计算,将上次同步时间减去96小时(4天),再转换为毫秒。 3. **end_time**: 审批实例结束时间,同样以Unix时间戳表示,这里使用当前时间乘以1000转换为毫秒。 4. **size**: 分页参数,每页大小设置为20。 5. **cursor**: 分页查询的游标,初始值为0,后续请求时传递上一次响应中的`next_cursor`值。 #### 数据过滤与转换 在获取到数据后,需要根据条件进行过滤和字段转换。以下是具体操作: 1. **条件过滤**: - 条件:报销类别等于“月结货款”。 - 实现:通过元数据中的`condition`字段进行配置。 2. **字段转换**: - 将原始字段“付款方式”重命名为“付款方式_new”。 - 实现:通过元数据中的`formatResponse`字段进行配置。 #### 实际案例操作步骤 1. **初始化请求参数**: 根据元数据配置初始化请求参数,并确保所有必需字段都已正确填充。 2. **发送请求**: 使用POST方法向钉钉接口发送请求,并携带初始化好的请求参数。 3. **接收响应并处理**: 接收响应后,根据预定义的条件对数据进行过滤,并对指定字段进行重命名和格式化处理。 4. **分页处理**: 如果响应中包含`next_cursor`值,则继续发送下一页请求,直到所有数据都被获取完毕。 以下是伪代码示例: ```python def fetch_data(): cursor = 0 while True: response = send_request({ 'process_code': 'PROC-A37CB912-0424-4584-AB8B-70F8D17DDFBC', 'start_time': calculate_start_time(), 'end_time': get_current_time(), 'size': 20, 'cursor': cursor }) data = response['data'] # 数据过滤 filtered_data = [item for item in data if item['报销类别'] == '月结货款'] # 字段转换 for item in filtered_data: item['付款方式_new'] = item.pop('付款方式') # 存储或进一步处理filtered_data cursor = response.get('next_cursor') if not cursor: break def send_request(params): # 实现HTTP POST请求逻辑 pass def calculate_start_time(): return (LAST_SYNC_TIME - (3600 * 96)) * 1000 def get_current_time(): return CURRENT_TIME * 1000 ``` 通过上述步骤,我们可以高效地从钉钉系统中获取所需的数据,并根据业务需求进行必要的加工处理。这不仅提高了数据集成的效率,也确保了数据的一致性和准确性。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/S14.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将钉钉报销数据转换并写入金蝶云星空 在数据集成的生命周期中,ETL(提取、转换、加载)是关键步骤之一。本文将详细探讨如何使用轻易云数据集成平台,将钉钉报销【月结贷款】的数据转换为金蝶云星空API接口可接受的格式,并最终写入目标平台。 #### 1. 数据请求与清洗 在进行ETL操作之前,首先需要从源平台(钉钉)获取原始数据,并进行必要的清洗和预处理。假设我们已经完成了这一步,并且得到了一个结构化的原始数据集。 #### 2. 数据转换与写入 接下来,我们重点关注如何将清洗后的数据通过轻易云平台转换为金蝶云星空API接口所需的格式,并进行写入操作。 ##### 2.1 API接口配置 根据提供的元数据配置,我们需要调用金蝶云星空的`batchSave` API接口,采用POST方法提交数据。以下是主要字段及其配置解析: - **FBillNo**: 单据编号,直接从源数据中的`extend.business_id`字段获取。 - **FBillTypeID**: 单据类型,固定值`FKDLX01_SYS`。 - **FDATE**: 业务日期,从源数据中的`extend.finish_time`字段获取。 - **FSETTLEORGID**: 结算组织,通过费用归属项目名称查找对应的组织编号。 - **FPAYORGID**: 付款组织,与结算组织相同。 - **FCURRENCYID**: 币别,固定值`PRE001`。 - **FCONTACTUNITTYPE**: 往来单位类型,固定值`BD_Supplier`。 - **FCONTACTUNIT**: 往来单位,通过供应商名称查找对应的单位编号。 - **FRECTUNITTYPE**: 收款单位类型,固定值`BD_Supplier`。 - **FRECTUNIT**: 收款单位,通过供应商名称查找对应的单位编号。 - **FSETTLECUR**: 结算币别,固定值`PRE001`。 - **FREMARK**: 备注,由多个字段组合而成,包括标题、客户信息和备注内容。 ##### 2.2 子表明细配置 对于付款单明细(FPAYBILLENTRY),我们需要处理以下字段: - **FSETTLETYPEID**: 结算方式,通过付款方式名称查找对应的编号。 - **FPURPOSEID**: 付款用途,固定值`SFKYT08_SYS`。 - **FPAYTOTALAMOUNTFOR**: 应付金额,从源数据中的金额字段获取。 - **FCOSTID**: 费用项目,通过项目报销类型名称查找对应的编号。 - **FCOMMENT**: 备注,从报销明细中的费用明细字段获取。 - **FOPPOSITEBANKACCOUNT**: 对方银行账号,根据收款信息中的身份类型和卡号或登录ID确定具体值。 - **FOPPOSITECCOUNTNAME**: 对方账户名称,从收款信息中的姓名字段获取。 ##### 2.3 最终请求体构建 根据上述配置,我们可以构建出最终的请求体。以下是一个示例: ```json { "FormId": "AP_PAYBILL", "Operation": "BatchSave", "IsAutoSubmitAndAudit": false, "IsVerifyBaseDataField": false, "Model": { "FBillNo": "{{extend.business_id}}", "FBillTypeID": {"FNUMBER": "FKDLX01_SYS"}, "FDATE": "{{extend.finish_time}}", "FSETTLEORGID": {"FNumber": "_findCollection find Number from ... where Name={{费用归属项目}}"}, "FPAYORGID": {"FNumber": "_findCollection find Number from ... where Name={{费用归属项目}}"}, "FCURRENCYID": {"FNumber": "PRE001"}, ... "FPAYBILLENTRY": [ { "FSETTLETYPEID": {"FNumber": "_findCollection find Number from ... where Name={{付款方式_new}}"}, ... "FPAYTOTALAMOUNTFOR": "{{月结货款明细.金额(元)}}", ... } ], ... } } ``` 通过以上步骤,我们成功地将钉钉报销【月结贷款】的数据转换为金蝶云星空API接口所需格式,并实现了无缝对接。这不仅提高了数据处理效率,也确保了各系统间的数据一致性和准确性。 ![打通金蝶云星空数据接口](https://pic.qeasy.cloud/T11.png~tplv-syqr462i7n-qeasy.image)