<update>[important]添加按时执行任务的支持
This commit is contained in:
parent
e340de9a51
commit
e86cc463e1
|
|
@ -1,4 +1,4 @@
|
||||||
namespace CirculateTool;
|
namespace CirculateTool.Attribute;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 一个类里面的方法加上这个特性就表示需要被循环执行
|
/// 一个类里面的方法加上这个特性就表示需要被循环执行
|
||||||
|
|
@ -10,7 +10,7 @@
|
||||||
/// <param name="methodDescription">方法描述</param>
|
/// <param name="methodDescription">方法描述</param>
|
||||||
/// <param name="tags">方法描述</param>
|
/// <param name="tags">方法描述</param>
|
||||||
[AttributeUsage(AttributeTargets.All)]
|
[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
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
47
Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs
Normal file
47
Tools/CirculateTool/Attribute/CirculationTimeAttribute.cs
Normal file
|
|
@ -0,0 +1,47 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CirculateTool.Attribute;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 在指定时间执行的任务
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="times"></param>
|
||||||
|
/// <param name="methodDescription"></param>
|
||||||
|
/// <param name="tags"></param>
|
||||||
|
/// <remarks>
|
||||||
|
/// 只能加载公共 void 方法上,
|
||||||
|
/// 不得与<see cref="CirculationAttribute"/>同时使用,若同时使用则此项不生效
|
||||||
|
/// </remarks>
|
||||||
|
[AttributeUsage(AttributeTargets.Method)]
|
||||||
|
public class CirculationTimeAttribute(string[] times, string? methodDescription = null, string[]? tags = null) : System.Attribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 定时执行的时间
|
||||||
|
/// </summary>
|
||||||
|
/// <example>12:00</example>
|
||||||
|
/// <remarks>
|
||||||
|
/// 格式必须为:HH:mm,例如:12:00,其他格式将无效
|
||||||
|
/// </remarks>
|
||||||
|
public string[] Times { get; } = times;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 描述
|
||||||
|
/// </summary>
|
||||||
|
public string? MethodDescription { get; } = methodDescription;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 标签
|
||||||
|
/// </summary>
|
||||||
|
public string[]? Tags { get; } = tags;
|
||||||
|
|
||||||
|
|
||||||
|
public override string ToString()
|
||||||
|
{
|
||||||
|
return string.Join(",", Times);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
36
Tools/CirculateTool/Entity/TimeTask.cs
Normal file
36
Tools/CirculateTool/Entity/TimeTask.cs
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace CirculateTool.Entity;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 按时执行的任务的定时类
|
||||||
|
/// </summary>
|
||||||
|
internal class TimeTask
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 执行任务的时间
|
||||||
|
/// </summary>
|
||||||
|
public string? ExecuteTime { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 任务
|
||||||
|
/// </summary>
|
||||||
|
public Action? Action { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 描述
|
||||||
|
/// </summary>
|
||||||
|
public string? Description { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 是否已经执行
|
||||||
|
/// </summary>
|
||||||
|
public bool IsRun { get; set; } = false;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -1,4 +1,6 @@
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
using CirculateTool.Attribute;
|
||||||
|
using CirculateTool.Entity;
|
||||||
|
|
||||||
namespace CirculateTool;
|
namespace CirculateTool;
|
||||||
/*
|
/*
|
||||||
|
|
@ -14,6 +16,10 @@ namespace CirculateTool;
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class StartCirculation
|
public class StartCirculation
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 指定时间执行的方法类
|
||||||
|
/// </summary>
|
||||||
|
private static List<TimeTask> _timeTasks = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 触发的异常
|
/// 触发的异常
|
||||||
|
|
@ -39,7 +45,7 @@ public class StartCirculation
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="assembly"></param>
|
/// <param name="assembly"></param>
|
||||||
/// <param name="instanceParams"></param>
|
/// <param name="instanceParams"></param>
|
||||||
public virtual void StartAssemblyCirculation(Assembly assembly, object[]? instanceParams = null)
|
public void StartAssemblyCirculation(Assembly assembly, object[]? instanceParams = null)
|
||||||
{
|
{
|
||||||
Type[] types = assembly.GetTypes();
|
Type[] types = assembly.GetTypes();
|
||||||
if (types.Length == 0) return;
|
if (types.Length == 0) return;
|
||||||
|
|
@ -65,20 +71,45 @@ public class StartCirculation
|
||||||
var methods = type.GetMethods();
|
var methods = type.GetMethods();
|
||||||
foreach (var method in methods)
|
foreach (var method in methods)
|
||||||
{
|
{
|
||||||
var attributes = method.GetCustomAttributes(false);
|
object[] attributes = method.GetCustomAttributes(false);
|
||||||
foreach (var attribute in attributes)
|
if(attributes.Length == 0) continue;
|
||||||
|
foreach (object attribute in attributes)
|
||||||
|
{
|
||||||
|
if(attribute == default) continue;
|
||||||
|
/* 定时执行的任务 */
|
||||||
|
if(attribute is CirculationAttribute needDurable)
|
||||||
{
|
{
|
||||||
if (attribute is not CirculationAttribute needDurable) continue;
|
|
||||||
string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}";
|
string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}";
|
||||||
bool Action() => (bool)(method.Invoke(Activator.CreateInstance(type, instanceParams), []) ?? false);
|
bool Action() => (bool)(method.Invoke(Activator.CreateInstance(type, instanceParams), []) ?? false);
|
||||||
StartTask(Action, methodDescription, needDurable.CirculationTime);
|
StartTask(Action, methodDescription, needDurable.CirculationTime);
|
||||||
break;
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 开启一个方法
|
/// 开启一个方法 ---- 隔一定时间执行一次
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="action"></param>
|
/// <param name="action"></param>
|
||||||
/// <param name="description"></param>
|
/// <param name="description"></param>
|
||||||
|
|
@ -107,4 +138,42 @@ public class StartCirculation
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 执行按时间执行的任务
|
||||||
|
/// </summary>
|
||||||
|
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<Task> 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]);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.EquipOperation;
|
using WcsMain.EquipOperation;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.CommonAction;
|
using WcsMain.Business.CommonAction;
|
||||||
|
|
||||||
namespace WcsMain.Business.CirculationTask.CommonCirculation;
|
namespace WcsMain.Business.CirculationTask.CommonCirculation;
|
||||||
|
|
@ -49,7 +49,7 @@ public class DataClear(ClearData clearData)
|
||||||
|
|
||||||
// 清理扫码记录表 -- 保留多少天
|
// 清理扫码记录表 -- 保留多少天
|
||||||
int clearScanRecord = clearData.ClearScanRecordData(15);
|
int clearScanRecord = clearData.ClearScanRecordData(15);
|
||||||
ConsoleLog.Tip(clearScanRecord > 0, $"[数据清理]清理扫码记录:{apiWmsTaskCount}");
|
ConsoleLog.Tip(clearScanRecord > 0, $"[数据清理]清理扫码记录:{clearScanRecord}");
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.EquipOperation.Convey;
|
using WcsMain.EquipOperation.Convey;
|
||||||
|
|
||||||
namespace WcsMain.Business.CirculationTask.CommonCirculation;
|
namespace WcsMain.Business.CirculationTask.CommonCirculation;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.Convey.HistoryDataHandler;
|
using WcsMain.Business.Convey.HistoryDataHandler;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
using WcsMain.DataBase.TableEntity;
|
using WcsMain.DataBase.TableEntity;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using LedSimple;
|
using LedSimple;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
using WcsMain.DataBase.TableEntity;
|
using WcsMain.DataBase.TableEntity;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.CommonAction;
|
using WcsMain.Business.CommonAction;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.CommonAction;
|
using WcsMain.Business.CommonAction;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.CommonAction;
|
using WcsMain.Business.CommonAction;
|
||||||
using WcsMain.Common;
|
using WcsMain.Common;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.Business.CommonAction;
|
using WcsMain.Business.CommonAction;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
using WcsMain.DataBase.TableEntity;
|
using WcsMain.DataBase.TableEntity;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
|
|
||||||
namespace WcsMain.Business.CirculationTask.StackerConvey;
|
namespace WcsMain.Business.CirculationTask.StackerConvey;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
using CirculateTool;
|
using CirculateTool.Attribute;
|
||||||
using WcsMain.ExtendMethod;
|
using WcsMain.ExtendMethod;
|
||||||
using WcsMain.DataBase.Dao;
|
using WcsMain.DataBase.Dao;
|
||||||
using WcsMain.DataBase.TableEntity;
|
using WcsMain.DataBase.TableEntity;
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
using Autofac;
|
using Autofac;
|
||||||
|
using CirculateTool.Attribute;
|
||||||
using CirculateTool;
|
using CirculateTool;
|
||||||
using WcsMain.WcsAttribute.AutoFacAttribute;
|
using WcsMain.WcsAttribute.AutoFacAttribute;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user