林豪 左 2 years ago
parent
commit
9ad3e09e8c

+ 94 - 0
Projects/永冠OPP/WCS.Service/Helpers/DeviceTaskTimeHelper.cs

@@ -0,0 +1,94 @@
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using WCS.Entity.Protocol;
+using WCS.Service.Extensions;
+using WCS.Service.Log;
+
+namespace WCS.Service.Helpers
+{
+    /// <summary>
+    /// 设备任务时长统计
+    /// </summary>
+    public static class DeviceTaskTimeHelper
+    {
+        public static List<DeviceTaskTimeViewModel> deviceTaskTimes = new List<DeviceTaskTimeViewModel>();
+
+        /// <summary>
+        /// 添加AGV开始记录
+        /// </summary>
+        public static void Add(this RGVDevice rgv)
+        {
+            if (deviceTaskTimes.Any(v => v.DeviceCode == rgv.Entity.CODE)) return;
+
+            deviceTaskTimes.Add(new DeviceTaskTimeViewModel
+            {
+                DeviceCode = rgv.Entity.CODE,
+                StartTime = DateTime.Now,
+                TaskType = rgv.Data.TaskType_1.ToString(),
+                StartAdd = rgv.CurrentStation().Entity.CODE,
+                EndAdd = rgv.Data.DestPosition_1.ToString(),
+            });
+        }
+
+        /// <summary>
+        /// 添加AGV开始记录
+        /// </summary>
+        public static void End(this RGVDevice rgv)
+        {
+            if (rgv.Data2.Status_1.HasFlag(RGVStatus.RGV到站) && rgv.Data2.Status_1.HasFlag(RGVStatus.任务完成) && deviceTaskTimes.Any(v => v.DeviceCode == rgv.Entity.CODE && v.TaskType == rgv.Data2.TaskType_1.ToString()))
+            {
+                var deviceTaskTime= deviceTaskTimes.Find(v => v.DeviceCode == rgv.Entity.CODE);
+                deviceTaskTime.EndTime= DateTime.Now;
+                deviceTaskTime.SumTime = (deviceTaskTime.StartTime - deviceTaskTime.EndTime).TotalSeconds;
+                InfoLog.INFO_DEVICETASKTIME(JsonConvert.SerializeObject(deviceTaskTime));
+                deviceTaskTimes.Remove(deviceTaskTime);
+            }
+        }
+    }
+
+    /// <summary>
+    ///
+    /// </summary>
+    public class DeviceTaskTimeViewModel
+    {
+        /// <summary>
+        /// 设备号
+        /// </summary>
+        public string DeviceCode { get; set; }
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+
+        public DateTime StartTime { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+
+        public DateTime EndTime { get; set; }
+
+        /// <summary>
+        /// 总计时间
+        /// </summary>
+
+        public double SumTime { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        public string TaskType { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// </summary>
+        public string StartAdd { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        public string EndAdd { get; set; }
+    }
+}

+ 9 - 0
Projects/永冠OPP/WCS.Service/Log/InfoLog.cs

@@ -153,6 +153,15 @@ namespace WCS.Service.Log
             Log.Info(msg, "INFO_TIMING");
         }
 
+        /// <summary>
+        /// 设备任务时间计算
+        /// </summary>
+        /// <param name="msg"></param>
+        public static void INFO_DEVICETASKTIME(string msg)
+        {
+            Log.Info(msg, "INFO_DEVICETASKTIME");
+        }
+
         /// <summary>
         /// WCS异常上抛记录
         /// </summary>

+ 39 - 29
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -103,22 +103,26 @@ namespace WCS.Service.Works.RGV
                 if (rgvDevice.Data2.Trigger_1 != rgvDevice.Data.Trigger_1) throw new WarnException($"等待执行任务{rgvDevice.Data2.TaskID_1}--{rgvDevice.Data2.TaskID_2}");
                 if (rgvDevice.Data2.WorkMode != RGVMode.自动) throw new DoException(rgvDevice.Data2.WorkMode.ToString());
                 if (rgvDevice.Data2.SystemStatus != RGVRunStatus.空闲) throw new DoException(rgvDevice.Data2.SystemStatus.ToString());
+                rgvDevice.End();
                 //RGV当前是否刚刚完成取货任务,等待放货
                 if (rgvDevice.IsPut())
                 {
                     if (!rgvDevice.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV无光电,无法放货,请检查实际情况");
                     var taskids = new List<int>() { rgvDevice.Data2.TaskID_1, rgvDevice.Data2.TaskID_2 };
+                    List<WCS_TASK> tasks = new List<WCS_TASK>();
                     //取小车上的任务
                     DB.Do(db =>
                     {
-                        var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                        if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                            throw new WarnException("任务组ID不一致");
-                        if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                            throw new WarnException("无任务组ID");
-                        var destStation = Device.Find(tasks.FirstOrDefault()!.ADDRNEXT).Create<StationDeviceGroup>();
-                        rgvDevice.Put(destStation, rgvDevice.Data2.TaskID_1, rgvDevice.Data2.TaskID_2);
+                        tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID)).ToList();
                     });
+
+                    if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
+                        throw new WarnException("任务组ID不一致");
+                    if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
+                        throw new WarnException("无任务组ID");
+                    var destStation = Device.Find(tasks.FirstOrDefault()!.ADDRNEXT).Create<StationDeviceGroup>();
+                    rgvDevice.Put(destStation, rgvDevice.Data2.TaskID_1, rgvDevice.Data2.TaskID_2);
+                    rgvDevice.Add();
                     return;
                 }
                 //当前有rgv的取货站台
@@ -140,37 +144,39 @@ namespace WCS.Service.Works.RGV
                             if (rgvDevice.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
                             if (!rgvDevice.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");
                             var taskids = devise.Select(v => v.Data2.Tasknum);
-
+                            List<WCS_TASK> tasks = new List<WCS_TASK>();
                             //开始下达取货任务
                             DB.Do(db =>
                             {
-                                var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
-                                if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
-                                    throw new WarnException("任务组ID不一致");
-                                if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
-                                    throw new WarnException("无任务组ID");
-                                var gw1 = pickStation.Items.ToArray()[0];
-                                var gw2 = pickStation.Items.ToArray()[1];
-                                if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
-                                {
-                                    if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{rgvDevice.Entity.CODE}目标地址不一致");
-                                }
-
-                                InfoLog.INFO_RGVINFO($"[{rgvDevice.Entity.CODE}]--写入RGV取货任务-开始:{rgvDevice.Data.TaskID_1},{rgvDevice.Data.TaskID_2},{rgvDevice.Data.TaskType_1},{rgvDevice.Data.DestPosition_1},{rgvDevice.Data.Trigger_1}");
-                                rgvDevice.Data.TaskID_1 = gw1.Data2.Tasknum;
-                                rgvDevice.Data.TaskID_2 = gw2.Data2.Tasknum;
-                                rgvDevice.Data.TaskType_1 = RGVTaskType.取货;
-                                rgvDevice.Data.DestPosition_1 = pickStation.Entity.CODE.Replace("G", "").ToShort();
-                                InfoLog.INFO_RGVINFO($"[{rgvDevice.Entity.CODE}]--写入RGV取货任务-结束:{rgvDevice.Data.TaskID_1},{rgvDevice.Data.TaskID_2},{rgvDevice.Data.TaskType_1},{rgvDevice.Data.DestPosition_1},{rgvDevice.Data.Trigger_1}");
-
-                                rgvDevice.Data.Trigger_1++;
+                                tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID)).ToList();
+                            });
+                            if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
+                                throw new WarnException("任务组ID不一致");
+                            if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
+                                throw new WarnException("无任务组ID");
+                            var gw1 = pickStation.Items.ToArray()[0];
+                            var gw2 = pickStation.Items.ToArray()[1];
+                            if (gw1.Data2.Tasknum != 0 && gw2.Data2.Tasknum != 0)
+                            {
+                                if (gw1.Data2.Goodsend != gw2.Data2.Goodsend) throw new WarnException($"{rgvDevice.Entity.CODE}目标地址不一致");
+                            }
 
+                            InfoLog.INFO_RGVINFO($"[{rgvDevice.Entity.CODE}]--写入RGV取货任务-开始:{rgvDevice.Data.TaskID_1},{rgvDevice.Data.TaskID_2},{rgvDevice.Data.TaskType_1},{rgvDevice.Data.DestPosition_1},{rgvDevice.Data.Trigger_1}");
+                            rgvDevice.Data.TaskID_1 = gw1.Data2.Tasknum;
+                            rgvDevice.Data.TaskID_2 = gw2.Data2.Tasknum;
+                            rgvDevice.Data.TaskType_1 = RGVTaskType.取货;
+                            rgvDevice.Data.DestPosition_1 = pickStation.Entity.CODE.Replace("G", "").ToShort();
+                            InfoLog.INFO_RGVINFO($"[{rgvDevice.Entity.CODE}]--写入RGV取货任务-结束:{rgvDevice.Data.TaskID_1},{rgvDevice.Data.TaskID_2},{rgvDevice.Data.TaskType_1},{rgvDevice.Data.DestPosition_1},{rgvDevice.Data.Trigger_1}");
+                            rgvDevice.Data.Trigger_1++;
+                            DB.Do(db =>
+                            {
                                 foreach (var task in tasks)
                                 {
                                     task.CreateStatusLog(db, $"取货任务下达至{rgvDevice.Entity.CODE}", this.GetType());
                                 }
                                 db.Default.SaveChanges();
                             });
+                            rgvDevice.Add();
                             return;
                         }
 
@@ -201,6 +207,7 @@ namespace WCS.Service.Works.RGV
                             if (station11Dev != null && station11Dev.Count > 0)
                             {
                                 rgvDevice.Move(station11);
+                                rgvDevice.Add();
                                 return;
                             }
                         }
@@ -237,12 +244,14 @@ namespace WCS.Service.Works.RGV
 
                             //写入移动任务
                             rgvDevice.Move(beforeStation);
+                            rgvDevice.Add();
                             return;
                         }
 
                         if (pickStation.Entity.CODE == "G11")
                         {
                             rgvDevice.Move(Device.Find("G2").Create<StationDeviceGroup>());
+                            rgvDevice.Add();
                             return;
                         }
                     }
@@ -252,6 +261,7 @@ namespace WCS.Service.Works.RGV
                     {
                         pickStation = rgvDevice.BeforeStation();
                         rgvDevice.Move(pickStation);
+                        rgvDevice.Add();
                         return;
                     }
                 }
@@ -262,6 +272,7 @@ namespace WCS.Service.Works.RGV
                 if (rgvDevice.RGVList.Any(v => v.Data2.SystemStatus != RGVRunStatus.空闲)) return;
                 pickStation = rgvDevice.BeforeStation();
                 rgvDevice.Move(pickStation);
+                rgvDevice.Add();
             });
         }
 
@@ -354,7 +365,6 @@ namespace WCS.Service.Works.RGV
                         //                  .Select(v => v.Create<StationDeviceGroup>())
                         //                  .OrderBy(v => pickStation.Distance(v))
                         //                  .FirstOrDefault();
-
                         //    //写入移动任务
                         //    obj.Move(beforeStation);
                         //    return;

+ 2 - 1
Projects/永冠OPP/WCS.Service/config.json

@@ -21,7 +21,8 @@
         "INFO_CREATETASKIN": "CreateTaskIn",
         "INFO_RGVINFO": "RgvInfo",
         "INFO_AGV": "info_agv",
-        "INFO_ERRORCHECK": "INFO_ErrorCheck"
+        "INFO_ERRORCHECK": "INFO_ErrorCheck",
+        "INFO_DEVICETASKTIME": "INFO_DeviceTaskTime"
       }
     },
     {