ETL转换:吉客云VMI数据对接金蝶云星空的技术实现
### VMI调拨入库红字对接采购退料的技术案例分享
在本文中,我们将探讨如何通过轻易云数据集成平台,将吉客云中的VMI调拨入库红字数据高效、准确地集成到金蝶云星空系统中。这项任务涉及到复杂的数据处理与格式转换,需要解决多种技术挑战,包括API接口调用、数据分页处理及异常重试机制等。
#### API接口使用与数据实时监控
首先,吉客云提供了`erp.storage.goodsdocin.v2`这个接口用于获取VMI调拨入库红字的数据。我们需要定时可靠地抓取这些数据,并确保在整个过程中没有漏单现象发生。为了实现这一点,我们采用了轻易云平台的集中监控和告警系统,它可以实时跟踪每一个集成任务的状态,并在出现异常时立即发出警报。这不仅提高了整体操作效率,也增强了业务透明度。
#### 数据写入与性能优化
另一方面,金蝶云星空则通过`batchSave`接口进行大量数据的快速写入。为了确保大批量数据能够顺利且高效地导入,我们利用其高吞吐量的数据写入能力,以及自定义的数据转换逻辑来适应不同的数据结构。在实际应用中,这有效提升了我们的数据处理时效性,同时减少了由于格式差异而引起的错误。
#### 格式转换和限流策略
针对两套系统之间存在的数据格式差异问题,通过轻易云平台提供的可视化数据流设计工具进行直观管理,使得复杂的数据转换过程变得更加简洁明快。此外,对于吉客云接口可能遇到的分页和限流问题,我们设计了一系列稳健的策略,以确保每次请求都能获得期望结果,而不会因为限流导致任务失败或者遗漏重要信息。
综上所述,本案例展示了一整套端到端的数据集成方案,从源头获取、加工处理,再到目标系统写入,每一步都进行了精细化控制,实现了各环节无缝衔接,高效完成VMI调拨入库红字对接采购退料功能。
![如何对接企业微信API接口](https://pic.qeasy.cloud/D33.png~tplv-syqr462i7n-qeasy.image)
### 调用吉客云接口erp.storage.goodsdocin.v2获取并加工数据
在数据集成生命周期的第一步,我们需要从源系统吉客云调用接口`erp.storage.goodsdocin.v2`获取数据,并对其进行初步加工。本文将详细探讨如何通过轻易云数据集成平台配置元数据,完成这一任务。
#### 接口调用配置
我们首先需要配置API调用的元数据。根据提供的metadata,接口`erp.storage.goodsdocin.v2`使用POST方法进行请求,主要参数如下:
- **分页参数**:`pageIndex`和`pageSize`,用于控制分页查询。
- **时间参数**:`startDate`和`endDate`,分别表示创建时间的起始和结束时间。这里使用了模板变量`{{LAST_SYNC_TIME|datetime}}`和`{{CURRENT_TIME|datetime}}`来动态生成时间范围。
- **入库类型**:固定为102,即调拨入库。
- **其他可选参数**:如仓库ID、供应商ID、单据号等。
以下是一个典型的请求示例:
```json
{
"pageIndex": "1",
"pageSize": "50",
"startDate": "{{LAST_SYNC_TIME|datetime}}",
"endDate": "{{CURRENT_TIME|datetime}}",
"inouttype": "102"
}
```
#### 数据过滤与条件设置
为了确保获取的数据符合业务需求,我们需要设置一些过滤条件。在metadata中,我们定义了以下条件:
- `goodsDocDetailList.quantity < 0`
- `fromWarehouse like 'VMI'`
这些条件确保我们只获取到数量为负且来源仓库包含“VMI”的记录。
#### 数据处理与字段映射
在获取到原始数据后,需要对其进行一定的处理和字段映射。metadata中定义了返回参数列表,包括但不限于:
- `goodsdocNo`: 入库单号
- `inOutDate`: 出入库日期
- `gmtCreate`: 创建时间
- `inouttype`: 入库类型
- `vendCustomerCode`: 供应商编码
- `warehouseCode`: 仓库编号
- `sourceBillNo`: 来源单据号
- `billNo`: 上游单据号
- `redStatus`: 红字状态
- `financeBillStatus`: 财务单据状态
- `goodsDocDetailList.goodsNo`: 商品编号
- `goodsDocDetailList.quantity`: 商品数量
这些字段将被自动填充到响应中,以便后续的数据转换与写入阶段使用。
#### 异常处理与补偿机制
为了确保数据集成过程的可靠性,我们还需要设置异常处理与补偿机制。在metadata中,通过以下配置实现:
```json
"omissionRemedy": {
"crontab": "39 2 * * *",
"takeOverRequest": [
{
"field": "startDate",
"value": "_function FROM_UNIXTIME( unix_timestamp() -259200 , '%Y-%m-%d %H:%i:%s' )",
"type": "string"
}
]
}
```
该配置表示每天凌晨2:39执行一次补偿任务,将起始时间设定为当前时间前3天,以确保遗漏的数据能够被重新获取。
#### 数据平铺与结构调整
在实际应用中,有时需要对嵌套结构的数据进行平铺处理。metadata中的`beatFlat`字段指定了需要平铺的嵌套字段,如下所示:
```json
"beatFlat": ["goodsDocDetailList"]
```
这意味着将嵌套在`goodsDocDetailList`中的商品详情信息平铺到顶层结构中,便于后续处理。
通过上述步骤,我们可以高效地调用吉客云接口获取并加工数据,为后续的数据转换与写入奠定基础。这一过程充分利用了轻易云数据集成平台的强大功能,实现了复杂业务场景下的数据无缝对接。
![电商OMS与ERP系统接口开发配置](https://pic.qeasy.cloud/S28.png~tplv-syqr462i7n-qeasy.image)
### 轻易云数据集成平台ETL转换至金蝶云星空API接口
在数据集成生命周期的第二步中,我们将重点探讨如何将已经集成的源平台数据通过ETL(Extract, Transform, Load)转换,转为金蝶云星空API接口所能够接收的格式,并最终写入目标平台。以下是具体的技术实现细节。
#### API接口配置与元数据解析
在本案例中,我们使用的是金蝶云星空的`batchSave` API接口,通过POST请求方式进行数据写入。以下是该接口的一些关键配置和元数据解析:
```json
{
"api": "batchSave",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{"field": "FBillTypeID", "label": "单据类型", "type": "string", "describe": "单据类型", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}, "value": "TLSQDD01_SYS"},
{"field": "FDate", "label": "采购日期", "type": "string", "describe": "日期", "value": "{inOutDate}"},
{"field": "FPURCHASEORGID", ...
```
#### 数据字段映射与转换
1. **单据类型(FBillTypeID)**:
- 类型:字符串
- 描述:单据类型
- 转换器:`ConvertObjectParser`,参数为`FNumber`
- 值:固定值 `TLSQDD01_SYS`
2. **采购日期(FDate)**:
- 类型:字符串
- 描述:日期
- 值:动态值 `{inOutDate}`,从源数据中提取
3. **采购组织(FPURCHASEORGID)**:
- 类型:字符串
- 描述:组织
- 转换器:`ConvertObjectParser`,参数为`FNumber`
- 值:动态值 `{goodsDocDetailList_ownerName}`
- 映射关系:
```json
{
...
{"target":"6441f0214af70a2f240adb22","direction":"positive"}
...
}
```
4. **退料类型(FRMTYPE)**:
- 类型:字符串
- 值:固定值 `B`
5. **申请组织(FAPPORGID)**:
- 类型:字符串
- 转换器:`ConvertObjectParser`,参数为 `FNumber`
- 值:动态值 `{goodsDocDetailList_ownerName}`
- 映射关系同上
6. **供应商(FSUPPLIERID)**:
- 类型:字符串
- 描述:基础资料
- 转换器:`ConvertObjectParser`,参数为 `FNumber`
- 值:动态值 `{fromWarehouseCode}`
- 映射关系:
```json
{
...
{"target":"651143e1ec266b0099244c67","direction":"positive"}
...
}
```
7. **退料方式(FRMMODE)**:
- 类型:字符串
- 值:固定值 `A`
8. **需求组织(FRequireOrgId)**:
- 类型:字符串
- 转换器:`ConvertObjectParser`,参数为 `FNumber`
- 值:动态值 `{goodsDocDetailList_ownerName}`
9. **币别(FLOCALCURRID)**:
- 类型: 字符串
- 转换器: `ConvertObjectParser`, 参数为 `FNumber`
- 值: 固定值 `PRE001`
10. **结算组织(FSettleTypeId)**:
- 类型: 字符串
- 转换器: `ConvertObjectParser`, 参数为 `FNumber`
- 值: 动态值 `{goodsDocDetailList_ownerName}`
#### 明细信息字段配置
明细信息字段以数组形式存在,每个字段都需要进行相应的映射和转换:
1. **物料编码(FMaterialId)**:
```json
{
...
{"field":"FMaterialId","label":"物料编码","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{Fentity.goodsDocDetailList_goodsNo}}"}
...
}
```
2. **采购数量(FMRAPPQTY)**:
```json
{
...
{"field":"FMRAPPQTY","label":"采购数量","type":"string","describe":"数量","value":"_function {{Fentity.goodsDocDetailList_quantity}} *-1"}
...
}
```
3. **仓库(FStockId)**:
```json
{
...
{"field":"FStockId","label":"仓库","type":"string","value":"{warehouseCode}","parser":{"name":"ConvertObjectParser","params":"FNumber"}}
...
}
```
4. **采购数量重复字段(FPurQty)**:
```json
{
...
{"field":"FPurQty","label":"采购数量","type":"string","value":"_function {{Fentity.goodsDocDetailList_quantity}} *-1"}
...
}
```
#### 其他请求配置
其他请求配置包括表单ID、提交并审核选项、操作类型以及基础资料验证等:
```json
{
...
{"field":"FormId","label":"业务对象表单Id","type":"string","describe":"必须填写金蝶的表单ID如:PUR_PurchaseOrder","value":"PUR_MRAPP"},
{"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"bool","value":"true"},
{"field":"Operation","label":"执行的操作","type":"string","value":"Save"},
{"field":"IsVerifyBaseDataField","label":"验证基础资料有效性布尔类默认false非必录" ,"type" :"bool" ,"describe" :"是否验证所有的基础资料有效性布尔类默认false非必录" ,"value" :"true"}
...
}
```
通过上述详细配置,我们可以实现将源平台的数据高效地转换并写入到金蝶云星空API接口中。这一过程不仅保证了数据的一致性和准确性,同时也提升了系统间的数据流通效率。
![如何开发钉钉API接口](https://pic.qeasy.cloud/T25.png~tplv-syqr462i7n-qeasy.image)