林豪 左 2 年之前
父節點
當前提交
f1f0cee971
共有 3 個文件被更改,包括 79 次插入19 次删除
  1. 6 2
      ServiceCenter/Extensions/TypeExtension.cs
  2. 49 15
      ServiceCenter/Logs/LogHub.cs
  3. 24 2
      WCS.WorkEngineering/Systems/AgvSystems.cs

+ 6 - 2
ServiceCenter/Extensions/TypeExtension.cs

@@ -1,4 +1,5 @@
-using SqlSugar;
+using Newtonsoft.Json;
+using SqlSugar;
 using System.Collections.Concurrent;
 using System.ComponentModel;
 using System.Data;
@@ -125,7 +126,10 @@ namespace ServiceCenter.Extensions
             return des;
         }
 
-
+        public static string JsonToString(this object value)
+        {
+            return JsonConvert.SerializeObject(value);
+        }
 
         /// <summary>
         /// 获取属性的描述信息

+ 49 - 15
ServiceCenter/Logs/LogHub.cs

@@ -2,10 +2,11 @@
 using ServiceCenter.Extensions;
 using ServiceCenter.Redis;
 using System.Collections.Concurrent;
+using WCS.Core;
 
 namespace ServiceCenter.Logs
 {
-    public class LogHub
+    public static class LogHub
     {
         /// <summary>
         ///  发布世界交互日志
@@ -40,6 +41,39 @@ namespace ServiceCenter.Logs
             }
         }
 
+        /// <summary>
+        ///   执行记录
+        /// </summary>
+        /// <param name="system">系统</param>
+        /// <param name="devCode">设备号</param>
+        /// <param name="msg">内容</param>
+        public static async void ExRecord(this SystemBase system, string devCode, string msg)
+        {
+            RedisHub.Default.RPush($"{system.World.Description}:{devCode}", msg);
+        }
+
+        /// <summary>
+        ///   执行记录
+        /// </summary>
+        /// <param name="system">系统</param>
+        /// <param name="devCode">设备号</param>
+        /// <param name="msg">内容</param>
+        public static async void ExRecord(this SystemBase system, string devCode, string msg, List<int> ints)
+        {
+            RedisHub.Default.RPush($"{system.World.Description}:{devCode}", msg + ints.JsonToString());
+        }
+
+        /// <summary>
+        ///   执行记录
+        /// </summary>
+        /// <param name="system">系统</param>
+        /// <param name="devCode">设备号</param>
+        /// <param name="msg">内容</param>
+        public static async void ExRecord(this SystemBase system, string devCode, string msg, List<string> ints)
+        {
+            RedisHub.Default.RPush($"{system.World.Description}:{devCode}", msg + ints.JsonToString());
+        }
+
         /// <summary>
         ///  发布一条日志记录
         /// </summary>
@@ -55,29 +89,29 @@ namespace ServiceCenter.Logs
             }));
         }
 
+        /// <summary>
+        ///  初始化日志处理进程
+        /// </summary>
         public static void init()
         {
             while (true)
             {
-                var logHub = RedisHub.Default.LPop("LogHub");
+                var logHub = RedisHub.Default.BLPop("LogHub", 0);
                 LogModel log = new LogModel();
 
                 try
                 {
-                    if (logHub != null)
+                    log = JsonConvert.DeserializeObject<LogModel>(logHub);
+                    if (log != null)
                     {
-                        log = JsonConvert.DeserializeObject<LogModel>(logHub);
-                        if (log != null)
-                        {
-                            if (!Directory.Exists(log.path)) Directory.CreateDirectory(log.path);
-                            //FileInfo fileInfo = new FileInfo(Path.Combine(log.path, log.Title));
-                            //if (fileInfo.Length > 5000)
-                            //{
-                            //    var title = log.Title.Split(".");
-                            //    File.Move(log.Title, title[0] + "" + title[1]);
-                            //}
-                            File.AppendAllText(Path.Combine(log.path, log.Title), log.Con);
-                        }
+                        if (!Directory.Exists(log.path)) Directory.CreateDirectory(log.path);
+                        //FileInfo fileInfo = new FileInfo(Path.Combine(log.path, log.Title));
+                        //if (fileInfo.Length > 5000)
+                        //{
+                        //    var title = log.Title.Split(".");
+                        //    File.Move(log.Title, title[0] + "" + title[1]);
+                        //}
+                        File.AppendAllText(Path.Combine(log.path, log.Title), log.Con);
                     }
                 }
                 catch (Exception ex)

+ 24 - 2
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -44,14 +44,18 @@ namespace WCS.WorkEngineering.Systems
                     var agvTaks = 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)
                     {
                         //取货点安全交互
                         if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
                         {
+                            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)
@@ -75,6 +79,7 @@ namespace WCS.WorkEngineering.Systems
                                     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);
                                 }
                                 catch (Exception ex)
@@ -87,6 +92,7 @@ namespace WCS.WorkEngineering.Systems
                             {
                                 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)
@@ -114,6 +120,7 @@ namespace WCS.WorkEngineering.Systems
                 foreach (var item in taskInfos)
                 {
                     WmsApi.CompleteTask(item.ID);
+                    this.ExRecord(obj.Entity.Code, $"任务{item}上报WMS完成");
                 }
             }
             else if (obj.Entity.HasFlag(DeviceFlags.入库))
@@ -122,7 +129,7 @@ namespace WCS.WorkEngineering.Systems
                 {
                     //获取所有未结束的入库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)
                     {
                         //找到对应WCS任务
@@ -130,16 +137,20 @@ namespace WCS.WorkEngineering.Systems
                         if (task == null)
                         {
                             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}]");
 
                         #region 开始跟据AGV状态做出处理
 
+                        this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}开始进行巷道分配");
                         //巷道分配
                         if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agv.Status != AGVTaskStatus.Complete1)
                         {
                             //向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();
 
                             //开始获取堆垛机与可用站台信息
@@ -153,13 +164,14 @@ namespace WCS.WorkEngineering.Systems
                                 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.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
                                               .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
+                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID},可用堆垛机{srm.Entity.Code}");
                             }
                             else //二楼
                             {
@@ -168,12 +180,14 @@ namespace WCS.WorkEngineering.Systems
                             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())
                             {
@@ -196,6 +210,7 @@ namespace WCS.WorkEngineering.Systems
                             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);
                         }
@@ -222,32 +237,38 @@ namespace WCS.WorkEngineering.Systems
                             if (dev.Data.VoucherNo != dev.Data2.VoucherNo)
                             {
                                 World.Log($"AGV请求放货,但{obj.Entity.Code}凭证号不一致", LogLevelEnum.Mid);
+                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但凭证号不一致");
                                 continue;
                             }
                             if (!dev.Data3.Status.HasFlag(StatusEunm.Auto))
                             {
                                 World.Log($"AGV请求放货,但{obj.Entity.Code}不在自动状态", LogLevelEnum.Mid);
+                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但不在自动状态");
                                 continue;
                             }
                             if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status))
                             {
                                 World.Log($"AGV请求放货,但{obj.Entity.Code}光电有货", LogLevelEnum.Mid);
+                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但光电有货");
                                 continue;
                             }
                             if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status))
                             {
                                 World.Log($"AGV请求放货,但{obj.Entity.Code}任务有货", LogLevelEnum.Mid);
+                                this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}请求放货,但任务有货");
                                 continue;
                             }
                             if (dev.Data3.Status.HasFlag(StatusEunm.Run))
                             {
                                 World.Log($"AGV请求放货,但{obj.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;
                         }
                         //完成任务
@@ -255,6 +276,7 @@ namespace WCS.WorkEngineering.Systems
                         {
                             agv.Status = AGVTaskStatus.MissionCompleted;
                             db.Default.Updateable(agv).SplitTable().ExecuteCommand();
+                            this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}完成");
                         }
 
                         #endregion 开始跟据AGV状态做出处理