使用轻易云平台实现吉客云与金蝶云系统的ETL转换

  • 轻易云集成顾问-黄宏棵
### (吉客云奇门->金蝶)(线下)销售退货单->销售退货单_无批号_的真正的 在数据集成领域,通过高效、安全地对接不同系统的数据流动,能够大幅提升业务操作的顺畅度和准确性。本案例将重点探讨如何通过技术手段,将吉客云·奇门平台的数据成功集成到金蝶云星空系统,以实现线上与线下销售退货单据的实时同步处理。 为了确保集成过程无缝衔接,我们首先需要解决吉客云·奇门接口“jackyun.tradenotsensitiveinfos.list.get”数据抓取的问题。该接口提供了订单信息,但由于分页和限流机制,需要设计合理的策略以避免数据遗漏。例如,可以通过配置定时任务自动执行API调用,同时监控每次调用返回的数据情况,并记录日志便于后续排查异常。 在获取了完整且有效的数据后,下一步是将这些数据快速写入到金蝶云星空中。针对此需求,我们采用了金蝶云星空提供的“batchSave”接口,其支持批量写入,大幅提高了处理效率。然而,两个系统之间存在一定的数据格式差异,这就要求我们在中间转换层进行精细化的数据映射和转换。依托自定义脚本或ETL工具,可针对特定字段进行格式调整,以确保数据类型、结构的一致性。 面对大量并发操作及潜在错误,还需建立健壮的异常处理与重试机制。如果某次写入操作失败,可以立即触发预设的重试流程,并通过监控警报通知管理员,从而尽可能减少因系统问题导致的数据丢失或不同步现象。此外,为保证整个流程透明度及可追溯性,我们实现了实时监控及详细日志记录功能,一旦发生任何环节出错,都能迅速定位并解决问题。 综上,通过以上关键技术点实施,有效地实现了吉客云·奇门与金蝶云星空之间精准而高效的数据对接,为企业管理带来了显著收益。在未来部分,本案例将进一步详述具体实施步骤、核心代码示例以及优化经验分享等内容。 ![系统集成平台API接口配置](https://pic.qeasy.cloud/D30.png~tplv-syqr462i7n-qeasy.image) ### 调用吉客云·奇门接口jackyun.tradenotsensitiveinfos.list.get获取并加工数据 在数据集成生命周期的第一步中,调用源系统的API接口获取数据是至关重要的。本文将详细探讨如何通过轻易云数据集成平台调用吉客云·奇门接口`jackyun.tradenotsensitiveinfos.list.get`,并对获取的数据进行初步加工。 #### 接口配置与调用 首先,我们需要配置API接口的元数据,以便正确地请求和处理数据。以下是元数据配置的关键部分: ```json { "api": "jackyun.tradenotsensitiveinfos.list.get", "effect": "QUERY", "method": "POST", "number": "tradeNo", "id": "tradeNo", "idCheck": true, "request": [ {"field": "startModified", "label": "startModified", "type": "string", "value": "{{LAST_SYNC_TIME|datetime}}"}, {"field": "endModified", "label": "endModified", "type": "string", "value": "{{CURRENT_TIME|datetime}}"}, {"field": "pageSize", "label": "pageSize", "type": "string", "describe":"111", "value":"{PAGINATION_PAGE_SIZE}"}, {"field": "pageIndex", "label": "pageIndex", "type":"string", "describe":"111","value":"{PAGINATION_START_PAGE}"}, {"field":"fields","label":"fields","type":"string","describe":"111","value":"tradeNo,orderNo,shopName,companyName,warehouseName,logisticName,mainPostid,goodsDetail.goodsNo,flagNames,columnExt,sourceAfterNo,goodsDetail.outerId,pickUpCode,expense.expenseFee,expense.expenseItemName,billDate,goodsPlatDiscountFee,goodsDetail.shareOrderDiscountFee,goodsDetail.shareOrderPlatDiscountFee,customizeGoodsColumn9,goodsDetail.goodsId,goodsDetail.goodsNo,goodsDetail.goodsName,goodsDetail.specName,goodsDetail.barcode,goodsDetail.sellCount,goodsDetail.unit,goodsDetail.sellPrice,goodsDetail.sellTotal,goodsDetail.cost,goodsDetail.discountTotal,goodsDetail.discountPoint,goodsDetail.taxFee,..."} ], ... } ``` 在该配置中,主要字段包括: - `startModified` 和 `endModified`:用于指定查询时间范围。 - `pageSize` 和 `pageIndex`:用于分页查询。 - `fields`:指定需要返回的字段列表。 这些字段确保我们能够精确地控制请求参数,从而获取所需的数据。 #### 数据请求与清洗 在发送请求后,我们会得到一个包含多个交易记录的数据集。为了确保数据质量,需要对原始数据进行清洗和初步加工。以下是一些常见的数据清洗步骤: 1. **去除无效记录**:根据条件过滤掉不符合要求的记录。例如,过滤掉商品编号为“88888”的记录。 2. **字段转换**:将某些字段从字符串转换为数组或其他适当的数据类型。例如,将`tradeTypeList`从字符串转换为数组。 3. **缺失值处理**:处理缺失值或空值,例如将某些字段的空值替换为默认值。 以下是一个示例代码片段,用于实现上述清洗步骤: ```python import json def clean_data(raw_data): cleaned_data = [] for record in raw_data: if record['goodsDetail']['goodsNo'] == '88888': continue if record['shopCode'] not in ['0007', 'YF']: continue # 转换 tradeTypeList 字段 record['tradeTypeList'] = record['tradeTypeList'].split(',') cleaned_data.append(record) return cleaned_data # 示例调用 raw_data = json.loads(api_response) cleaned_data = clean_data(raw_data) ``` #### 数据转换与写入 经过清洗后的数据需要进一步转换,以符合目标系统(如金蝶)的要求。这可能包括字段重命名、格式调整等。以下是一个简单的示例: ```python def transform_data(cleaned_data): transformed_data = [] for record in cleaned_data: transformed_record = { '销售退货单号': record['tradeNo'], '订单号': record['orderNo'], '店铺名称': record['shopName'], '公司名称': record['companyName'], '仓库名称': record['warehouseName'], # 更多字段映射... } transformed_data.append(transformed_record) return transformed_data # 示例调用 transformed_data = transform_data(cleaned_data) ``` 最后,将转换后的数据写入目标系统。这一步通常通过目标系统提供的API接口实现。 通过以上步骤,我们可以高效地调用吉客云·奇门接口获取并加工数据,为后续的数据集成过程打下坚实基础。在实际应用中,根据具体业务需求和目标系统要求,可能需要进一步调整和优化这些步骤。 ![数据集成平台可视化配置API接口](https://pic.qeasy.cloud/S27.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将销售退货单转换并写入金蝶云星空API接口 在数据集成生命周期的第二步,我们需要将已经集成的源平台数据进行ETL(提取、转换、加载)转换,转为目标平台金蝶云星空API接口所能够接收的格式,最终写入目标平台。以下是详细的技术实现过程。 #### 1. API接口配置 首先,根据元数据配置,我们需要调用金蝶云星空的`batchSave` API接口。该接口采用POST方法,并且支持批量保存操作。具体配置如下: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","value":"{tradeNo}-11"}, {"field":"FDate","label":"日期","type":"string","value":"{consignTime}"}, {"field":"FRetcustId","label":"退货客户","type":"string","value":"{customerCode}","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FBillTypeID","label":"单据类型","type":"string","value":"XSTHD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FHeadNote","label":"备注","type":"string","value":"{onlineTradeNo}"}, {"field":"FEntity","label":"明细信息","type":"array","value":"goodsDetail", "children":[ {"field":"FMaterialId","label":"物料编码","type":"string", "value": "{{goodsDetail.goodsNo}}", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FMustqty", "label": "应退数量", "type": "string", "value": "_function -({{goodsDetail.sellCount}})"}, {"field": "FRealQty", "label": "实退数量", "type": "string", "value": "_function -({{goodsDetail.sellCount}})"}, {"field": "FStockId", "label": "仓库", "type": "string", "value": "{warehouseCode}",  "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FLot", "label": "批号", "type": "string", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FEntryTaxRate", "label": "税率%", "type": "string", "value": "13"}, {"field": "FIsFree", "label": "是否赠品", "type": "string", "value": "_function CASE WHEN {{goodsDetail.sellTotal}}>0 THEN 'false' ELSE 'true' END"}, {"field": "FTaxPrice",         label:         含税单价,         type:         string,         value: "_function {{goodsDetail.shareFavourableAfterFee}}/{{goodsDetail.sellCount}}" }, { field: FDeliveryDate, label: 退货日期, type: string, value: "{consignTime}" }, { field: FReturnType, label: 退货类型, type: string, value: THLX01_SYS, parser: { name: ConvertObjectParser, params: FNumber } } ] }, {"field": F_ysddh, label: F_ysddh, type: string, value: {onlineTradeNo} } ], otherRequest: [ { field: FormId, label: 业务对象表单Id, type: string, describe: 必须填写金蝶的表单ID如:PUR_PurchaseOrder, value: SAL_RETURNSTOCK }, { field: Operation, label: 执行的操作, type: string, value: Save }, { field: IsAutoSubmitAndAudit, label: 提交并审核, type: bool, value: true }, { field: IsVerifyBaseDataField, label: 验证基础资料, type: bool, describe: 是否验证所有的基础资料有效性,布尔类,默认false(非必录), value:false }, { field: SubSystemId,label : 系统模块,type : string ,describe : 默认仓库模块,value :21 } ] } ``` #### 2. 数据字段解析与转换 在数据转换过程中,我们需要对不同字段进行解析和转换,以确保数据格式符合金蝶云星空API接口的要求。 - **单据编号 (FBillNo)**:通过 `{tradeNo}-11` 表达式生成。 - **日期 (FDate)**:直接从 `{consignTime}` 获取。 - **退货客户 (FRetcustId)**:使用 `ConvertObjectParser` 将 `{customerCode}` 转换为 `FNumber` 格式。 - **单据类型 (FBillTypeID)**:固定值 `XSTHD01_SYS`,同样使用 `ConvertObjectParser` 转换为 `FNumber` 格式。 - **备注 (FHeadNote)**:直接映射 `{onlineTradeNo}`。 对于明细信息数组字段 `FEntity`,我们需要逐个处理子字段: - **物料编码 (FMaterialId)**:使用 `ConvertObjectParser` 将 `{{goodsDetail.goodsNo}}` 转换为 `FNumber` 格式。 - **应退数量 (FMustqty)** 和 **实退数量 (FRealQty)**:通过 `_function -({{goodsDetail.sellCount}})` 表达式计算负值。 - **仓库 (FStockId)**:使用 `ConvertObjectParser` 将 `{warehouseCode}` 转换为 `FNumber` 格式。 - **批号 (FLot)**:同样使用 `ConvertObjectParser` 转换为 `FNumber` 格式。 - **税率% (FEntryTaxRate)**:固定值 `13%`。 - **是否赠品 (FIsFree)**:通过 `_function CASE WHEN {{goodsDetail.sellTotal}}>0 THEN 'false' ELSE 'true' END` 表达式判断是否为赠品。 - **含税单价 (FTaxPrice)**:通过 `_function {{goodsDetail.shareFavourableAfterFee}}/{{goodsDetail.sellCount}}` 表达式计算。 - **退货日期 (FDeliveryDate)** 和 **退货类型 (FReturnType)** 分别从 `{consignTime}` 和固定值 `THLX01_SYS` 获取,并使用 `ConvertObjectParser` 转换为 `FNumber` 格式。 #### 3. 提交与审核 在提交数据时,我们需要设置其他请求参数以确保正确执行: ```json { field:"FormId", label:"业务对象表单Id", type:"string", describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder", value:"SAL_RETURNSTOCK" }, { field:"Operation", label:"执行的操作", type:"string", value:"Save" }, { field:"IsAutoSubmitAndAudit", label:"提交并审核", type:"bool", value:true }, { field:"IsVerifyBaseDataField", label:"验证基础资料", type:"bool", describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)", value:false }, { field:"SubSystemId", label :"系统模块", type :"string ", describe :"默认仓库模块", value :21 } ``` 这些参数确保了我们在提交销售退货单时,会自动进行审核,并且不强制验证所有基础资料的有效性。 #### 总结 通过上述步骤,我们成功地将源平台的数据进行了ETL转换,并最终写入到了目标平台金蝶云星空。这个过程充分利用了轻易云数据集成平台提供的全生命周期管理功能,实现了高效、透明的数据处理。 ![钉钉与CRM系统接口开发配置](https://pic.qeasy.cloud/T22.png~tplv-syqr462i7n-qeasy.image)