From e86cc463e1a488744ae85e679344d5188fa8b913 Mon Sep 17 00:00:00 2001 From: icewint Date: Fri, 21 Jun 2024 09:30:10 +0800 Subject: [PATCH] =?UTF-8?q?[important]=E6=B7=BB=E5=8A=A0=E6=8C=89?= =?UTF-8?q?=E6=97=B6=E6=89=A7=E8=A1=8C=E4=BB=BB=E5=8A=A1=E7=9A=84=E6=94=AF?= =?UTF-8?q?=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => Attribute}/CirculationAttribute.cs | 4 +- .../Attribute/CirculationTimeAttribute.cs | 47 ++++++++++ Tools/CirculateTool/Entity/TimeTask.cs | 36 ++++++++ Tools/CirculateTool/StartCirculation.cs | 87 +++++++++++++++++-- .../ConnectPlcWithCirculation.cs | 2 +- .../CommonCirculation/DataClear.cs | 4 +- .../CommonCirculation/HeartBeat.cs | 2 +- .../CirculationTask/Convey/ReadScanCode.cs | 2 +- .../CirculationTask/ElTag/LightElTag.cs | 2 +- .../CirculationTask/ElTag/OffElTag.cs | 2 +- .../CirculationTask/Stacker/CheckAccount.cs | 2 +- .../Stacker/ExeTaskDoubleFork.cs | 2 +- .../CirculationTask/Stacker/ExecuteWcsTask.cs | 2 +- .../StackerConvey/CheckAccount.cs | 2 +- .../StackerConvey/ExecuteScanMethod.cs | 2 +- .../TaskData/ResolveWmsTask.cs | 2 +- WcsMain/Plugins/WcsCirculation.cs | 1 + 17 files changed, 177 insertions(+), 24 deletions(-) rename Tools/CirculateTool/{ => Attribute}/CirculationAttribute.cs (88%) create mode 100644 Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs create mode 100644 Tools/CirculateTool/Entity/TimeTask.cs diff --git a/Tools/CirculateTool/CirculationAttribute.cs b/Tools/CirculateTool/Attribute/CirculationAttribute.cs similarity index 88% rename from Tools/CirculateTool/CirculationAttribute.cs rename to Tools/CirculateTool/Attribute/CirculationAttribute.cs index a821bc6..eb03347 100644 --- a/Tools/CirculateTool/CirculationAttribute.cs +++ b/Tools/CirculateTool/Attribute/CirculationAttribute.cs @@ -1,4 +1,4 @@ -namespace CirculateTool; +namespace CirculateTool.Attribute; /// /// 一个类里面的方法加上这个特性就表示需要被循环执行 @@ -10,7 +10,7 @@ /// 方法描述 /// 方法描述 [AttributeUsage(AttributeTargets.All)] -public class CirculationAttribute(string? methodDescription = null, int circulationTime = 500, string[]? tags = null) : Attribute +public class CirculationAttribute(string? methodDescription = null, int circulationTime = 500, string[]? tags = null) : System.Attribute { /// diff --git a/Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs b/Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs new file mode 100644 index 0000000..3acf175 --- /dev/null +++ b/Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CirculateTool.Attribute; + +/// +/// 在指定时间执行的任务 +/// +/// +/// +/// +/// +/// 只能加载公共 void 方法上, +/// 不得与同时使用,若同时使用则此项不生效 +/// +[AttributeUsage(AttributeTargets.Method)] +public class CirculationTimeAttribute(string[] times, string? methodDescription = null, string[]? tags = null) : System.Attribute +{ + /// + /// 定时执行的时间 + /// + /// 12:00 + /// + /// 格式必须为:HH:mm,例如:12:00,其他格式将无效 + /// + public string[] Times { get; } = times; + + /// + /// 描述 + /// + public string? MethodDescription { get; } = methodDescription; + + /// + /// 标签 + /// + public string[]? Tags { get; } = tags; + + + public override string ToString() + { + return string.Join(",", Times); + } + +} diff --git a/Tools/CirculateTool/Entity/TimeTask.cs b/Tools/CirculateTool/Entity/TimeTask.cs new file mode 100644 index 0000000..8fcb68d --- /dev/null +++ b/Tools/CirculateTool/Entity/TimeTask.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CirculateTool.Entity; + +/// +/// 按时执行的任务的定时类 +/// +internal class TimeTask +{ + /// + /// 执行任务的时间 + /// + public string? ExecuteTime { get; set; } + + /// + /// 任务 + /// + public Action? Action { get; set; } + + /// + /// 描述 + /// + public string? Description { get; set; } + + /// + /// 是否已经执行 + /// + public bool IsRun { get; set; } = false; + + + +} diff --git a/Tools/CirculateTool/StartCirculation.cs b/Tools/CirculateTool/StartCirculation.cs index d7babef..d4483c5 100644 --- a/Tools/CirculateTool/StartCirculation.cs +++ b/Tools/CirculateTool/StartCirculation.cs @@ -1,4 +1,6 @@ using System.Reflection; +using CirculateTool.Attribute; +using CirculateTool.Entity; namespace CirculateTool; /* @@ -14,6 +16,10 @@ namespace CirculateTool; /// public class StartCirculation { + /// + /// 指定时间执行的方法类 + /// + private static List _timeTasks = []; /// /// 触发的异常 @@ -39,7 +45,7 @@ public class StartCirculation /// /// /// - public virtual void StartAssemblyCirculation(Assembly assembly, object[]? instanceParams = null) + public void StartAssemblyCirculation(Assembly assembly, object[]? instanceParams = null) { Type[] types = assembly.GetTypes(); if (types.Length == 0) return; @@ -65,20 +71,45 @@ public class StartCirculation var methods = type.GetMethods(); foreach (var method in methods) { - var attributes = method.GetCustomAttributes(false); - foreach (var attribute in attributes) + object[] attributes = method.GetCustomAttributes(false); + if(attributes.Length == 0) continue; + foreach (object attribute in attributes) { - if (attribute is not CirculationAttribute needDurable) continue; - string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}"; - bool Action() => (bool)(method.Invoke(Activator.CreateInstance(type, instanceParams), []) ?? false); - StartTask(Action, methodDescription, needDurable.CirculationTime); - break; + if(attribute == default) continue; + /* 定时执行的任务 */ + if(attribute is CirculationAttribute needDurable) + { + string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}"; + bool Action() => (bool)(method.Invoke(Activator.CreateInstance(type, instanceParams), []) ?? false); + StartTask(Action, methodDescription, needDurable.CirculationTime); + break; + } + /* 每天指定时间执行 */ + if (attribute is CirculationTimeAttribute timeCirculate) + { + string methodDescription = timeCirculate.MethodDescription ?? $"{type.Name}.{method.Name}"; + MessageHandler?.Invoke($"定时器任务:{methodDescription},已经添加,执行时间为:{timeCirculate}"); + foreach (var time in timeCirculate.Times) + { + _timeTasks.Add(new TimeTask + { + ExecuteTime = time, + Action = () => method.Invoke(Activator.CreateInstance(type, instanceParams), []), + Description = methodDescription, + IsRun = false + }); + } + } + /* END */ + } } + /* 执行按时执行的任务 ---- 方法内判断,若没有此类方法则不会执行 */ + StartTimeTask(); } /// - /// 开启一个方法 + /// 开启一个方法 ---- 隔一定时间执行一次 /// /// /// @@ -107,4 +138,42 @@ public class StartCirculation } } } + + /// + /// 执行按时间执行的任务 + /// + public virtual async void StartTimeTask() + { + if(_timeTasks.Count == 0) return; + CancellationTokenSource cts = new(); + PeriodicTimer timer = new(new TimeSpan(0, 0, 0, 10, 0)); + while (await timer.WaitForNextTickAsync(cts.Token)) + { + string timeStr = DateTime.Now.ToString("HH:mm"); + List taskList = []; + taskList.Add(Task.Factory.StartNew(() => + { + foreach (var task in _timeTasks) + { + if (task.ExecuteTime != timeStr) + { + task.IsRun = false; // 当时刻不匹配时,重置任务状态 + } + if (task.ExecuteTime == timeStr && !task.IsRun) // 当时间匹配且任务未执行时,执行任务 + { + try + { + task.Action?.Invoke(); + task.IsRun = true; + } + catch (Exception ex) + { + ExceptionHandler?.Invoke(task.Description ?? task.Action!.Method.Name, ex); + } + } + } + })); + Task.WaitAll([.. taskList]); + } + } } \ No newline at end of file diff --git a/WcsMain/Business/CirculationTask/CommonCirculation/ConnectPlcWithCirculation.cs b/WcsMain/Business/CirculationTask/CommonCirculation/ConnectPlcWithCirculation.cs index 7eb112a..a4e6cd4 100644 --- a/WcsMain/Business/CirculationTask/CommonCirculation/ConnectPlcWithCirculation.cs +++ b/WcsMain/Business/CirculationTask/CommonCirculation/ConnectPlcWithCirculation.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Common; using WcsMain.EquipOperation; diff --git a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs index 2a8b8dd..601e7e2 100644 --- a/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs +++ b/WcsMain/Business/CirculationTask/CommonCirculation/DataClear.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.CommonAction; namespace WcsMain.Business.CirculationTask.CommonCirculation; @@ -49,7 +49,7 @@ public class DataClear(ClearData clearData) // 清理扫码记录表 -- 保留多少天 int clearScanRecord = clearData.ClearScanRecordData(15); - ConsoleLog.Tip(clearScanRecord > 0, $"[数据清理]清理扫码记录:{apiWmsTaskCount}"); + ConsoleLog.Tip(clearScanRecord > 0, $"[数据清理]清理扫码记录:{clearScanRecord}"); } catch (Exception ex) diff --git a/WcsMain/Business/CirculationTask/CommonCirculation/HeartBeat.cs b/WcsMain/Business/CirculationTask/CommonCirculation/HeartBeat.cs index a1dc937..64092c6 100644 --- a/WcsMain/Business/CirculationTask/CommonCirculation/HeartBeat.cs +++ b/WcsMain/Business/CirculationTask/CommonCirculation/HeartBeat.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.EquipOperation.Convey; namespace WcsMain.Business.CirculationTask.CommonCirculation; diff --git a/WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs b/WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs index 089934a..6117e1b 100644 --- a/WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs +++ b/WcsMain/Business/CirculationTask/Convey/ReadScanCode.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.Convey.HistoryDataHandler; using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; diff --git a/WcsMain/Business/CirculationTask/ElTag/LightElTag.cs b/WcsMain/Business/CirculationTask/ElTag/LightElTag.cs index 23fa008..6822df3 100644 --- a/WcsMain/Business/CirculationTask/ElTag/LightElTag.cs +++ b/WcsMain/Business/CirculationTask/ElTag/LightElTag.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using LedSimple; using WcsMain.Common; using WcsMain.DataBase.Dao; diff --git a/WcsMain/Business/CirculationTask/ElTag/OffElTag.cs b/WcsMain/Business/CirculationTask/ElTag/OffElTag.cs index 41e1857..1038b75 100644 --- a/WcsMain/Business/CirculationTask/ElTag/OffElTag.cs +++ b/WcsMain/Business/CirculationTask/ElTag/OffElTag.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Common; using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; diff --git a/WcsMain/Business/CirculationTask/Stacker/CheckAccount.cs b/WcsMain/Business/CirculationTask/Stacker/CheckAccount.cs index 1f2f639..9af80f0 100644 --- a/WcsMain/Business/CirculationTask/Stacker/CheckAccount.cs +++ b/WcsMain/Business/CirculationTask/Stacker/CheckAccount.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.CommonAction; using WcsMain.Common; using WcsMain.DataBase.Dao; diff --git a/WcsMain/Business/CirculationTask/Stacker/ExeTaskDoubleFork.cs b/WcsMain/Business/CirculationTask/Stacker/ExeTaskDoubleFork.cs index a4650bb..743584a 100644 --- a/WcsMain/Business/CirculationTask/Stacker/ExeTaskDoubleFork.cs +++ b/WcsMain/Business/CirculationTask/Stacker/ExeTaskDoubleFork.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.CommonAction; using WcsMain.Common; using WcsMain.DataBase.Dao; diff --git a/WcsMain/Business/CirculationTask/Stacker/ExecuteWcsTask.cs b/WcsMain/Business/CirculationTask/Stacker/ExecuteWcsTask.cs index c3b2494..1d79ca3 100644 --- a/WcsMain/Business/CirculationTask/Stacker/ExecuteWcsTask.cs +++ b/WcsMain/Business/CirculationTask/Stacker/ExecuteWcsTask.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.CommonAction; using WcsMain.Common; using WcsMain.DataBase.Dao; diff --git a/WcsMain/Business/CirculationTask/StackerConvey/CheckAccount.cs b/WcsMain/Business/CirculationTask/StackerConvey/CheckAccount.cs index 504de8d..7f270b3 100644 --- a/WcsMain/Business/CirculationTask/StackerConvey/CheckAccount.cs +++ b/WcsMain/Business/CirculationTask/StackerConvey/CheckAccount.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.Business.CommonAction; using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; diff --git a/WcsMain/Business/CirculationTask/StackerConvey/ExecuteScanMethod.cs b/WcsMain/Business/CirculationTask/StackerConvey/ExecuteScanMethod.cs index a6b78ea..2772b71 100644 --- a/WcsMain/Business/CirculationTask/StackerConvey/ExecuteScanMethod.cs +++ b/WcsMain/Business/CirculationTask/StackerConvey/ExecuteScanMethod.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; namespace WcsMain.Business.CirculationTask.StackerConvey; diff --git a/WcsMain/Business/CirculationTask/TaskData/ResolveWmsTask.cs b/WcsMain/Business/CirculationTask/TaskData/ResolveWmsTask.cs index 9ca934a..ea10a82 100644 --- a/WcsMain/Business/CirculationTask/TaskData/ResolveWmsTask.cs +++ b/WcsMain/Business/CirculationTask/TaskData/ResolveWmsTask.cs @@ -1,4 +1,4 @@ -using CirculateTool; +using CirculateTool.Attribute; using WcsMain.ExtendMethod; using WcsMain.DataBase.Dao; using WcsMain.DataBase.TableEntity; diff --git a/WcsMain/Plugins/WcsCirculation.cs b/WcsMain/Plugins/WcsCirculation.cs index 8a5bd89..6036563 100644 --- a/WcsMain/Plugins/WcsCirculation.cs +++ b/WcsMain/Plugins/WcsCirculation.cs @@ -1,4 +1,5 @@ using Autofac; +using CirculateTool.Attribute; using CirculateTool; using WcsMain.WcsAttribute.AutoFacAttribute;