using DBHelper; using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Service.Extensions; using WCS.Service.Handlers; using WCS.Service.Helpers; using TaskStatus = WCS.Entity.TaskStatus; namespace WCS.Service.Works { [WorkTitle(typeof(SCHandler), "小库堆垛机", true)] internal class SCWork : DeviceWork> { private Device RGV1; private Device[] DockDevs; public SCWork() { RGV1 = Device.Find("RGV1").Device(); DockDevs = new string[] { "2260","2262","2264", "2259","2261","2263", "2251", "2253", "2255" }.Select(v => Device.Find(v).Device()).ToArray(); } protected override bool SelectDevice(WCS_DEVICE dev) { //return true; return new string[] { "SC7" , "SC8" , "SC9" }.Contains(dev.CODE); } protected override void Do(Device dev) { var deviceCode = dev.Entity.CODE; if (dev.Data3.SCAlarm != 0) { if (dev.Entity.WakeupOn(5000)) WMS.DevInfo(dev.Entity.CODE, dev.Data3.SCAlarm.ToString()); } if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) { if (Ltc.Do(dev, v => v.Data.TaskID == v.Data2.TaskID)) { if (Ltc.Do(dev, v => v.Data.Status != SCRunStatus.空闲 && v.Data.Status != SCRunStatus.维护)) dev.Data2.Trigger = 0; } return; } if (Ltc.Do(dev, v => v.Data2.FinishedACK != 0)) { if (Ltc.Do(dev, v => v.Data.FinishedTask == 0)) dev.Data2.FinishedACK = 0; return; } if (Ltc.Do(dev, v => v.Data.FinishedTask != 0)) { DB.Do(db => { var taskid = dev.Data.FinishedTask; var task = db.Default.Set().Find(taskid); //记录一下原始状态,用于状态发生时进行记录 var oldStatus = task.STATUS; if (task == null) throw new Exception($"[{deviceCode}]任务号[{taskid}]不存在"); if (task.STATUS < TaskStatus.堆垛机执行) throw new Exception($"[{deviceCode}]任务号[{taskid}]状态有误"); if (task.TYPE == TaskType.入库) { task.ENDTIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.已完成; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } else if (task.TYPE == TaskType.出库) { if (dev.Data.ELine >= 2275 && dev.Data.ELine <= 2280) { task.STATUS = TaskStatus.已完成; task.UPDATETIME = DateTime.Now; task.ENDTIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } else if (task.STATUS == TaskStatus.堆垛机执行) { task.STATUS = TaskStatus.堆垛机完成; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } var target = Device.Find(dev.Data.ELine.ToString()).Device(); target.Data2.TASKNUM = task.ID; target.Data2.GOODSTYPE = task.PALLETTYPE; target.Data2.GOODSEND = short.Parse(task.ADDRNEXT); } else throw new Exception($"[{deviceCode}]任务类型错误"); dev.Data2.FinishedACK = 1; task.CreateStatusLog(db); }); return; } Ltc.Log("开始下发任务"); var tunnel = ""; //if (dev.Entity.CODE == "SC4" || dev.Entity.CODE == "SC5") // tunnel = "TM" + dev.Data.Tunnel; //else if (dev.Data.Tunnel == 1) { tunnel = "TY9"; } else if (dev.Data.Tunnel == 2) { tunnel = "TY8"; } else if (dev.Data.Tunnel == 3 ) { tunnel = "TY7"; } if (Ltc.Do(dev, v => v.Data.Mode != SCMode.远程)) return; if (Ltc.Do(dev, v => v.Data.Status != SCRunStatus.空闲)) return; var isTransfer = new List(); DB.Do(db => { var t = db.Default.Set().Where(v => v.DEVICE == dev.Entity.CODE).Where(v => v.STATUS == TaskStatus.堆垛机执行).FirstOrDefault(); if (t != null) throw new Exception($"[{deviceCode}]有正在执行的任务:" + t.ID); //属于当前堆垛机未执行的移库任务 isTransfer = db.Default.Set().AsNoTracking().Where(v => v.DEVICE == dev.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList(); //判断是否存在调整优先级任务,存在初始化isTransfer值 让本次执行优先任务 if (db.Default.Set().AsNoTracking().Any(v => v.DEVICE == dev.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0)) isTransfer = new List(); }); var LastIsOut = dev.Entity.Get("LastIsOut"); dev.Entity.Set("LastIsOut", !LastIsOut); if (isTransfer.Count > 0) //防止因为无当前堆垛机移库任务导致无法执行其他类型任务 { #region 移库 Ltc.Log($"[{deviceCode}]开始获取移库任务"); DB.Do(db => { //获取当前堆垛机未执行的任务 var task = db.Default.Set().Where(v => v.DEVICE == dev.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault(); if (task == null) return; var loc = WMS.GetLocalIn(task.WMSTASK, task.TUNNEL, task.ADDRTO); var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer); task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.堆垛机执行; task.DEVICE = dev.Entity.CODE; task.TUNNEL = task.TUNNEL; db.Default.SaveChanges(); task.CreateStatusLog(db); Uploader.Upload(db); dev.Data2.TaskID = task.ID; var addrFrom = task.ADDRFROM.Split("-"); dev.Data2.SLine = short.Parse(addrFrom[1]); dev.Data2.SCol = short.Parse(addrFrom[2]); dev.Data2.SLayer = short.Parse(addrFrom[3]); var addrTo = task.ADDRTO.Split("-"); dev.Data2.ELine = short.Parse(addrTo[1]); dev.Data2.ECol = short.Parse(addrTo[2]); dev.Data2.ELayer = short.Parse(addrTo[3]); dev.Data2.Trigger = 1; }); #endregion 移库 } if (LastIsOut) { #region 入库 Ltc.Log("开始获取入库任务"); var arrIn = Device.Where(v => v.SC() == dev.Entity).Where(v => v.Is(DF.SC取货)) .Select(v => new Device(v)).ToArray(); arrIn = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.ROUTES.Any(e => e.NEXT == dev.Entity))) .Select(v => new Device(v)).ToArray(); arrIn = Ltc.Do(arrIn, arr => arr.Where(v => v.Data3.Status.HasFlag(StationStatus.自动) && v.Data.TASKNUM > 0 && v.Data.PH_STATUS && !v.Data3.Status.HasFlag(StationStatus.运行状态位))).ToArray(); if (arrIn.Length == 0) return; var st = arrIn.OrderBy(v => v.Entity.ROUTES.First().NEXT.CODE.EndsWith(dev.Data.Tunnel.ToString()) ? 0 : 1) .ThenBy(v => (v.Data.TASKNUM > 0 && v.Data.PH_STATUS && !v.Data3.Status.HasFlag(StationStatus.运行状态位)) ? 0 : 1) .ThenBy(v => v.UpdateTime).First(); var t = st.Entity.ROUTES.First().NEXT.CODE; DB.Do(db => { var task = db.Default.Set().Find(st.Data.TASKNUM); var loc = WMS.GetLocalIn(task.WMSTASK, t, st.Entity.CODE); var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer); task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.堆垛机执行; task.ADDRTO = locno; task.TUNNEL = t; task.DEVICE = dev.Entity.CODE; db.Default.SaveChanges(); Uploader.Upload(db); task.CreateStatusLog(db); dev.Data2.TaskID = task.ID; dev.Data2.SLine = st.Entity.Code(); dev.Data2.SCol = 0; dev.Data2.SLayer = 0; dev.Data2.ELine = loc.Row; dev.Data2.ECol = loc.Colomn; dev.Data2.ELayer = loc.Layer; dev.Data2.Trigger = 1; }); #endregion 入库 } else { #region 出库 Ltc.Log("开始获取出库任务"); var floor = dev.Entity.Get("LastFloor"); floor = floor % 2 + 1; dev.Entity.Set("LastFloor", floor); //获取当前设备可以放货的输送机 var list = dev.Entity.ROUTES.Select(v => v.NEXT) .SelectMany(v => v.ROUTES.Select(d => d.NEXT)) .Where(v => v.IsConv()) .Select(v => new Device(v)).ToList(); //获取当前无货的设备集合 list = list.Where(v => { var res = v.Data3.Status.HasFlag(StationStatus.自动) && v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false && v.Data.REQUEST == false; //排除原膜库的放货口 if (res) { Device moveDev = null; if (v.Entity.CODE == "2056" || v.Entity.CODE == "2057") moveDev = Device.Find("2055").Device(); else if (v.Entity.CODE == "2027" || v.Entity.CODE == "2028") moveDev = Device.Find("2026").Device(); if (moveDev != null) res = moveDev.Data.TASKNUM == 0 && moveDev.Data.PH_STATUS == false; } return res; }).ToList(); if (list.Count == 0) return; var empties = list.Select(v => v.Entity.CODE).ToArray(); //筛选出一楼月台出库需要用到的设备当前的任务号信息 var taskidList = DockDevs.Select(v => v.Data.TASKNUM).ToList(); //如果rgv不为空闲,也将rgv中的任务ID加入列表看看 if (RGV1.Data.SystemStatus != RGVRunStatus.空闲) taskidList.Add(RGV1.Data.TaskID); //筛选出有效任务号 taskidList = taskidList.Where(v => v != 0).ToList(); var sc = dev.Entity.CODE; DB.Do(db => { var flag = db.Default.Set().Any(d => d.DEVICE == sc && d.STATUS == TaskStatus.堆垛机执行); if (flag) throw new Exception($"[{deviceCode}]有正在执行的出库任务"); //找到该堆垛机当前等待执行的任务 var q = db.Default.Set().Where(v => v.STATUS == TaskStatus.新建) .Where(v => v.DEVICE == sc) .Where(v => v.TYPE == TaskType.出库 && v.Priority >= 0) .Where(v => !db.Default.Set().Any(d => d.DEVICE == sc && d.STATUS == TaskStatus.堆垛机执行)); if (dev.Entity.CODE == "SC7" || dev.Entity.CODE == "SC8" || dev.Entity.CODE == "SC9") { //找到所有出口相同的任务 //一个目标位置同一时间最多只能有两个卷 q = q.Where(v => db.Default.Set().Where(d => d.TYPE == TaskType.出库) .Where(d => d.STATUS > TaskStatus.新建) .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID)) .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR) .Where(d => d.DEVICE == "SC7" || d.DEVICE == "SC8" || d.DEVICE == "SC9") .Count() < 2 ); } else q = q.Where(v => empties.Contains(v.SCSTATION)); var task = q.OrderByDescending(v => v.Priority) .ThenBy(v => v.TUNNEL == tunnel ? 0 : 1) .ThenBy(v => v.FLOOR == floor ? 0 : 1) .ThenBy(v => v.CREATETIME) .FirstOrDefault(); if (task == null) { Ltc.Log("无出库任务可执行"); return; } var target = Device.Find(task.SCSTATION).Device(); target.Data2.TASKNUM = 0; target.Data2.GOODSTYPE = 0; target.Data2.GOODSSIZE = 0; target.Data2.GOODSEND = 0; task.STATUS = TaskStatus.堆垛机执行; task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); task.CreateStatusLog(db); if (task.ADDRFROM.Split('-').Length != 3) throw new Exception($"[{deviceCode}]出库任务起始位置错误:{task.ADDRFROM}"); var arr = task.ADDRFROM.Split('-').Select(v => short.Parse(v)).ToArray(); dev.Data2.TaskID = task.ID; dev.Data2.SLine = arr[0]; dev.Data2.SCol = arr[1]; dev.Data2.SLayer = arr[2]; dev.Data2.ELine = target.Entity.Code(); dev.Data2.ECol = 0; dev.Data2.ELayer = 0; dev.Data2.Trigger = 1; }); #endregion 出库 } } } [WorkTitle(typeof(SCHandler), "大库堆垛机", true)] internal class SCWork2 : DeviceWork> { private Device RGV1; private Device[] DockDevs; public SCWork2() { RGV1 = Device.Find("RGV1").Device(); DockDevs = new string[] { "2260","2262","2264", "2259","2261","2263", "2251", "2253", "2255" }.Select(v => Device.Find(v).Device()).ToArray(); } protected override bool SelectDevice(WCS_DEVICE dev) { //return true; return new string[] { "SC1", "SC2", "SC3" ,"SC4", "SC6" }.Contains(dev.CODE); } protected override void Do(Device dev) { var deviceCode = dev.Entity.CODE; if (dev.Data3.SCAlarm != 0) { if (dev.Entity.WakeupOn(5000)) WMS.DevInfo(dev.Entity.CODE, dev.Data3.SCAlarm.ToString()); } if (Ltc.Do(dev, v => v.Data2.Trigger != 0)) { if (Ltc.Do(dev, v => v.Data.TaskID == v.Data2.TaskID)) { if (Ltc.Do(dev, v => v.Data.Status != SCRunStatus.空闲 && v.Data.Status != SCRunStatus.维护)) dev.Data2.Trigger = 0; } LogHelper.AddWCS_EXCEPTION($"WCS清除[{deviceCode}]执行任务触发信号"); return; } if (Ltc.Do(dev, v => v.Data2.FinishedACK != 0)) { if (Ltc.Do(dev, v => v.Data.FinishedTask == 0)) dev.Data2.FinishedACK = 0; LogHelper.AddWCS_EXCEPTION($"WCS清除[{deviceCode}]完成任务触发信号"); return; } if (Ltc.Do(dev, v => v.Data.FinishedTask != 0)) { WCS_TASK task = new WCS_TASK(); DB.Do(db => { var taskid = dev.Data.FinishedTask; task = db.Default.Set().Find(taskid); if (task.STATUS < TaskStatus.堆垛机执行) throw new Exception($"[{deviceCode}],任务号" + taskid + "状态有误"); if (task.TYPE == TaskType.入库) { task.ENDTIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.已完成; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } else if (task.TYPE == TaskType.出库) { if (dev.Data.ELine >= 2275 && dev.Data.ELine <= 2280) { task.STATUS = TaskStatus.已完成; task.UPDATETIME = DateTime.Now; task.ENDTIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } else if (task.STATUS == TaskStatus.堆垛机执行) { task.STATUS = TaskStatus.堆垛机完成; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } var target = Device.Find(dev.Data.ELine.ToString()).Device(); target.Data2.TASKNUM = task.ID; target.Data2.GOODSTYPE = task.PALLETTYPE; target.Data2.GOODSEND = short.Parse(task.ADDRNEXT); } else if (task.TYPE == TaskType.移库) { if (task.STATUS == TaskStatus.堆垛机执行) { task.STATUS = TaskStatus.已完成; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } } else throw new Exception($"[{deviceCode}]任务类型错误"); dev.Data2.FinishedACK = 1; task.CreateStatusLog(db); }); LogHelper.AddWCS_EXCEPTION($"WCS变更[{deviceCode}]任务[{task.ID}]状态为[{task.STATUS}]"); return; } Ltc.Log("开始下发任务"); var tunnel = ""; //if (dev.Entity.CODE == "SC4" || dev.Entity.CODE == "SC5") // tunnel = "TM" + dev.Data.Tunnel; //else tunnel = "TY" + dev.Data.Tunnel; if (Ltc.Do(dev, v => v.Data.Mode != SCMode.远程)) return; if (Ltc.Do(dev, v => v.Data.Status != SCRunStatus.空闲)) return; var isTransfer = new List(); DB.Do(db => { var t = db.Default.Set().Where(v => v.DEVICE == dev.Entity.CODE).Where(v => v.STATUS == TaskStatus.堆垛机执行).FirstOrDefault(); if (t != null) throw new Exception($"[{deviceCode}]有正在执行的任务:" + t.ID); //属于当前堆垛机未执行的移库任务 isTransfer = db.Default.Set().AsNoTracking().Where(v => v.DEVICE == dev.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).ToList(); //判断是否存在调整优先级任务,存在初始化isTransfer值 让本次执行优先任务 if (db.Default.Set().AsNoTracking().Any(v => v.DEVICE == dev.Entity.CODE && v.TYPE != TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行 && v.Priority > 0)) isTransfer = new List(); }); var LastIsOut = dev.Entity.Get("LastIsOut"); dev.Entity.Set("LastIsOut", !LastIsOut); if (isTransfer.Count > 0) //防止因为无当前堆垛机移库任务导致无法执行其他类型任务 { #region 移库 Ltc.Log($"[{deviceCode}]开始获取移库任务"); DB.Do(db => { //获取当前堆垛机未执行的任务 var task = db.Default.Set().Where(v => v.DEVICE == dev.Entity.CODE && v.TYPE == TaskType.移库 && v.STATUS < TaskStatus.堆垛机执行).OrderBy(p => p.CREATETIME).FirstOrDefault(); if (task == null) return; var loc = WMS.GetLocalIn(task.WMSTASK, task.TUNNEL, task.ADDRTO); var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer); task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.堆垛机执行; task.DEVICE = dev.Entity.CODE; task.TUNNEL = task.TUNNEL; db.Default.SaveChanges(); task.CreateStatusLog(db); Uploader.Upload(db); dev.Data2.TaskID = task.ID; var addrFrom = task.ADDRFROM.Split("-"); dev.Data2.SLine = short.Parse(addrFrom[1]); dev.Data2.SCol = short.Parse(addrFrom[2]); dev.Data2.SLayer = short.Parse(addrFrom[3]); var addrTo = task.ADDRTO.Split("-"); dev.Data2.ELine = short.Parse(addrTo[1]); dev.Data2.ECol = short.Parse(addrTo[2]); dev.Data2.ELayer = short.Parse(addrTo[3]); dev.Data2.Trigger = 1; }); #endregion 移库 } else if (LastIsOut) { #region 入库 Ltc.Log("开始获取入库任务"); //获取所有堆垛机所有取货点的信息 var arrIn = Device.Where(v => v.SC() == dev.Entity).Where(v => v.Is(DF.SC取货)) .Select(v => new Device(v)).ToArray(); //获取所有当前堆垛机可用的取货点 arrIn = Device.Where(v => v.IsConv() && v.ROUTES.Any(d => d.NEXT.ROUTES.Any(e => e.NEXT == dev.Entity))) .Select(v => new Device(v)).ToArray(); //在可用取货点中筛选出 有正在前往取货点任务的取货点 arrIn = arrIn.Where(v => Device.Where(d => d.IsConv()).Select(d => d.Device()).Where(d => d.Data.GOODSEND == v.Entity.Code()).Any()).Where(v => v.Data3.Status.HasFlag(StationStatus.自动)).ToArray(); if (arrIn.Length == 0) return; //无当前堆垛机的入库任务 var st = arrIn.OrderBy(v => v.Entity.ROUTES.First().NEXT.CODE.EndsWith(dev.Data.Tunnel.ToString()) ? 0 : 1) .ThenBy(v => (v.Data.TASKNUM > 0 && v.Data.PH_STATUS && !v.Data3.Status.HasFlag(StationStatus.运行状态位)) ? 0 : 1) .ThenBy(v => v.UpdateTime).First(); if (!(st.Data.TASKNUM > 0 && st.Data.PH_STATUS && !st.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new Exception($"[{deviceCode}]等待入库任务输送到位"); var t = st.Entity.ROUTES.First().NEXT.CODE; DB.Do(db => { var task = db.Default.Set().Find(st.Data.TASKNUM); var loc = WMS.GetLocalIn(task.WMSTASK, t, st.Entity.CODE); var locno = string.Format("{0}-{1}-{2}", loc.Row, loc.Colomn, loc.Layer); task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; task.STATUS = WCS.Entity.TaskStatus.堆垛机执行; task.ADDRTO = locno; task.DEVICE = dev.Entity.CODE; task.TUNNEL = t; db.Default.SaveChanges(); Uploader.Upload(db); task.CreateStatusLog(db); dev.Data2.TaskID = task.ID; dev.Data2.SLine = st.Entity.Code(); dev.Data2.SCol = 0; dev.Data2.SLayer = 0; dev.Data2.ELine = loc.Row; dev.Data2.ECol = loc.Colomn; dev.Data2.ELayer = loc.Layer; dev.Data2.Trigger = 1; }); #endregion 入库 } else { #region 出库 Ltc.Log("开始获取出库任务"); var floor = dev.Entity.Get("LastFloor"); floor = floor % 2 + 1; dev.Entity.Set("LastFloor", floor); var list = dev.Entity.ROUTES.Select(v => v.NEXT) .SelectMany(v => v.ROUTES.Select(d => d.NEXT)) .Where(v => v.IsConv()) .Select(v => new Device(v)).ToList(); list = list.Where(v => { var res = v.Data3.Status.HasFlag(StationStatus.自动) && v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false && v.Data.REQUEST == false; if (res) { Device moveDev = null; if (v.Entity.CODE == "2056" || v.Entity.CODE == "2057") moveDev = Device.Find("2055").Device(); else if (v.Entity.CODE == "2027" || v.Entity.CODE == "2028") moveDev = Device.Find("2026").Device(); if (moveDev != null) res = moveDev.Data.TASKNUM == 0 && moveDev.Data.PH_STATUS == false; } return res; }).ToList(); if (list.Count == 0) return; var empties = list.Select(v => v.Entity.CODE).ToArray(); var taskidList = DockDevs.Select(v => v.Data.TASKNUM).ToList(); if (RGV1.Data.SystemStatus != RGVRunStatus.空闲) taskidList.Add(RGV1.Data.TaskID); taskidList = taskidList.Where(v => v != 0).ToList(); var sc = dev.Entity.CODE; DB.Do(db => { var flag = db.Default.Set().Any(d => d.DEVICE == sc && d.STATUS == TaskStatus.堆垛机执行); if (flag) throw new Exception($"[{deviceCode}]有正在执行的出库任务"); var q = db.Default.Set().Where(v => v.STATUS == TaskStatus.新建) .Where(v => v.DEVICE == sc) .Where(v => v.TYPE == TaskType.出库 && v.Priority >= 0) .Where(v => !db.Default.Set().Any(d => d.DEVICE == sc && d.STATUS == TaskStatus.堆垛机执行)); //if (dev.Entity.CODE == "SC4" || dev.Entity.CODE == "SC5") //{ // q = q.Where(v => // db.Default.Set().Where(d => d.TYPE == TaskType.出库) // .Where(d => d.STATUS > TaskStatus.新建) // .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID)) // .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR) // .Where(d => d.DEVICE == "SC4" || d.DEVICE == "SC5") // .Count() < 2 // ); //} //else q = q.Where(v => empties.Contains(v.SCSTATION)); var task = q.OrderByDescending(v => v.Priority) .ThenBy(v => v.TUNNEL == tunnel ? 0 : 1) .ThenBy(v => v.FLOOR == floor ? 0 : 1) .ThenBy(v => v.CREATETIME) .FirstOrDefault(); if (task == null) { Ltc.Log($"{deviceCode}无出库任务可执行"); return; } var target = Device.Find(task.SCSTATION).Device();// list.Where(v => v.Entity.Tunnel() == task.TUNNEL).FirstOrDefault(); target.Data2.TASKNUM = 0; target.Data2.GOODSTYPE = 0; target.Data2.GOODSSIZE = 0; target.Data2.GOODSEND = 0; task.STATUS = TaskStatus.堆垛机执行; task.STARTTIME = DateTime.Now; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); if (task.ADDRFROM.Split('-').Length != 3) throw new Exception($"[{deviceCode}]出库任务起始位置错误:" + task.ADDRFROM); var arr = task.ADDRFROM.Split('-').Select(v => short.Parse(v)).ToArray(); dev.Data2.TaskID = task.ID; dev.Data2.SLine = arr[0]; dev.Data2.SCol = arr[1]; dev.Data2.SLayer = arr[2]; dev.Data2.ELine = target.Entity.Code(); dev.Data2.ECol = 0; dev.Data2.ELayer = 0; dev.Data2.Trigger = 1; }); #endregion 出库 } } } }