--[[
|
版本: Version 2.1
|
创建日期: 2023-6-16
|
创建人: HAN
|
WMS-Basis-Model-Version: V15.5
|
|
功能:
|
Task Lua程序包整合了一些【任务】对象相关的操作
|
|
-- GetPushedCount 获取调度系统已经推送的任务数量
|
-- SetErrState 设置任务错误状态
|
-- SetStateByCode 设置任务状态
|
-- GetInfo 根据任务号获取任务属性
|
-- Update 更新任务数据对象属性
|
-- Action_Exist 任务下面是否存在某个动作码
|
-- SetRunState 设置任务状态为"执行"
|
-- GetAreaCount 获取物理库区任务数量
|
-- After_TaskFinish 任务完成后的标准处理流程
|
更改说明:
|
--]]
|
|
wms_base = require ("wms_base")
|
wms_wh = require ("wms_wh")
|
|
local wms_task = {_version = "0.2.1"}
|
|
-- 获取调度系统已经推送的任务数量
|
-- 输入参数: strSecheduleType 调度类型
|
-- 返回: nRet,nCount
|
function wms_task.GetPushedCount( strLuaDEID, strSecheduleType )
|
local nRet, strRetInfo
|
local strCondition
|
|
local nSecheduleType
|
if ( type(strSecheduleType) == "string" ) then
|
nSecheduleType = wms_base.Get_nConst( strLuaDEID, strSecheduleType )
|
else
|
nSecheduleType = strSecheduleType
|
end
|
-- 获取某种调度类型的任务数量
|
-- 1 已推送 2 -- 执行
|
strCondition = "N_SCHEDULE_TYPE = "..nSecheduleType.." AND ( N_B_STATE = 1 OR N_B_STATE = 2 )"
|
nRet, strRetInfo = mobox.getDataObjCount( strLuaDEID, "Task", strCondition )
|
if ( nRet ~= 0 ) then
|
return nRet, strRetInfo
|
end
|
return 0, tonumber( strRetInfo )
|
end
|
|
-- 设置任务错误状态
|
function wms_task.SetErrState( strLuaDEID, task, nErrCode, strErr )
|
if ( task.id == nil or task.id == '' ) then
|
return 1, "调用 wms_task.SetErrState 函数时参数不正确, 任务ID不能为空!"
|
end
|
|
-- 根据字典获取 N_B_STATE 的显示名称
|
local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_TaskState", 4 ) -- 4 表示错误状态
|
local condition = "S_ID = '"..task.id.."'"
|
strSetAttr = "N_B_STATE = 4, S_B_STATE = '"..str_b_state.."', S_ERR='"..strErr.."', N_ERR = "..nErrCode
|
nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, task.cls, condition, strSetAttr )
|
if ( nRet ~= 0 ) then
|
return nRet, "更新任务对象失败!"..strRetInfo
|
end
|
return 0, "ok"
|
end
|
|
-- 设置任务状态为"执行"
|
-- HAN 2024-3-15 新增 executor_id, executor_name 可以不输入
|
function wms_task.SetRunState( strLuaDEID, task, executor_id, executor_name )
|
|
--local nBState = wms_base.Get_nConst(strLuaDEID,"任务状态-执行")
|
local nBState = 2
|
-- 根据字典获取 N_B_STATE 的显示名称
|
local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_TaskState", nBState )
|
local condition = "S_CODE = '"..task.code.."'"
|
local strSetAttr
|
|
strSetAttr = "N_B_STATE = "..nBState..", S_B_STATE = '"..str_b_state.."', T_START_TIME = '"..os.date("%Y-%m-%d %H:%M:%S").."'"
|
if ( executor_id ~= nil and executor_id ~= '' and executor_name ~= nil and executor_name ~= '') then
|
strSetAttr = strSetAttr..",S_EXECUTOR_ID = '"..executor_id.."', S_EXECUTOR_NAME = '"..executor_name.."'"
|
end
|
nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, task.cls, condition, strSetAttr )
|
if ( nRet ~= 0 ) then return 1, "设置任务状态失败!"..strRetInfo end
|
return 0
|
end
|
|
-- 设置任务状态
|
-- strState 任务状态( 已推送 执行 完成 )
|
function wms_task.SetStateByCode( strLuaDEID, task_code, strState, strErr )
|
local nBState
|
|
if ( task_code == nil or task_code == '' ) then
|
return 1, "调用 wms_task.SetStateByCode 函数时参数不正确, 任务编码不能为空!"
|
end
|
if ( strState == nil or strState == '' ) then
|
return 1, "调用 wms_task.SetStateByCode 函数时参数不正确, 状态不能为空!"
|
end
|
|
if ( strErr == nil ) then strErr = '' end
|
if ( type(strState) == "string" ) then
|
nBState = wms_base.Get_nConst(strLuaDEID, strState)
|
else
|
nBState = strState
|
end
|
|
-- 根据字典获取 N_B_STATE 的显示名称
|
local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_TaskState", nBState )
|
local condition = "S_CODE = '"..task_code.."'"
|
strSetAttr = "N_B_STATE = "..nBState..", S_B_STATE = '"..str_b_state.."', S_ERR = '"..strErr.."'"
|
|
-- 设置任务为执行状态
|
if ( nBState == 2 ) then
|
local curTime = os.date("%Y-%m-%d %H:%M:%S")
|
strSetAttr = strSetAttr..", T_START_TIME = '"..curTime.."'"
|
end
|
|
nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Task", condition, strSetAttr )
|
if ( nRet ~= 0 ) then
|
return nRet, "设置任务状态失败!"..strRetInfo
|
end
|
return 0, "ok"
|
end
|
|
-- 根据任务号获取任务属性,如果不存在返回非0
|
-- 0 获取任务信息 1 不存在 2 发错误
|
function wms_task.GetInfo( strLuaDEID, task_code )
|
if ( task_code == nil or task_code == '' ) then
|
return 2, "调用 WMS_Task_GetBaseInfo 函数时参数不正确,任务编码不能为空!"
|
end
|
local nRet, strRetInfo, id
|
local strCondition = "S_CODE = '"..task_code.."'"
|
nRet, id, strRetInfo = mobox.getDataObjAttrByKeyAttr( strLuaDEID, "Task", strCondition )
|
if ( nRet == 1 ) then
|
return 1, "任务编码='"..task_code.."'的任务不存在!"
|
end
|
if ( nRet ~= 0 ) then
|
return 2, "getDataObjAttrByKeyAttr 发生错误!"..id
|
end
|
|
nRet, strRetInfo = mobox.objAttrsToLuaJson( "Task", strRetInfo )
|
if ( nRet ~= 0 ) then
|
return 2, "objAttrsToLuaJson Task 失败!"..strRetInfo
|
end
|
|
local object, success
|
success, object = pcall( json.decode, strRetInfo )
|
if ( success == false ) then
|
return 2, "objAttrsToLuaJson('Task') 返回的的JSON格式不合法!"
|
end
|
object.id = id
|
return 0, object
|
end
|
|
-- 更新任务数据对象,需要有任务ID
|
-- 返回: 成功 = 0 错误 非0
|
function wms_task.Update( strLuaDEID, task )
|
if ( task.id == nil or task.id == '' ) then
|
return 1, "调用 wms_task.Update 函数时参数不正确, 任务ID不能为空!"
|
end
|
local nRet, strAttrs
|
nRet, strAttrs = mobox.luaJsonToObjAttrs(task.cls, lua.table2str(task))
|
if ( nRet ~= 0 ) then return nRet, strAttrs end
|
|
local strUpdate = '[{"id":"'..task.id..'","attrs":'..strAttrs..'}]'
|
local strRetInfo
|
|
nRet, strRetInfo = mobox.updateDataObj( strLuaDEID, task.cls, strUpdate, 1 )
|
if ( nRet ~= 0 ) then
|
return nRet, strRetInfo
|
end
|
return 0, "ok"
|
end
|
|
-- 任务下面是否存在某个动作码
|
-- task_code 任务编码
|
-- action_code 动作码
|
function wms_task.Action_Exist( strLuaDEID, task_code, action_code )
|
local nRet, strRetInfo
|
|
if ( task_code == '' or task_code == nil) then
|
return 1, "wms_task.Action_Exist 任务编码不能为空!"
|
end
|
local strCondition = "S_TASK_CODE ='"..task_code.."' AND N_ACTION_CODE = "..action_code
|
nRet, strRetInfo = mobox.existThisData( strLuaDEID, "Task_Action", strCondition )
|
if ( nRet ~= 0 ) then
|
return 1, "在【任务动作】是否存在时失败! "..strRetInfo
|
end
|
if ( strRetInfo == 'no' ) then return 0,"no" end
|
return 0, "yes"
|
end
|
|
--[[
|
通过任务对象给任务的两个货位加锁
|
task -- 任务对象
|
nStartLockType -- 开始货位的锁类型值
|
nEndLockType -- 结束货位的锁类型值
|
--]]
|
function wms_task.LockLocation( strLuaDEID, task, startLockType, endLockType )
|
local nRet, strRetInfo
|
|
if ( task == nil or type(task) ~= "table" ) then
|
return 1, "wms_task.LockLocation 函数中 task不能为空而且必须是table类型!"
|
end
|
if ( startLockType == nil or startLockType == "" ) then
|
return 1, "wms_task.LockLocation 函数中 startLockType 不能为空而且必须有值!"
|
end
|
if ( endLockType == nil or endLockType == "" ) then
|
return 1, "wms_task.LockLocation 函数中 endLockType 不能为空而且必须有值!"
|
end
|
|
local nStartLockType, nEndLockType
|
if (type(startLockType) == "string") then
|
nStartLockType = wms_base.Get_nConst( strLuaDEID, startLockType )
|
else
|
nStartLockType = startLockType
|
end
|
if (type(endLockType) == "string") then
|
nEndLockType = wms_base.Get_nConst( strLuaDEID, endLockType )
|
else
|
nEndLockType = endLockType
|
end
|
|
nRet, strRetInfo = wms.wms_LockLocation(strLuaDEID, task.start_loc_code, nStartLockType, task.code, task.op_code, task.op_name )
|
if (nRet ~= 0) then return 1, "wms_LockLocation 失败! 开始货位='"..task.start_loc_code.."' "..strRetInfo end
|
nRet, strRetInfo = wms.wms_LockLocation(strLuaDEID, task.end_loc_code, nEndLockType, task.code, task.op_code, task.op_name )
|
if (nRet ~= 0) then return 1, "wms_LockLocation 失败! 终止货位='"..task.end_loc_code.."' "..strRetInfo end
|
|
return 0
|
end
|
|
-- 获取物理库区中任务数量
|
-- area_code 物理库区 str_task_type 任务类型 (可以不输入)
|
-- 返回: nRet, nCount
|
function wms_task.GetEndLocInAreaCount( strLuaDEID, area_code, str_task_type )
|
local nRet, strRetInfo
|
local strCondition
|
|
if ( area_code == nil or area_code == '' ) then
|
return 1, "WMS_Task_GetAreaCount 函数arae_code 不能为空!"
|
end
|
|
-- 获取物理库区某种任务类型数量
|
-- N_B_STATE 0等待/1已推送/2执行中/3完成/4错误
|
strCondition = "S_END_AREA = '"..area_code.."' AND N_B_STATE <= 2 "
|
if ( str_task_type ~= nil and str_task_type ~= '') then
|
local nType
|
if ( type(str_task_type) == "string") then
|
nType = wms_base.Get_nConst( strLuaDEID, str_task_type )
|
else
|
nType = str_task_type
|
end
|
strCondition = strCondition.." AND N_TYPE = "..nType
|
end
|
|
nRet, strRetInfo = mobox.getDataObjCount( strLuaDEID, "Task", strCondition )
|
if ( nRet ~= 0 ) then
|
return nRet, strRetInfo
|
end
|
return 0, lua.StrToNumber( strRetInfo )
|
end
|
|
-- 标准的任务完成后的处理逻辑,适用于大部分的任务完成后处理
|
function wms_task.After_TaskFinish(strLuaDEID)
|
local nRet, strRetInfo
|
|
-- 获取当前触发脚本的任务信息(Task)
|
local task
|
nRet, task = m3.GetSysCurEditDataObj( strLuaDEID, "Task" )
|
if ( nRet ~= 0 ) then return 1, task end
|
|
-- 解绑起点货位
|
nRet, strRetInfo = wms_wh.Loc_Container_Unbinding( strLuaDEID, task.start_loc_code, task.cntr_code, "绑定解绑方法-系统",
|
task.op_code.." "..task.op_name )
|
if ( nRet ~= 0 ) then return 1, '货位容器解绑失败!'..strRetInfo end
|
|
-- 绑定终点货位
|
nRet, strRetInfo = wms_wh.Loc_Container_Binding( strLuaDEID, task.end_loc_code, task.cntr_code, "绑定解绑方法-系统",
|
task.op_code.." "..task.op_name )
|
if ( nRet ~= 0 ) then return 1, '货位容器绑定失败!'..strRetInfo end
|
|
-- 解锁由该任务造成的货位锁,逻辑库区锁都解除
|
nRet, strRetInfo = wms.wms_UnlockByTask( strLuaDEID, task.code )
|
if ( nRet ~= 0 ) then return 1, "wms_UnlockByTask 失败! "..strRetInfo end
|
|
return 0
|
end
|
|
return wms_task
|