gkj 2 years ago
parent
commit
2c3f8d41da

+ 38 - 3
ServiceCenter/LogHub.cs

@@ -1,10 +1,17 @@
-using WCS.Core;
+using System.Collections.Concurrent;
+using System.IO;
+using WCS.Core;
 
 namespace ServiceCenter
 {
     public class LogHub
     {
 
+        /// <summary>
+        ///  日志队列
+        /// </summary>
+        public static ConcurrentQueue<LogModel> Logs = new ConcurrentQueue<LogModel>();
+
         /// <summary>
         ///  发布一条日志记录
         /// </summary>
@@ -13,8 +20,36 @@ namespace ServiceCenter
         /// <param name="con">内容</param>
         public static void Publish(string path, string title, string con)
         {
-            if (!Directory.Exists(path)) Directory.CreateDirectory(path);
-            File.AppendAllText(Path.Combine(path, title), con);
+            Logs.Enqueue(new LogModel
+            {
+                path = path,
+                Title = title,
+                Con = con
+            });
+        }
+
+        public static void init()
+        {
+            while (true)
+            {
+                foreach (var log in Logs)
+                {
+                    if (!Directory.Exists(log.path)) Directory.CreateDirectory(log.path);
+                    File.AppendAllText(Path.Combine(log.path, log.Title), log.Con);
+                }
+                Logs.Clear();
+                Thread.Sleep(1000);
+            }
         }
     }
+
+    public class LogModel
+    {
+        public string path { get; set; }
+        public string Title { get; set; }
+
+        public string Con { get; set; }
+
+
+    }
 }

+ 2 - 2
ServiceCenter/WebApi/APICaller.cs

@@ -79,7 +79,7 @@ namespace ServiceCenter.WebApi
 
         private static string HttpApi(string url, string jsonstr, string type)
         {
-            LogHub.Publish($"D:\\WCSLogs\\{DateTime.Now.ToString("yyyy-MM-dd")}\\接口调用日志", $"调用日志.txt", $"接口{url}传参---------{JsonConvert.SerializeObject(jsonstr)}\n");
+            LogHub.Publish($"D:\\WCSLogs\\{DateTime.Now.ToString("yyyy-MM-dd")}\\接口调用日志", $"调用日志.txt", $"{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:fffffff")}--接口{url}传参---------{JsonConvert.SerializeObject(jsonstr)}\n");
             var sw = new Stopwatch();
             sw.Start();
             Encoding encoding = Encoding.UTF8;
@@ -97,7 +97,7 @@ namespace ServiceCenter.WebApi
             {
                 var res = reader.ReadToEnd();
                 sw.Stop();
-                LogHub.Publish($"D:\\WCSLogs\\{DateTime.Now.ToString("yyyy-MM-dd")}\\接口调用日志", $"调用日志.txt", $"接口{url}调用耗时{sw.ElapsedMilliseconds}---------{JsonConvert.SerializeObject(res)}\n");
+                LogHub.Publish($"D:\\WCSLogs\\{DateTime.Now.ToString("yyyy-MM-dd")}\\接口调用日志", $"调用日志.txt", $"{DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss:fffffff")}--接口{url}调用耗时{sw.ElapsedMilliseconds}---------{JsonConvert.SerializeObject(res)}\n");
                 return res;
             }
         }

+ 2 - 0
WCS.Service/Worker.cs

@@ -143,6 +143,8 @@ namespace WCS.Service
             }
 
             #endregion 初始化PLC访问器及PLC读取协议
+
+            LogHub.init();
         }
     }
 }

+ 153 - 138
WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -1,4 +1,5 @@
 using PlcSiemens.Core.Extension;
+using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
 using WCS.Core;
@@ -7,6 +8,7 @@ using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.WebApi.Models.AGV.Response;
 using WCS.WorkEngineering.Worlds;
+using WCS.WorkEngineering.Worlds.Logs;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -27,184 +29,153 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Station obj)
         {
-            #region 处理所有的新增任务
-
+            var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";
             try
             {
-                SqlSugarHelper.Do(db =>
+                if (RedisHub.Default.Get(key) != null)
+                {
+                    throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);
+                }
+                RedisHub.Default.Set(key, obj.Entity.Code);
+                #region 处理所有的新增任务
+
+                try
                 {
-                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
-                    if (!tasks.Any()) return;
-                    tasks.ForEach(task =>
+                    SqlSugarHelper.Do(db =>
                     {
-                        switch (task.Type)
+                        var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
+                        if (!tasks.Any()) return;
+                        tasks.ForEach(task =>
                         {
-                            case TaskType.SetPlate:
-                                break;
+                            switch (task.Type)
+                            {
+                                case TaskType.SetPlate:
+                                    break;
 
-                            case TaskType.EnterDepot:
-                                //创建AGV任务
-                                var agvTask = new WCS_AgvTaskInfo()
-                                {
-                                    ID = db.GetAGVTaskId(),
-                                    TaskType = AGVTaskType.EnterDepot,
-                                    Status = AGVTaskStatus.NewBuild,
-                                    Station = task.WorkBench,
-                                    AddWho = "WCS"
-                                };
-                                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任务中间表");
-                                break;
-
-                            case TaskType.OutDepot:
-                                if (task.Floor == 2)
-                                {  //创建AGV任务
-                                    agvTask = new WCS_AgvTaskInfo()
+                                case 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"
                                     };
                                     db.Default.Insertable(agvTask).SplitTable().ExecuteCommand();
+                                    //更新任务状态
+                                    task.Status = Entity.TaskStatus.WaitingToExecute;
                                     task.AgvTaskID = agvTask.ID;
-                                }
-                                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}");
-                                break;
-
-                            case TaskType.TransferDepot:
-                                break;
-
-                            case TaskType.Delivery:
-                                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任务");
-                                break;
-
-                            case TaskType.EmptyInit:
-                                //更新任务状态
-                                task.Status = Entity.TaskStatus.WaitingToExecute;
-                                db.Default.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db, task.Device, $"初始化任务信息");
-                                break;
-
-                            default:
-                                break;
-                        }
-                    });
-                });
-            }
-            catch (Exception ex)
-            {
-                World.Log(ex.Message, Worlds.Logs.LogLevelEnum.Mid);
-            }
-
-            #endregion 处理所有的新增任务
-
-            #region 下发入库AGV任务
+                                    db.Default.Updateable(task).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化入库任务信息,并创建AGV任务中间表");
+                                    break;
 
-            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();
+                                case TaskType.OutDepot:
+                                    if (task.Floor == 2)
+                                    {  //创建AGV任务
+                                        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;
+                                    }
+                                    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}");
+                                    break;
 
-                if (agvTasks.Count > 0)
-                {
-                    foreach (var agv in agvTasks)
-                    {
-                        //开始处理
-                        try
-                        {
-                            //获取对应wcs任务
-                            var wcs = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.AgvTaskID == agv.ID && t.Status == Entity.TaskStatus.WaitingToExecute).First();
+                                case TaskType.TransferDepot:
+                                    break;
 
-                            switch (wcs.Floor)
-                            {
-                                case 1: //一楼下发AGV任务
-                                    var res = AgvApi.满轮入库(wcs.BarCode, agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
-                                    agv.Status = AGVTaskStatus.Confirm;
-                                    agv.AgvID = res.data;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                case TaskType.Delivery:
+                                    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任务");
                                     break;
 
-                                case 2:
-                                    var agvRes = IwmsApi.空轮回库(wcs.MatCode, wcs.SrmStation, wcs.IsSurplus, wcs.IsRework, agv.ID, wcs.BarCode);
-                                    agv.Status = AGVTaskStatus.Confirm;
-                                    agv.AgvID = agvRes.data;
-                                    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                case TaskType.EmptyInit:
+                                    //更新任务状态
+                                    task.Status = Entity.TaskStatus.WaitingToExecute;
+                                    db.Default.Updateable(task).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db, task.Device, $"初始化任务信息");
                                     break;
 
                                 default:
                                     break;
                             }
-
-                            //更新WCS数据
-                            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, Worlds.Logs.LogLevelEnum.Mid);
-                            continue;
-                        }
-                    }
+                        });
+                    });
+                }
+                catch (Exception ex)
+                {
+                    World.Log(ex.Message, Worlds.Logs.LogLevelEnum.Mid);
                 }
-            });
 
-            #endregion 下发入库AGV任务
+                #endregion 处理所有的新增任务
 
-            #region 移动任务处理
+                #region 下发入库AGV任务
 
-            try
-            {
                 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();
+                    var agvTasks = 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)
                     {
                         foreach (var agv in agvTasks)
                         {
                             //开始处理
-                            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();
 
+                                switch (wcs.Floor)
+                                {
+                                    case 1: //一楼下发AGV任务
+                                        var res = AgvApi.满轮入库(wcs.BarCode, agv.Station, Guid.NewGuid().ToString().Replace("-", ""), "1");
+                                        agv.Status = AGVTaskStatus.Confirm;
+                                        agv.AgvID = res.data;
+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                        break;
+
+                                    case 2:
+                                        var agvRes = IwmsApi.空轮回库(wcs.MatCode, wcs.SrmStation, wcs.IsSurplus, wcs.IsRework, agv.ID, wcs.BarCode);
+                                        agv.Status = AGVTaskStatus.Confirm;
+                                        agv.AgvID = agvRes.data;
+                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                                        break;
+
+                                    default:
+                                        break;
+                                }
+
+                                //更新WCS数据
                                 wcs.Status = Entity.TaskStatus.AGVExecution;
                                 db.Default.Updateable(wcs).ExecuteCommand();
-                                wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV,AGV任务号:{res.data}");
+                                wcs.AddWCS_TASK_DTL(db, wcs.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
                             }
                             catch (Exception ex)
                             {
@@ -214,10 +185,54 @@ namespace WCS.WorkEngineering.Systems
                         }
                     }
                 });
-            }
-            catch { }
 
-            #endregion 移动任务处理
+                #endregion 下发入库AGV任务
+
+                #region 移动任务处理
+
+                try
+                {
+                    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();
+
+                        if (agvTasks.Count > 0)
+                        {
+                            foreach (var agv in agvTasks)
+                            {
+                                //开始处理
+                                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, Worlds.Logs.LogLevelEnum.Mid);
+                                    continue;
+                                }
+                            }
+                        }
+                    });
+                }
+                catch { }
+
+                #endregion 移动任务处理
+            }
+            finally
+            {
+                RedisHub.Default.Del(key);
+            }
         }
 
         public override bool Select(Device dev)

+ 24 - 7
WCS.WorkEngineering/Systems/一楼出库工位处理系统.cs

@@ -1,10 +1,13 @@
-using ServiceCenter.SqlSugars;
+using ServiceCenter.Redis;
+using ServiceCenter.SqlSugars;
 using System.ComponentModel;
 using WCS.Core;
 using WCS.Entity;
+using WCS.Service;
 using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
+using WCS.WorkEngineering.Worlds.Logs;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
 namespace WCS.WorkEngineering.Systems
@@ -22,14 +25,28 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Station obj)
         {
-            if (!obj.Data3.Status.HasFlag(Entity.Protocol.Station.StatusEunm.PH_Status) && !obj.Data3.Status.HasFlag(Entity.Protocol.Station.StatusEunm.OT_Status))
+            var key = $"WCS:Lock:{obj.Entity.Code}";
+            try
             {
-                var any = false;
-                SqlSugarHelper.Do(db =>
+
+                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(Entity.Protocol.Station.StatusEunm.PH_Status) && !obj.Data3.Status.HasFlag(Entity.Protocol.Station.StatusEunm.OT_Status))
                 {
-                    any = db.Default.Queryable<WCS_TaskInfo>().Any(v => v.AddrTo == obj.Entity.Code && v.Status < Entity.TaskStatus.AGVExecution);
-                });
-                if (!any) WmsApi.ApplyStockOutTask(obj.Entity.Code);
+                    var any = false;
+                    SqlSugarHelper.Do(db =>
+                    {
+                        any = db.Default.Queryable<WCS_TaskInfo>().Any(v => v.AddrTo == obj.Entity.Code && v.Status < Entity.TaskStatus.AGVExecution);
+                    });
+                    if (!any) WmsApi.ApplyStockOutTask(obj.Entity.Code);
+                }
+            }
+            finally
+            {
+                RedisHub.Default.Del(key);
             }
         }
 

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

@@ -81,7 +81,7 @@ namespace WCS.WorkEngineering.Systems
         public override bool Select(Device dev)
         {
             //return dev.Code == "1025";
-            return dev.HasFlag(DeviceFlags.二楼库口);
+            return dev.HasFlag(DeviceFlags.二楼库口);
         }
     }
 }

+ 2 - 0
WCS.WorkEngineering/WorkStart.cs

@@ -170,6 +170,8 @@ namespace WCS.WorkEngineering
             });
 
             #endregion 标签配置
+
+          
         }
     }
 }