using Newtonsoft.Json; using ServiceCenter.Logs; using ServiceCenter.SqlSugars; using SqlSugar; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.Entity.Protocol.BCR; using WCS.Entity.Protocol.SRM; using WCS.Entity.Protocol.Station; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.WebApi.Models.WCS.Request; //using WCS.WorkEngineering.WebApi.Controllers; //using WCS.WorkEngineering.WebApi.Models.WMS.Request; using WCS.WorkEngineering.Worlds; using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags; namespace WCS.WorkEngineering.Systems { [BelongTo(typeof(MainWorld))] [Description("堆垛机")] public class 堆垛机 : DeviceSystem { protected override bool ParallelDo => true; public 堆垛机() { } public override void Do(SRM obj) { obj.Data.HB = (short)(obj.Data.HB == 0 ? 1 : 0); if (obj.Data.VoucherNo != obj.Data2.VoucherNo) return; if (obj.Data2.Alarm != 0) { MainWorld.Redis.Set($"Sx:WCSInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}" + obj.Data3.Alarm.Description() + obj.Data3.Alarm1.Description(), Time = DateTime.Now })); return; } if (obj.Data2.Mode != SrmMode.自动) return; if (obj.Data.OkAck1 == 1) { if (obj.Data2.FinishedTaskID1 == 0) obj.Data.OkAck1 = 0; return; } if (obj.Data.OkAck2 == 1) { if (obj.Data2.FinishedTaskID2 == 0) obj.Data.OkAck2 = 0; return; } if(obj.Data.CancelAck1 == 1) { if (obj.Data2.Cancel1 == 0) obj.Data.CancelAck1 = 0; return; } if (obj.Data.CancelAck2 == 1) { if (obj.Data2.Cancel2 == 0) obj.Data.CancelAck2 = 0; return; } //同时完成的情况一起处理 if (obj.Data2.FinishedTaskID1 != 0 && obj.Data2.FinishedTaskID2 != 0) { if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID1}有误", Time = DateTime.Now })); throw new Exception($"完成任务号{obj.Data2.FinishedTaskID1}有误"); } if (obj.Data2.FinishedTaskID2 != obj.Data.TaskID2) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID2}有误", Time = DateTime.Now })); throw new Exception($"完成任务号{obj.Data2.FinishedTaskID2}有误"); } World.Log("开始处理堆垛机完成任务1和2"); WMS.堆垛机完成(obj.Data2.FinishedTaskID1); WMS.堆垛机完成(obj.Data2.FinishedTaskID2); SqlSugarHelper.Do(db => { obj.FinishTask(db, obj.Data2.FinishedTaskID1, obj.Entity.Code); obj.Data.OkAck1 = 1; obj.FinishTask(db, obj.Data2.FinishedTaskID2, obj.Entity.Code); obj.Data.OkAck2 = 1; World.Log("结束堆垛机完成任务1和2"); }); return; } if (obj.Data2.FinishedTaskID1 != 0) { if (obj.Data2.FinishedTaskID1 != obj.Data.TaskID1) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID1}有误", Time = DateTime.Now })); throw new Exception($"完成任务号{obj.Data2.FinishedTaskID1}有误"); } World.Log("开始处理堆垛机完成任务1"); WMS.堆垛机完成(obj.Data2.FinishedTaskID1); SqlSugarHelper.Do(db => { obj.FinishTask(db, obj.Data2.FinishedTaskID1, obj.Entity.Code); obj.Data.OkAck1 = 1; World.Log("结束堆垛机完成任务1"); }); return; } if (obj.Data2.FinishedTaskID2 != 0) { if (obj.Data2.FinishedTaskID2 != obj.Data.TaskID2) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}完成任务号{obj.Data2.FinishedTaskID2}有误", Time = DateTime.Now })); throw new Exception($"完成任务号{obj.Data2.FinishedTaskID2}有误"); } World.Log("开始处理堆垛机完成任务2"); WMS.堆垛机完成(obj.Data2.FinishedTaskID2); SqlSugarHelper.Do(db => { obj.FinishTask(db, obj.Data2.FinishedTaskID2, obj.Entity.Code); obj.Data.OkAck2 = 1; World.Log("结束堆垛机完成任务2"); }); return; } if (obj.Data2.Cancel1 == 1) { //取消任务 SqlSugarHelper.Do(db => { var task = db.Default.Queryable().Where(v => v.ID == obj.Data2.TaskID1).First(); if (task == null) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}取消任务时,任务号有误{obj.Data2.TaskID1}", Time = DateTime.Now })); throw new Exception("取消任务时,任务号有误"); } if (task != null) { if (task.Type == TaskType.EnterDepot) { task.Status = Entity.TaskStatus.巷道分配; task.EditTime = DateTime.Now; task.ManualRemarks = "堆垛机取消任务"; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务"); } else if (task.Type == TaskType.OutDepot || task.Type == TaskType.TransferDepot) { task.Status = Entity.TaskStatus.NewBuild; task.EditTime = DateTime.Now; task.ManualRemarks = "堆垛机取消任务"; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务"); } else { throw new Exception($"取消任务功能不支持任务类型{task.Type}"); } } obj.Data.CancelAck1 = 1; }); } if (obj.Data2.Cancel2 == 1) { //取消任务 SqlSugarHelper.Do(db => { var task = db.Default.Queryable().Where(v => v.ID == obj.Data2.TaskID2).First(); if (task == null) { MainWorld.Redis.Set($"Sx:WCSErrorInfo:{obj.Entity.Code}", JsonConvert.SerializeObject(new RedisError() { Equip = obj.Entity.Code, Con = $"{obj.Entity.Code}取消任务时,任务号有误{obj.Data2.TaskID2}", Time = DateTime.Now })); throw new Exception("取消任务时,任务号有误"); } if (task.Type == TaskType.EnterDepot) { task.Status = Entity.TaskStatus.巷道分配; task.EditTime = DateTime.Now; task.ManualRemarks = "堆垛机取消任务"; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务"); } else if (task.Type == TaskType.OutDepot || task.Type == TaskType.TransferDepot) { task.Status = Entity.TaskStatus.NewBuild; task.EditTime = DateTime.Now; task.ManualRemarks = "堆垛机取消任务"; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, "堆垛机取消任务"); } else { throw new Exception($"取消任务功能不支持任务类型{task.Type}"); } obj.Data.CancelAck2 = 1; }); } if (obj.Data2.Status != SrmRunStatus.空闲) return; obj.Do(); } public override bool Select(Device dev) { return "1,2,3".Split(',').Contains(dev.GetFlag("Floor")); } } }