使用轻易云实现数据ETL转换:从管易销售发货单到金蝶出库单

  • 轻易云集成顾问-潘裕
### 管易云·奇门数据集成到金蝶云星空的实践案例 在本次技术探讨中,我们将详细解析如何利用轻易云数据集成平台,实现管易销售发货单与金蝶销售出库单(线上电商)的无缝对接。通过API接口实现稳定、高效的数据同步,这不仅简化了业务操作流程,还提升了企业运营效率。 #### 一、API接口调用与处理 首先,我们需要获取管易云·奇门的销售发货单数据,对应的API接口为`gy.erp.trade.deliverys.get`。这个过程涉及到分页和限流的问题,需要编写相应的逻辑来确保所有订单都正确获取,避免漏单情况发生。具体步骤如下: 1. **分页处理**:由于接口返回结果可能会有数量限制,必须进行分批次请求,直至申请完所有所需数据。 2. **异常处理机制**:为了提高读取稳定性,通过设置重试机制来处理网络波动或其他导致的数据读取失败问题。 其次,将获取到的发货单数据转换为适用于金蝶云星空格式,并通过其提供的`batchSave` API进行批量写入。这部分工作主要集中于: 1. **自定义数据转换逻辑**:连接两个系统之间不同的数据结构,使其能够被消费者系统理解并接受。 2. **高吞吐量支持**:在短时间内大量相关联的数据能迅速、安全地被传递和存储,有效防止因延迟而影响后续业务流程。 #### 二、实时监控与告警 整个集成过程中,实时监控和自动告警功能必不可少。这可以帮助我们及时发现及纠正潜在问题,从而保证系统持续高效运转。 - 使用轻易云平台提供的集中监控工具,对每一个任务节点进行跟踪。 - 配置告警规则,一旦检测到某一环节出现异常,例如API响应超时或者数据无返回,即刻触发通知,以便技术人员能快速应对。 以上这些措施旨在保障从管易云·奇门到金蝶云星空整个链路上的平稳运行, 高性能且准确无误地实现各种电商交易信息同步更新。在接下来的部分文章中,我们将继续深入探讨各个细节做法以及需要注意事项,为您展示一个完整可靠的数据集成解决之道。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/D20.png~tplv-syqr462i7n-qeasy.image) ### 调用管易云·奇门接口gy.erp.trade.deliverys.get获取并加工数据 在数据集成生命周期的第一步中,调用源系统接口是至关重要的一环。本文将深入探讨如何使用轻易云数据集成平台调用管易云·奇门接口`gy.erp.trade.deliverys.get`,并对获取的数据进行初步加工。 #### 接口调用配置 首先,我们需要配置接口调用的元数据。根据提供的元数据配置,可以看到该接口主要通过POST方法进行请求,且支持多种查询参数。以下是关键字段及其描述: - `start_create` 和 `end_create`:用于指定创建时间的查询范围。 - `start_modify_date` 和 `end_modify_date`:用于指定修改时间的查询范围。 - `del`:是否返回已作废的单据,默认值为0(不返回)。 - `delivery`:发货状态,默认值为1(发货成功)。 - `code`:单据编码。 - `warehouse_code`、`shop_code`、`outer_code`、`mail_no`等字段用于进一步过滤查询结果。 - `start_delivery_date` 和 `end_delivery_date`:发货时间的查询范围,分别使用上次同步时间和当前时间作为默认值。 此外,还有分页参数: - `page_no`: 页码,默认值为1。 - `page_size`: 每页大小,默认值为20。 #### 请求示例 基于上述配置,我们可以构建一个请求示例: ```json { "api": "gy.erp.trade.deliverys.get", "method": "POST", "request": { "start_create": "2023-01-01T00:00:00", "end_create": "2023-12-31T23:59:59", "delivery": 1, "start_delivery_date": "{{LAST_SYNC_TIME|datetime}}", "end_delivery_date": "{{CURRENT_TIME|datetime}}", "page_no": 1, "page_size": 20 } } ``` #### 数据清洗与转换 在获取到原始数据后,需要对数据进行清洗和转换,以便后续处理和写入目标系统。以下是一些常见的数据清洗与转换操作: 1. **过滤无效数据**: 根据条件过滤掉不需要的数据,例如作废单据或特定类型的订单。在元数据配置中已经定义了条件过滤逻辑,如排除平台编码为"XXXSDD"和"CKSQ"的记录,以及订单类型为"gift"、"Maintain"和商品编码为"fapiao"的记录。 2. **字段映射**: 将源系统中的字段映射到目标系统所需的字段。例如,将管易云中的单据编码映射到金蝶系统中的销售出库单编码。 3. **格式转换**: 对日期、金额等字段进行格式转换,以符合目标系统的要求。例如,将日期格式从ISO8601转换为目标系统所需的格式。 4. **数据合并**: 如果需要,可以将多个API请求结果合并成一个完整的数据集,以便一次性写入目标系统。 #### 实践案例 假设我们从管易云获取到如下发货单数据: ```json { "deliverys": [ { "code": "DEL12345", "warehouse_code": "WH001", "shop_code": "SHOP001", "outer_code": "ORDER12345", "mail_no": "TRACK12345", "delivery_date": "2023-10-01T10:00:00" }, { ... } ] } ``` 我们需要将这些数据清洗并转换为金蝶系统所需的格式: ```json { "sales_outbound_orders": [ { "order_code": "DEL12345", "warehouse_id": "WH001", "store_id": "SHOP001", "platform_order_id": "ORDER12345", "tracking_number": "TRACK12345", "shipment_date": "2023/10/01 10:00:00" }, { ... } ] } ``` 通过轻易云数据集成平台,我们可以自动化上述过程,实现高效的数据集成和处理。这不仅提升了业务透明度,还确保了数据的一致性和准确性。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/S3.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台实现管易销售发货单到金蝶销售出库单的ETL转换 在数据集成过程中,将源平台的数据转换为目标平台所需的格式是关键步骤。本文将详细探讨如何使用轻易云数据集成平台将管易销售发货单的数据转换为金蝶云星空API接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 在本案例中,我们需要将管易的销售发货单数据通过ETL转换,写入到金蝶云星空的销售出库单。以下是元数据配置的详细解析: ```json { "api": "batchSave", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSCKD12_SYS"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{delivery_statusInfo.delivery_date}}"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"_function CASE '{shop_code}' WHEN 'SXF001' THEN '103' WHEN 'SXF002' THEN '103' WHEN 'SXF003' THEN '103' WHEN 'SXF004' THEN '103' WHEN 'SXF005' THEN '103' WHEN 'SXF006' THEN '103' WHEN 'SXF007' THEN '103' ELSE '100' END"}, {"field":"FStockOrgId","label":"发货组织","type":"string","value":"_function CASE '{shop_code}' WHEN 'SXF001' THEN '103' WHEN 'SXF002' THEN '103' WHEN 'SXF003' THEN '103' WHEN 'SXF004' THEN '103' WHEN 'SXF005' THEN '103' WHEN 'SXF006' THEN '103' ELSE '100' END", "parser":{"name":"ConvertObjectParser", "params": "FNumber"}}, {"field": "FCustomerID", "label": "客户", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "_findCollection find FNumber from dc704b79-f3da-309a-9d2d-88456a5cbcd9 where F_352_waibuma={shop_code}"}, {"field": "FOwnerTypeIdHead", "label": "货主类型", "type": "string", "describe": "货主类型", "value": "BD_OwnerOrg"}, {"field": "FOwnerIdHead", "label": "货主", "type": "string", "describe": "货主", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "_function CASE '{shop_code}' WHEN 'SXF001'T HEN ‘103’WHEN ‘ SXF002’THEN ‘ 103’WHEN ‘ SXF003’THEN ‘ 103’WHEN ‘ SXF004’THEN ‘ 103’WHEN ‘ SXF005’THEN ‘ 103’WHEN ‘ SXF006’THEN ‘ 103’ELSE‘100’END"}, {"field": “F_UQRW_Text”, “label”: “平台单号”, “type”: “string”, “value”: “{platform_code}”}, {"field”: “F_UQRW_Text2”, “label”: “销售订单单号”, “type”: “string”, “value”: “{{details.trade_code}}”}, {"field”: “F_UQRW_Text1”, “label”: “销售发货单号”, “type”: “string”, “value”:“{code}”}, {"field”:“F_352_OMSdanhao”,”label”:“OMS单号”,”type”:“string”,”value”:“{{details.trade_code}}”}, { ”field”:”SubHeadEntity”, ”label”:”财务信息”, ”type”:”object”, ”describe”:”财务信息”, ”children”:[ {“field”:”FSettleOrgID”,“label”:”结算组织”,“type”:”string”,“describe”:”组织”,“parser”:{“name”:”ConvertObjectParser”,“params”:”FNumber”},”value”:"_function CASE '{shop_code}' WHEN'SXF001'T HEN‘103’WHEN‘ SXF002’THEN‘ 103’WHEN‘ SXF003’THEN‘ 103’WHEN‘ SXF004’THEN‘ 104 ’WHEN‘ S XF005’T HEN‘105 ’WHEN‘ SX F006’T HEN‘106 ’ELSE‘100 ’END"}, {“field”:”FSETTLECURRID”,“label”:”结算币别”,“type”:”string”,“describe”:文本”,“parser:{“name:ConvertObjectParser”,“params:FNumber },“ value:PRE001} ] }, { field: FEntity, label: 明细信息, type: array, describe: 明细信息, value: details, children: [ { field: FMaterialID, label: 物料编码, type: string, describe: 基础资料, parser:{ name: ConvertObjectParser, params: FNumber }, value:_findCollection find FNumber from a430738b-c21a-3683-832c-4b519dc241ba where F_UQRW_Text={{details.item_code}}}, { field: FUnitID, label: 库存单位, type:string,value:_findCollection find FBaseUnitId_FNumber from a430738b-c21a-3683-832c-4b519dc241ba where F_UQRW_Text={{details.item_code}}, parser:{ name: ConvertObjectParser, params:FNumber }}, { field:FStockID,label:仓库,type:string,describe:基础资料,parser:{ name:ConvertObjectParser,params:FNumber },value:_findCollection find FNumber from 2d028336-2f80-3a32-9f6d-70cda23b44ad where F_UQRW_Text={warehouse_code}}, { field:FRealQty,label:实发数量,type:string,describe:数量,value:_function {{details.amount_after}}/{{details.qty}}, { field:F_UQRW_PTDH01,label:明细平台单号,type:string,value:_function {{details.platform_code}} ] }, { field:FOutStockTrace, label:物流跟踪明细, type:array, children:[ { field:FCarryBillNo,label:物流单号,type:string,value:{express_no}}, { field:FLogComId,label:物流公司,type:string,value:{express_code},parser:{ name:ConvertObjectParser,params:FCODE },mapping:{ target:"6567f13a3b91c238504d2c66",direction:"positive"}}, { field:FPhoneNumber,label:寄件人手机号,type:string,value:_function RIGHT('{receiver_mobile}',4)} ] } ], otherRequest:[ { field:"FormId",label:"业务对象表单Id",type:"string",describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder",value:"SAL_OUTSTOCK"}, { field:"Operation",label:"执行的操作",type:"string",describe:"执行的操作",value:"Save"}, { field:"IsAutoSubmitAndAudit",label:"提交并审核",type:"bool",describe:"提交并审核",value:"true"}, { field:"IsVerifyBaseDataField",label:"验证基础资料",type:"bool",describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)",value:"true"}, { field:"SubSystemId",label:"系统模块",type:"string",describe:"默认仓库模块",value:"21"}, { field:"InterationFlags",label:"允许负库存",type:"string",describe:"允许负库存",value:“STK_InvCheckResult"} ], operation:{ rowsKey:“array”, rows:“1”, method:“batchArraySave” } } ``` #### 数据字段解析与映射 1. **FBillTypeID (单据类型)**: - 类型:字符串 - 值:“XSCKD12_SYS” - 描述:固定值,用于标识销售出库单。 2. **FBillNo (单据编号)**: - 类型:字符串 - 描述:从源数据中获取。 3. **FDate (日期)**: - 类型:字符串 - 值:“{{delivery_statusInfo.delivery_date}}” - 描述:使用源数据中的交付日期。 4. **FSaleOrgId (销售组织)** 和 **FStockOrgId (发货组织)**: - 类型:字符串 - 值:“_function CASE '{shop_code}' ... END” - 描述:根据店铺代码映射到对应的组织编码。 5. **FCustomerID (客户)**: - 类型:字符串 - 值:“_findCollection find FNumber ... where F_352_waibuma={shop_code}” - 描述:通过店铺代码查找对应客户编码。 6. **FOwnerTypeIdHead (货主类型)** 和 **FOwnerIdHead (货主)**: - 类型:字符串 - 值:“BD_OwnerOrg”和"_function CASE '{shop_code}' ... END" - 描述:固定值和根据店铺代码映射到对应的货主编码。 7. **其他字段**: - 平台单号、销售订单单号、销售发货单号、OMS 单号等字段从源数据中直接获取。 8. **SubHeadEntity (财务信息)**: - 包含结算组织和结算币别等子字段,通过解析和映射确定其值。 9. **FEntity (明细信息)**: - 包含物料编码、库存单位、仓库、实发数量等子字段,通过复杂逻辑和查找确定其值。 10. **物流跟踪明细**: - 包含物流公司、物流单号等子字段,通过解析和映射确定其值。 #### 数据转换与写入 在完成上述字段映射后,通过轻易云的数据集成平台,将这些配置应用于实际的数据处理流程中。利用API接口进行批量保存操作,实现从管易到金蝶云星空的数据无缝对接。 通过配置`operation`部分,我们定义了批量保存的方法`batchArraySave`,确保所有记录能够高效地写入目标系统。同时,通过设置`IsAutoSubmitAndAudit`为`true`,实现自动提交和审核,提高了操作效率。 以上内容展示了如何利用轻易云数据集成平台完成复杂的数据ETL转换,并成功将管易销售发货单同步至金蝶云星空。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/T28.png~tplv-syqr462i7n-qeasy.image)