using DBHelper; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; namespace WCS.Service.Handlers { [Description("输送线处理")] public class StationHandler : LogicHandler> { public override void Start() { AddWork(v => v.Entity.Is(DF.扫码) && v.Entity.CODE == "2265", Execute); AddWork(v => v.Entity.Is(DF.扫码) && v.Entity.WorkShop() > 0, Execute2); AddWork(v => v.Entity.Is(DF.RGV放货) && !v.Entity.Is(DF.拆盘) && v.Entity.CODE != "2202", RGVPut); AddWork(v => v.Entity.Is(DF.SC放货), SCPut); AddWork(v => v.Entity.CODE == "2181", Check); AddWork(v => v.Entity.CODE == "2202", Inbound); } Random ran = new Random(); [Description("入库扫码")] protected override void Execute(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var bcrDev = Device.Find("BCR" + dev.Entity.CODE); var bcr = bcrDev.PROTOCOLS.First().Data(); var barcode = bcr.CONTENT.Trim('\r'); if (Ltc.Do(barcode, barcode => string.IsNullOrEmpty(barcode))) {//扫码失败,退回 dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = -1; dev.Data2.CONFIRM = true; return; } var rgv = dev.Entity.ROUTES.Select(v => v.NEXT).Where(v => v.IsRGV()).FirstOrDefault(); var arr = rgv.ROUTES.Select(v => v.NEXT).Where(v => v.ROUTES.Any(d => d.NEXT.IsSC())).ToArray(); var endStations = arr.Select(v => v.Device()).ToArray(); endStations = Ltc.Do(endStations, arr => arr.Where(v => v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false).ToArray()); endStations = endStations.Where(v => v.Data.TASKNUM == 0 && !v.Data.PH_STATUS).ToArray(); if (endStations.Length == 0) { return; } var resp = WMS.InBound(barcode, dev.Entity.CODE, true); var target = resp.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.Tunnel().ToString() == v)) .Where(v => v != null).FirstOrDefault(); if (target == null) { Ltc.Log("无可用目的地"); return; } DB.Do(db => { var task = new WCS_TASK { TYPE = TaskType.入库, STATUS = WCS.Entity.TaskStatus.执行中, BARCODE = barcode, TUNNEL = target.Entity.Tunnel(), ADDRFROM = dev.Entity.CODE, WMSTASK = int.Parse(resp.WMSTaskNum), UPDATETIME = DateTime.Now, UPDATEUSER = "WCS", ADDRTO = target.Entity.CODE, FLOOR = 1, }; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.GOODSEND = target.Entity.Code(); dev.Data2.TASKNUM = task.ID; dev.Data2.CONFIRM = true; }); } [Description("组盘扫码")] protected void Execute2(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var bcr = dev.Entity.BCR(); var barcode = bcr.CONTENT.Trim('\r'); if (barcode == "") { throw new Exception("扫码失败"); } var addr = barcode == "" ? 2161 : 2153; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) return; var info = WMS.GetProductInfo(barcode); DB.Do(db => { var task = new WCS_TASK(); task.BARCODE = info.BarCode; task.TYPE = TaskType.组盘; task.STATUS = WCS.Entity.TaskStatus.执行中; task.ADDRFROM = dev.Entity.CODE; task.ADDRTO = addr.ToString(); task.STARTTIME = DateTime.Now; task.PALLETTYPE = info.ChildContainerType; task.UPDATEUSER = "WCS"; task.UPDATETIME = DateTime.Now; task.WORKSHOP = 6;// dev.Entity.WorkShop(); task.FULLQTY = info.LoadCount; task.FLOOR = 2; db.Default.Set().Add(task); db.Default.SaveChanges(); var first = db.Default.Set() .Where(v => v.TYPE == TaskType.组盘 && v.STATUS < WCS.Entity.TaskStatus.已完成) .Where(v => v.WORKSHOP == task.WORKSHOP) .OrderBy(v => v.CREATETIME).FirstOrDefault(); var rs = Device.Find("Robot").ROUTES.Where(v => v.NEXT.WorkShop() == task.WORKSHOP).Select(v => v.NEXT.Device()).FirstOrDefault(); rs.Data.PalletType = first.PALLETTYPE; rs.Data.MaxQty = first.FULLQTY; dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } [Description("人工入库")] protected void Inbound(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; var s2187 = Device.Find("2187").Device(); if (Ltc.Do(s2187, s2187 => s2187.Data.PH_STATUS == true)) return; if (Ltc.Do(s2187, s2187 => s2187.Data.TASKNUM > 0)) return; var taskid = dev.Data.TASKNUM; DB.Do(db => { var task = db.Default.Set().Find(taskid); if (task == null) throw new Exception("任务号" + taskid + "不存在"); if (task.STATUS < WCS.Entity.TaskStatus.已完成) { task.STATUS = WCS.Entity.TaskStatus.取消; } db.Default.SaveChanges(); var res=WMS.PalletInbound(db, task.BARCODE, dev.Entity.CODE); task = new WCS_TASK { TYPE = TaskType.入库, STATUS = WCS.Entity.TaskStatus.执行中, BARCODE = task.BARCODE, ADDRFROM = dev.Entity.CODE, UPDATETIME = DateTime.Now, UPDATEUSER = "WCS", ADDRTO = "2181", FLOOR = 2, WMSTASK = int.Parse(res.WMSTaskNum) }; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.GOODSEND = s2187.Entity.Code(); dev.Data2.TASKNUM = task.ID; dev.Data2.CONFIRM = true; }); } [Description("RGV放货")] protected void RGVPut(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.REQUEST == false)) return; if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) throw new Exception("无任务号"); var taskid = dev.Data.TASKNUM; DB.Do(db => { var task = db.Default.Set().Find(taskid); if (task == null) throw new Exception("任务:" + taskid + "不存在"); if (task.TYPE == TaskType.出库) { if (task.STATUS < WCS.Entity.TaskStatus.出库RGV执行) { task.STATUS = WCS.Entity.TaskStatus.出库RGV执行; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } } if (task.ADDRTO == dev.Entity.CODE && task.TYPE == TaskType.输送) { task.STATUS = WCS.Entity.TaskStatus.已完成; task.UPDATETIME = DateTime.Now; task.ENDTIME = DateTime.Now; db.Default.SaveChanges(); } var next = Ltc.Do(dev, v => v.Entity.GetNext(task.ADDRTO)); if (next == null) dev.Data2.GOODSEND = dev.Entity.Code(); else dev.Data2.GOODSEND = next.Code(); if (dev.Entity.IsRobotStation()) { //var rs = dev.Entity.Device(); //rs.Data.PalletType = task.PALLETTYPE; //rs.Data.MaxQty = task.FULLQTY; } dev.Data2.TASKNUM = taskid; dev.Data2.GOODSSIZE = task.FULLQTY; dev.Data2.GOODSTYPE = task.PALLETTYPE; dev.Data2.CONFIRM = true; }); } [Description("SC放货")] protected void SCPut(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) return; if (Ltc.Do(dev, v => v.Data.REQUEST == false)) return; if (Ltc.Do(dev, v => v.Data.PH_STATUS == false)) return; if (Ltc.Do(dev, v => v.Data.TASKNUM > 0)) return; if (Ltc.Do(dev, v => v.Data2.TASKNUM == 0)) return; var taskid = dev.Data2.TASKNUM; DB.Do(db => { var task = db.Default.Set().Find(taskid); if (task == null) return; if (Ltc.Do(task, task => task.TYPE != TaskType.出库)) return; if (Ltc.Do(task, task => task.STATUS != WCS.Entity.TaskStatus.堆垛机完成)) return; if (Ltc.Do(task, task => task.WMSTASK > 0)) { task.STATUS = WCS.Entity.TaskStatus.已完成; task.UPDATETIME = DateTime.Now; task.ENDTIME = DateTime.Now; db.Default.SaveChanges(); Uploader.Upload(db); } dev.Data2.CONFIRM = true; }); } [Description("外检")] protected void Check(Device dev) { if (dev.Data2.CONFIRM) return; var code = dev.Entity.Code(); if (Ltc.Do(dev, v => v.Data.REQUEST == false && v.Data.GOODSEND != code)) return; var rgv = Device.Find("RGV2"); var arr = rgv.ROUTES.Select(v => v.NEXT).Where(v => v.ROUTES.Any(d => d.NEXT.IsSC())).ToArray(); var endStations = arr.Select(v => v.Device()).ToArray(); endStations = Ltc.Do(endStations, arr => arr.Where(v => v.Data.TASKNUM == 0 && v.Data.PH_STATUS == false).ToArray()); if (endStations.Length == 0) { return; } DB.Do(db => { var task = db.Default.Set().Find(dev.Data.TASKNUM); if (task == null) Ltc.Log("任务号:" + dev.Data.TASKNUM + "不存在"); if (Ltc.Do(task,task=>task.TYPE == TaskType.入库)) { if (Ltc.Do(task, task => task.TUNNEL == 0)) { var res = WMS.GetTunnelList(task.WMSTASK); if (Ltc.Do(res, v => v.ResType == false)) throw new Exception(res.ResMessage); var target = res.TunnelNum.Split(',').Select(v => endStations.FirstOrDefault(d => d.Entity.Tunnel().ToString() == v)) .Where(v => v != null).FirstOrDefault(); if (target == null) return; task.TUNNEL = target.Entity.Tunnel(); task.ADDRTO = target.Entity.CODE; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = target.Entity.Code(); dev.Data2.GOODSSIZE = task.FULLQTY; dev.Data2.GOODSTYPE = task.PALLETTYPE; dev.Data2.CONFIRM = true; } } }); } } }