123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- 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<Device<IStation521, IStation520>>
- {
- protected override void Do(Device<IStation521, IStation520> 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<IStation521, IStation520>[] arr = null;
- string trafficControl = "";
- outTemp = 3001;
- inTemp = 3006;
- trafficControl = "3060-3005-3004";
- arr = Device.Find("3060", "3005", "3004").Select(v => v.Device<IStation521, IStation520>()).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<WCS_AGVTask>().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<WCS_AGVTask>().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<WCS_TASK>().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<WCS_TASK>().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<Device<IStation521, IStation520>>
- {
- protected override void Do(Device<IStation521, IStation520> 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<IStation521, IStation520>[] arr = null;
- outTemp = 3001;
- inTemp = 3006;
- addrTo = 3001;
- arr = Device.Find("3060", "3005", "3004", "3001").Select(v => v.Device<IStation521, IStation520>()).ToArray();
- if (Ltc.Do(dev, v => v.Data.GOODSEND != inTemp)) return;
- var inTempDev = Device.Find(inTemp.ToString()).Device<IStation521>();
- 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<IStation521>();
- 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<WCS_TASK>().Any(v => v.ADDRNEXT == "3060" && v.STATUS < TaskStatus.已完成);
- if (taskAny) return;
- var task = db.Default.Set<WCS_TASK>().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<Device<IStation521, IStation520>>
- {
- protected override void Do(Device<IStation521, IStation520> 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<WCS_AGVTask>().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<IStation521, IStation523>());
- if (inTemp.Any(v => v.Data.PH_STATUS == true || v.Data.TASKNUM > 0
- || v.Data2.Status.HasFlag(StationStatus.运行状态位))) return;
- var task = db.Default.Set<WCS_TASK>().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);
- }
- }
- }
|