使用数据集成平台实现数据转换并写入金蝶云星空

  • 轻易云集成顾问-吴伟
### 旺店通·企业奇门数据集成到金蝶云星空:查询出库单 在实现旺店通·企业奇门与金蝶云星空的数据集成过程中,高效、准确地完成数据对接是关键。本文将探讨如何通过调用`wdt.stockout.order.query`接口获取出库单,并利用轻易云平台的可视化工具和实时监控特性,将数据可靠、高效地写入至金蝶云星空的`batchSave`接口,实现批量、定时的数据抓取与处理。 为确保整个流程中的每一环节都不出现漏单,首先需要解决分页和限流等技术难题。通过确定高效的请求频率和合理的分页策略,保障从旺店通·企业奇门 API 获取到完整且连续的数据。同时,通过轻易云平台提供的数据处理过程全生命周期管理,提高系统透明度与操作效率,使得业务人员可以直观地了解每个任务节点运行状态,并及时发现并解决可能存在的问题。 实现大量数据快速写入金蝶云星空,需要特别注意两者之间的数据格式差异。在这个案例中,我们使用了灵活配置映射规则的方法,根据实际业务需求对字段进行自定义转换,从而保障数据无缝迁移。同时,为应对异常情况,我们还设计了自动重试机制,以提升系统整体稳定性。 下一部分将详细介绍如何使用轻易云平台配置上述功能和调用相关API,确保出库单记录能够顺畅、安全地从旺店通·企业奇门传输至金蝶云星空。 ![如何开发钉钉API接口](https://pic.qeasy.cloud/D22.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·企业奇门接口获取并加工出库单数据 在数据集成生命周期的第一步,我们需要调用源系统的API接口以获取原始数据。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·企业奇门接口`wdt.stockout.order.query`来查询出库单,并对数据进行初步加工。 #### 接口配置与请求参数 首先,我们需要配置元数据,以便正确调用API接口。以下是关键的元数据配置: ```json { "api": "wdt.stockout.order.query", "method": "POST", "number": "order_no", "id": "stockout_id", "pagination": { "pageSize": 30 }, "idCheck": true, "condition": [ [ {"field":"order_type","logic":"eqv2","value":"2"}, {"field":"status","logic":"ineqv2","value":"5"} ], [ {"field":"order_type","logic":"eqv2","value":"2"}, {"field":"status","logic":"ineqv2","value":"113"} ] ], "request": [ {"field":"start_time","label":"开始时间","type":"string","describe":"按最后修改时间增量获取数据,start_time作为开始时间,格式:yyyy-MM-dd HH:mm:ss","value":"{{LAST_SYNC_TIME|datetime}}"}, {"field":"end_time","label":"结束时间","type":"string","describe":"按最后修改时间增量获取数据,end_time作为结束时间,格式:yyyy-MM-dd HH:mm:ss","value":"{{CURRENT_TIME|datetime}}"}, {"field":"order_type","label":"出库单类型","type":"string","describe":"2调拨出库,3采购退货出库,4盘亏出库,5生产出库,7其他出库,8多发出库,9纠错出库,10保修配件出库,11初始化出库,12jit拣货出库,13委外出库"}, {"field":"status","label":"出库单状态","type":"string","describe":"出库单状态5:已取消,50:待审核,55:已审核,95:已发货,110:已完成(默认查已发货已完成单据),113:异常发货"}, {"field":"warehouse_no","label":"仓库编号","type":"string","describe":"代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置)(不支持一次推送多个仓库编号)"}, {"field":"src_order_no","label":"源单号","type":"string","describe":"源单号"}, {"field":"stockout_no","label":"出库单号","type":"string","describe":"出库单号,传该字段可以不传时间"} ], "otherRequest": [ {"field": "page_size", "label": "分页大小", "type": "string", "describe": "每页返回的数据条数,输入值范围1~100,不传本参数,输入值默认为40,使用举例单击这里", "value": "{PAGINATION_PAGE_SIZE}"}, {"field": "page_no", "label": "页号", "type": "string", "describe": "不传值默认从0页开始", "value": "{PAGINATION_START_PAGE}"} ] } ``` #### 数据请求与清洗 1. **请求参数设置**: - `start_time` 和 `end_time` 用于指定查询时间范围,这两个参数分别取自上次同步时间和当前时间。 - `order_type` 固定为"2",表示调拨出库。 - `status` 排除值为"5"(已取消)和"113"(异常发货),确保查询到有效的订单。 - `warehouse_no`, `src_order_no`, `stockout_no` 等字段根据实际需求可选填。 2. **分页处理**: - 使用 `page_size` 和 `page_no` 参数进行分页,每次请求最多返回30条记录。 3. **条件过滤**: - 配置了两个条件组,每组包含两个条件,用于过滤符合特定条件的订单。 #### 数据转换与写入 在获取到原始数据后,需要对其进行初步清洗和转换,以便后续处理。以下是一些常见的数据清洗步骤: 1. **字段映射**: - 将API返回的数据字段映射到目标系统所需的字段。例如,将 `order_no` 映射为目标系统中的订单编号。 2. **数据类型转换**: - 确保所有日期、数值等字段的数据类型符合目标系统要求。例如,将日期字符串转换为标准日期格式。 3. **去重与校验**: - 根据配置的主键字段如 `stockout_id` 对数据进行去重。 - 校验关键字段是否为空或无效,如订单编号、仓库编号等。 4. **错误处理**: - 对于无法解析或缺失关键字段的数据记录,可以记录日志或发送告警,以便后续人工干预。 通过上述步骤,我们可以高效地从旺店通·企业奇门接口获取并处理出库单数据,为后续的数据集成工作打下坚实基础。 ![打通钉钉数据接口](https://pic.qeasy.cloud/S19.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台进行ETL转换并写入金蝶云星空API接口的技术案例 在数据集成生命周期的第二步中,我们需要将已经集成的源平台数据进行ETL(Extract, Transform, Load)转换,转为目标平台金蝶云星空API接口所能够接收的格式,并最终写入目标平台。以下是一个具体的技术案例,展示如何通过轻易云数据集成平台配置元数据,实现这一过程。 #### 1. 配置API接口元数据 首先,我们需要配置金蝶云星空API接口的元数据。以下是一个典型的元数据配置示例: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 20, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{src_order_no}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"ZJDB10_SYS"}, {"field":"FBizType","label":"业务类型","type":"string","describe":"下拉列表","value":"NORMAL"}, {"field":"FTransferDirect","label":"调拨方向","type":"string","describe":"下拉列表","value":"GENERAL"}, {"field":"FTransferBizType","label":"调拨类型","type":"string","describe":"下拉列表","value":"InnerOrgTransfer"}, {"field":"FSaleOrgId","label":"销售组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FSettleOrgId","label":"结算组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FStockOutOrgId","label":"调出库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"}}, {"field":"FOwnerTypeOutIdHead","label":"调出货主类型","type": "string", "describe": "多类别基础资料列表", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FOwnerOutIdHead", "label": "调出货主", "type": "string", "describe": "多类别基础资料", "parser": {"name": "ConvertObjectParser", "params": "FNumber"}}, {"field": "FStockOrgId", "label": "调入库存组织", "type": "string", "describe": "组织", "parser":{"name" : "ConvertObjectParser" , "params" : "FNumber"}}, {"field" : "FSETTLECURRID" , "label" : "结算币别" , "type" : "string" , "describe" : "基础资料", "parser":{"name" : "ConvertObjectParser" , "params" : "FNumber"}}, {"field" : "FDate", "label" : 日期, "type:" string, describe: 日期}, {"field: FNote, label: 备注, type: string, describe: 多行文本}, { field: FBillEntry, label: 明细信息, type: array, describe: 1, children: [ { field: FMaterialId, label: 物料编码, type: string, describe: 基础资料, parser: { name: ConvertObjectParser, params: FNumber }, value: {{details_list.goods_no}}, parent: FBillEntry }, { field: FCMKBarCode, label: 零售条形码, type: string, describe: 文本, parent: FBillEntry }, { field: FQty, label: 调拨数量, type:string , describe:数量, value:{{details_list.goods_count}},parent:FBillEntry}, { field:FSrcStockId,label:调出仓库,type:string,describe:基础资料,parser:{name:ConvertObjectParser,params:FNumber},value:{src_order_no},parent:FBillEntry}, { field:FSrcStockLocId,label:调出仓位,type:string ,describe维度关联字段,parser:{name:"ConvertObjectParser",params:"FNumber"},parent:"FBillEntry"}, { field:"FDestStockId", label:"调入仓库", type:"string", describe:"基础资料", parser:{ name:"ConvertObjectParser", params:"FNumber"}, value:"CK006", parent:"FBillEntry"}, { field:"FDestStockLocId", label:"调入仓位", type:"string", describe:"维度关联字段", parser:{ name:"ConvertObjectParser", params:"FNumber"}, parent:"FBillEntry"}, { field:"FNoteEntry", label:"备注", type:"string", describe:"多行文本", parent:"FBillEntry"}, { field:"FISFREE", label:"赠品", type:"string", describe:"复选框", parent:"FBillEntry"} ] }, { label :旺店通调拨单号 , field : F_wk_WDTDH , type : string , value :{src_order_no}}, { label :实际调入仓库 , field : F_wk_SJDRCK , type : string , value : KC-001-WDT , parser :{ name : ConvertObjectParser , params : FNumber}}, { label :实际调出仓库 , field : F_wk_SJDCCK , type : string , value :{warehouse_no}, parser :{ name : ConvertObjectParser , params : FNumber}} ], otherRequest:[ { field :"FormId", label :"业务对象表单Id", type :"string", describe :"必须填写金蝶的表单ID如:PUR_PurchaseOrder", value :"STK_TransferDirect" }, { field :"IsAutoSubmitAndAudit", label :"提交并审核", type :"bool", value :"true" }, { field :"IsVerifyBaseDataField", label :"验证基础资料", type :"bool", describe :"是否验证所有的基础资料有效性,布尔类,默认false(非必录)", value :"false" }, { field :"Operation", label :"执行的操作", type :"string", value :"Save" } ] } ``` #### 2. 数据提取与清洗 在ETL过程中,我们首先需要从源系统提取原始数据,并进行必要的数据清洗和预处理。例如,从源系统中提取订单编号、物料编码、数量等信息,并确保这些数据符合目标系统的要求。 #### 3. 数据转换 接下来,我们将清洗后的数据按照金蝶云星空API接口的要求进行转换。通过配置元数据中的`parser`字段,可以实现对特定字段的数据转换。例如,将`src_order_no`转换为目标系统中的`FBillNo`字段,将`details_list.goods_no`转换为`FBillEntry.FMaterialId`字段等。 #### 示例代码 以下是一个简单的数据转换示例: ```python def transform_data(source_data): transformed_data = [] for order in source_data: transformed_order = { 'FBillNo': order['src_order_no'], 'FBillTypeID': {'FNumber': 'ZJDB10_SYS'}, 'FBizType': 'NORMAL', 'FTransferDirect': 'GENERAL', 'FTransferBizType': 'InnerOrgTransfer', 'FSaleOrgId': {'FNumber': order['sale_org_id']}, 'FSettleOrgId': {'FNumber': order['settle_org_id']}, 'FStockOutOrgId': {'FNumber': order['stock_out_org_id']}, 'FOwnerTypeOutIdHead': {'FNumber': order['owner_type_out_id_head']}, 'FOwnerOutIdHead': {'FNumber': order['owner_out_id_head']}, 'FStockOrgId': {'FNumber': order['stock_org_id']}, 'FSETTLECURRID': {'FNumber': order['settle_curr_id']}, 'FDate': order['date'], 'FBillEntry': [ { 'FMaterialId': {'FNumber': detail['goods_no']}, 'FCMKBarCode': detail['barcode'], 'FQty': detail['goods_count'], 'FSrcStockId': {'src_order_no'}, 'FDestStockId': {'CK006'} } for detail in order['details_list'] ], # Additional fields... } transformed_data.append(transformed_order) return transformed_data ``` #### 4. 数据加载 最后,将转换后的数据通过轻易云平台提供的API接口写入到金蝶云星空系统中。我们可以使用HTTP POST请求将数据发送到目标系统: ```python import requests def load_data(transformed_data): url = "<金蝶云星空API地址>" headers = { 'Content-Type': 'application/json' } response = requests.post(url, json=transformed_data, headers=headers) if response.status_code == 200: print("Data loaded successfully") else: print("Failed to load data:", response.text) # 示例调用 source_data = get_source_data() # 从源系统获取原始数据 transformed_data = transform_data(source_data) # 转换数据 load_data(transformed_data) # 加载到目标系统 ``` 通过上述步骤,我们成功地完成了从源系统到金蝶云星空系统的数据ETL过程。每个环节都严格按照元数据配置进行,以确保数据在不同系统之间无缝对接和高效传输。 ![钉钉与WMS系统接口开发配置](https://pic.qeasy.cloud/T15.png~tplv-syqr462i7n-qeasy.image)