using DBHelper; using System; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; namespace WCS.Service.Works.Stations { [WorkTitle(typeof(ProductHandler), "拆子盘位", true)] internal class 拆子盘位 : DeviceWork> { private Device Rgv; public 拆子盘位() { Rgv = Device.Find("RGV3").Device(); } protected override bool SelectDevice(WCS_DEVICE obj) { return obj.Is(DF.拆盘) && obj.PalletType() != 4 && obj.CODE != "2198"; } protected override void Do(Device dev) { if (!dev.Data3.Status.HasFlag(StationStatus.自动)) return; if (Ltc.Do(dev, v => v.Data2.RES == true)) { return; } if (Ltc.Do(dev, v => v.Data.RES == true))//拆盘位RGV放货 { DB.Do(db => { var taskid = dev.Data.TASKNUM; var task = db.Default.Set().Find(taskid); if (task != null) { if (task.STATUS < WCS.Entity.TaskStatus.已完成) { task.STATUS = WCS.Entity.TaskStatus.已完成; task.ENDTIME = DateTime.Now; //task.ADDRCURRENT = dev.Entity.CODE; db.Default.SaveChanges(); } } dev.Data2.RES = true; }); return; } if (Ltc.Do(dev, v => v.Data.PH_STATUS == false && v.Data.PH_STATUS2 == false && v.Data.REQUEST == false && v.Data.TASKNUM == 0)) {//需要呼叫空托盘 Ltc.Log("待呼叫托盘"); if (Ltc.Do(Rgv, Rgv => Rgv.Data.WorkMode != RGVMode.自动)) return; //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(5000,"拆盘"))) // return; var palletType = dev.Entity.PalletType(); if (palletType == 0) throw new Exception("托盘类型有误"); var ret = DB.Do(db => { var task = db.Default.Set().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库) .Where(v => v.ADDRTO == dev.Entity.CODE) .FirstOrDefault(); if (task != null) return true; return false; }); if (ret) return; var res = WMS.GetPalletOutTask(palletType, dev.Entity.CODE); DB.Do(db => { //var task = db.Default.Set().Where(v => v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.出库) //.Where(v => v.ADDRTO == dev.Entity.CODE) //.FirstOrDefault(); //if (task != null) // return; var sc = Device.Find(res.TunnelNum).ROUTES.Where(v => v.NEXT.IsSC()).Select(v => v.NEXT).FirstOrDefault(); var loc = string.Format("{0}-{1}-{2}", res.Row, res.Colomn, res.Layer); var task = new WCS_TASK { TYPE = TaskType.出库, STATUS = WCS.Entity.TaskStatus.新建, ADDRFROM = loc, ADDRTO = dev.Entity.CODE, BARCODE = res.ContainerBarCode, TUNNEL = res.TunnelNum, PALLETTYPE = palletType, WMSTASK = int.Parse(res.WMSTaskNum), FLOOR = 2, UPDATEUSER = "WCS", SCSTATION = res.Memo1, DEVICE = sc.CODE, //ADDRCURRENT = loc, ADDRNEXT = dev.Entity.CODE }; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.GOODSCODE = task.ID;//锁定 }); } else { Ltc.Log("已有托盘"); if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.REQUEST == true)) { Ltc.Log("拆盘就绪"); var arr = Device.Where(v => v.Is(DF.组盘)).Select(v => v.Device()).ToArray(); arr = Ltc.Do(arr, arr => arr.Where(v => v.Data.PH_STATUS == false && v.Data.TASKNUM == 0).ToArray()); if (arr.Length == 0) return; var palletType = dev.Entity.PalletType(); var target = Ltc.Do(arr, arr => arr.Where(v => v.Data3.PalletType == palletType).FirstOrDefault()); if (target == null) return; if (Ltc.Do(target, target => target.Data3.DocId == 0)) return; if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; var addrto = target.Entity.CODE; DB.Do(db => { var hastask = db.Default.Set().Where(v => v.ADDRTO == addrto && v.STATUS < WCS.Entity.TaskStatus.已完成 && v.TYPE == TaskType.输送).Any(); if (Ltc.Do(() => hastask == true)) return; var task = db.Default.Set().Find(dev.Data.TASKNUM); task = new WCS_TASK { TYPE = TaskType.输送, STATUS = WCS.Entity.TaskStatus.执行中, BARCODE = task.BARCODE, FLOOR = 2, PALLETTYPE = (short)palletType, FULLQTY = target.Data3.MaxQty, ADDRFROM = dev.Entity.CODE, ADDRTO = target.Entity.CODE, UPDATETIME = DateTime.Now, UPDATEUSER = "WCS", DOCID = target.Data3.DocId, //ADDRCURRENT = dev.Entity.CODE }; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = target.Entity.Code(); dev.Data2.CONFIRM = true; }); } } } } }