案例分享:MySQL数据集成到金蝶云星空
在企业信息系统的复杂场景中,实现不同系统之间的数据无缝对接是优化业务流程的重要环节。本文将深入探讨如何利用轻易云数据集成平台,将MySQL中的生产领料单数据高效地集成到金蝶云星空。本案例实际应用方案名称为“SLD生产领料单新增深圳天一-单工序-好”。
技术要点一览:
-
数据采集与转换: 使用定时任务可靠抓取MySQL接口数据,通过API
select
获取需要更新的生产领料单记录。由于MySQL与金蝶云星空间存在一定的数据格式差异,采用自定义的数据转换逻辑来适配目标系统需求。 -
高效写入与事务处理: 通过轻易云平台提供的大吞吐量支持,确保大量数据能够快速、准确地写入至金蝶云星空。在实现过程中,调用了其批量保存API
batchSave
来简化操作并提高效率。同时,对批次提交进行事务管理,以保证任何错误发生时均能回滚并重试。 -
监控与异常处理: 集成过程设置了全面的监控和告警机制,实时跟踪每一个DataFlow的状态及性能情况。当检测到异常,例如连接超时或接口返回错误码等情况,会自动触发预设的重试策略,并记录详细日志以供后续分析。
-
分页与限流控制: MySQL数据库查询过程中可能会遇到大量记录,为防止一次性加载过多造成内存溢出,每次调用API
select
时添加分页参数,同时结合限流机制,在保证稳定性的前提下逐步推进大规模数据迁移。 -
可视化配置操作: 整个方案依赖于轻易云的平台提供的全透明可视化工具,使得配置步骤简单直观,无需编写复杂代码,从而缩短开发周期,提高了业务部门自主调整需求响应速度。
下文将详细讲述具体技术实施细节,包括从MySQL提取有效数据信息,到经过必要的数据清洗和转换,再到最终安全高效地将整理后的信息传递给金蝶云星空,实现全程自动化的一站式解决方案。
使用轻易云数据集成平台调用MySQL接口获取并加工数据
在数据集成过程中,调用源系统接口获取数据是至关重要的一步。本文将详细介绍如何通过轻易云数据集成平台调用MySQL接口select
来获取并加工数据。
元数据配置解析
在轻易云数据集成平台中,我们通过元数据配置来定义如何从MySQL数据库中获取所需的数据。以下是一个典型的元数据配置示例:
{
"api": "select",
"effect": "QUERY",
"method": "POST",
"number": "生产订单号",
"id": "领料单号",
"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语句如下:
select
case m.delivery_org
when 'T01.01' then CONCAT('HJ', CAST(hj1.id AS CHAR))
when 'T04' then CONCAT('HJGD', CAST(hj1.id AS CHAR))
else CONCAT('HJ', CAST(hj1.id AS CHAR))
end as 生产订单号,
a.part_no as 成品编号,
c.mode_no as 计划跟踪号,
CONCAT('LLD',CAST(a.id AS CHAR)) as 领料单号,
date(a.update_time) as 日期,
CONCAT(a.part_no,concat('_',c.current_process_code)) as 物料编号,
a.confirm_numb as 数量,e.real_name,
a.uuid as sourceid,
m.delivery_org as 供应组织
from wms_instock_confirm_task_detail a
left join wms_instock_purchase_task_detail c on MATTERIAL_TYPE='3'
left join wms_instock_confirm_main_task_detail b on b.connect_uuid=c.uuid
left join mbs_nuclear_price_task hj on hj.mold_no=c.mode_no and hj.part_no=a.part_no
left join mbs_nuclear_price_info hj1 on hj1.nuclear_price_task_uuid=hj.nuclear_price_task_uuid and hj1.out_type='3'
left join sys_user e on e.user_id=a.create_by
left join mbs_order_plan_bom l on c.mode_no=l.bom_no
left join mbs_order_bom m on m.bom_uuid=l.bom_uuid
where a.connect_uuid=b.uuid
and a.company_code='TYZN'
and a.update_time>'2023-08-01'
and hj1.create_time>(select config_value from sys_config where config_id=337)
and a.is_success1 !='1' and a.is_success4='1'
limit :limit offset :offset
这段SQL语句实现了复杂的数据提取和转换逻辑,包括多表连接、条件过滤以及字段拼接等操作。
参数绑定与优化
为了确保SQL语句中的动态字段(如:limit
和:offset
)能够正确地与请求参数对应,我们需要进行参数绑定。具体步骤如下:
- 将主SQL查询语句中的动态字段
:limit
和:offset
替换为占位符(例如?
)。 - 在执行查询之前,使用参数绑定的方法,将请求参数的值与占位符进行对应绑定。
通过这种方式,可以提高查询语句的可读性和维护性,并确保动态字段与请求参数正确对应,从而保证查询的准确性和安全性。
实际应用案例
假设我们需要分页获取生产领料单的数据,每页显示10条记录,从第0条记录开始。我们可以通过以下方式进行配置和调用:
{
...
"request":[
{
...
children:[
{
field: 'limit',
value: '10'
},
{
field: 'offset',
value: '0'
}
]
}
],
...
}
在实际调用时,系统会将这些参数绑定到主SQL语句中,并执行最终生成的SQL:
select
case m.delivery_org
when 'T01.01' then CONCAT('HJ', CAST(hj1.id AS CHAR))
when 'T04' then CONCAT('HJGD', CAST(hj1.id AS CHAR))
else CONCAT('HJ', CAST(hj1.id AS CHAR))
end as 生产订单号,
a.part_no as 成品编号,
c.mode_no as 计划跟踪号,
CONCAT('LLD',CAST(a.id AS CHAR)) as 领料单号,
date(a.update_time) as 日期,
CONCAT(a.part_no,concat('_',c.current_process_code)) as 物料编号,
a.confirm_numb as 数量,e.real_name,
a.uuid as sourceid,
m.delivery_org as 供应组织
from wms_instock_confirm_task_detail a
left join wms_instock_purchase_task_detail c on MATTERIAL_TYPE='3'
left join wms_instock_confirm_main_task_detail b on b.connect_uuid=c.uuid
left join mbs_nuclear_price_task hj on hj.mold_no=c.mode_no and hj.part_no=a.part_no
left join mbs_nuclear_price_info hj1 on hj1.nuclear_price_task_uuid=hj.nuclear_price_task_uuid and hj1.out_type='3'
left join sys_user e on e.user_id=a.create_by
left join mbs_order_plan_bom l on c.mode_no=l.bom_no
left join mbs_order_bom m on m.bom_uuid=l.bom_uuid
where a.connect_uuid=b.uuid
and a.company_code='TYZN'
and a.update_time>'2023-08-01'
and hj1.create_time>(select config_value from sys_config where config_id=337)
and a.is_success1 !='1' and a.is_success4='1'
limit ? offset ?
通过这种方式,我们可以高效地从MySQL数据库中获取所需的数据,并确保每次请求都能准确地返回分页后的结果。
总结,通过合理配置元数据和优化SQL语句,可以充分利用轻易云数据集成平台,实现高效、准确的数据提取和加工,为后续的数据处理奠定坚实基础。
轻易云数据集成平台:将源数据转换并写入金蝶云星空API接口
在数据集成生命周期的第二阶段,关键任务是将已经集成的源平台数据进行ETL(提取、转换、加载)处理,并最终写入目标平台。在本文中,我们将详细探讨如何利用轻易云数据集成平台,将生产领料单数据转换为金蝶云星空API接口所能接收的格式,并成功写入目标平台。
数据请求与清洗
在开始ETL过程之前,首先需要从源系统中提取生产领料单的数据。假设我们已经完成了这一阶段,并且获得了包含以下字段的数据:
- 领料单号
- 生产订单号
- 日期
- 成品编号
- 供应组织
- 物料编号
- 数量
- 计划跟踪号
数据转换与写入
接下来,我们将使用元数据配置,将上述数据转换为金蝶云星空API接口所需的格式,并通过POST方法将其写入目标平台。
配置API接口参数
根据提供的元数据配置,我们需要配置以下关键参数:
-
API接口基本信息
{ "api": "batchSave", "method": "POST", "number": "FBillNo", "id": "FID", "name": "FBillNo", "idCheck": true, ... }
-
请求头部字段
[ {"field":"FBillNo","label":"单据编号","type":"string","value":"{{领料单号}}"}, {"field":"FBillType","label":"单据类型","type":"string","value":"SCLLD01_SYS"}, {"field":"FDate","label":"日期","type":"string","value":"{{日期}}"}, {"field":"FStockOrgId","label":"发料组织","type":"string","value":"_function case '{{供应组织}}' when 'T01.01' then 'T01.06' when 'T04' then 'T04' else '' end"}, {"field":"FPrdOrgId","label":"生产组织","type":"string","value":"_function case '{{供应组织}}' when 'T01.01' then 'T01.06' when 'T04' then 'T04' else '' end"}, ... ]
-
请求体字段
[ { "field": "FEntity", "label": "明细", "type": "array", "children": [ {"field": "FMaterialId", "label": "物料编码", "type": "string", "value": "{{items.物料编号}}"}, {"field": "FAppQty", "label": "申请数量", "type": "string", "value": "_function ROUND(\"{{items.数量}}\" , 2 )"}, {"field": "FActualQty", "label": "实发数量", "type": "string", "value": "_function ROUND(\"{{items.数量}}\" , 2 )"}, ... ] } ]
-
其他请求参数
[ {"field":"FormId","label":"业务对象表单Id","type":"string","value":"PRD_PickMtrl"}, {"field":"Operation","label":"执行的操作","type":"string","value":"BatchSave"}, {"field":"IsAutoSubmitAndAudit","label":"提交并审核","type":"bool","value":"true"}, ... ]
数据转换逻辑
-
基础字段映射:将源数据中的字段映射到目标系统所需的字段。例如,将“领料单号”映射到“FBillNo”,将“日期”映射到“FDate”。
-
复杂字段处理:对于需要复杂处理或转换的字段,例如“发料组织”和“生产组织”,我们可以使用条件表达式进行转换。
{ ..., { field: 'FStockOrgId', label: '发料组织', type: 'string', value: '_function case \'{{供应组织}}\' when \'T01.01\' then \'T01.06\' when \'T04\' then \'T04\' else \'\' end' }, ... }
-
数组和子对象处理:对于包含子对象或数组的数据,例如物料明细,需要在主对象中嵌套子对象。
{ field: 'FEntity', label: '明细', type: 'array', children: [ { field: 'FMaterialId', label: '物料编码', type: 'string', value: '{{items.物料编号}}' }, { field: 'FAppQty', label: '申请数量', type: 'string', value: '_function ROUND("{{items.数量}}" , 2 )' }, ... ] }
-
函数和查找操作:对于需要进行计算或查找的字段,可以使用内置函数或查找操作。例如,将数量四舍五入保留两位小数。
{ field: 'FAppQty', label: '申请数量', type: 'string', value: '_function ROUND("{{items.数量}}" , 2 )' }
最终请求示例
根据上述配置和逻辑,最终生成的请求示例如下:
{
api: 'batchSave',
method: 'POST',
number: '{{领料单号}}',
idCheck: true,
requestBody:
{
FormId: 'PRD_PickMtrl',
Operation: 'BatchSave',
IsAutoSubmitAndAudit:true,
ValidateFlag:true,
FBillNo:'{{领料单号}}',
FBillType:'SCLLD01_SYS',
FDate:'{{日期}}',
FStockOrgId:'_function case \'{{供应组织}}\' when \'T01.01\' then \'T01.06\' when \'T04\' then \'T04\' else \'\' end',
FPrdOrgId:'_function case \'{{供应组织}}\' when \'T01.01\' then \'T01.06\' when \'T04\' then \'T04\' else \'\' end',
FMOBillNO1:'{{生产订单号}}',
FMaterialID1:'{{成品编号}}',
FEntity:[
{
FMaterialId:'{{items.物料编号}}',
FAppQty:'_function ROUND("{{items.数量}}" , 2 )',
FActualQty:'_function ROUND("{{items.数量}}" , 2 )'
...
}
]
}
}
通过以上步骤,我们实现了从源系统提取数据,并通过轻易云数据集成平台进行ETL处理,最终成功将数据写入金蝶云星空API接口。这一过程充分展示了轻易云数据集成平台在多系统异构环境下的数据无缝对接能力。