using HH.WCS.Mobox3.FJJF.models; using HH.WCS.Mobox3.FJJT.api; using HH.WCS.Mobox3.FJJT.device; using HH.WCS.Mobox3.FJJT.models; using HH.WCS.Mobox3.FJJT.process; using HH.WCS.Mobox3.FJJT.util; using HH.WCS.Mobox3.FJJT.wms; using NLog.Fluent; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web.UI.WebControls; using static HH.WCS.Mobox3.FJJT.api.ApiHelper; using static HH.WCS.Mobox3.FJJT.util.Settings; namespace HH.WCS.Mobox3.FJJT.core { /// /// 定时轮询任务 /// internal class Monitor { /// /// 监听钢包满料下线MES任务 /// public static void MonitorGBOffLineMesTask() { var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING"); if (mesTaskList.Count > 0) { mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "1" && a.PALLET_TYPE == "7").ToList(); if (mesTaskList.Count > 0) { foreach (var mesTask in mesTaskList) { LogHelper.Info("MES钢包满料下线任务", "WMS"); OffLineRequest request = new OffLineRequest() { loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID }; ApiHelper.offLineProcess(request); } } } } /// /// 监听成型机叫料MES任务 /// public static void MonitorCXJCallMaterialMesTask() { var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING"); if (mesTaskList.Count > 0) { mesTaskList = mesTaskList.Where(a => a.MSG_TYPE == "0").ToList(); if (mesTaskList.Count > 0) { foreach (var mesTask in mesTaskList) { var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.EQP); if (lineSideLoc != null) { LogHelper.Info($"成型机叫料任务,MES任务ID:{mesTask.ID}", "WMS"); // 2.1成新机叫料(斜裁) if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6") { var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID); if (xcTask == null) { ApiHelper.callMaterialXC(mesTask.MATERIAL_CODE, mesTask.POSITION_ID, mesTask.ID); } else { mesTask.RETURN_CODE = xcTask.RETURN_CODE; mesTask.RECEIVE_FLAG = xcTask.RECEIVE_FLAG; mesTask.RECEIVE_DATE = xcTask.RECEIVE_DATE; WMSHelper.updateLjMesTask(mesTask); } } else { // 2.2 成新机叫料 ApiHelper.callMaterial(mesTask.MATERIAL_CODE, mesTask.EQP, mesTask.ID); } } } } } } /// /// 监听XC出库任务中间表 /// 读取斜裁立库出库任务表,查询任务是否执行完成,完成则,触发AGV任务 /// public static void MonitorXcOutTask() { var xcOutTasks = WMSHelper.getLjXcOutTask("PENDING", "2"); foreach (var outTask in xcOutTasks) { var mesTask = WMSHelper.GetLjMesTaskById(outTask.ID); if (mesTask != null && mesTask.RETURN_CODE == "2") { Location startLoc = LocationHelper.GetLoc(outTask.POSITION_ID); if (startLoc == null) { WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料出库(斜裁),起点:{outTask.POSITION_ID}在WMS系统中不存在"); } Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP); if (endLoc != null) { var wmsTask = WMSHelper.GetWmsTaskByCntr(outTask.PALLET_ID); if (wmsTask == null) { // 1.创建斜裁-成新机叫料作业 wmsTask = new WMSTask() { S_CNTR_CODE = outTask.PALLET_ID, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "叫料出库任务", S_OP_DEF_CODE = mesTask.ID.ToString(), S_OP_DEF_NAME = "成型机叫料出库任务(斜裁)", T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = wmsTask.S_CNTR_CODE, S_TYPE = wmsTask.S_TYPE, S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "AGV", N_PRIORITY = 10, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } } } } } /// /// 自动补充空工装到接驳位 /// public static void AutoReplenishEmptyPallet() { var logicConfigs = WMSHelper.getLogicConfigByTaskType("3"); if (logicConfigs != null && logicConfigs.Count > 0) { foreach (var item in logicConfigs) { var jbLoc = LocationHelper.GetLoc(item.S_LKKTJBLOC); var wmsTask = WMSHelper.GetWmsTaskByEnd(item.S_LKKTJBLOC); if (wmsTask == null && jbLoc.N_CURRENT_NUM == 0) { LogHelper.Info($"非直连接驳位:{jbLoc.S_CODE},需要补充空工装", "WMS"); Location startLoc = WMSHelper.getOutStockStartLoc(item.S_AREA_CODE, null); if (startLoc != null) { var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE); wmsTask = new WMSTask() { S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE, S_CODE = WMSHelper.GenerateTaskNo(), S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = jbLoc.S_CODE, S_END_AREA = jbLoc.S_AREA_CODE, S_TYPE = "空工装自动出库任务", S_OP_DEF_NAME = "自动补充空工装到接驳位", T_START_TIME = DateTime.Now, }; if (WMSHelper.CreateWmsTask(wmsTask)) { WCSTask wcsTask = new WCSTask() { S_OP_NAME = wmsTask.S_OP_DEF_NAME, S_OP_CODE = wmsTask.S_CODE, S_CODE = WCSHelper.GenerateTaskNo(), S_CNTR_CODE = wmsTask.S_CNTR_CODE, S_TYPE = wmsTask.S_TYPE, S_START_LOC = startLoc.S_CODE, S_START_AREA = startLoc.S_AREA_CODE, S_END_LOC = jbLoc.S_CODE, S_END_AREA = jbLoc.S_AREA_CODE, S_SCHEDULE_TYPE = "WCS", N_PRIORITY = 10, T_START_TIME = DateTime.Now, }; if (WCSHelper.CreateTask(wcsTask)) { // 起点、终点加锁 LocationHelper.LockLoc(wcsTask.S_START_LOC, 2); LocationHelper.LockLoc(wcsTask.S_END_LOC, 1); // 更新作业任务状态 wmsTask.N_B_STATE = 1; WMSHelper.UpdateTaskState(wmsTask); } } } else { WMSHelper.addAlarmRecord("流程异常", "高", $"非直连接驳位:{jbLoc.S_CODE}补充空工装失败,原因:库区:{item.S_AREA_CODE}没有空工装"); } } } } } /// /// 中转库空工装周转c厂 /// 1.监听MES任务,查询入库中转库的任务 /// 2.查询是否创建对应的空工装出库任务 /// 3.没有,则查询中转库数量满足是否创建出库任务 /// public static void ZZKInStockTaskMonitor() { } /// /// 监听MES托盘与物料信息表 、基础物料信息表 /// public static void MonitorPalletAndMateral() { // 1.监听MES托盘物料绑定关系表,更新容器物料表 LogHelper.Info("监听托盘物料绑定关系表,更新容器物料表", "WMS"); WMSHelper.updatePalletAndMateral(); // 2.监听MES物料表,更新物料信息 LogHelper.Info("监听物料表,更新物料信息", "WMS"); WMSHelper.updateMateral(); } /// /// 定时更新库存信息 更新频率: 1分钟 /// public static void UpdateInventoryRegularly() { var db = new SqlHelper().GetInstance(); var locations = db.Queryable() .LeftJoin((a, b) => a.S_CODE == b.STORAGE_LOCATION) .LeftJoin((a, b, c) => a.S_CODE == c.S_LOC_CODE) .Where((a, b, c) => b.PALLET_ID != c.S_CNTR_CODE) .ToList(); foreach (var loc in locations) { var lotOnhand = db.Queryable().Where(a => a.STORAGE_LOCATION == loc.S_CODE).First(); if (lotOnhand != null) { db.Deleteable(lotOnhand).ExecuteCommand(); } var locCntrRels = LocationHelper.GetLocCntr(loc.S_CODE); if (locCntrRels != null && locCntrRels.Count > 0) { locCntrRels.ForEach(a => { var cntrItemRels = ContainerHelper.GetCntrItemRel(a.S_CNTR_CODE); foreach (var cntrItem in cntrItemRels) { var material = WMSHelper.GetMaterial(cntrItem.S_ITEM_CODE); LjLotOnhand ljLotOnhand = new LjLotOnhand() { MATERIAL_CODE = cntrItem.S_ITEM_CODE, LOT_NAME = cntrItem.S_BATCH_NO, PALLET_ID = cntrItem.S_CNTR_CODE, STORAGE_LOCATION = loc.S_CODE, QC_STATUS = cntrItem.S_ITEM_STATE, UNIT = material.S_UNIT, QTY = cntrItem.F_QTY, IN_DATE = cntrItem.T_INBOUND_TIME, }; db.Insertable(lotOnhand).ExecuteCommand(); } }); } } } /// /// 监听批次状态表,更新批次的最长停放日期和最小停放日期 /// 更新频次:分钟 /// public static void AutoUpdateBatchStatus() { var db = new SqlHelper().GetInstance(); var lotStatusList = db.Queryable().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList(); foreach (var lotStatus in lotStatusList) { var cntrItemRels = db.Queryable().Where(a => a.S_ITEM_CODE.Trim() == lotStatus.MATERIAL_CODE && a.S_BATCH_NO == lotStatus.LOT_NAME).ToList(); if (cntrItemRels != null && cntrItemRels.Count > 0) { foreach (var item in cntrItemRels) { item.D_EXP_DATE = lotStatus.SHELFLIFE_DATE; item.D_EXP_DATE1 = lotStatus.MINSHELFLIFE_DATE; db.Updateable(lotStatus).ExecuteCommand(); } } lotStatus.RECEIVE_DATE = DateTime.Now; lotStatus.RECEIVE_FLAG = "COMPLETE"; db.Updateable(lotStatus).ExecuteCommand(); } } /// /// 监听物料配置中间表 /// public static void MonitorItemConfig() { } } }