轻易云平台ETL转换技术:从金蝶到聚水潭的数据对接

  • 轻易云集成顾问-蔡威
### 金蝶采购订单-聚水潭采购:高效数据集成解决方案 在此次技术案例中,我们将分享如何通过系统配置和API调用,实现金蝶云星空中的采购订单数据与聚水潭的无缝对接。该方案旨在确保从数据抓取、处理到写入的每个环节都准确可靠,避免任何漏单情况,并保障大批量数据快速且安全地传输。 首先,通过轻易云平台强大的全生命周期管理功能,我们可以实时监控金蝶云星空接口`executeBillQuery`的数据提取过程。在这个过程中,定时可靠地抓取数据尤为重要,以保证不会遗漏任何一个有效的采购订单。此外,为了应对金蝶云星空接口可能存在的分页和限流问题,我们采用了精细化的数据分页处理策略,每次请求后记录最后成功获取的位置,将下一次查询起点参数化,从而实现高效的数据拉取。 当获取到原始订单数据后,我们需要针对金蝶云星空与聚水潭之间可能存在的数据格式差异进行精准转换。这些操作包括字段映射、类型转换以及必要的数据清洗,以便符合聚水潭入库规范。对于这些复杂性较高的步骤,可以通过自定义脚本或使用可视化工具提供的一键式映射功能来完成,大幅提升工作效率。 此外,在将处理后的订单信息批量写入到聚水潭时,需要调用其API `jushuitan.purchase.upload`,并配合合理的异常处理与错误重试机制。一旦出现网络波动或其他不可预见的问题,该机制能够自动识别失败情况并重新尝试上传,确保最终所有有效数据都能成功存储至目标系统。同时,为更好地满足业务需求,还可以定制化配置特有参数,使得不同种类及状态下的数据也能够正确归档和利用。 总之,本案例展示了在真实环境中,如何通过灵活运用多种技术手段,实现跨平台、高效率以及稳定可靠的数据集成。同样,对其他类似场景具有重要参考价值。 ![如何开发企业微信API接口](https://pic.qeasy.cloud/D3.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细介绍如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口来获取采购订单数据,并进行初步加工。 #### 接口配置与调用 首先,我们需要配置元数据以便正确调用金蝶云星空的`executeBillQuery`接口。以下是元数据配置的关键部分: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FPOOrderEntry_FEntryId", "pagination": { "pageSize": 100 }, "idCheck": true, "request": [ {"field":"FPOOrderEntry_FEntryId","label":"FPOOrderEntry_FEntryId","type":"string","value":"FPOOrderEntry_FEntryId"}, {"field":"FID","label":"FID","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FSourceBillNo","label":"源单编号","type":"string","value":"FSourceBillNo"}, {"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","value":"FBillTypeID.FNumber"}, {"field":"FBusinessType","label":"业务类型","type":"string","value":"FBusinessType"}, {"field":"FSupplierId_FNumber","label":"供应商","type":"string","value":"FSupplierId.FNumber"}, {"field":"FSettleModeId_FNumber","label":"结算方式","type":"string","value":"FSettleModeId.FNumber"}, {"field":"FPayConditionId_FNumber","label":"付款条件","type":"string","value":"FPayConditionId.FNumber"}, {"field":"FDate","label":"采购日期","type":"string","value":"FDate"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"} ], "otherRequest": [ {"field": "Limit", "label": "最大行数", "type": "string", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "StartRow", "label": "开始行索引", "type": "string", "value": "{PAGINATION_START_ROW}"}, {"field": "TopRowCount", "label": "返回总行数", "type": "int"}, { "field": "FilterString", "label": "过滤条件", "type": "string", "value": "'FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and FMaterialId.F_PSEH_CheckBox = '1' and FCLOSESTATUS = 'A' and FMRPCLOSESTATUS = 'A'" }, { "field": { name: 'ArrayToString', params: ',' } }, { field: 'FormId', label: '业务对象表单Id', type: 'string', value: 'PUR_PurchaseOrder' } ] } ``` #### 请求参数解析 1. **API和方法**:`api`字段指定了要调用的API为`executeBillQuery`,`method`字段指定了HTTP请求方法为POST。 2. **分页设置**:通过`pagination`字段设置每页的数据量为100条。 3. **请求字段**:在`request`数组中定义了需要查询的字段,如采购订单编号(FBillNo)、供应商编号(FSupplierId_FNumber)等。 4. **其他请求参数**: - `Limit`: 设置最大返回行数。 - `StartRow`: 设置开始行索引,用于分页。 - `FilterString`: 设置过滤条件,以确保只查询符合特定条件的数据。 - `FieldKeys`: 指定需要查询的字段集合,通过自定义解析器将数组转换为字符串。 - `FormId`: 指定业务对象表单ID为采购订单(PUR_PurchaseOrder)。 #### 数据请求与清洗 在完成元数据配置后,可以通过轻易云平台发起HTTP POST请求,调用金蝶云星空的接口获取采购订单数据。以下是一个示例请求体: ```json { "_api_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_method_": "/k3cloud/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc", "_args_":[ { "_formid_ ": “PUR_PurchaseOrder”, "_filter_ ": “'FApproveDate>='2023-01-01' and FMaterialId.F_PSEH_CheckBox = '1' and FCLOSESTATUS = 'A' and FMRPCLOSESTATUS = 'A'", "_limit_ ":100, "_startrow_ ":0, "_toprowcount_ ":true, "_fieldkeys_ ":"FBillNo,FPOOrderEntry_FEntryId,FSupplierId_FNumber,FDate,FDocumentStatus" } ] } ``` #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换,以满足目标系统的要求。常见的数据清洗操作包括: 1. **格式转换**:将日期、金额等字段转换为目标系统所需的格式。 2. **字段映射**:根据目标系统的数据结构,将源系统中的字段映射到目标系统中的相应字段。 3. **数据过滤**:根据业务需求,过滤掉不必要的数据记录。 例如,将采购日期(FDate)从字符串格式转换为标准日期格式: ```python import datetime def convert_date(date_str): return datetime.datetime.strptime(date_str, '%Y-%m-%d').date() # 示例转换 raw_date = '2023-10-01' converted_date = convert_date(raw_date) print(converted_date) # 输出:2023-10-01 ``` #### 小结 通过上述步骤,我们成功地调用了金蝶云星空的`executeBillQuery`接口,获取并初步加工了采购订单数据。这一步骤在整个数据集成生命周期中至关重要,为后续的数据转换与写入奠定了基础。 ![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/S27.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:ETL转换与聚水潭API接口对接技术解析 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台能够接收的格式。在本案例中,我们将金蝶采购订单的数据通过ETL转换,写入到聚水潭采购系统的API接口。 #### 数据请求与清洗 首先,我们从金蝶系统中获取采购订单数据。假设我们已经完成了数据请求和初步清洗工作,现在需要将这些数据进行转换,以符合聚水潭API接口的要求。 #### 数据转换与写入 为了实现这一目标,我们需要根据提供的元数据配置,将金蝶采购订单的数据映射到聚水潭API所需的字段格式。 ##### 元数据配置解析 ```json { "api": "jushuitan.purchase.upload", "effect": "EXECUTE", "method": "POST", "number": "po_id", "id": "po_id", "name": "po_id", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo", "bodyName": "details", "bodySum": ["FRemainStockINQty"], "header": ["FBillNo", "FSupplierId_FNumber", "FID"], "body": ["FMaterialId_FNumber", "FRemainStockINQty", "FTaxPrice", "FPOOrderEntry_FEntryId"] }, ... } ``` 上述配置文件定义了如何将金蝶系统的数据映射到聚水潭API所需的格式。以下是关键字段和操作的详细解释: - **api**: 指定了目标API接口为`jushuitan.purchase.upload`。 - **method**: 使用HTTP POST方法提交数据。 - **operation**: 定义了如何合并和处理数据,包括头部和体部字段。 - **request**: 定义了具体的数据字段映射和转换规则。 ##### 请求字段解析 ```json "request":[ {"field":"is_confirm","label":"是否自动确认单据","type":"bool","describe":"是否自动确认单据","value":"true"}, {"field":"supplier_id","label":"供应商","type":"int","describe":"供应商编号","value":"_mongoQuery f04d157b-04fa-3819-a9af-18c14035d099 findField=content.supplier_id where={\"content.supplier_code\":{\"$eq\":\"{FSupplierId_FNumber}\"}}"}, {"field":"external_id","label":"外部单号","type":"string","describe":"外部采购单号(单据上传成功之后对应页面外部单号)","value":"{FBillNo}"}, {"field":"remark","label":"备注","type":"string","value":"{FID}"}, {"field":"items","label":"商品列表","type":"array","describe":"商品列表","value":"details","children":[ {"field":"sku_id","label":"商品编码","type":"string","describe":"商品编码","value":"{{details.FMaterialId_FNumber}}"}, {"field":"qty","label":"数量","type":"float","describe":"数量","value":"{{details.FRemainStockINQty}}"}, {"field":"price","label":"单价","type":"float"}, {"field":"remark","label":"商品备注","type":"string","value":"{{details.FPOOrderEntry_FEntryId}}"} ]} ] ``` 在这个部分,我们重点关注以下几个关键字段: 1. **is_confirm**: 是否自动确认单据,设置为`true`。 2. **supplier_id**: 使用MongoDB查询语句,根据供应商编号获取供应商ID。 3. **external_id**: 映射金蝶系统中的采购单号`FBillNo`。 4. **remark**: 映射金蝶系统中的备注信息`FID`。 5. **items**: 商品列表,包含多个子字段,如商品编码、数量、单价和商品备注。 ##### 数据映射与转换 根据上述配置,我们需要执行以下步骤来完成数据转换: 1. **提取头部信息**: - `FBillNo`: 金蝶采购订单编号。 - `FSupplierId_FNumber`: 金蝶供应商编号,通过MongoDB查询获取对应的`supplier_id`。 - `FID`: 金蝶系统中的备注信息。 2. **提取体部信息**: - `FMaterialId_FNumber`: 商品编码。 - `FRemainStockINQty`: 商品数量。 - `FTaxPrice`: 商品单价。 - `FPOOrderEntry_FEntryId`: 商品备注。 3. **构建请求体**: ```json { "is_confirm": true, "supplier_id": <MongoDB查询结果>, "external_id": "<FBillNo>", "remark": "<FID>", "items": [ { "sku_id": "<FMaterialId_FNumber>", "qty": <FRemainStockINQty>, ... } ] } ``` 4. **发送HTTP POST请求**: 将构建好的请求体通过HTTP POST方法发送至聚水潭API接口,实现数据写入。 通过以上步骤,我们实现了从金蝶采购订单到聚水潭采购系统的数据ETL转换与写入。这一过程充分利用了轻易云平台提供的元数据配置,实现了不同系统间的数据无缝对接。 ![泛微OA与ERP系统接口开发配置](https://pic.qeasy.cloud/T29.png~tplv-syqr462i7n-qeasy.image)