金蝶云星空数据集成到黑湖小工单的技术案例分享
在实际企业生产过程中,如何高效地实现金蝶云星空生产订单的数据同步到黑湖小工单,是一个普遍且重要的需求。通过轻易云数据集成平台,我们成功配置并运行了“4金蝶生产订单下推到黑湖小工单 生产订单”方案,实现了这一复杂的数据对接任务。
具体来说,我们利用金蝶云星空提供的executeBillQuery
API接口进行数据抓取,并将获取的大量生产订单信息快速写入到黑湖小工单系统中的/api/dytin/external/project/create
接口。同时,为确保整个过程的数据质量和处理效率,以下几个关键技术点尤为重要:
-
高吞吐量的数据写入能力:面对大量的生产订单数据,通过优化网络带宽和连接池设置,使得所有抓取的数据能够迅速而准确地传输至目标系统。
-
实时监控与告警机制:借助集中的监控系统,持续跟踪每个API调用以及批量处理任务的状态,及时捕捉异常并触发告警,有效保证了整体流程的平稳运行。
-
分页与限流策略:由于金蝶云星空API存在分页和限流限制,从而需依赖自定义逻辑分批拉取数据,并合理规划请求频率,以避免超负荷问题。
-
数据格式转换与映射:考虑到两个系统间存在显著的数据结构差异,在ETL(抽取-转换-加载)过程中,通过编写定制化脚本,对各字段进行了全面映射及调整,从而确保业务语义一致性。
-
错误重试机制:针对可能出现的网络抖动或其他意外情况,在设计中添加了自动重试逻辑,从根本上提升了接口调用稳定性和可靠性。
整个方案不仅解决了多源异构系统间的信息孤岛问题,同时也大幅度提高了业务操作透明度和管理效率。在后续部分,我们将详细探讨该方案实施过程中的具体配置步骤及技术细节。
调用金蝶云星空接口executeBillQuery获取并加工数据
在轻易云数据集成平台的生命周期中,调用源系统接口获取数据是至关重要的一步。本文将深入探讨如何通过调用金蝶云星空的executeBillQuery
接口,获取生产订单数据并进行初步加工。
接口调用配置
首先,我们需要配置调用executeBillQuery
接口的相关参数。根据提供的元数据配置,我们可以看到以下关键字段和参数:
- API:
executeBillQuery
- Method:
POST
- FormId:
PRD_MO
(业务对象表单Id) - FieldKeys: 需查询的字段key集合
- FilterString: 过滤条件
- Pagination: 分页参数,包括
Limit
和StartRow
请求参数构建
为了确保请求能够正确执行,我们需要构建一个完整的请求体。以下是一个示例请求体:
{
"FormId": "PRD_MO",
"FieldKeys": "FID,FBillNo,FTreeEntity_FEntryId,FTreeEntity_Fseq,FCREATORID.FName,FAPPROVERID.FName,FCREATEDATE,FMATERIALID.FName,FAPPROVEDATE,FMATERIALID.FDescription,FWorkShopID.FName,FQty,FPlanStartDate,FPlanFinishDate,FSaleOrderNo,FStartDate,FFinishDate,FStatus,FMemoItem,FMATERIALID.FNumber,F_aaaa_Combo,FSaleOrderEntryId,FSrcBillType,FSrcBillNo,FSrcBillEntrySeq,FSaleOrderEntrySeq",
"FilterString": "FConveyDate>='{{LAST_SYNC_TIME|dateTime}}' and FStatus in(3,4) and F_aaaa_Combo<>''",
"Limit": 500,
"StartRow": 0
}
数据请求与清洗
在发送请求后,系统会返回包含生产订单信息的数据集。此时,我们需要对数据进行初步清洗和加工,以便后续的数据转换与写入操作。
数据清洗步骤
- 字段映射与转换:根据元数据配置中的字段映射,将返回的数据字段转换为目标系统所需的格式。例如,将
FCREATORID.FName
映射为创建人名称。 - 数据过滤:根据业务需求,进一步过滤不符合条件的数据。例如,只保留状态为“开工”和“完工”的订单。
- 异常处理:处理可能出现的数据异常,如空值、格式错误等。
以下是一个示例代码片段,用于清洗返回的数据:
def clean_data(raw_data):
cleaned_data = []
for record in raw_data:
if record['FStatus'] in [3, 4] and record['F_aaaa_Combo']:
cleaned_record = {
'实体主键': record['FID'],
'单据编号': record['FBillNo'],
'创建人': record['FCREATORID.FName'],
'审核人': record['FAPPROVERID.FName'],
'创建日期': record['FCREATEDATE'],
'物料客户编码': record['FMATERIALID.FName'],
'审核日期': record['FAPPROVEDATE'],
'物料规格型号': record['FMATERIALID.FDescription'],
'生产车间': record['FWorkShopID.FName'],
'数量': record['FQty'],
'计划开工时间': record['FPlanStartDate'],
'计划完工时间': record['FPlanFinishDate'],
'需求订单号': record['FSaleOrderNo'],
'开工时间': record['FStartDate'],
'完工日期': record['FFinishDate'],
'业务状态': record['FStatus'],
'备注': record['FMemoItem']
}
cleaned_data.append(cleaned_record)
return cleaned_data
数据分页处理
由于金蝶云星空接口支持分页查询,因此我们需要实现分页处理逻辑,以确保能够获取所有符合条件的数据。每次请求时,通过调整StartRow
参数来实现分页。
def fetch_all_data():
all_data = []
start_row = 0
while True:
response = execute_bill_query(start_row)
data = response.get('Data', [])
if not data:
break
all_data.extend(data)
start_row += len(data)
return clean_data(all_data)
def execute_bill_query(start_row):
request_body = {
"FormId": "PRD_MO",
"FieldKeys": "FID,...", # 简化显示
"FilterString": "...", # 简化显示
"Limit": 500,
"StartRow": start_row
}
response = requests.post(api_url, json=request_body)
return response.json()
通过上述步骤,我们可以高效地从金蝶云星空系统中获取并清洗生产订单数据,为后续的数据转换与写入打下坚实基础。
轻易云数据集成平台:ETL转换与黑湖小工单API接口集成技术案例
在数据集成生命周期的第二步,我们需要将已经从源平台(金蝶生产订单)获取的数据进行ETL转换,并转为目标平台(黑湖小工单API接口)所能接收的格式,最终写入目标平台。本文将深入探讨这一过程中的关键技术和配置细节。
API接口元数据配置解析
以下是用于将金蝶生产订单数据转换并写入黑湖小工单的API接口元数据配置:
{
"api": "/api/dytin/external/project/create",
"effect": "EXECUTE",
"method": "POST",
"idCheck": true,
"request": [
{
"field": "projectCode",
"label": "工单编号",
"type": "string",
"value": "_function case when '{FSrcBillEntrySeq}'='1' then '{FSaleOrderNo}' when '{FSrcBillEntrySeq}'='0' then '{FSaleOrderNo}' else '{FSaleOrderNo}_{FSrcBillEntrySeq}' end"
},
{
"field": "productCode",
"label": "产品编号",
"type": "string",
"value": "{FMATERIALID_FNumber}"
},
{
"field": "plannedNum",
"label": "计划数",
"type": "string",
"value": "{FQty}"
},
{
"field": "planStartTime",
"label": "计划开始时间",
"type": "datetime",
"describe":"111",
"value":"_function CAST('{FPlanStartDate}' as DATETIME)"
},
{
"field":"planEndTime",
"label":"计划结束时间",
"type":"datetime",
"describe":"111",
"value":"_function CAST('{FPlanFinishDate}' as DATETIME)"
},
{
"field":"routing",
"label":"工艺路线",
"type":"string",
"value":"{F_aaaa_Combo}"
},
{
"field":"workOrderCustomFieldsValue",
"label":"自定义字段",
"type":"object",
...
数据字段映射与转换逻辑
-
工单编号(projectCode):
- 使用了一个复杂的条件判断逻辑,根据
{FSrcBillEntrySeq}
字段的值来决定如何生成projectCode
。 - 如果
{FSrcBillEntrySeq}
为1或0,则直接使用{FSaleOrderNo}
;否则,使用{FSaleOrderNo}_{FSrcBillEntrySeq}
。
- 使用了一个复杂的条件判断逻辑,根据
-
产品编号(productCode):
- 简单地映射源数据中的
{FMATERIALID_FNumber}
到目标字段。
- 简单地映射源数据中的
-
计划数(plannedNum):
- 直接映射源数据中的
{FQty}
到目标字段。
- 直接映射源数据中的
-
计划开始时间(planStartTime)和计划结束时间(planEndTime):
- 使用了SQL风格的CAST函数将日期字符串转换为DATETIME格式。这确保了日期格式在传输过程中保持一致性。
-
工艺路线(routing):
- 映射源数据中的
{F_aaaa_Combo}
到目标字段。
- 映射源数据中的
-
自定义字段(workOrderCustomFieldsValue):
- 包含两个子字段:客户和业务员。
- 使用了_findCollection函数从特定集合中查找对应的客户名称和业务员名称,这种方式能够动态地从数据库中获取相关信息并填充到自定义字段中。
实际应用案例
在实际应用中,我们需要按照上述配置进行ETL操作,确保所有字段都能正确映射和转换。以下是一个具体的示例:
-
源平台(金蝶生产订单)的原始数据:
{ FSrcBillEntrySeq: '2', FSaleOrderNo: 'SO12345', FMATERIALID_FNumber: 'P001', FQty: '100', FPlanStartDate: '2023-10-01', FPlanFinishDate: '2023-10-10', F_aaaa_Combo: 'RouteA' }
-
转换后的目标平台(黑湖小工单API接口)的请求数据:
{ projectCode: 'SO12345_2', productCode: 'P001', plannedNum: '100', planStartTime: '2023-10-01T00:00:00', planEndTime: '2023-10-10T00:00:00', routing: 'RouteA', workOrderCustomFieldsValue: { 客户: 'CustomerNameFromDB', 业务员: 'SalesmanNameFromDB' } }
通过上述过程,我们成功实现了从金蝶生产订单到黑湖小工单API接口的数据转换与写入。这不仅提高了系统间的数据一致性,还确保了业务流程的高效运作。