ETL转换与数据写入:云星空对接旺店通的实践

  • 轻易云集成顾问-胡秀丛

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

在实际业务操作中,我们常需进行系统间的数据联动和同步。本篇技术案例将探讨如何通过轻易云数据集成平台,将金蝶云星空的采购退料单高效、安全地集成到旺店通·企业奇门中的其它出库单。以下为该方案的关键技术实现及注意事项。

一、确保金蝶云星空数据不漏单

首先,为保证从金蝶云星空获取的数据无遗漏,我们使用了其提供的executeBillQuery接口,该接口支持分页查询并处理限流问题。在调用此接口时,需特别注意分页参数设置,以确保所有采购退料单都被完整抓取。

API: POST /executeBillQuery

每次查询返回后,我们即刻记录已成功同步的数据ID,并根据返回结果动态调整下一页的起始位置,从而确保数据的连续性与完整性。

二、大量数据快速写入到旺店通·企业奇门

为了将大量抓取的数据快速传输并可靠写入至旺店通·企业奇门,我们利用其提供的批量写入API wdt.stockout.order.push。在具体实现过程中,需要构建自定义映射规则,将金蝶云星空格式转化为符合旺店通要求的数据格式。这不仅提升了对接效率,还保证了数据的一致性。

API: POST /wdt.stockout.order.push

三、定制化映射及异常处理机制

由于两大系统之间的数据结构存在差异,在配置过程中我们设计了一套定制化映射逻辑,确保字段一致且符合业务需求。同时,对于可能出现的对接异常或错误(如网络中断、接口响应超时),我们配置了自动重试机制,在多次尝试均失败后触发告警以便进一步人工干预,大大提高了系统运行稳定性和可控性。

以上为本次案例中的部分关键步骤和技术要点,更多详细流程将在随后的章节中展开。 打通钉钉数据接口

调用金蝶云星空接口executeBillQuery获取并加工数据

在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将深入探讨如何通过轻易云数据集成平台调用金蝶云星空的executeBillQuery接口来获取采购退料单的数据,并进行初步加工。

接口调用配置

首先,我们需要配置接口调用的元数据。以下是一个典型的元数据配置示例:

{
  "api": "executeBillQuery",
  "method": "POST",
  "number": "FBillNo",
  "id": "FPURMRBENTRY_FEntryID",
  "pagination": {
    "pageSize": 500
  },
  "idCheck": true,
  "request": [
    {"field":"FPURMRBENTRY_FEntryID","label":"明细信息ID","type":"string","value":"FPURMRBENTRY_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":"FTAKEDELIVERYNO","label":"提货单号","type":"string","value":"FTAKEDELIVERYNO"},
    {"field":"FSupplierID_FNumber","label":"供应商","type":"string","value":"FSupplierID.FNumber"},
    {"field":"FDESCRIPTION","label":"备注","type":"string","value":"FDESCRIPTION"}
  ],
  "otherRequest": [
    {"field": "Limit", "label": "最大行数", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_PAGE_SIZE}"},
    {"field": "StartRow", "label": "开始行索引", "type": "string", "describe": "金蝶的查询分页参数", "value": "{PAGINATION_START_ROW}"},
    {"field": "FilterString", 
     "label": "过滤条件", 
     "type": "string", 
     "describe": 
     `示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>=`,
     `value`: `FApproveDate>='{{LAST_SYNC_TIME|dateTime}}' AND FDocumentStatus = 'C'`
    },
    {"field": 
     `FieldKeys`, 
     `label`: `需查询的字段key集合`, 
     `type`: `array`, 
     `describe`: `金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber`, 
     `parser`: {
       `name`: `ArrayToString`, 
       `params`: ","
      }
   },
   {
      field: FormId,
      label: 业务对象表单Id,
      type: string,
      describe: 必须填写金蝶的表单ID如:PUR_PurchaseOrder,
      value: PUR_MRB
   }
 ]
}

请求参数解析

  1. API和方法:指定了要调用的API为executeBillQuery,请求方法为POST
  2. 标识字段numberid分别指定了单据编号和明细信息ID。
  3. 分页配置:设置了每页返回500条记录。
  4. 请求字段:列出了需要从源系统获取的字段,包括明细信息ID、实体主键、单据编号、单据状态等。
  5. 其他请求参数
    • LimitStartRow用于分页控制。
    • FilterString用于定义过滤条件,例如只获取审核通过且在上次同步时间之后的数据。
    • FieldKeys定义了需要查询的字段集合,使用逗号分隔。

数据请求与清洗

在实际操作中,我们会根据上述配置生成HTTP请求,并发送到金蝶云星空系统。以下是一个示例请求体:

{
  "FormId": "PUR_MRB",
  // 分页参数
  Limit: 500,
  StartRow: 0,

  // 查询条件
  FilterString: `FApproveDate>='2023-01-01T00:00:00' AND FDocumentStatus = 'C'`,

  // 查询字段
 FieldKeys: [
   FPURMRBENTRY_FEntryID, FID, FBillNo, FDocumentStatus, FStockOrgId.FNumber, FDate, FBillTypeID.FNumber, FTAKEDELIVERYNO, FSupplierID.FNumber, FDESCRIPTION
 ].join(",")
}

数据处理

收到响应后,我们需要对数据进行清洗和初步加工。例如,可以根据业务需求筛选出特定状态或特定供应商的数据,并将其转换为目标系统所需的格式。

function processData(response) {
   return response.data.map(item => ({
       entryId: item.FPURMRBENTRY_FEntryID,
       billNo: item.FBillNo,
       status: item.FDocumentStatus,
       orgId: item.FStockOrgId_FNumber,
       date: item.FDate,
       billType: item.FBillTypeID_FNumber,
       deliveryNo: item.FTAKEDELIVERYNO,
       supplierId: item.FSupplierID_FNumber,
       description: item.FDESCRIPTION
   }));
}

小结

通过以上步骤,我们实现了从金蝶云星空系统中获取采购退料单数据,并进行了初步加工。这一过程不仅确保了数据的一致性和准确性,还为后续的数据转换与写入奠定了基础。在实际应用中,可以根据具体需求进一步优化和扩展这些操作。 打通用友BIP数据接口

数据集成生命周期中的ETL转换与写入:从云星空到旺店通

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

元数据配置解析

首先,我们需要理解元数据配置,以便正确地进行数据转换和写入。以下是元数据配置的关键部分:

{
  "api": "wdt.stockout.order.push",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "method": "merge",
    "field": "FBillNo,FSTOCKID_FNumber",
    "bodyName": "goods_list",
    "bodySum": ["FRMREALQTY"],
    "header": ["FSTOCKID_FNumber", "FSupplierID_FNumber", "FBillNo"],
    "body": ["FMATERIALID_FNumber", "FMATERIALID_FBARCODE", "FTAXPRICE", "F_USQR_Text1", "FRMREALQTY"]
  },
  ...
}

该配置指定了API接口wdt.stockout.order.push,并通过POST方法进行数据推送。idCheck字段设置为true,确保外部单号唯一性检查。operation部分定义了如何合并和处理数据字段。

请求参数映射

我们需要将源平台的数据字段映射到目标平台所需的字段格式:

{
  "field": "outer_no",
  "label": "外部单号",
  ...
  "value": "{FBillNo}"
},
{
  ...
  "field": "warehouse_no",
  ...
  "value": "{FSTOCKID_FNumber}"
},
...
{
  ...
  "field": "detail_list",
  ...
  "children": [
    {
      ...
      "field": "spec_no",
      ...
      "value": "{FMATERIALID_FNumber}"
    },
    {
      ...
      "field": "num",
      ...
      ...
      ...

这些映射关系确保了从源平台(如云星空)的字段能够正确转换为目标平台(旺店通)的字段。

数据转换逻辑

在ETL过程中,首先提取(Extract)源平台的数据,然后进行必要的转换(Transform),最后加载(Load)到目标平台。

  1. 提取数据: 从云星空采购退料单中提取必要的数据字段,如FBillNo, FSTOCKID_FNumber, FMATERIALID_FNumber, FRMREALQTY, FTAXPRICE, F_USQR_Text1等。

  2. 转换数据: 将提取的数据根据元数据配置进行转换。例如,将FBillNo映射为outer_no,将FSTOCKID_FNumber映射为warehouse_no,并处理批次号字段:

    {
     ...
     "_function case when '{F_USQR_Text1}'=' ' then '' else '{F_USQR_Text1}' end"
    }
  3. 加载数据: 转换后的数据通过POST请求发送到旺店通·企业奇门API接口:

    {
     ...
     {
       field: 'outer_no',
       value: '12345'
     },
     {
       field: 'warehouse_no',
       value: 'WH001'
     },
     {
       field: 'detail_list',
       children: [
         {
           field: 'spec_no',
           value: 'SKU001'
         },
         {
           field: 'num',
           value: '10'
         },
         {
           field: 'price',
           value: '100'
         }
       ]
     }
     ...
    }

接口调用示例

以下是一个完整的接口调用示例:

import requests

url = 'https://api.wangdian.cn/openapi2/wdt.stockout.order.push'

payload = {
    'outer_no': '12345',
    'is_check': '1',
    'warehouse_no': 'WH001',
    'logistics_code': '',
    'logistics_no': '',
    'goods_total_amount': '',
    'goods_total_cost': '',
    'post_cost': '',
    'reason': '',
    'detail_list': [
        {
            'remark': '来自金蝶采购退料单',
            'spec_no': 'SKU001',
            'num': '10',
            'price': '100',
            '_function case when {F_USQR_Text1}=\' \' then \'\' else {F_USQR_Text1} end'
        }
        # 更多货品明细...
    ]
}

headers = {'Content-Type': 'application/json'}

response = requests.post(url, json=payload, headers=headers)

print(response.json())

通过上述步骤和代码示例,我们可以实现从云星空到旺店通的数据ETL转换和写入过程。这种方法确保了不同系统间的数据无缝对接,提高了业务流程的效率和透明度。 打通企业微信数据接口

更多系统对接方案