ETL转换:将用友BIP数据同步至旺店通企业奇门

  • 轻易云集成顾问-谢楷斌
### 案例分享:用友BIP数据集成到旺店通·企业奇门的调拨单同步 在现代电商环境中,高效的数据集成与实时监控对于确保业务流畅运营至关重要。本文将介绍一个实际案例,即如何利用轻易云数据集成平台,将用友BIP系统中的调拨单数据高效、可靠地同步到旺店通·企业奇门系统,实现跨平台的数据无缝对接。 #### 用友BIP获取调拨单数据 首先,通过调用用友BIP提供的API接口`/yonbip/scm/transferapply/list`来抓取调拨单数据。为了确保不漏单,我们设计了一套定时任务机制,定期从用友BIP中批量获取最新的调拨申请。这一过程中,用到了轻易云支持高吞吐量的数据写入能力,使得大量订单能够快速被处理,并上传至旺店通·企业奇门。 #### 数据转换与格式映射 由于用友BIP与旺店通·企业奇门之间存在着一定的数据格式差异,因此需要使用自定义的数据转换逻辑和可视化的数据流设计工具,对获取到的原始数据进行适配和转换。例如,需特定字段进行重新命名或值类型调整,以符合目标方API `wdt.stock.transfer.push` 的要求。 #### 异常处理与监控告警 在整个对接过程中,为应对可能出现的异常情况,如接口限流、分页问题等,我们实现了自动重试机制,并结合集中式监控和告警系统,实时跟踪每个集成任务的状态和性能。一旦发现异常,会立即上报并触发相应处置措施,从而保障整个流程稳定运作。此外,针对关键节点还配置了详细日志记录功能,以便后续审查和问题排查。 通过上述步骤,不仅实现了多平台间的信息互联,还大幅提升了整体业务效率,为物流管理提供了有力支撑。在下一篇内容中,将进一步阐述具体实施细节以及扩展应用场景。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/D24.png~tplv-syqr462i7n-qeasy.image) ### 调用用友BIP接口获取并加工调拨单数据 在数据集成过程中,调用源系统的API接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用用友BIP接口`/yonbip/scm/transferapply/list`,获取并加工调拨单数据。 #### 接口调用配置 首先,我们需要配置API接口的基本信息和请求参数。以下是元数据配置中的关键部分: ```json { "api": "/yonbip/scm/transferapply/list", "method": "POST", "number": "code", "id": "transferApplys_id", "idCheck": true, "request": [ {"field":"pageSize","label":"每页显示数据数","type":"string","value":"100"}, {"field":"code","label":"单据编号","type":"string"}, {"field":"pageIndex","label":"当前页数","type":"string","value":"1"}, {"field":"open_vouchdate_begin","label":"单据开始日期","type":"string"}, {"field":"open_vouchdate_end","label":"单据结束日期","type":"string"}, {"field":"inwarehouse","label":"调入仓库id","type":"string"}, {"field":"bustype","label":"交易类型id","type":"string"}, {"field":"outorg","label":"调出组织id","type":"string"}, {"field":"inorg","label":"调入组织id","type":"string"}, {"field":"outwarehouse","label":"调出仓库id","type":"string"}, {"field":"outdepartment","label":"调出部门id","type":"string"}, {"field":"indepartment","label":"调入部门id","type":"string"}, {"field":"outbizperson","label":"调出业务员id","type":"string"}, {"field":"inbizperson","label":"调入业务员id","type":"string"}, {"field": "status", "label": "单据状态", "type": "string", "value": "1"} ] } ``` #### 请求参数详解 在配置请求参数时,需要特别注意以下几个字段: - `pageSize`:每页显示的数据数量,默认值为100。 - `pageIndex`:当前页数,默认值为1。 - `code`:单据编号,可以根据具体需求进行设置。 - `open_vouchdate_begin` 和 `open_vouchdate_end`:用于指定查询的时间范围。 - `status`:单据状态,默认值为1(已审核)。 这些参数可以灵活调整,以满足不同的查询需求。 #### 数据格式化与转换 在获取到原始数据后,需要对其进行格式化和转换。元数据配置中定义了响应数据的格式化规则: ```json { "formatResponse": [ {"old": "id", "new": "new_id", "format": "string"}, {"old": "transferApplys_id", "new": "new_transferApplys_id", "format": "string"}, {"old": "inwarehouse", "new": "new_inwarehouse", "format": "string"}, {"old": "outwarehouse", "new": "new_outwarehouse", "format": "string"} ] } ``` 这些规则确保了从源系统获取的数据能够按照目标系统的要求进行转换。例如,将字段`id`重命名为`new_id`,并将其格式化为字符串类型。 #### 条件过滤与逻辑处理 为了实现更精确的数据筛选,可以使用条件过滤和逻辑处理。以下是元数据配置中的条件过滤示例: ```json { "condition_bk":[ [{"field": "bustype_name", "logic": "in", "value": ["同主体调拨", "调拨"]}] ], "condition":[ [{"field": "bustype", "logic": "in", "value": ["1480261131563434062", "1819609435381694473"]}] ] } ``` 这些条件过滤器可以帮助我们在请求时仅获取符合特定条件的数据,从而提高查询效率和准确性。 #### 实际应用案例 假设我们需要获取最近一天内所有已审核的调拨单,并且只关心特定交易类型的数据。可以通过以下方式设置请求参数: ```json { ... { field: 'open_vouchdate_begin', value: '2023-10-01 00:00:00' }, { field: 'open_vouchdate_end', value: '2023-10-01 23:59:59' }, { field: 'status', value: '1' }, ... } ``` 通过这种方式,我们可以确保只获取到符合条件的最新数据,并且通过前述的格式化规则,将其转换为目标系统所需的格式。 综上所述,通过轻易云数据集成平台调用用友BIP接口,并结合元数据配置中的请求参数、响应格式化和条件过滤等功能,可以高效地实现不同系统间的数据无缝对接。这不仅提升了业务透明度,还极大地提高了整体工作效率。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/S25.png~tplv-syqr462i7n-qeasy.image) ### 调拨单同步至旺店通·企业奇门API接口的ETL转换与写入 在数据集成的生命周期中,ETL(提取、转换、加载)是关键步骤之一。在本案例中,我们将详细探讨如何将已经集成的源平台数据进行ETL转换,并转为旺店通·企业奇门API接口所能够接收的格式,最终写入目标平台。 #### 元数据配置解析 元数据配置是实现数据转换和写入的核心。以下是对提供的元数据配置进行详细解析: ```json { "api": "wdt.stock.transfer.push", "method": "POST", "idCheck": true, "operation": { "method": "merge", "field": "code", "bodyName": "detail_list", "header": ["code", "outwarehouse_name", "inwarehouse_name", "new_outwarehouse", "new_inwarehouse", "memo", "bustype_name"], "body": ["product_cCode", "qty"] }, "request": [ {"field":"outer_no","label":"外部单号","type":"string","describe":"外部单据唯一标识,用于避免同一数据重复推送","value":"{code}"}, {"field":"from_warehouse_no","label":"源仓库","type":"string","describe":"货品被调出的仓库","value":"_findCollection find omsOutWarehouse from fa193860-6aa8-37a8-b996-a856e9a8a96f where ysOutWarehouse={new_outwarehouse} mappingType=3"}, {"field":"to_warehouse_no","label":"目标仓库","type":"string","describe":"货品被调入的仓库","value":"_findCollection find omsInWarehouse from fa193860-6aa8-37a8-b996-a856e9a8a96f where ysInWarehouse={new_inwarehouse} mappingType=3"}, {"field":"telno","label":"联系电话","type":"string","describe":"联系电话"}, {"field":"remark","label":"备注","type":"string","describe":"备注","value":"YS{bustype_name}{memo}"}, {"field":"transfer_type","label":"调拨类型","type":"string","describe":"0:分步调拨,1:快速调拨,默认是1"}, {"field":"mode","label":"调拨方式","type":"string","describe":"0:单品调拨,1:货位调拨;默认是0"}, {"field":"autocheck","label":"是否审核","type":"string","describe":"1:审核,0:不审核,默认为0","value":"1"}, { "field": "skus", "label": "货品列表节点", "type": "array", "describe": "调拨单货品列表节点", "children": [ {"field": "spec_no", "label": "商家编码", "type": "string", "describe": "ERP内单品唯一编码(SKU),代表单品(SKU)所有属性,并且为库存量出入计算最小单元。SKU概念介绍,单击这里,", "value": "{{detail_list.product_cCode}}", "parent": "skus" }, {"field": "from_position_no", "label": "调出货位", "type": "string", "describe": "调出货位(当mode为1时,必传),不传值读ERP配置【入库开单货位优先级配置】,取默认货位、上一次入库货位、ZANCUN货位其中一个货位。", "parent": "skus" }, {"field": "to_position_no", "label": "调入货位", "type": "string", "describe": "调出货位(当mode为1时,必传),不传值读ERP配置【入库开单货位优先级配置】,取默认货位、上一次入库货位、ZANCUN货位其中一个货位。", "parent": "skus" }, {"field": "num", "label": "调拨数量", "type": "string", "value": "{{detail_list.qty}}", ], }, { field: transfer_info, label: 调拨单信息, type: string, ``` #### 数据请求与清洗 在ETL过程中,首先需要从源系统请求并清洗数据。根据元数据配置中的`request`部分,我们需要获取以下字段: - `outer_no` (外部单号) - `from_warehouse_no` (源仓库) - `to_warehouse_no` (目标仓库) - `telno` (联系电话) - `remark` (备注) - `transfer_type` (调拨类型) - `mode` (调拨方式) - `autocheck` (是否审核) 这些字段通过不同的方法和映射规则从源系统中提取。例如: ```json { field: 'from_warehouse_no', value: '_findCollection find omsOutWarehouse from fa193860-6aa8-37a8-b996-a856e9a8a96f where ysOutWarehouse={new_outwarehouse} mappingType=3' } ``` 这段代码表示通过特定查询语句从源系统中查找并获取对应的仓库编号。 #### 数据转换 在清洗完数据后,需要将其转换为目标平台所需的格式。这一步骤主要依赖于元数据中的`operation`部分: ```json { method: 'merge', field: 'code', bodyName: 'detail_list', header: ['code', 'outwarehouse_name', 'inwarehouse_name', 'new_outwarehouse', 'new_inwarehouse', 'memo', 'bustype_name'], body: ['product_cCode', 'qty'] } ``` 这里定义了如何将多个字段合并成一个结构化的数据对象。例如,将每个产品的编码和数量合并到一个名为`detail_list`的数组中。 #### 数据写入 最后一步是将转换后的数据写入到目标平台,即旺店通·企业奇门API接口。在元数据配置中,通过定义API接口和请求方法来实现: ```json { api: 'wdt.stock.transfer.push', method: 'POST' } ``` 同时,还需要构建请求体,其中包含所有必要的数据字段及其对应值,例如: ```json { outer_no: '{code}', from_warehouse_no: '_findCollection find omsOutWarehouse ...', to_warehouse_no: '_findCollection find omsInWarehouse ...', telno: '{telno}', remark: 'YS{bustype_name}{memo}', transfer_type: '1', mode: '0', autocheck: '1', skus: [ { spec_no: '{{detail_list.product_cCode}}', num: '{{detail_list.qty}}' } ] } ``` 通过HTTP POST请求,将构建好的JSON对象发送到目标API接口,实现数据写入。 #### 实践案例 假设我们有以下源系统中的原始数据: ```json { code: 'T12345', new_outwarehouse: 'WH001', new_inwarehouse: 'WH002', bustype_name: 'Normal Transfer', memo: 'Urgent order', detail_list:[ {product_cCode:'P001', qty:'10'}, {product_cCode:'P002', qty:'20'} ] } ``` 经过ETL处理后,生成如下格式的数据对象,并通过POST请求发送至旺店通·企业奇门API接口: ```json { outer_no:'T12345', from_warehouse_no:'WH001_MAPPED_VALUE', to_warehouse_no:'WH002_MAPPED_VALUE', telno:'', remark:'YSNormal TransferUrgent order', transfer_type:'1', mode:'0', autocheck:'1', skus:[ {spec_no:'P001', num:'10'}, {spec_no:'P002', num:'20'} ] } ``` 以上就是完整的ETL过程,从源系统提取、清洗、转换,再到最终写入目标平台。通过这种方式,可以确保不同系统间的数据无缝对接,实现高效的数据集成。 ![用友与WMS系统接口开发配置](https://pic.qeasy.cloud/T26.png~tplv-syqr462i7n-qeasy.image)