--[[ 编码: GT-119-19 名称: 创建作业 作者:LZH 日期:2024/8/13 函数: CreateOperation 功能: step1 判断出库单据是否是启动状态 step2 启动状态则通过出库策略获取作业起点 step3 创建作业 变更记录: V1.1 LZH 20241122 出库单修改为主子表,代码调整 V1.2 LZH 20250326 新增采购退货流程,如果GTWMS下发的终点机台为固定的 --]] json = require("json") mobox = require("OILua_JavelinExt") m3 = require("oi_base_mobox") wms_base = require("wms_base") require("GT-Base") require("GT_InAndOutboundPolicies") wms_wh = require("wms_wh") function CreateOperation(strLuaDEID) local nRet, strRetInfo local stock_out nRet, stock_out = m3.GetSysCurEditDataObj(strLuaDEID, "GT_Stock_Out") if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), stock_out) end lua.Debug(strLuaDEID, debug.getinfo(1), 'stock_out', stock_out) local ret_loc if (stock_out.state == '启用') then -- 获取该物料的物料类型 local item_type, material nRet, item_type, material = GT_Get_ItemType(strLuaDEID, stock_out.item_code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), item_type) end -- 获取 物料+批号 所在库区 local strCondition = "S_CNTR_CODE IN (SELECT S_CNTR_CODE FROM TN_CG_Detail WHERE S_ITEM_CODE = '" .. stock_out.item_code .. "' AND S_BATCH_NO = '" .. stock_out.batch_no .. "')" local loc_container nRet, loc_container = m3.GetDataObjByCondition(strLuaDEID, "Loc_Container", strCondition) if (nRet == 1) then lua.Error(strLuaDEID, debug.getinfo(1), "不存在批次号为" .. stock_out.batch_no .. "的物料!") elseif (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "m3.GetDataObjByCondition 失败!" .. loc_container) end -- 获取货位信息 local loc_info nRet, loc_info = wms_wh.Location_GetInfo(strLuaDEID, loc_container.loc_code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "WMS_Location_GetInfo失败!" .. loc_info) end local op_def_name = '' local end_loc_code, loc_baseinfo if (stock_out.ms_code == 'ABC') then op_def_name = "采购退货" -- 获取机台下维护的出库库区 local area_link strCondition = "S_MS_CODE = 'ABC'" nRet, area_link = m3.QueryDataObject(strLuaDEID, "MS_Area_Link", strCondition) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '获取采购退货机台信息失败!' .. area_link) end if (area_link == nil or area_link == '') then lua.Error(strLuaDEID, debug.getinfo(1), '请维护采购退货出库库区或位置!') end lua.Debug(strLuaDEID, debug.getinfo(1), 'area_link', area_link) -- 获取随机数,随机指定出库库区位置 local randomInt = math.random(1, #area_link) local attr nRet, attr = m3.ObjAttrStrToLuaObj("MS_Area_Link", lua.table2str(area_link[randomInt].attrs)) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "m3.ObjAttrStrToLuaObj(GT_Label_Crad) 失败! " .. attr) end lua.Debug(strLuaDEID, debug.getinfo(1), 'attr', attr) if (tonumber(attr.la_type) == 0) then end_loc_code = attr.la_code .. "-QY" elseif (tonumber(attr.la_type) == 1) then end_loc_code = attr.la_code end else if (loc_info.area_code == 'PFL' or loc_info.area_code == 'TFL' or loc_info.area_code == 'HWPFL' or loc_info.area_code == 'HWTFL') then nRet, ret_loc = FL_StockOut(strLuaDEID, stock_out) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), ret_loc) end op_def_name = "粉料出库" end_loc_code = stock_out.ms_code elseif (loc_info.area_code == 'LK') then nRet, ret_loc = LK_StockOut(strLuaDEID, stock_out) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), ret_loc) end op_def_name = "立库出库" nRet, end_loc_code = wms_base.GetAreaAvaliableLoc(strLuaDEID, stock_out.ms_code, "") if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "WMS_GetAreaAvaliableLoc失败!" .. end_loc_code) end end_loc_code = end_loc_code.loc_code end if (ret_loc == nil or ret_loc == '') then lua.Error(strLuaDEID, debug.getinfo(1), "没有可出库的货品!") end lua.Debug(strLuaDEID, debug.getinfo(1), 'ret_loc', ret_loc) nRet, loc_baseinfo = wms.wms_GetLocBaseInfo(ret_loc.start_loc_code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取货位基本信息失败!" .. loc_baseinfo) end lua.Debug(strLuaDEID, debug.getinfo(1), '起点货位信息', loc_baseinfo) loc_baseinfo = json.decode(loc_baseinfo) end lua.Debug(strLuaDEID, debug.getinfo(1), 'end_loc_code', end_loc_code) local end_loc nRet, end_loc = wms.wms_GetLocBaseInfo(end_loc_code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "获取货位基本信息失败!" .. end_loc) end lua.Debug(strLuaDEID, debug.getinfo(1), '终点货位信息', end_loc) end_loc = json.decode(end_loc) -- step4: 创建搬运作业 local operation = m3.AllocObject(strLuaDEID, "Operation") operation.start_wh_code = loc_baseinfo.wh_code operation.start_area_code = loc_baseinfo.area_code operation.start_loc_code = loc_baseinfo.code -- 终点是佳通WMS传过来的 operation.end_wh_code = end_loc.wh_code operation.end_area_code = end_loc.area_code operation.end_loc_code = end_loc.code operation.bs_no = stock_out.delivery_no -- 业务单号为出库任务号 operation.cntr_code = ret_loc.cntr_code operation.op_def_name = op_def_name operation.op_type = wms_base.Get_nConst(strLuaDEID, "作业类型-出库") local strCode local strHeader = 'TA' .. os.date("%y%m%d") .. '-' nRet, strCode = mobox.getSerialNumber("任务", strHeader, 5) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '申请【任务】编码失败!' .. strCode) end -- 设置扩展参数带入作业启动,任务完成 local ext_table = {} ext_table.batch_no = stock_out.batch_no ext_table.item_type = item_type ext_table.delivery_no = stock_out.delivery_no ext_table.task_no = strCode operation.ext_data = lua.table2str(ext_table) nRet, operation = m3.CreateDataObj(strLuaDEID, operation) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '创建【作业】失败!' .. operation) end -- 作业的起点加锁 nRet, strRetInfo = wms.wms_LockLocation(strLuaDEID, operation.start_loc_code, wms_base.Get_nConst(strLuaDEID, "锁类型-出库锁"), strCode, operation.code, operation.op_def_name) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), "wms_LockLocation 失败!" .. strRetInfo) end -- 容器加锁 local container nRet, container = wms_cntr.GetInfo(strLuaDEID, operation.cntr_code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1),'获取容器对象失败!' .. container) end nRet, strRetInfo = wms_cntr.SetLock(strLuaDEID, container, "锁类型-出库锁", operation.code) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '托盘容器添加出库锁失败!' .. strRetInfo) end -- 新增出库单明细 local so_detail = m3.AllocObject(strLuaDEID, "GT_SO_Detail") -- 起点信息 so_detail.delivery_no = stock_out.delivery_no so_detail.op_code = operation.code so_detail.cntr_code = ret_loc.cntr_code so_detail.start_area_code = loc_baseinfo.area_code so_detail.start_loc_code = loc_baseinfo.code so_detail.end_area_code = end_loc.area_code so_detail.end_loc_code = end_loc.code nRet, so_detail = m3.CreateDataObj(strLuaDEID, so_detail) if (nRet ~= 0) then lua.Error(strLuaDEID, debug.getinfo(1), '创建【出库单明细】失败!' .. so_detail) end end end