gkj 2 ani în urmă
părinte
comite
578d55de57

+ 16 - 8
ServiceCenter/Attributes/LogAttribute .cs

@@ -35,19 +35,27 @@ namespace ServiceCenter.Attributes
             string url = context.HttpContext.Request.Host + context.HttpContext.Request.Path + context.HttpContext.Request.QueryString;
             string method = context.HttpContext.Request.Method;
             string qs = ActionArguments;
-            dynamic result = context.Result.GetType().Name == "EmptyResult" ? new { Value = "无返回结果" } : context.Result as dynamic;
             string res = "在返回结果前发生了异常";
-            try
+            if (context.Result == null)
             {
-                if (result != null)
-                {
-                    res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value);
-                }
+                res = "无返回结果";
             }
-            catch (Exception)
+            else
             {
-                res = "日志未获取到结果,返回的数据无法序列化";
+                dynamic result = context.Result.GetType().Name == "EmptyResult" ? new { Value = "无返回结果" } : context.Result as dynamic;
+                try
+                {
+                    if (result != null)
+                    {
+                        res = Newtonsoft.Json.JsonConvert.SerializeObject(result.Value);
+                    }
+                }
+                catch (Exception)
+                {
+                    res = "日志未获取到结果,返回的数据无法序列化";
+                }
             }
+
             var msg = $"方法:{LogFlag}-地址:{url}-方式:{method}-耗时:{Stopwatch.Elapsed.TotalMilliseconds}毫秒(指控制器内对应方法执行完毕的时间)\n" +
                       $"参数:{qs}\n " +
                       $"结果:{res}";

+ 1 - 2
ServiceCenter/Logs/LogHub.cs

@@ -95,11 +95,10 @@ namespace ServiceCenter.Logs
         {
             while (true)
             {
-                var logHub = RedisHub.Default.BLPop("LogHub", 0);
                 LogModel log = new LogModel();
-
                 try
                 {
+                    var logHub = RedisHub.Default.BLPop("LogHub", 0);
                     log = JsonConvert.DeserializeObject<LogModel>(logHub);
                     if (log != null)
                     {

+ 195 - 227
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -1,4 +1,5 @@
-using ServiceCenter.Extensions;
+using PlcSiemens.Core.Extension;
+using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
@@ -37,267 +38,234 @@ namespace WCS.WorkEngineering.Systems
         {
             if (obj.Entity.HasFlag(DeviceFlags.出库))
             {
-                List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
+
+                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
+                //获取所有未结束的叫料及背负式补空AGV任务
                 SqlSugarHelper.Do(db =>
                 {
-                    //获取所有未结束的叫料及背负式补空AGV任务
-                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling))
+
+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling))
                                                                          .Where(v => v.Status < AGVTaskStatus.MissionCompleted)
-                                                                         .SplitTable(tabs => tabs.Take(2)).ToList();
-                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaks.Select(v => v.ID).ToList());
-                    foreach (var agv in agvTaks)
+                                                                         .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
+                });
+                //有需要处理的AGV任务
+                if (agvTaskInfos.Any())
+                {
+                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
+                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
+
+                    foreach (var agv in agvTaskInfos)
                     {
-                        //取货点安全交互
-                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                        try
                         {
-                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                            agv.Status = AGVTaskStatus.Complete2;
-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                            taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
-                            AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                            this.ExRecord(obj.Entity.Code, $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
-                        }
-                        //完成任务
-                        else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
-                        {
-                            if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
+                            SqlSugarHelper.Do(db =>
                             {
-                                try
+                                //取货点安全交互
+                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
                                 {
                                     var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                    if (taskInfo == null)
-                                    {
-                                        World.Log($"未找到AGV任务{agv.ID}对应WCS任务");
-                                        continue;
-                                    }
-                                    //更新AGV任务状态
-                                    agv.Status = AGVTaskStatus.MissionCompleted;
+                                    agv.Status = AGVTaskStatus.Complete2;
                                     db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                    //更新WCS任务状态
-                                    taskInfo.Status = Entity.TaskStatus.Finish;
-                                    taskInfo.EedTime = DateTime.Now;
-                                    db.Default.Updateable(taskInfo).ExecuteCommand();
-                                    taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
-                                    taskInfo.CompleteOrCancelTasks(db);
-                                    this.ExRecord(obj.Entity.Code, $"完成AGV任务{agv.ID}");
-                                    taskInfos.Add(taskInfo);
+                                    taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
+                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
                                 }
-                                catch (Exception ex)
+                                //完成任务
+                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
                                 {
-                                    World.Log(ex.Message);
-                                    continue;
+                                    if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
+                                    {
+                                        var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
+                                        if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
+                                        //更新AGV任务状态
+                                        agv.Status = AGVTaskStatus.MissionCompleted;
+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                        //更新WCS任务状态
+                                        taskInfo.Status = Entity.TaskStatus.Finish;
+                                        taskInfo.EedTime = DateTime.Now;
+                                        db.Default.Updateable(taskInfo).ExecuteCommand();
+                                        taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
+                                        taskInfo.CompleteOrCancelTasks(db);
+                                        taskInfos.Add(taskInfo);
+                                    }
+                                    else
+                                    {
+                                        agv.Status = AGVTaskStatus.MissionCompleted;
+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                    }
                                 }
-                            }
-                            else
-                            {
-                                agv.Status = AGVTaskStatus.MissionCompleted;
-                                db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                this.ExRecord(obj.Entity.Code, $"完成AGV任务{agv.ID}");
-                            }
+                            });
                         }
-                        else if (agv.AgvStatus == AGVTaskStatus.Cancel && agv.Status != AGVTaskStatus.Cancel)
+                        catch (Exception ex)
                         {
-                            //var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                            //if (taskInfo == null)
-                            //{
-                            //    World.Log($"未找到AGV任务{agv.ID}对应WCS任务");
-                            //    continue;
-                            //}
-                            //try { WmsApi. } catch (Exception ex) { World.Log(ex.Message, LogLevelEnum.Mid); }
-
-                            ////更新AGV任务状态
-                            //agv.Status = AGVTaskStatus.Cancel;
-                            //db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                            ////更新WCS任务状态
-                            //taskInfo.Status = Entity.TaskStatus.Cancel;
-                            //taskInfo.EedTime = DateTime.Now;
-                            //db.Default.Updateable(taskInfo).ExecuteCommand();
-                            //taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
-                            //taskInfo.CompleteOrCancelTasks(db);
+                            World.Log(ex.Message, LogLevelEnum.Mid);
+                            this.ExRecord(obj.Entity.Code, ex.Message);
+                            continue;
                         }
                     }
-                });
-                foreach (var item in taskInfos)
-                {
-                    WmsApi.CompleteTask(item.ID);
-                    this.ExRecord(obj.Entity.Code, $"任务{item}上报WMS完成");
+
+
+                    foreach (var item in taskInfos)
+                    {
+                        WmsApi.CompleteTask(item.ID);
+                    }
                 }
             }
             else if (obj.Entity.HasFlag(DeviceFlags.入库))
             {
+                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
+                //获取所有未结束的入库AGV任务
                 SqlSugarHelper.Do(db =>
                 {
-                    //获取所有未结束的入库AGV任务
-                    var agvTaks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).ToList().OrderBy(v => v.EditTime);
-                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaks.Select(v => v.ID).ToList());
-                    foreach (var agv in agvTaks)
+
+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.EditTime).ToList();
+                });
+
+                if (agvTaskInfos.Any())
+                {
+                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
+                    foreach (var agv in agvTaskInfos)
                     {
-                        //找到对应WCS任务
-                        var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                        if (task == null)
+                        try
                         {
-                            World.Log($"AGV任务{agv.ID}未找到对应WCS任务", LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}未找到对应WCS任务");
-                            continue;
-                        }
-                        this.ExRecord(obj.Entity.Code, $"找到AGV任务[{agv.ID}]对应的WCS任务[{task.ID}]");
+                            SqlSugarHelper.Do(db =>
+                            {
+                                //找到对应WCS任务
+                                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
+                                if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
+                                #region 开始跟据AGV状态做出处理
+                                //巷道分配
+                                if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1)
+                                {
+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配");
+                                    //向WMS获取巷道优先级
+                                    var res = WmsApi.GetTunnelPriorityList(task.ID);
+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},WMS返回巷道优先级{res.ResData}");
+                                    var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
+
+                                    //开始获取堆垛机与可用站台信息
+                                    SRM srm = null;
+                                    List<Station> stations = new List<Station>();
+                                    if (task.Floor == 1) //一楼
+                                    {
+                                        //一楼三个入库口
+                                        stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015").ToList();
+                                        //筛选出可用站台
+                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
+                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
+                                        //可用堆垛机
+                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                                      .Select(v => new SRM(v, this.World)) //转换为SRM
+                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
+                                    }
+                                    else //二楼
+                                    {
+                                        //二楼三个入库口
+                                        stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList();
+                                        //筛选出可用站台
+                                        stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
+                                                           .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
+                                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
+                                        //可用堆垛机
+                                        srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
+                                                      .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
+                                                      .Select(v => new SRM(v, this.World)) //转换为SRM
+                                                      .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
+                                                      .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
+                                                      .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
 
-                        #region 开始跟据AGV状态做出处理
+                                    }
+                                    if (srm == null) throw new Exception($"agv任务{agv.ID}无可用堆垛机");
 
-                        //巷道分配
-                        if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1)
-                        {
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配");
-                            //向WMS获取巷道优先级
-                            var res = WmsApi.GetTunnelPriorityList(task.ID);
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},WMS返回巷道优先级{res.ResData}");
-                            var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
+                                    //筛选出堆垛机的放货站台
+                                    var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
+                                                                                               .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
+                                                                                               .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}");
 
-                            //开始获取堆垛机与可用站台信息
-                            SRM srm = null;
-                            List<Station> stations = new List<Station>();
-                            if (task.Floor == 1) //一楼
-                            {
-                                //一楼三个入库口
-                                stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015").ToList();
-                                //筛选出可用站台
-                                stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
-                                //可用堆垛机
-                                srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
-                                              .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
-                                              .Select(v => new SRM(v, this.World)) //转换为SRM
-                                              .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
-                                              .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
-                                              .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用堆垛机{srm.Entity.Code}");
-                            }
-                            else //二楼
-                            {   
-                                //二楼三个入库口
-                                stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList();
-                                //筛选出可用站台
-                                stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
-                                                   .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
-                                //可用堆垛机
-                                srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
-                                              .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
-                                              .Select(v => new SRM(v, this.World)) //转换为SRM
-                                              .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
-                                              .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
-                                              .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用堆垛机{srm.Entity.Code}");
-                            }
+                                    bool flag = false;
+                                    if (((task.BusType == "二楼湿拉线退料回立库" || task.BusType == "二楼湿拉线余料回立库") && task.Floor == 2))
+                                    {
+                                        flag = true;
+                                        nextPos.Entity.Code = "1025";
+                                    }
+                                    var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
+                                    if (agvs.Any())
+                                    {
+                                        var msg = "已无可用放货站台,任务正在执行中:";
+                                        foreach (var ag in agvs)
+                                        {
+                                            msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]";
+                                        }
+                                        throw new Exception(msg);
+                                    }
 
-                            if (srm == null)
-                            {
-                                World.Log($"agv任务{agv.ID}无可用堆垛机", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},无可用堆垛机");
-                                continue;
-                            };
-                            //筛选出堆垛机的放货站台
-                            var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
-                                                                                       .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
-                                                                                       .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},放货站台{nextPos}");
-                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
-                            if (agvs.Any())
-                            {
-                                var msg = "已无可用放货站台,任务正在执行中:";
-                                foreach (var ag in agvs)
-                                {
-                                    msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]";
+                                                                       
+                                    //更新AGV任务状态
+                                    agv.Status = AGVTaskStatus.Complete1;
+                                    agv.Position = flag == true ? "1025" : nextPos.Entity.Code;
+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                    //更新WCS任务状态
+                                    if (flag)
+                                    {
+                                        srm.Entity.Code = "SRM3";
+                                        task.Device = srm.Entity.Code;
+                                        task.Tunnel = "3";
+                                        task.AddrNext = "1025";
+                                    }
+                                    else {
+                                        task.Device = srm.Entity.Code;
+                                        task.Tunnel = task.Device.GetLastDigit().ToString();
+                                        task.AddrNext = agv.Position;
+                                    }                                   
+                                    db.Default.Updateable(task).ExecuteCommand();                                    
+                                    task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}");
+                                    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}");
+                                    //调继续执行任务接口
+                                    AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code);
                                 }
-                                World.Log(msg, LogLevelEnum.Mid);
-                                continue;
-                            }
+                                //放货站点安全交互
+                                else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
+                                {
+                                    if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
+                                    var dev = devs.Find(v => v.Entity.Code == agv.Position);
 
-                            //更新AGV任务状态
-                            agv.Status = AGVTaskStatus.Complete1;
-                            agv.Position = nextPos.Entity.Code;
-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                            //更新WCS任务状态
-                            task.Device = srm.Entity.Code;
-                            task.Tunnel = task.Device.GetLastDigit().ToString();
-                            task.AddrNext = agv.Position;
-                            db.Default.Updateable(task).ExecuteCommand();
-                            task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}");
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}");
-                            //调继续执行任务接口
-                            AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code);
-                        }
-                        //放货站点安全交互
-                        else if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
-                        {
-                            var dev = devs.Find(v => v.Entity.Code == agv.Position);
-                            //var srmNo = "";
-                            //if (dev.Entity.Code is "1011" or "1021") srmNo = "SRM1";
-                            //else if (dev.Entity.Code is "1013" or "1023") srmNo = "SRM2";
-                            //else if (dev.Entity.Code is "1015" or "1025") srmNo = "SRM3";
-                            //else
-                            //{
-                            //    World.Log($"未找到对应的堆垛机", LogLevelEnum.Mid);
-                            //    continue;
-                            //}
-                            //var srm = srms.FirstOrDefault(v => v.Entity.Code == srmNo);
-                            //if (!srm.Data2.Status.HasFlag(SrmStatus.ForkCenter))
-                            //{
-                            //    World.Log($"{srmNo}", LogLevelEnum.Mid);
-                            //    continue;
-                            //}
+                                    if (dev.Data.VoucherNo != dev.Data2.VoucherNo) throw new Exception($"AGV请求放货,但{dev.Entity.Code}凭证号不一致");
+                                    if (!dev.Data3.Status.HasFlag(StatusEunm.Auto)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}不在自动状态");
+                                    if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}光电有货");
+                                    if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}任务有货");
+                                    if (dev.Data3.Status.HasFlag(StatusEunm.Run)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}在运行状态");
+                                    agv.Status = AGVTaskStatus.Complete2;
+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
 
-                            if (dev.Data.VoucherNo != dev.Data2.VoucherNo)
-                            {
-                                World.Log($"AGV请求放货,但{dev.Entity.Code}凭证号不一致", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但凭证号不一致");
-                                continue;
-                            }
-                            if (!dev.Data3.Status.HasFlag(StatusEunm.Auto))
-                            {
-                                World.Log($"AGV请求放货,但{dev.Entity.Code}不在自动状态", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但不在自动状态");
-                                continue;
-                            }
-                            if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status))
-                            {
-                                World.Log($"AGV请求放货,但{dev.Entity.Code}光电有货", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但光电有货");
-                                continue;
-                            }
-                            if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status))
-                            {
-                                World.Log($"AGV请求放货,但{dev.Entity.Code}任务有货", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但任务有货");
-                                continue;
-                            }
-                            if (dev.Data3.Status.HasFlag(StatusEunm.Run))
-                            {
-                                World.Log($"AGV请求放货,但{dev.Entity.Code}在运行状态", LogLevelEnum.Mid);
-                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但在运行状态");
-                                continue;
-                            }
-                            agv.Status = AGVTaskStatus.Complete2;
-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                            //调继续执行任务接口
-                            AgvApi.ContinueTask(agv.AgvID, dev.Entity.Code);
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,允许放货");
-                            dev.Data.TaskNumber = task.ID;
+                                    //调继续执行任务接口
+                                    AgvApi.ContinueTask(agv.AgvID, dev.Entity.Code);
+
+                                    dev.Data.TaskNumber = task.ID;
+                                }
+                                //完成任务
+                                else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
+                                {
+                                    agv.Status = AGVTaskStatus.MissionCompleted;
+                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                }
+
+                                #endregion 开始跟据AGV状态做出处理
+                            });
                         }
-                        //完成任务
-                        else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
+                        catch (Exception ex)
                         {
-                            agv.Status = AGVTaskStatus.MissionCompleted;
-                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}完成");
+                            World.Log(ex.Message, LogLevelEnum.Mid);
+                            this.ExRecord(obj.Entity.Code, ex.Message);
+                            continue;
                         }
-
-                        #endregion 开始跟据AGV状态做出处理
                     }
-                });
+                }
             }
         }
 

+ 125 - 107
WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -3,6 +3,7 @@ using ServiceCenter.Logs;
 using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
@@ -42,97 +43,109 @@ namespace WCS.WorkEngineering.Systems
 
                 try
                 {
+                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
                     SqlSugarHelper.Do(db =>
                     {
-                        var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
-                        if (!tasks.Any()) return;
-                        foreach (var task in tasks)
+                        taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
+                    });
+                    if (taskInfos.Any())
+                    {
+                        foreach (var task in taskInfos)
                         {
                             try
                             {
-                                if (task.Type == TaskType.EnterDepot)
+                                SqlSugarHelper.Do(db =>
                                 {
-                                    //创建AGV任务
-                                    var agvTask = new WCS_AgvTaskInfo()
-                                    {
-                                        ID = db.GetAGVTaskId(),
-                                        TaskType = AGVTaskType.EnterDepot,
-                                        Status = AGVTaskStatus.NewBuild,
-                                        Station = task.WorkBench,
-                                        AddWho = "WCS",
-                                        Position = task.SrmStation
-                                    };
-                                    if (task.Floor == 2 && agvTask.Position.IsNullOrEmpty()) return;
-                                    db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
-                                    //更新任务状态
-                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                    task.AgvTaskID = agvTask.ID;
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Position}");
-                                }
-                                else if (task.Type == TaskType.OutDepot)
-                                {
-                                    #region 二楼非半自动手动出库任务需要创建AGV任务
-
-                                    if (task.Floor == 2 && task.OutType != OutTypeEnum.半自动手动出库任务)
+                                    if (task.Type == TaskType.EnterDepot)
                                     {
                                         //创建AGV任务
                                         var agvTask = new WCS_AgvTaskInfo()
                                         {
                                             ID = db.GetAGVTaskId(),
-                                            TaskType = AGVTaskType.CallMaterial,
+                                            TaskType = AGVTaskType.EnterDepot,
                                             Status = AGVTaskStatus.NewBuild,
                                             Station = task.WorkBench,
-                                            AddWho = "WCS"
+                                            AddWho = "WCS",
+                                            //Position = task.SrmStation
                                         };
+                                        if (task.Floor == 2)
+                                        {
+                                            task.Tunnel = "3";
+                                            task.Device = "SRM3";
+                                            task.SrmStation = "1025";
+                                        }
                                         db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
+                                        //更新任务状态
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
                                         task.AgvTaskID = agvTask.ID;
+                                        db.Default.Updateable(task).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表,AGV任务目标地址:{agvTask.Position}");
                                     }
+                                    else if (task.Type == TaskType.OutDepot)
+                                    {
+                                        #region 二楼非半自动手动出库任务需要创建AGV任务
 
-                                    #endregion 二楼非半自动手动出库任务需要创建AGV任务
+                                        if (task.Floor == 2 && task.OutType != OutTypeEnum.半自动手动出库任务)
+                                        {
+                                            //创建AGV任务
+                                            var agvTask = new WCS_AgvTaskInfo()
+                                            {
+                                                ID = db.GetAGVTaskId(),
+                                                TaskType = AGVTaskType.CallMaterial,
+                                                Status = AGVTaskStatus.NewBuild,
+                                                Station = task.WorkBench,
+                                                AddWho = "WCS"
+                                            };
+                                            db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
+                                            task.AgvTaskID = agvTask.ID;
+                                        }
+
+                                        #endregion 二楼非半自动手动出库任务需要创建AGV任务
 
-                                    if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
+                                        if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
+                                        {
+                                            //获取堆垛机到目标地址的路径信息
+                                            var path = DevicePath.GetPath(task.Device, task.AddrTo);
+                                            task.SrmStation = path.Points[1].Code;
+                                        }
+                                        //更新任务状态
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                                        db.Default.Updateable(task).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
+                                    }
+                                    else if (task.Type == TaskType.Delivery) //一楼叉车搬运任务
                                     {
-                                        //获取堆垛机到目标地址的路径信息
-                                        var path = DevicePath.GetPath(task.Device, task.AddrTo);
-                                        task.SrmStation = path.Points[1].Code;
+                                        var agv = new WCS_AgvTaskInfo()
+                                        {
+                                            ID = db.GetAGVTaskId(),
+                                            TaskType = AGVTaskType.ForkliftFilling,
+                                            Status = AGVTaskStatus.NewBuild,
+                                            Station = task.WorkBench,
+                                            AddWho = "WCS"
+                                        };
+                                        db.Default.Insertable(agv).SplitTable().ExecuteCommand();
+                                        //更新WCS数据
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                                        task.AgvTaskID = agv.ID;
+                                        db.Default.Updateable(task).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化搬运任务信息,并创建AGV任务");
                                     }
-                                    //更新任务状态
-                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
-                                }
-                                else if (task.Type == TaskType.Delivery) //一楼叉车搬运任务
-                                {
-                                    var agv = new WCS_AgvTaskInfo()
+                                    else if (task.Type == TaskType.EmptyInit)
                                     {
-                                        ID = db.GetAGVTaskId(),
-                                        TaskType = AGVTaskType.ForkliftFilling,
-                                        Status = AGVTaskStatus.NewBuild,
-                                        Station = task.WorkBench,
-                                        AddWho = "WCS"
-                                    };
-                                    db.Default.Insertable(agv).SplitTable().ExecuteCommand();
-                                    //更新WCS数据
-                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                    task.AgvTaskID = agv.ID;
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化搬运任务信息,并创建AGV任务");
-                                }
-                                else if (task.Type == TaskType.EmptyInit)
-                                {
-                                    //更新任务状态
-                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化任务信息");
-                                }
+                                        //更新任务状态
+                                        task.Status = Entity.TaskStatus.WaitingToExecute;
+                                        db.Default.Updateable(task).ExecuteCommand();
+                                        task.AddWCS_TASK_DTL(db, task.Device, $"初始化任务信息");
+                                    }
+                                });
                             }
                             catch (Exception ex)
                             {
-                                World.Log($"任务[{obj.Entity.Code}]处理异常:{ex.Message}", LogLevelEnum.Mid);
+                                World.Log(ex.Message, LogLevelEnum.Mid);
+                                continue;
                             }
                         }
-                    });
+                    }
                 }
                 catch (Exception ex)
                 {
@@ -143,16 +156,20 @@ namespace WCS.WorkEngineering.Systems
 
                 #region 下发入库AGV任务
 
+                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
+
                 SqlSugarHelper.Do(db =>
                 {
-                    var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.EnterDepot).SplitTable(v => v.Take(2)).ToList();
+                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.EnterDepot).SplitTable(v => v.Take(2)).ToList();
+                });
 
-                    if (agvTasks.Count > 0)
+                if (agvTaskInfos.Any())
+                {
+                    foreach (var agv in agvTaskInfos)
                     {
-                        foreach (var agv in agvTasks)
+                        try
                         {
-                            //开始处理
-                            try
+                            SqlSugarHelper.Do(db =>
                             {
                                 //获取对应wcs任务
                                 var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
@@ -181,56 +198,57 @@ namespace WCS.WorkEngineering.Systems
                                 wcs.Status = Entity.TaskStatus.AGVExecution;
                                 db.Default.Updateable(wcs).ExecuteCommand();
                                 wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
-                            }
-                            catch (Exception ex)
-                            {
-                                World.Log(ex.Message, LogLevelEnum.Mid);
-                                continue;
-                            }
+                            });
+                        }
+                        catch (Exception ex)
+                        {
+                            World.Log(ex.Message, LogLevelEnum.Mid);
+                            continue;
                         }
                     }
-                });
+                }
 
                 #endregion 下发入库AGV任务
 
-                #region 移动任务处理
+                #region 一楼叉车补空任务处理
 
-                try
+
+                List<WCS_AgvTaskInfo> agvTaskInfos1 = new List<WCS_AgvTaskInfo>();
+
+                SqlSugarHelper.Do(db =>
                 {
-                    SqlSugarHelper.Do(db =>
-                    {
-                        var agvTasks = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.ForkliftFilling).SplitTable(v => v.Take(2)).ToList();
+                    agvTaskInfos1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(t => t.Status == AGVTaskStatus.NewBuild && t.TaskType == AGVTaskType.ForkliftFilling).SplitTable(v => v.Take(2)).ToList();
+                });
 
-                        if (agvTasks.Count > 0)
+                if (agvTaskInfos1.Any())
+                {
+                    foreach (var agv in agvTaskInfos1)
+                    {
+                        try
                         {
-                            foreach (var agv in agvTasks)
+                            GenAgvSchedulingTaskResponse res = new GenAgvSchedulingTaskResponse();
+                            SqlSugarHelper.Do(db =>
                             {
-                                //开始处理
-                                GenAgvSchedulingTaskResponse res = new GenAgvSchedulingTaskResponse();
-                                try
-                                {
-                                    //获取对应wcs任务
-                                    var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
-                                    //下发AGV任务
-                                    res = AgvApi.机台补空(agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
-                                    agv.Status = AGVTaskStatus.Confirm;
-                                    agv.AgvID = res.data;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-
-                                    wcs.Status = Entity.TaskStatus.AGVExecution;
-                                    db.Default.Updateable(wcs).ExecuteCommand();
-                                    wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV,AGV任务号:{res.data}");
-                                }
-                                catch (Exception ex)
-                                {
-                                    World.Log(ex.Message, LogLevelEnum.Mid);
-                                    continue;
-                                }
-                            }
+                                //获取对应wcs任务
+                                var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
+                                //下发AGV任务
+                                res = AgvApi.机台补空(agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
+                                agv.Status = AGVTaskStatus.Confirm;
+                                agv.AgvID = res.data;
+                                db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+
+                                wcs.Status = Entity.TaskStatus.AGVExecution;
+                                db.Default.Updateable(wcs).ExecuteCommand();
+                                wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV,AGV任务号:{res.data}");
+                            });
                         }
-                    });
+                        catch (Exception ex)
+                        {
+                            World.Log(ex.Message, LogLevelEnum.Mid);
+                            continue;
+                        }
+                    }
                 }
-                catch { }
 
                 #endregion 移动任务处理
             }

+ 1 - 1
WCS.WorkEngineering/Systems/二楼入库工位处理系统.cs

@@ -63,7 +63,7 @@ namespace WCS.WorkEngineering.Systems
                      if (taskInfo.Status != Entity.TaskStatus.AGVExecution)
                      {
                          if (!db.Queryable<WCS_TaskDtl>().SplitTable(v => v.Take(2)).Any(v => v.ParentTaskCode == taskInfo.ID && v.Desc.Contains("等待分配货位后堆垛机进行取货"))) return;
-                         else throw new KnownException($"任务:{task.ID}不是AGV执行状态,请检查异常原因", LogLevelEnum.High);
+                         else throw new KnownException($"任务:{taskInfo.ID}不是AGV执行状态,请检查异常原因", LogLevelEnum.High);
 
                      }
                  }

+ 1 - 1
WCS.WorkEngineering/Systems/二楼出库工位处理系统.cs

@@ -26,7 +26,7 @@ namespace WCS.WorkEngineering.Systems
             if (!obj.Data3.Status.HasFlag(Entity.Protocol.Station.StatusEunm.PH_Status)) throw new KnownException("无光电", LogLevelEnum.Low);
             SqlSugarHelper.Do(db =>
             {
-                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid);
+                var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid);               
                 var agv = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(2)).First(v => v.ID == task.AgvTaskID && v.Status == AGVTaskStatus.NewBuild) ?? throw new KnownException("未找到对应的AGV任务", LogLevelEnum.Mid);
                 var res = IwmsApi.满轮出库(task.MatCode, task.AddrTo, task.ID.ToString(), task.BarCode, task.InvBarCode, task.IsSurplus, task.IsRework, task.IsFast, task.Grade, task.WorkBench);
                 agv.Status = AGVTaskStatus.Confirm;

+ 163 - 133
WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -1,8 +1,10 @@
 using Microsoft.AspNetCore.Mvc;
+using NetTaste;
 using Newtonsoft.Json;
 using PlcSiemens.Core.Extension;
 using ServiceCenter.Attributes;
 using ServiceCenter.Logs;
+using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using WCS.Core;
 using WCS.Entity;
@@ -69,89 +71,103 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         [HttpPost, Log("背负式AGV请求出库任务")]
         public ApplyEmptySpoolResponse ApplyEmptySpool([FromBody] AgvFillEmptySpaceRequest reqDto)
         {
-            lock (LockHub.ApplyEmptySpoolLock)
+            var key = $"WCS:Lock:AGV:{nameof(ApplyEmptySpool)}";
+            ApplyEmptySpoolResponse agvFill = new ApplyEmptySpoolResponse();
+            try
             {
-                LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"传入参数--{JsonConvert.SerializeObject(reqDto)}");
-                ApplyEmptySpoolResponse agvFill = new ApplyEmptySpoolResponse();
-
-                try
+                if (RedisHub.Default.Get(key) != null)
                 {
                     agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                    if (!World.IsStart)
-                    {
-                        agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                        agvFill.ResMsg = "WCS初始化中";
-                        return agvFill;
-                    }
-                    var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke("输送机") as List<Station>;
+                    agvFill.ResMsg = $"[{nameof(ApplyEmptySpool)}]--触发并发管控";
+                }
+                else
+                {
+                    RedisHub.Default.Set(key, nameof(ApplyEmptySpool));
+                    LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"传入参数--{JsonConvert.SerializeObject(reqDto)}");
 
-                    // 检测三个站台是否有货
-                    obj = obj.Where(v => v.Entity.Code is "1012" or "1014" or "1016").Where(v => v.Data3.Status.HasFlag(StatusEunm.PH_Status)).ToList();
-                    if (!obj.Any())
+                    try
                     {
                         agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                        agvFill.ResMsg = "无空轮";
-                        return agvFill;
-                    }
-                    SqlSugarHelper.Do(db =>
-                    {
-                        var res = WmsApi.GetTunnelEmptyConCount();
-
-                        var agvStations = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2))
-                                          .Where(v => v.Status < AGVTaskStatus.Complete3 && v.TaskType == AGVTaskType.CallForMaterial).Select(v => v.Station).ToList();
-                        obj = obj.Where(v => !agvStations.Contains(v.Entity.Code)).ToList();
-                        if (!obj.Any())
+                        if (!World.IsStart)
                         {
                             agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                            agvFill.ResMsg = "无可用取货站点";
-                            return;
+                            agvFill.ResMsg = "WCS初始化中";
+                            return agvFill;
                         }
+                        var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke("输送机") as List<Station>;
 
-                        foreach (var item in res.ResDataList)
+                        // 检测三个站台是否有货
+                        obj = obj.Where(v => v.Entity.Code is "1012" or "1014" or "1016").Where(v => v.Data3.Status.HasFlag(StatusEunm.PH_Status)).ToList();
+                        if (!obj.Any())
                         {
-                            var station = Device.All.Where(v => v.Code == "TY" + item.Tunnel.ToString())
-                                                    .Select(v => v.Targets).SelectMany(v => v)
-                                                    .Where(v => v.HasProtocol(typeof(IStation520)))
-                                                    .Where(v => v.Code is "1012" or "1014" or "1016")
-                                                    .FirstOrDefault();
-                            item.Tunnel = station.ToInt();
+                            agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
+                            agvFill.ResMsg = "无空轮";
+                            return agvFill;
                         }
-                        var stationNo = res.ResDataList.OrderBy(v => v.Count).Select(v => v.Tunnel.ToString()).ToList();
-                        var dev = obj.MinBy(v => stationNo.IndexOf(v.Entity.Code));
-                        var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == dev.Data.TaskNumber) ?? throw new Exception("无有效任务");
-                        var id = db.GetAGVTaskId();
-                        var agv = new WCS_AgvTaskInfo()
+                        SqlSugarHelper.Do(db =>
                         {
-                            ID = id,
-                            AgvID = $"HJBK{id}{task.ID}",
-                            TaskType = AGVTaskType.CallForMaterial,
-                            Status = AGVTaskStatus.NewBuild,
-                            Station = dev.Entity.Code,
-                            AddWho = "WCS"
-                        };
-                        //创建对应的AGV任务
-                        db.Default.Insertable(agv).SplitTable().ExecuteCommand();
-
-                        task.AgvTaskID = agv.ID;
-                        task.Status = Entity.TaskStatus.AGVExecution;
-                        db.Default.Updateable(task).ExecuteCommand();
-                        task.AddWCS_TASK_DTL(db, dev.Entity.Code, "AGV", "agv执行中");
-
-                        agvFill.LocCode = dev.Entity.Code;
-                        agvFill.SpoolType = "4";
-                        agvFill.ResMsg = "";
-                        agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.Sucess;
-                        agvFill.TaskCode = agv.AgvID;
-                    });
-                }
-                catch (Exception ex)
-                {
-                    agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
-                    agvFill.ResMsg = ex.Message;
+                            var res = WmsApi.GetTunnelEmptyConCount();
+
+                            var agvStations = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2))
+                                              .Where(v => v.Status < AGVTaskStatus.Complete3 && v.TaskType == AGVTaskType.CallForMaterial).Select(v => v.Station).ToList();
+                            obj = obj.Where(v => !agvStations.Contains(v.Entity.Code)).ToList();
+                            if (!obj.Any())
+                            {
+                                agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
+                                agvFill.ResMsg = "无可用取货站点";
+                                return;
+                            }
+
+                            foreach (var item in res.ResDataList)
+                            {
+                                var station = Device.All.Where(v => v.Code == "TY" + item.Tunnel.ToString())
+                                                        .Select(v => v.Targets).SelectMany(v => v)
+                                                        .Where(v => v.HasProtocol(typeof(IStation520)))
+                                                        .Where(v => v.Code is "1012" or "1014" or "1016")
+                                                        .FirstOrDefault();
+                                item.Tunnel = station.ToInt();
+                            }
+                            var stationNo = res.ResDataList.OrderBy(v => v.Count).Select(v => v.Tunnel.ToString()).ToList();
+                            var dev = obj.MinBy(v => stationNo.IndexOf(v.Entity.Code));
+                            var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == dev.Data.TaskNumber) ?? throw new Exception("无有效任务");
+                            var id = db.GetAGVTaskId();
+                            var agv = new WCS_AgvTaskInfo()
+                            {
+                                ID = id,
+                                AgvID = $"HJBK{id}{task.ID}",
+                                TaskType = AGVTaskType.CallForMaterial,
+                                Status = AGVTaskStatus.NewBuild,
+                                Station = dev.Entity.Code,
+                                AddWho = "WCS"
+                            };
+                            //创建对应的AGV任务
+                            db.Default.Insertable(agv).SplitTable().ExecuteCommand();
+
+                            task.AgvTaskID = agv.ID;
+                            task.Status = Entity.TaskStatus.AGVExecution;
+                            db.Default.Updateable(task).ExecuteCommand();
+                            task.AddWCS_TASK_DTL(db, dev.Entity.Code, "AGV", "agv执行中");
+
+                            agvFill.LocCode = dev.Entity.Code;
+                            agvFill.SpoolType = "4";
+                            agvFill.ResMsg = "";
+                            agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.Sucess;
+                            agvFill.TaskCode = agv.AgvID;
+                        });
+                    }
+                    catch (Exception ex)
+                    {
+                        agvFill.ResCode = Models.WMS.Response.ResponseStatusCodeEnum.DataSaveErr;
+                        agvFill.ResMsg = ex.Message;
+                    }
+                    LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"返回参数{JsonConvert.SerializeObject(agvFill)}");
                 }
-                LogHub.InterfacePublish(nameof(ApplyEmptySpool), $"返回参数{JsonConvert.SerializeObject(agvFill)}");
-                return agvFill;
             }
+            finally
+            {
+                RedisHub.Default.Del(key);
+            }
+            return agvFill;
         }
 
         /// <summary>
@@ -162,88 +178,102 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         [HttpPost, Log("AGV执行回调")]
         public AgvCallbackResponse AgvCallback([FromBody] AgvCallbackRequest reqDto)
         {
-            lock (LockHub.AgvCallbackLock)
+            var key = $"WCS:Lock:AGV:{nameof(AgvCallback)}";
+            var res = new AgvCallbackResponse() { code = AgvResponseCode.Fail, message = "失败" };
+            try
             {
-                var remoteIpAddress = HttpContext.Connection.RemoteIpAddress.ToString();
-                LogHub.InterfacePublish(nameof(AgvCallback), $"IP:{remoteIpAddress}--传入参数--{JsonConvert.SerializeObject(reqDto)}");
-                var res = new AgvCallbackResponse() { code = AgvResponseCode.Fail, message = "失败" };
-                WCS_TaskInfo taskInfo = null;
-
-                try
+                if (RedisHub.Default.Get(key) != null)
+                {
+                    res.code = AgvResponseCode.Error;
+                    res.message = $"[{nameof(AgvCallback)}]--触发并发管控";
+                }
+                else
                 {
-                    SqlSugarHelper.Do(db =>
+                    RedisHub.Default.Set(key, nameof(AgvCallback));
+                    WCS_TaskInfo taskInfo = null;
+                    try
                     {
-                        //跟据AGVid找到对应的AGV任务
-                        var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2)).First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
-                        if (agvTask == null && reqDto.method != "applySecurity")
-                        {
-                            res.code = AgvResponseCode.Fail;
-                            res.message = "未找到对应的AGV任务";
-                            return;
-                        }
-                        switch (reqDto.method)
+                        SqlSugarHelper.Do(db =>
                         {
-                            //case "start": //表示请求巷道
-                            //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
-                            //    break;
+                            //跟据AGVid找到对应的AGV任务
+                            var agvTask = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(tabs => tabs.Take(2)).First(v => v.AgvID == reqDto.taskCode && v.Status < AGVTaskStatus.MissionCompleted);
+                            if (agvTask == null)
+                            {
+                                res.code = AgvResponseCode.Fail;
+                                res.message = "未找到对应的AGV任务";
 
-                            //case "end": //表示请求巷道
-                            //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
-                            //    break;
+                            }
+                            else
+                            {
+                                switch (reqDto.method)
+                                {
+                                    //case "start": //表示请求巷道
+                                    //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
+                                    //    break;
 
-                            case "applyContinue": //表示请求巷道
-                                agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
-                                break;
+                                    //case "end": //表示请求巷道
+                                    //    agvTask.Status = AGVTaskStatus.RequestOrPermission1;
+                                    //    break;
 
-                            case "applySecurity": //表示请求放货或取货
-                                agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
-                                break;
+                                    case "applyContinue": //表示请求巷道
+                                        agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission1;
+                                        break;
 
-                            case "hjend_2": //补空任务完成
-                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                                break;
+                                    case "applySecurity": //表示请求放货或取货
+                                        agvTask.AgvStatus = AGVTaskStatus.RequestOrPermission2;
+                                        break;
 
-                            case "endhjBM": //取满任务完成
-                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                                break;
+                                    case "hjend_2": //补空任务完成
+                                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                        break;
 
-                            case "end": //二楼出满任务完成
-                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                                break;
+                                    case "endhjBM": //取满任务完成
+                                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                        break;
 
-                            case "tcEnd": //机台补空任务完成
-                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                                break;
+                                    case "end": //二楼出满任务完成
+                                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                        break;
 
-                            case "exc_end": //异常信息上抛-值不匹配
-                                agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
-                                break;
+                                    case "tcEnd": //机台补空任务完成
+                                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                        break;
 
-                            case "outbin": //小车退出取货位
-                                agvTask.AgvStatus = AGVTaskStatus.Complete3;
-                                break;
+                                    case "exc_end": //异常信息上抛-值不匹配
+                                        agvTask.AgvStatus = AGVTaskStatus.MissionCompleted;
+                                        break;
 
-                            case "cancel": //取消任务
-                                //agvTask.AgvStatus = AGVTaskStatus.Cancel;
-                                break;
+                                    case "outbin": //小车退出取货位
+                                        agvTask.AgvStatus = AGVTaskStatus.Complete3;
+                                        break;
 
-                            default:
-                                break;
-                        }
-                        db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
-                        res.code = AgvResponseCode.Success;
-                        res.message = "成功";
-                    });
-                }
-                catch (Exception ex)
-                {
-                    res.code = AgvResponseCode.Error;
-                    res.message = ex.Message;
-                }
-                LogHub.InterfacePublish(nameof(AgvCallback), $"IP:{remoteIpAddress}--返回结果--{JsonConvert.SerializeObject(res)}");
+                                    case "cancel": //取消任务
+                                                   //agvTask.AgvStatus = AGVTaskStatus.Cancel;
+                                        break;
 
-                return res;
+                                    default:
+                                        break;
+                                }
+                                db.Default.Updateable(agvTask).SplitTable().ExecuteCommand();
+                                res.code = AgvResponseCode.Success;
+                                res.message = "成功";
+                            }
+
+
+                        });
+                    }
+                    catch (Exception ex)
+                    {
+                        res.code = AgvResponseCode.Error;
+                        res.message = ex.Message;
+                    }
+                }
+            }
+            finally
+            {
+                RedisHub.Default.Del(key);
             }
+            return res;
         }
     }
 }

+ 7 - 0
WCS.WorkEngineering/WebApi/Controllers/WcsController.cs

@@ -476,6 +476,13 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             }
         }
 
+        /// <summary>
+        ///  
+        /// </summary>
+        /// <param name="sRes"></param>
+        /// <param name="id"></param>
+        /// <param name="type"></param>
+        /// <returns></returns>
         public SRes? CancelAgvTaskUpdate(SRes<HandleTaskResponse> sRes, int id, int type)
         {
             try