从MySQL到销帮帮:API接口的数据转换与加载实践

  • 轻易云集成顾问-吕修远

3查询商城订单到销帮帮合同接口 (外贸:4833412)集成案例分享

在复杂的企业数据管理过程中,如何高效地将MySQL中的商城订单数据精准、及时无误地同步到销帮帮合同接口,是一个常见而关键的技术挑战。本文将详细介绍“3查询商城订单到销帮帮合同接口 (外贸:4833412)”方案,通过这一系统对接实例,剖析具体的数据集成方法与技术要点。

首先,为了确保海量订单数据能够被快速写入至销帮帮,我们借助平台提供的高吞吐量数据写入能力。通过统一视图和控制台对API资产进行集中管理,有效优化资源配置并提升使用效率。此外,为保证每一条数据不漏单,我们定时且可靠地抓取MySQL接口数据并进行批量处理,同时利用自定义的数据转换逻辑来适配不同的数据结构。

为了应对分页和限流的问题,我们特别设计了合理的分页策略以及限流机制,提高了整体系统稳定性。在此过程中,还引入了实时监控与日志记录功能,以便及时发现异常并执行重试机制,从而保障任务持续正常运行。对于格式差异较大的情况,则采用定制化的数据映射方式,精确完成从MySQL到销帮帮之间的数据转换。

通过这套全面且灵活的操作,实现了高效、安全、准确的一站式数据集成,极大提升业务透明度和工作效率。以下章节将深入探讨具体实现步骤及代码示例,为解决类似问题提供实践参考。 数据集成平台可视化配置API接口

调用MySQL接口select获取并加工数据

在轻易云数据集成平台中,调用源系统MySQL接口select获取并加工数据是数据集成生命周期的第一步。本文将详细探讨如何通过配置元数据实现这一过程。

元数据配置解析

元数据配置是实现数据请求与清洗的关键部分。以下是一个典型的元数据配置示例:

{
  "api": "select",
  "effect": "QUERY",
  "method": "POST",
  "number": "order_code",
  "id": "order_code",
  "idCheck": true,
  "request": [
    {
      "field": "main_params",
      "label": "main_params",
      "type": "object",
      "describe": "111",
      "value": "1",
      "children": [
        {"field": "order_status", "label": "订单状态", "type": "string", "value":"2"},
        {"field": "update_time", "label": "创建时间", "type":"datetime", 
            "value":"{{HOURE_AGO_3|datetime}}"},
        {"field":"limit","label":"limit","type":"string","value":"{PAGINATION_PAGE_SIZE}"},
        {"field":"offset","label":"offset","type":"string","value":"{PAGINATION_START_ROW}"},
        {"field":"customer_source","label":"crm表单ID","type":"string","value":"2308022"}
      ]
    },
    {
      "field": "extend_params_1",
      "label": "1:1扩展参数",
      "type": "array",
        "children":[{"field":"order_code","label":"主表ID","type":"string","value":"order_code"}]
    }
  ],
  ...
}

主查询SQL语句

主查询SQL语句用于从MySQL数据库中获取订单信息。以下是主查询SQL语句的配置:

{
  ...
    "otherRequest":[
        {
            "field":"main_sql",
            "label":"main_sql",
            "type":"string",
            "describe":"111",
            "value":
                "SELECT middle_order.order_code, middle_order.user_id, middle_order.whether_to_sign_new, middle_order.quotation_desc3, middle_order.order_amount, middle_order.product_amount, middle_order.other_amount, middle_order.discount, middle_order.account_receivable, middle_order.discount_amount, middle_order.sales_amount, middle_order.client_type, middle_order.order_status, middle_order.audit_time, middle_order.create_time, middle_order.update_time, middle_order.customer_code, middle_order.customer_name, middle_order.customer_id, middle_order.customer_source, middle_order.crm_user_id, middle_order.user_name, middle_order.file_address,middle_order.business_user_id,middle_order.business_user_name FROM middle_order WHERE  middle_order .`order_status` = :order_status AND    middle_order.crm= 1 AND middle_order.customer_id!='' AND    middle_order .client_type= :customer_source AND middle_order .`update_time`>= :update_time order by middle_order .`create_time`asc limit :limit offset :offset"
        },
        ...
    ],
  ...
}

该SQL语句通过参数化查询来确保安全性和灵活性,主要参数包括:

  • :order_status: 用于过滤订单状态。
  • :customer_source: 用于指定客户来源。
  • :update_time: 用于限定更新时间范围。
  • :limit:offset: 用于分页处理。

扩展查询SQL语句

扩展查询SQL语句用于获取订单详情信息,并通过主表ID进行关联:

{
  ...
    "otherRequest":[
        ...
        {
            "field":"extend_sql_1",
            "label":"1:1扩展语句",
            "type":"string",
            "value":
                "SELECT middle_order_details.order_code,middle_order_details.create_time,middle_order_details.update_time,middle_order_details.product_no,middle_order_details.product_name,middle_order_details.product_number,middle_order_details.product_price,middle_order_details.sales_price,middle_order_details.total_product_price,middle_order_details.total_sales_price FROM    middle_order_details LEFT JOIN  middle_order on middle_order.order_code =   middle_order_details .`order_code` where    middle_order_details .`order_code`= :order_code"
        }
    ],
   ...
}

该扩展查询通过左连接(LEFT JOIN)将订单详情与主表订单进行关联,并使用参数:order_code来指定具体的订单。

请求参数配置

请求参数配置定义了API调用时所需的参数结构:

{
  ...
    "request":[
        {
            "field":"main_params",
            "label":"main_params",
            "type":"object",
            "describe":"111",
            "value":"",
            "children":[
                {"field":"order_status",                            
                              ...   
                          },
                          ...
                      ]
                  },
                  {
                      ...
                  }
          ],
          ...
}

这些参数包括:

  • main_params: 包含主要的过滤条件,如订单状态、更新时间等。
  • extend_params_1: 包含扩展查询所需的参数,如主表ID。

数据请求与清洗

在实际操作中,通过POST方法调用API接口,传递上述配置的请求参数,执行主查询和扩展查询。返回的数据会自动填充到响应结构中,实现数据的清洗和初步加工。

通过这种方式,可以高效地从MySQL数据库中提取并处理所需的数据,为后续的数据转换与写入奠定基础。 如何开发用友BIP接口

轻易云数据集成平台ETL转换与销帮帮API接口集成案例

在轻易云数据集成平台的生命周期中,ETL(Extract, Transform, Load)转换是一个关键步骤。在本文中,我们将深入探讨如何将已经集成的源平台数据进行ETL转换,并转为目标平台销帮帮API接口所能够接收的格式,最终写入目标平台。

API接口配置与元数据解析

在本案例中,我们的目标是通过销帮帮的合同添加接口/pro/v2/api/contract/add将商城订单数据写入销帮帮。以下是该API接口的元数据配置:

{
  "api": "/pro/v2/api/contract/add",
  "effect": "EXECUTE",
  "method": "POST",
  "number": "id",
  "id": "id",
  "name": "id",
  "idCheck": true,
  "request": [
    {"field":"corpid","label":"corpid","type":"string","value":"ding65b814e691560eba35c2f4657eb6378f"},
    {"field":"userId","label":"userId","type":"string","value":"{crm_user_id}"},
    {"field":"formId","label":"表单ID","type":"string","value":"4833412"},
    {"field":"dataList","label":"dataList","type":"object","children":[
      {"field":"serialNo","label":"合同编号","type":"string","value":"{order_code}"},
      {"field":"text_15","label":"签约状态","type":"string","value":"{whether_to_sign_new}"},
      {"field":"text_2","label":"客户名称(CRM客户ID)","type":"string","value":"{customer_id}"},
      {"field":"text_8","label":"签订人(crm用户ID)","type":"string","value":"{business_user_id}"},
      {"field":"date_1","label":"签订日期","type":"string", "value": "_function UNIX_TIMESTAMP( {{create_time|UNIX_TIMESTAMP}} )"},
      {"field": "text_6", "label": "合同状态", "type": "string", "value": "签约"},
      {
        "field": "array_4",
        "label": "关联产品",
        "type": "array",
        "value": "extend_sql_1",
        "children":[
          {"field": "text_1", "label": "CRM产品ID", 
            "type": "string", 
            "value": "_mongoQuery f98d7b84-e8e1-3960-9941-487c49c19dd7 findField=content.dataId where={\"content.data.serialNo\":{\"$eq\":\"{{extend_sql_1.product_no}}\"}}"
          },
          {"field": "num_1", 
            "label": 
            "单价", 
            "type":
            "string", 
            "value":
            "{{extend_sql_1.sales_price}}"
          },
          {
            "field":
            "num_4", 
            "label":
            "折扣(%)", 
            "type":
            "string", 
            "value":
            "1"
          },
          {
            "field":
            "num_6", 
            "label":
            "售价(元)", 
            "type":
            "string", 
            "value":
            "{{extend_sql_1.sales_price}}"
          },
          {
            "field":
            "num_3", 

            label":
            数量, type:
            string, value:
            product_number
         }
         text_9, label: 状态, type: string, value: 1
       ]
     },
     {
       field: array_5,
       label: 付款时效,
       type: string,
       value: {quotation_desc3},
       parser: {name: StringToArray, params:,},
       mapping: {target: 64350d87ebac3c6e9c314f80, direction: positive}
     },
     {
       field: text_17,
       label: 拆扣,
       type: string,
       value: _function CASE WHEN ('{discount}' BETWEEN '0' AND '0.5') THEN '5折以下(不含5折)' WHEN ('{discount}' BETWEEN '0.5' AND '0.7') THEN '5折及5折以上' WHEN ('{discount}' BETWEEN '0.7' AND '1') THEN '7折及7折以上' ELSE '其他' END
     },
     {
       field:
       num_27,
       label:
       其他费用,
       type:
       string
     },
     {
       field:
       num_28,

    label:

优惠金额,

    type:

    string,

    value:

_function {product_amount}-{sales_amount}
},
{
    field:

    num_1,

    label:

合同金额,

    type:

    string,

    value:

{sales_amount}
},
{
    field:

    array_1,

    label:

应收款,

    type:

    string,

    value:

{sales_amount}
},
{
    field:

ownerId,

    label:

所有用户ID,

    type:

    string,

    value:

{business_user_id},

    parser:{name:StringToArray,params:,}
},
{
    field:text_24,label:合同链接,type:string,value:{file_address}},
{
    field:
coUserId,label:
协同人,type:string,value:{crm_user_id}},
{
    field:file_
,label:file_,type:
array,children:[
{
    field:
filename,label:
filename,type:string,value:{order_code}.pdf},
{
    field:
attachIndex,label:
attachIndex,type:string,value:{file_address}},
{
    field:
ext,label:
ext,type:string,value:pdf},
{
    field:size,label:size,type:string,value:1000}]}
]}]}

数据转换与写入流程

在进行ETL转换时,我们需要特别注意以下几个关键点:

数据提取与清洗

首先,从源系统提取原始订单数据,并进行必要的清洗和标准化处理。这包括对字段类型的校验、空值处理以及格式转换。例如,将时间戳格式化为目标系统所需的格式。

数据映射与转换

根据元数据配置,将源数据字段映射到目标API所需的字段。例如,将order_code映射到serialNo,将customer_id映射到text_2等。同时,需要处理一些复杂的数据转换逻辑,例如使用函数将创建时间转换为UNIX时间戳:

{"field": "date_1", 
                                                                                                                 label:"签订日期",
         type:"string",
         value:" _function UNIX_TIMESTAMP( {{create_time|UNIX_TIMESTAMP}} )"}
嵌套结构处理

对于嵌套结构的数据,例如关联产品信息,需要按照元数据中的定义逐层解析和填充。例如,将每个产品的信息按照指定的字段映射规则填充到对应位置:

{"field": 
    array_4,"label":
关联产品,"type":
array,"value":
extend_sql_1,"children":[{"field":
    text_
,"label":

CRM产品ID,"type":

    string,"value":

_mongoQuery f98d7b84-e8e1-3960-9941-487c49c19dd7 findField=content.dataId where={\"content.data.serialNo\":{\"$eq\":\"{{extend_sql_1.product_no}}\"}}"},{"field":

    num_

,"label":

单价,"type":

    string,"value":

{{extend_sql_

.sales_price}}},{"field":

    num_

,"label":

折扣(%),"type":

    string,"value":

"},{"field":

    num_

,"label":

售价(元),"type":

    string,"value":

{{extend_sql_

.sales_price}}},{"field":

    num_

,"label":

数量,"type":

    string,"value":

{{extend_sql_

.product_number}}},{"field"

    text_

,label"

状态,type"

,string,value"

}]
特殊逻辑处理

某些字段需要根据特定业务逻辑进行处理,例如拆扣字段:

{"field":
    text_
,label"
拆扣,type"
,string,value"
_function CASE WHEN ('{discount}' BETWEEN '0' AND '0.5') THEN '5折以下(不含5折)' WHEN ('{discount}' BETWEEN '0.5' AND '0.7') THEN '5折及5折以上' WHEN ('{discount}' BETWEEN '0.7' AND '1') THEN '7折及7折以上' ELSE '其他' END"}
数据加载

最后,将转换后的数据通过POST请求写入销帮帮API接口。确保请求体符合API要求,并包含所有必要的字段和嵌套结构。

实际应用示例

假设我们从商城系统提取了一条订单数据如下:

{
  order_code:"12345678",
 customer_id:"C001",
 business_user_id:"U001",
 create_time:"2023-10-01T12:00:00Z",
 extend_sql_: [
   {product_no:"P001", sales_price:"100.00", product_number:"2"}
 ],
 quotation_desc3:"30天内付款",
 discount:"0.6",
 product_amount:"200.00",
 sales_amount:"180.00",
 file_address:"http://example.com/contract.pdf"
}

根据上述元数据配置和映射规则,生成的请求体如下:

{
 corpid:"ding65b814e691560eba35c2f4657eb6378f",
 userId:"U001",
 formId:"4833412",
 dataList:{
   serialNo:"12345678",
   text_: 签约状态,
   text_:C001,
   text_:U001,
   date_:1696152000,// UNIX时间戳
   text_:签约,
   array_: [
     {text_:P001,num_:100.00,num_:,num_:100.00,num_:2,text_:}
 ],
 array_: ["30天内付款"],
 text_: 拆扣,text_: _function CASE WHEN ('{discount}' BETWEEN '0' AND '0.5') THEN '5折以下(不含5折)' WHEN ('{discount}' BETWEEN '0.5' AND '0.7') THEN '5折及5折以上' WHEN ('{discount}' BETWEEN '0.7' AND '1') THEN '7折及7折以上' ELSE ‘其他’ END},
 num_:20,num_:180,num_:180,array:["180"],ownerId:["U001"],text:{file_address},coUserId:["U001"],file:[{"filename":{"12345678.pdf"}},{"attachIndex":{"http://example.com/contract.pdf"}},{"ext":{"pdf"}},{"size":{"100"}}]
 }
}

通过上述步骤,我们成功地将商城订单数据转换并写入销帮帮系统,实现了不同系统间的数据无缝对接。这不仅提高了业务流程的效率,也确保了数据的一致性和准确性。 如何对接钉钉API接口

更多系统对接方案