轻易云数据集成平台的采购退料单数据转换与写入

  • 轻易云集成顾问-李国敏
### 金蝶云星空数据集成技术案例:采购退料单(除了委外)OK7.31 在企业资源规划系统中,高效的数据处理和准确的业务数据对接是关键。本次我们将探讨如何通过轻易云平台实现金蝶云星空与金蝶云星空之间的采购退料单(除了委外)的自动化数据集成。该方案不仅提高了业务流程的连贯性,还显著提升了数据处理速度和准确性。 #### 高吞吐量数据写入能力的应用 面对日益增长的数据量,金蝶云星空需要能够快速、稳定地接收大量数据。为了确保所有采购退料单都能及时无误地写入到目标系统中,我们采用了批量写入API `batchSave`,配合高吞吐量的数据写入机制。这一组合保证了即使在峰值流量下,也能顺利完成大批量数据的录入工作。 #### 实时监控与告警机制 为了实时掌握每个数据集成任务的状态,我们利用集中式监控和告警系统,对每一个步骤进行细致跟踪。一旦出现异常情况,例如接口响应超时或请求失败,立即触发告警,并记录详细日志以便后续排查。这样既提高了运维效率,也保障了系统运行的可靠性。 #### API调用与分页限流问题解决 对于从源系统获取大规模历史交易记录的问题,我们使用 `executeBillQuery` API来抓取所需的数据。然而,由于API接口存在分页限制,通过设计合理的分页策略并借助限流控制模块,将完整查询过程分解为多个小段落,以避免因过载而导致的信息丢失或请求被拒绝。同时,通过优化调度算法,有效均衡服务器负载,实现资源最大化利用。 #### 数据格式差异与自定义转换逻辑 不同系统间常会遇到格式不一致的问题,为了解决这个挑战,我 们在轻易云平台上配置了自定义的数据转换规则,使得源端格式可以灵活映射为目标端标准。这一过程包括字段匹配、类型转换以及必要的数据清洗操作,从而确保传输过来的每条信息都符合目标系统要求,大幅减少人工干预,提高整体自动化水平。 #### 异常处理及重试机制 最后,在实际操作过程中,不可避免会遭遇各种异常情况,例如网络波动引起的短暂连接中断或数据库锁定等现象。针对此类潜在风险点,特别设计了一套完善的错误检测及重试机制。当某个步骤出错时,会根据预设条件进行多次尝试直至成功并退出,同时保留错误日志方便后续分析。在这一保证 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/D29.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在轻易云数据集成平台中,调用源系统接口是数据处理生命周期的第一步。本文将详细探讨如何通过调用金蝶云星空接口`executeBillQuery`来获取采购退料单(除了委外)的数据,并进行初步加工。 #### 接口概述 金蝶云星空提供了丰富的API接口,其中`executeBillQuery`用于查询业务单据信息。该接口采用POST请求方式,支持分页查询和多条件过滤,非常适合大批量数据的获取。 #### 元数据配置 以下是针对采购退料单(除了委外)的元数据配置: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FPURMRBENTRY_FEntryID", "pagination": { "pageSize": 500 }, "idCheck": true, "request": [ {"field":"FPURMRBENTRY_FEntryID","label":"明细信息ID","type":"string","value":"FPURMRBENTRY_FEntryID"}, {"field":"FID","label":"实体主键","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"}, {"field":"FStockOrgId_FNumber","label":"退料组织","type":"string","value":"FStockOrgId.FNumber"}, {"field":"FDate","label":"退料日期","type":"string","value":"FDate"}, {"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","value":"FBillTypeID.FNumber"}, {"field":"FTAKEDELIVERYNO","label":"提货单号","type":"string","value":"FTAKEDELIVERYNO"}, {"field":"FSupplierID_FName","label":"供应商","type":"string","value":"FSupplierId.FName"}, {"field":"FDESCRIPTION","label":"备注","type":"string","value":"FDESCRIPTION"} ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"}, {"field": "FilterString", "label": "过滤条件", "type": "string", "describe": `示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=`, `value`: `FDate >='{{LAST_SYNC_TIME|date}}' and FBillTypeID.FNumber<>'TLD04_SYS' and FMRTYPE<>'A' and FSupplierId.FName <>'鼎骏'and FSupplierId.FName <>'虚拟组织'` }, {"field": `FieldKeys`, `label`: `需查询的字段key集合`, `type`: `array`, `describe`: `金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber`, `parser`: { `"name"`: `"ArrayToString"`, `"params"`: "," } }, {"field": `"FormId"`, `"label"`: `"业务对象表单Id"`, `"type"`: `"string"`, `"describe"`: `"必须填写金蝶的表单ID如:PUR_PurchaseOrder"`, `"value"`: `"PUR_MRB"` } ] } ``` #### 请求参数解析 1. **基本字段**: - **FPURMRBENTRY_FEntryID**:明细信息ID,用于唯一标识每条记录。 - **FID**:实体主键,标识整个业务对象。 - **FBillNo**:单据编号,方便追踪和管理。 - **FDocumentStatus**:单据状态,了解当前处理进度。 - **FStockOrgId_FNumber**:退料组织,指明退料的具体组织。 2. **其他请求参数**: - **Limit**和**StartRow**:用于分页控制,每次请求获取的数据量和起始位置。 - **FilterString**:过滤条件,可以根据业务需求自定义,如时间范围、供应商等。 - **FieldKeys**:需要查询的字段集合,通过逗号分隔多个字段。 #### 数据请求与清洗 在实际操作中,我们首先构建请求体,并调用API接口: ```python import requests url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'PUR_MRB', 'FieldKeys': 'FPURMRBENTRY_FEntryID,FID,FBillNo,FDocumentStatus,FStockOrgId.FNumber,FDate,FBillTypeID.FNumber,FTAKEDELIVERYNO,FSupplierId.FName,FDESCRIPTION', 'FilterString': 'FDate >=\'2023-01-01\' and FBillTypeID.FNumber<>\'TLD04_SYS\' and FMRTYPE<>\'A\'', 'Limit': 500, 'StartRow': 0 } response = requests.post(url, headers=headers, json=payload) data = response.json() ``` #### 数据转换与写入 获取到的数据需要进行清洗和转换,以便后续写入目标系统。常见的数据清洗操作包括: 1. **字段映射**:将源系统字段映射到目标系统字段。 2. **数据格式转换**:如日期格式、数值类型等。 3. **异常处理**:处理缺失值、重复值等异常情况。 ```python def clean_data(raw_data): cleaned_data = [] for record in raw_data: cleaned_record = { 'entry_id': record['FPURMRBENTRY_FEntryID'], 'bill_no': record['FBillNo'], 'status': record['FDocumentStatus'], 'org_number': record['FStockOrgId.FNumber'], 'date': record['FDate'], 'supplier_name': record['FSupplierId.FName'], 'description': record['FDESCRIPTION'] } cleaned_data.append(cleaned_record) return cleaned_data cleaned_data = clean_data(data) ``` 通过上述步骤,我们成功地从金蝶云星空获取了采购退料单的数据,并进行了初步清洗,为后续的数据转换与写入奠定了基础。这一过程展示了如何利用轻易云数据集成平台高效地实现异构系统间的数据对接。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/S4.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将采购退料单数据转换并写入金蝶云星空 在数据集成过程中,将源平台的数据转换为目标平台可接受的格式是关键步骤之一。本文将详细介绍如何使用轻易云数据集成平台将采购退料单的数据进行ETL转换,并通过金蝶云星空API接口写入目标平台。 #### 1. 配置元数据 首先,我们需要根据元数据配置来定义API请求的结构和字段映射。以下是元数据配置的详细内容: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo,FDate,FSupplierID_FName,FSettleCurrId_FNumber", "bodyName": "details", "header": ["FBillNo", "FDate", "FSupplierID_FName", "FSettleCurrId_FNumber", "FStockOrgId_FNumber"], "body": ["FMATERIALID_FNumber", "FRMREALQTY", "FTAXPRICE", "FALLAMOUNT", "FDiscount", "FStockOrgId_FNumber"] }, ... } ``` #### 2. 数据请求与清洗 在数据请求阶段,我们从源系统获取原始的采购退料单数据。为了确保数据质量,需要对原始数据进行清洗和预处理。例如,确保日期格式一致、供应商名称正确等。 #### 3. 数据转换与映射 接下来,我们将清洗后的数据按照目标平台的要求进行转换和映射。以下是主要字段的映射规则: - **单据编号 (FBillNo)**: 原始值后加上“-1”后缀。 - **单据类型 (FBillTypeID_FNumber)**: 固定值 “TLD01_SYS”。 - **业务类型 (FBusinessType)**: 固定值 “CG”。 - **退料日期 (FDate)**: 保持原始值。 - **退料组织 (FStockOrgId)**: 根据原始组织编码进行转换,例如“100”转换为“125”。 - **结算组织 (FSettleOrgId)**: 同样根据原始组织编码进行转换。 - **供应商 (FSupplierID)**: 使用供应商名称进行解析。 - **结算币别 (FSettleCurrId)**: 使用币别编号进行解析。 以下是部分字段的具体配置示例: ```json { "field": "FBillNo", "label": "单据编号", "type": "string", ... }, { ... "field": "FDate", ... }, { ... "_function case when '{FStockOrgId_FNumber}' ='100' then '125' when '{FStockOrgId_FNumber}' ='202' then '126' else '109' end" } ``` #### 4. 构建API请求体 根据上述映射规则,构建符合金蝶云星空API接口要求的请求体。以下是一个示例请求体: ```json { ... { "_function case when '{FStockOrgId_FNumber}' ='100' then '125' when '{FStockOrgId_FNumber}' ='202' then '126' else '109' end" }, ... } ``` #### 5. 调用API接口 使用轻易云提供的全异步操作机制,通过POST方法调用金蝶云星空的`batchSave`接口,将构建好的请求体发送到目标平台。确保每个字段都符合目标平台的要求,并且所有基础资料都已经过验证。 ```json { ... } ``` #### 技术要点总结 1. **字段映射与转换**:通过元数据配置文件定义字段映射规则,确保源系统的数据能够正确转换为目标系统所需格式。 2. **多层次解析**:利用轻易云的数据解析功能,对复杂字段(如多类别基础资料)进行解析和转换。 3. **异步操作**:利用轻易云全异步操作机制,提高数据处理效率,确保高并发情况下系统稳定性。 通过以上步骤,我们成功实现了从源系统到金蝶云星空的采购退料单数据集成,确保了数据的一致性和准确性。这一过程展示了轻易云在复杂数据集成场景中的强大能力。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/T23.png~tplv-syqr462i7n-qeasy.image)