金蝶云星空数据对接与实时监控解决方案详解

  • 轻易云集成顾问-黄宏棵
### 旺店通·旗舰奇门数据集成到金蝶云星空的技术实现案例 在企业日常运营中,如何高效地将数据从一个系统集成到另一个系统是至关重要的。本文分享一次成功的数据集成案例——将旺店通·旗舰奇门中的采购入库单数据集成到金蝶云星空中的其他入库单【生产入库】。 #### 技术背景与需求分析 在本次项目中,我们需要借助轻易云数据集成平台,将旺店通·旗舰奇门提供的API接口`wdt.wms.stockin.purchase.querywithdetail`获取的采购入库单详细信息,通过一系列处理和转换后,使用金蝶云星空提供的API接口`batchSave`批量写入目标系统。这要求我们处理好两者之间的数据结构差异、分页和限流问题,同时需确保整个流程稳定可靠,不出现漏单现象。 #### 解决方案要点概述 1. **接口调用与分页处理**: - 使用定时任务机制,可靠抓取旺店通·旗舰奇门接口提供的数据。 - 针对该API可能返回的大量数据,通过分页方式抓取每一页内容,并进行限定速率控制,以防止由于请求过多导致API限流或超时情况发生。 2. **自定义数据转换逻辑**: - 为了适应金蝶云星空的数据格式要求,需要设计特定的数据转换规则。 - 利用可视化的数据流设计工具,对原始数据进行清洗、映射及格式化,以便于下游系统无缝接收并处理这些信息。 3. **实时监控与异常检测**: - 集成过程中,部署了集中式监控和告警体系,全程跟踪每个任务执行状态,并及时捕获潜在异常。 - 通过日志记录功能,实现对各种操作细节的追溯,包括请求参数、返回结果及错误信息等,为进一步调试及优化提供有力支持。 4. **质量保障与重试机制**: - 数据输入输出环节引入质量检查机制,如字段验证、重复校验等,确保每笔交易准确无误。 - 在遇到网络波动或服务暂时不可用情况下,实现自动重试策略以提高整体稳健性和成功率。。 以上方案不仅满足了客户对于精确、高效、安全的数据对接需求,还充分利用轻易云平台优势,提高了业务透明度和管理效率。在下一部分,我们将详细介绍具体步骤,包括如何调用两个关键API以及各类技术细节。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/D39.png~tplv-syqr462i7n-qeasy.image) ### 调用旺店通·旗舰奇门接口获取并加工数据 在数据集成的生命周期中,调用源系统接口是至关重要的一步。本文将详细探讨如何通过轻易云数据集成平台调用旺店通·旗舰奇门接口 `wdt.wms.stockin.purchase.querywithdetail` 获取并加工数据。 #### 接口调用配置 首先,我们需要配置接口的元数据,以便正确地请求和处理数据。以下是该接口的元数据配置: ```json { "api": "wdt.wms.stockin.purchase.querywithdetail", "method": "POST", "number": "order_no", "id": "stockin_id", "idCheck": true, "formatResponse": [ { "old": "remark", "new": "remark_new", "format": "string" } ], "request": [ { "field": "pager", "label": "分页参数", "type": "object", "children": [ { "field": "page_size", "label": "分页大小", "type": "string", "value": "50", "parent": "pager" }, { "field": "page_no", "label": "页号", "type": "string", "value": "1", "parent": "pager" } ] }, { "field": "params", ... ``` #### 请求参数解析 在请求参数部分,我们定义了分页参数和业务参数: - **分页参数**:用于控制每次请求的数据量和页码。 - `page_size`:每页返回的数据条数,设置为50。 - `page_no`:当前请求的页码,初始值为1。 - **业务参数**:用于过滤和查询特定条件下的数据。 - `start_time` 和 `end_time`:分别表示查询的开始时间和结束时间,使用模板变量 `{{LAST_SYNC_TIME|datetime}}` 和 `{{CURRENT_TIME|datetime}}` 动态赋值。 - `status`:入库单状态,设置为80表示已完成状态。 - `warehouse_no`, `stockin_no`, `purchase_no`:分别表示仓库编号、入库单号和采购单号,用于进一步过滤查询结果。 #### 数据请求与清洗 在发送请求后,我们需要对返回的数据进行清洗和格式化。元数据配置中的 `formatResponse` 字段定义了需要格式化的字段: ```json [ { ... { old: 'remark', new: 'remark_new', format: 'string' } ] ``` 这里我们将返回结果中的 `remark` 字段重命名为 `remark_new` 并转换为字符串格式。这一步确保了数据的一致性和可读性。 #### 异常处理与重试机制 在实际操作中,网络波动或接口异常可能导致请求失败。为了提高系统的稳定性,我们可以实现异常处理与重试机制。例如,当请求失败时,可以记录错误日志并尝试重新发送请求,直到成功或达到最大重试次数。 #### 数据转换与写入 在获取并清洗数据后,下一步是将其转换为目标系统所需的格式,并写入到目标系统中。在这个案例中,我们将从旺店通获取的采购入库单信息转换为金蝶系统中的其他入库单信息。这一步通常涉及字段映射、数据类型转换等操作。 通过上述步骤,我们实现了从旺店通·旗舰奇门接口获取并加工采购入库单数据,并准备好将其集成到目标系统中。这一过程不仅提高了数据处理的效率,还确保了数据的一致性和准确性。 ![如何开发用友BIP接口](https://pic.qeasy.cloud/S1.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将旺店通采购入库单转换并写入金蝶云星空API接口 在数据集成过程中,ETL(Extract, Transform, Load)是关键步骤之一。本文将详细介绍如何使用轻易云数据集成平台,将旺店通的采购入库单数据转换为金蝶云星空API接口可接收的格式,并最终写入目标平台。 #### 1. 数据请求与清洗 首先,通过轻易云平台从源系统(旺店通)请求采购入库单数据,并进行必要的数据清洗。这一步确保了数据的准确性和一致性,为后续的ETL转换奠定基础。 #### 2. 数据转换与写入 在完成初步的数据清洗后,我们进入生命周期的第二步:数据转换与写入。以下是具体的元数据配置及其应用。 ##### 元数据配置解析 ```json { "api": "batchSave", "method": "POST", "idCheck": true, "operation": { "rowsKey": "array", "rows": 1, "method": "batchArraySave" }, "request": [ {"field":"FBillNo","label":"单据编号","type":"string","describe":"单据编号","value":"{order_no}"}, {"field":"FBillTypeID","label":"单据类型","type":"string","describe":"单据类型","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"QTRKD05_SYS"}, {"field":"FStockOrgId","label":"库存组织","type":"string","describe":"组织","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100.01"}, {"field":"FStockDirect","label":"库存方向","type":"string","value":"GENERAL"}, {"field":"FDate","label":"日期","type":"string","describe":"日期","value":"{{check_time|datetime}}"}, {"field":"FOwnerTypeIdHead","label":"货主类型","type":"string","describe":"多类别基础资料列表","value":"BD_OwnerOrg"}, {"field":"FOwnerIdHead","label":"货主","type":"string","describe":"多类别基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"100.01"}, {"field":"FDEPTID","label":"部门","type":"string","describe":"基础资料","parser":{"name":"ConvertObjectParser","params":"FNumber"},"value":"BM000133"}, {"field": "FNOTE", "label": "备注", "type": "string", "describe": "多行文本", "value": "{remark}"}, { "field": "FEntity", "label": "明细信息", "type": "array", "children": [ {"field": "FMATERIALID", "label": "物料编码", "type": "string", "describe": "基础资料", "parser":{"name": "ConvertObjectParser", "params": "FNumber"}, "value": "{{details_list.goods_no}}", "parent": "FEntity" }, {"field": "FSTOCKID", "label": "收货仓库", "type": "string", "describe": "基础资料", "parser":{ "name": "ConvertObjectParser", "params": "FNumber" }, value: "{warehouse_no}", parent: FEntity }, { field: FQty, label: 实收数量, type: string, describe: 数量, value: {{details_list.num}}, parent: FEntity }, { field: FEntryNote, label: 备注, type: string, describe: 多行文本, value: {{details_list.remark}}, parent: FEntity }, { parent: FEntity, label: 库存状态, field: FSTOCKSTATUSID, type: string, value: KCZT01_SYS, parser:{ name: ConvertObjectParser, params: FNumber }}, { field: FBASEQTY, label: 基本数量, type: float, value: {{details_list.num}} }, { field: FOWNERTYPEID, label: 货主类型, type: string, value: BD_OwnerOrg }, { field: FOWNERID, label: 货主, type: string, value: 100.01, parser:{ name: ConvertObjectParser, params: FNumber }}, { field: FKEEPERTYPEID, label: 保管者类型, type: string, value: BD_KeeperOrg }, { field:FKEEPERID,label:"保管者",type:"string",value:"100.01",parser:{name:"ConvertObjectParser",params:"FNumber"}}],"value": details_list}], otherRequest:[{field:"FormId",label:"业务对象表单Id",type:"string",describe:"必须填写金蝶的表单ID如:PUR_PurchaseOrder",value:"STK_MISCELLANEOUS"}, {field:IsVerifyBaseDataField,label:"验证基础资料",type:"bool",describe:"是否验证所有的基础资料有效性,布尔类,默认false(非必录)",value:true}, {field:"Operation",label:"执行的操作",type:string,value:"Save"}, {field:IsAutoSubmitAndAudit,label:"提交并审核",type:"bool",value:true}, {field:"InterationFlags,label:“可以负库存”, type:string,value:“STK_InvCheckResult”}] } ``` ##### 配置解读 1. **基本字段映射** - `FBillNo`: 单据编号,直接映射自`order_no`。 - `FBillTypeID`: 单据类型,固定值`QTRKD05_SYS`。 - `FStockOrgId`: 库存组织,固定值`100.01`。 - `FDate`: 日期,通过模板变量`{{check_time|datetime}}`进行时间格式转换。 2. **复杂字段映射** - `FOwnerTypeIdHead`和`FOwnerIdHead`: 分别表示货主类型和货主,使用固定值和解析器进行处理。 - `FEntity`: 明细信息数组,其中包含多个子字段,如物料编码、收货仓库、实收数量等。这些子字段通过模板变量和解析器进行动态映射。 3. **其他请求参数** - `FormId`: 固定值`STK_MISCELLANEOUS`,表示业务对象表单Id。 - `IsVerifyBaseDataField`: 布尔值,表示是否验证所有基础资料有效性。 - `Operation`: 固定操作为`Save`。 - `IsAutoSubmitAndAudit`: 布尔值,表示是否自动提交并审核。 ##### 数据转换示例 假设我们从旺店通获取到如下原始数据: ```json { order_no: 'PO123456', check_time:'2023-10-01T12:00:00Z', remark:'测试备注', details_list:[ { goods_no:'G001', num:'10', remark:'物料备注', warehouse_no:'WH001' } ] } ``` 通过上述元数据配置,我们将其转换为金蝶云星空API接口所需的格式: ```json { FormId:'STK_MISCELLANEOUS', IsVerifyBaseDataField:true, Operation:'Save', IsAutoSubmitAndAudit:true, InterationFlags:'STK_InvCheckResult', array:[ { FBillNo:'PO123456', FBillTypeID:{'FNumber':'QTRKD05_SYS'}, FStockOrgId:{'FNumber':'100.01'}, FStockDirect:'GENERAL', FDate:'2023-10-01T12:00:00Z', FOwnerTypeIdHead:'BD_OwnerOrg', FOwnerIdHead:{'FNumber':'100.01'}, DEPTID:{'BM000133'}, NOTE:'测试备注', Entity:[ { FMATERIALID:{'G001'}, STOCKID:{'WH001'}, Qty:'10', EntryNote:'物料备注' } ] } ] } ``` #### 写入目标平台 最后,通过HTTP POST请求,将上述转换后的JSON数据发送至金蝶云星空API接口,实现数据的最终写入。 ```python import requests url = 'https://api.kingdee.com/batchSave' headers = {'Content-Type': 'application/json'} data = { # 上述转换后的JSON数据 } response = requests.post(url,data=json.dumps(data),headers=headers) if response.status_code ==200: print('数据成功写入金蝶云星空') else: print('写入失败',response.text) ``` 通过以上步骤,我们成功地将旺店通采购入库单的数据转换为金蝶云星空API接口可接收的格式,并实现了最终的数据写入。这不仅提升了系统间的数据流转效率,也确保了业务流程的顺畅运行。 ![金蝶与外部系统打通接口](https://pic.qeasy.cloud/T25.png~tplv-syqr462i7n-qeasy.image)