### 案例分享:旺店通·企业奇门数据集成到用友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)