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(obj => { if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中"); if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致"); //成功处理的任务 var finishTaskList = new List>(); DB.Do(db => { var devs = new List>(); foreach (var dev in obj.Items) { //没有请求 if (dev.Data2.Request != IstationRequest.堆垛机放货完成请求目标地址) { InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-堆垛机放货完成请求--4"); continue; } //没有光电 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } devs.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } if (!devs.Any()) return; foreach (var dev in devs) { 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() != devs.Count) throw new WarnException($"可执行任务数{devs.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}]-{obj.Entity.Code}", this.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()) { timer.Stop(); InfoLog.INFO_TIMING($"{obj.Entity.CODE}--分配目标地址,耗时{timer.ElapsedMilliseconds}"); } }); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return devCodes.Contains(dev.CODE); } //月台堆垛机放货设备组 private List devCodes = new List() { "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(obj => { //当前组有一个运行的设备就停止执行 if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("设备运行中"); if (obj.Items.Any(v => v.Data2.Status.HasFlag(IstationStatus.光电状态))) throw new DoException("设备停止运行,但有光电"); //此处逻辑为货物离开后报完成 //成功处理的任务 var finishTaskList = new List>(); DB.Do(db => { var devs = new List>(); foreach (var dev in obj.Items) { if (dev.Data2.Request != IstationRequest.月台出库口任务完成) { InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-月台出库口任务完成--3"); continue; } if (dev.Data2.Tasknum < 10000) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; }; devs.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } foreach (var dev in devs) { var task = db.Default.Set().Where(v => v.ID == dev.Station.Data2.Tasknum).FirstOrDefault(); 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 finishTaskList) { var task = db.Default.Set().FirstOrDefault(v => v.ID == finish.FinishCode); finish.Station.Data.CmdType = IstationCmdType.月台出库口任务完成; finish.Station.Data.VoucherNo++; } }); timer.Stop(); InfoLog.INFO_TIMING($"{obj.Entity.CODE}--处理请求到反馈完成信号耗时{timer.ElapsedMilliseconds}"); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return devCodes.Contains(dev.CODE); } private List devCodes = new List() { "G1469", "G1561", "G1538", "G1574", "G1509" }; } [WorkTitle(typeof(ProductHandler), "转圈交互点分配目标地址")] public class 转圈交互点分配目标地址 : Work { protected override void Do(StationDeviceGroup obj) { obj.EX(obj => { if (obj.Items.Any(v => v.Data3.Status.HasFlag(StationStatus.运行状态位))) throw new DoException("运行中"); if (obj.Items.Any(v => v.Data.VoucherNo != v.Data2.VoucherNo)) throw new WarnException($"等待任务执行--凭证号不一致"); DB.Do(db => { var devs = new List>(); foreach (var dev in obj.Items) { //没有请求 if (dev.Data2.Request != IstationRequest.请求分配目标地址) { InfoLog.INFO_INFO($"{obj.Entity.CODE}无请求-分配目标地址--2"); continue; } //没有光电 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态)) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求无光电", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; }; if (dev.Data2.Tasknum < 10000) { InfoLog.INFO_WarnDb($"{dev.Entity.CODE}有请求有光电无任务", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常); continue; } devs.Add(new FinishTaskList(dev.Entity.CODE, dev.Entity.Create())); } foreach (var dev in devs) { 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 (devs.Count != tasks.Count()) throw new WarnException($"可执行任务数{devs.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 = devs.Count.ToShort(); dev.Station.Data.CmdType = IstationCmdType.分配目标地址; dev.Station.Data.VoucherNo++; } }); }); } protected override bool SelectDevice(WCS_DEVICE dev) { return dev.CODE == "G1589"; } } }