企业奇门与用友BIP系统的无缝数据集成方案

  • 轻易云集成顾问-谢楷斌
### 案例分享:旺店通·企业奇门数据集成到用友BIP 在本次技术案例中,我们将探讨如何使用轻易云数据集成平台,实现旺店通·企业奇门中的调拨单数据无缝对接到用友BIP系统,具体方案名称为“调拨单对接YS调拨订单-v”。此架构不仅涵盖了高吞吐量的数据写入能力,还注重异常处理与实时监控。 #### 获取旺店通·企业奇门数据 首先,我们利用`wdt.stock.transfer.query` API接口从旺店通·企业奇门系统中抓取需要的调拨单数据。在这一过程中,需要重点关注分页和限流问题,以确保大批量的数据能够被可靠且高效地提取。为了实现定时准时抓取,可以设置合理的任务计划。 #### 数据转换与质量监控 获取到原始数据后,会通过自定义的数据转换逻辑进行处理,以适应用友BIP的数据结构需求。这一过程通常涉及字段映射、格式规范化以及必要的单位转换。为保证最终结果的一致性和准确性,整个流程会引入严格的数据质量监控机制,并设立告警系统以便及时发现和解决潜在的问题。 #### 批量写入到用友BIP 经过清洗和转换后的数据,将通过API `/yonbip/scm/transferapply/save` 进行批量写入至用友BIP。这一环节依赖于轻易云提供的大容量、高吞吐能力,确保大量的数据能够快速稳定地传输并存储。在这一阶段,还实现了细粒度的异常处理与错误重试机制,以进一步提高整体操作的鲁棒性。 #### 实时监控与日志记录 在整个项目实施过程中,实时跟踪各个步骤的状态是关键。集中式监控平台会持续观测每个任务节点,并生成详细的日志记录,为故障排除提供依据。此外,可视化工具使得运维人员能直观了解当前系统表现,一旦发现问题能够快速定位并解决,从而降低停机时间和业务影响。 下一步将在设计方案部分深入讨论具体实现细节,包括API调用示例、分页策略优化及性能提升措施等内容。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/D32.png~tplv-syqr462i7n-qeasy.image) ### 调用源系统旺店通·企业奇门接口wdt.stock.transfer.query获取并加工数据 在数据集成生命周期的第一步中,调用源系统接口以获取原始数据是至关重要的。本文将详细探讨如何使用轻易云数据集成平台配置元数据,调用旺店通·企业奇门接口`wdt.stock.transfer.query`,并对获取的数据进行初步加工。 #### 接口概述 接口`wdt.stock.transfer.query`用于查询调拨单信息。该接口采用POST请求方式,支持分页查询和条件过滤。以下是元数据配置中的主要字段及其用途: - **api**: `wdt.stock.transfer.query` - **method**: `POST` - **number**: `transfer_no` - **id**: `transfer_no` - **pagination**: 分页配置,每页大小为100条 - **idCheck**: 启用ID检查,确保唯一性 - **condition**: 查询条件,过滤掉`api_outer_no`包含"DBDD"的记录 - **request**: 请求参数,包括开始时间、结束时间、源仓库、目标仓库和调拨单状态等 - **otherRequest**: 其他请求参数,如分页大小和页号 #### 请求参数配置 在实际应用中,我们需要根据业务需求动态设置请求参数。以下是关键请求参数的配置及其描述: 1. **start_time 和 end_time** - 用于增量获取数据,分别表示开始时间和结束时间。 - 格式为`yyyy-MM-dd HH:mm:ss`。 - 例如:`{{LAST_SYNC_TIME|datetime}}` 和 `{{CURRENT_TIME|datetime}}` 2. **from_warehouse_no 和 to_warehouse_no** - 分别代表源仓库和目标仓库的唯一编码,用于区分不同仓库的数据。 - 这些编码在ERP系统内可以自定义。 3. **status** - 调拨单状态,用于筛选特定状态的调拨单。 - 例如:传递值为"90"表示只查询已完成的调拨单。 4. **pagination** - 分页大小和页号,用于控制每次请求返回的数据量。 - 每页返回的数据条数默认为100。 #### 数据请求与清洗 调用接口后,我们需要对返回的数据进行初步清洗,以确保数据质量和一致性。以下是常见的数据清洗步骤: 1. **去重** - 根据调拨单号(`transfer_no`)去重,确保每条记录唯一。 2. **过滤无效数据** - 根据预设条件过滤掉不符合要求的数据,例如剔除包含特定字符串的记录。 3. **字段转换** - 将时间字段转换为标准格式,以便后续处理。 - 对数值字段进行单位转换或格式化处理。 #### 实际案例 假设我们需要获取2023年10月1日至2023年10月31日期间,从仓库编号为"W001"到仓库编号为"W002"的所有已完成调拨单。具体配置如下: ```json { "api": "wdt.stock.transfer.query", "method": "POST", "number": "transfer_no", "id": "transfer_no", "pagination": {"pageSize": 100}, "idCheck": true, "condition": [ [{"field":"api_outer_no","logic":"notlike","value":"DBDD"}] ], "request": [ {"field":"start_time","label":"开始时间","type":"datetime","describe":"增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss","value":"2023-10-01 00:00:00"}, {"field":"end_time","label":"结束时间","type":"datetime","describe":"增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss","value":"2023-10-31 23:59:59"}, {"field":"from_warehouse_no","label":"源仓库","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置),用于获取指定仓库单据数据信息(不支持一次推送多个仓库编号)","value":"W001"}, {"field":"to_warehouse_no","label":"目标仓库","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置),用于获取指定仓库单据数据信息(不支持一次推送多个仓库编号)","value":"W002"}, {"field":"status","label":"调拨单状态","type":"string","describe":"调拨单状态10已取消 20编辑中 30待审核 40已审核 42出库单待推送 44出库单推送失败 46待出库 50部分出库 60全部出库 62入库单待推送 64入库单推送失败 66待入库 70部分入库 80待结算 90调拨完成 (不传该字段默认返回全部状态的单据)","value":"90"} ], "otherRequest": [ {"field":"page_size","label":"分页大小","type":"string","describe":"每页返回的数据条数,输入值范围1~100,不传本参数,输入值默认为40,使用举例单击这里","value":"100"}, {"field":"page_no","label":"页号","type":"string","describe":"不传值默认从0页开始"} ] } ``` 通过上述配置,我们可以精准地获取所需的调拨单信息,并进行后续的数据处理与分析。这一步骤不仅确保了数据的一致性和准确性,也为后续的数据转换与写入打下了坚实基础。 ![用友与CRM系统接口开发配置](https://pic.qeasy.cloud/S9.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台:将调拨单数据转换并写入用友BIPAPI接口 在轻易云数据集成平台中,数据处理的第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台用友BIPAPI接口所能够接收的格式,最终写入目标平台。以下是详细的技术实现过程。 #### API接口配置 我们需要将调拨单的数据通过用友BIPAPI接口写入目标系统。根据元数据配置,我们使用了`/yonbip/scm/transferapply/save`这个API接口,采用POST方法进行数据传输。 ```json { "api": "/yonbip/scm/transferapply/save", "method": "POST", "idCheck": true, "BIPAudit": "/yonbip/scm/transferapply/batchaudit" } ``` #### 请求参数配置 请求参数主要包括调拨单的主表和子表信息。在元数据配置中,我们定义了多个字段,包括调出组织、调出会计主体、单据编号、单据日期等。这些字段需要从源系统的数据中提取并映射到目标系统的相应字段。 ##### 主表字段映射 1. **调出组织id或code (`outorg`)** ```json { "field": "outorg", "label": "调出组织id或code", "type": "string", "describe": "例:A23001", "value": "_findCollection find inventoryOrg from fa193860-6aa8-37a8-b996-a856e9a8a96f where omsInWarehouse={to_warehouse_no} omsOutWarehouse={from_warehouse_no} mappingType=1" } ``` 使用`_findCollection`函数从源系统中查找对应的组织ID或编码。 2. **单据编号 (`code`)** ```json { "field": "code", "label": "单据编号,编码规则是手动时必填", "type": "string", "describe": "例:ZK20210417000002", "value": "{transfer_no}" } ``` 直接映射源系统中的`transfer_no`字段。 3. **单据日期 (`vouchdate`)** ```json { "field": "vouchdate", "label": "单据日期", "type": "string", "describe": "例:2021-04-17 00:00:00", "value": "{created}" } ``` 映射源系统中的`created`字段。 4. **交易类型id或code (`bustype`)** ```json { "field": "bustype", "label": "交易类型id或code", "type": "string", "describe": "例:110000000000019", "value":"A03002" } ``` 固定值为"A03002"。 5. **备注 (`memo`)** ```json { "field":"memo", "label":"备注", 'type':'string', 'describe':'例:表头备注', 'value':'{remark}' } ``` 映射源系统中的`remark`字段。 ##### 子表字段映射 子表信息包含物料信息、数量、单位等,需要逐条进行映射: 1. **物料id或code (`product`)** ```json { 'field':'product', 'label':'物料id或code', 'type':'string', 'describe':'例:1920126858647891', 'value':'{{details_list.goods_no}}', 'parent':'details' } ``` 映射源系统中的`goods_no`字段。 2. **数量 (`qty`)** ```json { 'field':'qty', 'label':'数量', 'type':'string', 'describe':'例:12', 'value':'{{details_list.num}}', 'parent':'details' } ``` 映射源系统中的`num`字段。 3. **单位id或编码 (`unit`)** ```json { 'field':"unit",'label':"单位id或编码",'type':"string",'describe':"例:1836523958194432",'value':"_findCollection find code from f9eedcc9-f1ff-31c0-9081-6aee9cf21740 where name={unit_name}",'parent':"details" } ``` 使用 `_findCollection` 函数从源系统中查找对应的单位ID或编码。 #### 数据转换与写入 在完成所有字段的映射后,我们需要将这些数据按照目标平台所需的格式进行转换,并通过API接口写入到用友BIP系统。具体步骤如下: 1. **构建请求体**: 根据上述配置,将所有主表和子表信息构建成一个JSON对象作为请求体。 ```json { // 主表信息 outorg: "...", code: "...", vouchdate: "...", bustype: "...", memo: "...", // 子表信息列表 transferApplys: [ { product: "...", qty: "...", unit: "..."}, ... ] } ``` 2. **发送请求**: 使用HTTP POST方法,将构建好的请求体发送到指定的API接口。 ```javascript const axios = require('axios'); axios.post('/yonbip/scm/transferapply/save', requestBody) .then(response => { console.log('Data successfully written to YONBIP:', response.data); }) .catch(error => { console.error('Error writing data to YONBIP:', error); }); ``` 通过以上步骤,可以实现将调拨单数据从源平台转换并写入到用友BIP系统。整个过程涉及多个字段的映射和转换,需要确保每个步骤都准确无误,以保证数据的一致性和完整性。 ![打通钉钉数据接口](https://pic.qeasy.cloud/T15.png~tplv-syqr462i7n-qeasy.image)