using HH.WCS.NongFuChaYuan.DeviceService; using HH.WCS.NongFuChaYuan.TaskController; using HH.WCS.NongFuChaYuan.OtherService; using HH.WCS.NongFuChaYuan.WmsService; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using HH.WCS.NongFuChaYuan.DispatchService; using SqlSugar; namespace HH.WCS.NongFuChaYuan.TaskController { /// /// 定时轮询任务 /// internal class Monitor { private static ModbusHelper modbusHelper = new ModbusHelper(); private static WCSHelper WCSHelper = new WCSHelper(); #region 农夫山泉-大明山工厂 /// /// 自动移库 从0点开始移库(前一天的批次号) /// public static void AnalysisProductLine() { //查找前一天的中间表数据 var db = new SqlHelper().GetInstance(); var oldbatch = DateTime.Now.AddDays(-1).ToString("yyyyMMdd").Substring(2); var newbatch = DateTime.Now.ToString("yyyyMMdd").Substring(2); LogHelper.Info($"昨天批次={oldbatch},当天批次={newbatch}", "自动移库"); var movelist = db.Queryable().Where(a => a.Batch.Contains(oldbatch)).ToList(); if (movelist.Count > 0) { if (DateTime.Now > DateTime.Parse("9:30")) { LogHelper.Info($"中间表查找到前一天的批次 开始查找自动移库工单进行移库", "自动移库"); //查找工单 如果状态为执行中则开始移库 var worklist = movelist.GroupBy(a => a.DeviceName).ToList(); for (int k = 0; k < worklist.Count(); k++) { var deviceinfo = worklist[k].OrderBy(a => a.DeviceName).First(); var fulenewbatch = ""; var fuleoldbatch = ""; if (deviceinfo.DeviceName.Contains("SL1")) { fulenewbatch = newbatch + "SL1"; fuleoldbatch = oldbatch + "SL1"; } else { fulenewbatch = newbatch + "SL2"; fuleoldbatch = oldbatch + "SL2"; } var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWorkType("自动移库", fulenewbatch, deviceinfo.DeviceName); if (WorkInfo.Count > 0) { var rowlist = new List(); var oldrowlist = new List(); LogHelper.Info($"查找到自动移库工单 判断状态是否是执行中", "自动移库"); var state = WorkInfo.Where(a => a.S_WorkState == "执行中").ToList(); if (state.Count > 0) { //执行移库 将产线分开进行移库 for (int i = 0; i < state.Count; i++) { var list = movelist.Where(a => a.DeviceName == state[i].S_PLineNo).ToList(); //拿出中间表记录的排数据 for (int j = 0; j < list.Count; j++) { rowlist.Add(list[j].RowNo); oldrowlist.Add(list[j].RowNo); } //判断这条产线对应的排有没有任务 if (IntensiveArea.TaskTakeAreaOver2(rowlist)) { //排除放满的排和空的排并解锁 LogHelper.Info($"产线 {list[0].DeviceName} 下线的所有排为{JsonConvert.SerializeObject(rowlist)}", "自动移库"); IntensiveArea.ExcludeFullEmyRow(ref rowlist, state[i].S_PLineNo); if (rowlist.Count() >= 2) { LogHelper.Info($"产线 {list[0].DeviceName} 经过空满判断排除过后 剩下的所有排为{JsonConvert.SerializeObject(rowlist)}", "自动移库"); //锁定剩下的排 排除货位有锁的情况 IntensiveArea.LockYiKu(ref rowlist); LogHelper.Info($"产线 {list[0].DeviceName} 经过锁定排除过后 剩下的所有排为{JsonConvert.SerializeObject(rowlist)}", "自动移库"); //剩下的排进行物料匹配生成任务 var res = IntensiveArea.GetYiKuLocation(rowlist, state[i], fuleoldbatch); if (!res && oldrowlist.Count() == rowlist.Count()) { //结束工单并删除中间表数据 WCSHelper.EndYiKuWorkOrder(state[i].S_PLineNo, state[i].S_BatchNo, oldbatch); foreach (var item in rowlist) { IntensiveArea.UnlockYiKu(item); } } } else { //结束工单删除中间表数据 WCSHelper.EndYiKuWorkOrder(state[i].S_PLineNo, state[i].S_BatchNo, oldbatch); foreach (var item in rowlist) { IntensiveArea.UnlockYiKu(item); } } } } } else { LogHelper.Info($"自动移库工单状态不为执行中 可能已完成或暂停 详情看mobox工单管理", "自动移库"); } } else { LogHelper.Info($"没有查找到当天的自动移库工单 自动创建自动移库工单", "自动移库"); //创建自动移库工单 WorkOrder workorder = new WorkOrder { S_WorkNo = deviceinfo.Batch + "00" + (k + 1).ToString(), S_PLineNo = deviceinfo.DeviceName, S_BatchNo = fulenewbatch, S_ORDER_TYPE = "自动移库", S_WorkState = "执行中" }; WCSHelper.DaMingShanInsertWork(workorder); } } } } } /// /// 备货移库 /// internal static void AnalysisStockup() { var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWork("备货移库"); if (WorkInfo != null) { AnalysisCularAndStock1(WorkInfo); } } /// /// 更新实时库存 /// internal static void PanKurealtime() { var db = new SqlHelper().GetInstance(); var list = Settings.GetPanKuList(); if (list.Count() > 0) { list.ForEach(b => { var collist = db.Queryable().Where(a => a.S_AREA_CODE == b).PartitionBy(a => a.N_ROW).OrderByDescending(a => a.N_COL).Take(1).ToList(); collist.ForEach(c => { var locinfo = db.Queryable().Where(a => a.N_ROW == c.N_ROW && a.N_CURRENT_NUM > 0).First(); if (locinfo == null) { var pankuinfo = db.Queryable().Where(a => a.N_ROW == c.N_ROW).First(); if (pankuinfo == null) { //插入盘库数据 LogHelper.Info($"插入空排数据"); var pk = new DaMingShanPanKuTask { N_CURRENT_NUM = 0, N_ROW = c.N_ROW, S_AREA_CODE = b }; db.Insertable(pk).ExecuteCommand(); } else { //更新盘库数据中间表 LogHelper.Info($"更新空排数据"); pankuinfo.N_CURRENT_NUM = 0; pankuinfo.S_BatchNo = ""; pankuinfo.SQL_Condition = ""; pankuinfo.S_ItemCode = ""; pankuinfo.S_PLineNo = ""; pankuinfo.S_AREA_CODE = b; db.Updateable(pankuinfo).WhereColumns(a => new { a.S_ID }).ExecuteCommand(); } } else { var iteminfo = db.Queryable().Where(a => a.S_LOC_CODE == locinfo.S_LOC_CODE).Includes(a => a.CntrItemRel).First(); var numinfo = db.Queryable().Where(a => a.N_ROW == c.N_ROW).Select(a => new { sum = SqlFunc.AggregateSum(a.N_CURRENT_NUM) }).First(); var condition = WCSHelper.GetItemrel(iteminfo.CntrItemRel.S_ITEM_CODE, iteminfo.CntrItemRel.S_ITEM_MODEL); var pankuinfo = db.Queryable().Where(a => a.N_ROW == c.N_ROW).First(); if (iteminfo != null && numinfo != null && condition != null) { if (pankuinfo == null) { //插入盘库数据 LogHelper.Info($"插入非空排数据"); var pk = new DaMingShanPanKuTask { N_ROW = c.N_ROW, N_CURRENT_NUM = numinfo.sum * 2, S_BatchNo = iteminfo.CntrItemRel.S_BATCH_NO, SQL_Condition = condition.S_ITEM_CODE, S_ItemCode = iteminfo.CntrItemRel.S_ITEM_CODE, S_PLineNo = iteminfo.S_SRC == "一号输送线" ? "SL1" : "SL2", S_AREA_CODE = b }; db.Insertable(pk).ExecuteCommand(); } else { //更新盘库数据中间表 LogHelper.Info($"更新非空排数据"); pankuinfo.N_CURRENT_NUM = numinfo.sum * 2; pankuinfo.S_BatchNo = iteminfo.CntrItemRel.S_BATCH_NO; pankuinfo.SQL_Condition = condition.S_ITEM_CODE; pankuinfo.S_ItemCode = iteminfo.CntrItemRel.S_ITEM_CODE; pankuinfo.S_PLineNo = iteminfo.S_SRC == "一号输送线" ? "SL1" : "SL2"; pankuinfo.S_AREA_CODE = b; db.Updateable(pankuinfo).WhereColumns(a => new { a.S_ID }).ExecuteCommand(); } } } }); }); } } /// /// 瓶盖机非即产即用 /// internal static void AnalysisMoveLib() { ////瓶盖机 //PingGaikkcontrel(); //Thread.Sleep(1000); //PingGaiN(); //Thread.Sleep(1000); //PingGaiIncontrel(); //Thread.Sleep(1000); ////瓶盖翻斗机 //FanDoukkcontrel(); //Thread.Sleep(1000); //FanDouN(); //Thread.Sleep(1000); //FanDouIncontrel(); ZiDong(); Thread.Sleep(1000); itemZiDong(); Thread.Sleep(1000); } private static void itemZiDong() { var db = new SqlHelper().GetInstance(); string areaNo = "YWJGJBQ"; var startbitlist = db.Queryable() .Where(a => a.S_AREA_CODE == areaNo && a.N_CURRENT_NUM > 0 && a.S_LOCK_STATE=="无") .PartitionBy(a => a.N_ROW) .OrderByDescending(a => a.N_COL) .Includes(a => a.LocCntrRel, b => b.CntrItemRel) .Take(1) .ToList(); foreach (var item in startbitlist) { var startlock = db.Queryable() .Where(a => a.S_AREA_CODE == item.S_AREA_CODE && a.N_ROW == item.N_ROW && a.S_LOCK_STATE != "无" && a.S_LOCK_STATE != "报废") .First(); if (startlock == null) { //算取终点 if (item.LocCntrRel != null && !string.IsNullOrEmpty(item.LocCntrRel.S_CNTR_CODE)) { if (item.LocCntrRel.CntrItemRel != null) { string itemcode = item.LocCntrRel.CntrItemRel.S_ITEM_CODE; var info = Settings.GetItemCacheAreaList().Where(a => a.ItemCode == itemcode).FirstOrDefault(); if (info != null) { string endarea = info.AreaCode; var endbitlist = db.Queryable() .Where(a => a.S_AREA_CODE == endarea && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE=="无") .PartitionBy(a => a.N_ROW) .OrderBy(a => a.N_COL) .Take(1) .ToList(); foreach (var it in endbitlist) { var endlock = db.Queryable() .Where(a => a.S_AREA_CODE == it.S_AREA_CODE && a.N_ROW == it.N_ROW && a.S_LOCK_STATE != "无" && a.S_LOCK_STATE != "报废") .First(); if (endlock == null) { //创建任务 IntensiveArea.DaMingShanCreateTransport(item.S_LOC_CODE, it.S_LOC_CODE, "点到点转运", item.LocCntrRel.S_CNTR_CODE, 1, 1, "", 1); break; } } } else { LogHelper.Info($"物料{itemcode} 未在配置中找到对应库区"); } } else { LogHelper.Info($"货位{item.S_LOC_CODE} 托盘{item.LocCntrRel.S_CNTR_CODE} 未绑定物料"); } } else { LogHelper.Info($"货位{item.S_LOC_CODE} 未绑定托盘"); } } } } private static void ZiDong() { var db = new SqlHelper().GetInstance(); var list = Settings.GetinStockCacheAreaList().Where(a => a.Enable == "1").ToList(); if (list.Count > 0) { list.ForEach(a => { try { if (!string.IsNullOrEmpty(a.deviceName)) { LogHelper.Info($"自动转运 工单号={a.deviceName}"); var workorder = db.Queryable().Where(it => it.S_PLineNo == a.deviceName && it.S_WorkState == "执行中").First(); if (workorder != null) { var num = 0; if (workorder.S_PLineNo == "Y7坯" || workorder.S_PLineNo == "Y8坯" || workorder.S_PLineNo == "Y8盖") { //判断终点数量小于3 var areanum = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea).Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM) }).First().sum; var locknum = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea && it.S_LOCK_STATE == "入库锁").ToList().Count(); num = num + areanum + locknum; } if (num < 3) { LogHelper.Info($"自动转运 查找到工单 工单号={workorder.S_WorkNo}"); if (a.CacheAreaNoLock == "1") { var loclist = db.Queryable() .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "无") .Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM), it.N_ROW }) .GroupBy(it => it.N_ROW) .MergeTable() .OrderByDescending(it => it.sum) .ToList(); if (loclist.Count > 0) { LogHelper.Info($"起点货位数量大于0的货位数量={loclist.Count}"); var locinfo = db.Queryable() .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .First(); if (locinfo != null) { var trayNo = ""; foreach (var item in loclist) { if (a.ProductAreaLock == "0") { LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock} 获取可卸货货位编码{locinfo.S_LOC_CODE} 当前数量{locinfo.N_CURRENT_NUM} 当前锁定状态{locinfo.S_LOCK_STATE}"); //终点库区非密集型库区算法 var lockinfo = db.Queryable().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { var startbit = db.Queryable() .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0) .OrderByDescending(it => it.N_COL) .Includes(it => it.LocCntrRel) .First(); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); LogHelper.Info($"获取起点{startbit.S_LOC_CODE} 点位绑定托盘数量{traylist.Count}"); for (int i = 0; i < a.CntrCount; i++) { LogHelper.Info("11111111111"); trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } LogHelper.Info("222222222222"); IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"起点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } else { LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock}"); //终点库区密集型库区算法 var result = false; var endlist = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .OrderBy(it => it.N_COL) .PartitionBy(it => it.N_ROW) .Take(1) .ToList(); foreach (var b in endlist) { LogHelper.Info($"获取可卸货货位编码{b.S_LOC_CODE} 当前数量{b.N_CURRENT_NUM} 当前锁定状态{b.S_LOCK_STATE}"); var lockinfo = db.Queryable().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { lockinfo = db.Queryable().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { var startbit = db.Queryable() .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0) .OrderByDescending(it => it.N_COL) .Includes(it => it.LocCntrRel) .First(); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"起点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); break; } } else { LogHelper.Info($"终点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } if (result) break; } } } } } else { var loclist = db.Queryable() .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM == a.CntrCount && it.S_LOCK_STATE == "无") .Includes(it => it.LocCntrRel) .First(); if (loclist != null) { LogHelper.Info($"起点货位 {loclist.S_LOC_CODE}"); var locinfo = db.Queryable() .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .First(); if (locinfo != null) { var trayNo = ""; if (a.ProductAreaLock == "0") { LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock} 获取可卸货货位编码{locinfo.S_LOC_CODE} 当前数量{locinfo.N_CURRENT_NUM} 当前锁定状态{locinfo.S_LOCK_STATE}"); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority); } else { LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock}"); //终点库区密集型库区算法 var endlist = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .OrderBy(it => it.N_COL) .PartitionBy(it => it.N_ROW) .Take(1) .ToList(); foreach (var b in endlist) { LogHelper.Info($"获取可卸货货位编码{b.S_LOC_CODE} 当前数量{b.N_CURRENT_NUM} 当前锁定状态{b.S_LOCK_STATE}"); var lockinfo = db.Queryable().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"终点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } } } } } } else { } } } else { if (a.CacheAreaNoLock == "1") { var loclist = db.Queryable() .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0) .Select(it => new { sum = SqlFunc.AggregateSum(it.N_CURRENT_NUM), it.N_ROW }) .GroupBy(it => it.N_ROW) .MergeTable() .OrderByDescending(it => it.sum) .ToList(); LogHelper.Info($"起点货位数量大于0的货位数量={loclist.Count}"); if (loclist.Count > 0) { var locinfo = db.Queryable() .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .First(); if (locinfo != null) { LogHelper.Info($"查找到终点有空货位可以卸货 货位编码={locinfo.S_LOC_CODE}"); var trayNo = ""; foreach (var item in loclist) { if (a.ProductAreaLock == "0") { //终点库区非密集型库区算法 LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock} 获取可卸货货位编码{locinfo.S_LOC_CODE} 当前数量{locinfo.N_CURRENT_NUM} 当前锁定状态{locinfo.S_LOCK_STATE}"); var lockinfo = db.Queryable().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { var startbit = db.Queryable() .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "无") .OrderByDescending(it => it.N_COL) .Includes(it => it.LocCntrRel) .First(); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"起点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } else { //终点库区密集型库区算法 LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock}"); var result = false; var endlist = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .OrderBy(it => it.N_COL) .PartitionBy(it => it.N_ROW) .Take(1) .ToList(); foreach (var b in endlist) { LogHelper.Info($"获取可卸货货位编码{b.S_LOC_CODE} 当前数量{b.N_CURRENT_NUM} 当前锁定状态{b.S_LOCK_STATE}"); var lockinfo = db.Queryable().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { lockinfo = db.Queryable().Where(it => it.N_ROW == item.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { var startbit = db.Queryable() .Where(it => it.N_ROW == item.N_ROW && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "无") .OrderByDescending(it => it.N_COL) .Includes(it => it.LocCntrRel) .First(); LogHelper.Info($"获取可取货货位编码{startbit.S_LOC_CODE}"); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == startbit.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(startbit.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, startbit.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"起点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); break; } } else { LogHelper.Info($"终点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } if (result) break; } } } } } else { var loclist = db.Queryable() .Where(it => it.S_AREA_CODE == a.CacheAreaNo && it.N_CURRENT_NUM > 0 && it.S_LOCK_STATE == "无") .Includes(it => it.LocCntrRel) .First(); if (loclist != null) { LogHelper.Info($"起点货位 {loclist.S_LOC_CODE}"); var locinfo = db.Queryable() .Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .First(); if (locinfo != null) { LogHelper.Info($"查找到终点有空货位可以卸货 货位编码={locinfo.S_LOC_CODE}"); var trayNo = ""; if (a.ProductAreaLock == "0") { //终点库区非密集型库区算法 LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock} 获取可卸货货位编码{locinfo.S_LOC_CODE} 当前数量{locinfo.N_CURRENT_NUM} 当前锁定状态{locinfo.S_LOCK_STATE}"); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, locinfo.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, locinfo.N_CURRENT_NUM + 1, "1", 1, a.Priority); } else { //终点库区密集型库区算法 LogHelper.Info($"终点库区{a.ProductArea} 密集类型{a.ProductAreaLock}"); var endlist = db.Queryable().Where(it => it.S_AREA_CODE == a.ProductArea && it.N_CURRENT_NUM == 0 && it.S_LOCK_STATE == "无") .OrderBy(it => it.N_COL) .PartitionBy(it => it.N_ROW) .Take(1) .ToList(); foreach (var b in endlist) { LogHelper.Info($"获取可卸货货位编码{b.S_LOC_CODE} 当前数量{b.N_CURRENT_NUM} 当前锁定状态{b.S_LOCK_STATE}"); var lockinfo = db.Queryable().Where(it => it.N_ROW == b.N_ROW && it.S_LOCK_STATE != "无").First(); if (lockinfo == null) { LogHelper.Info($"获取可取货货位编码{loclist.S_LOC_CODE}"); //创建任务 var traylist = db.Queryable().Where(it => it.S_LOC_CODE == loclist.S_LOC_CODE).OrderByDescending(it => it.T_CREATE).ToList(); for (int i = 0; i < a.CntrCount; i++) { trayNo = traylist[i].S_CNTR_CODE + "," + trayNo; } IntensiveArea.DaMingShanCreateTransport(loclist.S_LOC_CODE, b.S_LOC_CODE, a.TaskType, trayNo, loclist.N_CURRENT_NUM - a.CntrCount + 1, b.N_CURRENT_NUM + 1, "1", 1, a.Priority); break; } else { LogHelper.Info($"终点排 货位{lockinfo.S_LOC_CODE} 当前货位状态{lockinfo.S_LOCK_STATE} 不允许生成任务"); } } } } } } } } catch (Exception ex) { LogHelper.Error($"自动转运流程异常 异常信息{ex.Message}",ex); } }); } } /// /// 瓶坯机非即产即用 /// internal static void AnalysisMoveLib1() { //瓶坯机 PingGaikkcontrel1(); Thread.Sleep(1000); //PingGaiN1(); //Thread.Sleep(1000); //PingGaiIncontrel1(); //Thread.Sleep(1000); //瓶坯翻斗机 FanDoukkcontrel1(); //Thread.Sleep(1000); //FanDouN1(); //Thread.Sleep(1000); //FanDouIncontrel1(); } /// /// 管控瓶盖入库缓存位 /// private static void PingGaiIncontrel() { LogHelper.Info("瓶盖入库管控"); var db = new SqlHelper().GetInstance(); //瓶盖入库不需要工单 var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault(); if (info != null) { LogHelper.Info($"查询到设备配置信息 产线号={info.deviceName}"); //瓶盖出库缓存位 var workorder = WCSHelper.GetWorkOrder(info.deviceName); if (workorder != null) { LogHelper.Info($"查询到执行中工单 工单号={workorder.S_WorkNo}"); var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "满").FirstOrDefault(); if (startinfo != null) { LogHelper.Info($"查询到缓存点配置信息 站点编码={startinfo.location}"); var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == startinfo.location).First(); if (startlocation != null) { LogHelper.Info($"该缓存点站点信息 当前数量={startlocation.N_CURRENT_NUM} 锁定状态={startlocation.S_LOCK_STATE.Trim()}"); if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 3, true, workorder.S_BatchNo); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 0, true, workorder.S_BatchNo); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } } else LogHelper.Info("缓存点站点表信息异常"); } else LogHelper.Info("缓存点信息配置异常"); } else LogHelper.Info("瓶盖满筐入库未找到工单"); } else LogHelper.Info($"未找到设备配置文件"); } /// /// 管控瓶盖入库缓存位 /// private static void PingGaiIncontrel1() { var db = new SqlHelper().GetInstance(); //瓶盖入库不需要工单 var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).FirstOrDefault(); if (info != null) { //瓶盖出库缓存位 var workorder = WCSHelper.GetWorkOrder(info.deviceName); if (workorder != null) { var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "满").FirstOrDefault(); if (startinfo != null) { var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == startinfo.location).First(); if (startlocation != null) { if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 3, true, workorder.S_BatchNo); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 0, true, workorder.S_BatchNo); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } } } } } } /// /// 管控瓶盖翻斗机入库缓存位 /// private static void FanDouIncontrel() { var db = new SqlHelper().GetInstance(); //瓶盖翻斗机入库不需要工单 var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "空").FirstOrDefault(); if (startinfo != null) { LogHelper.Info($"查询到空筐入库区{startinfo.location} 库区编码={JsonConvert.SerializeObject(startinfo.ProductArea)}"); var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == startinfo.location).First(); if (startlocation != null) { LogHelper.Info($"查询空筐入库区点位{startinfo.location} 当前数量={startlocation.N_CURRENT_NUM} 当前货位状态={startlocation.S_LOCK_STATE}"); if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 3); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 0); if (endlocation != null) { LogHelper.Info($"准备生成任务"); var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } LogHelper.Info($"生成空筐入库任务"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } } } } /// /// 管控瓶盖翻斗机入库缓存位 /// private static void FanDouIncontrel1() { var db = new SqlHelper().GetInstance(); //瓶盖翻斗机入库不需要工单 var startinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "空").FirstOrDefault(); if (startinfo != null) { LogHelper.Info($"查询到空筐入库区{startinfo.location} 库区编码={JsonConvert.SerializeObject(startinfo.ProductArea)}"); var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == startinfo.location).First(); if (startlocation != null) { LogHelper.Info($"查询空筐入库区点位{startinfo.location} 当前数量={startlocation.N_CURRENT_NUM} 当前货位状态={startlocation.S_LOCK_STATE}"); if (startlocation.N_CURRENT_NUM == 2 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 3); if (endlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } if (startlocation.N_CURRENT_NUM == 3 && startlocation.S_LOCK_STATE.Trim() == "无") { Location endlocation = null; //查找库里有没有三层的物料 for (int i = 0; i < startinfo.ProductArea.Count(); i++) { endlocation = pinggaiIn(startinfo.ProductArea[i], 0); if (endlocation != null) { LogHelper.Info($"准备生成任务"); var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var endley = endlocation.N_CURRENT_NUM == 3 ? 2 : 1; for (int j = 0; j < ctnslist.Count(); j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } LogHelper.Info($"生成空筐入库任务"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入库", TrayCode, 1, endley, "1", ctnslist.Count); break; } } } } } } /// /// 瓶盖非即产即用 管控出库缓存区 /// private static void PingGaiN() { try { LogHelper.Info("瓶盖出库管控"); var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault(); if (info != null) { //瓶盖出库缓存位 var workorder = WCSHelper.GetPGWorkOrder(info.deviceName); //非即产即用工单对应 出库操作 if (workorder != null && workorder.S_WorkState.Trim() == "执行中" && workorder.S_UsingNow == "N") { //瓶盖机 非即产即用 var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "空").FirstOrDefault(); if (endinfo != null) { var endlocation = db.Queryable().Where(a => a.S_LOC_CODE == endinfo.location).First(); if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "无") { //终点满足条件 判断起点 for (int i = 0; i < endinfo.ProductArea.Count(); i++) { var startlocation = pinggaiOut(endinfo.ProductArea[i]); if (startlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var count = ctnslist.Count() == 5 ? 2 : 3; var startley = ctnslist.Count() == 5 ? 2 : 1; for (int j = 0; j < count; j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐出库", TrayCode, startley, 1, "1"); break; } } } } } } } catch (Exception ex) { LogHelper.Info($"瓶盖出库管控异常 异常信息={ex.Message}"); } } /// /// 瓶盖非即产即用 管控出库缓存区 /// private static void PingGaiN1() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).FirstOrDefault(); if (info != null) { //瓶盖出库缓存位 var workorder = WCSHelper.GetPGWorkOrder(info.deviceName); //非即产即用工单对应 出库操作 if (workorder != null && workorder.S_WorkState.Trim() == "执行中" && workorder.S_UsingNow == "N") { //瓶盖机 非即产即用 var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "空").FirstOrDefault(); if (endinfo != null) { var endlocation = db.Queryable().Where(a => a.S_LOC_CODE == endinfo.location).First(); if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "无") { //终点满足条件 判断起点 for (int i = 0; i < endinfo.ProductArea.Count(); i++) { var startlocation = pinggaiOut(endinfo.ProductArea[i]); if (startlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var count = ctnslist.Count() == 5 ? 2 : 3; var startley = ctnslist.Count() == 5 ? 2 : 1; for (int j = 0; j < count; j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐出库", TrayCode, startley, 1, "1"); break; } } } } } } } /// /// 瓶盖翻斗非即产即用 管控出库缓存区 /// private static void FanDouN() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 3 && a.enable == 1).FirstOrDefault(); if (info != null) { //瓶盖出库缓存位 var workorder = WCSHelper.GetPGWorkOrder(info.deviceName); //非即产即用工单对应 出库操作 if (workorder != null && workorder.S_WorkState.Trim() == "执行中" && workorder.S_UsingNow == "N") { //瓶盖机 非即产即用 var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "满").FirstOrDefault(); if (endinfo != null) { var endlocation = db.Queryable().Where(a => a.S_LOC_CODE == endinfo.location).First(); if (endlocation != null) { if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "无") { //终点满足条件 判断起点 for (int i = 0; i < endinfo.ProductArea.Count(); i++) { var startlocation = pinggaiOut(endinfo.ProductArea[i], true); if (startlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var count = ctnslist.Count() == 5 ? 2 : 3; var startley = ctnslist.Count() == 5 ? 2 : 1; for (int j = 0; j < count; j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐出库", TrayCode, startley, 1, "1"); break; } } } } } } } } /// /// 瓶盖翻斗非即产即用 管控出库缓存区 /// private static void FanDouN1() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 6 && a.enable == 1).FirstOrDefault(); if (info != null) { //瓶盖出库缓存位 var workorder = WCSHelper.GetPGWorkOrder(info.deviceName); //非即产即用工单对应 出库操作 if (workorder != null && workorder.S_WorkState.Trim() == "执行中" && workorder.S_UsingNow == "N") { //瓶盖机 非即产即用 var endinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "满").FirstOrDefault(); if (endinfo != null) { var endlocation = db.Queryable().Where(a => a.S_LOC_CODE == endinfo.location).First(); if (endlocation != null) { if (endlocation.N_CURRENT_NUM == 0 && endlocation.S_LOCK_STATE == "无") { //终点满足条件 判断起点 for (int i = 0; i < endinfo.ProductArea.Count(); i++) { var startlocation = pinggaiOut(endinfo.ProductArea[i], true); if (startlocation != null) { var TrayCode = ""; var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); var ctnslist = ctnsinfo.OrderByDescending(a => a.T_CREATE).ToList(); var count = ctnslist.Count() == 5 ? 2 : 3; var startley = ctnslist.Count() == 5 ? 2 : 1; for (int j = 0; j < count; j++) { TrayCode = TrayCode + ctnslist[j].S_CNTR_CODE + ","; } IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐出库", TrayCode, startley, 1, "1"); break; } } } } } } } } /// /// 瓶盖空筐-出库缓存区的连接 /// private static void PingGaikkcontrel() { LogHelper.Info("瓶盖空筐区管控"); var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 4 && a.enable == 1).FirstOrDefault(); if (info != null) { //出库缓存区对应缓存区 缓存区如果有空位置就从出库缓存区搬运 LogHelper.Info($"查询空筐区是否有空货位"); var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == info.deviceName && a.ItemTrayType == "空").FirstOrDefault(); if (Areainfo != null) { LogHelper.Info($"查询空筐缓存位 库区编码={Areainfo.ProductArea[0]}"); string msg = Areainfo.ProductArea[0]; var endlocation = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").First(); if (endlocation != null) { LogHelper.Info($"查询到空筐区空货位 货位编码={endlocation.S_LOC_CODE}"); var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 1 && a.ItemTrayType == "空").FirstOrDefault(); if (locationinfo != null) { LogHelper.Info($"查询出库缓存位是否有货 货位编码={locationinfo.location}"); var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == locationinfo.location).First(); if (startlocation.S_LOCK_STATE.Trim() == "无" && startlocation.N_CURRENT_NUM > 0) { LogHelper.Info($"查询到出库缓存位 货位编码={startlocation} 数量={startlocation.N_CURRENT_NUM}"); var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); if (ctnsinfo.Count() > 0) { var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First(); LogHelper.Info($"创建空筐缓存区补空任务 托盘号={ctns.S_CNTR_CODE}"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入缓存区", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1"); } } } else LogHelper.Info($"瓶盖出库缓存区配置未配置"); } else LogHelper.Info($"空筐缓存区未找到空货位"); } else LogHelper.Info($"空筐缓存区未配置"); } } /// /// 瓶坯空筐-出库缓存区的连接 /// private static void PingGaikkcontrel1() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 2 && a.enable == 1).ToList(); if (info.Count() > 0) { info.ForEach(b => { var workorder = WCSHelper.GetPGWorkOrder(b.deviceName); if (workorder != null) { //出库缓存区对应缓存区 缓存区如果有空位置就从出库缓存区搬运 LogHelper.Info($"查询空筐区是否有空货位"); var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.ItemTrayType == "空").FirstOrDefault(); if (Areainfo != null) { if (Areainfo.ProductArea.Count() > 0) { for (int i = 0; i < Areainfo.ProductArea.Count(); i++) { LogHelper.Info($"查询空筐缓存位 库区编码={Areainfo.ProductArea[i]}"); string msg = Areainfo.ProductArea[i]; var endlocation = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").First(); if (endlocation != null) { LogHelper.Info($"查询到空筐区空货位 货位编码={endlocation.S_LOC_CODE}"); var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 3 && a.ItemTrayType == "空").FirstOrDefault(); if (locationinfo != null) { LogHelper.Info($"查询出库缓存位是否有货 货位编码={locationinfo.location}"); var startarea = db.Queryable().Where(a => a.S_AREA_CODE == locationinfo.location).ToList(); foreach (var item in startarea) { var startlocation = item; if (startlocation.S_LOCK_STATE.Trim() == "无" && startlocation.N_CURRENT_NUM > 0) { LogHelper.Info($"查询到出库缓存位 货位编码={startlocation} 数量={startlocation.N_CURRENT_NUM}"); var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); if (ctnsinfo.Count() > 0) { var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First(); LogHelper.Info($"创建空筐缓存区补空任务 托盘号={ctns.S_CNTR_CODE}"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "空筐入缓存区", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1"); break; } } } } else LogHelper.Info($"瓶坯出库缓存区配置未配置"); } else LogHelper.Info($"空筐缓存区未找到空货位"); } } else LogHelper.Info("请检查空筐缓存区库区编号是否配置"); } else LogHelper.Info($"空筐缓存区未配置"); } }); } } /// /// 翻斗满筐-出库缓存区的连接 /// private static void FanDoukkcontrel() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 3 && a.enable == 1).FirstOrDefault(); if (info != null) { //出库缓存区对应缓存区 缓存区如果有空位置就从出库缓存区搬运 LogHelper.Info($"查询满筐区是否有空货位"); var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == info.deviceName && a.ItemTrayType == "满").FirstOrDefault(); if (Areainfo != null) { LogHelper.Info($"查询满筐缓存位 库区编码={Areainfo.ProductArea[0]}"); string msg = Areainfo.ProductArea[0]; var endlocation = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").First(); if (endlocation != null) { LogHelper.Info($"查询到满筐区空货位 货位编码={endlocation.S_LOC_CODE}"); var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 2 && a.ItemTrayType == "满").FirstOrDefault(); if (locationinfo != null) { LogHelper.Info($"查询出库缓存位是否有货 货位编码={locationinfo.location}"); var startlocation = db.Queryable().Where(a => a.S_LOC_CODE == locationinfo.location).First(); if (startlocation.S_LOCK_STATE.Trim() == "无" && startlocation.N_CURRENT_NUM > 0) { LogHelper.Info($"查询到出库缓存位 货位编码={startlocation} 数量={startlocation.N_CURRENT_NUM}"); var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); if (ctnsinfo.Count() > 0) { var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First(); LogHelper.Info($"创建满筐缓存区补满任务 托盘号={ctns.S_CNTR_CODE}"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入缓存区", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1"); } } } else LogHelper.Info($"瓶盖翻斗机出库缓存区配置未配置"); } else LogHelper.Info($"满筐缓存区未找到空货位"); } else LogHelper.Info($"满筐缓存区未配置"); } } /// /// 翻斗满筐-出库缓存区的连接 /// private static void FanDoukkcontrel1() { var db = new SqlHelper().GetInstance(); var info = Settings.GetDeviceInfoList().Where(a => a.deviceType == 6 && a.enable == 1).ToList(); if (info.Count() > 0) { info.ForEach(b => { #region 更新前同瓶盖 var workorder = WCSHelper.GetPGWorkOrder(b.deviceName); if (workorder != null) { //出库缓存区对应缓存区 缓存区如果有空位置就从出库缓存区搬运 LogHelper.Info($"查询满筐区是否有空货位"); var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == workorder.S_LinkLineNo && a.ItemTrayType == "满").FirstOrDefault(); if (Areainfo != null) { if (Areainfo.ProductArea.Count() > 0) { for (int i = 0; i < Areainfo.ProductArea.Count(); i++) { LogHelper.Info($"查询满筐缓存位 库区编码={Areainfo.ProductArea[i]}"); string msg = Areainfo.ProductArea[i]; var endlocation = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").First(); if (endlocation != null) { LogHelper.Info($"查询到满筐区空货位 货位编码={endlocation.S_LOC_CODE}"); var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "满").FirstOrDefault(); if (locationinfo != null) { LogHelper.Info($"查询出库缓存位是否有货 货位编码={locationinfo.location}"); var startarea = db.Queryable().Where(a => a.S_AREA_CODE == locationinfo.location).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList(); foreach (var item in startarea) { var startlocation = item; if (startlocation.S_LOCK_STATE.Trim() == "无" && startlocation.N_CURRENT_NUM > 0) { LogHelper.Info($"查询到出库缓存位 货位编码={startlocation} 数量={startlocation.N_CURRENT_NUM} 物料编码={startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE}"); if (workorder.S_ItemCode == startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE) { var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); if (ctnsinfo.Count() > 0) { var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First(); LogHelper.Info($"创建满筐缓存区补满任务 托盘号={ctns.S_CNTR_CODE}"); IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入缓存区", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1"); break; } } } } } else LogHelper.Info($"瓶盖翻斗机出库缓存区配置未配置"); } else LogHelper.Info($"满筐缓存区未找到空货位"); } } else LogHelper.Info($"库区编码异常请检查配置"); } else LogHelper.Info($"满筐缓存区未配置"); } #endregion #region 更新后 //var workorder = WCSHelper.GetWorkOrder1(b.deviceName); //if (workorder.Count>0) //{ // foreach (var work in workorder) // { // //出库缓存区对应缓存区 缓存区如果有空位置就从出库缓存区搬运 // LogHelper.Info($"查询满筐区是否有空货位"); // var Areainfo = Settings.GetDaMingShanPriProLineList().Where(a => a.deviceName == work.S_LinkLineNO && a.ItemTrayType == "满").FirstOrDefault(); // if (Areainfo != null) // { // if (Areainfo.ProductArea.Count() > 0) // { // for (int i = 0; i < Areainfo.ProductArea.Count(); i++) // { // LogHelper.Info($"查询满筐缓存位 库区编码={Areainfo.ProductArea[i]}"); // string msg = Areainfo.ProductArea[i]; // var endlocation = db.Queryable().Where(a => a.S_AREA_CODE.Trim() == msg && a.N_CURRENT_NUM == 0 && a.S_LOCK_STATE.Trim() == "无").First(); // if (endlocation != null) // { // LogHelper.Info($"查询到满筐区空货位 货位编码={endlocation.S_LOC_CODE}"); // var locationinfo = Settings.GetinStockCacheBitList().Where(a => a.deviceType == 4 && a.ItemTrayType == "满").FirstOrDefault(); // if (locationinfo != null) // { // LogHelper.Info($"查询出库缓存位是否有货 货位编码={locationinfo.location}"); // var startarea = db.Queryable().Where(a => a.S_AREA_CODE == locationinfo.location).Includes(a => a.LocCntrRel, a => a.CntrItemRel).ToList(); // foreach (var item in startarea) // { // var startlocation = item; // if (startlocation.S_LOCK_STATE.Trim() == "无" && startlocation.N_CURRENT_NUM > 0) // { // LogHelper.Info($"查询到出库缓存位 货位编码={startlocation} 数量={startlocation.N_CURRENT_NUM} 物料编码={startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE}"); // if (work.S_ItemCode == startlocation.LocCntrRel.CntrItemRel.S_ITEM_CODE) // { // var ctnsinfo = db.Queryable().Where(a => a.S_LOC_CODE.Trim() == startlocation.S_LOC_CODE.Trim()).ToList(); // if (ctnsinfo.Count() > 0) // { // var ctns = ctnsinfo.OrderByDescending(a => a.T_CREATE).First(); // LogHelper.Info($"创建满筐缓存区补满任务 托盘号={ctns.S_CNTR_CODE}"); // IntensiveArea.DaMingShanCreateTransport(startlocation.S_LOC_CODE, endlocation.S_LOC_CODE, "满筐入缓存区", ctns.S_CNTR_CODE, startlocation.N_CURRENT_NUM, 1, "1"); // break; // } // } // } // } // } // else LogHelper.Info($"瓶盖翻斗机出库缓存区配置未配置"); // } // else LogHelper.Info($"满筐缓存区未找到空货位"); // } // } // else LogHelper.Info($"库区编码异常请检查配置"); // } // else LogHelper.Info($"满筐缓存区未配置"); // } // //} #endregion }); } } private static Location pinggaiIn(string area, int i, bool batchbol = false, string batch = "") { LogHelper.Info($"瓶盖入库算法开始 数量={i} 库区编码={area} 批次号={batch}"); Location endlocation = null; var db = new SqlHelper().GetInstance(); if (i == 3) { LogHelper.Info("查找二层货位"); var list = db.Queryable().Where(a => a.N_CURRENT_NUM == i && a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList(); for (int j = list.Count() - 1; j >= 0; j--) { string rowno = list[j].N_ROW; var rowinfo = db.Queryable().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "无").First(); if (rowinfo != null) { list.Remove(list[j]); } else { if (batchbol) { var batchinfo = db.Queryable().Where(a => a.N_ROW == rowno && a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First(); if (batchinfo != null) { LogHelper.Info($"物料批次={batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO}"); if (batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() != batch.Trim()) { list.Remove(list[j]); } } } } } if (list.Count() > 0) { for (int k = 0; k < list.Count; k++) { if (list[k].N_CURRENT_NUM == i) { endlocation = list[k]; break; } } } } else { LogHelper.Info("查找一层货位"); var list = db.Queryable().Where(a => a.N_CURRENT_NUM == i && a.S_AREA_CODE == area).OrderBy(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList(); LogHelper.Info($"查找满足数量的货位 货位数量为{list.Count()}"); for (int j = list.Count() - 1; j >= 0; j--) { string rowno = list[j].N_ROW; LogHelper.Info($"查找排{rowno} 货位状态"); var rowinfo = db.Queryable().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "无").First(); if (rowinfo != null) { LogHelper.Info($"排{rowno}状态{rowinfo.S_LOCK_STATE} 剔除该排"); list.Remove(list[j]); } else { if (batchbol) { LogHelper.Info($"开启批次比对"); var batchinfo = db.Queryable().Where(a => a.N_ROW == rowno && a.N_CURRENT_NUM > 0).Includes(a => a.LocCntrRel, a => a.CntrItemRel).First(); if (batchinfo != null) { LogHelper.Info($"物料批次={batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO}"); if (batchinfo.LocCntrRel.CntrItemRel.S_BATCH_NO.Trim() != batch.Trim()) { list.Remove(list[j]); } } else { LogHelper.Info($"排号{rowno} 为空排"); } } } } if (list.Count() > 0) { for (int k = 0; k < list.Count(); k++) { LogHelper.Info($"开始判断货位是否为最小列 货位编码={list[k].S_LOC_CODE} 列={list[k].N_COL}"); if (list[k].N_COL == 1) { endlocation = list[k]; break; } else { //查找前一列货位是否为满 string Rowno = list[k].N_ROW; int colno = list[k].N_COL - 1; var info = db.Queryable().Where(a => a.N_ROW == Rowno && a.N_COL == colno).First(); if (info != null) { if (info.N_CAPACITY == info.N_CURRENT_NUM) { endlocation = list[k]; break; } } } } } } LogHelper.Info($"瓶盖区入库算法结束 终点货位结果 {endlocation != null}"); return endlocation; } private static Location pinggaiOut(string area, bool res = false) { Location location = null; var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.N_CURRENT_NUM > 0 && a.S_AREA_CODE == area).Includes(a => a.LocCntrRel, a => a.CntrItemRel).OrderByDescending(a => a.N_COL).Take(1).PartitionBy(a => a.N_ROW).ToList(); for (int j = list.Count - 1; j >= 0; j--) { var rowno = list[j].N_ROW; var rowinfo = db.Queryable().Where(a => a.N_ROW == rowno && a.S_LOCK_STATE != "无").First(); if (rowinfo != null) { list.Remove(list[j]); } } if (list.Count() > 0) { if (res) { list = list.OrderBy(a => a.LocCntrRel.CntrItemRel.S_BATCH_NO).ToList(); } location = list[0]; } return location; } /// /// 人工移库 /// public static void AnalysisIntraoCular() { var WorkInfo = WCSHelper.GetDaMingShanAnalysisOrderWork("人工移库"); if (WorkInfo != null) { AnalysisCularAndStock(WorkInfo); } } /// /// 人工移库 /// /// 工单信息 /// 工单处理类型: true-人工-备货-管制处理 false-缠膜处理 private static void AnalysisCularAndStock(List WorkInfo, bool Analysis = true) { var db = new SqlHelper().GetInstance();//ChunAnAnalysisMoveLib WorkInfo.ForEach(it => { LogHelper.Info($"移库任务处理:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()}", "Monitor"); //Console.WriteLine($"移库任务处理:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()}"); //起点库区 终点库区 起点库位 终点库位 //人工下工单 起点库位 可能存在多个,用英文逗号隔开;终点库位 同 起点库位 //作为 起点库位 如果为空,解锁库位,且不在作为起点库位使用;终点库位 满 则不在转运 // SQL_StartArea S_StartLoca SQL_EndArea S_EndLoca string startNo = ""; string endNo = ""; string startArea = ""; string endArea = ""; string ItemCode = string.IsNullOrEmpty(it.S_ItemCode) ? "" : it.S_ItemCode.Trim(); string BatchNo = string.IsNullOrEmpty(it.S_BatchNo) ? "" : it.S_BatchNo.Trim(); string ItemLayer = string.IsNullOrEmpty(it.S_ItemLayer) ? "" : it.S_ItemLayer.Trim(); List startList = it.S_StartLoca.Trim().Split(',').ToList(); List endList = it.S_EndLoca.Trim().Split(',').ToList(); if (it.S_YiKuNum > 0) { startList.ForEach(a => { if (!string.IsNullOrEmpty(a)) { var startlocationlist = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "无" && info.S_LOCK_STATE.Trim() != "报废").ToList(); if (startlocationlist.Count() == 0) { //查询有锁的库位 如果没有:锁定所有出库货位 var liststart = db.Queryable().Where(b => b.N_ROW.Trim() == a).ToList(); foreach (var item in liststart) { if (item.S_LOCK_STATE.Trim() != "报废") { item.S_LOCK_STATE = "移库锁"; db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } } TaskProcess.AreaRowLockState(a); } //查询到 可出库的 起点库位,判断当前起点库位是否允许生成任务 //任务类型 库区编码+排号+移库类型------起点库位 任务 均取货完成 //正式环境 排号为STRING型,唯一,人工无需传输库区编码 //var startAreaInfo = db.Queryable().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First(); //测试环境 排号为INT型,存在重复排号,因此加上 库区编码 用作区分 var yikulock = db.Queryable().Where(start => start.N_ROW.Trim() == a && start.S_LOCK_STATE.Trim() == "移库锁").First(); if (yikulock != null) { var startAreaInfo = db.Queryable().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderByDescending(b => b.N_COL).Take(1).First(); if (startAreaInfo != null && startAreaInfo.N_CURRENT_NUM >= 1) { //YiKuUnLockRow(db, a, startAreaInfo.S_AREA_CODE.Trim(), false); //判断当前库位是否可用 根据库区获取此库区 所有执行中的任务 //如果 有执行中的 任务,且未取货完成,则不可用;反之,无执行中任务 或 任务已取货完成 即可使用 if (IntensiveArea.TaskTakeAreaOver(startAreaInfo.S_AREA_CODE.Trim(), a, true, Analysis)) { startNo = a; startArea = startAreaInfo.S_AREA_CODE.Trim(); } } } } }); if (!string.IsNullOrEmpty(startNo)) { endList.ForEach(a => { if (!string.IsNullOrEmpty(a)) { if (ItemBool(startNo, a)) { var startlocationlist = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "无" && info.S_LOCK_STATE.Trim() != "报废").ToList(); if (startlocationlist.Count() == 0) { //查询有锁的库位 如果没有:锁定所有出库货位 var liststart = db.Queryable().Where(b => b.N_ROW.Trim() == a).ToList(); foreach (var item in liststart) { if (item.S_LOCK_STATE.Trim() != "报废") { item.S_LOCK_STATE = "移库锁"; db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } } TaskProcess.AreaRowLockState(a); } //获取可用的 终点库位 :1.终点库位 不能有任务执行中 2.根据终点库区 查询 出所有属于此 库位的任务 var endAreaInfo = db.Queryable().Where(b => b.N_ROW == a && b.N_CURRENT_NUM < b.N_CAPACITY).PartitionBy(b => b.S_AREA_CODE).OrderByDescending(b => b.N_COL).Take(1).ToList(); foreach (var item in endAreaInfo) { if (item != null && item.N_CURRENT_NUM < item.N_CAPACITY) { var StartCntrType = db.Queryable().Where(b => b.S_AREA_CODE == startArea).First(); var EndCntrType = db.Queryable().Where(b => b.S_AREA_CODE == item.S_AREA_CODE).First(); LogHelper.Info($"起点库区{startArea} 排{startNo} 板型={StartCntrType.S_TRAY_TYPE}"); LogHelper.Info($"终点库区{item.S_AREA_CODE.Trim()} 排{a} 板型={EndCntrType.S_TRAY_TYPE}"); if (StartCntrType.S_TRAY_TYPE == EndCntrType.S_TRAY_TYPE) { LogHelper.Info($"板型匹配"); //YiKuUnLockRow(db, a, endAreaInfo.S_AREA_CODE.Trim(), false); if (IntensiveArea.TaskTakeAreaOver(item.S_AREA_CODE.Trim(), a, false)) { endNo = a; endArea = item.S_AREA_CODE.Trim(); break; } } else { LogHelper.Info($"板型不匹配"); } } } } } }); } if (Analysis) { if (!string.IsNullOrEmpty(startNo) && !string.IsNullOrEmpty(endNo)) { //string taskType = it.S_ORDER_TYPE.Trim() + ":" + startNo + "-" + endNo; IntensiveArea.DaMingShanYiKuTask(startArea, endArea, startNo, endNo, "成品移库", ItemCode, BatchNo, ItemLayer, it.S_WorkNo.Trim()); } } } //解锁并完成工单 CompleteAndUnLockWork(it, db, startList, endList); }); } private static bool ItemBool(string startRow, string endRow) { var result = false; var db = new SqlHelper().GetInstance(); var startitem = db.Queryable().Where(a => a.N_ROW == startRow && a.N_CURRENT_NUM > 0).First(); var enditem = db.Queryable().Where(a => a.N_ROW == endRow && a.N_CURRENT_NUM > 0).First(); if (enditem == null) { return true; } if (startitem != null && enditem != null) { var starttray = db.Queryable().Where(a => a.S_AREA_CODE == startitem.S_AREA_CODE).First(); var endtray = db.Queryable().Where(a => a.S_AREA_CODE == enditem.S_AREA_CODE).First(); if (starttray.S_TRAY_TYPE == endtray.S_TRAY_TYPE) { result = true; } else { LogHelper.Info($"起点排{startRow} 货位{startitem.S_LOC_CODE} 与 终点排{endRow} 货位{enditem.S_LOC_CODE} 板型不符"); } } else { LogHelper.Info($"起点排{startRow} 查询不到当前数量不为0的货位"); } return result; } /// /// 备货移库 /// /// /// private static void AnalysisCularAndStock1(List WorkInfo, bool Analysis = true) { var db = new SqlHelper().GetInstance();//ChunAnAnalysisMoveLib WorkInfo.ForEach(it => { LogHelper.Info($"移库任务处理:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()}", "Monitor"); //Console.WriteLine($"移库任务处理:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()}"); //起点库区 终点库区 起点库位 终点库位 //人工下工单 起点库位 可能存在多个,用英文逗号隔开;终点库位 同 起点库位 //作为 起点库位 如果为空,解锁库位,且不在作为起点库位使用;终点库位 满 则不在转运 // SQL_StartArea S_StartLoca SQL_EndArea S_EndLoca string startNo = ""; string endNo = ""; string startArea = ""; string endArea = ""; List startList = new List(it.S_StartLoca.Trim().Split(',')); List endList = new List(it.S_EndLoca.Trim().Split(',')); if (it.S_YiKuNum > 0) { startList.ForEach(a => { if (!string.IsNullOrEmpty(a)) { var startlocationlist = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "无" && info.S_LOCK_STATE.Trim() != "报废").ToList(); if (startlocationlist.Count() == 0) { //查询有锁的库位 如果没有:锁定所有出库货位 var liststart = db.Queryable().Where(b => b.N_ROW.Trim() == a).ToList(); foreach (var item in liststart) { if (item.N_CURRENT_NUM > 0 && item.S_LOCK_STATE.Trim() != "报废") { item.S_LOCK_STATE = "移库锁"; db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } } TaskProcess.AreaRowLockState(a); } //查询到 可出库的 起点库位,判断当前起点库位是否允许生成任务 //任务类型 库区编码+排号+移库类型------起点库位 任务 均取货完成 //正式环境 排号为STRING型,唯一,人工无需传输库区编码 //var startAreaInfo = db.Queryable().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First(); //测试环境 排号为INT型,存在重复排号,因此加上 库区编码 用作区分 var yikulock = db.Queryable().Where(start => start.N_ROW.Trim() == a && start.S_LOCK_STATE.Trim() == "移库锁").First(); if (yikulock != null) { var startAreaInfo = db.Queryable().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderByDescending(b => b.N_COL).Take(1).First(); if (startAreaInfo != null && startAreaInfo.N_CURRENT_NUM >= 1) { //YiKuUnLockRow(db, a, startAreaInfo.S_AREA_CODE.Trim(), false); //判断当前库位是否可用 根据库区获取此库区 所有执行中的任务 //如果 有执行中的 任务,且未取货完成,则不可用;反之,无执行中任务 或 任务已取货完成 即可使用 if (IntensiveArea.TaskTakeAreaOver(startAreaInfo.S_AREA_CODE.Trim(), a, true, Analysis)) { startNo = a; startArea = startAreaInfo.S_AREA_CODE.Trim(); } } } } }); if (!string.IsNullOrEmpty(startNo)) { endList.ForEach(a => { if (!string.IsNullOrEmpty(a)) { var startlocationlist = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE.Trim() != "无" && info.S_LOCK_STATE.Trim() != "报废").ToList(); if (startlocationlist.Count() == 0) { //查询有锁的库位 如果没有:锁定所有出库货位 var liststart = db.Queryable().Where(b => b.N_ROW.Trim() == a).ToList(); foreach (var item in liststart) { if (item.N_CURRENT_NUM < 2 && item.S_LOCK_STATE.Trim() != "报废") { item.S_LOCK_STATE = "移库锁"; db.Updateable(item).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } } TaskProcess.AreaRowLockState(a); } //获取可用的 终点库位 :1.终点库位 不能有任务执行中 2.根据终点库区 查询 出所有属于此 库位的任务 var endAreaInfo = db.Queryable().Where(b => b.N_ROW == a && b.N_CURRENT_NUM < b.N_CAPACITY).OrderByDescending(b => b.N_COL).Take(1).First(); if (endAreaInfo != null && endAreaInfo.N_CURRENT_NUM < endAreaInfo.N_CAPACITY) { //YiKuUnLockRow(db, a, endAreaInfo.S_AREA_CODE.Trim(), false); if (IntensiveArea.TaskTakeAreaOver(endAreaInfo.S_AREA_CODE.Trim(), a, false)) { endNo = a; endArea = endAreaInfo.S_AREA_CODE.Trim(); } } } }); } if (Analysis) { if (!string.IsNullOrEmpty(startNo) && !string.IsNullOrEmpty(endNo)) { //string taskType = it.S_ORDER_TYPE.Trim() + ":" + startNo + "-" + endNo; IntensiveArea.DaMingShanYiKuTask1(startArea, endArea, startNo, endNo, it.S_ORDER_TYPE.Trim(), it.S_WorkNo.Trim()); } } } //解锁并完成工单 CompleteAndUnLockWork(it, db, startList, endList); }); } /// /// 解锁并完成工单 /// /// /// /// /// private static void CompleteAndUnLockWork(WorkOrder it, SqlSugar.SqlSugarClient db, List startList, List endList) { //查询到起点库位全部移库完毕,解锁全部库位,并更改工单状态为 移库完成 //9999-整排移库--需判断起点排均移库完毕,完成工单 //其他:移库数量为0,即可完成工单 bool result = true; if (it.S_YiKuNum == 9999) { startList.ForEach(a => { if (!string.IsNullOrEmpty(a)) { //var startAreaInfo = db.Queryable().Where(b => b.N_ROW == int.Parse(a)).OrderBy(b => b.N_COL).Take(1).First(); var startAreaInfo = db.Queryable().Where(b => b.N_ROW == a && b.N_CURRENT_NUM > 0).OrderBy(b => b.N_COL).Take(1).First(); if (startAreaInfo != null) result = false; } }); } else if (it.S_YiKuNum != 0 && it.S_YiKuNum > 0) result = false; else { LogHelper.Info($"移库工单异常:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()},移库数量:{it.S_YiKuNum}", "Monitor"); //Console.WriteLine($"移库工单异常:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()},移库数量:{it.S_YiKuNum}"); } if (result) { ChangeWorkState(it, db); startList.ForEach(a => { var startrow = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE == "移库锁").ToList(); foreach (var start in startrow) { start.S_LOCK_STATE = "无"; db.Updateable(start).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } TaskProcess.AreaRowLockState(a, false); }); endList.ForEach(a => { var endrow = db.Queryable().Where(info => info.N_ROW.Trim() == a && info.S_LOCK_STATE == "移库锁").ToList(); foreach (var end in endrow) { end.S_LOCK_STATE = "无"; db.Updateable(end).UpdateColumns(ab => new { ab.S_LOCK_STATE }).ExecuteCommand(); } TaskProcess.AreaRowLockState(a, false); }); } } /// /// 更改工单状态为移库完成 /// /// /// private static void ChangeWorkState(WorkOrder it, SqlSugar.SqlSugarClient db) { var work = db.Queryable().Where(a => a.S_WorkNo == it.S_WorkNo).First(); if (work != null) { work.S_WorkState = "完成"; db.Updateable(work).UpdateColumns(a => new { a.S_WorkState }).ExecuteCommand(); LogHelper.Info($"移库任务完成:工单号:{it.S_WorkNo.Trim()},工单类型:{it.S_ORDER_TYPE.Trim()}", "Monitor"); } } #endregion #region 农夫山泉-淳安工厂 /// /// 充电时间-24小时制 /// public static string batteryStart = Settings.BatteryTime; public static string batteryEnd = Settings.BatteryTimeEnd; /// /// 自动充电 /// internal static void AnalysisBattery() { LogHelper.Info("充电任务流程判断:执行开始!", "Monitor"); var db = new SqlHelper().GetInstance(); var now = DateTime.Today; string date = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + "12:00:00"; DateTime dt = Convert.ToDateTime(date); string dateStart = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + batteryStart; DateTime dtStart = Convert.ToDateTime(dateStart); string dateEnd = now.Year.ToString() + "-" + now.Month.ToString() + "-" + now.Day.ToString() + " " + batteryEnd; DateTime dtEnd = Convert.ToDateTime(dateEnd); if (dtStart.Subtract(dt).TotalMinutes > 0 && dtEnd.Subtract(dt).TotalMinutes < 0) { //晚上至凌晨时间段 if (DateTime.Now.Subtract(dt).TotalMinutes > 0) dtEnd = Convert.ToDateTime(dateEnd).AddDays(1);//当前时间为夜晚--结束时间天数加1 else dtStart = Convert.ToDateTime(dateStart).AddDays(-1);//当前时间为凌晨--开始时间天数减一 } LogHelper.Info($"当前时间:{DateTime.Now},起始时间:{dtStart},结束时间:{dtEnd}", "Monitor"); //Console.WriteLine($"【处理时间判断】:{DateTime.Now >= dtStart},{DateTime.Now <= dtEnd}"); if (DateTime.Now >= dtStart && DateTime.Now <= dtEnd) { //先判断中间表是否有当前充电桩的状态,有则不操作,反之进入小车电量查询 LogHelper.Info("进入充电任务流程:当前时间满足生成充电任务基本要求,开始判断ChargingPile配置项中当前充电桩状态是否开启", "Monitor");//ChargingPile var list = Settings.GetChargingPile().Where(a => a.enable == "1").ToList(); if (list.Count > 0) { list.ForEach(a => { var agvState = db.Queryable().Where(b => b.agvNo == a.agvNo).First(); if (agvState != null) { int agvNo = int.Parse(a.agvNo); var margin = db.Queryable().Where(b => b.agvNo == agvNo).First(); if (margin != null) { if (int.Parse(agvState.agvBattery.Trim()) <= 600) { var count = db.Queryable().Where(b => b.state == 1).ToList(); if (count.Count() == 0) { if (margin.state == 0) { var dic = new Dictionary(); dic.Add("Pri", "20"); dic.Add("ExtDeviceNo", a.agvNo); dic.Add("FRow", ""); dic.Add("TRow", ""); dic.Add("No", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss:fff:ffffff")); var res = NDC.AddNewOrder(1, dic); if (res != null && (res.Res.ErrCode == 0 || res.Res.ErrCode == 50009)) { //推送成功,修改任务优先级 margin.state = 1; db.Updateable(margin).ExecuteCommand(); LogHelper.Info($"充电任务下发成功,车号:{a.agvNo}", "Monitor"); } } } } else if (int.Parse(agvState.agvBattery.Trim()) >= 1000) { margin.state = 2; db.Updateable(margin).ExecuteCommand(); } } else { int marginGroup = int.Parse(a.charginGroup); var count = db.Queryable().Where(b => b.marginGroup == marginGroup && b.state == 1).ToList(); if (count.Count() == 0) { MarginAGV marginAGV = new MarginAGV { agvNo = int.Parse(a.agvNo), marginGroup = int.Parse(a.charginGroup), state = 0, dateTime = DateTime.Now }; db.Insertable(marginAGV).ExecuteCommand(); } } } }); } } else { //超过一小时,删除中间表全部数据 db.Deleteable().Where(a => a.singNo == "1").ExecuteCommand(); LogHelper.Info($"进入充电任务流程:当前时间不满足AMS推送小车充电,删除MarginAGV小车充电中间表!", "Monitor"); } LogHelper.Info("充电任务流程判断:执行结束!", "Monitor"); } #endregion #region 调试模式 internal static void Test() { //var db = new SqlHelper().GetInstance(); //var listMaxCol = db.Queryable().Where(a => a.S_AREA_CODE == "CACK1" && a.N_ROW == 3).OrderByDescending(a => a.N_COL).First(); ////Console.WriteLine(JsonConvert.SerializeObject(listMaxCol)); //var trayInfoList = WCSHelper.GetChunAnTrayInfoList(); ////Console.WriteLine(JsonConvert.SerializeObject(trayInfoList)); //bool result = WCSHelper.DelChunAnTrayInfo("A01","10"); ////Console.WriteLine(JsonConvert.SerializeObject(result)); //var loca = IntensiveArea.GetLocationIn("CACK1", "塑料水", "202303150001"); ////Console.WriteLine(JsonConvert.SerializeObject(loca)); //WCSHelper.CreateTable(); //var url = Settings.GetThirdPartyUrlList(); //for (int i = 0; i < url.Count(); i++) //{ // //Console.WriteLine(url[i].Url); //} } #endregion } }