案例分享:销售退货单-金蝶云星空数据集成到MySQL
在系统集成过程中,如何高效地将金蝶云星空的数据可靠地集成到MySQL数据库是个技术性很强的话题。本文将重点介绍一个具体的实施方案,即“销售退货单 - 金蝶=>帆软数据库”的每日执行任务。
为了确保数据不会遗漏,我们主要采用了金蝶云星空的executeBillQuery接口进行定时数据抓取,通过轻易云平台实现批量数据传输和清洗,并最终由MySQL的execute接口完成快速写入。这一过程中,实现了以下几个关键功能:
-
分页与限流处理:由于API接口对每次查询的数据量有限制,我们通过自定义分页逻辑分批获取,并设置合理的请求间隔避免触发限流机制。
-
高吞吐量写入:借助轻易云平台,高效支撑大量销售退货单数据快速并行写入MySQL,以确保实时业务分析需求。
-
异常处理与重试机制:在面对网络波动或接口返回错误时,设计了一套完善的重试及告警机制,确保问题被及时发现和修复,不影响整体数据同步任务。
-
格式差异转换:针对金蝶云星空和MySQL的数据格式差异,通过可视化工具构建了自定义的数据转换规则,使得多源异构结构统一化管理更加直观、简便。
-
实时监控及日志记录:利用集中式监控系统,对整个流程中的每个环节进行全程跟踪;通过详细日志记录,为后续问题排查提供有效依据,提高运维效率。
接下来,将详细探讨该方案中各技术要点的具体实现过程,包括调用API的方法、分页策略、异常处理代码示例等。
调用源系统金蝶云星空接口executeBillQuery获取并加工数据
在数据集成的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,通过调用金蝶云星空的executeBillQuery
接口,获取销售退货单数据并进行初步加工。
接口配置与调用
首先,我们需要配置调用金蝶云星空接口的元数据。以下是关键的元数据配置:
{
"api": "executeBillQuery",
"effect": "QUERY",
"method": "POST",
"number": "FBillNo",
"id": "FEntity_FENTRYID",
"name": "FBillNo",
"idCheck": true,
"request": [
{"field":"FDocumentStatus","label":"单据状态","type":"string","describe":"单据状态","value":"FDocumentStatus"},
{"field":"FChageCondition","label":"收款条件","type":"string","describe":"收款条件","value":"FChageCondition.FName"},
{"field":"FBillTaxAmount_LC","label":"税额(本位币)","type":"string","describe":"税额(本位币)","value":"FBillTaxAmount_LC"},
{"field":"FStockOrgId_FName","label":"库存组织名称","type":"string","describe":"库存组织","value":"FStockOrgId.FName"},
{"field":"FSaleOrgId_FNumber","label":"销售组织编码","type":"string","describe":"销售组织","value":"FSaleOrgId.FNumber"},
{"field":"F_ora_Date","label":"源单日期","type":"string","describe":"源单日期","value":"F_ora_Date"},
{"field":"FRetcustId_FName","label":"退货客户名称","type":"string","describe":"退货客户","value":"FRetcustId.FName"},
{"field":"FRealQty","label":"实退数量","type":"string","describe":"实退数量","value":"FRealQty"},
{"field":"FMaterialId_FNumber","label":"物料编码","type":"string","describe":"物料编码","value":"FMaterialId.FNumber"},
{"field": "FCostPrice", "label": "成本价(本位币)", "type": "string", "describe": "成本价(本位币)", "value": "FCostPrice"}
],
...
}
请求参数设置
在请求参数中,我们需要特别注意以下几个字段:
FormId
: 设置为业务对象表单ID,例如"SAL_RETURNSTOCK"
。FieldKeys
: 包含需查询的字段key集合,这些字段将通过API返回。FilterString
: 用于过滤条件,例如"FCreateDate>='{{LAST_SYNC_TIME|datetime}}' and FCreateDate<='{{CURRENT_TIME|datetime}}'"
,确保只获取指定时间范围内的数据。StartRow
和Limit
: 控制分页查询,避免一次性获取过多数据。
示例请求体如下:
{
"FormId": "SAL_RETURNSTOCK",
"FieldKeys": ["FBillNo", "FDocumentStatus", ...].join(","),
"FilterString": "FCreateDate>='2023-01-01' and FCreateDate<='2023-12-31'",
"StartRow": 0,
"Limit": 500
}
数据清洗与转换
在获取到原始数据后,需要对其进行清洗和转换,以便后续处理和存储。以下是几个常见的数据清洗步骤:
- 字段映射:将API返回的字段映射到目标数据库的字段。例如,将
FBillNo
映射为bill_no
。 - 数据类型转换:确保每个字段的数据类型符合目标数据库的要求。例如,将字符串类型的日期转换为标准日期格式。
- 去重处理:根据主键或唯一标识符去重,避免重复记录。
示例代码片段:
def clean_data(raw_data):
cleaned_data = []
for record in raw_data:
cleaned_record = {
'bill_no': record['FBillNo'],
'document_status': record['FDocumentStatus'],
'charge_condition': record['FChageCondition'],
'tax_amount_lc': float(record['FBillTaxAmount_LC']),
'stock_org_name': record['FStockOrgId_FName'],
...
}
cleaned_data.append(cleaned_record)
return cleaned_data
数据写入
最后,将清洗后的数据写入目标数据库。在轻易云平台上,可以通过配置相应的数据写入任务来实现这一过程。确保在写入前进行必要的数据校验,以保证数据的一致性和完整性。
示例SQL插入语句:
INSERT INTO sales_return (bill_no, document_status, charge_condition, tax_amount_lc, stock_org_name, ...)
VALUES (%s, %s, %s, %s, %s, ...)
通过上述步骤,我们实现了从金蝶云星空接口获取销售退货单数据,并进行了初步的数据清洗和转换,为后续的数据处理和分析打下了坚实基础。
数据集成与ETL转换:销售退货单金蝶到帆软数据库
在数据集成的生命周期中,数据转换与写入是关键的一步。本文将深入探讨如何将已经集成的源平台数据进行ETL转换,并转为目标平台MySQL API接口所能接收的格式,最终写入目标平台。
元数据配置解析
元数据配置是实现数据转换与写入的核心。以下是一个详细的元数据配置示例:
{
"api": "execute",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{
"field": "main_params",
"label": "主参数",
"type": "object",
"describe": "主参数",
"children": [
{"field":"FAllAmount_LC","label":"价税合计(本位币)","type":"float","describe":"价税合计(本位币)","value":"{FAllAmount_LC}*-1"},
{"field":"FCorrespondOrgId_FNumber","label":"对应组织编码","type":"string","describe":"对应组织编码","value":"{FCorrespondOrgId_FNumber}"},
{"field":"FSalesManId_FNumber","label":"销售员编码","type":"string","describe":"销售员编码","value":"{FSalesManId_FNumber}"},
{"field":"FTaxPrice","label":"含税单价","type":"float","describe":"含税单价","value":"{FTaxPrice}"},
{"field":"FBillAllAmount","label":"价税合计","type":"float","describe":"价税合计","value":"'function {exchangeRate}'*'{FBillAllAmount_LC}'*-1"},
{"field":"FBillTaxAmount","label":"税额","type":"float","describe":"税额","value":"'function {exchangeRate}'*{FBillTaxAmount_LC}*-1"},
{"field":"FMustqty","label":"应退数量","type":"int","describe":"应退数量","value":"{FMustqty}*-1"},
{"field":"F_ora_Date","label":"源单日期","type":"string","describe":"源单日期","value":"'{{F_ora_Date|date}}'"},
{"field":"FAmount_LC",...}
]
}
],
"otherRequest": [
{
"field": "main_sql",
"label": "主语句",
"type": "string",
"describe": "主语句",
"value": "...SQL语句..."
}
],
"buildModel": true
}
数据请求与清洗
在ETL流程中,首先需要从源系统请求数据并进行清洗。元数据配置中的request
部分定义了每个字段的映射关系和转换规则。例如:
FAllAmount_LC
的值通过{FAllAmount_LC}*-1
转换为负数。FBillAllAmount
的值通过_function '{exchangeRate}'*'{FBillAllAmount_LC}'*-1
应用汇率转换并取负数。
这些规则确保了源系统的数据能够正确地映射到目标系统所需的格式。
数据转换与写入
在完成数据清洗后,需要将数据转换为目标系统所能接收的格式,并通过API接口写入目标系统。元数据配置中的 otherRequest
部分定义了SQL插入语句:
INSERT INTO sale_refund_test (
FID, FBillNo, FDocumentStatus, FSaleOrgId_FNumber, FSaleOrgId_FName,
FDate, FStockOrgId_FNumber, FStockOrgId_FName, FRetcustId_FNumber,
FRetcustId_FName, ...
) VALUES (
:FID, :FBillNo, :FDocumentStatus, :FSaleOrgId_FNumber, :FSaleOrgId_FName,
:FDate, :FStockOrgId_FNumber, :FStockOrgId_FName, :FRetcustId_FNumber,
:FRetcustId_FName, ...
);
该SQL语句使用占位符 :
来表示参数,这些参数将由前面定义的字段值填充。
API接口调用
通过API接口调用,将处理后的数据发送到目标平台。元数据配置中的 api
, method
, 和 effect
定义了API调用的具体细节:
api
: 接口名称,例如"execute"
.method
: HTTP方法,例如"POST"
.effect
: 操作类型,例如"EXECUTE"
.
这些设置确保了API调用能够正确执行,将处理后的数据写入MySQL数据库。
实际案例应用
假设我们需要每天将销售退货单从金蝶系统集成到帆软数据库,我们可以按照上述步骤配置元数据,并通过轻易云平台实现全自动化的数据处理和传输。这不仅提高了效率,还确保了数据的一致性和准确性。
通过这种方式,我们能够高效地完成复杂的数据集成任务,实现不同系统间的数据无缝对接。