销售出库单的ETL转换与金蝶云星空集成实现

  • 轻易云集成顾问-叶威宏
### 管易云·奇门数据集成到金蝶云星空的技术实现 在销售出库单对接的新管易方案中,我们成功地将管易云·奇门平台的数据高效、可靠地集成到了金蝶云星空。本文将探讨这个项目中的关键技术点和实际操作过程。 首先,我们需要解决的核心问题就是如何确保从管易云·奇门获取到的数据不漏单,并且快速、稳定地写入到金蝶云星空系统。为了实现这一目标,我们采用了定时任务调度机制,通过调用管易云·奇门API接口`gy.erp.trade.deliverys.get`定期抓取最新出库单数据。针对大数据量处理的问题,结合分页策略,有效避免了接口限流导致的数据丢失问题。 对于获取到的数据进行批量处理,是保持系统高性能的重要一环。我们利用轻松配置工具,对接多个API请求,将获取的数据批量集成并转换为适应金蝶格式的记录。这一步目的是通过调用金蝶云星空提供的`batchSave` API接口,实现大量数据快速写入,同时保障每条记录都能准确映射和储存。 一个重要挑战是处理两个平台之间不同的数据格式与字段映射。在这方面,灵活运用了自定义脚本和映射规则,使得从源头导出的结构化数据可以平滑过渡至目标系统。此外,为保障整个流程运行的可靠性及错误重试机制,实现了实时监控与日志记录功能,每次小修正或更新都有详细追踪,大幅提高故障排除效率及系统稳定性。 后续部分将继续深入讲解具体实施细节以及相关代码示例,以便您更全面掌握此项技术案例中的实战经验和最佳实践方法。 ![如何对接企业微信API接口](https://pic.qeasy.cloud/D6.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台调用管易云·奇门接口gy.erp.trade.deliverys.get获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台配置元数据,调用管易云·奇门接口`gy.erp.trade.deliverys.get`来获取并加工销售出库单数据。 #### 接口配置与请求参数 首先,我们需要配置元数据以便调用`gy.erp.trade.deliverys.get`接口。该接口使用POST方法进行请求,主要参数包括创建时间、发货时间、修改时间等。以下是具体的请求参数配置: ```json { "api": "gy.erp.trade.deliverys.get", "method": "POST", "number": "code", "id": "code", "pagination": { "pageSize": 30 }, "idCheck": true, "omissionRemedy": { "crontab": "2 */3 * * *", "takeOverRequest": [ { "field": "start_delivery_date", "label": "发货时间开始段", "type": "string", "is_required": false, "value": "_function FROM_UNIXTIME({LAST_SYNC_TIME}-43200 ,'%Y-%m-%d %H:%i:%s' )" }, { "field": "end_delivery_date", "label": "发货时间结束段", "type": "string", "is_required": false, "value": "{{CURRENT_TIME|datetime}}" } ] }, "request": [ { "field": "start_create", "label": "创建时间开始段", "type": "string" }, { "field": "end_create", "label": "创建时间结束段", "type": "string" }, { "field": "start_delivery_date", ... ``` #### 分页处理与增量同步 为了高效处理大量数据,我们采用分页机制,每次请求30条记录。通过设置`page_no`和`page_size`参数,可以控制分页的起始页和每页记录数: ```json "otherRequest":[ {"field":"page_no","label":"页号","type":"string","describe":"默认1","value":"{PAGINATION_START_PAGE}"}, {"field":"page_size","label":"分页大小","type":"string","describe":"{PAGINATION_PAGE_SIZE}","value":"{PAGINATION_PAGE_SIZE}"} ] ``` 此外,为了实现增量同步,我们利用了两个关键字段:`start_delivery_date`和`end_delivery_date`。这些字段分别代表上次同步的起始时间和当前时间,通过动态计算确保每次只获取最新的数据: ```json "takeOverRequest":[ {"field":"start_delivery_date","label":"发货时间开始段","type":"string","value":"_function FROM_UNIXTIME({LAST_SYNC_TIME}-43200 ,'%Y-%m-%d %H:%i:%s' )"}, {"field":"end_delivery_date","label":"发货时间结束段","type":"string","value":"{{CURRENT_TIME|datetime}}"} ] ``` #### 数据清洗与转换 在获取到原始数据后,需要对其进行清洗和转换,以符合目标系统的要求。例如,可以根据业务需求过滤掉作废的单据: ```json {"field":"del","label":"返回是否作废的单据","type":"string"} ``` 同时,还可以对发货状态进行筛选,仅保留已发货的记录: ```json {"field":"delivery","label":"发货状态","type":"string","value":"1"} ``` #### 实时监控与错误处理 轻易云数据集成平台提供了实时监控功能,可以随时查看数据流动和处理状态。如果在调用接口或处理数据时出现错误,系统会自动记录并通知相关人员,确保问题能够及时解决。 通过上述步骤,我们成功实现了从管易云·奇门获取销售出库单数据,并对其进行清洗和转换。这不仅提高了数据处理效率,还确保了业务流程的透明度和可靠性。在实际应用中,根据具体需求调整元数据配置,可以进一步优化集成效果。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/S20.png~tplv-syqr462i7n-qeasy.image) ### 轻易云数据集成平台生命周期的第二步:ETL转换与写入金蝶云星空API接口 在数据集成过程中,ETL(Extract, Transform, Load)转换是一个关键步骤,它将源平台的数据转换为目标平台能够接收的格式。在本案例中,我们将详细探讨如何使用轻易云数据集成平台,将销售出库单数据从新管易平台转换并写入金蝶云星空API接口。 #### 元数据配置解析 元数据配置是ETL过程中的核心,它定义了如何从源数据中提取信息并转换为目标系统所需的格式。以下是本案例中使用的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 20, "method": "batchArraySave" }, "request": [ {"field":"FStockOrgId","label":"发货组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"200"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"200"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"XSCKD07_SYS"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{code}"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{delivery_statusInfo.delivery_date}}"}, {"field":"FCustomerID","label":"客户","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value": "_findCollection find FNumber from b353fb96-f353-3263-bd21-f418c7d9ca19 where FShopCode={shop_code}"}, {"field":"FPlatformCode","label":"管易平台单号","type":"string","describe":"","value": "{platform_code}"}, {"field": "FAPI", "label": "FAPI", "type": "string", "describe": "文本", "value": "true"}, {"field": "FApproveDate1", "label": "出货日期", "type": "string", "describe": "基础资料", "value": "{modify_date}"}, {"field": "FNote", "label": "备注", "type": "string", "describe": "多行文本"}, {"field": "FOwnerTypeIdHead", "label": "货主类型", "type": "string", "describe": "多类别基础资料列表", "value": "BD_OwnerOrg"}, {"field": "FOwnerIdHead", "label": "货主", "type": "string", "description: " 多类别基础资料 " , " parser " : { "name " : " ConvertObjectParser " , " params " : " FNumber "} , "value " : " 200 "} , {"field " : " SubHeadEntity " , " label " : " 财务信息 " , "type : object , children:[ {"field : FSettleOrgID,label:结算组织,type:string,description:组织,parser:{name:ConvertObjectParser,params:FNumber},value:200,parent:SubHeadEntity} ] }, {"field:FEntity,label:明细信息,type:array,children:[ {"field:FMaterialID,label:物料编码,type:string,description:基础资料,parser:{name:ConvertObjectParser,params:FNumber},value:{{details.item_code}},parent:FEntity}, {"field:FRealQty,label:实发数量,type:string,description:数量,value:{{details.qty}},parent:FEntity}, {"field:FTaxPrice,label:含税单价,type:string,description:单价,value:_function {{details.amount_after}}/{{details.qty}},parent:FEntity}, {"field:FIsFree,label:是否赠品,type:string,description:复选框,value:_function case '{{details.amount_after}}' when '0' then true else false end,parent:FEntity}, {"field:FAllAmount,label:价税合计,type:string,description:金额,value:{{details.amount_after}},parent:FEntity}, {"field:FStockID,label:仓库,type:string,description:基础资料,parser:{name:ConvertObjectParser,params:FNumber},value:{warehouse_code},parent:FEntity}, {"field:FEntrynote,label:备注,type:string,description:text,parent:FEntity} ], "value:"details"} ], otherRequest:[ {"field:"FormId",label:"业务对象表单Id",type:"string",description:"必须填写金蝶的表单ID如:PUR_PurchaseOrder",value:"SAL_OUTSTOCK"}, {"field:"Operation",label:"执行的操作",type:"string",value:"Save"}, {"field:IsAutoSubmitAndAudit,label:"提交并审核",type:"bool",value:true}, {"field:IsVerifyBaseDataField,label:"验证基础资料",type:"bool",description:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)",value:false}, {"field:" SubSystemId,label:" 系统模块,type:" string," description:" 默认仓库模块,value:" 21} , { 'label' : ' 允许负库存' , ' 字段' : ' InterationFlags' , 'type' : ' 字符串' , 'value' : 'STK_InvCheckResult'} ] } ``` #### 数据请求与清洗 在这个阶段,我们首先需要从新管易平台提取销售出库单数据,并进行必要的清洗和预处理。通过配置`request`部分,我们可以定义每个字段如何从源数据中提取,并进行相应的转换。 例如: - `FBillNo`字段直接从源数据中的`code`字段获取。 - `FCustomerID`字段则需要通过复杂查询来获取对应的客户编号。 - `FDate`字段则直接映射到源数据中的`delivery_date`。 这些配置确保了我们能够准确地提取和转换每一个所需的数据字段。 #### 数据转换与写入 在完成数据请求与清洗之后,我们需要将这些处理好的数据按照金蝶云星空API接口要求的格式进行转换,并最终写入目标系统。 1. **批量保存接口调用**:通过配置`api`为`batchSave`,并设置HTTP方法为POST,我们可以批量保存处理后的数据。 2. **操作参数设置**:通过设置`operation`部分,我们定义了批量保存时的一些关键参数,如每次保存的数据行数(`rows`)和保存方法(`method`)。 3. **子对象处理**:对于复杂的数据结构,如财务信息(`SubHeadEntity`)和明细信息(`FEntity`)等,我们通过嵌套子对象来处理。这些子对象中的每个字段都需要根据具体需求进行相应的映射和转换。 例如: - 明细信息中的物料编码(`FMaterialID`)需要从源数据中的`item_code`字段获取,并通过解析器(`ConvertObjectParser`)进行解析。 - 实发数量(`FRealQty`)直接映射到源数据中的数量(`qty`)字段。 - 含税单价(`FTaxPrice`)则需要通过函数计算得到,即总金额除以数量。 4. **其他请求参数**:除了主要的数据字段外,还需要设置一些其他必要的请求参数,如业务对象表单ID (`FormId`)和操作类型 (`Operation`)等。这些参数确保了我们能够正确地调用金蝶云星空API接口,实现所需的数据操作。 #### 实际应用案例 假设我们有一条来自新管易平台的销售出库单,其部分原始数据如下: ```json { "code": "SO20231001", "delivery_statusInfo": { "delivery_date": "2023-10-01" }, "shop_code": "SC12345", "platform_code": "PC67890", "modify_date": "2023-10-02", ... } ``` 根据上述元数据配置,我们可以将其转换为金蝶云星空API接口所需的数据格式: ```json { ... { "FBillNo": "SO20231001", ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... { ... ![钉钉与MES系统接口开发配置](https://pic.qeasy.cloud/T14.png~tplv-syqr462i7n-qeasy.image)