实现旺店通·旗舰奇门与金蝶云星空系统对接的技术方案

  • 轻易云集成顾问-杨嫦
### 旺店通·旗舰奇门数据集成到金蝶云星空案例分享:14-采购退料单集成方案 在本技术案例中,我们将介绍如何将旺店通·旗舰奇门的数据高效、准确地集成到金蝶云星空,以实现企业内部跨系统的数据同步,特别是针对`14-采购退料单集成方案`。这个方案的核心在于,通过可靠且高效的接口调用和数据处理机制,确保从旺店通获取的采购退料单能够顺利写入金蝶云星空,实现两大系统间无缝对接。 首先,为了保证集成过程中不漏单,我们采用定时任务来抓取旺店通·旗舰奇门接口(`wdt.wms.stockout.purchasereturn.querywithdetail`)上的最新数据,并通过批量处理方式,将大量采购退料单快速写入到金蝶云星空,有效提高了数据传输效率。此外,由于两个系统之间存在分页和限流问题,我们特别设计了一套分页查询与重试机制,以确保每次执行都能完整且准确地拉取需要的数据。 随后,在处理两大系统间的数据格式差异时,利用轻易云提供的灵活映射工具,对接收自旺店通的数据进行清洗和变换,使其符合金蝶云星空所需的字段规范。在最后一步,通过调用金蝶云星空的批量保存API(`batchSave`),我们实现了稳定、高性能的数据写入操作,并设置详细日志记录对整个流程进行实时监控,一旦出现异常能够立刻触发错误重试机制,从而保障业务连续性。 以上便是在本次技术案例中涉及的一些关键点与解决方案,以下章节将进一步深入剖析各技术环节中的具体实施细节及代码示例。 ![用友与外部系统接口集成开发](https://pic.qeasy.cloud/D21.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·旗舰奇门接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将深入探讨如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口`wdt.wms.stockout.purchasereturn.querywithdetail`获取并加工数据。 #### 接口配置与请求参数 首先,我们需要配置接口的元数据。根据提供的元数据配置,我们可以看到接口采用POST方法,主要参数包括查询参数和分页信息。 ##### 查询参数 查询参数是一个对象,包含以下字段: - `status`: 出库单状态,值为由逗号分隔的整数数组。例如:`110`表示已完成状态。 - `stockout_no`: 出库单号。 - `out_start_time`: 开始时间(出库时间),格式为日期时间。如果没有出库单号或采购退货单号,则为必填项。 - `warehouse_no`: 仓库编号,仅限普通仓库。 - `src_order_no`: 采购退货单号。 - `out_end_time`: 结束时间(出库时间),格式为日期时间,与开始时间相同。 - `create_start_time`: 开始时间(出库单创建时间),如果没有出库单号或采购退货单号,则为必填项。 - `create_end_time`: 结束时间(出库单创建时间),格式与开始时间相同。 - `position`: 是否按货位分组,等于0为否,不等于0为是,不填默认为否。 例如,我们可以构建如下请求体: ```json { "params": { "status": "110", "out_start_time": "{{LAST_SYNC_TIME|datetime}}", "out_end_time": "{{CURRENT_TIME|datetime}}", "warehouse_no": "WH001", "src_order_no": "TLSQ123456" }, "pager": { "page_size": "50", "page_no": "1" } } ``` #### 数据处理与转换 在获取到数据后,需要对其进行处理和转换。根据元数据配置中的`formatResponse`字段,我们需要将返回结果中的`remark`字段重命名为`remark_new`,并确保其类型为字符串。 假设API返回的数据如下: ```json { "data": [ { "stockout_id": "1001", "order_no": "ORD12345", "remark": "This is a remark." } ] } ``` 我们需要将其转换为: ```json { "data": [ { "stockout_id": "1001", "order_no": "ORD12345", "remark_new": "This is a remark." } ] } ``` #### 条件过滤 根据元数据配置中的条件过滤部分,我们需要确保返回的数据中`src_order_no`字段包含"TLSQ"。这可以通过在数据清洗阶段添加相应的过滤逻辑来实现。 例如: ```python def filter_data(data): return [item for item in data if 'TLSQ' in item['src_order_no']] ``` #### 实现步骤 1. **构建请求体**:根据元数据配置构建请求体,包括查询参数和分页信息。 2. **发送请求**:使用POST方法调用接口,并获取返回结果。 3. **处理响应**:对响应结果进行字段重命名和类型转换。 4. **过滤数据**:根据条件过滤掉不符合要求的数据。 通过以上步骤,我们可以高效地从旺店通·旗舰奇门系统中获取所需的采购退料单数据,并进行必要的加工处理,为后续的数据写入和分析打下坚实基础。 ![打通钉钉数据接口](https://pic.qeasy.cloud/S17.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将采购退料单数据转换并写入金蝶云星空API接口 在数据集成的生命周期中,将已经集成的源平台数据进行ETL转换,并转为目标平台所能接收的格式是至关重要的一步。本文将详细探讨如何使用轻易云数据集成平台,将采购退料单的数据转换为金蝶云星空API接口能够接收的格式,并最终写入目标平台。 #### 配置元数据 首先,我们需要配置元数据,以便正确地映射和转换数据。以下是针对金蝶云星空API接口的元数据配置: ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据编号","value":"TLD01_SYS","parser":{"name":"ConvertObjectParser","params":"FNumber"},"mapping":"62f0717f3478746037329413","mappingDirection":"positive"}, {"field":"FBusinessType","label":"业务类型","type":"string","describe":"业务类型","value":"CG"}, {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"}, {"field":"FDate","label":"退料日期","type":"string","describe":"日期","value":"{{consign_time|datetime}}"}, {"field":"FStockOrgId","label":"退料组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"106"}, {"field":"FPurchaseOrgId","label":"采购组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"106"}, {"field":"FSupplierID","label":"供应商","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"{provider_no}"}, {"field": "FDESCRIPTION", "label": "备注", "type": "string", "describe": "多行文本"}, {"field": "FMRMODE", "label": "退料方式", "type": "string", "describe": "多行文本", "value": "A"}, {"field": "FDELIVERYNO", "label": "送货单号", "type": "string", "describe": "文本"}, {"field": "FCARRYNO", "label": "运输单号", "type": "string", "describe": "文本"}, {"field": "FTAKEDELIVERYNO", "label": "提货单号", "type": “string”, “describe”: “文本”}, { “field”: “FPURMRBENTRY”, “label”: “明细信息”, “type”: “array”, “describe”: “明细信息”, “children”: [ {“field”: “FMATERIALID”, “label”: “物料编码”, “type”: “string”, “describe”: “基础资料”,“parser”:{“name”:"ConvertObjectParser","params":“FNumber”},“value”:"{{details_list.goods_no}}”,“parent”:"FPURMRBENTRY”}, {“field”:"FBarcode","label":"零售条形码","type":"string","describe":"文本","parent":"FPURMRBENTRY”}, {“field”:"FRMREALQTY","label":"实退数量","type":"string","describe":"数量",“value”: "{{details_list.goods_count}}”,“parent”:"FPURMRBENTRY”}, {“field”:"FREPLENISHQTY","label":"补料数量","type":"string",“parent”:"FPURMRBENTRY”}, {“field”:"FKEAPAMTQTY","label":"扣款数量",“parent”: FPURMRBENTRY”, {“field”: FSTOCKID”, label: 仓库”, type: string”, describe: 基础资料”, parser: name: ConvertObjectParser, params: FNumber), value: _findCollection find FNumber from 9c02adb6-7e63-326e-b5b3-dea634490062 where F_KD_WDTSTOCK={warehouse_no}, parent: FPURMRBENTRY” { field: FNOTE, label: 备注, type: string, describe: 文本, parent: FPURMRBENTRY }, { field: FPrice, label: 单价, type: string, describe: 单价, parent: FPURMRBENTRY }, { field: FGiveAway, label: 是否赠品, type: string, describe: 复选框, parent: FPURMRBENTRY }, { field: FOWNERID, label: 货主, type: string, describe: 多类别基础资料, parser:{ name:"ConvertObjectParser", params:"FNumber"}, value:"106", parent:"FPURMRBENTRY"}, { field: FOWNERTYPEID,label:"货主类型", type:"string", describe:"多类别基础资料列表,value:"BD_OwnerOrg,parent:"FPURMRBENTRY"} { field:FENTRYTAXRATE,label:"税率,type:string,value:"13,parent:"FPURMRBENTRY"} { field:FREPLENISHQTY,label:"补料数量,type:string,parent:"FPURMRBENTRY"} { field:FKEAPAMTQTY,label:"扣款数量,type:string,parent:"FPURMRBENTRY"} { field:FSTOCKID,label:"仓库,type:string,value:_findCollection find FNumber from 9c02adb6-7e63-326e-b5b3-dea634490062 where F_KD_WDTSTOCK={warehouse_no},parent:"FPURMRBENTRY"} { field:FNOTE,label:"备注,type:string,parent:"FPURMRBENTRY"} { field:FPrice,label:“单价,type:string,parent:“FPURMRBENTRY} { field:“FGiveAway,label:“是否赠品,type:“string,parent:“FPURMRBENTRY} { field:“FPURMRBENTRY_Link, label:“关联关系表, type:“array, parent:“FPURMRBENTRY, children:[ { field:“FPURMRBENTRY_Link_FRuleId, label:“转换规则, type:“string, value:“PUR_MRAPP-PUR_MRB, parent:“FPURMRBENTRY_Link }, { field:“FPURMRBENTRY_Link_FSTableName, label:“源单表, type:“string, value:“T_PUR_MRAPPENTRY, parent:“FPURMRBENTRY_Link }, { field:“FPURMRM_ENTRY_LINK_FSBillId", label:“源单内码", type:“_function left({remark_new},6)", parent:“FPUMRBENTR_LINK } ] } ], value:“details_list” } ], otherRequest:[ { field:“FormId", label:“业务对象表单Id", type:“string", describe:“必须填写金蝶的表单ID如:PUP_PurchaseOrder", value:“PUR_MRB" }, { filed:“Operation", label:“执行的操作", type:“sting", value;batchSave" }, { filed:IsAutoSubmitAndAudit, label;提交并审核, type;bool, value;true }, { filed:IsVerifyBaseDataField, lable;验证基础资料, type;bool, describe;是否验证所有的基础资料有效性,布尔类,默认false(非必录), value:false }, { filed;SubSystemId, lable;系统模块, type;sting, describe;默认仓库模块 value;21 } ] } ``` #### 数据请求与清洗 在进行ETL转换之前,首先需要从源系统请求数据,并对其进行清洗。这一步骤确保了数据的一致性和准确性。例如,我们可以通过API请求获取采购退料单的数据,并使用轻易云的数据清洗工具对其进行标准化处理。 #### 数据转换与写入 接下来,我们进入关键步骤——将清洗后的数据进行转换,并通过金蝶云星空API接口写入目标系统。以下是具体操作步骤: 1. **映射字段**:根据元数据配置,将源系统中的字段映射到金蝶云星空API所需的字段。例如,将`order_no`映射到`FBillNo`,将`consign_time`映射到`FDate`等。 2. **解析复杂字段**:对于一些复杂字段,如多层嵌套的数组,需要使用特定的解析器(如`ConvertObjectParser`)来处理。例如,将物料编码(`goods_no`)解析为金蝶系统能够识别的格式。 3. **构建请求体**:根据映射和解析结果,构建API请求体。确保所有必填字段都已正确填充,并且格式符合金蝶云星空API要求。 4. **发送请求**:使用HTTP POST方法,将构建好的请求体发送到金蝶云星空API接口。确保设置正确的URL和Header信息,以保证请求成功。 5. **处理响应**:接收并处理API响应,根据返回结果判断操作是否成功。如果失败,需要记录错误信息并进行相应处理。 以下是一个简化示例代码,用于发送POST请求: ```python import requests url = 'https://api.kingdee.com/kdcloud/batchSave' headers = {'Content-Type': 'application/json'} data = { # 构建好的请求体,根据元数据配置填充 } response = requests.post(url, headers=headers, json=data) if response.status_code == 200: print('Data successfully written to Kingdee Cloud') else: print(f'Failed to write data. Status code: {response.status_code}, Response: {response.text}') ``` 通过以上步骤,我们实现了从源系统到目标系统的数据无缝对接,确保了数据的一致性和准确性。这不仅提高了业务流程的效率,还增强了系统间的数据透明度和可追溯性。 ![如何对接用友BIP接口](https://pic.qeasy.cloud/T24.png~tplv-syqr462i7n-qeasy.image)