using DBHelper; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol; using WCS.Service.Extensions; using WCS.Service.Helpers; using WCS.Service.Log; namespace WCS.Service.Works.Station { [WorkTitle(typeof(ProductHandler), "一楼出库堆垛机放货完成后分配下一个地址")] public class 一楼出库 : Work { protected override void Do(StationDeviceGroup obj) { var timer = new Stopwatch(); timer.Start(); obj.EX(stationDeviceGroup => { if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中"); if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致"); //成功处理的任务 var finishTaskList = new List>(); DB.Do(db => { var devise = new List>(); foreach (var dev in stationDeviceGroup.Items) { //没有请求 if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址) { InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-堆垛机放货完成请求--4"); continue; } //没有光电 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } devise.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } if (!devise.Any()) return; foreach (var dev in devise) { var task = db.Default.Set().FirstOrDefault(v => v.TYPE == TaskType.出库 && v.SRMSTATION == dev.FinishCode && v.STATUS == TaskStatus.堆垛机完成) ?? throw new WarnException("无任务"); var tasks = db.Default.Set().Where(v => v.TaskGroupKey == task.TaskGroupKey); if (tasks.Count() != devise.Count) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}"); if (tasks.Any(v => v.STATUS != TaskStatus.堆垛机完成 && v.STATUS != TaskStatus.执行中)) throw new WarnException("任务异常,同组任务状态不为堆垛机完成或执行中"); task.STATUS = TaskStatus.执行中; task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{stationDeviceGroup.Entity.CODE}", GetType()); finishTaskList.Add(new FinishTaskList(task.ID, dev.Station)); } db.Default.SaveChanges(); }); DB.Do(db => { foreach (var finish in finishTaskList) { var task = db.Default.Set().FirstOrDefault(v => v.ID == finish.FinishCode); if (task == null) continue; finish.Station.Data.Tasknum = task.ID; finish.Station.Data.Goodsstart = finish.Station.Entity.CODE.ToShort(); finish.Station.Data.Goodsend = task.ADDRNEXT.ToShort(); finish.Station.Data.Goodsnum = finishTaskList.Count.ToShort(); finish.Station.Data.CmdType = IstationCmdType.堆垛机放货完成请求目标地址; finish.Station.Data.VoucherNo++; } if (!finishTaskList.Any()) return; timer.Stop(); InfoLog.INFO_TIMING($"{stationDeviceGroup.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}"); }); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return _devCodes.Contains(dev.CODE); } //月台堆垛机放货设备组 private readonly List _devCodes = new() { "G1473", "G1474", "G1493", "G1491", "G1520", "G1522", "G1545", "G1451" }; } [WorkTitle(typeof(ProductHandler), "月台出货口完成任务")] public class 月台完成任务 : Work { protected override void Do(StationDeviceGroup obj) { var timer = new Stopwatch(); timer.Start(); obj.EX(stationDeviceGroup => { //当前组有一个运行的设备就停止执行 if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中"); if (stationDeviceGroup.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电"); //此处逻辑为货物离开后报完成 //成功处理的任务 var finishTaskList = new List>(); DB.Do(db => { var devise = new List>(); foreach (var dev in stationDeviceGroup.Items) { if (dev.Data2.Request != IstationRequest.月台出库口任务完成) { InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-月台出库口任务完成--3"); continue; } if (dev.Data2.Tasknum < 10000) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; }; devise.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } foreach (var dev in devise) { var task = db.Default.Set().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum); if (task?.STATUS == TaskStatus.新建) throw new WarnException($"{task.ID}任务状态错误"); task!.STATUS = TaskStatus.已完成; task.ENDTIME = System.DateTime.Now; task.UPDATEUSER = "WCS"; task.CreateStatusLog(db, $"状态由[{TaskStatus.执行中}]变更为[{task.STATUS}]-{dev.FinishCode}", this.GetType()); finishTaskList.Add(new FinishTaskList(task.ID, dev.Station)); } db.Default.SaveChanges(); }); DB.Do(db => { foreach (var finish in from finish in finishTaskList let task = db.Default.Set().FirstOrDefault(v => v.ID == finish.FinishCode) select finish) { finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成; finish.Station.Data.VoucherNo++; } if (!finishTaskList.Any()) return; timer.Stop(); InfoLog.INFO_TIMING($"{stationDeviceGroup.Entity.CODE}--处理请求到反馈完成信号耗时{timer.ElapsedMilliseconds}"); }); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return _devCodes.Contains(dev.CODE); } private readonly List _devCodes = new() { "G1469", "G1561", "G1538", "G1574", "G1509" }; } [WorkTitle(typeof(ProductHandler), "转圈交互点分配目标地址")] public class 转圈交互点分配目标地址 : Work { protected override void Do(StationDeviceGroup obj) { obj.EX(stationDeviceGroup => { if (stationDeviceGroup.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中"); if (stationDeviceGroup.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致"); DB.Do(db => { var devise = new List>(); foreach (var dev in stationDeviceGroup.Items) { //没有请求 if (dev.Data2.Request != IstationRequest.请求分配目标地址) { InfoLog.INFO_INFO($"{stationDeviceGroup.Entity.CODE}无请求-分配目标地址--2"); continue; } //没有光电 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; }; if (dev.Data2.Tasknum < 10000) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", stationDeviceGroup.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } devise.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } foreach (var dev in devise) { var task = db.Default.Set().FirstOrDefault(v => v.ID == dev.Station.Data2.Tasknum) ?? throw new WarnException("无任务"); var tasks = db.Default.Set().Where(v => v.TaskGroupKey == task.TaskGroupKey); if (devise.Count != tasks.Count()) throw new WarnException($"可执行任务数{devise.Count},实际任务数{tasks.Count()}"); dev.Station.Data.Tasknum = task.ID; dev.Station.Data.Goodsstart = dev.Station.Entity.CODE.ToShort(); dev.Station.Data.Goodsend = task.ADDRNEXT.ToShort(); dev.Station.Data.Goodsnum = devise.Count.ToShort(); dev.Station.Data.CmdType = IstationCmdType.分配目标地址; dev.Station.Data.VoucherNo++; } }); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return dev.CODE == "G1589"; } } }