ETL转换和数据写入金蝶云星辰V2的实战案例

  • 轻易云集成顾问-彭亮
### 旺店通·企业奇门数据集成到金蝶云星辰V2的案例分享:如何高效实现其他出库(调拨)V2.0 在现代化业务流程中,系统间的数据集成与同步是提高效率和减少人为错误的关键。本文将具体探讨如何通过轻易云数据集成平台,成功实现旺店通·企业奇门数据到金蝶云星辰V2版本下的“其他出库(调拨)”操作方案。本次集成主要涉及将旺店通·企业奇门接口获取的数据(使用API:wdt.stockout.order.query),快速、可靠地写入到金蝶云星辰V2接口(`/jdy/v2/scm/inv_other_out`)。 **确保不漏单** 在对接过程中,最为重要的是保证每一笔订单无遗漏地从旺店通·企业奇门转移至金蝶云星辰。这需要我们设定一个强大的定时抓取机制,以便能够周期性地从`wdt.stockout.order.query`接口拉取最新数据。同时,我们采用了分页处理及限流策略,确保即使面对大量订单也能完整抓取并处理,不会因接口限制导致请求失败或数据丢失。 **批量高效写入** 快速进行大量数据写入是本次方案的一大挑战。我们设计了批量处理机制,将从旺店通·企业奇门获取的大量订单信息,通过整合优化后的JSON格式,同时调用多个实例并行向`/jdy/v2/scm/inv_other_out`接口提交,实现速度上的质跃。这不仅缩短了整体操作时间,还降低了系统资源占用率。 **自动异常处理与重试机制** 任何复杂系统都不可避免会遇到各种异常状况。为了保障稳定运行,本方案中特别引入了一套健全的异常捕获与重试机制。在整个传输过程中,每一个API调用均配备详尽日志记录,一旦发生错误,如网络延迟或者服务器响应超时等问题,会即时启动多次重试过程,对于难以解决的问题则通知管理员进行人工干预,从而最大化提升整个集成过程的可靠性。 上述几个方面是本篇文章针对“其他出库(调拨)” V2.0 共享实际实施中的关键技术细节。在后续部分,我们将进一步深入探讨具体实施步骤以及面临的常见问题和解决方案。 ![泛微OA与ERP系统接口开发配置](https://pic.qeasy.cloud/D30.png~tplv-syqr462i7n-qeasy.image) ### 使用旺店通·企业奇门接口wdt.stockout.order.query进行数据获取与加工 在数据集成的生命周期中,调用源系统API接口是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockout.order.query`来获取并加工出库订单数据。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。以下是具体的元数据配置: ```json { "api": "wdt.stockout.order.query", "method": "POST", "number": "order_no", "id": "stockout_id", "pagination": { "pageSize": 30 }, "condition": [ [ { "field": "warehouse_no", "logic": "neq", "value": "WH2024052601" } ] ], "idCheck": true, "request": [ { "field": "start_time", "label": "开始时间", "type": "string", "describe": "按最后修改时间增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{LAST_SYNC_TIME|datetime}}" }, { "field": "end_time", "label": "结束时间", "type": "string", "describe": "按最后修改时间增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss", "value": "{{CURRENT_TIME|datetime}}" }, { "field": "order_type", "label": "出库单类型", "type": "string", "describe":"2调拨出库,3采购退货出库,4盘亏出库,5生产出库,7其他出库,8多发出库,9纠错出库,10保修配件出库,11初始化出库,12jit拣货出库,13委外出库", "value":"2" }, { "field":"status", ... ``` #### 数据请求与清洗 在请求数据时,我们需要传递多个参数,包括开始时间、结束时间、出库单类型和状态等。这些参数确保我们能够准确地获取到所需的数据。 1. **开始时间和结束时间**:通过`start_time`和`end_time`字段,我们可以实现按最后修改时间增量获取数据。这两个字段的值分别为上次同步时间和当前时间。 ```json { ... { ... “start_time”: "{{LAST_SYNC_TIME|datetime}}" }, { ... “end_time”: "{{CURRENT_TIME|datetime}}" } } ``` 2. **出库单类型**:通过`order_type`字段,我们指定了要查询的出库单类型为“调拨出库”。 ```json { ... “order_type”: “2” } ``` 3. **状态**:通过`status`字段,我们指定了要查询的状态为“已发货”和“已完成”。 ```json { ... “status”: “95,110” } ``` 4. **仓库编号排除条件**:通过设置条件排除特定仓库编号的数据。 ```json { ... “condition”: [ [ { “field”: “warehouse_no”, “logic”: “neq”, “value”: “WH2024052601” } ] ] } ``` #### 数据转换与写入 在获取到原始数据后,需要对其进行必要的清洗和转换,以便于后续的数据写入操作。以下是一些常见的数据处理步骤: 1. **字段映射**:将API返回的数据字段映射到目标系统所需的字段。例如,将`order_no`映射为目标系统中的订单编号。 2. **数据过滤**:根据业务需求过滤掉不需要的数据。例如,过滤掉某些特定状态或类型的订单。 3. **格式转换**:将日期、金额等字段转换为目标系统所需的格式。例如,将日期格式从“yyyy-MM-dd HH:mm:ss”转换为“MM/dd/yyyy”。 #### 分页处理 由于API返回的数据量可能较大,需要进行分页处理。通过设置分页大小和页号,可以逐页获取数据,直到所有数据都被处理完毕。 ```json { ... “otherRequest”: [ { “field”: “page_size”, “label”: “分页大小”, “type”: “string”, “describe”: “每页返回的数据条数,输入值范围1~100,不传本参数,输入值默认为40”, “value”: "{PAGINATION_PAGE_SIZE}" }, { “field”: “page_no”, “label”:”页号”, ”type”:”string”, ”describe”:”不传值默认从0页开始”, ”value”:”{PAGINATION_START_PAGE}” } ] } ``` 通过上述配置和处理步骤,我们可以高效地调用旺店通·企业奇门接口获取并加工所需的出库订单数据,为后续的数据写入和业务分析提供坚实基础。 ![金蝶云星空API接口配置](https://pic.qeasy.cloud/S3.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星辰V2API接口 在数据集成生命周期的第二阶段,我们需要将已经集成的源平台数据进行ETL转换,并转为目标平台金蝶云星辰V2API接口所能够接收的格式,最终写入目标平台。以下是一个具体的技术案例,展示如何通过元数据配置来实现这一过程。 #### API接口与元数据配置 我们使用的API接口为`/jdy/v2/scm/inv_other_out`,该接口用于其他出库(调拨)操作。元数据配置如下: ```json { "api": "/jdy/v2/scm/inv_other_out", "effect": "EXECUTE", "method": "POST", "number": "id", "id": "id", "name": "id", "idCheck": true, "request": [ { "field": "bill_date", "label": "单据日期", "type": "string", "value": "{consign_time}" }, { "field": "bill_no", "label": "单据编码", "type": "string", "value": "{order_no}" }, { "field": "trans_type_id", "label": "业务类型id", "type": "string", "value": "13" }, { "field": "operation_key", "label": "操作类型", "type": "string", "value": "audit" }, { "field": "material_entity", ... ``` #### 数据请求与清洗 首先,我们从源平台获取原始数据,并对其进行清洗和规范化处理。假设我们获取到的数据结构如下: ```json { "_id":"1234567890abcdefg", "_source":{ ... consign_time: '2023-10-01', order_no: 'ORD12345', details_list: [ { goods_no: 'G001', goods_count: '100', warehouse_no: 'W001' } ... ] } } ``` #### 数据转换与写入 根据元数据配置,我们需要将上述清洗后的数据映射到目标API所需的格式。在这个过程中,需要特别注意字段类型和嵌套结构的转换。 ##### 单据日期与单据编码 ```json { ... { field: 'bill_date', value: source.consign_time }, { field: 'bill_no', value: source.order_no } } ``` ##### 商品分录 商品分录是一个数组,其中包含多个商品的信息。每个商品信息需要进一步查询以获取相关ID。 ###### 商品ID与单位ID查询 我们使用MongoDB查询来获取商品和单位的ID: ```json { field: 'material_id', value: '_mongoQuery d476a55d-acc7-3156-9c7f-b9f9dce596b5 findField=content.id where={"content.number":{"$eq":"{{details_list.goods_no}}"}}' }, { field: 'unit_id', value: '_mongoQuery d476a55d-acc7-3156-9c7f-b9f9dce596b5 findField=content.base_unit_id where={"content.number":{"$eq":"{{details_list.goods_no}}"}}' } ``` ###### 仓库ID查询 仓库ID通过集合查找来获取: ```json { field: 'stock_id', value: '_findCollection find id from 9cf5314a-709f-3e72-b021-c9edae06888f where number={{details_list.warehouse_no}}' } ``` ##### 最终构建请求体 结合以上所有字段,构建最终请求体如下: ```json { bill_date: source.consign_time, bill_no: source.order_no, trans_type_id: '13', operation_key: 'audit', material_entity: source.details_list.map(item => ({ material_id: getMaterialId(item.goods_no), qty: item.goods_count, unit_id: getUnitId(item.goods_no), stock_id: getStockId(item.warehouse_no) })) } ``` #### 执行POST请求 最后,将构建好的请求体通过POST方法发送到目标API接口: ```javascript fetch('/jdy/v2/scm/inv_other_out', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(requestBody) }) .then(response => response.json()) .then(data => console.log('Success:', data)) .catch(error => console.error('Error:', error)); ``` 通过上述步骤,我们成功地将源平台的数据进行了ETL转换,并写入到了金蝶云星辰V2API接口中。这一过程不仅保证了数据的一致性和完整性,还提升了系统间的数据交互效率。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/T19.png~tplv-syqr462i7n-qeasy.image)