using ServiceCenter.Logs; using ServiceCenter.Redis; using ServiceCenter.SqlSugars; using System.ComponentModel; using WCS.Core; using WCS.Entity; using WCS.WorkEngineering.Extensions; using WCS.WorkEngineering.Protocol.Station; using WCS.WorkEngineering.WebApi.Controllers; using WCS.WorkEngineering.WebApi.Models.AGV.Response; 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; protected override bool SaveLogsToFile => true; public override void Do(Station obj) { var key = $"WCS:Lock:{obj.Entity.Code}"; try { if (RedisHub.Default.Get(key) != null) { throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High); } RedisHub.Default.Set(key, obj.Entity.Code); //有任务需要执行 if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data3.Status.HasFlag(StationStatus.OT_Status)) { SqlSugarHelper.Do(db => { //当前站台是否有任务在执行 var task = db.Default.Queryable().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid); var agv = db.Default.Queryable().SplitTable(v => v.Take(2)).First(v => v.ID == task.AgvTaskID && v.Status == AGVTaskStatus.NewBuild) ?? throw new KnownException("未找到对应的AGV任务", LogLevelEnum.Mid); string endPos = ""; if (task.AddrTo == "1021" || task.AddrTo == "1022" || task.AddrTo == "1023" || task.AddrTo == "1024") { endPos = "PT" + task.AddrTo; } else { endPos = task.AddrTo; } GenAgvSchedulingTaskResponse res = null; if (endPos.Contains("A") || endPos.Contains("B") || endPos.Contains("C") || endPos.Contains("D")) { res = AgvApi.搬运_wmsStart("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1"); } else { res = AgvApi.叫料出库("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1"); } agv.Status = AGVTaskStatus.Confirm; agv.AgvID = res.data; db.Default.Updateable(agv).SplitTable().ExecuteCommand(); //更新WCS数据 task.Status = Entity.TaskStatus.AGVExecution; db.Default.Updateable(task).ExecuteCommand(); task.AddWCS_TASK_DTL(db, task.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}"); }); } } finally { RedisHub.Default.Del(key); } } public override bool Select(Device dev) { return dev.HasFlag(DeviceFlags.一楼出库口); } } }