| | |
| | | using HH.WCS.JuShi.api; |
| | | using HH.WCS.JuShi.device; |
| | | using HH.WCS.JuShi.process; |
| | | using HH.WCS.JuShi.util; |
| | | using HH.WCS.JuShi.wms; |
| | |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Reflection; |
| | | using System.Reflection.Emit; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using static HH.WCS.JuShi.device.S7Helper; |
| | |
| | | { |
| | | //bool result = false; |
| | | //找送检入库区满托盘的货位 |
| | | var db = new SqlHelper<Location>().GetInstance(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault(); |
| | | var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "RGV库区").FirstOrDefault(); |
| | | //三表联查查出托盘满的 按创建时间顺序 |
| | | var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<Container>((p, c) => p.S_CNTR_CODE == c.S_CODE) |
| | | .Where((p, c) => c.C_FULL == "2") |
| | | .OrderBy((p, c) => p.T_CREATE) |
| | | .Select((p, c) => p.S_LOC_CODE) // 选择托盘物料表的数据 |
| | | .ToList(); |
| | | var reservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检入库区").FirstOrDefault(); |
| | | var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "立库入库区").FirstOrDefault(); |
| | | //三表联查查出托盘满的 按创建时间顺序 |
| | | var locCntrs = db.Queryable<LocCntrRel>().LeftJoin<Container>((p, c) => p.S_CNTR_CODE == c.S_CODE) |
| | | .Where((p, c) => c.C_FULL == "2") |
| | | .OrderBy((p, c) => p.T_CREATE) |
| | | .Select((p, c) => p.S_LOC_CODE) // 选择托盘物料表的数据 |
| | | .ToList(); |
| | | |
| | | //找送检入库区内托盘满了的货位 |
| | | var locList = db.Queryable<Location>() |
| | | .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0) |
| | | .Where(s => locCntrs.Contains(s.S_CODE.Trim())) |
| | | .ToList(); |
| | | //找送检入库区内托盘满了的货位 |
| | | var locList = db.Queryable<Location>() |
| | | .Where(p => p.S_AREA_CODE == reservoirs.areaCode && p.N_LOCK_STATE == 0 && p.C_ENABLE == "Y") |
| | | .Where(s => locCntrs.Contains(s.S_CODE.Trim())) |
| | | .ToList(); |
| | | |
| | | if (locList.Any()) |
| | | { |
| | | //建任务 |
| | | var startLoc = locList.FirstOrDefault(); |
| | | var endLoc = TaskProcess.InWorkTransport(reservoirs2.areaCode); |
| | | if (locList.Any()) |
| | | { |
| | | LogHelper.Info($"任务摄像头监测空满状态找到货位{JsonConvert.SerializeObject(locList)}"); |
| | | //建任务 |
| | | var startLoc = locList.FirstOrDefault(); |
| | | var endLoc = TaskProcess.InWorkTransport(reservoirs2.areaCode); |
| | | LogHelper.Info($"任务摄像头监测找到终点货位:{JsonConvert.SerializeObject(endLoc)}"); |
| | | if (endLoc != null) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); |
| | | LogHelper.Info($"任务摄像头监测找到托盘:{JsonConvert.SerializeObject(locCntrRel)}"); |
| | | |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == endLoc.S_CODE).First(); |
| | | TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "摄像头监测", locCntrRel.S_CNTR_CODE, 1, 1); |
| | | TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "摄像头监测", locCntrRel.S_CNTR_CODE, 1, 1); |
| | | |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("AutoReplenish:" + ex.Message, ex); |
| | | throw; |
| | | } |
| | | { |
| | | Console.WriteLine("MonitorFullStatus:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("MonitorFullStatus:" + ex.Message, ex); |
| | | throw; |
| | | } |
| | | |
| | | |
| | | |
| | | //return result; |
| | | |
| | | |
| | |
| | | //常规送检空了自动从送检缓存区取一个送过去 |
| | | public static void AutoReplenish() |
| | | { |
| | | var db = new SqlHelper<Location>().GetInstance(); |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动补货").First(); |
| | | if (isusinglist.S_STATUS == 0) |
| | | { |
| | | return; |
| | | } |
| | | try |
| | | { |
| | | var cgreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "常规送检区").FirstOrDefault(); |
| | |
| | | var hcreservoirs = Settings.ReservoirAreas.Where(s => s.areaName == "送检缓存区").FirstOrDefault(); |
| | | //找送检缓存区有货的货位 |
| | | var startloc = TaskProcess.OutWorkTransport(hcreservoirs.areaCode); |
| | | if (startloc!=null) |
| | | //LogHelper.Info($"AutoReplenish 自动补货 起点货位{JsonConvert.SerializeObject(startloc)}"); |
| | | if (startloc != null) |
| | | { |
| | | //创建送检任务 |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startloc.S_CODE).First(); |
| | |
| | | } |
| | | } |
| | | |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("AutoReplenish:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("AutoReplenish:" + ex.Message, ex); |
| | | throw; |
| | | } |
| | | |
| | | } |
| | | //空托缓存区有绑定的托盘就送到拆托机 |
| | | public static void AutoSendMachine() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | var isusinglist = db.Queryable<Isusing>().Where(a => a.S_TYPE == "自动送托").First(); |
| | | if (isusinglist.S_STATUS == 0) |
| | | { |
| | | return; |
| | | } |
| | | try |
| | | { |
| | | var reservoirs1 = Settings.ReservoirAreas.Where(s => s.areaName == "3min空托区").FirstOrDefault(); |
| | | var reservoirs2 = Settings.ReservoirAreas.Where(s => s.areaName == "6min空托区").FirstOrDefault(); |
| | | var linePlcInfo1 = Settings.linePlcInfos.Where(s => s.deviceNo == "1").FirstOrDefault(); |
| | | var linePlcInfo2 = Settings.linePlcInfos.Where(s => s.deviceNo == "2").FirstOrDefault(); |
| | | |
| | | //查询每排最后一列有托盘的货位 根据行分区 再找每一行的最后一列有货的货位 |
| | | var list = db.Queryable<Location>(). |
| | | Where(a => a.N_CURRENT_NUM > 0).Where(a => a.S_AREA_CODE.Trim() == reservoirs1.areaCode || a.S_AREA_CODE.Trim() == reservoirs2.areaCode) |
| | | .PartitionBy(a => a.N_ROW) |
| | | .OrderByDescending(a => a.N_COL).Take(1).ToList(); |
| | | if (list.Count > 0) |
| | | { |
| | | for (int i = 0; i < list.Count; i++) |
| | | { |
| | | //var loc = list[i]; |
| | | //判断送往3寸还是6寸拆托机 |
| | | string endLoc = null; |
| | | string dev = null; |
| | | if (list[i].S_AREA_CODE == reservoirs1.areaCode) |
| | | { |
| | | endLoc = linePlcInfo1.inLoca; |
| | | dev = "1"; |
| | | } |
| | | else if (list[i].S_AREA_CODE == reservoirs2.areaCode) |
| | | { |
| | | endLoc = linePlcInfo2.inLoca; |
| | | dev = "2"; |
| | | } |
| | | var endLocation = db.Queryable<Location>().Where(s => s.S_CODE == endLoc).First(); |
| | | if (endLocation == null || endLocation.N_LOCK_STATE != 0 || endLocation.C_ENABLE != "Y") |
| | | { |
| | | //LogHelper.Info($"拆托机货位{endLoc}不存在或已被锁"); |
| | | return; |
| | | } |
| | | //校验是否允许放货 |
| | | var plcDeviceTable = S7Helper.plcDeviceTables; |
| | | LogHelper.Info($"自动送托 拆托机{dev}:{plcDeviceTable.requestPut1}"); |
| | | if ((plcDeviceTable.requestPut1 && dev == "1") || |
| | | (plcDeviceTable.requestPut2 && dev == "2")) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == list[i].S_CODE).First(); |
| | | |
| | | LogHelper.Info($"创建任务 起点:{list[i].S_CODE}终点:{endLoc}"); |
| | | var res = TaskProcess.CreateTransport(list[i].S_CODE, endLoc, "送托", locCntrRel.S_CNTR_CODE, 1, 1); |
| | | if (res) |
| | | { |
| | | LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建成功"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"起点:{list[i].S_CODE}终点:{endLoc}任务创建失败"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"拆托机{endLoc}不允许放框"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | |
| | | } |
| | | //产线自动补空托 |
| | | public static void AutoRepairEmptyTray() |
| | | { |
| | | var db = new SqlHelper<object>().GetInstance(); |
| | | try |
| | | { |
| | | //查自动补托表 |
| | | var autoLists = db.Queryable<AutoRepairEmptyTray>().ToList(); |
| | | foreach (var autolist in autoLists) |
| | | { |
| | | //找起点 |
| | | var priorityLoc = Settings.PriorityLocs.Where(s => s.Name == autolist.S_LOC_CODE).FirstOrDefault(); |
| | | var startLoc = db.Queryable<Location>() |
| | | .Where(s => s.S_CODE == priorityLoc.Location).First(); |
| | | if (startLoc != null && startLoc.N_LOCK_STATE == 0 && startLoc.C_ENABLE == "Y") |
| | | { |
| | | var plcDeviceTable = S7Helper.plcDeviceTables; |
| | | //找终点 |
| | | if (autolist.S_TYPE == "三寸") |
| | | { |
| | | var linePlcInfo = Settings.linePlcInfos.Where(s => s.deviceNo == "1").FirstOrDefault(); |
| | | //校验是否允许放货 |
| | | var endLoc = db.Queryable<Location>() |
| | | .Where(s => s.S_CODE == linePlcInfo.outLoca).First(); |
| | | if (endLoc != null && endLoc.N_LOCK_STATE == 0 && endLoc.C_ENABLE == "Y") |
| | | { |
| | | if (plcDeviceTable.requestTake1) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); |
| | | |
| | | LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}"); |
| | | var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "送托", locCntrRel.S_CNTR_CODE, 1, 1); |
| | | if (res) |
| | | { |
| | | LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | else if (autolist.S_TYPE == "六寸") |
| | | { |
| | | var linePlcInfo = Settings.linePlcInfos.Where(s => s.deviceNo == "2").FirstOrDefault(); |
| | | //校验是否允许放货 |
| | | var endLoc = db.Queryable<Location>() |
| | | .Where(s => s.S_CODE == linePlcInfo.outLoca).First(); |
| | | if (endLoc != null && endLoc.N_LOCK_STATE == 0 && endLoc.C_ENABLE == "Y") |
| | | { |
| | | if (plcDeviceTable.requestTake2) |
| | | { |
| | | var locCntrRel = db.Queryable<LocCntrRel>().Where(a => a.S_LOC_CODE == startLoc.S_CODE).First(); |
| | | |
| | | LogHelper.Info($"创建任务 起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}"); |
| | | var res = TaskProcess.CreateTransport(startLoc.S_CODE, endLoc.S_CODE, "送托", locCntrRel.S_CNTR_CODE, 1, 1); |
| | | if (res) |
| | | { |
| | | LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建成功"); |
| | | } |
| | | else |
| | | { |
| | | LogHelper.Info($"起点:{startLoc.S_CODE}终点:{endLoc.S_CODE}任务创建失败"); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine("AutoRepairEmptyTray:" + ex.Message + ex.StackTrace); |
| | | LogHelper.Error("AutoRepairEmptyTray:" + ex.Message, ex); |
| | | throw; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
| | | |
| | | } |
| | | } |