--[[ 版本: Version 2.1 创建日期: 2023-6-16 创建人: HAN WMS-Basis-Model-Version: V15.5 功能: wms_operation Lua程序包整合了一些【作业】对象相关的操作 -- GetInfo 根据作业编号获取作业属性 -- SetEndLoc 更新【作业】对象的终点货位和库区、仓库信息 -- SetStartLoc 更新【作业】对象的起点货位和库区、仓库信息 -- Update 更新【作业】的起点和终点货位和库区、仓库等信息 -- SetCancel 设置【作业】状态=取消 -- SetFinish 设置【作业】对象的状态=完成 -- Reset 设置【作业】对象的状态=执行,前提是原来的状态=错误 -- SetTaskState 设置作业中的任务的状态,0 -- 表示任务没下发, 1 -- 表示有任务已经推送给设备 2 -- 任务已经执行 3 -- 已经执行完成 -- Create 点到点创建作业 -- CanCancel 判断作业是否可以取消 更改说明: --]] wms_base = require ("wms_base") wms_station = require( "wms_station" ) wms_putaway = require( "wms_putaway" ) local wms_op = {_version = "0.1.1"} --/////////////////////////////////////////////////////////作业相关//////////////////////////////////////////////////////////// --[[ 根据作业编号获取作业属性 返回2个值: nRet 0 成功获取信息 1 不存在 2 错误 object 作业对象 --]] function wms_op.GetInfo( strLuaDEID, op_code ) if ( op_code == nil or op_code == '' ) then return 2, "调用 wms_op.GetInfo 函数时参数不正确,作业编码不能为空!" end local nRet, strRetInfo, id, attrs local strCondition = "S_CODE = '"..op_code.."'" nRet, id, attrs = mobox.getDataObjAttrByKeyAttr( strLuaDEID, "Operation", strCondition ) if ( nRet == 1 ) then return 1, "作业编码='"..op_code.."'的作业不存在!" end if ( nRet ~= 0 ) then return 2, "getDataObjAttrByKeyAttr 发生错误!"..id end nRet, strRetInfo = mobox.objAttrsToLuaJson( "Operation", attrs ) if ( nRet ~= 0 ) then return 2, "objAttrsToLuaJson Operation 失败!"..strRetInfo end local object, success success, object = pcall( json.decode, strRetInfo ) if ( success == false ) then return 1, "objAttrsToLuaJson('Operation') 返回的的JSON格式不合法!" end object.id = id return 0, object end -- 更新【作业】的终点货位和库区、仓库等信息 --[[ 参数: strOpCode -- 作业编码 strLocCode -- 货位编码 strAreaCode -- 库区编码 strWHCode -- 仓库编码 strCntrCode -- 容器编码/可以不输入 --]] function wms_op.SetEndLoc( strLuaDEID, strOpCode, strLocCode, strAreaCode, strWHCode, strCntrCode ) local nRet, strRetInfo -- 输入参数检查 if ( strOpCode == nil or strOpCode == '' ) then return 1, "调用 wms_op.SetEndLoc 函数时参数不正确, 作业编码不能为空!" end if ( strWHCode == nil or strWHCode == '' ) then return 1, "调用 wms_op.SetEndLoc 函数时参数不正确, 仓库编码不能为空!" end if ( strAreaCode == nil or strAreaCode == '' ) then return 1, "调用 wms_op.SetEndLoc 函数时参数不正确, 库区编码不能为空!" end if ( strLocCode == nil or strLocCode == '' ) then return 1, "调用 wms_op.SetEndLoc 函数时参数不正确, 货位编码不能为空!" end local strCondition strCondition = "S_CODE = '"..strOpCode.."'" strSetAttr = "S_END_WH='"..strWHCode.."', S_END_AREA='"..strAreaCode.."', S_END_LOC='"..strLocCode.."'" if (strCntrCode ~= nil) then strSetAttr = strSetAttr..", S_CNTR_CODE='"..strCntrCode.."'" end nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end return 0,"" end -- 更新【作业】的起点货位和库区、仓库等信息 --[[ 参数: strOpCode -- 作业编码 strLocCode -- 货位编码 strAreaCode -- 库区编码 strWHCode -- 仓库编码 strCntrCode -- 容器编码/可以不输入 --]] function wms_op.SetStartLoc( strLuaDEID, strOpCode, strLocCode, strAreaCode, strWHCode, strCntrCode ) local nRet, strRetInfo -- 输入参数检查 if ( strOpCode == nil or strOpCode == '' ) then return 1, "调用 wms_op.SetStartLoc 函数时参数不正确, 作业ID不能为空!" end local strCondition strCondition = "S_CODE = '"..strOpCode.."'" strSetAttr = "S_START_WH='"..strWHCode.."', S_START_AREA='"..strAreaCode.."', S_START_LOC='"..strLocCode.."'" if (strCntrCode ~= nil) then strSetAttr = strSetAttr..", S_CNTR_CODE='"..strCntrCode.."'" end nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end return 0,"" end -- 更新【作业】的起点和终点货位和库区、仓库等信息 --[[ 参数: strOpCode -- 作业编码 strLocCode -- 货位编码 strAreaCode -- 库区编码 strWHCode -- 仓库编码 strCntrCode -- 容器编码/可以不输入 --]] function wms_op.Update( strLuaDEID, operation ) local nRet, strRetInfo -- 输入参数检查 if ( operation == nil ) then return 1, "调用 wms_op.Update 函数时参数不正确, operation 必须有值!" end local strCondition strCondition = "S_CODE = '"..operation.code.."'" strSetAttr = "S_START_WH='"..operation.start_wh_code.."', S_START_AREA='"..operation.start_area_code.."', S_START_LOC='"..operation.start_loc_code.."'," strSetAttr = strSetAttr.."S_CNTR_CODE='"..operation.cntr_code.."',S_END_WH='"..operation.end_wh_code.."', S_END_AREA='"..operation.end_area_code.."', S_END_LOC='"..operation.end_loc_code.."'" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end return 0,"" end -- 设置【作业】状态=完成 --[[ 参数: operation -- 作业编码/ 或者 operation table --]] function wms_op.SetFinish( strLuaDEID, operation ) local nRet, strRetInfo local strOpCode = '' local strCNTRCode = '' local start_time = '' local carry_cb_no = '' local carry_cb_cls = '' if ( type(operation) == "string" ) then strOpCode = operation else strOpCode = operation.code strCNTRCode = operation.cntr_code -- 作业携带容器业务类型 carry_cb_cls = operation.carry_cb_cls carry_cb_no = operation.carry_cb_no if ( operation.run_time ~= nil ) then -- 说明作业有新增的 F_RUN_TIME 属性 start_time = operation.start_time end end -- 输入参数检查 if ( strOpCode == nil or strOpCode == '' ) then return 1, "调用 wms_op.SetFinish 函数时参数不正确, 作业编码不能为空!" end --local bs_state = wms_base.Get_nConst(strLuaDEID,"作业状态-完成") local bs_state = 2 local strCondition local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_OperationState", bs_state ) local curTime = os.date("%Y-%m-%d %H:%M:%S") strCondition = "S_CODE = '"..strOpCode.."'" strSetAttr = "N_B_STATE="..bs_state..", S_B_STATE='"..str_b_state.."', T_END_TIME='"..curTime.."'" if ( start_time ~= '' ) then local st = lua.toTimestamp( start_time ) local run_time = os.difftime( os.time(), st ) strSetAttr = strSetAttr..", F_RUN_TIME = "..run_time end nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end -- 解锁由该作业造成的货位锁,逻辑库区锁都解除 nRet, strRetInfo = wms.wms_UnlockByOperation( strLuaDEID, strOpCode ) if ( nRet ~= 0 ) then return 1, "wms_UnlockByOperation 失败! "..strRetInfo end -- 容器解锁 if ( strCNTRCode ~= '' ) then -- 容器解锁 nRet, strRetInfo = wms.wms_UnlockCntr( strLuaDEID, strCNTRCode ) if ( nRet ~= 0 ) then return 1, "wms_UnlockCntr 失败!"..strRetInfo end end if ( carry_cb_cls == "Pre_Alloc_Container" ) then -- 如果作业携带的容器是【预分配容器】,需要把预分配容器的状态也设置为{完成} if ( carry_cb_no ~= '' ) then -- 配盘容器的状态 = 0,1 strCondition = "S_PAC_NO = '"..carry_cb_no.."' AND (N_B_STATE <= 1 )" strSetAttr = "N_B_STATE = 5" -- 完成 nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Pre_Alloc_Container", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end end elseif ( carry_cb_cls == "Distribution_CNTR" ) then -- 如果作业携带的容器是【预分配容器】,需要把预分配容器的状态也设置为完成 if ( carry_cb_no ~= '' ) then -- 配盘容器的状态 = 0,1,2 7 strCondition = "S_DC_NO = '"..carry_cb_no.."' AND (N_B_STATE <= 2 OR N_B_STATE = 7)" strSetAttr = "N_B_STATE = 6" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Distribution_CNTR", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end end end return 0,"" end -- 设置【作业】状态=取消 --[[ 参数: operation -- 作业编码/ 或者 operation table --]] function wms_op.SetCancel( strLuaDEID, operation ) local nRet, strRetInfo local strOpCode = '' local strCNTRCode = '' if ( type(operation) == "string" ) then strOpCode = operation else strOpCode = operation.code strCNTRCode = operation.cntr_code end -- 输入参数检查 if ( strOpCode == nil or strOpCode == '' ) then return 1, "调用 wms_op.SetFinish 函数时参数不正确, 作业编码不能为空!" end local bs_state = 7 -- 取消 local strCondition local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_OperationState", bs_state ) local curTime = os.date("%Y-%m-%d %H:%M:%S") strCondition = "S_CODE = '"..strOpCode.."'" strSetAttr = "N_B_STATE="..bs_state..", S_B_STATE='"..str_b_state.."', T_END_TIME='"..curTime.."'" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end -- 解锁由该作业造成的货位锁,逻辑库区锁都解除 nRet, strRetInfo = wms.wms_UnlockByOperation( strLuaDEID, strOpCode ) if ( nRet ~= 0 ) then return 1, "wms_UnlockByOperation 失败! "..strRetInfo end -- 容器解锁 -- lua.Debug( strLuaDEID, debug.getinfo(1), "wms_op.SetFinish --> ", strCNTRCode ) if ( strCNTRCode ~= '' ) then -- 容器解锁 nRet, strRetInfo = wms.wms_UnlockCntr( strLuaDEID, strCNTRCode ) if ( nRet ~= 0 ) then return 1, "wms_UnlockCntr 失败!"..strRetInfo end end return 0,"" end -- 设置【作业】状态=执行,错误码清空 --[[ 参数: obj -- 作业对象 --]] function wms_op.Reset( strLuaDEID, obj ) local nRet, strRetInfo assert( type(obj) == "table", "wms_op.Reset 的输入参数 obj 必须是一个 table 类型" ) assert( obj.cls == "Operation", "wms_op.Reset 的输入参数 obj 必须是'Operation'类型的数据对象" ) local bs_state = obj.laste_bs_state local strCondition local str_b_state = wms_base.GetDictItemName( strLuaDEID, "WMS_OperationState", bs_state ) strCondition = "S_CODE = '"..obj.code.."' AND N_B_STATE >= 3" strSetAttr = "N_FAIL_COUNT = 0, N_B_STATE="..bs_state..", S_B_STATE='"..str_b_state.."', S_ERR=''" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end return 0,"" end -- 设置作业状态 function wms_op.SetTaskState( strLuaDEID, op_code, task_state ) local nRet, strRetInfo if ( op_code == nil or op_code == '') then return 1, "函数 wms_op.SetTaskState 中的 op_code 必须有值!" end if ( task_state == nil ) then return 1, "函数 wms_op.SetTaskState 中的 task_state 必须有值!" end -- 设置任务已经推送 local strCondition, strSetAttr if ( task_state == 1 ) then strCondition = "S_CODE = '"..op_code.."' AND N_TASK_STATE = 0" strSetAttr = "N_TASK_STATE = 1" -- 2 任务已经执行 elseif ( task_state == 2 ) then strCondition = "S_CODE = '"..op_code.."' AND N_TASK_STATE = 1" strSetAttr = "N_TASK_STATE = 2" else return 0 end nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Operation", strCondition, strSetAttr ) if ( nRet ~= 0 ) then return nRet, strRetInfo end return 0 end --[[ 点到点创建作业 输入参数: -- cntr_code 容器号 -- from_loc_code 起点 -- to_loc_code 终点 -- op_def_name 作业定义名称 -- ext_info = { lock_cntr 启动时是否锁容器, source_sys 来源系统, bs_type, bs_no } 返回: nRet operation ]] function wms_op.Create( strLuaDEID, cntr_code, from_loc_code, to_loc_code, op_type, op_def_name, ext_info ) local nRet, strRetInfo -- 输入参数验证 if ( lua.StrIsEmpty( to_loc_code ) ) then return 1, "wms_op.Create 函数参数 to_loc_code 非法!" end if ( lua.StrIsEmpty( cntr_code ) ) then return 1, "wms_op.Create 函数参数 cntr_code 非法!" end if ( lua.StrIsEmpty( from_loc_code ) ) then return 1, "wms_op.Create 函数参数 from_loc_code 非法!" end if ( lua.StrIsEmpty( op_def_name ) ) then return 1, "wms_op.Create 函数参数 op_def_name 非法!" end if ( op_type == nil ) then return 1, "wms_op.Create 函数参数 op_type 非法!" end local source_sys = "" local lock_cntr = 'Y' local bs_type = '' local bs_no = '' if ( ext_info ~= nil ) then source_sys = lua.Get_StrAttrValue( ext_info.source_sys ) bs_type = lua.Get_StrAttrValue( ext_info.bs_type ) bs_no = lua.Get_StrAttrValue( ext_info.bs_no ) lock_cntr = lua.Get_StrAttrValue( ext_info.lock_cntr ) end if ( lock_cntr == '' ) then lock_cntr = 'Y' end local to_loc nRet, to_loc = wms_wh.GetLocInfo( to_loc_code ) if ( nRet ~= 0 ) then return 1, '获取货位信息失败! '..to_loc end local from_loc nRet, from_loc = wms_wh.GetLocInfo( from_loc_code ) if ( nRet ~= 0 ) then return 1, '获取货位信息失败! '..from_loc end local operation = m3.AllocObject(strLuaDEID,"Operation") operation.source_sys = source_sys operation.start_wh_code = from_loc.wh_code operation.start_area_code = from_loc.area_code operation.start_loc_code = from_loc_code operation.end_wh_code = to_loc.wh_code operation.end_area_code = to_loc.area_code operation.end_loc_code = to_loc_code operation.op_type = op_type operation.op_def_name = op_def_name operation.cntr_code = cntr_code operation.lock_cntr = lock_cntr operation.bs_type = bs_type operation.bs_no = bs_no nRet, operation = m3.CreateDataObj( strLuaDEID, operation ) if ( nRet ~= 0 ) then return 2, '创建【作业】失败!'..operation end return 0, operation end -- 判断作业是否可以取消, 顺带返回作业对象 -- 返回3个参数 -- nRet = 0 函数执行正确 非1错误 -- can_cancel = false, true -- operation 作业对象 function wms_op.CanCancel( strLuaDEID, op_code ) local nRet, strRetInfo local operation nRet, operation = wms_op.GetInfo( strLuaDEID, op_code ) if ( nRet == 1 ) then -- 作业已经被删除,不存在 operation = nil return 0, true, operation end if ( nRet > 1 ) then return nRet, operation end -- 作业已经完成不能取消 if ( operation.bs_state == 2 ) then return 0, false, operation end -- 作业在执行中 if ( operation.bs_state == 1 ) then if ( operation.task_state == 2 ) then return 0, false, operation end end return 0, true, operation end --[[ 创建一个配盘出库作业 dist_cntr_data 配盘数据对象 { S_DC_NO ='',S_CNTR_CODE = '',...} parameter 创建作业附带参数 { op_def_name -- 出库作业的作业定义名称 to_staion -- 出库到站台 source_sys -- 来源业务系统(如果有多系统时需要对作业进行区分,一般为空) } --]] function wms_op.Create_Distribution_OutOperation ( strLuaDEID, dist_cntr_data, parameter ) local nRet, strRetInfo local msg local dc_no = dist_cntr_data.S_DC_NO local b_state = lua.Get_NumAttrValue( dist_cntr_data.N_B_STATE ) local to_station = lua.Get_StrAttrValue( dist_cntr_data.S_STATION_NO ) local cntr_code = dist_cntr_data.S_CNTR_CODE local from_loc_code = lua.Get_StrAttrValue( dist_cntr_data.S_LOC_CODE ) local to_loc_code = lua.Get_StrAttrValue( dist_cntr_data.S_EXIT_LOC_CODE ) -- 出库货位 local bs_no = lua.Get_StrAttrValue( dist_cntr_data.S_BS_NO ) -- 业务来源 local bs_type = lua.Get_StrAttrValue( dist_cntr_data.S_BS_TYPE ) -- 业务来源类型 if parameter == nil or parameter == '' then return 1, "wms_op.Create_Distribution_OutOperation 函数中 parameter 必须有值!" end if to_station == '' then to_station = parameter.to_station or '' end local op_def_name = parameter.op_def_name or '' if op_def_name == '' then return 1, "wms_op.Create_Distribution_OutOperation 函数中 parameter 中必须有 op_def_name!" end -- 【配盘】数据对象属性判断,不合法的终止程序执行 -- b_state 不是配货完成状态 if ( b_state ~= DIST_CNTR_STATE.PrePickingOK ) then msg = "配盘号'"..dc_no.."'的状态不是配货完成状态,不能启动配盘出库作业!" lua.Warning( strLuaDEID, debug.getinfo(1), msg ) return 1, msg end if ( from_loc_code == '') then from_loc_code = wms_wh.GetLocCodeByCNTR( strLuaDEID, cntr_code ) if ( from_loc_code == nil or from_loc_code == '' ) then return 1, "配盘号'"..pac_no.."'中的容器'"..cntr_code.."'没有绑定货位!" end end local from_loc nRet, from_loc = wms_wh.GetLocInfo( from_loc_code ) if ( nRet ~= 0 ) then return 1, '获取货位信息失败! '..loc_code end -- 获取站点货位,站点货位定义在常量中 if ( to_loc_code == '' ) then if ( to_station == '') then return 1, "配盘号'"..dc_no.."'的配盘没定义出库站台或货位!" end nRet, to_loc_code = wms_station.Get_Station_Loc( strLuaDEID, to_station ) if nRet ~= 0 then return 2, "wms_station.Get_Station_Loc失败! "..to_loc_code end end local to_loc nRet, to_loc = wms_wh.GetLocInfo( to_loc_code ) if ( nRet ~= 0 ) then return 1, '获取货位信息失败! '..to_loc end -- 创建【货品出库】作业. 【配盘】状态改为2(出库中) local operation = m3.AllocObject(strLuaDEID,"Operation") operation.bs_state = 8 -- 待启动前,这些作业有待后台脚本来设置为状态 0 operation.start_wh_code = from_loc.wh_code operation.start_area_code = from_loc.area_code operation.start_loc_code = from_loc_code operation.end_wh_code = to_loc.wh_code operation.end_area_code = to_loc.area_code operation.end_loc_code = to_loc_code operation.op_type = OPERATION_TYPE.Outbound operation.op_def_name = op_def_name operation.cntr_code = cntr_code -- 说明作业携带的容器的业务类型 operation.carry_cb_cls = "Distribution_CNTR" operation.carry_cb_no = dc_no operation.source_sys = parameter.source_sys or '' operation.bs_type = bs_type operation.bs_no = bs_no nRet, operation = m3.CreateDataObj( strLuaDEID, operation ) if ( nRet ~= 0 ) then return 1, '创建【作业】失败!'..operation end -- 更新【配盘】对象属性 -- DIST_CNTR_STATE.Out 表示配盘容器已经安排作业进行搬运 local strUpdateSql = "S_LOC_CODE = '"..from_loc_code.."', N_B_STATE = "..DIST_CNTR_STATE.Out..", S_OUT_OP_NO = '"..operation.code.."'" strCondition = "S_DC_NO = '"..dc_no.."'" nRet, strRetInfo = mobox.updateDataAttrByCondition( strLuaDEID, "Distribution_CNTR", strCondition, strUpdateSql ) if ( nRet ~= 0 ) then return 1, "更新【配盘】信息失败!"..strRetInfo end return 0 end --[[ 根据站台位置创建一个入库到立库的入库作业,适合站台-->立库, 物流规划: 通过AGV或输送线把料箱从站台搬运到立库巷道堆垛机入库接驳位,然后堆垛机从接驳位取货搬运到立库 -- 首先要计算出作业的入库货位,根据这个货位确定巷道接驳位 -- 创建一个作业 输入参数: -- station 站台位置 -- cntr_code 容器号 -- op_def_name 作业定义 -- parameter 输入参数{ carry_cb_cls,carry_cb_no -- 作业携带的容器目前的业务类型,比如 预分配容器,配盘,。。。 bs_type,bs_no -- 入库作业相关的业务类型如入库单,入库波次 factory -- 工厂标识 op_def_name -- 入库作业类型定义 } carry_cb_cls -- 作业携带容器的业务类型(预分配容器,配盘容器,盘点容器) 返回: nRet operation ]] function wms_op.Create_Inbound_Operation( strLuaDEID, station, cntr_code, parameter ) local nRet, strRetInfo local loc_code nRet, loc_code = wms_station.Get_Station_Loc( strLuaDEID, station ) if ( nRet ~= 0 ) then return 1, loc_code end local loc nRet, loc = wms_wh.GetLocInfo( loc_code ) if ( nRet ~= 0 ) then return 1, '获取货位信息失败! '..loc_code end --V2.0 创建作业前对容器进行判断,如容器已经存在 active 作业,不能创建 nRet, can_usedin_op = wms_cntr.CanUsedInOperation( strLuaDEID, cntr_code ) if ( nRet ~= 0 ) then return 2, can_usedin_op end if ( can_usedin_op == false ) then return 1, "料箱'"..cntr_code.."'存在未完成的作业,不能继续创建作业!" end local storage_arae nRet, storage_arae = wms_base.Get_sConst2("料箱库存储区") if ( nRet ~= 0 ) then return 1 ,"系统无法获取常量'料箱库存储区'" end -- 获取入库作业类型,通过作业类型里定义的上架策略来计算 入库货位 local op_def local op_def_name = parameter.op_def_name or '' if op_def_name == '' then return 1, "在创建入库作业时失败,没定义入库作业类型!" end local factory = parameter.factory or '' if factory == '' then return 1, "在创建入库作业时失败, 在parameter参数中没定义工厂标识!" end nRet, op_def = wms_base.GetOpDefInfo( factory, op_def_name ) if nRet ~= 0 then return 1, "系统无法获取名为'"..op_def_name.."'的作业类型! "..op_def end -- 计算料箱入库货位,首先计算到哪个输送线入库缓存区 local str_end_loc_code = '' local aisle_in_loc = '' local end_loc = {} local end_wh_code = '' local end_area_code = '' -- -- [TP] 接驳位/转移点 -- 要求计算接驳位负载情况 -- if op_def.hand_proc == "[Station]->[TP]->[Stacker-AS/RS]" then -- -- 模式1# 【站台】-->【巷道接驳位】-->【堆垛机立库】 -- -- 需要考虑堆垛机的工作状态 -- if op_def.putaway_rule == '' then -- -- 如果没定义上架策略就根据 站台对接的库区进行入库货位计算,对上架的容器没有位置控制要求 -- nRet, aisle_in_loc, str_end_loc_code = wms_putaway.Get_StorageCache_Loc( strLuaDEID, station ) -- if ( nRet ~= 0 ) then -- if ( nRet == 1 ) then -- return 1, "prj_base.Get_StorageCache_Loc 失败!"..aisle_in_loc -- end -- return 2, aisle_in_loc -- end -- nRet, end_loc = wms_wh.GetLocInfo( str_end_loc_code ) -- if ( nRet ~= 0 ) then -- return 2, '获取货位信息失败! '..str_end_loc_code -- end -- end_wh_code = end_loc.wh_code -- end_area_code = end_loc.area_code -- else -- -- 通过上架策略来计算货位 -- return 2, "程序还没完成..." -- end -- elseif op_def.hand_proc == "[Station]->[Picking-AGV-AS/RS]" then -- -- 特点:Picking-AGV 不一定要求计算到货位,大部分情况到货区即可 -- end -- 计算料箱入库货位,首先计算到哪个输送线入库缓存区 local strCondition = "C_ENABLE = 'Y' AND S_AREA_CODE = '" .. storage_arae .. "' AND N_CURRENT_NUM = 0 AND N_LOCK_STATE = 0" local strOrder = "S_CODE" local loc_objs = {} local aisle_connect_loc_set = {} -- 查询 Location 表 local nRet nRet, loc_objs = m3.QueryDataObject(strLuaDEID, "Location", strCondition, strOrder) if (nRet ~= 0) then return 2, '获取货位信息失败! '..loc_objs end -- 定义 END_CODE local str_end_loc_code = nil local item_set = {} local object_attr for n = 1, #loc_objs do object_attr = m3.KeyValueAttrsToObjAttr(loc_objs[n].attrs) table.insert( item_set, object_attr.S_CODE ) end if #item_set > 0 then math.randomseed(os.time()) local index = math.random(1, #item_set) str_end_loc_code = item_set[index] else return 2, '未找到可用的货位! ' end local end_loc nRet, end_loc = wms_wh.GetLocInfo( str_end_loc_code ) if ( nRet ~= 0 ) then return 2, '获取货位信息失败! '..str_end_loc_code end -- 计算料箱入库货位,首先计算到哪个输送线入库缓存区 local sqlstrCondition = "C_ENABLE = 'Y' AND S_AREA_CODE = '" .. storage_arae .. "' AND S_PURPOSE = '接驳' " -- 查询 Location 表 local nRet nRet, ansib_objs = m3.QueryDataObject(strLuaDEID, "Location", sqlstrCondition, strOrder) if (nRet ~= 0) then return 2, '获取货位信息失败! '..loc_objs end -- 定义 END_CODE local ansib_end_loc_code = nil local item_objs = {} local object_attr for n = 1, #ansib_objs do object_attr = m3.KeyValueAttrsToObjAttr(ansib_objs[n].attrs) table.insert( item_objs, object_attr.S_CODE ) end if #item_objs > 0 then math.randomseed(os.time()) local index = math.random(1, #item_objs) ansib_end_loc_code = item_objs[index] else return 2, '未找到可用的货位! ' end local operation = m3.AllocObject(strLuaDEID,"Operation") operation.source_sys = op_def.source_sys operation.start_wh_code = loc.wh_code operation.start_area_code = loc.area_code operation.start_loc_code = loc_code operation.end_wh_code = end_loc.wh_code operation.end_area_code = end_loc.area_code operation.end_loc_code = str_end_loc_code operation.ext_data = ansib_end_loc_code -- 巷道口入库缓存货位 operation.op_type = OPERATION_TYPE.Inbound operation.op_def_name = op_def_name operation.cntr_code = cntr_code if ( parameter ~= nil and parameter ~= '') then operation.carry_cb_cls = lua.Get_StrAttrValue( parameter.carry_cb_cls ) operation.carry_cb_no = lua.Get_StrAttrValue( parameter.carry_cb_no ) operation.bs_type = lua.Get_StrAttrValue( parameter.bs_type ) operation.bs_no = lua.Get_StrAttrValue( parameter.bs_no ) end nRet, operation = m3.CreateDataObj( strLuaDEID, operation ) if ( nRet ~= 0 ) then return 2, '创建【作业】失败!'..operation end return 0, operation end return wms_op