解决管易云接口分页与限流问题的高效策略

  • 轻易云集成顾问-钟家寿

查询管易的销售订单:数据集成技术案例分享

在本文中,我们将探讨如何通过轻易云数据集成平台实现与管易云·奇门系统的数据对接,以高效查询和处理销售订单。该方案利用了gy.erp.trade.get接口进行销售订单的抓取,并通过batchSave接口将数据批量写入到轻易云集成平台,从而确保整个过程的无缝连接。

首先,针对大量数据快速写入需求,轻易云提供了支持高吞吐量的数据写入能力,可以快速地将从管易云·奇门获取的大量销售订单导入到平台内部。这一特性极大提升了我们的数据处理时效性,使得业务流程更加顺畅。

其次,在集成过程中我们面临着分页和限流问题,如不充分解决可能导致部分订单漏单或积压。根据实际项目经验,通过对gy.erp.trade.get接口分页逻辑进行优化,在每次请求时精确控制返回的数据条数,有效避免这些潜在问题。同时,为应对API调用中的限流限制,我们设计了一套基于重试机制的错误处理策略,保证即便在网络波动或服务端响应失败情况下,也能完成可靠的数据传输。

此外,为确保不同系统间数据格式差异不会影响最终的数据完整性,我们开发并部署了一套自定义转换规则,将管易云·奇门原始API返回的数据适配至轻易云所需格式。在此过程中充分运用了可视化工具,使得复杂的信息映射关系直观明了,大大简化了配置难度和工作强度。

综上所述,通过借助轻易云提供的一系列强大功能,我们不仅成功地实现了跨系统间的高效、稳定的信息交换,还有效保障了整体方案运行中的各环节透明度与实时监控能力。以下具体描述我们是如何逐步实施这一技术方案,并详细解析其中关键步骤和实现细节。 用友与CRM系统接口开发配置

调用管易云·奇门接口gy.erp.trade.get获取并加工数据

在数据集成生命周期的第一步中,调用源系统接口是至关重要的一环。本文将深入探讨如何通过轻易云数据集成平台调用管易云·奇门接口gy.erp.trade.get来获取销售订单数据,并进行初步加工。

接口调用配置

我们首先需要配置元数据以便正确调用接口。以下是关键的元数据配置项:

  • api: gy.erp.trade.get
  • method: POST
  • number: platform_code
  • id: code
  • pagination: {"pageSize":100}
  • idCheck: true

这些配置项定义了我们将要调用的API、请求方法以及分页和ID检查等基本参数。

请求参数设置

为了确保我们能够准确地获取所需的数据,需要设置一系列请求参数。这些参数包括时间段、订单类型、店铺代码等。以下是具体的请求参数配置:

"request": [
    {"field":"start_date","label":"创建时间开始段","type":"string","value":"{{LAST_SYNC_TIME|datetime}}"},
    {"field":"end_date","label":"创建时间结束段","type":"string","value":"{{CURRENT_TIME|datetime}}"},
    {"field":"order_state","label":"订单类型","type":"string"},
    {"field":"shop_code","label":"店铺代码","type":"string"},
    {"field":"page_no","label":"页码","type":"string","value":"1"},
    {"field":"page_size","label":"每页大小","type":"string","value":"10"}
]

这些参数中,start_dateend_date用于指定查询的时间范围,分别使用上次同步时间和当前时间。order_stateshop_code则用于过滤特定类型的订单和店铺。

分页处理

由于一次性获取大量数据可能会导致性能问题,因此我们需要进行分页处理。分页相关的元数据配置如下:

"otherRequest": [
    {"field":"page_size","label":"分页大小","type":"string","value":"{PAGINATION_PAGE_SIZE}"},
    {"field":"page_no","label":"页号","type":"string","value":"{PAGINATION_START_PAGE}"}
]

在实际调用过程中,我们可以根据返回结果中的总记录数动态调整分页参数,确保所有数据都能被完整获取。

数据清洗与转换

在成功获取到原始数据后,下一步是对数据进行清洗与转换。这一步通常包括以下几个方面:

  1. 字段映射:将原始数据中的字段映射到目标系统所需的字段。例如,将管易云返回的订单状态字段映射到目标系统中的相应字段。
  2. 格式转换:对日期、金额等字段进行格式转换,以符合目标系统的要求。
  3. 去重处理:根据业务需求,对重复的数据进行去重处理。

实例代码

以下是一个简单的示例代码片段,用于演示如何通过轻易云平台调用管易云·奇门接口并处理返回的数据:

import requests
import json
from datetime import datetime

# 设置请求URL和头信息
url = "https://api.guanyiyun.com/gy.erp.trade.get"
headers = {
    "Content-Type": "application/json"
}

# 设置请求参数
params = {
    "start_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
    "end_date": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
    "order_state": "ALL",
    "shop_code": "SHOP123",
    "page_no": 1,
    "page_size": 10
}

# 发送请求并获取响应
response = requests.post(url, headers=headers, data=json.dumps(params))
data = response.json()

# 数据清洗与转换
cleaned_data = []
for order in data["orders"]:
    cleaned_order = {
        "order_id": order["id"],
        "order_status": order["status"],
        # 其他字段映射与转换...
    }
    cleaned_data.append(cleaned_order)

# 输出清洗后的数据
print(cleaned_data)

通过上述步骤,我们可以高效地从管易云·奇门接口获取销售订单数据,并进行必要的数据清洗与转换,为后续的数据写入和分析做好准备。 用友与外部系统接口集成开发

使用轻易云数据集成平台进行ETL转换与数据写入

在数据集成过程中,将源平台的数据转换为目标平台可接受的格式,并通过API接口将其写入目标平台,是一个关键步骤。本文将详细探讨如何利用轻易云数据集成平台实现这一过程,具体以查询管易的销售订单并写入轻易云集成平台为例。

元数据配置解析

在进行ETL转换之前,我们需要了解元数据配置。以下是我们使用的元数据配置:

{
  "api": "batchSave",
  "method": "POST",
  "idCheck": true,
  "operation": {
    "rowsKey": "array",
    "rows": 20,
    "method": "batchArraySave"
  },
  "request": [
    {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSCKD01_SYS"},
    {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{platform_code}"},
    {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{createtime_new}"},
    {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{shop_code}"},
    {"field":"FCustomerID","label":"客户","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{shop_code}"},
    {"field":"FStockOrgId","label":"发货组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{warehouse_code}"},
    {"field":"FNote","label":"备注","type":"","describe":"","value":""},
    {"field": "F_mhgj_Assistant", "label": "管易订单类型", "type": "", "describe": "", "value": "{order_type_name}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}},
    {
      "field": "SubHeadEntity",
      "label": "财务信息",
      "type": "",
      "children": [
        {"field": "FSettleOrgID", "label": "",  type: "", describe: "", parser: { name: 'ConvertObjectParser', params: 'FNumber' }, value: '{shop_code}', parent: 'SubHeadEntity'},
        {"field": 'FSETTLECURRID', label: '', type: '', describe: '', parser: { name: 'ConvertObjectParser', params: 'FNumber' }, value: 'PRE001', parent: 'SubHeadEntity'}
      ]
    },
    {
      field: 'FEntity',
      label: '',
      type: '',
      children:[
        { field:'FMaterialID', label:'物料编码', type:'', describe:'', parser:{ name:'ConvertObjectParser', params:'FNumber'}, value:'{{details.item_code}}', parent:'FEntity'},
        { field:'FRealQty', label:'实发数量', type:'', describe:'数量', value:'{{details.qty}}', parent:'FEntity'},
        { field:'FTaxPrice', label:'含税单价', type:'', describe:'单价', value:'{{details.price}}', parent:'FEntity'},
        { field:"FIsFree", label:"是否赠品", type:"", describe:"复选框", value:"_function case '{{details.price}}' when '0.0' then true else false end", parent:"FEntity"},
        { field:"FLot", label:"批号", type:"", describe:"批次", value:"001", parent:"FEntity", parser:{ name:"ConvertObjectParser", params:"FNumber"}},
        { field:"FStockID", label:"仓库", type:"", describe:"基础资料", parser:{ name:"ConvertObjectParser", params:"FNumber"}, value:"{warehouse_code}", parent:"FEntity"},
        { field:"FOwnerTypeId", label:"货主类型", type:"",
          value:
          BD_OwnerOrg, parent:FEntity},
          {
            field:
            FOwnerId, label:
            货主, type:
            , value:
            {{details.warehouse_code}}, parent:
            FEntity, parser:{
              name:
              ConvertObjectParser, params:
              FNumber}},
              {
                field:
                FEntrynote, label:
                备注, type:
                , describe:
                文本, parent:FEntity}],
                value:
                details}],
                otherRequest:[
                  {
                    field:
                    FormId, label:
                    业务对象表单Id, type:string, describe:必须填写金蝶的表单ID如:PUR_PurchaseOrder, value:SAL_OUTSTOCK},
                    {
                      field:
                      Operation, label:
                      执行的操作, type:string, value
                      Save},
                      {
                        field:IsAutoSubmitAndAudit,label
                        提交并审核,type
                        bool,value:false},
                        {
                          field:IsVerifyBaseDataField,label
                          验证基础资料,type
                          bool,value:false},
                          {
                            field
                            SubSystemId,label
                            系统模块,type
                            string}]
}

数据请求与清洗

首先,我们从源系统(例如管易)中提取销售订单数据。提取的数据可能包含多个字段,如订单编号、日期、客户信息、商品明细等。在这个阶段,我们需要对这些原始数据进行清洗和标准化处理,以确保其符合目标系统的要求。

数据转换

接下来,我们进入ETL过程中的关键步骤:数据转换。根据元数据配置,我们需要将源系统的数据字段映射到目标系统所需的字段格式。例如:

  • 将源系统中的platform_code映射到目标系统中的FBillNo
  • 将源系统中的createtime_new映射到目标系统中的FDate
  • 将源系统中的shop_code映射到多个字段,如FSaleOrgId, FCustomerID, SubHeadEntity.FSettleOrgID等。

在这个过程中,我们还需要使用一些解析器(如ConvertObjectParser)来处理复杂的数据转换需求。例如,解析器可以将特定的数值或字符串转换为目标系统所需的格式。

数据写入

完成数据转换后,我们使用API接口将处理后的数据写入目标平台。根据元数据配置,API接口为batchSave,请求方法为POST。

示例请求体如下:

{
  api: batchSave,
  method: POST,
  idCheck:true,
  operation:{
    rowsKey : array,
    rows :20,
    method : batchArraySave},
request:[{
  FBillTypeID : XSCKD01_SYS,
FBillNo : platform_code,
...
}
],
otherRequest:[{
FormId : SAL_OUTSTOCK,
Operation : Save,
IsAutoSubmitAndAudit : false,
IsVerifyBaseDataField : false}]
}

该请求体包含了所有必要的字段和子实体(如财务信息和明细信息),确保所有相关的数据都能正确地传输到目标平台。

通过这种方式,我们能够高效地实现从源平台到目标平台的数据集成,并确保每个环节的数据都能准确无误地传输和存储。这不仅提高了业务流程的透明度和效率,也为企业提供了强大的数据支持。 用友与MES系统接口开发配置

更多系统对接方案