从MySQL到金蝶云星空:利用API接口进行数据转换和写入

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

MySQL数据集成到金蝶云星空案例分享:MOM-XTZHD-形态转换单-新增

在本案例中,我们将详细探讨如何高效地实现MySQL数据集成到金蝶云星空,具体方案名称为"MOM-XTZHD-形态转换单-新增"。利用轻易云数据集成平台的先进功能,我们可以确保这一过程中的每一环节都透明可视,并通过实时监控和告警系统来保证任务的顺利执行。

数据获取与处理

首先,通过MySQL的select API接口(即SELECT语句)抓取所需的数据。这一步不仅需要定时可靠地进行,还要能够处理分页和限流问题,以保障数据采集的稳定性。

  1. 定时抓取: 定时任务调度能够确保持续从MySQL数据库中提取最新的数据,这对于保持数据库同步至关重要。

  2. 分页与限流: 当面对大量数据时,使用适当的分页策略可以避免一次性获取过多记录,从而减轻系统负担。此外,对API请求进行限流控制也能防止因瞬间高并发导致性能瓶颈或服务不可用。

数据转换与映射

在成功获取MySQL的数据后,需要对其进行必要的格式转换以符合金蝶云星空API(batchSave)的要求。此过程中应特别注意以下几点:

  1. 自定义转换逻辑: 根据业务需求,自定义相应的数据转换规则,例如字段映射、类型转换等,以确保最终写入的数据满足目标系统的标准。

  2. 批量写入: 金蝶云星空支持batchSave API,可以一次性接收大批量的数据提交。这不仅提高了效率,也减少了频繁调用接口带来的开销。

  3. 异常检测与重试机制: 在执行批量写入操作过程中,必须做好异常检测及错误重试机制。一旦发现问题,如网络中断或服务响应超时,即刻采取措施重新尝试提交,以最大程度上保障数据不漏单,不丢失。

实时监控与日志记录

在整个数据集成流程中,实现对各个步骤实时监控以及详细日志记录,是保证任务顺利完成的重要手段:

  1. 集中式监控: 通过统一的平台界面,可以实时跟踪所有相关任务状态和性能指标。一旦出现预警情况,可快速定位并解决问题。

  2. 详尽日志记录: 为每一个阶段生成详细日志,有助于审计追踪及后续分析,为进一步优化提供依据。

注意事项

最后,在具体实施过程中,还需关注以下关键点:

  1. 如何调用MySQL接口select 打通企业微信数据接口

    使用轻易云数据集成平台调用MySQL接口获取并加工数据

在数据集成过程中,调用源系统的API接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用MySQL接口select获取并加工数据。

元数据配置解析

首先,我们来看一下元数据配置的具体内容:

{
  "api": "select",
  "effect": "QUERY",
  "method": "POST",
  "id": "sourceid",
  "request": [
    {
      "field": "main_params",
      "label": "主参数",
      "type": "object",
      "describe": "对应其它请求字段内SQL语句的主参数,必须一一对应。",
      "value": "1",
      "children": [
        {
          "field": "limit",
          "label": "限制结果集返回的行数",
          "type": "int",
          "describe": "必要的参数!LIMIT 子句用于限制查询结果返回的行数。它指定了查询应该返回的最大行数。例如,LIMIT 10 表示查询结果只包含最多 10 行数据。这对于分页查询非常有用,可以在每次查询中返回一定数量的结果。",
          "value": "{PAGINATION_PAGE_SIZE}"
        },
        {
          "field": "offset",
          "label": "偏移量",
          "type": "int",
          "describe": "OFFSET 子句用于指定查询结果的起始位置或偏移量。它表示查询应该从结果集的哪一行开始返回数据。例如,OFFSET 20 表示查询应该从结果集的第 21 行开始返回数据。结合 LIMIT 子句使用时,OFFSET 指定了查询结果的起始行数。",
          "value": "{PAGINATION_START_ROW}"
        }
      ]
    }
  ],
  ...
}

主SQL语句解析

主SQL语句是整个数据请求和清洗过程中的核心部分。以下是配置中的主SQL语句:

select
t1.iface_id as sourceid,
CONCAT('MXTZH', DATE_FORMAT(t1.account_date, '%Y%m%d'), t1.batch_id) as '单据编号',
ifnull((select aft_quiet_time from ty_mes.mt_account_period where t1.account_date <= aft_quiet_time order by account_period_id desc limit 1), t1.account_date) as '单据日期',
t1.erp_doc_type as '单据类型',
t1.plant_code as '库存组织',
t1.owner_id_head as '货主',
t1.owner_type_head as '货主类型',
t1.seq as '明细行号',
t1.convert_type as '明细转换类型',
t1.material_code as '明细物料编码',
t1.convert_qty as '明细转换数量',
t1.locator_code as '明细仓库编码',
t1.mto_no as '明细计划跟踪号',
t1.stock_status as '明细库存状态',
t1.keeper_type_id as '明细保管者类型',
t1.keeper_id as '明细保管者',
t1.owner_type_id as '明细货主类型',
t1.owner_id as '明细货主',
t1.uom_code as '明细单位',
t1.attribute10 as '明细批号'
from
ty_mes.wms_plan_num_transfer_iface t1
inner join (
select batch_id from
ty_mes.wms_plan_num_transfer_iface
where tenant_id = 7
and instruction_doc_type in ('201_COST_CENTER_PICKING_DOC',  'SEND_EXECUTE_OVER_SITE', 'SO_DELIVERY_DOC', 'PLAN_NUM_UPDATE', 'SEND_RECEIVE_EXECUTE_IN_SITE')
and `STATUS` in ('N', 'E')
and return_order = 1
and owner_id_head = 'T02'
or (instruction_doc_type in ('PLAN_NUM_UPDATE') and owner_id_head = 'T02.01' and `STATUS` in ('N', 'E') and return_order = 1)
group by batch_id
limit :limit offset :offset
) t2 on t1.batch_id = t2.batch_id
where t1.tenant_id = 7
and t1.return_order = 1
order by t1.iface_id desc

参数绑定与优化

为了确保动态语法字段与请求参数一一对应,我们需要对SQL语句进行参数绑定:

  • 将动态字段:limit:offset替换为占位符(例如?)。
  • 在执行查询之前,通过参数绑定方法,将请求参数值与占位符进行对应绑定。

这种优化方式不仅提高了查询语句的可读性和维护性,还确保了动态字段与请求参数之间的正确对应关系,从而保证了查询的准确性和安全性。

实际操作步骤

在轻易云平台上配置上述元数据时,可以按照以下步骤进行:

步骤一:配置API接口

  • 设置API为select
  • 设置请求方法为POST
  • 配置请求参数,包括分页所需的limitoffset

步骤二:编写并优化SQL语句

  • 将原始SQL中的动态字段替换为占位符。
  • 在执行查询时,通过代码实现参数绑定。

步骤三:执行并验证

  • 执行配置好的API接口。
  • 验证返回的数据是否符合预期,并根据需要进行进一步的数据清洗和转换。

通过以上步骤,我们可以高效地调用MySQL接口获取并加工数据,为后续的数据处理奠定坚实基础。在实际应用中,这种方法不仅简化了操作流程,还提高了系统整体性能和稳定性。 金蝶与外部系统打通接口

使用轻易云数据集成平台将源数据转换并写入金蝶云星空API接口

在数据集成的生命周期中,ETL(提取、转换、加载)过程是关键步骤之一。在本文中,我们将深入探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,转为金蝶云星空API接口所能够接收的格式,并最终写入目标平台。

数据请求与清洗

在进入ETL转换之前,首先需要确保从源系统获取的数据是干净且结构化的。通过轻易云的数据请求与清洗功能,我们可以对原始数据进行预处理。这一步骤虽然重要,但本文的重点在于下一步,即如何将这些清洗后的数据转换并写入金蝶云星空。

数据转换与写入

为了实现将清洗后的数据成功写入金蝶云星空,我们需要配置相应的元数据,并利用API接口进行交互。以下是一个详细的元数据配置示例:

{
  "api": "batchSave",
  "effect": "EXECUTE",
  "method": "POST",
  "idCheck": true,
  "request": [
    {"field":"FBillNo","label":"FBillNo","type":"string","describe":"单据编号","value":"{{单据编号}}"},
    {"field":"FStockOrgId","label":"FStockOrgId","type":"string","describe":"库存组织","value":"{{库存组织}}","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"Fdate","label":"Fdate","type":"string","describe":"日期","value":"{{单据日期}}"},
    {"field":"FBillTypeID","label":"FBillTypeID","type":"string","describe":"单据类型","value":"{{单据类型}}","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {"field":"FOwnerTypeIdHead","label":"FOwnerTypeIdHead","type":"string","describe":"货主类型","value":"{{货主类型}}"},
    {"field":"FOwnerIdHead","label":"FOwnerIdHead","type":"string","describe":"货主","value":"{{货主}}","parser":{"name":"ConvertObjectParser","params":"FNumber"}},
    {
      "field": "Fentity",
      "label": "Fentity",
      "type": "array",
      "describe": "明细信息",
      "value": "items",
      "children": [
        {"field": "Fseq", "label": "Fseq", "type": "string", "value": "{{items.明细行号}}"},
        {"field": "FConvertType", "label": "FConvertType", "type": "string", "value": "{{items.明细转换类型}}"},
        {"field": "FMaterialId", "label": "FMaterialId", "type": "string", "value": "{{items.明细物料编码}}", 
            "parser":{"name":"ConvertObjectParser", 
            "params":
                "FNumber"}
        },
        {"field": "FConvertQty", 
            "label":
                "FConvertQty",
                "type":
                    "string",
                    "value":
                        "{{items.明细转换数量}}"
        },
        {"field":
            "FStockId",
            "label":
                "FStockId",
                "type":
                    "string",
                    "value":
                        "{{items.明细仓库编码}}",
                        "parser":{
                            "name":
                                "ConvertObjectParser",
                                "params":
                                    "FNumber"
                        }
        },
        {"field":
            "FMtoNo",
            "label":
                "FMtoNo",
                "type":
                    "string",
                    "value":
                        "{{items.明细计划跟踪号}}"
        },
        {"field":
            "FStockStatus",
            "label":
                "FStockStatus",
                "type":
                    "string",
                    "value":
                        "{{items.库存状态}}",
                        "parser":{
                            name:
                                name:"ConvertObjectParser"
                                params:
                                    params:"FNumber"
                     }
        },
        {"field":
          FKeeperTypeId,
          label:
            FKeeperTypeId,
            type:
            string,
            value:
              value:"{{items.明细保管者类型}}" 
       },
       {
          field:FKeeperId
          label:FKeeperId
          type:string
          value:value:"{{items.明细保管者}}" 
          parser:{
            name:ConvertObjectParser
            params:FNumber  
          }
       },
       {
          field:FOwnerTypeId
          label:FOwnerTypeId
          type:string
          value:value:"{{items.明细货主类型}}"    
       },
       {
          field:FOwnerId
          label:FOwnerId
          type:string
          value:value:"{{items.明细货主}}"  
          parser:{
            name:ConvertObjectParser
            params:FNumber  
          }
       },
       {
          field:FUnitId
          label:FUnitId
          type:string
          value:value:"{{items.明细单位}}"  
          parser:{
            name:ConvertObjectParser
            params:FNumber  
          }
       },
       {
            field:FLot,
            label:FLot,
            type:string,
            value:value:"{{items.明细批号}}"    
            parser:{
                name:ConvertObjectParser,
                params:FNumber  
            }
       }
     ]
   }
 ],
 otherRequest:[
   {
     field:FormId,
     label:FormId,
     type:string,
     describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder"
     value:value:"STK_StatusConvert"
   },
   {
     field:Operation,
     label:Operation,
     type:string,
     value:value:"BatchSave"
   },
   {
     field:IsAutoSubmitAndAudit,
     label:IsAutoSubmitAndAudit,
     type:bool,
     value:true 
   },
   {
     field:IsVerifyBaseDataField,
     label:IsVerifyBaseDataField,
     type:bool,describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)"
     value:false    
   }
 ],
 operation:{
   method:merge, 
   field:"单据编号", 
   bodyName:"items", 
   header:["单据编号", 
     单据日期, 
     单据类型, 
     库存组织, 
     货主, 
     货主类型], 
     body:["明细行号", 
      明细转换类型, 
      明细物料编码, 
      明细转换数量, 
      明细仓库编码, 
      明细计划跟踪号, 
      明细库存状态, 
      明细保管者类型, 
      明细保管者, 
      明细货主类型, 
      明细货主, 
      明细单位,  
      明细批号]
 },enforcedAssociation:true}

配置解析

  1. API调用配置

    • api: 指定调用的API名称,这里为batchSave
    • method: HTTP请求方法,这里为POST
    • idCheck: 是否进行ID校验,这里为true
  2. 请求字段映射

    • 每个字段都有明确的映射关系,例如FBillNo映射到源数据中的单据编号
    • 使用了parser来处理复杂的数据转换,例如将库存组织、单据类型等字段通过ConvertObjectParser解析为目标系统所需格式。
  3. 嵌套结构处理

    • children: 用于处理嵌套结构的数据,如订单中的多个商品条目。
  4. 其他请求参数

    • FormId: 指定表单ID,如这里的STK_StatusConvert
    • Operation: 操作类型,这里为批量保存(BatchSave)。
  5. 操作配置

    • operation: 定义了如何合并和处理多个记录,包括头部和主体部分。

实际应用

通过上述配置,我们可以实现从源系统到金蝶云星空系统的数据无缝对接。具体步骤如下:

  1. 提取源数据:从源系统提取所需的数据,确保其结构符合预期。
  2. 应用元数据配置:利用轻易云平台,将提取到的数据根据元数据配置进行解析和转换。
  3. 发送API请求:通过HTTP POST方法,将转换后的数据发送到金蝶云星空API接口,实现数据写入。

以上就是使用轻易云数据集成平台,将源平台的数据经过ETL转换后,成功写入金蝶云星空API接口的技术案例。通过详细的元数据配置和API调用,我们能够高效地完成复杂的数据集成任务。 系统集成平台API接口配置

更多系统对接方案