--[[
|
版本: Version 1.0
|
创建日期: 2025-4-20
|
创建人: HAN
|
|
WMS-Basis-Model-Version: V15.5
|
|
功能:
|
在处理入库作业时,将入库单明细中的货品预先分配到具体容器料格的过程在WMS系统里叫 预分配容器
|
一般用在料箱库,空料箱有多种规格,根据货品中的设置呼出适配的料格
|
|
--]]
|
wms_cntr = require ("wms_container")
|
wms_wh = require ("wms_wh")
|
|
local wms_pac = {_version = "0.1.1"}
|
|
--[[
|
预分配料箱,物料预先指定存储料格及料格中最大存储数量,或重量
|
如果货品
|
Designated Material Grid -- 简称 DMG 意思是每个货品都指定了一种料格进行存储
|
特点:
|
一种货品保存在一种类型的料格
|
料格中货品最大存储数量计算方法有两种, 1 -- 系统设置最大储藏数量 2 -- 系统设置重量后根据料格载重进行计算
|
在匹配料箱时,一个料箱只能用相同的数量计算方法
|
|
来源项目: 艾默生料箱库
|
|
输入参数:
|
alloc_rule -- 补料规则(呼出补料料箱匹配规则)
|
{
|
replenishment_call_out = false/true -- 是否启用未满料格呼出补料
|
matching_attrs = {"S_ITEM_CODE","S_ITEM_STATE",...} -- 这些属性相同的料格可以进行补料
|
matching_method = "latest_storage_time" -- 可以为空,latest_storage_time -- 只匹配最近一次入库的相同货品料格
|
}
|
|
wh_code --入库仓库编码
|
area_code -- 入库库区
|
aisle -- 如果是立库这里设置了哪些巷道可用
|
station -- 入库站台(不是必须)
|
bs_type -- 来源业务类型(比如入库单,入库波次)
|
bs_no -- 来源业务单据编码
|
|
---- 下面两个参数是系统运算后的结果返回 ----
|
|
pac_list -- Pre_Alloc_Container 对象列表
|
pac_detail_list Pre_Alloc_CNTR_Detail 列表
|
--]]
|
function wms_pac.Pre_Alloc_CNTR_By_DMG( strLuaDEID, alloc_rule, wh_code, area_code, aisle, station, bs_type, bs_no, pac_list, pac_detail_list )
|
local nRet, strRetInfo, n
|
|
-- step1: 输入参数合法性检查
|
if ( bs_no == nil or bs_no == '') then return 1, "Pre_Alloc_CNTR_By_DMG 函数中业务单号 bs_no 有值!" end
|
if ( bs_type ~= "Inbound_Order" and bs_type ~= "Inbound_Wave") then
|
return 1, "Pre_Alloc_CNTR_By_DMG 函数的业务来源类型 bs_type 只能是【入库单】或【入库波次】"
|
end
|
if ( wh_code == nil or wh_code == '') then return 1, "Pre_Alloc_CNTR_By_DMG 函数中仓库编码 wh_code 有值!" end
|
if ( area_code == nil ) then area_code = '' end
|
if ( aisle == nil ) then aisle = {} end
|
if ( station == nil ) then station = '' end
|
|
-- step2: 获取入库货品明细 item_lis
|
-- 确定要联表查询的表和条件
|
local strTable, strCondition
|
if ( bs_type == "Inbound_Order" ) then
|
strTable = "TN_Inbound_Detail a LEFT JOIN TN_Material b ON a.S_ITEM_CODE = b.S_ITEM_CODE"
|
strCondition = "a.S_IO_NO = '"..bs_no.."'"
|
else
|
strTable = "TN_IW_Detail a LEFT JOIN TN_Material b ON a.S_ITEM_CODE = b.S_ITEM_CODE"
|
strCondition = "a.S_WAVE_NO = '"..bs_no.."'"
|
end
|
-- 要查询的属性
|
local strAttrs = "a.S_ITEM_CODE, a.S_ITEM_NAME, a.S_ITEM_STATE, a.S_BATCH_NO, a.S_SERIAL_NO, a.D_PRD_DATE, a.D_EXP_DATE, a.N_ROW_NO,"..
|
"a.S_SUPPLIER_NO, a.S_OWNER, a.S_STORER, a.S_EXT_ATTR1, a.S_EXT_ATTR2, a.S_EXT_ATTR3, a.S_EXT_ATTR4, a.S_EXT_ATTR5,"..
|
"b.F_WEIGHT, b.F_VOLUME, b.S_CNTR_TYPE, b.S_CELL_TYPE, b.S_ABC_CLS, b.N_LOADING_LIMIT, b.F_LOAD_CAPACITY"
|
|
local strOrder = "a.N_ROW_NO"
|
nRet, strRetInfo = mobox.queryMultiTable(strLuaDEID, strAttrs, strTable, 1, strCondition, strOrder )
|
if (nRet ~= 0) then return 2,"QueryDataObject失败!"..strRetInfo end
|
if ( strRetInfo == '' ) then return 1, bs_type.."'"..bs_no.."'明细为空!" end
|
|
local ret_attr = json.decode(strRetInfo)
|
for n = 1, #ret_attr do
|
local item = {
|
item_code = ret_attr[n][1],
|
item_name = ret_attr[n][2],
|
item_state = ret_attr[n][3],
|
batch_no = ret_attr[n][4],
|
serial_no = ret_attr[n][5],
|
prd_date = ret_attr[n][6],
|
exp_date = ret_attr[n][7],
|
row_no = lua.Get_NumAttrValue( ret_attr[n][8] ),
|
|
supplier = ret_attr[n][9],
|
owner = ret_attr[n][10],
|
storer = ret_attr[n][11],
|
ext_attr1 = ret_attr[n][12],
|
ext_attr2 = ret_attr[n][13],
|
ext_attr3 = ret_attr[n][14],
|
ext_attr4 = ret_attr[n][15],
|
ext_attr5 = ret_attr[n][16],
|
|
weight = lua.Get_NumAttrValue( ret_attr[n][17] ),
|
volume = lua.Get_NumAttrValue( ret_attr[n][18] ),
|
cntr_type = ret_attr[n][19],
|
cell_type = ret_attr[n][20],
|
abc_cls = ret_attr[n][21],
|
load_limit = lua.Get_NumAttrValue( ret_attr[n][22] ),
|
load_capacity = lua.Get_NumAttrValue( ret_attr[n][23] ),
|
}
|
end
|
return 0
|
end
|
|
return wms_pac
|