123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177 |
- using DBHelper;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using WCS.Core;
- using WCS.Entity;
- using WCS.Entity.Protocol;
- namespace WCS.Service.Works.Stations
- {
- //[WorkTitle(typeof(ProductHandler), "出库交通管制", true)]
- public class 出库交通管制 : DeviceWork<Device<IStation521, IStation520>>
- {
- protected override void Do(Device<IStation521, IStation520> obj)
- {
- if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
- return;
- if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
- return;
- if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
- return;
- if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
- return;
- DB.Do(db =>
- {
- var task = db.Default.Set<WCS_TASK>().Find(obj.Data.TASKNUM);
- if (task.TYPE == TaskType.出库)
- {
- //var outPath = obj.Entity.GetPath(task.ADDRTO);
- //var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.入库 || v.TYPE == TaskType.组盘)
- //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建)
- //.Where(v => v.ADDRFROM == task.ADDRTO).ToArray();
- ////tasks = tasks.Where(v => v.ID == 17328).ToArray();
- //var arr = tasks.Select(v =>
- //{
- // var current = v.AddrCurrent(db);
- // var path = Device.Find(current).GetPath(v.ADDRNEXT);
- // if (path == null)
- // path = new List<WCS_DEVICE>();
- // return new
- // {
- // Task = v,
- // Path = path.Concat(new List<WCS_DEVICE> { Device.Find(current) })
- // };
- //}).ToArray();
- //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault();
- //if (t != null)
- //{
- // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突");
- //}
- var any = false;
- if (obj.Entity.CODE == "2366")
- any = Device.Find("2123", "2125", "2126", "2327", "2128", "2131").Select(v => v.Device<IStation521>()).Where(v => v.Data.GOODSEND == 2153 || v.Data.GOODSEND == 2161).Any();
- else
- any = Device.Find("2114", "2116", "2117", "2328", "2119", "2122").Select(v => v.Device<IStation521>()).Where(v => v.Data.GOODSEND == 2359).Any();
- if (any)
- throw new Exception($"交通管制,有正在执行的入库任务");
- var q = db.Default.Set<WCS_AGVTask>().Where(v => v.TaskType == AGVTaskType.入库 && v.Status < AGVTaskStatus.完成扫码 && v.Status > AGVTaskStatus.新建);
- if (task.ADDRTO == "2086")
- {
- q = q.Where(v => v.Station == "2088");
- }
- else
- {
- q = q.Where(v => v.Station == task.ADDRTO);
- }
- var agvtask = q.FirstOrDefault();
- if (agvtask != null)
- {
- throw new Exception("交通管制,与AGV任务" + agvtask.ID + "冲突");
- }
- task.ADDRNEXT = task.ADDRTO;
- task.UPDATETIME = DateTime.Now;
- db.Default.SaveChanges();
- obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT);
- obj.Data2.TASKNUM = task.ID;
- obj.Data2.GOODSCODE = obj.Data.GOODSCODE;
- obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE;
- obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE;
- obj.Data2.HEIGHT = obj.Data.HEIGHT;
- obj.Data2.CONFIRM = true;
- }
- });
- }
- protected override bool SelectDevice(WCS_DEVICE dev)
- {
- return false;// new string[] { "2108" }.Contains(dev.CODE);
- }
- }
- [WorkTitle(typeof(ProductHandler), "交管2325", true)]
- public class 交管2325 : DeviceWork<Device<IStation521, IStation520>>
- {
- protected override void Do(Device<IStation521, IStation520> obj)
- {
- if (Ltc.Do(obj, v => v.Data2.CONFIRM == true))
- return;
- if (Ltc.Do(obj, v => v.Data.TASKNUM == 0))
- return;
- if (Ltc.Do(obj, v => v.Data.PH_STATUS == false))
- return;
- if (Ltc.Do(obj, v => v.Data.GOODSEND != v.Entity.Code()))
- return;
- //if (Ltc.Do(obj, v => !v.Entity.WakeupOn(5000, "交通管制")))
- // return;
- DB.Do(db =>
- {
- var task = db.Default.Set<WCS_TASK>().Find(obj.Data.TASKNUM);
- if (task.TYPE == TaskType.出库)
- {
- var rgv = Device.Find("RGV5").Device<IRGV521, IRGV520>();
- if (rgv.Data2.Trigger == 1)
- throw new Exception("等待WCS与RGV5交互完成");
- var outqty = (rgv.Data.DestPosition == 2081 && rgv.Data.SystemStatus != RGVRunStatus.空闲) ? 1 : 0;
- outqty += Device.Where(v => "2325,2081,2083,2084,2086".Split(',').Contains(v.CODE)).Select(v => v.Device<IStation521, IStation520>())
- .Where(v => v.Data.GOODSEND == 2086 || (v.Data2.GOODSEND == 2086 && v.Data2.CONFIRM))
- .Count();
- if (outqty >= 2)
- {
- throw new Exception($"流量控制,放行任务数已达{outqty}");
- }
- var inqty = Device.Where(v => "2081,2083,2088".Split(',').Contains(v.CODE)).Select(v => v.Device<IStation521,IStation520>())
- .Where(v => v.Data.GOODSEND == 2324||(v.Data2.GOODSEND==2324&&v.Data2.CONFIRM))
- .Count();
- if (inqty > 0)
- {
- throw new Exception($"交通管制,正在入库的任务数{inqty}");
- }
- //var outPath = obj.Entity.GetPath(task.ADDRTO);
- //var tasks = db.Default.Set<WCS_TASK>().Where(v => v.TYPE == TaskType.入库).Where(v => v.ADDRFROM == "2088")
- //.Where(v => v.STATUS < WCS.Entity.TaskStatus.堆垛机执行 && v.STATUS > WCS.Entity.TaskStatus.新建).ToArray();
- //var arr = tasks.Select(v =>
- //{
- // var current = v.AddrCurrent(db);
- // var path = Device.Find(current).GetPath(v.ADDRNEXT);
- // if (path == null)
- // path = new List<WCS_DEVICE>();
- // return new
- // {
- // Task = v,
- // Path = path.Concat(new List<WCS_DEVICE> { Device.Find(current) })
- // };
- //}).ToArray();
- //var t = arr.Where(v => v.Path.Intersect(outPath).Where(v => v.IsConv()).Count() > 0).FirstOrDefault();
- //if (t != null)
- //{
- // throw new Exception("交通管制,与任务" + t.Task.ID + "路径冲突");
- //}
- task.ADDRNEXT = task.ADDRTO;
- task.UPDATETIME = DateTime.Now;
- db.Default.SaveChanges();
- obj.Data2.GOODSEND = short.Parse(task.ADDRNEXT);
- obj.Data2.TASKNUM = task.ID;
- obj.Data2.GOODSCODE = obj.Data.GOODSCODE;
- obj.Data2.GOODSSIZE = obj.Data.GOODSSIZE;
- obj.Data2.GOODSTYPE = obj.Data.GOODSTYPE;
- obj.Data2.HEIGHT = obj.Data.HEIGHT;
- obj.Data2.CONFIRM = true;
- }
- });
- }
- protected override bool SelectDevice(WCS_DEVICE dev)
- {
- return new string[] { "2325" }.Contains(dev.CODE);
- }
- }
- }
|