吉客云·奇门数据集成到用友BIP的技术案例分享
本篇文章将详细剖析一个实际运行的系统对接集成方案:2C线上-吉客云-销售单-YS-销售订单-合并-非京东。本次集成任务的主要目标是实现吉客云·奇门数据无缝对接到用友BIP,并确保整个数据处理过程高效、可靠和精准。
1. 接口调用与数据获取
首先,利用吉客云·奇门提供的数据接口 jackyun.tradenotsensitiveinfos.list.get
来获取所需的销售订单信息。为了保证及时、高效地抓取这些接口数据,我们需要设置定时任务,周期性地请求接口。考虑到吉客云·奇门API可能存在分页和限流问题,我们在设计过程中需要格外注意这两点,以确保不会遗漏任何一笔订单。这一步骤中的核心技术要点包括:
- 分页处理:通过分析返回结果中的分页参数,循环处理每一页的数据直到所有订单都被完整抓取。
- 限流控制:应用速率限制机制,如设置合理的请求间隔时间,以避免触发API访问频率限制或被封禁。
2. 数据转换与格式适配
由于吉客云·奇门和用友BIP之间的数据格式有所不同,在将数据写入用友BIP之前,需要进行必要的数据转换。这部分工作可以通过自定义数据转换逻辑来实现,并且对于复杂的数据结构变化,可以借助轻易云平台提供的可视化数据流设计工具进行直观配置,实现灵活而精准的数据映射。
在这个环节中, 我们关注以下几项关键技术细节:
- 字段匹配与映射:将从吉客云·奇门获取到的数据字段逐一对应至用友BIP要求的字段上。
- 自定义转化逻辑:针对特定业务需求编写适应性的脚本或逻辑规则,确保各类特殊情况也能正确处理,如日期格式转换、数值单位变换等。
3. 数据批量写入与监控优化
最后,将经过加工整理后的订单信息通过 yonbip/sd/voucherorder/singleSave
API 写入到用友BIP系统。在这一过程中,为了提高大规模数据操作效率,我们采用批量写入策略,同时使用集中监控和告警系统实时跟踪任务状态及性能表现。如果遇到异常情况,则会启动错误重试机制以保障最终一致性。这些步骤包含:
- 批量写入优化:整合多条记录为一个大包裹传输以减少网络开
调用吉客云·奇门接口jackyun.tradenotsensitiveinfos.list.get获取并加工数据
在数据集成的生命周期中,第一步是从源系统获取数据。本文将详细探讨如何通过轻易云数据集成平台调用吉客云·奇门接口jackyun.tradenotsensitiveinfos.list.get
来获取销售订单数据,并进行初步加工。
接口配置与请求参数
为了实现对吉客云·奇门接口的调用,我们需要配置元数据,包括API名称、请求方法、分页信息以及具体的请求字段。以下是相关配置:
{
"api": "jackyun.tradenotsensitiveinfos.list.get",
"method": "POST",
"number": "tradeNo",
"id": "tradeId",
"pagination": {
"pageSize": 20
},
"idCheck": true,
"request": [
{"field":"modified_begin","label":"起始时间","type":"string","describe":"修改起始时间,和结束时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空"},
{"field":"modified_end","label":"结束时间","type":"string","describe":"修改结束时间,和起始时间必须同时存在,时间间隔不能超过七天,与线上单号不能同时为空"},
{"field":"startModified","label":"最后修改时间(起始)","type":"string"},
{"field":"endModified","label":"最后修改时间(截止)","type":"string"},
{"field":"tradeNo","label":"销售单号,多个用半角逗号分隔","type":"string"},
{"field":"pageSize","label":"每页记录数,默认50,最大1000","type":"string","value":"50"},
{"field":"pageIndex","label":"页码,0为第1页","type":"string"},
{"field":"hasTotal","label":"默认返回,首次调用时可以传1获取总记录数","type":"string","value":"1"},
{"field":"startCreated","label":"创建时间(起始)","type":"string"},
{"field":"endCreated","label":"创建时间(截止)","type":"string"},
{"field":"startAuditTime","label":"审核时间(起始)","type":"string"},
{"field":"endAuditTime","label":"审核时间(截止)","type":"string"},
{"field":"startConsignTime","label":"发货时间(起始)","type":"string", "value": "{{LAST_SYNC_TIME|datetime}}"},
{"field":"endConsignTime","label":"发货时间(截止)", "type": "string", "value": "{{CURRENT_TIME|datetime}}"},
{"field": "tradeStatus", "label": "订单状态", "type": "string" },
{"field": "tradeType", "label": "订单类型", "type": "string", "value": "1,7" },
// ...其他字段省略
],
// ...其他配置省略
}
数据请求与清洗
在实际操作中,我们需要根据业务需求设置具体的请求参数。例如,通过设置modified_begin
和modified_end
来限定查询的时间范围,并确保这两个字段同时存在且间隔不超过七天。
{
"modified_begin": "2023-10-01T00:00:00Z",
"modified_end": "2023-10-07T23:59:59Z",
// ...其他参数
}
通过这种方式,我们可以获取指定时间段内的销售订单数据。在接收到响应后,需要对数据进行初步清洗。例如,将日期格式统一转换为标准格式:
{
// 原始响应数据
{
...
"consignTime": "2023-10-05T14:30:00Z",
...
}
}
// 转换后的数据
{
...
"consigndate": "2023-10-05",
...
}
数据转换与写入
在完成初步清洗后,我们可以进一步对数据进行转换,以便后续处理和写入目标系统。例如,可以根据业务逻辑对某些字段进行计算或合并。
{
// 原始数据
{
...
"goodsDetail.sellCount": 10,
...
}
// 转换后的数据
{
...
"totalSellCount": goodsDetail.reduce((acc, item) => acc + item.sellCount, 0),
...
}
异常处理与补偿机制
在实际的数据集成过程中,不可避免地会遇到各种异常情况。轻易云平台提供了自动补偿机制,通过定时任务(crontab)来确保遗漏的数据能够被及时补充。
{
// 补偿机制配置
{
...
omissionRemedy: {
crontab: '20 */2 * * *',
takeOverRequest: [
{ field: 'startConsignTime', value: '{{HOURE_AGO_5|datetime}}', type: 'string' },
{ field: 'endConsignTime', value: '{{HOURE_AGO_2|datetime}}', type: 'string' }
]
}
}
}
通过上述配置,可以每两小时检查一次过去五小时到两小时之间的数据是否有遗漏,并进行补偿性的数据拉取。
条件过滤与响应格式化
为了确保最终写入的数据符合业务需求,可以在元数据中设置条件过滤和响应格式化规则。例如,仅保留订单状态大于等于6000且店铺代码不在特定列表中的记录:
{
condition: [
{ field: 'tradeStatus', logic: 'egt', value: '6000' },
{ field: 'shopCode', logic: 'notin', value: 'NBKH,ZYDP,BJKH,TYKH,HWKH,HYKH,XSKH,XXKH,CTQD0001,BJKH0019' }
],
formatResponse:[
{ old:'consignTime', new:'consigndate', format:'date' }
]
}
通过上述技术手段,可以高效地从吉客云·奇门接口获取并加工销售订单数据,为后续的数据处理和分析奠定坚实基础。
轻易云数据集成平台:将源数据转换并写入用友BIP
在数据集成的生命周期中,ETL(Extract, Transform, Load)转换是一个关键步骤。本文将详细探讨如何使用轻易云数据集成平台,将已经集成的源平台数据进行ETL转换,并最终通过用友BIP API接口写入目标平台。
数据请求与清洗
首先,从源系统获取销售订单数据,并进行必要的清洗和预处理。这一步骤确保数据的准确性和一致性,为后续的转换和写入打下基础。
数据转换与写入
接下来,我们进入数据转换阶段,将清洗后的数据转化为用友BIP API接口所能接受的格式,并通过API写入目标平台。以下是具体实现步骤:
-
API配置
根据元数据配置,目标API为
/yonbip/sd/voucherorder/singleSave
,请求方法为POST
。我们需要确保请求的幂等性,通过字段resubmitCheckKey
来保证每次请求都是唯一的。 -
头部信息映射
salesOrgId
: 销售组织,映射到源数据中的shopCode
。transactionTypeId
: 交易类型,固定值为J01
。bizFlow
: 流程ID,固定值为35f60e0d-3ad8-459d-b3bb-52a997334a37
。vouchdate
: 单据日期,格式为yyyy-MM-dd HH:mm:ss
,从源数据中的consigndate
提取。code
: 单据编码,由系统规则生成,例如:XSDD{consigndate}{shopCode}-1
。
-
子表信息映射
子表字段主要包括商品信息、仓库信息、数量、金额等。以下是一些关键字段及其映射关系:
stockId
: 仓库ID,从源数据中的warehouseCode
提取。productId
: 商品ID,从源数据中的goodsDetail_goodsNo
提取。qty
: 数量,从源数据中的goodsDetail_sellCount
提取。oriSum
: 含税金额,通过函数计算得到,例如:_function abs(round({{goodsDetail_shareFavourableAfterFee}},2))
-
计算字段
对于需要计算的字段,例如本币无税金额、本币含税单价等,可以使用函数进行计算。例如:
{ "field": "orderDetailPrices!natUnitPrice", "label": "本币无税单价", "type": "string", "describe": "本币无税单价", "value": "_function case '{goodsDetail_goodsNo}' when 'X0001' then abs(round(({{goodsDetail_shareFavourableAfterFee}}/{goodsDetail_sellCount})/(1+0.06),2)) else abs(round(({{goodsDetail_shareFavourableAfterFee}}/{goodsDetail_sellCount})/(1+0.13),2)) end" }
-
请求体构建
最终,将所有映射后的字段和计算结果组装成API请求体。例如:
{ "resubmitCheckKey": "{consigndate}{shopCode}3", "salesOrgId": "{shopCode}", "transactionTypeId": "J01", "bizFlow": "35f60e0d-3ad8-459d-b3bb-52a997334a37", ... "orderDetails": [ { "stockId": "{warehouseCode}", "productId": "{goodsDetail_goodsNo}", ... "oriSum": "_function abs(round({{goodsDetail_shareFavourableAfterFee}},2))" } ] }
-
发送请求
使用HTTP客户端(如Postman或编程语言内置库)发送POST请求,将构建好的JSON对象作为请求体传递给用友BIP API。
实时监控与日志记录
在整个过程中,通过轻易云平台提供的实时监控功能,可以随时查看数据流动和处理状态,确保每个环节都透明可控。同时,记录详细日志以便于问题排查和性能优化。
通过上述步骤,我们成功地将源平台的数据经过ETL转换后,通过用友BIP API接口写入目标平台,实现了不同系统间的数据无缝对接。