金蝶付款申请单到钉钉供应商月结付款的ETL转换与写入技巧

  • 轻易云集成顾问-蔡威
### 集成金蝶云星空数据到钉钉的技术解析:付款申请单对接方案 在企业级应用系统中,如何高效、准确地实现跨平台数据集成始终是一个关键挑战。本文将深入探讨如何通过轻易云数据集成平台,将金蝶云星空中的付款申请单(executeBillQuery接口获取)成功对接至钉钉供应商月结付款流程(topapi/processinstance/create接口写入)。为确保项目执行的精确性,我们采用了名称为“金蝶付款申请单->钉钉供应商月结付款①”的方案。 首先,为了保证从金蝶云星空获取的数据不漏单和及时处理,我们使用了定时可靠的抓取策略。这一策略依赖于调度机制,定期调用executeBillQuery接口,并结合分页及限流技术,有效应对大规模数据请求。此外,通过实时监控与日志记录模块,可以确保每一步操作均有迹可循,同时迅速定位并排除潜在问题。 其次,在进行批量集成时,需要考虑到两者之间的数据格式差异。我们设计了一套定制化的数据映射流程,从而实现不同字段间的一致性转换。例如,针对日期格式、金额精度等可能存在差异的信息,会作出相应标准化处理,以满足目标平台的要求。 对于大量数据快速写入至钉钉,则利用批量处理及多线程优化操作,加速了topapi/processinstance/create接口的调用速度。同时,引入异常处理与错误重试机制,不仅提高稳定性,还显著降低因网络波动或临时故障导致的数据传输失败率。 最后,在整个过程中,多维度监控手段包括性能分析、状态跟踪以及报表生成均发挥着重要作用,使得所有环节透明化、高效运转。这不仅提升了业务联动效率,也为日后的维护管理提供了宝贵依据。 ![轻易云数据集成平台金蝶集成接口配置](https://pic.qeasy.cloud/D11.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成过程中,调用源系统的API接口是至关重要的一步。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取付款申请单的数据并进行初步加工。 #### 接口调用配置 首先,我们需要配置调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置中的关键参数: - **API**: `executeBillQuery` - **Method**: `POST` - **Number**: `FBillNo` - **ID**: `FBillNo` - **Pagination**: 每页500条记录 - **ID Check**: `true` 请求字段包括但不限于以下内容: - 实体主键:`FID` - 单据编号:`FBillNo` - 单据状态:`FDOCUMENTSTATUS` - 创建人:`FCREATORID` - 审核人:`FAPPROVERID` - 创建日期:`FCREATEDATE` - 结算组织:`FSETTLEORGID.fname` 其他请求参数如分页、过滤条件等也需要一并配置。 #### 请求参数构建 根据元数据配置,我们需要构建请求参数。以下是一个示例请求体: ```json { "FormId": "CN_PAYAPPLY", "FieldKeys": "FID,FBillNo,FDOCUMENTSTATUS,FCREATORID,FAPPROVERID,FCREATEDATE,FSETTLEORGID.fname", "FilterString": "FApproveDate>='{{LAST_SYNC_TIME|dateTime}}'", "Limit": 500, "StartRow": 0, "TopRowCount": true } ``` 在这个请求体中,`FormId`指定了业务对象表单Id为付款申请单(CN_PAYAPPLY),`FieldKeys`定义了需要查询的字段集合,`FilterString`用于设置过滤条件,分页参数包括每页记录数(Limit)和起始行索引(StartRow)。 #### 数据获取与初步加工 通过上述配置和请求体,我们可以向金蝶云星空发送POST请求,获取付款申请单的数据。响应数据通常是一个JSON数组,每个元素对应一条记录。 获取到数据后,需要对其进行初步加工。例如,可以根据业务需求筛选出特定状态的单据,或者对日期字段进行格式化处理。 以下是一个简单的数据加工示例: ```python import json from datetime import datetime # 假设response_data是从接口获取到的JSON响应数据 response_data = ''' [ {"FID": "1", "FBillNo": "1001", "FDOCUMENTSTATUS": "A", "FCREATEDATE": "2023-01-01"}, {"FID": "2", "FBillNo": "1002", "FDOCUMENTSTATUS": "B", "FCREATEDATE": "2023-02-01"} ] ''' # 将JSON字符串解析为Python对象 data = json.loads(response_data) # 筛选出状态为"A"的单据,并格式化创建日期 filtered_data = [] for record in data: if record["FDOCUMENTSTATUS"] == "A": record["FCREATEDATE"] = datetime.strptime(record["FCREATEDATE"], "%Y-%m-%d").strftime("%d/%m/%Y") filtered_data.append(record) print(filtered_data) ``` 在这个示例中,我们筛选出状态为"A"的单据,并将创建日期格式化为“日/月/年”的形式。 #### 数据清洗与转换 在初步加工之后,还需要进一步清洗和转换数据,以便后续写入目标系统。在这一阶段,可以进行更复杂的数据处理操作,如字段映射、单位转换、异常值处理等。 例如,如果需要将金额字段从一种货币转换为另一种货币,可以使用汇率信息进行转换: ```python def convert_currency(amount, rate): return amount * rate # 假设我们有一个汇率信息 exchange_rate = 6.5 for record in filtered_data: if 'FPAYAMOUNTFOR_H' in record: record['FPAYAMOUNTFOR_H'] = convert_currency(float(record['FPAYAMOUNTFOR_H']), exchange_rate) ``` 通过以上步骤,我们可以完成从金蝶云星空获取付款申请单数据并进行初步加工,为后续的数据写入和集成奠定基础。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/S7.png~tplv-syqr462i7n-qeasy.image) ### 金蝶付款申请单到钉钉供应商月结付款的ETL转换与写入 在数据集成过程中,将金蝶付款申请单的数据转换为钉钉API接口所能接收的格式,并最终写入钉钉平台,是一个复杂且技术性极强的任务。本文将深入探讨如何使用轻易云数据集成平台完成这一过程,重点关注ETL(Extract, Transform, Load)转换步骤。 #### 数据请求与清洗 首先,从金蝶系统中提取原始数据。这一步骤包括对源数据进行清洗和预处理,以确保数据的完整性和一致性。由于本文重点在于ETL转换,因此不详细展开此部分。 #### 数据转换与写入 接下来,进入数据转换与写入阶段。我们需要将清洗后的数据按照钉钉API接口要求的格式进行转换,并通过API接口将数据写入钉钉平台。 ##### 钉钉API接口元数据配置 根据提供的元数据配置,目标平台为钉钉,其API接口为`topapi/processinstance/create`,请求方法为POST。以下是具体的字段配置: ```json { "api": "topapi/processinstance/create", "method": "POST", "idCheck": true, "request": [ { "field": "process_code", "label": "审批流的唯一码", "type": "string", "describe": "process_code在审批流程编辑页面的URL网址中获取。", "value": "PROC-A48FE992-9F20-4D1D-BDDB-92208230F790" }, { "field": "originator_user_id", "label": "发起人", "type": "string", "describe": "审批实例发起人的userid。", "value": "_findCollection find user_id from 02445559-061a-39c3-a15b-ba326de7e9a8 where name={F_VAOJ_FQR}" }, { "field": "dept_id", "label": "发起人所在部门", "type": "string", "describe": "发起人所在的部门,如果发起人属于根部门,传-1。", "value": "_findCollection find leader_in_dept.0.dept_id from 02445559-061a-39c3-a15b-ba326de7e9a8 where name={F_VAOJ_FQR}" }, { "field": "form_component_values", "label": "审批流表单参数", "type": "object", ... } ] } ``` ##### 字段映射与转换 1. **process_code**: 固定值`PROC-A48FE992-9F20-4D1D-BDDB-92208230F790`。 2. **originator_user_id**: 动态值,通过查找金蝶系统中的用户ID获取。 3. **dept_id**: 动态值,通过查找金蝶系统中用户所属部门ID获取。 4. **form_component_values**: 表单参数,包括多个子字段,需要逐一映射和转换。 以下是关键字段的映射和转换逻辑: ```json { ... { "field": "form_component_values", ... { // 单据编号 {"field":"单据编号","type":"string","value":"{FBillNo}"}, // 货款所属项目 {"field":"货款所属项目","type":"string","value":"{FSETTLEORGID}","mapping":"6295fa8ab3945438dd215d24","mappingDirection":"reverse"}, // 供应商名称 {"field":"供应商名称","type":"string","value":"{FCONTACTUNIT}"}, // 付款时间 {"field":"付款时间","type":"string","value":"{{FCREATEDATE|date}}"}, // 货款属性 {"field":"货款属性","type":"string","value":"_function case '{F_VAOJ_HKSX}' when 'CP' then '成品' else '辅料' end"}, // 备注 {"field":"备注","type":"string","value":"备注为:{F_VAOJ_Remarks}"}, // 付款金额(元) {"field":"付款金额(元)","type":"string","value":"{FAPPLYAMOUNTFOR_H}"}, // 收款人(公司名称) {"field":"收款人(公司名称)","type":"string","value":"{FEACHCCOUNTNAME}"}, // 收款人帐号 {"field":"收款人帐号","type":"string","value":"{FEACHBANKACCOUNT}"} } } } ``` ##### 数据写入 完成上述字段映射和转换后,通过HTTP POST请求将数据发送至钉钉API接口,实现数据写入操作。 ```python import requests url = 'https://oapi.dingtalk.com/topapi/processinstance/create' headers = {'Content-Type': 'application/json'} data = { 'process_code': 'PROC-A48FE992-9F20-4D1D-BDDB-92208230F790', 'originator_user_id': originator_user_id, 'dept_id': dept_id, 'form_component_values': form_component_values } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print("Data successfully written to DingTalk") else: print("Failed to write data to DingTalk") ``` 通过以上步骤,我们成功地将金蝶付款申请单的数据转换并写入到钉钉平台,实现了跨系统的数据集成。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T9.png~tplv-syqr462i7n-qeasy.image)