--[[ 编码: GK-API-06 名称: 出库单创建接口 作者: yuanfeng 日期: 2025-7-24 入口函数: Outbound_Sync 功能说明: 1. 接收上游系统的入库任务XML数据 2. 检查入库单是否已存在 3. 创建Outbound_Order主表和Outbound_Detail子表记录 4. 返回处理结果 更新 2025-07-12 V1.1 新增出库单主表,state 默认为 "定版" 输入XML示例: --]] wms_base = require("wms_base") xml = require("oi_base_xml") xml2lua = require("xml2lua") -- 创建出库单主表记录 local function create_outbound_order(strLuaDEID, order_data) local nRet1, CONST_FACTORY = wms_base.Get_sConst2("WMS_Default_Factory") -- 默认工厂标识 local nRet2, CONST_WH = wms_base.Get_sConst2("WMS_Default_Warehouse") if nRet1 ~= 0 or nRet2 ~= 0 then return 1, "获取工厂或仓库常量失败" end local order = m3.AllocObject(strLuaDEID, "Outbound_Order") order.no = order_data.taskId order.bs_type = order_data.taskType order.bs_no = order_data.orderNo order.wave_no = order_data.waveId order.op_date = order_data.orderDate order.priority = order_data.priority order.note = order_data.memo or "" order.wh_code = CONST_WH order.area_code = "" order.factory = CONST_FACTORY -- 新增出库单主表状态字段 order.state = "定版" -- 新增货主编码 order.storer = order_data.storerId -- 新增源单号 order.source_no = order_data.sourceBillNo -- lua.DebugEx(strLuaDEID, "预创建出库单主表", order) local nRet, result = m3.CreateDataObj(strLuaDEID, order) return nRet, result end -- 创建出库单明细记录 -- @param:item_date 是传入的物料明细实体数据 -- @param:order_data 传入出库单主表实体数据 local function create_outbound_detail(strLuaDEID, order_no, item_data, order_data) local detail = m3.AllocObject(strLuaDEID, "Outbound_Detail") -- 明细表字段映射 detail.oo_no = order_no detail.storer = order_data.storerId detail.owner = order_data.ownerId detail.bs_row_no = item_data.orderItemId -- 订单行号 detail.item_code = item_data.skuId detail.item_state = item_data.skuStatus detail.qty = lua.Get_NumAttrValue(item_data.qty) detail.batch_no = item_data.produceCode detail.wms_bn = item_data.batchNo detail.prd_date = item_data.productDate detail.exp_date = item_data.expiryDate detail.udf01 = item_data.registerNo or "" detail.udf02 = item_data.cid or "" -- lua.DebugEx(strLuaDEID, "预创建出库单明细", detail) local nRet, result = m3.CreateDataObj(strLuaDEID, detail) return nRet, result end function Outbound_Sync(strLuaDEID) local nRet, strRetInfo, err_msg local soap_xml, parsed_data, task_data, input_params, task_tb, order_no local strCondition, id, task_items local isStop = 0 local err = {} local items = {} m3.PrintLuaDEInfo(strLuaDEID) local result = { flag = "success", code = "0", message = "成功" } -- lua.Debug(strLuaDEID, debug.getinfo(1), "出库单数据:", result) -- 1. 获取接口输入数据 nRet, soap_xml = mobox.getCurEditDataPacket(strLuaDEID) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "无法获取数据包: " .. soap_xml) result.flag = "failure" result.code = "1" result.message = "无法获取数据包: " goto api_call_return -- return end -- 2. 解析XML nRet, parsed_data = xml.parse(soap_xml) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "接口输入的XML格式非法!") result.flag = "failure" result.code = "2" result.message = "接口输入的XML格式非法: " goto api_call_return -- return end -- 3. 提取任务数据 task_data = parsed_data.Envelope.Body.InTaskCreationReq.TaskCreation_Input input_params = task_data.InputParameters task_tb = input_params.TaskCreation_TB -- 4. 检查出库单是否已存在 order_no = task_tb.taskId strCondition = string.format("S_NO = '%s'", order_no) nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr(strLuaDEID, "Outbound_Order", strCondition) -- lua.Debug(strLuaDEID, debug.getinfo(1), "查询出来的出库单数据:", strRetInfo) if nRet > 1 then result.flag = "failure" result.code = "3" result.message = "检查出库单是否存在时出错: " .. strRetInfo goto api_call_return elseif nRet == 0 then result.flag = "failure" result.code = "4" result.message = "出库单已存在 " goto api_call_return end -- 5. 创建出库单主表 nRet, strRetInfo = create_outbound_order(strLuaDEID, task_tb) if nRet ~= 0 then -- lua.Stop(strLuaDEID, "创建出库单主表失败:" .. strRetInfo) result.flag = "failure" result.code = "5" result.message = "创建出库单主表失败:" .. strRetInfo isStop = 3 goto api_call_return -- return end -- 6. 处理明细数据 task_items = task_tb.TaskCreation_TB_ITEM -- 情况2:多条明细(数组形式) if task_items[1] ~= nil then items = task_items -- 情况3:单条明细(非数组形式) else items = {task_items} end for i, item in ipairs(items) do nRet, strRetInfo = create_outbound_detail(strLuaDEID, order_no, item, task_tb) if nRet ~= 0 then err_msg = string.format("创建出库单明细失败(行号:%d): %s", item.orderItemId, strRetInfo) result.flag = "failure" result.code = "5" result.message = err_msg isStop = 3 goto api_call_return end end ::api_call_return:: -- 7. 返回处理结果 -- local result = { -- flag = nErr > 0 and "failure" or "success", -- code = nErr, -- message = nErr > 0 and table.concat(err, "; ") or "成功", -- } local xml_result = xml.json_to_xml(result, "response") mobox.returnValue(strLuaDEID, 0, xml_result, isStop) -- m3.EPI_Return(strLuaDEID, result) -- ApiReturn(strLuaDEID, 0, result, isStop) end