wms_cntr = require("wms_container")
|
require("WMS-Roadway")
|
wms_op = require("wms_operation")
|
-- index 必须是table才能作为引用参数,函数内的变化才会返回
|
local function get_empty_loc(strLuaDEID, strCondition, empty_loc_set, index, priority)
|
local nRet, strRetInfo
|
local strOrder = "N_COL, N_LAYER" -- 最近巷道口
|
|
-- 最多获取 10 条
|
nRet, strRetInfo = mobox.queryDataObjAttr3(strLuaDEID, "Location", strCondition, 10, strOrder)
|
if (nRet ~= 0) then
|
return 1, "获取货位信息错误! " .. strRetInfo .. " SQL条件: " .. strCondition
|
end
|
|
if (strRetInfo ~= '') then
|
local loc
|
local retObjs = json.decode(strRetInfo)
|
|
for n = 1, #retObjs do
|
nRet, loc = m3.ObjAttrStrToLuaObj("Location", lua.table2str(retObjs[n].attrs))
|
if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "m3.ObjAttrStrToLuaObj(Location) 失败! " .. loc) end
|
|
local empty_loc = {}
|
empty_loc.priority = priority -- 分配优先级最高
|
empty_loc.loc_code = loc.code
|
empty_loc.row = loc.row
|
empty_loc.col = loc.col
|
empty_loc.layer = loc.layer
|
empty_loc_set[index.value] = empty_loc
|
index.value = index.value + 1
|
if (index.value == index.max) then break end
|
end
|
end
|
return 0, ""
|
end
|
|
-- 空货位根据优先级排序 priority, priority 相等根据 col, layer 排序
|
local function empty_loc_sort(a, b)
|
if (a.priority < b.priority) then
|
return true
|
elseif (a.priority == b.priority) then
|
if (a.col < b.col) then
|
return true
|
elseif (a.col == b.col) then
|
return a.layer < b.layer
|
else
|
return false
|
end
|
else
|
return false
|
end
|
end
|
|
-- 巷道任务数量少的放前面, 任务数量 相同balanc值小的放前面
|
local function roadway_balance_sort(a, b)
|
if (a.op_num < b.op_num) then
|
return true
|
elseif (a.op_num == b.op_num) then
|
return a.balance < b.balance
|
else
|
return false
|
end
|
end
|
|
-- 获取【巷道】对象
|
local function get_roadway_dataobject(roadway_list, zone_code)
|
for n = 1, #roadway_list do
|
if (roadway_list[n].zone_code == zone_code) then
|
return roadway_list[n]
|
end
|
end
|
return nil
|
end
|
|
-- 获取 物料\空托 在立库中的内深位对应的外深位
|
--[[
|
输入:
|
area_code -- 库区
|
roadway -- 巷道
|
batch_no -- 批次号
|
is_kt -- true:空托 false:非空托
|
cntr_code -- 托盘号
|
is_true -- true:起点为一楼左侧回库口,设备限制只能入5、6巷道
|
返回:
|
0,{loc_code:xxx}
|
--]]
|
function QueryLocInfo(strLuaDEID, data)
|
local nRet, strRetInfo
|
-- 设置返回获取的货位
|
local ret_value = {}
|
local str_area_code = data.area_code -- 库区
|
local str_roadway = data.roadway -- 巷道
|
local str_batch_no = data.batch_no -- 批次号
|
local is_kt = data.is_kt -- 是否是空托
|
local cntr_code = data.cntr_code -- 托盘号
|
local is_true = data.is_true -- 获取空托外深位时,如果起点为一楼左侧回库口则设备限制只能入5、6巷道
|
|
-- 获取前10条的货位信息
|
local strCondition = "N_LOCK_STATE = 0 AND N_POS = 2 AND S_AREA_CODE = '" .. str_area_code .. "' AND S_CODE IN"
|
if (is_kt == false) then
|
strCondition = strCondition .. " (SELECT S_LOC_CODE FROM TN_Loc_Container WHERE S_CNTR_CODE IN"
|
strCondition = strCondition ..
|
"(SELECT S_CNTR_CODE FROM TN_CG_Detail WHERE S_BATCH_NO = '" .. str_batch_no .. "'))"
|
else
|
-- 托盘和胶框的前6位编码规则不同
|
-- 托盘工装(9000片):106EGPAA0001~106EGPAA3000
|
-- 胶框(42000片):106EGRCA0001~106EGRCA9999和106EGRCB0001~106EGRCB4001
|
local cntr_rule = string.sub(cntr_code, 1, 6) -- 截取前6位字符,用来判断胶框、托盘
|
strCondition = strCondition ..
|
" (SELECT S_LOC_CODE FROM TN_Loc_Container WHERE S_CNTR_CODE LIKE '" .. cntr_rule .. "%'"
|
strCondition = strCondition .. " AND S_CNTR_CODE NOT IN (SELECT S_CNTR_CODE FROM TN_CG_Detail))"
|
|
-- 获取空托外深位时,如果起点为一楼左侧回库口则设备限制只能入5、6巷道
|
if (is_true == true) then
|
str_roadway = wms_base.Get_sConst(strLuaDEID, "佳通-一楼左侧回库口巷道")
|
end
|
end
|
-- 巷道不为空则根据条件筛选巷道
|
if (str_roadway ~= nil and str_roadway ~= '') then
|
strCondition = strCondition .. " AND N_ROADWAY IN (" .. str_roadway .. ")"
|
end
|
nRet, strRetInfo = mobox.queryDataObjAttr3(strLuaDEID, "Location", strCondition, 50, "")
|
if (nRet ~= 0) then
|
return 2, "queryDataObjAttr3失败!" .. strRetInfo
|
end
|
|
-- 没有相同批次物料的货位直接返回
|
if (strRetInfo == '') then return 0, "" end
|
local retObjs = json.decode(strRetInfo)
|
|
local next_loc = {} -- 用来存放外深位编号
|
for i = 1, #retObjs do
|
local attr, roadway, row_group
|
attr = retObjs[i].attrs
|
attr = m3.KeyValueAttrsToObjAttr(attr) -- 数组下标为 i 的货位信息
|
if (attr == nil) then goto coroutine end
|
row_group = tonumber(attr.N_ROW_GROUP) -- 当前货位的排组号
|
local loc_code = attr.S_CODE
|
local loc_code_table = lua.split(loc_code, "-") -- 通过符号分割字符串为数组
|
local loc_row = loc_code_table[2]
|
|
-- 通过库区、排组号 定位巷道信息
|
strCondition = "S_AREA_CODE = '" .. str_area_code .. "' AND (N_LEFT_ROW_GROUP = "
|
.. row_group .. " or N_RIGHT_ROW_GROUP = " .. row_group .. " )"
|
nRet, roadway = mobox.queryDataObjAttr3(strLuaDEID, "Roadway", strCondition, 1, "")
|
if (nRet ~= 0) then
|
return 2, "queryDataObjAttr3失败!" .. strRetInfo
|
end
|
|
roadway = json.decode(roadway)
|
roadway = roadway[1].attrs
|
roadway = m3.KeyValueAttrsToObjAttr(roadway) -- 巷道信息
|
if (roadway == nil) then goto coroutine end
|
|
local row = "" -- 所属巷道信息中的 (内/外 深位)2排 的字符串信息(例: 21,22,)
|
if (row_group == tonumber(roadway.N_LEFT_ROW_GROUP)) then
|
row = roadway.S_LEFT_ROW
|
else
|
row = roadway.S_RIGHT_ROW
|
end
|
local row_table = lua.split(row, ",")
|
local str = ""
|
for j = 1, #row_table do
|
if (loc_row ~= row_table[j]) then
|
str = row_table[j]
|
end
|
end
|
|
if (str == "") then goto coroutine end
|
if (#str == 1) then str = "0" .. str end
|
|
local new_loc_code = loc_code_table[1] .. "-" .. str .. "-" .. loc_code_table[3] .. "-" .. loc_code_table[4]
|
strCondition = "N_LOCK_STATE = 0 AND N_CURRENT_NUM = 0 AND S_CODE = '" .. new_loc_code .. "'"
|
nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Location", strCondition)
|
if (nRet ~= 0) then return 1, strRetInfo end
|
if (tonumber(strRetInfo) > 0) then
|
if (#next_loc == 0) then
|
ret_value.loc_code = new_loc_code
|
end
|
end
|
::coroutine::
|
end
|
lua.Debug(strLuaDEID, debug.getinfo(1), 'ret_value', ret_value)
|
return 0, ret_value
|
end
|
|
-- 获取立库内深位对应的外深位
|
function QueryOutLoc(strLuaDEID, loc_code)
|
local loc_code_table = lua.split(loc_code, "-") -- 通过符号分割字符串为数组
|
local loc_row = loc_code_table[2]
|
|
-- 获取货位的信息
|
local nRet, loc_info = wms_wh.GetLocInfo(loc_code)
|
if (nRet ~= 0) then return 2, 'GetLocInfo失败!' .. loc_info end
|
|
-- 通过库区、排组号 定位巷道信息
|
local roadway
|
local strCondition = "S_AREA_CODE = 'LK' AND (N_LEFT_ROW_GROUP = "
|
.. loc_info.row_group .. " or N_RIGHT_ROW_GROUP = " .. loc_info.row_group .. " )"
|
nRet, roadway = mobox.queryDataObjAttr3(strLuaDEID, "Roadway", strCondition, 1, "")
|
if (nRet ~= 0) then return 2, "queryDataObjAttr3失败!" .. strRetInfo end
|
|
roadway = json.decode(roadway)
|
roadway = roadway[1].attrs
|
roadway = m3.KeyValueAttrsToObjAttr(roadway) -- 巷道信息
|
if (roadway == nil) then return 2, "巷道信息获取失败!" end
|
|
local row = "" -- 所属巷道信息中的 (内/外 深位)2排 的字符串信息(例: 21,22,)
|
if (loc_info.row_group == tonumber(roadway.N_LEFT_ROW_GROUP)) then
|
row = roadway.S_LEFT_ROW
|
else
|
row = roadway.S_RIGHT_ROW
|
end
|
local row_table = lua.split(row, ",")
|
local str = ""
|
for j = 1, #row_table do
|
if (loc_row ~= row_table[j]) then
|
str = row_table[j]
|
end
|
end
|
|
if (str == "") then return 2, "获取排失败!" end
|
if (#str == 1) then str = "0" .. str end
|
|
local new_loc_code = loc_code_table[1] .. "-" .. str .. "-" .. loc_code_table[3] .. "-" .. loc_code_table[4]
|
return 0, new_loc_code
|
end
|
|
-- 获取库区里的巷道对象
|
--[[
|
输入:
|
area_code 库区编码
|
bNoLock 可以不输入,默认= false, true 表示获取的zoon不能被禁用
|
返回:
|
字符串 [{roadway-data-object},{}]
|
--]]
|
function GetRoadWayList(strLuaDEID, area_code, bNoLock, condition)
|
local nRet, strRetInfo, strCondition
|
local strOrder = "N_ROADWAY"
|
|
if (bNoLock == nil) then
|
bNoLock = false
|
else
|
bNoLock = true
|
end
|
|
if (area_code == nil or area_code == '') then
|
lua.Error(strLuaDEID, debug.getinfo(1), "调用 WMS_GetZoneListByGroup 函数时参数不正确,库区编码不能为空!")
|
end
|
|
if (condition ~= nil and condition ~= '') then
|
strCondition = "S_AREA_CODE = '" .. area_code .. "' AND N_ROADWAY IN (" .. condition .. ")"
|
else
|
strCondition = "S_AREA_CODE = '" .. area_code .. "'"
|
end
|
|
if (bNoLock) then
|
strCondition = strCondition .. " AND N_LOCK_STATE = 0"
|
end
|
nRet, strRetInfo = mobox.queryDataObjAttr(strLuaDEID, "Roadway", strCondition, strOrder)
|
if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取【巷道】信息失败! " .. strRetInfo) end
|
|
local return_data = {}
|
if (strRetInfo ~= '') then
|
local retObjs = json.decode(strRetInfo)
|
local n
|
|
for n = 1, #retObjs do
|
local roadway = {}
|
nRet, roadway = m3.ObjAttrStrToLuaObj("Roadway", lua.table2str(retObjs[n].attrs))
|
roadway.id = lua.trim_guid_str(retObjs[n].id)
|
roadway.cls = "Roadway"
|
if (nRet ~= 0) then
|
lua.Error(strLuaDEID, debug.getinfo(1),
|
"m3.ObjAttrStrToLuaObj(CG_Detail) 失败! " .. cg_detail)
|
end
|
return_data[n] = roadway
|
end
|
end
|
return return_data
|
end
|
|
--[[
|
注:对深位>2的无效
|
area_code -- 库区编码
|
roadway_balance -- 巷道信息
|
ext_condition -- 扩展条件,比如 S_BATCH_NO = 'A1'
|
|
返回:
|
[{loc_code:"",priority:1~3, row:x, col:y, layer:12 }]
|
--]]
|
function GT_GetEmptyLocInRoadway(strLuaDEID, area_code, roadway_balance, ext_condition)
|
local nRet, strRetInfo
|
local strCondition = ''
|
local empty_loc_set = {} -- 空货位集
|
local index = {}
|
index.value = 1
|
index.max = 11 -- 空货位集最多10个
|
|
if (roadway_balance == nil) then
|
return 1, "无效参数!"
|
end
|
if (ext_condition == nil) then ext_condition = '' end
|
|
-- 获取最里面的空货位
|
-- 左边是双深位
|
if (roadway_balance.left_deep == 2) then
|
-- 获取左边最里面的空货位
|
strCondition = "N_CURRENT_NUM = 0 AND S_AREA_CODE = '" ..
|
area_code .. "' AND N_ROW_GROUP = " .. roadway_balance.left_row_group
|
strCondition = strCondition .. " AND N_LOCK_STATE = 0 AND C_ENABLE = 'Y' AND N_POS = 2"
|
if (ext_condition ~= '') then
|
strCondition = strCondition .. "AND N_LAYER IN (" .. ext_condition .. ")"
|
end
|
nRet, strRetInfo = get_empty_loc(strLuaDEID, strCondition, empty_loc_set, index, 2)
|
if (nRet ~= 0) then return 1, strRetInfo end
|
if (index.value >= index.max) then goto go_back end
|
end
|
-- 右边是双深位
|
if (roadway_balance.right_deep == 2) then
|
-- 获取右边最里面的空货位
|
strCondition = "N_CURRENT_NUM = 0 AND S_AREA_CODE = '" ..
|
area_code .. "' AND N_ROW_GROUP = " .. roadway_balance.right_row_group
|
strCondition = strCondition .. " AND N_LOCK_STATE = 0 AND C_ENABLE = 'Y' AND N_POS = 2"
|
if (ext_condition ~= '') then
|
strCondition = strCondition .. "AND N_LAYER IN (" .. ext_condition .. ")"
|
end
|
nRet, strRetInfo = get_empty_loc(strLuaDEID, strCondition, empty_loc_set, index, 2)
|
if (nRet ~= 0) then return 1, strRetInfo end
|
if (index.value >= index.max) then goto go_back end
|
end
|
|
-- 获取左边最外面的空货位
|
strCondition = "N_CURRENT_NUM = 0 AND S_AREA_CODE = '" ..
|
area_code .. "' AND N_ROW_GROUP = " .. roadway_balance.left_row_group
|
strCondition = strCondition .. " AND N_LOCK_STATE = 0 AND C_ENABLE = 'Y' AND N_POS = 1"
|
if (ext_condition ~= '') then
|
strCondition = strCondition .. "AND N_LAYER IN (" .. ext_condition .. ")"
|
end
|
nRet, strRetInfo = get_empty_loc(strLuaDEID, strCondition, empty_loc_set, index, 3)
|
if (nRet ~= 0) then return 1, strRetInfo end
|
if (index.value >= index.max) then goto go_back end
|
|
-- 获取右边最外面的空货位
|
strCondition = "N_CURRENT_NUM = 0 AND S_AREA_CODE = '" ..
|
area_code .. "' AND N_ROW_GROUP = " .. roadway_balance.right_row_group
|
strCondition = strCondition .. " AND N_LOCK_STATE = 0 AND C_ENABLE = 'Y' AND N_POS = 1"
|
if (ext_condition ~= '') then
|
strCondition = strCondition .. "AND N_LAYER IN (" .. ext_condition .. ")"
|
end
|
nRet, strRetInfo = get_empty_loc(strLuaDEID, strCondition, empty_loc_set, index, 3)
|
if (nRet ~= 0) then return 1, strRetInfo end
|
|
::go_back::
|
-- 排序
|
table.sort(empty_loc_set, empty_loc_sort)
|
return 0, empty_loc_set
|
end
|
|
-- 初始化巷道物料均衡值
|
-- 输入参数:
|
-- roadway_list 【巷道】数据对象
|
-- input_paramter 入库的物料信息,{"item_code":"","batch_no":"zz",...}
|
-- 返回: 0 -- 成功 1 -- 没有空余库位 2 -- 错误
|
--[[
|
[
|
{
|
"roadway":1~, "zone_code":"a","amount":0~999, "balance":1~3,"op_num":0,
|
"left_deep":2,"right_deep":1,"left_row_group":1,"right_row_group":2,
|
"location":{"code":"","priority":1~3}},
|
-- roadway 巷道编号 zone_code -- 巷道逻辑库区编码 amount -- 巷道内符合条件的货品所在货位数量
|
-- balance 均衡度
|
-- op_num 作业数量
|
-- location 巷道内优先上架的货位
|
...
|
]
|
-- balance 是货物在巷道内的均衡度 巷道内同批次物料数量为0时,该值=1
|
-- 巷道内同批次物料数量小于目前同批次物料(总数/巷道数)时该值=2,其余为3
|
--]]
|
function Set_roadway_balance(strLuaDEID, roadway_list, input_paramter)
|
local nRet, strRetInfo
|
|
if (input_paramter.batch_no == nil or input_paramter.batch_no == '') then
|
return 2, "输入参数中必须要有物料批次信息(batch_no)"
|
end
|
|
-- 获取 roadway_list 中的逻辑库区编码集合
|
local roadway_code
|
nRet, roadway_code = wms_wh.GetRoadwayZoneCodeSet(roadway_list)
|
if (nRet ~= 0) then return nRet, roadway_code end
|
|
local nTotal, nNum
|
local cg_detail_condtion = "S_BATCH_NO = '" .. input_paramter.batch_no .. "'"
|
local roadway_balance_set = {}
|
|
if (#roadway_code == 0) then
|
return 2, "无可用巷道"
|
end
|
-- 获取逻辑库区中的数量信息,判断如果巷道没空货位就不继续判断
|
nRet, strRetInfo = wms.wms_GetZoneNumInfo(lua.table2str(roadway_code))
|
|
|
-- 返回 [{ "code": "XXX", "store_max": X, "available_in": X, "empty_min": X, "empty_max": X },..]
|
if (nRet ~= 0) then
|
return 2, "wms_GetZoneNumInfo失败!" .. strRetInfo
|
end
|
local roadway_code_info = json.decode(strRetInfo)
|
local nIndex = 1
|
|
nTotal = 0 -- 已经存在的货品在要分配货位巷道中的总数量
|
|
local obj
|
for n = 1, #roadway_code_info do
|
-- 如果有空货位
|
if (roadway_code_info[n].available_in > 0) then
|
-- 获取巷道内存储货品批次 = batch_no 的货位数量
|
nNum = wms_cntr.Get_CG_Detail_Count_InZone(strLuaDEID, roadway_code_info[n].code, cg_detail_condtion)
|
-- 统计该逻辑库区 执行中的任务的 批次入库数量
|
-- 条件
|
-- 1、任务的巷道为当前逻辑库区
|
-- 2、任务的容器批次号要和当前入库批次相同
|
-- 3、任务的类型为 5 立库入库搬运,任务的状态为 1 已推送
|
local strCondition =
|
"S_CODE IN (SELECT S_OP_CODE FROM TN_TASK WHERE N_TYPE = 5 AND N_B_STATE = 1 AND N_ROADWAY = (SELECT N_ROADWAY FROM TN_Roadway WHERE S_ZONE_CODE = '" ..
|
roadway_code_info[n].code .. "'))"
|
strCondition = strCondition ..
|
" AND S_CNTR_CODE IN (SELECT S_CNTR_CODE FROM TN_CG_Detail WHERE " .. cg_detail_condtion .. ")"
|
nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Operation", strCondition)
|
if (nRet ~= 0) then
|
lua.Error(strLuaDEID, debug.getinfo(1), "getDataObjCount 失败! " .. strRetInfo)
|
end
|
local num = lua.StrToNumber(strRetInfo)
|
nNum = nNum + num -- 巷道内存储货品批次 = batch_no 的货位数量 + 搬运执行中 货品批次 = batch_no 的货位数量
|
|
nTotal = nTotal + nNum
|
|
local roadway_balance = {}
|
roadway_balance.zone_code = roadway_code_info[n].code
|
roadway_balance.amount = nNum
|
roadway_balance.balance = 0
|
roadway_balance.location = {}
|
-- 获取巷道对象
|
obj = get_roadway_dataobject(roadway_list, roadway_balance.zone_code)
|
-- 通过逻辑库区编码获取执行中的巷道任务数量
|
strCondition = "N_ROADWAY = (SELECT N_ROADWAY FROM TN_Roadway WHERE S_ZONE_CODE = '" .. roadway_balance.zone_code .. "') AND N_B_STATE = 1"
|
nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Task", strCondition)
|
if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "getDataObjCount 失败! " .. strRetInfo) end
|
local op_num = lua.StrToNumber(strRetInfo)
|
|
if (obj ~= nil) then
|
roadway_balance.op_num = op_num
|
roadway_balance.left_deep = obj.left_deep
|
roadway_balance.right_deep = obj.right_deep
|
roadway_balance.left_row_group = obj.left_row_group
|
roadway_balance.right_row_group = obj.right_row_group
|
else
|
roadway_balance.op_num = op_num
|
roadway_balance.left_deep = 0
|
roadway_balance.right_deep = 0
|
roadway_balance.left_row_group = 0
|
roadway_balance.right_row_group = 0
|
end
|
|
roadway_balance_set[nIndex] = roadway_balance
|
nIndex = nIndex + 1
|
end
|
end
|
|
local nCount = #roadway_balance_set
|
if (nCount == 0) then
|
return 1, "巷道没有空余货位!"
|
end
|
|
-- 计算 balance
|
local fAverage = nTotal / nCount -- 巷道平均值
|
for n = 1, nCount do
|
if (roadway_balance_set[n].amount == 0) then
|
roadway_balance_set[n].balance = 1
|
elseif (roadway_balance_set[n].amount <= fAverage) then
|
roadway_balance_set[n].balance = 2
|
else
|
roadway_balance_set[n].balance = 3
|
end
|
end
|
|
-- 根据 balance 排序
|
table.sort(roadway_balance_set, roadway_balance_sort)
|
return 0, roadway_balance_set
|
end
|
|
-- 初始化巷道空工装均衡值
|
-- 输入参数:
|
-- roadway_list 【巷道】数据对象
|
-- 返回: 0 -- 成功 1 -- 没有空余库位 2 -- 错误
|
--[[
|
[
|
{
|
"roadway":1~, "zone_code":"a","amount":0~999, "balance":1~3,"op_num":0,
|
"left_deep":2,"right_deep":1,"left_row_group":1,"right_row_group":2,
|
"location":{"code":"","priority":1~3}},
|
-- roadway 巷道编号 zone_code -- 巷道逻辑库区编码 amount -- 巷道内符合条件的货品所在货位数量
|
-- balance 均衡度
|
-- op_num 作业数量
|
-- location 巷道内优先上架的货位
|
...
|
]
|
-- balance 是KGZ在巷道内的均衡度 巷道内KGZ数量为0时,该值=1
|
-- 巷道内KGZ数量小于目前KGZ(总数/巷道数)时该值=2,其余为3
|
--]]
|
function Set_KGZ_roadway_balance(strLuaDEID, roadway_list)
|
local nRet, strRetInfo
|
-- 获取 roadway_list 中的逻辑库区编码集合
|
local roadway_code
|
nRet, roadway_code = wms_wh.GetRoadwayZoneCodeSet(roadway_list)
|
if (nRet ~= 0) then return nRet, roadway_code end
|
|
local nTotal, nNum
|
local cg_detail_condtion = "S_ITEM_CODE = 'KGZ'"
|
local roadway_balance_set = {}
|
|
if (#roadway_code == 0) then
|
return 2, "无可用巷道"
|
end
|
-- 获取逻辑库区中的数量信息,判断如果巷道没空货位就不继续判断
|
nRet, strRetInfo = wms.wms_GetZoneNumInfo(lua.table2str(roadway_code))
|
|
|
-- 返回 [{ "code": "XXX", "store_max": X, "available_in": X, "empty_min": X, "empty_max": X },..]
|
if (nRet ~= 0) then
|
return 2, "wms_GetZoneNumInfo失败!" .. strRetInfo
|
end
|
local roadway_code_info = json.decode(strRetInfo)
|
local nIndex = 1
|
|
nTotal = 0 -- 已经存在的货品在要分配货位巷道中的总数量
|
|
local obj
|
for n = 1, #roadway_code_info do
|
-- 如果有空货位
|
if (roadway_code_info[n].available_in > 0) then
|
-- 获取巷道内存储货品批次 = batch_no 的货位数量
|
nNum = wms_cntr.Get_CG_Detail_Count_InZone(strLuaDEID, roadway_code_info[n].code, cg_detail_condtion)
|
-- 统计该逻辑库区 执行中的任务的 批次入库数量
|
-- 条件
|
-- 1、任务的巷道为当前逻辑库区
|
-- 2、任务的容器批次号要和当前入库批次相同
|
-- 3、任务的类型为 5 立库入库搬运,任务的状态为 1 已推送
|
local strCondition =
|
"S_CODE IN (SELECT S_OP_CODE FROM TN_TASK WHERE N_TYPE = 5 AND N_B_STATE = 1 AND N_ROADWAY = (SELECT N_ROADWAY FROM TN_Roadway WHERE S_ZONE_CODE = '" ..
|
roadway_code_info[n].code .. "'))"
|
strCondition = strCondition ..
|
" AND S_CNTR_CODE IN (SELECT S_CNTR_CODE FROM TN_CG_Detail WHERE " .. cg_detail_condtion .. ")"
|
nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Operation", strCondition)
|
if (nRet ~= 0) then
|
lua.Error(strLuaDEID, debug.getinfo(1), "getDataObjCount 失败! " .. strRetInfo)
|
end
|
local num = lua.StrToNumber(strRetInfo)
|
nNum = nNum + num -- 巷道内存储货品批次 = batch_no 的货位数量 + 搬运执行中 货品批次 = batch_no 的货位数量
|
|
nTotal = nTotal + nNum
|
|
local roadway_balance = {}
|
roadway_balance.zone_code = roadway_code_info[n].code
|
roadway_balance.amount = nNum
|
roadway_balance.balance = 0
|
roadway_balance.location = {}
|
-- 获取巷道对象
|
obj = get_roadway_dataobject(roadway_list, roadway_balance.zone_code)
|
-- 通过逻辑库区编码获取执行中的巷道任务数量
|
strCondition = "N_ROADWAY = (SELECT N_ROADWAY FROM TN_Roadway WHERE S_ZONE_CODE = '" .. roadway_balance.zone_code .. "') AND N_B_STATE = 1"
|
nRet, strRetInfo = mobox.getDataObjCount(strLuaDEID, "Task", strCondition)
|
if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "getDataObjCount 失败! " .. strRetInfo) end
|
local op_num = lua.StrToNumber(strRetInfo)
|
|
if (obj ~= nil) then
|
roadway_balance.op_num = op_num
|
roadway_balance.left_deep = obj.left_deep
|
roadway_balance.right_deep = obj.right_deep
|
roadway_balance.left_row_group = obj.left_row_group
|
roadway_balance.right_row_group = obj.right_row_group
|
else
|
roadway_balance.op_num = op_num
|
roadway_balance.left_deep = 0
|
roadway_balance.right_deep = 0
|
roadway_balance.left_row_group = 0
|
roadway_balance.right_row_group = 0
|
end
|
|
roadway_balance_set[nIndex] = roadway_balance
|
nIndex = nIndex + 1
|
end
|
end
|
|
local nCount = #roadway_balance_set
|
if (nCount == 0) then
|
return 1, "巷道没有空余货位!"
|
end
|
|
-- 计算 balance
|
local fAverage = nTotal / nCount -- 巷道平均值
|
for n = 1, nCount do
|
if (roadway_balance_set[n].amount == 0) then
|
roadway_balance_set[n].balance = 1
|
elseif (roadway_balance_set[n].amount <= fAverage) then
|
roadway_balance_set[n].balance = 2
|
else
|
roadway_balance_set[n].balance = 3
|
end
|
end
|
|
-- 根据 balance 排序
|
table.sort(roadway_balance_set, roadway_balance_sort)
|
return 0, roadway_balance_set
|
end
|