轻易云平台下的数据清洗与转换实战

  • 轻易云集成顾问-陈洁琳

案例分享:金蝶云星空数据集成到旺店通·企业奇门

在本次技术案例中,将详细介绍如何通过轻易云数据集成平台,实现金蝶直接调拨单数据对接到旺店通的其他入库,并进行后补批号操作。具体方案名称为“金蝶直接调拨单对接旺店通其他入库_后补批号ZJDB”。

金蝶云星空API——executeBillQuery的使用

首先,利用金蝶提供的executeBillQuery API接口抓取调拨单的数据。为了确保数据不漏单,我们采取了定时可靠的抓取机制,通过配置周期性任务,在每个预设时间点自动调用该接口,获取最新的数据。同时,为解决分页和限流问题,每次请求都带有适当的分页参数和速率限制控制,以避免因超量请求导致接口响应失败。

数据格式转换与映射

由于金蝶云星空和旺店通·企业奇门之间存在明显的数据格式差异,我们使用了自定义映射规则来转换数据。例如,从金蝶调拨单导出的字段需要经过特定处理,才能适配到旺店通所需的字段规范。在实际操作中,这部分工作主要是通过平台内置的数据清洗与转化工具完成,使得上游系统输出的数据能够无缝对接至下游系统。

批量快速写入至旺店通·企业奇门

成功获取并正确转换后的数据,需要快速、稳定地写入至目标系统——即调用wdt.vip.wms.stockinout.order.push API。为此,我们设计了高效、批量处理机制,大幅提升了大规模数据传输过程中的效率。这不仅保障了整体流程的一致性,还有效缩短了从源头到终端应用所需的时间。

异常处理及重试机制

在整个对接过程中,不可避免会遇到各种异常状况,比如网络故障或临时性API失效等。因此,本方案中特别强调错误捕获与重试机制。一旦某一批次操作出现问题,系统能迅速记录日志并触发相应策略重新执行,使得最终结果达到预期,而不会遗漏任何重要信息。

以上章节简要描述了从基础概念到关键步骤的一整套实现逻辑,下文将进一步探讨具体实现细节和优化措施。 数据集成平台API接口配置

调用金蝶云星空接口executeBillQuery获取并加工数据的技术实现

在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用金蝶云星空的executeBillQuery接口,以获取并加工调拨单数据。

接口配置与请求参数

首先,我们需要配置调用金蝶云星空接口的元数据。以下是关键的元数据配置项:

{
  "api": "executeBillQuery",
  "method": "POST",
  "number": "FBillNo",
  "id": "FBillEntry_FEntryID",
  "pagination": {
    "pageSize": 100
  },
  "idCheck": true,
  "request": [
    {"field":"FBillEntry_FEntryID","label":"FEntryID","type":"string","value":"FBillEntry_FEntryID"},
    {"field":"FID","label":"实体主键","type":"string","value":"FID"},
    {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"},
    {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"},
    {"field":"FStockOrgId_FNumber","label":"调入库存组织","type":"string","value":"FStockOrgId.FNumber"},
    {"field":"FDate","label":"日期","type":"string","value":"FDate"},
    {"field":"FBillTypeID_FNumber","label":"单据类型","type":"string","value":"FBillTypeID.FNumber"},
    {"field":"FTransferBizType","label":"调拨类型","type":"string","value":"FTransferBizType"},
    {"field":"FStockOutOrgId_FNumber","label":"调出库存组织","type":"string","value":"FStockOutOrgId.FNumber"},
    {"field":"FTransferDirect","label":"调拨方向","type":"string","value":"FTransferDirect"},
    {"field":"FNote","label":"备注","type":"","value":""},
    // 更多字段配置...
  ],
  "otherRequest": [
    {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"},
    {"field": "FieldKeys", "label": "需查询的字段key集合", "type": "array", "describe": "", 
        "parser":{"name": "ArrayToString", "params": ","}},
    {"field": "TopRowCount", "label": "", 
        "type": "", 
        "describe":"","value":"",
        "parser":{"name":"","params":[]}},
    // 更多其他请求配置...
  ]
}

请求构建与发送

根据上述元数据配置,我们需要构建一个POST请求来调用executeBillQuery接口。以下是一个示例请求体:

{
  "FormId": "STK_TransferDirect",
  "FieldKeys": [
      // 字段列表
      ...
      ],
  // 分页参数
  ...
}

在实际操作中,我们会利用轻易云平台提供的可视化界面来填充这些参数,并自动生成请求体。

数据清洗与转换

获取到原始数据后,下一步是对数据进行清洗和转换。这一步骤包括但不限于:

  1. 字段映射:将金蝶返回的数据字段映射到目标系统所需的字段。
  2. 格式转换:例如,将日期格式从YYYY-MM-DD转换为目标系统所需的格式。
  3. 数据过滤:根据业务需求过滤掉不必要的数据记录。

以下是一个简单的数据清洗示例:

def clean_data(raw_data):
    cleaned_data = []
    for record in raw_data:
        cleaned_record = {
            'entry_id': record['FBillEntry_FEntryID'],
            'bill_no': record['FBillNo'],
            'status': record['FDocumentStatus'],
            'stock_in_org': record['FStockOrgId_FNumber'],
            'date': convert_date_format(record['FDate']),
            # 更多字段处理...
        }
        cleaned_data.append(cleaned_record)
    return cleaned_data

def convert_date_format(date_str):
    # 假设原始日期格式为 YYYY-MM-DD,需要转换为 DD/MM/YYYY
    parts = date_str.split('-')
    return f"{parts[2]}/{parts[1]}/{parts[0]}"

数据写入目标系统

最后一步是将清洗后的数据写入目标系统。这通常涉及调用目标系统的API接口,确保数据能够无缝对接。例如:

def write_to_target_system(cleaned_data):
    for record in cleaned_data:
        response = requests.post('TARGET_SYSTEM_API_URL', json=record)
        if response.status_code != 200:
            log_error(response.text)

通过上述步骤,我们可以高效地实现从金蝶云星空获取调拨单数据,并将其加工后写入目标系统。这不仅提高了数据处理效率,还确保了数据的一致性和准确性。 系统集成平台API接口配置

使用轻易云数据集成平台实现金蝶直接调拨单对接旺店通其他入库_后补批号ZJDB

在数据集成生命周期的第二步,我们将已经集成的源平台数据进行ETL转换,转为目标平台旺店通·企业奇门API接口所能够接收的格式,并最终写入目标平台。以下是详细的技术实现过程。

元数据配置解析

在本案例中,我们使用了如下元数据配置:

{
  "api": "wdt.vip.wms.stockinout.order.push",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "method": "merge",
    "field": "FBillNo,FMaterialId_FNumber,FDestStockId_FNumber,FDestLot",
    "bodyName": "spec_list",
    "bodySum": ["FQty"],
    "header": ["FBillNo"],
    "body": ["FMaterialId_FNumber", "FDestStockId_FNumber", "FQty", "FDestLot"]
  },
  "request": [
    {"field":"api_outer_no","label":"接口外部单号","type":"string","describe":"调用本接口时推送的唯一单据编号,避免重复推送数据","value":"{FBillNo}-{{spec_list.FMaterialId_FNumber}}-{{spec_list.FDestStockId_FNumber}}-{{spec_list.FDestLot}}"},
    {"field":"warehouse_no","label":"仓库编号","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置);本接口仓库编号对应的仓库类型必须为委外仓类型。【例如: 3京东仓储 4科捷 5百世物流 6 SKU360 7通天晓 8中联网仓 9顺丰仓储 10网仓2号 11奇门仓储 12旺店通仓储 13心怡仓储 14力威仓储 15京东沧海 16云集仓储 )】","value":"{{spec_list.FDestStockId_FNumber}}"},
    {"field":"order_type","label":"出入类型","type":"string","describe":"可选值:1(出库);2(入库)","value":"2"},
    {"field":"logistics_fee","label":"邮资","type":"string","describe":"物流或者快递运输货物产生的费用,默认为0"},
    {"field":"other_fee","label":"其他费用","type":"string","describe":"其他费用,默认为0"},
    {"field":"province","label":"省","type":"string","describe":"省份名称,直辖市注意输入值为“北京”不是“北京市”,“北京市”在city参数内输入"},
    {"field":"city","label":"市","type":"string","describe":"市名称"},
    {"field":"district","label":"县(区)","type":"string","describe":"区县名称"},
    {"field":"address","label":"详细地址","type":"string","describe":"地址详情描述 ,例如 xx街道XX小区xx号楼xx单元401"},
    {"field":"contact","label":"联系人","type":"","describe":"","value":"","required":true},
    {"field":""},
    {"field":"","label":"","type":"","describe":"","value":"","required":true},
    {"field":"","label":"","type":"","describe":"","value":"","required":true},

数据转换与写入步骤

  1. 数据合并与清洗

    • 首先,我们需要将金蝶直接调拨单的数据进行合并和清洗。根据元数据配置中的operation字段,我们将FBillNo, FMaterialId_FNumber, FDestStockId_FNumber, FDestLot四个字段作为合并依据,并对FQty字段进行汇总。
    • 合并后的数据结构体以spec_list命名,用于后续的数据转换。
  2. 构建请求体

    • 根据元数据配置中的request字段,我们需要构建请求体。
    • 请求体包含了多个字段,如api_outer_no, warehouse_no, order_type, 等等。这些字段通过模板字符串从合并后的数据中提取相应的值。
  3. 货品明细节点处理

    • 在请求体中,有一个重要的节点是goods_list,它表示入库单货品列表节点。
    • 每个货品明细包含多个字段,如spec_no, num, position_no, price, batch_no, 等等。这些字段同样通过模板字符串从合并后的数据中提取相应的值。
  4. 发送请求

    • 最后,将构建好的请求体通过HTTP POST方法发送到旺店通·企业奇门API接口。
    • API接口路径为:wdt.vip.wms.stockinout.order.push

示例代码

以下是一个示例代码片段,用于展示如何实现上述步骤:

import requests
import json

# 合并和清洗后的数据
merged_data = {
    'FBillNo': '12345',
    'spec_list': [
        {
            'FMaterialId_FNumber': 'MAT001',
            'FDestStockId_FNumber': 'WH001',
            'FQty': '100',
            'FDestLot': 'LOT001'
        }
        # 更多记录...
    ]
}

# 构建请求体
request_body = {
    'api_outer_no': f"{merged_data['FBillNo']}-{merged_data['spec_list'][0]['FMaterialId_FNumber']}-{merged_data['spec_list'][0]['FDestStockId_FNumber']}-{merged_data['spec_list'][0]['FDestLot']}",
    'warehouse_no': merged_data['spec_list'][0]['FDestStockId_FNumber'],
    'order_type': '2',
    'logistics_fee': '0',
    'other_fee': '0',
    # 更多字段...
}

# 构建goods_list节点
goods_list = []
for item in merged_data['spec_list']:
    goods_item = {
        'spec_no': item['FMaterialId_FNumber'],
        'num': item['FQty'],
        # 更多字段...
        'batch_no': item['FDestLot']
    }
    goods_list.append(goods_item)

request_body['goods_list'] = goods_list

# 发起HTTP POST请求
response = requests.post(
    url='https://api.wangdiantong.com/wdt.vip.wms.stockinout.order.push',
    headers={'Content-Type': 'application/json'},
    data=json.dumps(request_body)
)

# 打印响应结果
print(response.json())

通过以上步骤和代码示例,我们可以将金蝶直接调拨单的数据成功转换并写入到旺店通·企业奇门API接口,实现系统间的数据无缝对接。 泛微OA与ERP系统接口开发配置

更多系统对接方案