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), "_22车间入库", true)] public class _22车间入库 : DeviceWork> { 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 bcr = dev.Entity.BCR(); var barcode = bcr.CONTENT.Trim('\r'); if (barcode == "") throw new Exception($"[{dev.Entity.CODE}]扫码失败"); var addr = 3013; var next = dev.Entity.GetNext(addr.ToString()); if (next == null) throw new Exception($"缺少[{dev.Entity.CODE}]-[{addr}]路径信息,请检查路径配置"); var station = dev.Entity.CODE; short outTemp = 0, inTemp = 0; Device[] arr = null; string trafficControl = ""; outTemp = 3001; inTemp = 3006; trafficControl = "3060-3005-3004"; arr = Device.Find("3060", "3005", "3004").Select(v => v.Device()).ToArray(); if (arr.Any(v => v.Data2.CONFIRM)) throw new Exception($"设备集[{trafficControl}]存在确认信号,请检查是否为异常状况"); var nextcode = next.Code(); if (arr.Where(v => v.Data.GOODSEND == outTemp || (v.Entity.CODE == "3060" && v.Data.PH_STATUS && v.Data.GOODSEND == 0)).Any()) nextcode = inTemp; DB.Do(db => { var flag = db.Default.Set().Where(v => v.TaskType == AGVTaskType.入库).Where(v => v.Station == station) .Where(v => (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 t in arr) { t.Status = AGVTaskStatus.完成扫码; t.UpdateTime = DateTime.Now; } db.Default.SaveChanges(); if (db.Default.Set().Any(v => v.STATUS < TaskStatus.已完成 && v.ADDRNEXT == "3060")) nextcode = 3006; var info = WMS.InBound(barcode, dev.Entity.CODE); var task = new WCS_TASK(); task.BARCODE = info.ContainerCode; task.WMSTASK = int.Parse(info.WMSTaskNum); 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.FLOOR = 2; task.HEIGHT = dev.Data.HEIGHT; task.ADDRNEXT = nextcode.ToString(); db.Default.Set().Add(task); db.Default.SaveChanges(); dev.Data2.TASKNUM = task.ID; dev.Data2.GOODSEND = nextcode; dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "3001" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "_22车间入库缓存", true)] public class _22车间入库缓存 : DeviceWork> { 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.PH_STATUS == false)) return; short inTemp = 0, outTemp = 0; short addrTo = 0; Device[] arr = null; outTemp = 3001; inTemp = 3006; addrTo = 3001; arr = Device.Find("3060", "3005", "3004", "3001").Select(v => v.Device()).ToArray(); if (Ltc.Do(dev, v => v.Data.GOODSEND != inTemp)) return; var inTempDev = Device.Find(inTemp.ToString()).Device(); if (inTempDev.Data.TASKNUM < 10000) return; if (!inTempDev.Data.PH_STATUS) return; //if (arr.Any(v => v.Data.TASKNUM > 10000 && v.Data.GOODSEND == 3001 ||v.Data.GOODSEND ==3060)) // return; if (arr.Any(v => v.Data2.CONFIRM)) return; var toDev = Device.Find(addrTo.ToString()).Device(); if (toDev.Data.PH_STATUS) { if (toDev.Data.TASKNUM < 10000) return; if (toDev.Data.GOODSEND != toDev.Entity.Code()) return; } if (arr.Where(v => v.Data.GOODSEND == outTemp || (v.Entity.CODE == "3060" && v.Data.PH_STATUS && v.Data.GOODSEND == 0)).Any()) throw new Exception("交通管制"); var station = dev.Entity.CODE; DB.Do(db => { var taskAny = db.Default.Set().Any(v => v.ADDRNEXT == "3060" && v.STATUS < TaskStatus.已完成); if (taskAny) return; var task = db.Default.Set().Find(dev.Data.TASKNUM); if (task == null) throw new Exception($"任务号{dev.Data.TASKNUM}不存在"); var next = Device.Find(addrTo.ToString()).GetNext(task.ADDRTO); task.ADDRNEXT = next.CODE; task.UPDATETIME = DateTime.Now; db.Default.SaveChanges(); dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = next.Code(); dev.Data2.CONFIRM = true; }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "3006" }.Contains(dev.CODE); } } [WorkTitle(typeof(ProductHandler), "_22车间入库缓存", true)] public class 出库放行 : DeviceWork> { 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.PH_STATUS == false)) return; if (dev.Data.REQUEST == false) return; // 没有准备放货的入库任务 DB.Do(db => { var agvtask = db.Default.Set().Where(v => v.Status <= AGVTaskStatus.完成 && v.Station == "3001" && v.TaskType == AGVTaskType.入库) .Where(v => v.Status != AGVTaskStatus.新建 && v.Status != AGVTaskStatus.执行); if (agvtask.Any()) return; var inTemp = Device.Find("3001", "3004").Select(v => v.Device()); if (inTemp.Any(v => v.Data.PH_STATUS == true || v.Data.TASKNUM > 0 || v.Data2.Status.HasFlag(StationStatus.运行状态位))) return; var task = db.Default.Set().FirstOrDefault(v => v.ID == dev.Data.TASKNUM); task.ADDRNEXT = "3001"; dev.Data2.TASKNUM = dev.Data.TASKNUM; dev.Data2.GOODSEND = 3001; dev.Data2.CONFIRM = true; db.Default.SaveChanges(); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return new string[] { "3060" }.Contains(dev.CODE); } } }