金蝶云到旺店通的数据处理与错误重试机制详解

  • 轻易云集成顾问-曾平安
### 金蝶云星空数据集成到旺店通·企业奇门的实践:组装-委外仓子项出库 在系统集成咨询项目中,如何高效地管理和集成不同平台之间的数据一直是一个关键问题。本次案例分享将聚焦于金蝶云星空与旺店通·企业奇门两大系统的无缝对接,以实现“组装-委外仓子项出库”业务场景的数据流转。 首先,在数据获取阶段,我们利用金蝶云星空提供的API `executeBillQuery` 实现精确抓取所需数据。此接口不仅支持定时自动化调用,还能有效处理分页和限流问题,确保数据获取稳定可靠。在这一过程中,通过配置轻易云平台的实时监控与日志记录功能,保证了每个批次请求都得到了验证和追踪,从而避免漏单或重复抓取的问题。 紧接着,对从金蝶云星空取得的大量原始数据进行结构化转换,以适应目标系统——旺店通·企业奇门的格式要求。这一步骤尤为关键,因为两个系统之间存在显著的数据格式差异,需要通过自定义映射规则来确保平滑过渡。此外,为了提升写入效率,我们采用批量操作策略,将整理后的多条记录快速、高效地写入到旺店通·企业奇门 API `wdt.vip.wms.stockinout.order.push` 中,从而完成最后的数据落地。 值得一提的是,在整个过程中我们特别关注对异常情况的处理。任何一次交互失败,都可能影响业务流程的连续性。因此,我们设计了一套完善的错误重试机制。当出现网络波动或者服务器响应延迟等异常情况时,可以自动重新发起请求,并进行恢复性校验,从根本上提高整体过程中的容错能力。 本文开头部分简要介绍了我们在实施这个具体案例中的一些技术要点及其解决方案。下一步会详细阐述各个环节中的具体配置方法及实际操作步骤,帮助大家在类似场景中应用这些经验,实现精准、可靠、高效的数据集成。 ![用友BIP接口开发配置](https://pic.qeasy.cloud/D3.png~tplv-syqr462i7n-qeasy.image) ### 调用金蝶云星空接口executeBillQuery获取并加工数据 在数据集成生命周期的第一步,我们需要调用源系统金蝶云星空接口`executeBillQuery`来获取并加工数据。本文将详细探讨如何通过轻易云数据集成平台配置元数据,完成这一关键步骤。 #### 接口调用配置 首先,我们需要配置API调用的基本信息。根据提供的元数据配置,我们使用POST方法调用`executeBillQuery`接口。以下是具体的配置参数: ```json { "api": "executeBillQuery", "method": "POST", "number": "FBillNo", "id": "FSubEntity_FDetailID", "pagination": { "pageSize": 500 }, "idCheck": true, "request": [ {"field":"FID","label":"实体主键","type":"string","value":"FID"}, {"field":"FBillNo","label":"单据编号","type":"string","value":"FBillNo"}, {"field":"FDocumentStatus","label":"单据状态","type":"string","value":"FDocumentStatus"}, {"field":"FStockOrgId_FNumber","label":"库存组织","type":"string","value":"FStockOrgId.FNumber"}, {"field":"FDate","label":"日期","type":"string","value":"FDate"}, {"field":"FBillTypeID","label":"单据类型","type":"string","value":"FBillTypeID"}, {"field":"FOwnerTypeIdHead","label":"成品货主类型","type":"string","value":"FOwnerTypeIdHead"}, {"field":"FOwnerIdHead_FNumber","label":"成品货主","type":"string","value":"FOwnerIdHead.FNumber"}, {"field":"FAffairType","label":"事务类型","type":"string","value":"FAffairType"}, {"field":"FEE","label":"费用","type":"string","value":"FEE"}, {"field":"FDeptID_FNumber","label":"部门","type":"string","value":"FDeptID.FNumber"}, {"field":"FNote","label":"","备注"type:""string,""value:""FNote}, {"field:""FCreateDate,""label:""创建日期,""type:""string,""value:""FCreateDate}, {"field:""FModifyDate,""label:""最后修改日期,""type:""string,""value:""FModifyDate}, {"field:""FAPPROVEDATE,""label:""审核日期,""type:""string,""value:""FAPPROVEDATE}, {"field:""FCANCELDATE,""label:"作废日期,""type:""字符串,""值:""FCANCELDATE}, {“字段”: “FCANCELSTATUS”,“标签”: “作废状态”,“类型”: “字符串”,“值”: “FCANCELSTATUS”}, {“字段”: “子件货主类型”,“标签”: “子件货主类型”,“类型”: “字符串”,“值”: “子件货主类型”}, {“字段”: “子件货主”,“标签”: “子件货主”,“类型”: “字符串”,“值”: “子件货主”}, {“字段”: “物料编码”,“标签”: “物料编码”,“类型:”“字符串”,”“值:”“物料编码”}, {“字段”:“物料条码”,“标签”:“物料条码”,“类型”:“字符串”,“值”:“物料条码”}, {“字段”:“单位”,“标签”:“单位”,“类型”:“字符串”,“值”:“单位”}, {“字段”:数量,“标签”:数量,“类型”:字符串,“值”:数量}, {字段:成本拆分比例,标签:成本拆分比例,类型:字符串,值:成本拆分比例}, {字段:仓库,标签:仓库,类型:字符串,值:仓库}, {字段:库存状态,标签:库存状态,类型:字符串,值:库存状态}, {字段:备注,标签:备注,类型:字符串,值:备注}, {字段:计划跟踪号,标签:计划跟踪号,类型:字符串,值:计划跟踪号}, {字段:项目编号,标签:项目编号,类型:字符串,值:项目编号}, {字段:货主类型,标签:货主类型,类型:字符串,值:货主类型}, {字段:货主,标签:货主,类型:字符串,值:货主}, {字段:保管者类型,标签:保管者类型, 类型:“ 字符串 ” , 值:“ 保管者 类型 ” } , { 字段:“ 保管者 ” , 标签:“ 保管者 ” , 类型:“ 字符串 ” , 值:“ 保管者 ” } , { 字段:“ 成本价 ” , 标签:“ 成本价 ” , 类型:“ 字符串 ” , 值:“ 成本价 ” } , { 字段:“ 总成本 ” , 标签:“ 总成本 ” , 类型:“ 字符串 ” , 值:“ 总成本 ” } , { 字段:“ 批号 ” , 标签:“ 批号 ” , 类型:“ 字符串 ” , 值:“ 批号 ” } , { 字段:“生产日期”, 标签:“生产日期”, 类型:“字符串”, 值:“生产日期” }, { 字段:“有效期至”, 标签:“有效期至”, 类型:“字符串”, 值:“有效期至” } ], 其他请求:[{" field ":" Limit "," label ":" 最大行数 "," type ":" string "," describe ":" 金蝶的查询分页参数 "," value ":" PAGINATION_PAGE_SIZE "} ,{" field ":" StartRow "," label ":" 开始行索引 "," type ":" string "," describe ":" 金蝶的查询分页参数 "," value ":" PAGINATION_START_ROW "} ,{" field ":" TopRowCount "," label ":" 返回总行数 "," type ":" int "," describe ":" 金蝶的查询分页参数 "} ,{" field ":" FilterString "," label ":" 过滤条件 "," type :" string "," describe :" 示例写法 FSupplierId.FNumber = 'VEN00010' and FApproveDate>= ',' value ':' FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and FAFFAIRTYPE = 'Assembly' and FStockIDSETY.FNumber='39' "} ,{" field :" FieldKeys "," label :" 需查询的字段key集合 ", " type ": array ", " describe ": 金蝶分录主键ID格式:FPOOrderEntry_FEntryId,其它格式 FPurchaseOrgId.FNumber ", parser :{" name ": ArrayToString ", params :", "} },{" field ": FormId ", label ": 业务对象表单Id ", type ": string ", describe ": 必须填写金蝶的表单ID如:PUR_PurchaseOrder ", value ": STK_AssembledApp "} ,{" field ": FBillNo ", label ": FBillNo ", type ": string "} ], condition_bk:[[{" field ":" FDescriptionSETY "," logic ":" eqv2 "," value ": null }] ,[{" field1 ":" logic1 "=" eqv2 "=" value1 "=" null },{" field1 "=" logic1 "=" eqv2 "=" value1 "=" null }] ,[{" field1 "=" logic1 "=" eqv2 "=" value1 "=" null }] } ``` #### 数据请求与清洗 在进行数据请求时,我们需要特别注意分页参数和过滤条件。分页参数确保我们能够逐页获取大量数据,而过滤条件则帮助我们精确定位所需的数据。例如: - `Limit`: 设置每次请求返回的最大行数。 - `StartRow`: 设置开始行索引,用于分页。 - `FilterString`: 设置过滤条件,例如`FSupplierId.FNumber = 'VEN00010' and FApproveDate>='{{LAST_SYNC_TIME|datetime}}' and FAFFAIRTYPE = 'Assembly' and FStockIDSETY.FNumber='39'`。 这些参数确保我们能够高效地从金蝶云星空系统中提取所需的数据。 #### 数据转换与写入 在获取到原始数据后,我们需要对其进行必要的转换和清洗,以便后续处理。例如,可以将日期格式统一转换为ISO标准格式,将金额统一转换为小数点后两位等。这些操作可以通过轻易云平台提供的数据处理工具实现。 以下是一个简单的数据清洗示例: ```python def clean_data(data): for record in data: # 转换日期格式 record['FDate'] = convert_to_iso(record['FDate']) # 转换金额格式 record['FAmountSETY'] = round(float(record['FAmountSETY']), 2) return data def convert_to_iso(date_str): # 假设date_str格式为YYYY-MM-DD,将其转换为ISO标准格式 return date_str + 'T00:00:00Z' ``` 通过上述步骤,我们可以确保从金蝶云星空系统中提取的数据符合我们的业务需求,并且可以无缝集成到目标系统中。 #### 实时监控与日志记录 为了确保数据集成过程的透明度和可追溯性,我们需要对每次API调用进行实时监控和日志记录。这可以通过轻易云平台提供的监控工具实现。例如,可以记录每次API调用的请求参数、响应时间、返回结果等信息,以便在出现问题时能够快速定位和解决。 ```json { "logLevel": "INFO", "logMessage": { "api": "executeBillQuery", "requestParams": {...}, "responseTime": "...", "responseData": {...} } } ``` 通过以上技术手段,我们能够高效、可靠地完成从金蝶云星空系统获取并加工数据,为后续的数据处理和业务决策提供坚实的数据基础。 ![金蝶与SCM系统接口开发配置](https://pic.qeasy.cloud/S12.png~tplv-syqr462i7n-qeasy.image) ### 使用轻易云数据集成平台将源平台数据转换为旺店通·企业奇门API格式并写入 在数据集成的生命周期中,第二步是将已经集成的源平台数据进行ETL转换,并转为目标平台所能接收的格式。本文将详细探讨如何使用轻易云数据集成平台,将源平台的数据转换为旺店通·企业奇门API接口所能接收的格式,并最终写入目标平台。 #### 元数据配置解析 我们需要将源平台的数据按照旺店通·企业奇门API接口`wdt.vip.wms.stockinout.order.push`的要求进行转换。以下是该接口的元数据配置: ```json { "api": "wdt.vip.wms.stockinout.order.push", "effect": "EXECUTE", "method": "POST", "idCheck": true, "request": [ {"field": "api_outer_no", "label": "接口外部单号", "type": "string", "value": "{FBillNo}"}, {"field": "outer_no", "label": "接口外部单号", "type": "string", "describe": "调用本接口时推送的唯一单据编号,避免重复推送数据", "value": "{FBillNo}"}, {"field": "warehouse_no", "label": "仓库编号", "type": "string", "describe": "代表仓库所有属性的唯一编码,用于仓库区分,ERP内支持自定义(ERP仓库界面设置);本接口仓库编号对应的仓库类型必须为委外仓类型。【例如: 3京东仓储 4科捷 5百世物流 6 SKU360 7通天晓 8中联网仓 9顺丰仓储 10网仓2号 11奇门仓储 12旺店通仓储 13心怡仓储 14力威仓储 15京东沧海 16云集仓储 】】","value":"{FStockIDSETY_FNumber}"}, {"field": "order_type", "label": "出入类型", "type": "string", "describe": "可选值:1(出库);2(入库)","value":"2"}, {"field":"contact","label":"联系人","type":"string","describe":"联系人姓名","value":"1"}, {"field":"auto_check","label":"自动审核","type":"string","describe":"1.自动审核 0.不自动审核 默认1","value":"1"}, { "field":"goods_list", "label":"goods_list", "type":"array", "describe":"入库单货品列表节点", "value":"FSubEntity", "children":[ {"field":"spec_no","label":"商家编码","type":"string","describe":"ERP内单品唯一编码(SKU),代表单品(SKU)所有属性,并且为库存量出入计算最小单元。SKU概念介绍,单击这里,","value":"{{FSubEntity.FMaterialIDSETY_FNumber}}"}, {"field":"num","label":"入库数量","type":"string","describe":"入库数量","value":"{{FSubEntity.FQtySETY}}"}, {"field":"position_no","label":"货位编号","type":"string","describe":"商品在仓库内的位置编号,不传此参数,读ERP配置【入库开单货位优先级配置】,来决定取默认货位、上一次入库货位、ZANCUN货位其中一个货位。"}, {"field":"price","label":"价格","type":"string","describe":"委外出入库货品价格"}, {"field":"batch_no","label":"批次","type":"string","describe":"货品批次编号(需要传客户端中存在的批次编号)"}, {"field":"remark","label":"备注","type":"string","describe":"货品明细备注"} ] } ], ... } ``` #### 数据转换过程 1. **字段映射**: - `api_outer_no` 和 `outer_no` 都映射到 `{FBillNo}`,即源平台中的订单编号。 - `warehouse_no` 映射到 `{FStockIDSETY_FNumber}`,即源平台中的仓库编号。 - `order_type` 固定值为 `"2"`,表示入库操作。 - `contact` 固定值为 `"1"`。 - `auto_check` 固定值为 `"1"`。 2. **数组字段处理**: - `goods_list` 是一个数组字段,需要对每个子项进行处理。子项包括: - `spec_no` 映射到 `{{FSubEntity.FMaterialIDSETY_FNumber}}`,即SKU编码。 - `num` 映射到 `{{FSubEntity.FQtySETY}}`,即入库数量。 - `position_no`, `price`, `batch_no`, 和 `remark` 等字段可以根据需要从源数据中提取或设置默认值。 3. **请求体构建**: 根据上述映射关系,我们可以构建请求体: ```json { ... { api_outer_no: "{FBillNo}", outer_no: "{FBillNo}", warehouse_no: "{FStockIDSETY_FNumber}", order_type: '2', contact: '1', auto_check: '1', goods_list: [ { spec_no: "{{FSubEntity.FMaterialIDSETY_FNumber}}", num: "{{FSubEntity.FQtySETY}}" // position_no, price, batch_no, remark 等字段根据实际需求添加 } // 更多子项... ] } } ``` #### 数据写入目标平台 通过轻易云数据集成平台,我们可以使用其提供的全异步和多种异构系统支持功能,将构建好的请求体发送到旺店通·企业奇门API接口。具体操作步骤如下: 1. **配置API请求**: 在轻易云平台上配置API请求,包括URL、请求方法(POST)、请求头和请求体等。 2. **发送请求**: 使用轻易云的数据流管理功能,将构建好的请求体发送到目标API接口,并监控其执行状态。 3. **错误处理与重试机制**: 配置错误处理和重试机制,以确保在网络故障或其他异常情况下能够自动重试,提高数据传输的可靠性。 通过上述步骤,我们能够高效地将源平台的数据转换并写入到旺店通·企业奇门API接口,从而实现不同系统间的数据无缝对接和业务流程自动化。 ![企业微信与ERP系统接口开发配置](https://pic.qeasy.cloud/T7.png~tplv-syqr462i7n-qeasy.image)