using DBHelper; using System; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Service.Helpers; namespace WCS.Service.Works.Stations { //[WorkTitle(typeof(ProductHandler), "车间扫码",true)] internal class 车间扫码 : DeviceWork> { protected override bool SelectDevice(WCS_DEVICE dev) { return false;// dev.CODE=="2122"; } protected override void Do(Device dev) { ScannIn(dev); } private void ScannIn(Device dev) { Ltc.Log("扫码入库"); 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; //if (Ltc.Do(dev, v => !v.Entity.WakeupOn(10000, "车间扫码"))) // return; var workShop = dev.Entity.WorkShop(); var info = WMS.GetProductInfo(barcode, dev.Entity.CODE); if (workShop > 0 && workShop < 4) { addr = info.IsLeft == 1 ? 2161 : 2153; } var station = dev.Entity.CODE; var height = (short)(info.Height > 1.4m ? 2 : 1); DB.Do(db => { var arr = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status == AGVTaskStatus.完成) .Where(v => v.Station == station).ToArray(); foreach (var t in arr) { t.Status = AGVTaskStatus.完成扫码; t.UpdateTime = DateTime.Now; } db.Default.SaveChanges(); var task = new WCS_TASK(); task.BARCODE = info.BarCode; task.TYPE = TaskType.组盘; task.STATUS = info.IsLeft == 1 ? WCS.Entity.TaskStatus.已完成 : 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.PRODLINE = info.ProLine; task.FULLQTY = info.LoadCount; task.FLOOR = 2; task.HEIGHT = height; task.DOCID = info.DocId; //task.ADDRCURRENT = dev.Entity.CODE; task.ADDRNEXT = next.CODE; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } } [WorkTitle(typeof(ProductHandler), "原膜自动扫码", true)] internal class 原膜自动扫码 : DeviceWork> { protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2088" }.Contains(dev.CODE); } protected override void Do(Device dev) { if (!SystemConfigHelpers.GetDeviceConfig(dev.Entity.CODE)) throw new Exception($"已禁止[{dev.Entity.CODE}]入库,请联系机修确认"); Ltc.Log("扫码入库"); if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) throw new Exception($"设备[{dev.Entity.CODE}]确认信号未清除,请检查PLC中上一个任务是否完成状态异常"); 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 = 2017; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置"); var workShop = dev.Entity.WorkShop(); var info = WMS.InBound(barcode, dev.Entity.CODE); var station = dev.Entity.CODE; DB.Do(db => { var rgv = Device.Find("RGV5").Device(); if (rgv.Data2.Trigger == 1) throw new Exception($"等待WCS与RGV5交互完成,[{dev.Entity.CODE}]"); var outqty = (rgv.Data.DestPosition == 2081 && rgv.Data.SystemStatus != RGVRunStatus.空闲) ? 1 : 0; outqty += Device.Where(v => "2325,2081,2083".Split(',').Contains(v.CODE)).Select(v => v.Device()) .Where(v => v.Data.GOODSEND == 2086 || (v.Data2.GOODSEND == 2086 && v.Data2.CONFIRM)) .Count(); if (outqty > 0) throw new Exception($"交通管制,正在执行出库,[{dev.Entity.CODE}]"); var flag = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库).Where(v => v.Station == station) .Where(v => (v.Status == AGVTaskStatus.取放完成 && v.AGVStatus == AGVTaskStatus.请求_允许2) || v.Status == AGVTaskStatus.完成).Any(); if (!flag && !dev.Data.RES1) throw new Exception($"[{dev.Entity.CODE}]已扫码等待AGV交互完成"); var arr = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库 && v.Status == AGVTaskStatus.完成) .Where(v => v.Station == station).ToArray(); foreach (var t1 in arr) { t1.Status = AGVTaskStatus.完成扫码; t1.UpdateTime = DateTime.Now; } db.Default.SaveChanges(); var task = new WCS_TASK(); task.BARCODE = info.ContainerCode; task.TYPE = TaskType.入库; task.STATUS = WCS.Entity.TaskStatus.执行中; task.ADDRFROM = dev.Entity.CODE; task.ADDRTO = addr.ToString(); task.STARTTIME = DateTime.Now; task.UPDATEUSER = "WCS"; task.UPDATETIME = DateTime.Now; task.WMSTASK = int.Parse(info.WMSTaskNum); task.ADDRNEXT = next.CODE; db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } } [WorkTitle(typeof(ProductHandler), "原膜人工扫码", true)] internal class 原膜人工扫码 : DeviceWork> { protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2008", "2012", "2305" }.Contains(dev.CODE); } protected override void Do(Device dev) { if (!SystemConfigHelpers.GetDeviceConfig(dev.Entity.CODE)) throw new Exception($"已禁止[{dev.Entity.CODE}]入库,请联系机修确认"); if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) throw new Exception($"设备[{dev.Entity.CODE}]确认信号未清除,请检查PLC中上一个任务是否完成状态异常"); if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var addr = 2017; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置"); var workShop = dev.Entity.WorkShop(); //var info = WMS.GetProductInfo(barcode); DB.Do(db => { var task = db.Default.Set().Where(v => v.ADDRFROM == dev.Entity.CODE && v.STATUS == WCS.Entity.TaskStatus.新建 && v.TYPE == TaskType.入库).FirstOrDefault(); if (task == null) throw new Exception($"设备[{dev.Entity.CODE}]上产品无任务信息"); task.STATUS = WCS.Entity.TaskStatus.执行中; task.ADDRTO = addr.ToString(); task.STARTTIME = DateTime.Now; //task.ADDRCURRENT = dev.Entity.CODE; task.UPDATETIME = DateTime.Now; task.UPDATEUSER = "WCS"; task.ADDRNEXT = next.CODE; db.Default.SaveChanges(); if (dev.Entity.CODE == "2305") WMS.GetWeight(task.WMSTASK, dev.Data.GOODSCODE / 10, dev.Entity.CODE); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } } [WorkTitle(typeof(ProductHandler), "直径检测", true)] internal class 直径检测 : DeviceWork> { protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "2083", "2014", "2010", "2003" }.Contains(dev.CODE); } protected override void Do(Device dev) { if (Ltc.Do(dev, v => v.Data2.CONFIRM == true)) { return; } if (Ltc.Do(dev, v => v.Data.TASKNUM == 0)) return; if (Ltc.Do(dev, v => !v.Data.REQUEST)) return; var taskid = dev.Data.TASKNUM; var addr = 2017; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) return; var workShop = dev.Entity.WorkShop(); //var info = WMS.GetProductInfo(barcode); DB.Do(db => { var task = db.Default.Set().Find(taskid); if (task == null) { throw new Exception("未创建入库任务"); } WMS.UpdateTask(task.WMSTASK, (int)task.STATUS, task.ADDRNEXT, dev.Data.HEIGHT); var end = dev.Data.GOODSEND; if (dev.Data.HEIGHT == 4 || dev.Data.HEIGHT == 8) { if (dev.Entity.CODE == "2083") end = 2086; else if (dev.Entity.CODE == "2003") end = 2308; else end = short.Parse(task.ADDRFROM); task.STATUS = WCS.Entity.TaskStatus.已取消; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); } dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = end; dev.Data2.CONFIRM = true; }); } } }