New file |
| | |
| | | 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 |
| | | { |
| | | /// <summary> |
| | | /// 定时轮询任务 |
| | | /// </summary> |
| | | internal class Monitor |
| | | { |
| | | |
| | | /// <summary> |
| | | /// 监听MES任务中间表 |
| | | /// 1.钢包满料下线 |
| | | /// 2.成型机叫料 |
| | | /// </summary> |
| | | public static void MonitorMesTask() { |
| | | LogHelper.Info("监听MES任务中间表", "WMS"); |
| | | var mesTaskList = WMSHelper.GetLjMesTaskList("PENDING"); |
| | | foreach (var mesTask in mesTaskList) |
| | | { |
| | | // 1.钢包满料下线 |
| | | List<string> lineLoclist = new List<string>() { }; |
| | | lineLoclist.Add("GBJTW-01"); |
| | | lineLoclist.Add("GBJTW-02"); |
| | | if (mesTask.MSG_TYPE == "1" && mesTask.PALLET_TYPE == "7" && lineLoclist.Contains(mesTask.PALLET_ID)) |
| | | { |
| | | LogHelper.Info("MES钢包满料下线任务", "WMS"); |
| | | OffLineRequest request = new OffLineRequest(){ loc = mesTask.POSITION_ID, cntrNo = mesTask.PALLET_ID}; |
| | | ApiHelper.offLineProcess(request); |
| | | } |
| | | |
| | | // 2.成新机叫料 |
| | | if (mesTask.MSG_TYPE == "0") { |
| | | var lineSideLoc = WMSHelper.GetLineSideLoc(mesTask.POSITION_ID); |
| | | if (lineSideLoc != null ) |
| | | { |
| | | LogHelper.Info("MES成新机叫料任务", "WMS"); |
| | | |
| | | // 2.1成新机叫料(斜裁) |
| | | if (mesTask.PALLET_TYPE == "5" || mesTask.PALLET_TYPE == "6") |
| | | { |
| | | var xcTask = WMSHelper.GetLjXcTaskById(mesTask.ID); |
| | | if (xcTask == null) |
| | | { |
| | | ApiHelper.callMaterialHDK(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.POSITION_ID, mesTask.ID); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 监听XC出库任务中间表 |
| | | /// 读取斜裁立库出库任务表,查询任务是否执行完成,完成则,触发AGV任务 |
| | | /// </summary> |
| | | 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); |
| | | Location endLoc = LocationHelper.GetLoc(mesTask.POSITION_ID); |
| | | |
| | | var wmsTask = WMSHelper.GetWmsTaskByCntr(outTask.PALLET_ID); |
| | | if (wmsTask == null) |
| | | { |
| | | if (startLoc.N_LOCK_STATE == 0 && endLoc.N_LOCK_STATE == 0) |
| | | { |
| | | // 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); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"XC出库任务ID:{mesTask.ID},无法生成叫料任务,起点或终点上锁", "斜裁"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | 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); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 自动补充空工装到接驳位 |
| | | /// </summary> |
| | | 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}没有空工装"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 中转库空工装周转c厂 |
| | | /// 1.监听MES任务,查询入库中转库的任务 |
| | | /// 2.查询是否创建对应的空工装出库任务 |
| | | /// 3.没有,则查询中转库数量满足是否创建出库任务 |
| | | /// </summary> |
| | | public static void ZZKInStockTaskMonitor() { |
| | | |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 监听MES托盘与物料信息表 、基础物料信息表 |
| | | /// </summary> |
| | | public static void MonitorPalletAndMateral() |
| | | { |
| | | // 1.监听MES托盘物料绑定关系表,更新容器物料表 |
| | | LogHelper.Info("监听托盘物料绑定关系表,更新容器物料表", "WMS"); |
| | | WMSHelper.updatePalletAndMateral(); |
| | | |
| | | |
| | | // 2.监听MES物料表,更新物料信息 |
| | | LogHelper.Info("监听物料表,更新物料信息", "WMS"); |
| | | WMSHelper.updateMateral(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 定时更新库存信息 更新频率: 1分钟 |
| | | /// </summary> |
| | | public static void UpdateInventoryRegularly() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var locations = db.Queryable<Location>() |
| | | .LeftJoin<LjLotOnhand>((a, b) => a.S_CODE == b.STORAGE_LOCATION) |
| | | .LeftJoin<LocCntrRel>((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<LjLotOnhand>().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(); |
| | | } |
| | | }); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 监听批次状态表,更新批次的最长停放日期和最小停放日期 |
| | | /// 更新频次:分钟 |
| | | /// </summary> |
| | | public static void AutoUpdateBatchStatus() { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var lotStatusList = db.Queryable<LjLotStatus>().Where(a => a.RECEIVE_FLAG.Trim() == "PENDING").ToList(); |
| | | foreach (var lotStatus in lotStatusList) |
| | | { |
| | | var cntrItemRels = db.Queryable<CntrItemRel>().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(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 监听物料配置中间表 |
| | | /// </summary> |
| | | public static void MonitorItemConfig() |
| | | { |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | } |