--[[
|
编码: JX-24-16
|
名称: 出库单-拣料箱绑定界面-确定
|
作者:
|
日期:2025-1-29
|
|
函数: main
|
功能:
|
-- 创建出库波次,把拣货箱绑定到 出库单
|
|
更改记录:
|
V2.0 HAN 20241024
|
参数改成从 m3.GetSysInputParameter( strLuaDEID ) 获取
|
一个出库单也形成出库波次
|
V3.0 HAN 20241026
|
触发一个后台 WFP 进行配盘操作
|
--]]
|
wms_base = require ("wms_base")
|
|
function main( strLuaDEID )
|
local nRet, strRetInfo
|
local parameter
|
nRet, parameter = m3.GetSysInputParameter( strLuaDEID )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "m3.GetSysInputParameter 失败! "..parameter ) end
|
|
lua.Debug( strLuaDEID, debug.getinfo(1), "parameter", parameter )
|
|
local total_qty = 0 -- 货品种类
|
local ipa_item_list = {} -- 预分配库存时用到
|
local sum_detail_list = parameter.o_detail_list
|
local bWave = false
|
local compose = parameter.wave_compose
|
local wh_code = parameter.wh_code
|
local area_code = parameter.area_code
|
local station = parameter.station
|
local exit_loc = parameter.exit_loc
|
local login = parameter.login
|
local user_name = parameter.user_name
|
local nCount = #compose
|
|
nRet, strRetInfo = mobox.getCurEditDataObjAttr( strLuaDEID, "PickingBoxCode", "PickingBoxNum" )
|
local input_value = json.decode( strRetInfo )
|
local picking_box_codes = lua.Get_StrAttrValue( input_value[1].value )
|
if ( picking_box_codes == '' ) then
|
mobox.stopProgram( strLuaDEID, "必须绑定拣料箱!")
|
return
|
end
|
-- 拣料箱数量
|
local picking_box_num = lua.Get_NumAttrValue( input_value[2].value )
|
if ( picking_box_num <= 0 ) then
|
mobox.stopProgram( strLuaDEID, "拣料箱数量不合法!")
|
return
|
end
|
|
local pick_box_code_array = lua.split( picking_box_codes, ";" )
|
if ( #pick_box_code_array ~= picking_box_num ) then
|
mobox.stopProgram( strLuaDEID, "绑定的拣料箱数量必须="..picking_box_num)
|
return
|
end
|
|
local good_type_num = #sum_detail_list
|
-- 【step1】 申请分配量,判断库存量是否够出库
|
for n = 1, good_type_num do
|
local ipa_item = {
|
N_ROW_NO = n,
|
S_ITEM_CODE = sum_detail_list[n].item_code,
|
S_ITEM_NAME = sum_detail_list[n].item_name,
|
F_QTY = sum_detail_list[n].qty
|
}
|
table.insert( ipa_item_list, ipa_item )
|
end
|
-- IPA 库存量分配开始
|
nRet, strRetInfo = wms.wms_IPA_Start( wh_code, "", lua.table2str(ipa_item_list) )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "wms_IPA_Start 失败!"..strRetInfo ) end
|
local success, ret_info
|
success, ret_info = pcall( json.decode, strRetInfo )
|
if ( success == false ) then
|
mobox.setInfo( strLuaDEID, "wms_IPA_Start 返回值不正确! --> "..strRetInfo )
|
return
|
end
|
if ( ret_info.trans_id == "" ) then
|
-- 缺件
|
-- 这里加一个HTML弹框
|
mobox.setInfo( strLuaDEID, "缺件! --> "..lua.table2str( ret_info.oos_info ) )
|
return
|
end
|
local ipa_transid = ret_info.trans_id
|
|
|
-- 【step2】 初始化出库货品清单 item_list
|
local item_list = {}
|
local obj_attrs
|
|
-- 生成要出库的货品链表 item_list
|
for n = 1, good_type_num do
|
local item = {
|
item_code = sum_detail_list[n].item_code,
|
item_name = sum_detail_list[n].item_name,
|
volume = sum_detail_list[n].volume,
|
weight = sum_detail_list[n].weight,
|
cell_type = sum_detail_list[n].cell_type,
|
qty = sum_detail_list[n].qty,
|
alloc_qty = 0,
|
cntr_cell_list = {},
|
ok = false -- true 表示这个货品已经配完货
|
}
|
table.insert( item_list, item )
|
end
|
|
-- 【step3】 如果是波次出库,系统生成出库波次对象(需要用波次号区锁定容器)
|
local strUpdateSql
|
local oo_no_set = {}
|
local wave_detail
|
local wave
|
|
-- 创建出库波次
|
wave = m3.AllocObject(strLuaDEID,"Outbound_Wave")
|
wave.wh_code = wh_code
|
wave.area_code = area_code
|
wave.station = station
|
wave.operator_name = user_name
|
wave.operator = login
|
wave.good_type_num = parameter.good_type_num
|
wave.total_qty = parameter.total_qty
|
wave.picking_box_num = parameter.picking_box_num
|
|
nRet, wave = m3.CreateDataObj( strLuaDEID, wave )
|
if ( nRet ~= 0 ) then
|
wms.wms_IPA_Abort( ipa_transid )
|
lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次】对象失败!'..wave )
|
end
|
|
-- 创建出库波次组成
|
local nCurCodeIndex = 1 -- 拣料箱编码游标
|
local pick_box_code
|
local m
|
local pickbox_index = 1
|
-- compose 是组成波次的出库单的一些基础信息
|
-- nCount 出库单数量,创建波次组成
|
for n = 1, nCount do
|
table.insert( oo_no_set, compose[n].oo_no )
|
|
local ow_compose = m3.AllocObject(strLuaDEID,"OW_Compose")
|
ow_compose.oo_no = compose[n].oo_no
|
ow_compose.wave_no = wave.wave_no
|
nRet, strRetInfo = m3.CreateDataObj( strLuaDEID, ow_compose )
|
if ( nRet ~= 0 ) then
|
wms.wms_IPA_Abort( ipa_transid )
|
lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次组成】对象失败!'..strRetInfo )
|
end
|
|
-- 获取和该出库单进行绑定的拣料箱编码
|
pick_box_code = ''
|
for m = 1, compose[n].pick_box_num do
|
if (pick_box_code ~= '') then
|
pick_box_code = pick_box_code..";"
|
end
|
pick_box_code = pick_box_code..pick_box_code_array[pickbox_index]
|
pickbox_index = pickbox_index + 1
|
end
|
strUpdateSql = "S_WAVE_NO = '"..wave.wave_no.."', S_STATION_NO = '"..wave.station.."', S_OPERATOR_NAME = '"..wave.operator_name.."',"
|
-- 更新【出库单】状态, 并且把拣料箱绑定
|
-- N_B_STATE = 1 表示出库单已经配货
|
strUpdateSql = strUpdateSql.."S_OPERATOR = '"..wave.operator.."', N_B_STATE = 1, S_PICK_BOX_CODE = '"..pick_box_code.."'"
|
strCondition = "S_NO = '"..compose[n].oo_no.."'"
|
nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Outbound_Order", strCondition, strUpdateSql )
|
if ( nRet ~= 0 ) then
|
wms.wms_IPA_Abort( ipa_transid )
|
lua.Error( strLuaDEID, debug.getinfo(1), "更新【出库单】信息失败!"..strRetInfo )
|
end
|
end
|
|
-- 创建出库波次明细
|
for n = 1, #sum_detail_list do
|
wave_detail = m3.AllocObject(strLuaDEID,"OW_Detail")
|
wave_detail.wave_no = wave.wave_no
|
wave_detail.row_no = n
|
wave_detail.item_code = sum_detail_list[n].item_code
|
wave_detail.item_name = sum_detail_list[n].item_name
|
wave_detail.qty = sum_detail_list[n].qty
|
wave_detail.weight = sum_detail_list[n].weight
|
wave_detail.volume = sum_detail_list[n].volume
|
nRet, strRetInfo = m3.CreateDataObj( strLuaDEID, wave_detail )
|
if ( nRet ~= 0 ) then
|
wms.wms_IPA_Abort( ipa_transid )
|
lua.Error( strLuaDEID, debug.getinfo(1), '创建【出库波次明细】对象失败!'..strRetInfo )
|
end
|
end
|
|
-- 需要清空 拣料箱中的货品明细 CG_Detail
|
local in_cntr_code = ''
|
for n = 1, #pick_box_code_array do
|
in_cntr_code = in_cntr_code.."'"..pick_box_code_array[n].."',"
|
end
|
in_cntr_code = lua.trim_laster_char( in_cntr_code ) -- 取消最后一个,号
|
strCondition = "S_CNTR_CODE IN ("..in_cntr_code..")"
|
|
lua.Debug( strLuaDEID, debug.getinfo(1), "清除拣料箱CG_Detail--->", strCondition )
|
|
nRet, strRetInfo = mobox.dbdeleteData(strLuaDEID, "CG_Detail", strCondition)
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "删除【CG_Detail】失败!"..strRetInfo) end
|
|
-- 新增一个后台处理,让后台程序进行自动配盘
|
local add_wfp = {
|
wfp_type = 1, -- 触发数据对象事件(指定数据对象标识)
|
cls = "Outbound_Wave",
|
obj_id = wave.id,
|
obj_name = "波次号'"..wave.wave_no.."'-->自动配盘",
|
trigger_event = "自动配盘"
|
}
|
nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp )
|
if ( nRet ~= 0 ) then
|
wms.wms_IPA_Abort( ipa_transid )
|
lua.Error( strLuaDEID, debug.getinfo(1), strRetInfo )
|
end
|
wms.wms_IPA_Commit( ipa_transid )
|
|
local action = {
|
{
|
action_type = "close_dlg",
|
value = ""
|
},
|
{
|
action_type = "refresh",
|
value = ""
|
}
|
}
|
nRet, strRetInfo = mobox.setAction( strLuaDEID, lua.table2str(action) )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "setAction失败! "..strRetInfo..' action = '..strAction ) end
|
|
end
|