--[[ 编码: GK-API-001 名称: 盘点计划同步 作者: HAN 日期: 2025-1-29 入口函数: SKU_Sync 来源项目: 国科项目 功能说明: 1. 接收来自上游系统的 XML 格式数据,并解析该数据, 创建SKU及SKU_UPC SIMPLIFIED CHINESE 0 KH32803017 CGKHTY 螺旋刀片式髓内钉 螺旋刀片式股骨近端髓内钉10×170 JGDⅥ φ10×170 1 1 2 3 1 1 0 A KH-创伤 常温 small 50 更改记录: V2.0 HAN 20250402 代码规范 V2.1 Yuanfeng 1. 统一了返回结果格式,使用Create_result函数创建标准化的返回结构 2. 优化了代码结构 --]] wms_base = require("wms_base") xml = require("oi_base_xml") mobox = require("OILua_JavelinExt") m3 = require("oi_base_mobox") -- 创建统一返回结果 function Create_result(flag, code, msg, error) return { flag = flag or "success", code = code or "0", message = msg or "", error = error or "" } end local function create_sku_upc(strLuaDEID, storer, item_code, upc_code) local nRet, strRetInfo if (upc_code == '' or upc_code == nil) then return 0 end -- 创建SKU_UPC local sku_upc = m3.AllocObject(strLuaDEID, "SKU_UPC") sku_upc.storer = storer sku_upc.item_code = item_code sku_upc.upc_code = upc_code nRet, strRetInfo = m3.CreateDataObj(strLuaDEID, sku_upc) return nRet, strRetInfo end local function create_sku(strLuaDEID, sku_input_data) local nRet, strRetInfo local err_msg = '' -- 分配SKU对象 local sku = m3.AllocObject(strLuaDEID, "SKU") sku.item_code = sku_input_data.skuId sku.storer = sku_input_data.storerId sku.short_name = sku_input_data.skuName sku.item_name = sku_input_data.skuDec sku.spec = sku_input_data.spec sku.udf01 = sku_input_data.packageCode sku.udf02 = sku_input_data.packageQty sku.unit = sku_input_data.goodsUnit sku.long = lua.Get_NumAttrValue(sku_input_data.length) sku.middle = lua.Get_NumAttrValue(sku_input_data.width) sku.short = lua.Get_NumAttrValue(sku_input_data.height) sku.abc_type = sku_input_data.abcType sku.is_life_mgt = (sku_input_data.isBatchMgr == "1" and 'Y') or 'N' sku.is_sn_mgt = (sku_input_data.isSnMgr == "1" and 'Y') or 'N' sku.udf03 = sku_input_data.isSnStorageMgr sku.img_url = sku_input_data.imgUrl sku.cell_type = sku_input_data.cidtype sku.prod_line = sku_input_data.productLine sku.udf04 = sku_input_data.storageConditions sku.item_type = sku_input_data.skuType sku.loading_limit = lua.Get_NumAttrValue(sku_input_data.maxCount) -- 检查SKU是否已存在 local id local strCondition = "S_ITEM_CODE = '" .. sku.item_code .. "' AND S_STORER = '" .. sku.storer .. "'" nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr(strLuaDEID, "SKU", strCondition) if nRet > 1 then return 1, "检查SKU是否存在时失败: " .. strRetInfo end if nRet == 1 then -- SKU不存在,创建新SKU nRet, strRetInfo = m3.CreateDataObj(strLuaDEID, sku) if nRet ~= 0 then return 1, "创建SKU失败: " .. strRetInfo .. " skuId = " .. sku_input_data.skuId end else -- SKU已存在,更新属性 local update_sku_obj = {{ id = id, attrs = {{ attr = "S_ITEM_NAME", value = sku.item_name }, { attr = "S_SPEC", value = sku.spec }, { attr = "S_ITEM_TYPE", value = sku.item_type }, { attr = "S_UNIT", value = sku.unit }, { attr = "S_SHORT_NAME", value = sku.short_name }, { attr = "S_ABCTYPE", value = sku.abc_type }, { attr = "C_ISSNMGT", value = sku.is_sn_mgt }, { attr = "C_ISLIFEMGT", value = sku.is_life_mgt }, { attr = "S_IMG_URL", value = sku.img_url }, { attr = "S_CELL_TYPE", value = sku.cell_type }, { attr = "S_PROD_LINE", value = sku.prod_line }, { attr = "N_LOADING_LIMIT", value = sku.loading_limit }, { attr = "F_LONG", value = sku.long }, { attr = "F_MIDDLE", value = sku.middle }, { attr = "F_SHORT", value = sku.short }, { attr = "S_UDF01", value = sku.udf01 }, { attr = "S_UDF02", value = sku.udf02 }, { attr = "S_UDF03", value = sku.udf03 }, { attr = "S_UDF04", value = sku.udf04 }} }} nRet, strRetInfo = mobox.updateDataObj(strLuaDEID, "SKU", lua.table2str(update_sku_obj)) if nRet ~= 0 then return 1, "更新SKU属性失败: " .. strRetInfo end end -- 处理SKU_UPC local upc_codes = {sku_input_data.sptm, sku_input_data.barcode1, sku_input_data.barcode2, sku_input_data.barcode3, sku_input_data.barcode_pk} for _, upc_code in ipairs(upc_codes) do if upc_code and upc_code ~= '' then nRet, strRetInfo = create_sku_upc(strLuaDEID, sku.storer, sku.item_code, upc_code) if nRet ~= 0 then return 1, "创建SKU_UPC失败: " .. strRetInfo .. " UPC: " .. upc_code end end end return 0 end function SKU_Sync(strLuaDEID) -- 1. 获取xml数据包 local nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID) if nRet ~= 0 then FinalRes = Create_result("failure", "201", "无法获取数据包: " .. soap_xml) lua.Stop(strLuaDEID, "获取数据包失败", FinalRes) return end -- 2. 解析xml local nRet, parsed_data = xml.parse(soap_xml) if nRet ~= 0 then FinalRes = Create_result("failure", "202", "xml格式非法") lua.Stop(strLuaDEID, "xml格式非法", FinalRes) return end -- 3. 提取SKU数据 local sku_data = parsed_data.Envelope.Body.inCommodityReq.COMMODITY_Input.InputParameters.COMMODITY_TB if not sku_data or not sku_data.COMMODITY_TB_ITEM then FinalRes = Create_result("failure", "203", "xml数据格式错误,缺少COMMODITY_TB_ITEM") lua.Stop(strLuaDEID, "xml数据格式错误", FinalRes) return end -- 4. 统一处理:确保sku_items是数组(即使只有一个SKU) local sku_items = sku_data.COMMODITY_TB_ITEM if sku_items[1] == nil then sku_items = {sku_items} end -- 5. 遍历所有SKU数据 local FinalRes = Create_result() for i = 1, #sku_items do local sku_item = sku_items[i] -- 创建SKU及其UPC local nRet, err_msg = create_sku(strLuaDEID, sku_item) if nRet ~= 0 then -- 记录警告日志 wms_base.Warning(strLuaDEID, 1, 601, err_msg, "从GK-WMS系统同步SKU信息") -- 设置错误结果并停止处理 FinalRes = Create_result("failure", "204", "SKU同步失败", err_msg) lua.Stop(strLuaDEID, "SKU同步失败: " .. sku_item.skuId, FinalRes) return end end -- 6. 返回成功 local xml_result = xml.json_to_xml(FinalRes, "response") mobox.returnValue(strLuaDEID, 0, xml_result, 0) end