ETL转换和MySQLAPI接口数据写入的实用案例解析

  • 轻易云集成顾问-卢剑航

金蝶云星空数据集成到MySQL的技术案例分享

在本次技术案例中,我们将具体探讨如何使用轻易云数据集成平台,将金蝶云星空中的采购入库单数据高效、安全地集成到MySQL数据库中。本方案的主要目标是确保全程透明化管理,并实时监控每一个数据处理环节,保证业务流程的准确性。

首先,通过调用金蝶云星空提供的executeBillQuery API接口进行采购入库单数据抓取。由于API返回的数据量可能较大,为了避免接口限流问题和分页处理错误,我们将采用定时任务调度机制来确保批量抓取的可靠性与完整性。同时,在这一过程中,平台自带的数据质量监控和异常检测功能能够及时发现并解决潜在的问题,提升整体效率。

随后针对获取的数据,需要对其进行一定程度的数据转换,以适应MySQL数据库结构。例如,要考虑不同系统之间字段格式不一致的问题,这里我们会配置自定义的数据转换逻辑。此外,为了加速大量数据写入操作,同时保持高吞吐量,我们采用了批处理模式,通过执行MySQL写入API execute 实现大规模数据快速导入。

为了全面掌握与监控整个集成过程,利用集中式监控和告警系统实时跟踪任务状态及性能表现。一旦出现任何异常情况,比如网络延迟导致接口响应超时或写入失败等问题,可以依赖内置的错误重试机制自动恢复,从而保障任务顺利完成。

最后,为使整个过程更加直观易懂,我们设计了一套可视化的数据流图,使得复杂流程变得简单明了,不仅帮助技术人员更好地理解和管理,也为后期维护工作提供极大的便利。通过这种细致周全的方法,有效实现了从金蝶云星空到MySQL的不漏单、精准采集与安全存储,进一步提高了企业的数据运营能力。 金蝶与SCM系统接口开发配置

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

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

接口配置与调用

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

  • api: executeBillQuery
  • method: POST
  • number: FBillNo
  • id: FInStockEntry_FEntryId
  • name: FBillNo

请求参数包括但不限于以下字段:

[
    {"field": "FInStockEntry_FEntryId", "label": "id", "type": "string", "describe": "id"},
    {"field": "FID", "label": "实体主键", "type": "string", "describe": "实体主键"},
    {"field": "FBillNo", "label": "单据编号", "type": "string", "describe": "单据编号"},
    {"field": "FDate", "label": "入库日期", "type": "string", "describe": "入库日期"},
    {"field": "FBillTypeID_FNumber", "label": "单据类型", "type": "string", "describe": "单据类型"},
    {"field": "FSupplierId_FNumber", "label": "供应商", 
![金蝶与CRM系统接口开发配置](https://pic.qeasy.cloud/S19.png~tplv-syqr462i7n-qeasy.image)
### 轻易云数据集成平台:ETL转换与MySQL API接口写入

在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台 MySQL API 接口所能够接收的格式,最终写入目标平台。这一过程涉及多个技术环节,包括数据清洗、转换和写入。本文将详细探讨这些环节,并结合具体的元数据配置进行深入分析。

#### 数据请求与清洗

在数据请求阶段,我们需要从源平台获取采购入库单的数据。通过轻易云数据集成平台,我们可以实现这一过程的自动化和透明化。获取的数据通常是未经处理的原始数据,需要经过清洗和转换,才能符合目标平台的要求。

#### 数据转换与写入

在数据转换阶段,我们需要将源数据转换为目标 MySQL API 接口能够接受的格式。这一步骤至关重要,因为它直接影响到数据能否成功写入目标数据库。

根据提供的元数据配置,我们可以看到以下字段需要进行转换:

```json
{
  "api": "execute",
  "effect": "EXECUTE",
  "method": "POST",
  "idCheck": true,
  "request": [
    {
      "field": "main_params",
      "label": "main_params",
      "type": "object",
      "describe": "111",
      "value": "1",
      "children": [
        {"field":"fid","label":"单据id","type":"string","value":"{FID}"},
        {"field":"document_id","label":"文档唯一标识号","type":"string","describe":"111","value":"{FID}-{FInStockEntry_FEntryId}"},
        {"field":"fbill_no","label":"单据编号","type":"string","describe":"111","value":"{FBillNo}"},
        {"field":"fentry_id","label":"明细id","type":"string","describe":"111","value":"{FInStockEntry_FEntryId}"},
        {"field":"fdate","label":"进货日期","type":"string","describe":"111","value":"{{FDate|date}}"},
        {"field":"fsupplierid_fnumber","label":"供应商编码","type":"string","value":"{FSupplierId_FNumber}"},
        {"field":"fsupplierid_name","label":"供应商名称","type":"string","value":"{FSupplierId_FName}"},
        {"field":"fmaterialid_fnumber","label":"原料编码","type":"string","value":"{FMaterialId_FNumber}"},
        {"field":"fmaterialid_name","label":"原料名称","type":"string","value":"{FMaterialName}"},
        {"field":"fmaterialid_fapptext","label":"产地","type":"","value":{"FMaterialId_F_APP_Text}},
        {"field':'fmaterialid_fnsbsccj','label':'生产厂家','type':'string','value':'{FMaterialId_F_nsb_sccj}'},
        {'field':'flot','label':'批号','type':'string','value':'{FLot}'},
        {'field':'fuom','label':'规格','type':'string','value':'{FUOM}'},
        {'field':'fexpiry_date','label':'有效期至','type':'string','value':{'FExpiryDate|date}},
        {'field':'fproduce_date','label':'生产日期','type':'string','value':{'FProduceDate|date}},
        {'field':'freal_qty','label':'进货数量','type':'string','value':{'FRealQty}},
        {'field':'funitid_name','label':'单位名称','type':'string,' 'value':{'FUnitID_FName}},
        {'field:'fsend_flag,' 'label:'发送标识,' 'type:'string,' 'value':{'F_SEND_FLAG}},
        {'field:'created_at,' 'label:'创建时间,' 'type:'string,' 'value':_function DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')},
        {'field:'updated_at,' 'label:'更新时间,' 'type:'string,' 'value':_function DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s')},
        {'field:'type,' 'label:'供应类型,' 'type:'string,' 'describe:1=客供 ;2=自供, ' value:2}
      ]
    }
  ],
  'otherRequest':[{
    field:main_sql,
    label:main_sql,
    type:string,
    describe:111,
    value:INSERT INTO cgrk 
(fid, document_id, fbill_no, fentry_id, fdate, fsupplierid_fnumber, fsupplierid_name, fmaterialid_fnumber, fmaterialid_name, fmaterialid_fapptext, fmaterialid_fnsbsccj, flot, fuom, fexpiry_date, fproduce_date, freal_qty, funitid_name, fsend_flag, created_at, updated_at,type) 
VALUES 
(:fid,:document_id,:fbill_no,:fentry_id,:fdate,:fsupplierid_fnumber,:fsupplierid_name,:fmaterialid_fnumber,:fmaterialid_name,:fmaterialid_fapptext,:fmaterialid_fnsbsccj,:flot,:fuom,:fexpiry_date,:fproduce_date,:freal_qty,:funitid_name,:fsend_flag,:created_at,:updated_at,type)
ON DUPLICATE KEY UPDATE 
fid = VALUES(fid),
document_id = VALUES(document_id),
fbill_no = VALUES(fbill_no), 
fentry_id = VALUES(fentry_id), 
fdate = VALUES(fdate), 
fsupplierid_fnumber = VALUES(fsupplierid_fnumber), 
fsupplierid_name = VALUES(fsupplierid_name), 
fmaterialid_fnumber = VALUES(fmaterialid_fnumber), 
fmaterialid_name = VALUES(fmaterialid_name), 
fmaterialid_fapptext = VALUES(fmaterialid_fapptext), 
fmaterialid_fnsbsccj = VALUES(fmateriald_fnsbsccj), 
flot = VALUES(flot), 
fuom = VALUES(fuom), 
expiry_date = VALUES(expiry_date), produce_date = VALUES(produce_date), real_qty = VALUES(real_qty), unitname=VALUES(unitname),
sendflag=VALUES(sendflag),
createdat=VALUES(createdat),
updatedat=VALUES(updatedat),
 type=VALUES(type);
}]
}

SQL 插入语句解析

在元数据配置中,otherRequest 字段包含了一个 SQL 插入语句,该语句用于将转换后的数据写入 MySQL 数据库。该 SQL 语句如下:

INSERT INTO cgrk (fid, document_id, fbill_no, fentry_id, fdate, fsupplierid_fnumber,
 fsuppliername,f materiald_number,f materiald name,f materiald apptext,f materiald nsb sccj,
flot,uom,f expiry date,f produce date,f real qty,f unitname,f sendflag,f created at,f updated at,type) 

VALUES (:fid , :document id , :fbill no , : fentry id , : date , : supplier id number , : supplier name , : material id number , : material name , : material app text , : material nsb sccj , : lot , : uom , : expiry date , : produce date , : real qty , : unit name , : send flag , : created at , updated at,type)

ON DUPLICATE KEY UPDATE fid=VALUES(fid),
document id=VALUES(document id),
fbill no=VALUES(fbill no),
entry id=VALUES(entry id),
date=VALUES(date),
supplier id number=VALUES(supplier id number),
supplier name=VALUES(supplier name),
 material id number=values(material id number),
 material name=values(material name),
 material app text=values(material app text ),
 material nsb sccj=values(material nsb sccj ),
 lot values(lot ),
 uom values(uom ),
 expiry date values(expiry date ),
 produce date values(produce date ),
 real qty values(real qty ),
 unitname values(unitname ),
 sendflag values(sendflag ),
 createdat values(createdat ),
 updatedat values(updatedat ), type values(type );

该 SQL 插入语句包含了多个字段,并使用占位符 : 来表示具体的值。这些占位符将在实际执行时被相应的数据替换。值得注意的是,该语句还包含了 ON DUPLICATE KEY UPDATE 子句,用于处理重复键的情况。如果插入的数据存在重复键,则会更新相应字段,而不是插入新的记录。

API 请求示例

为了将上述 SQL 插入语句与具体的数据结合,我们需要构造一个 API 请求示例。假设我们已经从源平台获取了以下采购入库单的数据:

{
  "FID": "12345",
  "FBillNo": "PO2023001",
  "FInStockEntry_FEntryId": "001",
  "FDate": "2023-10-01",
  // ...其他字段
}

根据元数据配置,我们可以构造出以下 API 请求体:

{
  "api": "execute",
  "effect": "EXECUTE",
  "method": POST,
  request:[{
    field:"main_params", label:"main_params", type:"object", describe:"111", value:"1", children:[
      { field:"fid", label:"单据ID", type:"String", value:"12345" },
      { field:"document ID ", label:"文档唯一标识号 ", type:"String ", describe:"111 ", value:"12345-001" },
      { field:fbill no,label:单据编号,type:string,value:{PO2023001}},
      { field:fentry ID,label:明细ID,type:string,value:{001}},
      { field:fdate,label:进货日期,type:string,value:{2023-10-01}},
     //...其他字段
     ]
   }],
   otherRequest:[{
     field:main sql,label:main sql,type:string,value:
     INSERT INTO cgrk (fid document ID fbill no entry ID,date,supplier ID number,supplier name,
     material ID number,name app text nsb sccj lot uom expiry date produce date real qty unitname sendflag createdat updatedat type)
     VALUE(:fid document ID fbill no entry ID,date,supplier ID number,supplier name,
     material ID number,name app text nsb sccj lot uom expiry date produce date real qty unitname sendflag createdat updatedat type)
     ON DUPLICATE KEY UPDATE fid document ID fbill no entry ID,date,supplier ID number,supplier name,
     material ID number,name app text nsb sccj lot uom expiry date produce date real qty unitname sendflag createdat updatedat type;
 }]
}

通过以上步骤,我们实现了从源平台到目标 MySQL 平台的数据ETL 转换和写入过程。 打通用友BIP数据接口

更多系统对接方案