利用轻易云平台实现高效数据转换和写入金蝶云星空

  • 轻易云集成顾问-黄宏棵
### 易仓数据集成到金蝶云星空:技术案例分享 在企业的信息系统中,跨平台的数据集成往往面临多种挑战:如何确保数据不漏单、大量数据的快速写入、定时可靠的数据抓取等。本文将详细探讨一个实际运行中的方案,即通过Done-易仓-头程发货单--->金蝶-分步式调出单,实现易仓(Ewarehouse)的物流数据精确对接至金蝶云星空(Kingdee Cloud Star)。 #### 项目需求与挑战 在这个项目中,核心需求是从易仓获取头程发货单信息,并实时、批量地导入到金蝶云星空中。关键要解决的问题包括: 1. **数据完整性**:确保每一条发货单都能准时、不遗漏地传输。 2. **高效处理大规模数据**:海量的物流订单需要快速、高效地录入系统。 3. **接口限流及分页处理**:面对API频次限制,需要合理设计请求机制。 4. **格式差异与错误重试机制**:不同系统间的数据结构转换和异常情况下的重试。 #### 实现方案概述 首先,通过调用轻易云提供的getDeliverOutboundBatch接口,从易仓批量抓取最新生成的发货单信息。这部分主要涉及两个重要环节: 1. **定时器调度与监控** - 设置一个定时任务,每隔一定时间段调用一次getDeliverOutboundBatch接口,确保及时获取最新的物流信息。同时,对每次提取操作进行日志记录,以便后续追踪和排查问题。 2. **分页处理优化** - 考虑到可能存在的大数量返回结果,我们采用分页方式逐页拉取所有满足条件的数据内容,并针对接口限流进行适当处理,如加入随机延迟或使用令牌桶算法来控制请求速度。 紧接着,在获得这些原始物流订单数据之后,需要对其进行初步清洗和结构化转化,使之符合金蝶云星空batchSave API所需的数据格式要求。这一步骤通常包括字段映射、类型转换以及必要的信息衍生。 最后,将整理好的数据信息通过batchSave接口批量提交至金蝶云星空,再结合内部实现的一些错误检测和重试机制,保障整个过程稳健执行。特别是在写入过程中,如果发现某些记录出现问题,会即时捕获并根据预设策略重新尝试,直至成功提交为止。 以上即为本次案例分享的开篇部分。在随后的章节中,将进一步深入讨论具体实现的方法细节,以及各个技术点上的优化考量。 ![金蝶云星空API接口配置](https://pic.qeasy.cloud/D36.png~tplv-syqr462i7n-qeasy.image) ### 调用易仓接口getDeliverOutboundBatch获取并加工数据 在数据集成的生命周期中,调用源系统接口获取数据是至关重要的第一步。本文将详细探讨如何通过轻易云数据集成平台调用易仓接口`getDeliverOutboundBatch`,并对获取的数据进行加工处理。 #### 接口配置与调用 首先,我们需要配置并调用易仓的`getDeliverOutboundBatch`接口。根据提供的元数据配置,我们可以看到该接口使用POST方法进行请求,并且主要参数包括分页信息和时间范围等。 ```json { "api": "getDeliverOutboundBatch", "effect": "QUERY", "method": "POST", "number": "do_code", "id": "do_code", "idCheck": true, "request": [ {"field": "page", "label": "page", "type": "int", "value": "1"}, {"field": "page_size", "label": "page_size", "type": "int", "value": "50"}, {"field": "ship_start", "label": "开始出库时间", "type": "string", "value":"{{MINUTE_AGO_20|datetime}}"}, {"field": "ship_end", "label":"结束出库时间","type":"string", "value":"{{CURRENT_TIME|datetime}}"}, {"field":"created_start","label":"创建开始时间","type":"string", "value":"2024-04-01 00:00:00"} ], ... } ``` 上述配置中,`page`和`page_size`用于分页控制,`ship_start`和`ship_end`定义了数据的时间范围,而`created_start`则设定了创建开始时间。这些参数确保我们能够灵活地获取所需的数据。 #### 数据过滤与条件设置 在实际应用中,我们通常需要对获取的数据进行过滤,以满足业务需求。元数据配置中的条件部分为我们提供了灵活的过滤机制。例如: ```json "condition":[ [{"field":"tran_warehouse_code","logic":"in","value": "Amazon_TOOVEM_TOOLS_US,Amazon_Alorair_US,..."}], [{"field":"aim_warehouse_code","logic":"in","value": "Amazon_TOOVEM_TOOLS_US,Amazon_Alorair_US,..."}] ] ``` 这些条件确保我们只获取特定仓库之间的发货单数据,从而提高数据处理的效率和准确性。 #### 数据加工与清洗 在成功调用接口并获取原始数据后,下一步是对数据进行加工和清洗。这一过程通常包括以下几个步骤: 1. **字段映射**:将原始数据字段映射到目标系统所需的字段格式。 2. **数据转换**:根据业务逻辑对某些字段进行转换,例如日期格式转换、数值计算等。 3. **异常处理**:识别并处理异常数据,如缺失值、格式错误等。 例如,对于一个典型的数据清洗操作,我们可能需要将原始的出库时间字段转换为目标系统所需的标准日期格式: ```python def clean_data(raw_data): for record in raw_data: record['formatted_ship_time'] = convert_to_standard_format(record['ship_time']) return raw_data ``` #### 自动填充响应 轻易云平台提供了自动填充响应功能,这使得我们能够更加高效地处理返回的数据。在元数据配置中,通过设置`autoFillResponse: true`,平台会自动将API响应的数据填充到相应的目标表结构中。 ```json "autoFillResponse": true ``` 这一特性极大地简化了开发工作量,使得开发者可以专注于业务逻辑而非繁琐的数据映射操作。 #### 实时监控与调试 在整个数据集成过程中,实时监控和调试是确保系统稳定运行的重要手段。轻易云平台提供了全面的监控工具,可以实时查看每个环节的数据流动和处理状态,从而快速定位并解决问题。 通过以上步骤,我们可以高效地调用易仓接口获取发货单数据,并对其进行必要的加工和清洗,为后续的数据写入和业务应用打下坚实基础。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/S10.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现金蝶云星空API接口的数据转换与写入 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL(提取、转换、加载)转换,并转为目标平台所能接收的格式。本文将详细探讨如何使用轻易云数据集成平台,将易仓头程发货单的数据转换为金蝶云星空API接口所需的格式,并最终写入目标平台。 #### 元数据配置解析 元数据配置是实现数据转换和写入的关键。以下是针对金蝶云星空API接口`batchSave`方法的详细元数据配置解析: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号"}, {"field":"F_TLQG_Text","label":"头程单号","type":"string","value":"{do_code}"}, {"field":"F_TLQG_TextHJBH","label":"货件单号","type":"string","value":"{shipment_id}"}, {"field":"FStockOrgID","label":"调出库存组织","type":"string","describe":"调出库存组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{tran_warehouse_code}","mapping":{"target":"65defc0d3aa9797708730ddf","direction":"positive"}}, {"field":"FStockOrgID","label":"调入库存组织","type":"string","describe":"调入库存组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{aim_warehouse_code}","mapping":{"target":"65defc0d3aa9797708730ddf","direction":"positive"}}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{ship_time|datetime}}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型(标准分步式调出单:FBDC01_SYS,VMI分步式调出单:FBDC02_SYS)", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "FBDC01_SYS"}, {"field": "FTransferDirect", "label": "调拨方向", "type": "string", "describe": "调拨方向", "value": "GENERAL"}, {"field": "FNOTE", "label": "备注", "type": "string", "describe": "备注", "value": "{shipment_id}"}, {"field": "FTransferBizType", "label": "调拨类型", "type": "string", "describe": "调拨类型\n组织内调拨-InnerOrgTransfer\n跨组织调拨-OverOrgTransfer\n跨组织销售-OverOrgSale\n跨组织来购-OverOrgPurchase\n跨组织生产领料-OverOrgPick\n跨组织委外领料-OverOrgSubpick\n跨组织其他出库-OverOrgMisDelivery\n跨组织生产入库-OverOrgPrdIn\n跨组织VMI-OverOrgPurVMI\n跨组织生产退库-OverOrgPrdOut", "value": "InnerOrgTransfer" }, { ... ``` #### 数据字段解析与映射 1. **单据编号 (FBillNo)**: 单据编号字段直接从源数据中获取。 2. **头程单号 (F_TLQG_Text)**: 对应于源数据中的`do_code`。 3. **货件单号 (F_TLQG_TextHJBH)**: 对应于源数据中的`shipment_id`。 4. **调出库存组织 (FStockOrgID)**: 使用`ConvertObjectParser`进行对象转换,参数为`FNumber`,映射到源数据中的`tran_warehouse_code`。 5. **调入库存组织 (同上)**: 同样使用对象转换,映射到源数据中的`aim_warehouse_code`。 6. **日期 (FDate)**: 使用日期格式化函数将源数据中的`ship_time`转换为目标格式。 7. **单据类型 (FBillTypeID)**: 固定值为 `FBDC01_SYS`。 8. **调拨方向 (FTransferDirect)**: 固定值为 `GENERAL`。 9. **备注 (FNOTE)**: 对应于源数据中的 `shipment_id`。 10. **调拨类型 (FTransferBizType)**: 固定值为 `InnerOrgTransfer`。 #### 明细信息配置 明细信息部分涉及到多条记录的处理,每条记录包含多个字段,如物料编码、数量等。以下是明细信息部分的解析: ```json { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { field: FMaterialID, label: 物料编码, type: string, describe: 物料编码, parser: {name:"ConvertObjectParser",params:"FNumber"}, value:"_findCollection find FMaterialId_FNumber from 6019c615-1c31-3860-ac7f-b8508e4573cc where FCustMatNo={{list.products_warehouse_sku}}" }, field: FSrcStockID, label: 调出仓库, type: string, describe: 调出仓库, parser: {name:"ConvertObjectParser",params:"FNumber"}, value:"{tran_warehouse_code}", mapping:{target:"65e01fbb196c000944518373",direction:"positive"} }, field: FDestStockID, label: 调入仓库, type: string, describe: 调入仓库, parser:{name:"ConvertObjectParser",params:"FNumber"}, value:"{aim_warehouse_code}", mapping:{target:"65e01fbb196c000944518373",direction:"positive"} }, field:FQty,label:数量,type:float,describe:数量,value:"{{list.products_warehouse_qty}}" }, field:FOwnerID,label:调入货主,type:string,describe:调入货主,parser:{name:"ConvertObjectParser",params:"FNumber"},value:{aim_warehouse_code},mapping:{target:"65defc0d3aa9797708730ddf",direction:"positive"} }, field:FOwnerOutID,label:调出货主,type:string,describe:调出货主,parser:{name:"ConvertObjectParser",params:"FNumber"},value:{tran_warehouse_code},mapping:{target:"65defc0d3aa9797708730ddf",direction:"positive"} }, field:FEntryNote,label:备注,type:string,describe:备注 }, field:FEDestStockStatusID,label在途库存状态,type:string,valueKCZT05_SYS,parser{nameConvertObjectParser,params:FNumber} } } } } } } } } } ``` #### 执行操作与其他请求参数 在完成所有字段的映射和转换后,需要设置一些执行操作和其他请求参数: ```json { ... otherRequest:[ {fieldFormId,label业务对象表单Id,type:string,describe必须填写金蝶的表单ID如PUR_PurchaseOrder,valueSTK_TRANSFEROUT}, {fieldOperation,label执行的操作,type:string,describe执行的操作,valueBatchSave}, {fieldIsAutoSubmitAndAudit,label提交并审核,typebool,describe提交并审核,valueTRUE}, {fieldIsVerifyBaseDataField,label验证基础资料,typebool,describe是否验证所有的基础资料有效性,布尔类,默认false(非必录),valuetrue}, {fieldInterationFlags,label负库存确认,type:string,valueSTK_InvCheckResult} ], operation:{ rowsKeyarray,rows1,methodbatchArraySave }, enforcedAssociationtrue, groupCalculate:{ headerGroup[do_code,tran_warehouse_code,aim_warehouse_code,ship_time,shipment_id,receiving_code], bodyGroup[products_warehouse_sku,products_warehouse_qty], bodyNamelist, calculate:{ products_warehouse_qty$sum } } } ``` 这些参数确保了在调用API时可以正确执行批量保存操作,并且自动提交和审核。 通过以上详细解析和配置,我们可以高效地将易仓头程发货单的数据转换并写入到金蝶云星空平台,实现不同系统间的数据无缝对接。这不仅提高了业务处理效率,还保证了数据的一致性和准确性。 ![用友与MES系统接口开发配置](https://pic.qeasy.cloud/T18.png~tplv-syqr462i7n-qeasy.image)