ETL与数据写入:实现金蝶云星空API接口数据转换
### MOM-SCTK-生产退库单新增-XSL集成方案分享:MySQL数据如何高效对接金蝶云星空
在本文中,我们将探讨一个实际运行的系统对接案例,展示如何利用轻易云数据集成平台,实现MySQL数据库与金蝶云星空API资产管理功能的无缝连接。此案例特别适用于制造企业中的生产退库业务场景,对提高信息透明度和数据处理效率具有重要参考意义。
#### 一、背景概述
"MOM-SCTK-生产退库单新增-XSL"是我们要讨论的具体集成方案,该方案主要目的是实现从MySQL数据库获取生产退库单的数据,并批量导入到金蝶云星空系统中,确保数据的一致性和实时性。在实施过程中,我们面临了多个技术挑战,包括大量数据的快速写入、接口调用及分页处理、异常监控与重试机制等。
#### 二、核心步骤与关键技术点
1. **定时可靠抓取MySQL接口数据**:
我们通过配置调度任务,从MySQL数据库按设定时间间隔进行select操作,可靠地抓取新产生或更新的数据条目。这一步骤依托于高吞吐量的数据写入能力,使得我们可以处理大规模的数据请求而不漏单。
2. **自定义数据转换逻辑**:
为顺利完成从MySQL到金蝶云星空的映射,需要考虑两者之间的数据格式差异。通过使用可视化的数据流设计工具,可以直观地创建并调整自定义转换逻辑,以满足特定业务需求。例如,将日期格式从YYYY-MM-DD HH:mm:ss 转换为 金蝶标准格式。
3. **批量集成至金蝶云星空**:
集成功能必须支持将大量经过转换和清洗后的记录快速写入到目标系统——金蝶云星空。这里采用batchSave API,通过分段传输来应对大量记录的灌输需求,同时避免因网络波动或接口限制引发的大量失败率。
4. **异常监控与错误重试机制**:
在整个流程中,引入集中式监控和告警系统以追踪每一个任务状态。当检测到任何异常(如网络超时,API响应错误)时,会触发相应的告警通知并自动启动重试机制,以确保最终所有有效数据都被正确传送和存储。
通过这些关键步骤,我们不仅保障了各环节操作透明且可追溯,更显著提升了业务整合效率,为日常运营提供了坚实支撑。在后续内容中,我们会详细解构每个模块及其实现方式。
![用友BIP接口开发配置](https://pic.qeasy.cloud/D26.png~tplv-syqr462i7n-qeasy.image)
### 使用轻易云数据集成平台从MySQL接口获取并加工数据
在数据集成过程中,调用源系统MySQL接口`select`获取并加工数据是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台配置元数据,完成这一过程。
#### 元数据配置解析
在轻易云数据集成平台中,我们使用以下元数据配置来实现从MySQL数据库中获取数据:
```json
{
"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.header_id as sourceid,
CONCAT('MSCTK', DATE_FORMAT(t1.transaction_date, '%Y%m%d'), t1.header_id) as '单据编号',
ifnull((select aft_quiet_time from ty_mes.mt_account_period where t1.transaction_date < aft_quiet_time order by account_period_id desc limit 1), t1.transaction_date) as '单据日期',
t2.attribute2 as '生产订单主键',
t2.attribute3 as '生产订单明细主键',
SUBSTRING_INDEX(t1.wo_number, '_', 1) as '生产订单号',
SUBSTRING_INDEX(t1.wo_number, '_', -1) as '生产订单行号',
ABS(t1.ok_qty) as '退库数量',
t2.material_code as '物料编码',
t3.attribute10 as '生产入库单主键',
t3.attribute9 as '生产入库单号',
ifnull(t4.value, '15040501') as '生产车间',
t2.manufacturing_site_code as '生产组织'
from ty_mes.hme_wo_report_process_itf t1
left join ty_aps.hps_make_order_iface t2 on t1.tenant_id = t2.tenant_id and t1.wo_number = t2.make_order_num
left join ty_mes.hme_wo_report_process_itf t3 on t1.tenant_id = t3.tenant_id and t1.material_lot_code = t3.material_lot_code and t3.iface_sequence = 4 and t3.attribute7 = 'S'
left join hzero_platform.hpfm_lov_value t4 on t2.department = t4.meaning and t4.lov_code = 'TY.KINGDEE.WORKSHOP' and t2.manufacturing_site_code = t4.tag and t4.enabled_flag = 1
where t1.tenant_id = 7
and t1.iface_sequence = 14
and t1.`STATUS` in ('N', 'E')
limit :limit offset :offset
```
该SQL语句通过多表连接和子查询,从多个表中提取所需的数据字段,并通过`LIMIT`和`OFFSET`子句进行分页处理。
为了确保动态字段与请求参数一一对应,我们采用参数绑定的方法,将请求参数值与占位符进行绑定。例如:
```sql
limit ? offset ?
```
在执行查询之前,通过代码将具体的分页参数值绑定到上述占位符上。
#### 请求参数配置
请求参数配置如下:
```json
{
...
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}
}
]
}
],
...
}
```
通过这种方式,我们能够灵活地控制每次请求的数据量,并确保分页处理的一致性。
#### 数据获取与加工流程
在实际操作中,通过轻易云平台,我们可以按照以下步骤实现从MySQL数据库获取并加工数据:
1. **配置元数据**:根据上述元数据配置定义API接口和请求参数。
2. **发送请求**:通过POST方法向MySQL数据库发送带有分页参数(如`limit`和`offset`)的SQL查询请求。
3. **处理响应**:接收并处理数据库返回的数据,根据业务需求进行进一步加工,如格式转换、字段映射等。
4. **写入目标系统**:将加工后的数据写入目标系统或存储。
通过以上步骤,我们可以高效地实现跨系统的数据集成,并确保每个环节的数据准确性和一致性。在实际应用中,这种方法能够极大提升业务流程自动化程度和运行效率。
![金蝶与MES系统接口开发配置](https://pic.qeasy.cloud/S12.png~tplv-syqr462i7n-qeasy.image)
### 利用轻易云数据集成平台实现金蝶云星空API接口的数据转换与写入
在数据集成的生命周期中,ETL(Extract, Transform, Load)转换是至关重要的一步。本文将重点探讨如何利用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并转为金蝶云星空API接口所能够接收的格式,最终写入目标平台。
#### 数据请求与清洗
在开始数据转换之前,首先需要从源系统中获取并清洗数据。假设我们已经完成了这一步,现在我们将重点放在如何配置和使用元数据,将清洗后的数据转换为金蝶云星空API接口所需的格式。
#### 数据转换与写入
根据提供的元数据配置,我们需要将生产退库单新增的数据通过`batchSave` API接口写入到金蝶云星空系统。以下是具体的配置和实现步骤:
1. **API接口基本信息配置**
- `api`: "batchSave"
- `method`: "POST"
- `effect`: "EXECUTE"
2. **请求参数配置**
请求参数主要包括单据编号、生产组织、单据类型、退库组织等字段。这些字段需要从源系统中获取并进行相应的转换。以下是关键字段及其解析方式:
```json
[
{"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{{单据编号}}"},
{"field":"FPrdOrgId","label":"生产组织","type":"string","describe":"生产组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{生产组织}}"},
{"field":"FBillType","label":"单据类型","type":"string","describe":"单据类型\n生产退库:SCTK01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"SCTK01_SYS"},
{"field":"FStockOrgId","label":"退库组织","type":"string","describe":"退库组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{{生产组织}}"},
{"field":"FOwnerTypeId0","label":"货主类型","type":"string","describe":"货主类型\nBD_OwnerOrg:业务组织\nBD_Customer:客户","value":"BD_OwnerOrg"},
{"field":"FOwnerId0","label":"货主","type": "string", "describe": "货主", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}},
{"field": "FDate", "label": "日期", "type": "string", "describe": "日期", "value": "{{单据日期}}"}
]
```
3. **明细字段配置**
明细字段包括物料编码、应退数量、实退数量等,这些字段同样需要从源系统中获取并进行相应的转换。以下是明细字段及其解析方式:
```json
[
{"field": "FSrcEntryId", "label": "源单分录内码", "type": "string", "describe": "源单分录内码-此字段需要使用查询方案去查询源单的分录内码",
"value": "_findCollection find FEntity_FEntryID from 9c6ff354-5653-3493-be46-c9b418f8d198 where FID={{生产入库单主键}}"},
{"field": "FMaterialId", "label": "物料编码",
"type": "string",
"describe": "物料编码",
"parser":{"name": "ConvertObjectParser",
"params": "FNumber"},
"value": "{{物料编码}}"},
{"field": "FMustQty",
"label": "应退数量",
"type": "string",
"describe":
"应退数量",
"value":
"{{退库数量}}"}
]
```
4. **其他请求参数**
除了上述关键字段外,还需要配置一些其他参数,如表单ID、执行操作等:
```json
[
{"field": "FormId",
"label":
"业务对象表单Id",
"type":
"string",
"describe":
"必须填写金蝶的表单ID如:PUR_PurchaseOrder",
"value":
"PRD_RetStock"},
{"field":
"Operation",
"label":
"执行的操作",
"type":
"string",
"describe":
"执行的操作",
"value":
BatchSave"},
{"field":
IsAutoSubmitAndAudit,
label:
提交并审核,
type:
bool,
describe:
提交并审核,
value:
true},
{ field: IsVerifyBaseDataField, label: 验证基础资料, type: bool, describe: 是否验证所有的基础资料有效性,布尔类,默认false(非必录), value: true}
]
```
5. **执行数据写入**
最后,通过调用`batchSave` API接口,将转换后的数据提交到金蝶云星空系统。确保所有必填字段都已正确映射和解析,以避免提交失败或数据错误。
#### 总结
通过以上步骤,我们可以利用轻易云数据集成平台,实现对源平台数据的ETL转换,并成功将其写入到金蝶云星空API接口。这不仅提高了数据处理效率,还确保了不同系统间的数据一致性和准确性。在实际应用中,可以根据具体需求调整和优化元数据配置,以满足更多复杂场景下的数据集成需求。
![企业微信与OA系统接口开发配置](https://pic.qeasy.cloud/T2.png~tplv-syqr462i7n-qeasy.image)