--[[
|
编码: WMS-17-12
|
名称: 计划盘点容器-Create_Count_CG_Detail
|
作者:HAN
|
日期:2025-1-29
|
|
级别:固定 (说明本段代码在项目中不太会变化)
|
|
函数: CreateCountCGDetail
|
|
功能:
|
-- 外部触发的事件,输入paramter = {
|
reject_emptybox
|
"count_type":1/2,
|
"count_order_no":"盘点单号",
|
"count_method":1/2 盘点方法,
|
station,
|
diff_hand_method }
|
-- 根据 CG_Detail 生成 Count_CG_Detail
|
-- 先清空 Count_CG_Detail
|
-- 成功后需要对容器加 盘点锁
|
|
更改记录:
|
V2.0 HAN 2025-2-9
|
相同货品的CG_Detail 数量合并
|
V3.0 HAN 2025-2-13
|
新增容器盘点类型
|
V4.0 HAN 2025-2-15
|
空料箱是否出库盘点判断
|
|
--]]
|
wms_base = require( "wms_base" )
|
|
function CreateCountCGDetail ( strLuaDEID )
|
local nRet, strRetInfo
|
local paramter
|
|
-- step1: 获取输入参数
|
nRet, paramter = m3.GetSysDataJson( strLuaDEID )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "获取输入参数失败! "..paramter ) end
|
local count_type = lua.Get_NumAttrValue( paramter.count_type )
|
if ( count_type == 0 ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "输入参数中必须要有 count_type ! " )
|
end
|
local count_order_no = lua.Get_StrAttrValue( paramter.count_order_no )
|
if ( count_order_no == "" ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "输入参数中必须要有 count_order_no ! " )
|
end
|
local count_method = lua.Get_NumAttrValue( paramter.count_method )
|
if ( count_method <= 0 or count_method > 2 ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "输入参数中 count_method 不合法! " )
|
end
|
local station = lua.Get_StrAttrValue( paramter.station ) -- 盘点站台
|
local diff_hand_method = lua.Get_NumAttrValue( paramter.diff_hand_method )
|
|
local count_container
|
nRet, count_container = m3.GetSysCurEditDataObj( strLuaDEID, "CP_Count_Container" )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "获取当前编辑属性失败! "..count_container ) end
|
local strClsID, strObjID
|
nRet, strClsID, strObjID = mobox.getCurEditDataObjID( strLuaDEID )
|
if ( nRet ~= 0 ) then lua.Error( strLuaDEID, debug.getinfo(1), "getCurEditDataObjID失败! " ) end
|
count_container.id = strObjID
|
|
-- step2: 先删除【Count_CG_Detail】
|
local strCondition = "S_COUNT_NO = '"..count_container.count_no.."' AND S_CNTR_CODE = '"..count_container.cntr_code.."'"
|
nRet, strRetInfo = mobox.dbdeleteData(strLuaDEID, "Count_CG_Detail", strCondition)
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "删除【Count_CG_Detail】失败!"..strRetInfo) end
|
|
-- step3: 根据盘点类型生成盘点货品明细
|
local strOrder = ''
|
local count_cg_detail
|
|
-- 根据盘点类型不同设定不同查询条件
|
if ( count_type == 1 ) then
|
-- 货品盘点
|
-- 获取容器需要盘点什么货品,["A","B"]
|
if ( count_container.good_codes == nil or count_container.good_codes == '') then
|
lua.Debug( strLuaDEID, debug.getinfo(1),"count_container", count_container )
|
lua.Error( strLuaDEID, debug.getinfo(1), "货品查询条件为空! " )
|
end
|
|
local str_good_codes = lua.strArray2string(json.decode( count_container.good_codes ))
|
if ( str_good_codes ~= nil and str_good_codes ~= '' ) then
|
-- str_good_codes = lua.trim_str_head_end( str_good_codes )
|
-- 从CG_Detail获取货品
|
strCondition = "S_ITEM_CODE IN ("..str_good_codes..") AND S_CNTR_CODE = '"..count_container.cntr_code.."'"
|
else
|
lua.Debug( strLuaDEID, debug.getinfo(1),"count_container", count_container )
|
lua.Error( strLuaDEID, debug.getinfo(1), "货品查询条件为空! " )
|
end
|
elseif ( count_type == 2 ) then
|
-- 货位盘点
|
strCondition = "S_CNTR_CODE = '"..count_container.cntr_code.."'"
|
-- V3.0
|
elseif ( count_type == 3 ) then
|
-- 容器盘点
|
strCondition = "S_CNTR_CODE = '"..count_container.cntr_code.."'"
|
else
|
lua.Error( strLuaDEID, debug.getinfo(1), "输入参数count_type值非法! count_type = "..count_type )
|
end
|
|
local data_objs, i, n
|
nRet, data_objs = m3.QueryDataObject(strLuaDEID, "CG_Detail", strCondition, strOrder )
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "QueryDataObject失败!"..data_objs) end
|
|
-- V2.0
|
local cg_detail_list = {}
|
local find
|
|
if ( data_objs ~= '') then
|
for i = 1, #data_objs do
|
object_attr = m3.KeyValueAttrsToObjAttr(data_objs[i].attrs)
|
|
-- V2.0 判断cg_detail_list
|
find = false
|
for n = 1, #cg_detail_list do
|
if ( cg_detail_list[n].item_code == object_attr.S_ITEM_CODE ) then
|
cg_detail_list[n].qty = cg_detail_list[n].qty + lua.StrToNumber( object_attr.F_QTY )
|
cg_detail_list[n].cg_detail_id = "" -- 说明是有多条记录合并的,因此需要批分
|
find = true
|
break
|
end
|
end
|
|
if ( find == false ) then
|
count_cg_detail = m3.AllocObject(strLuaDEID,"Count_CG_Detail")
|
count_cg_detail.cg_detail_id = data_objs[i].id
|
count_cg_detail.cc_no = count_container.cc_no
|
count_cg_detail.count_no = count_order_no
|
count_cg_detail.station = station
|
count_cg_detail.cntr_code = object_attr.S_CNTR_CODE
|
count_cg_detail.cell_no = object_attr.S_CELL_NO
|
count_cg_detail.serial_no = object_attr.S_SERIAL_NO
|
count_cg_detail.item_code = object_attr.S_ITEM_CODE
|
count_cg_detail.item_name = object_attr.S_ITEM_NAME
|
count_cg_detail.batch_no = object_attr.S_BATCH_NO
|
count_cg_detail.item_spec = object_attr.S_ITEM_SPEC
|
count_cg_detail.item_state = object_attr.N_ITEM_STATE
|
count_cg_detail.end_user = object_attr.S_END_USER
|
count_cg_detail.owner = object_attr.S_OWNER
|
count_cg_detail.supplier = object_attr.S_SUPPLIER_NO
|
count_cg_detail.erp_wh_code = object_attr.S_ERP_WH_CODE
|
count_cg_detail.ext_attr1 = object_attr.S_EXT_ATTR1
|
count_cg_detail.ext_attr2 = object_attr.S_EXT_ATTR2
|
count_cg_detail.ext_attr3 = object_attr.S_EXT_ATTR3
|
count_cg_detail.ext_attr4 = object_attr.S_EXT_ATTR4
|
count_cg_detail.ext_attr5 = object_attr.S_EXT_ATTR5
|
count_cg_detail.qty = lua.StrToNumber( object_attr.F_QTY )
|
count_cg_detail.uom = object_attr.S_UOM
|
table.insert( cg_detail_list, count_cg_detail )
|
end
|
end
|
end
|
|
--V4.0
|
local nCount = #cg_detail_list
|
if ( nCount == 0 and paramter.reject_emptybox ) then
|
-- 空料箱不需要出库盘点
|
-- 更新【计划盘点容器】中的属性
|
strCondition = "S_ID = '"..strObjID.."'"
|
-- 设置 状态=4/已回库(完成)
|
local strSetSQL = "N_B_STATE = 4"
|
nRet, strRetInfo = mobox.updateDataAttrByCondition(strLuaDEID, "CP_Count_Container", strCondition, strSetSQL)
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "设置【计划盘点容器】信息失败!"..strRetInfo ) end
|
|
-- 增加一个后台进程对盘点单进行处理,检查盘点单是否可以完成
|
local add_wfp = {
|
wfp_type = 1,
|
cls = "CP_Count_Container",
|
obj_id = strObjID,
|
obj_name = "盘点容器流水号'"..count_container.cc_no.."'-->盘点完成后处理",
|
trigger_event = "盘点完成后处理"
|
}
|
nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp )
|
if ( nRet ~= 0 ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "AddSysWFP失败!"..strRetInfo )
|
end
|
return
|
end
|
|
for n = 1, #cg_detail_list do
|
nRet, count_cg_detail = m3.CreateDataObj( strLuaDEID, cg_detail_list[n] )
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "创建【Count_CG_Detail】失败!"..count_cg_detail) end
|
end
|
|
-- step4: 更新【计划盘点容器】中的属性
|
strCondition = "S_ID = '"..strObjID.."'"
|
-- 设置 盘点单号 及 状态=1/已锁定
|
local strSetSQL = "S_COUNT_NO = '"..count_order_no.."', N_B_STATE = 1, N_COUNT_METHOD = "..count_method..", S_STATION_NO = '"..station.."', N_DIFF_HAND_METHOD = "..diff_hand_method
|
nRet, strRetInfo = mobox.updateDataAttrByCondition(strLuaDEID, "CP_Count_Container", strCondition, strSetSQL)
|
if (nRet ~= 0) then lua.Error( strLuaDEID, debug.getinfo(1), "设置【计划盘点容器】信息失败!"..strRetInfo ) end
|
|
-- step5: 如果【计划盘点容器】的盘点方法=2 (自动出库到站点)就需要在后台创建作业进【盘点出库】作业
|
if ( count_method == 2 ) then
|
-- 增加一个后台进程进行入库单完工回报
|
local add_wfp = {
|
wfp_type = 1, -- 触发数据对象事件(指定数据对象标识)
|
cls = "CP_Count_Container",
|
obj_id = count_container.id,
|
obj_name = "Container No '"..count_container.cntr_code.."'-->Create stocktaking outbound operation",
|
trigger_event = "CreateStocktakingOutOperation"
|
}
|
nRet, strRetInfo = m3.AddSysWFP( strLuaDEID, add_wfp )
|
if ( nRet ~= 0 ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "AddSysWFP失败!"..strRetInfo )
|
end
|
end
|
|
-- step6: 给容器加盘点锁 4 -- 盘点锁
|
nRet, strRetInfo = wms.wms_LockCntr( count_container.cntr_code, 4, count_order_no )
|
if ( nRet ~= 0 ) then
|
lua.Error( strLuaDEID, debug.getinfo(1), "给容器'"..operation_obj.cntr_code.."'加盘点锁失败!")
|
end
|
wms.wms_CommitCntrLockTrans( count_order_no )
|
end
|