从金蝶云星空到旺店通的ETL转换与写入

  • 轻易云集成顾问-张妍琪
### 金蝶云星空采购收料通知单集成到旺店通·企业奇门的技术案例分享 在实际业务处理中,如何高效地完成系统之间的数据对接是一个常见而又复杂的问题。此次,我们将分享利用轻易云数据集成平台成功实现金蝶云星空采购收料通知单(executeBillQuery API接口数据)与旺店通·企业奇门(wdt.purchase.order.push API接口数据)的无缝对接,具体方案名为“金蝶采购收料通知单=>旺店通采购订单(ok)”。 为了保证整个数据集成过程可靠且高效,我们主要从以下几个关键点入手: 1. **确保集成过程中不漏单**:通过定时可靠抓取金蝶云星空的接口数据,细致处理分页和限流问题,实现全面的数据获取。 2. **快速批量写入**:利用并行处理技术,加速大量数据写入到旺店通·企业奇门,实现快速批量操作。 3. **调用API接口**:详细分析如何有效调用金蝶云星空的executeBillQuery以及将其转换后推送至旺店通·企业奇门的wdt.purchase.order.push接口。 4. **格式差异处理**:解决两者之间的数据格式差异,通过定制化的数据映射,对接时进行必要转化和调整。 5. **监控及异常处理机制**:实现实时监控与日志记录,并建立健全的异常处理与错误重试机制,以提高整体稳定性和响应能力。 以上各个环节通过轻易云提供的平台功能逐步落实,从而构建出一套切实可行、高效稳健的数据对接流程。在下文中,将具体介绍每一步所采取的方法及技术细节。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/D6.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取采购收料通知单的数据,并进行必要的加工处理。 #### 配置元数据 首先,我们需要配置元数据,以便正确地调用金蝶云星空的API接口。以下是关键的元数据配置: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FDetailEntity_FEntryID", "pagination": { "pageSize": 500 }, "idCheck": true, "request": [ {"field":"FBillNo","label":"单据编号","type":"String","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"String","value":"FDocumentStatus"}, {"field":"FMaterialId","label":"物料编码","type":"String","value":"FMaterialId.fnumber"}, {"field":"FStockOrgId","label":"收料组织","type":"String","value":"FStockOrgId"}, {"field":"FMaterialName","label":"物料名称","type":"String","value":"FMaterialName"}, {"field":"FDate","label":"收料日期","type":"String","value":"FDate"}, {"field":"FMateriaModel","label":"规格型号","type":"String","value":"FMateriaModel"}, {"field":"FBillTypeID","label":"单据类型","type":"String","value":"FBillTypeID.FNumber"}, {"field":"FAuxPropId","label":"辅助属性","type":"String","value":"FAuxPropId"}, {"field":"FOwnerTypeIdHead","label":"货主类型","type":"String","value":"FOwnerTypeIdHead"}, {"field":"FOwnerIdHead","label":"货主","type":"String","value":"FOwnerIdHead"}, {"field": "FSrcBillNo", "label": "源单编号(采购订单)", "type": "string", "value": "FSrcBillNo"} ], "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": "", // 示例过滤条件,可以根据实际需求调整 // 此处假设我们只获取最近同步时间之后的数据,并且采购组织为'7000'或'3000' // 且单据类型不等于'SLD04_SYS' // LAST_SYNC_TIME 是一个占位符,实际使用时会被替换为具体时间 // FPurOrgId.FNumber 是采购组织编号 // FApproveDate 是审核日期 // FBillTypeID.FNumber 是单据类型编号 // 示例:最近同步时间为2023-01-01,采购组织为'7000'或'3000' // 单据类型不等于'SLD04_SYS' // value: `FApproveDate>='2023-01-01' and FPurOrgId.FNumber in ('7000','3000') and FBillTypeID.FNumber <> 'SLD04_SYS'` // 实际使用时可以动态生成这个字符串 value: `FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' and FPurOrgId.FNumber in ('7000','3000') and FBillTypeID.FNumber <> 'SLD04_SYS'` }, { 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_ReceiveBill' } ] } ``` #### 调用API接口 在配置好元数据后,我们可以通过轻易云平台发起HTTP POST请求来调用`executeBillQuery`接口。以下是示例代码: ```python import requests url = "<轻易云平台URL>/executeBillQuery" headers = { 'Content-Type': 'application/json' } payload = { # 根据元数据配置构建请求体 # 注意:这里需要根据实际情况填充具体值,例如分页参数、过滤条件等 # 示例: # FilterString 的值可以动态生成,如下所示: # filter_string = f"FApproveDate>='{last_sync_time}' and FPurOrgId.FNumber in ('7000','3000') and FBillTypeID.FNumber <> 'SLD04_SYS'" # 构建请求体 request_body = { ... # 填充其他必要字段 ... } } response = requests.post(url, headers=headers, json=payload) if response.status_code == 200: data = response.json() # 对返回的数据进行处理和加工,例如清洗、转换等操作 else: print(f"Error occurred: {response.status_code}") ``` #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换,以便后续写入目标系统。以下是一些常见的数据处理操作: 1. **字段映射**:将源系统中的字段映射到目标系统中的对应字段。 2. **数据格式转换**:例如,将日期字符串转换为标准日期格式。 3. **数据过滤**:去除无效或重复的数据。 示例代码如下: ```python def clean_and_transform(data): cleaned_data = [] for record in data: transformed_record = { # 映射字段,例如: # 源系统中的物料编码映射到目标系统中的物料编码 'material_code': record['FMaterialId.fnumber'], ... # 执行其他必要的转换和清洗操作 ... } cleaned_data.append(transformed_record) return cleaned_data # 获取到原始数据后进行清洗和转换 cleaned_data = clean_and_transform(data) ``` 通过上述步骤,我们成功地调用了金蝶云星空的`executeBillQuery`接口,获取并加工了采购收料通知单的数据。这些处理后的数据可以进一步用于写入目标系统,实现不同系统间的数据无缝对接。 ![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/S30.png~tplv-syqr462i7n-qeasy.image) ### 数据集成生命周期第二步:ETL转换与写入旺店通·企业奇门API接口 在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,转为目标平台——旺店通·企业奇门API接口所能够接收的格式,最终写入目标平台。本文将详细探讨如何通过轻易云数据集成平台实现这一过程。 #### 元数据配置解析 在进行ETL转换之前,首先需要理解元数据配置。以下是我们使用的元数据配置: ```json { "api": "wdt.purchase.order.push", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "FBillNo,FStockID,FSupplierId", "bodyName": "details_list", "bodySum": ["FActReceiveQty"], "header": ["FBillNo", "FStockID", "FSupplierId"], "body": ["FTaxPrice", "FPriceUnitQty", "FMaterialId", "FActReceiveQty", "FAmount"] }, "request": [ {"field":"provider_no","label":"供应商编号","type":"string","value":"{FSupplierId}"}, {"field":"warehouse_no","label":"仓库编号","type":"string","value":"{FStockID}"}, {"field":"outer_no","label":"API单号","type":"string","value":"{FBillNo}"}, {"field":"is_use_outer_no","label":"传入ERP采购单号","type":"string","value":"1"}, {"field":"is_check","label":"自动审核","type":"string","value":"1"}, {"field":"contact","label":"收货人姓名","type":"string"}, {"field":"telno","label":"收货人联系电话","type":"string"}, {"field":"receive_address","label":"收货地址","type":"string"}, {"field":"expect_arrive_time","label":"预计到货时间","type":"string"}, {"field":"other_fee","label":"其他费用","type":"string"}, {"field":"post_fee","label":"邮资","type":"string"}, { "field": "details_list", "label": "采购明细节点", "type": "array", "children": [ {"field": "remark", "label": "备注", "type": "string", "parent": "details_list"}, {"field": "spec_no", "label": "商家编码", "type": "string", "value": "{{details_list.FMaterialId}}", "parent": "details_list" }, { "field": "num", "label": "采购量", "type": "string", "value": "{{details_list.FPriceUnitQty}}", "parent": "details_list" }, {"field": "tax_amount", "label": 税后金额, type: string, parent: details_list }, { field: discount, label: 折扣, type: string, parent: details_list }, { field: tax, label: 税率, type: string, parent: details_list }, { field: tax_price, label: 税后单价, type: string, value: {{details_list.FTaxPrice}}, parent: details_list }, { field: price, label: 税前单价, type: string, value: {{details_list.FTaxPrice}}} ], value: details_list } ], otherRequest: [ { field: purchase_info, label: 采购列表节点, type: string } ] } ``` #### 数据转换与写入步骤 1. **提取(Extract)**: - 从金蝶采购收料通知单中提取所需字段,如 `FBillNo`、`FStockID`、`FSupplierId` 等。这些字段将用于后续的数据转换和写入。 2. **转换(Transform)**: - 将提取的数据按照旺店通·企业奇门API接口要求进行格式转换。 - 根据元数据配置,将 `FSupplierId` 转换为 `provider_no`,`FStockID` 转换为 `warehouse_no`,以及 `FBillNo` 转换为 `outer_no`。 - 对于采购明细节点 `details_list`,将 `FMaterialId` 转换为 `spec_no`,将 `FPriceUnitQty` 转换为 `num`,将 `FTaxPrice` 转换为 `tax_price` 和 `price`。 3. **加载(Load)**: - 使用POST方法,通过API接口将转换后的数据写入旺店通·企业奇门。 - 确保每个字段都符合API接口的要求,并且所有必填字段都已正确填写。 #### 实际操作示例 假设我们从金蝶系统中提取到以下数据: ```json { FBillNo: 'PO123456', FStockID: 'WH001', FSupplierId: 'SUP123', details_list: [ { FMaterialId: 'MAT001', FPriceUnitQty: '100', FTaxPrice: '10.5' } ] } ``` 根据元数据配置,我们需要将其转换为如下格式: ```json { provider_no: 'SUP123', warehouse_no: 'WH001', outer_no: 'PO123456', is_use_outer_no: '1', is_check: '1', contact:'', telno:'', receive_address:'', expect_arrive_time:'', other_fee:'', post_fee:'', details_list:[ { spec_no:'MAT001', num:'100', tax_price:'10.5', price:'10.5' } ] } ``` 然后,通过调用API接口,将上述JSON对象发送到旺店通·企业奇门,实现数据的成功写入。 #### 注意事项 - **字段映射**:确保所有字段都正确映射,并且类型匹配。 - **必填字段**:确保所有必填字段都有值,否则可能会导致API调用失败。 - **错误处理**:在实际操作中,需要对可能出现的错误进行处理,如网络问题、API返回错误等。 通过上述步骤,我们可以高效地完成从金蝶系统到旺店通·企业奇门的ETL转换和数据写入过程。 ![钉钉与ERP系统接口开发配置](https://pic.qeasy.cloud/T13.png~tplv-syqr462i7n-qeasy.image)