feat: 新增操作日志功能并优化定时任务配置
1. 新增OperationLogAttribute与OperationLogActionFilter,实现自动化操作日志记录 2. 新增OperationLogRecordInput输入模型,重构IOperationLogService日志接口 3. 为所有业务控制器接口添加操作日志注解 4. 调整期刊AI批改任务的执行周期与方法适配异步调用 5. 优化Hangfire定时任务注册逻辑,支持异步任务 6. 补充完善操作日志类型与目标类型枚举
This commit is contained in:
@ -123,9 +123,22 @@ if (jobSettings?.Jobs != null)
|
||||
|
||||
var param = Expression.Parameter(jobType, "job");
|
||||
var call = Expression.Call(param, method);
|
||||
var lambda = Expression.Lambda<Action>(call, param);
|
||||
if (method.ReturnType == typeof(void))
|
||||
{
|
||||
var lambda = Expression.Lambda(typeof(Action<>).MakeGenericType(jobType), call, param);
|
||||
InvokeRecurringJobAddOrUpdate(jobType, typeof(Action<>), job.Name, lambda, job.Cron);
|
||||
}
|
||||
else if (method.ReturnType == typeof(Task))
|
||||
{
|
||||
var lambda = Expression.Lambda(typeof(Func<,>).MakeGenericType(jobType, typeof(Task)), call, param);
|
||||
InvokeRecurringJobAddOrUpdate(jobType, typeof(Func<,>), job.Name, lambda, job.Cron);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Warning("定时任务 [{Name}] 方法返回类型不支持 {ReturnType},跳过注册", job.Name, method.ReturnType);
|
||||
continue;
|
||||
}
|
||||
|
||||
RecurringJob.AddOrUpdate(job.Name, lambda, job.Cron);
|
||||
Log.Information("定时任务 [{Name}] 已注册,Cron: {Cron}", job.Name, job.Cron);
|
||||
}
|
||||
}
|
||||
@ -133,3 +146,27 @@ if (jobSettings?.Jobs != null)
|
||||
Log.Information("WorkService 已启动,Hangfire Dashboard: /hangfire");
|
||||
|
||||
app.Run();
|
||||
|
||||
static void InvokeRecurringJobAddOrUpdate(Type jobType, Type delegateGenericTypeDefinition, string jobName, LambdaExpression lambda, string cron)
|
||||
{
|
||||
var method = typeof(RecurringJob).GetMethods()
|
||||
.Where(m => m.Name == nameof(RecurringJob.AddOrUpdate) && m.IsGenericMethodDefinition)
|
||||
.First(m =>
|
||||
{
|
||||
var parameters = m.GetParameters();
|
||||
if (parameters.Length != 3
|
||||
|| parameters[0].ParameterType != typeof(string)
|
||||
|| parameters[2].ParameterType != typeof(string)
|
||||
|| !parameters[1].ParameterType.IsGenericType
|
||||
|| parameters[1].ParameterType.GetGenericTypeDefinition() != typeof(Expression<>))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var expressionArgument = parameters[1].ParameterType.GetGenericArguments()[0];
|
||||
return expressionArgument.IsGenericType
|
||||
&& expressionArgument.GetGenericTypeDefinition() == delegateGenericTypeDefinition;
|
||||
});
|
||||
|
||||
method.MakeGenericMethod(jobType).Invoke(null, [jobName, lambda, cron]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user