轻易云平台助力企业实现收料与采购订单的高效集成

  • 轻易云集成顾问-叶威宏
### 收料通知单对接旺店通采购订单技术案例分享 在企业的运营过程中,数据集成的准确性和实时性是提升业务效率的重要因素。本篇文章将介绍如何通过使用轻易云数据集成平台,实现金蝶云星空系统中的收料通知单精准、及时地对接到旺店通·企业奇门中的采购订单。 首先,我们需要调用金蝶云星空提供的`executeBillQuery`接口,从中获取最新生成的收料通知单。这一步骤非常关键,我们必须确保不会漏掉任何一条数据。为此,需要处理API接口分页和限流的问题,以保证大量数据能够顺利被抓取。在这个过程中,可以设置定时任务,定期从金蝶云星空接口可靠地获取增量更新的数据,有效维护了数据信息的完整性。 同时,对于从金蝶云星空拉取的大量收料通知单数据,还需进行格式转换,以便与旺店通·企业奇门的数据结构相匹配。由于两个系统之间的数据格式可能存在差异,映射规则及字段转换就变得至关重要,这样可以避免因格式不符而导致的数据写入失败问题。 在准备好适配后的数据后,通过调用旺店通·企业奇门提供的`wdt.purchase.order.push` API,将这些信息批量写入到对应的位置。这不仅要求快速高效地完成大规模数据传输,还需要实现异常处理及错误重试机制,一旦出现意外情况,如网络故障或接口响应超时等状况,可以立即捕获并重试操作以确保整体流程运行顺畅。 此外,为了全程监控整个对接过程,需要结合轻易云平台自带的日志记录功能,对每一步操作进行详细记录与分析。这些实时监控能力让我们能迅速挖掘并解决潜在的问题,极大提升了跨系统集成的一致性和透明度。 这样完整的一套方案,不仅有效保障了收料通知单正确无误地转化为采购订单,同时也提高了整体业务运作效率,为进一步优化资源管理奠定坚实基础。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/D10.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的`executeBillQuery`接口,获取收料通知单的数据,并进行必要的加工处理。 #### 接口配置与请求参数 首先,我们需要配置元数据,以便正确调用金蝶云星空的`executeBillQuery`接口。以下是关键的元数据配置: ```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":"FID","label":"FID","type":"string","value":"FID"} ], "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`: `FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' and (FStockOrgId.Fnumber='106' or FStockOrgId.Fnumber='114')` }, {"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"` } ] } ``` #### 请求构建与发送 根据上述配置,我们可以构建请求体并发送请求。以下是一个示例代码片段,用于构建和发送HTTP POST请求: ```python import requests import json url = 'https://api.kingdee.com/executeBillQuery' headers = {'Content-Type': 'application/json'} payload = { 'FormId': 'PUR_ReceiveBill', 'FieldKeys': ','.join([ 'FBillNo', 'FDocumentStatus', 'FMaterialId.fnumber', 'FStockOrgId', 'FMaterialName', 'FDate', # ...省略部分字段... 'FID' ]), 'FilterString': f"FApproveDate>='{last_sync_time}' and (FStockOrgId.Fnumber='106' or FStockOrgId.Fnumber='114')", 'Limit': pagination_page_size, 'StartRow': pagination_start_row } response = requests.post(url, headers=headers, data=json.dumps(payload)) data = response.json() ``` #### 数据清洗与转换 获取到原始数据后,需要对其进行清洗和转换,以便后续处理和存储。常见的数据清洗操作包括: 1. **字段重命名**:将API返回的字段名转换为更具可读性的名称。 2. **数据类型转换**:确保所有字段的数据类型符合预期,例如将字符串转换为日期或数字。 3. **缺失值处理**:填充或删除缺失值,以保证数据完整性。 以下是一个示例代码片段,用于进行基本的数据清洗和转换: ```python import pandas as pd # 假设data是从API返回的JSON数据 df = pd.DataFrame(data) # 字段重命名 df.rename(columns={ 'FBillNo': 'bill_no', 'FDocumentStatus': 'document_status', # ...省略部分字段... }, inplace=True) # 数据类型转换 df['date'] = pd.to_datetime(df['date']) df['quantity'] = df['quantity'].astype(float) # 缺失值处理 df.fillna({'quantity': 0}, inplace=True) ``` #### 数据写入目标系统 经过清洗和转换的数据可以写入目标系统。在本案例中,目标系统是旺店通采购订单。我们可以使用轻易云平台提供的数据写入功能,将处理后的数据批量写入目标系统。 以下是一个示例代码片段,用于将清洗后的数据写入目标系统: ```python target_url = 'https://api.wangdiantong.com/purchase_order' target_headers = {'Content-Type': 'application/json'} for index, row in df.iterrows(): payload = { 'order_no': row['bill_no'], 'status': row['document_status'], # ...省略部分字段... 'quantity': row['quantity'] } response = requests.post(target_url, headers=target_headers, data=json.dumps(payload)) if response.status_code != 200: print(f"Failed to write data for order {row['bill_no']}") ``` 通过以上步骤,我们实现了从金蝶云星空获取收料通知单数据,并将其加工后写入旺店通采购订单系统。这一过程展示了如何利用轻易云平台高效地进行异构系统间的数据集成。 ![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/S24.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将收料通知单对接旺店通采购订单 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是具体的技术实现过程。 #### 元数据配置解析 我们通过轻易云数据集成平台提供的元数据配置,将源平台的数据转换为旺店通采购订单API所需的格式。以下是元数据配置的详细解析: ```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", "FNote"], "body": ["FMaterialId", "FActReceiveQty", "FPrice"] }, "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":"remark","label":"表头备注","type":"string","value":"{FNote}"}, {"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": "prop1", "label": "自定义属性1", "type": "string", "parent": "details_list"}, {"field": "prop2", "label": "自定义属性2", "type": "string", "parent": "details_list"}, {"field": "spec_no", "label": "商家编码", "type": "string", "value": "{{details_list.FMaterialId}}", "parent": "details_list"}, {"field": "num", "label": "采购量", ``` #### 数据请求与清洗 在此阶段,我们从源平台获取原始数据,并对其进行清洗和预处理。清洗过程包括去除冗余字段、标准化字段名称和格式等操作,以确保数据能够顺利进行后续的转换。 #### 数据转换与写入 接下来,我们使用轻易云的数据转换功能,将清洗后的数据按照旺店通·企业奇门API接口的要求进行转换。具体步骤如下: 1. **设置请求参数**: - 根据元数据配置中的`request`字段,设置每个参数对应的值。例如,将`FSupplierId`映射为`provider_no`,将`FStockID`映射为`warehouse_no`等。 2. **构建请求体**: - 构建包含所有必要信息的请求体,包括表头信息和明细信息。根据元数据配置中的`header`和`body`字段,将相应的数据填充到请求体中。 3. **发送HTTP请求**: - 使用POST方法,将构建好的请求体发送到旺店通·企业奇门API接口(即`wdt.purchase.order.push`)。 以下是一个示例代码片段,用于展示如何构建并发送HTTP请求: ```python import requests import json # 构建请求头 headers = { 'Content-Type': 'application/json' } # 构建请求体 payload = { 'provider_no': source_data['FSupplierId'], 'warehouse_no': source_data['FStockID'], 'outer_no': source_data['FBillNo'], 'is_use_outer_no': '1', 'is_check': '1', 'contact': '', 'telno': '', 'receive_address': '', 'expect_arrive_time': '', 'remark': source_data['FNote'], 'other_fee': '', 'post_fee': '', } # 添加采购明细 details_list = [] for item in source_data['details']: details = { 'spec_no': item['FMaterialId'], 'num': item['FActReceiveQty'], 'price': item['FPrice'] # 添加其他必要字段 } details_list.append(details) payload['details_list'] = details_list # 将请求体转换为JSON格式 data = json.dumps(payload) # 发送HTTP POST请求 response = requests.post('https://api.wangdian.cn/wdt/openapi/wdt.purchase.order.push', headers=headers, data=data) # 检查响应状态码和内容 if response.status_code == 200: print('成功写入目标平台:', response.json()) else: print('写入失败:', response.status_code, response.text) ``` 通过上述步骤,我们成功地将源平台的数据转换并写入到目标平台旺店通·企业奇门,实现了不同系统间的数据无缝对接。这一过程不仅提高了业务效率,还确保了数据的一致性和准确性。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/T20.png~tplv-syqr462i7n-qeasy.image)