--[[
|
编码: 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
|