From f52bacd52cbc8f8250766d2910e638a8bf4dbcc8 Mon Sep 17 00:00:00 2001
From: hwh <332078369@qq.com>
Date: 星期六, 22 六月 2024 16:59:12 +0800
Subject: [PATCH] 调用内部代码的定时任务

---
 Wms/Utility/Job/SchedulerCenter.cs   |    7 +
 Wms/Utility/Entity/LogModel.cs       |    2 
 Wms/Utility/Job/HttpJob.cs           |    2 
 Wms/Utility/Job/JobBase.cs           |   38 +++++----
 Wms/Model/ModelVm/JobVm.cs           |   19 ++++
 Wms/Utility/Utility.csproj           |    1 
 Wms/Utility/Job/InternalMethodJob.cs |   93 +++++++++++++++++++++++
 Wms/Wms/Controllers/JobController.cs |   19 ++--
 Wms/Utility/Job/Constant.cs          |    4 +
 Wms/Utility/Entity/ScheduleEntity.cs |   14 +++
 10 files changed, 173 insertions(+), 26 deletions(-)

diff --git a/Wms/Model/ModelVm/JobVm.cs b/Wms/Model/ModelVm/JobVm.cs
new file mode 100644
index 0000000..30900fe
--- /dev/null
+++ b/Wms/Model/ModelVm/JobVm.cs
@@ -0,0 +1,19 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace Model.ModelVm
+{
+    public class JobVm
+    {
+        /// <summary>
+        /// 浠诲姟鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+        /// <summary>
+        /// 浠诲姟缁�
+        /// </summary>
+        public string Group { get; set; }
+    }
+}
diff --git a/Wms/Utility/Entity/LogModel.cs b/Wms/Utility/Entity/LogModel.cs
index 606ed9d..9becb8f 100644
--- a/Wms/Utility/Entity/LogModel.cs
+++ b/Wms/Utility/Entity/LogModel.cs
@@ -4,7 +4,7 @@
 
 namespace Utility.Entity
 {
-    public abstract class LogModel
+    public class LogModel
     {
         /// <summary>
         /// 寮�濮嬫墽琛屾椂闂�
diff --git a/Wms/Utility/Entity/ScheduleEntity.cs b/Wms/Utility/Entity/ScheduleEntity.cs
index cebe9a5..f83e83b 100644
--- a/Wms/Utility/Entity/ScheduleEntity.cs
+++ b/Wms/Utility/Entity/ScheduleEntity.cs
@@ -68,6 +68,20 @@
         public RequestTypeEnum RequestType { get; set; } = RequestTypeEnum.Post;
         #endregion
 
+        #region 鍐呯疆鏂规硶
+        /// <summary>
+        /// 绫诲悕
+        /// </summary>
+        public string ClassName { get; set; }
+        /// <summary>
+        /// 鏂规硶鍚�
+        /// </summary>
+        public string MethodName { get; set; }
+        /// <summary>
+        /// 鍙傛暟
+        /// </summary>
+        public string MethodParameters { get; set; }
+        #endregion
     }
 
     public class ModifyJobInput
diff --git a/Wms/Utility/Job/Constant.cs b/Wms/Utility/Job/Constant.cs
index 454e8f0..11b482a 100644
--- a/Wms/Utility/Job/Constant.cs
+++ b/Wms/Utility/Job/Constant.cs
@@ -57,5 +57,9 @@
         public static string Payload = "Payload";
         public static string BuiltIn = "BuiltIn";
 
+
+        public const string CLASSNAME = "ClassName";
+        public const string METHODNAME = "MethodName";
+        public const string METHODPARAMETERS = "MethodParameters";
     }
 }
diff --git a/Wms/Utility/Job/HttpJob.cs b/Wms/Utility/Job/HttpJob.cs
index 90a8381..d43c323 100644
--- a/Wms/Utility/Job/HttpJob.cs
+++ b/Wms/Utility/Job/HttpJob.cs
@@ -15,7 +15,7 @@
 {
     public class HttpJob : JobBase<LogUrlModel>, IJob
     {
-        public HttpJob(ILogger logger) : base(new LogUrlModel(), logger)
+        public HttpJob() : base(new LogUrlModel())
         { }
 
         public override async Task NextExecute(IJobExecutionContext context)
diff --git a/Wms/Utility/Job/InternalMethodJob.cs b/Wms/Utility/Job/InternalMethodJob.cs
new file mode 100644
index 0000000..454c46b
--- /dev/null
+++ b/Wms/Utility/Job/InternalMethodJob.cs
@@ -0,0 +1,93 @@
+锘縰sing Autofac;
+using AutoMapper;
+using Newtonsoft.Json;
+using Quartz;
+using Serilog;
+using System;
+using System.Collections.Generic;
+using System.Reflection;
+using System.Text;
+using System.Threading.Tasks;
+using Utility.Entity;
+
+namespace Utility.Job
+{
+    public class InternalMethodJob : JobBase<LogModel>, IJob
+    {
+
+        public InternalMethodJob() : base(new LogModel())
+        {
+
+        }
+
+        public override async Task NextExecute(IJobExecutionContext context)
+        {
+            // 鑾峰彇鐩稿叧鍙傛暟
+            var className = context.JobDetail.JobDataMap.GetString(Constant.CLASSNAME)?.Trim();
+            var methodName = context.JobDetail.JobDataMap.GetString(Constant.METHODNAME)?.Trim();
+            var methodParameters = context.JobDetail.JobDataMap.GetString(Constant.METHODPARAMETERS);
+
+            try
+            {
+                /// 鍔犺浇 WMS.BLL 绫诲簱
+                Assembly assembly = Assembly.LoadFrom("bin\\Debug\\netcoreapp3.1\\WMS.BLL.dll");
+
+                // 鑾峰彇 WMS.BLL鐨勭被鍨�
+                Type classType = assembly.GetType("WMS.BLL." + className);
+
+                if (classType == null)
+                {
+                    throw new TypeLoadException($"鎵句笉鍒拌绫诲瀷{className}");
+                }
+                #region 瀹瑰櫒鍒涘缓绀轰緥  鏈夋姤閿欐悶涓嶅畾鎶界┖鍐嶅紕
+
+                //var builder = new ContainerBuilder();
+
+                //// 娉ㄥ唽闇�瑕佺殑鏈嶅姟鍜岀被鍨�
+                //builder.RegisterAssemblyTypes(Assembly.Load("WMS.IDAL"), Assembly.Load("WMS.DAL"), Assembly.Load("WMS.IBLL"),
+                //    Assembly.Load("WMS.BLL"));
+                //builder.RegisterType<Mapper>().As<IMapper>();
+
+                //// 浣跨敤 Autofac 瀹瑰櫒鏉ヨВ鏋愮被鐨勫疄渚�
+                //var scope = builder.Build();
+
+                //var instance = scope.Resolve(classType);
+                #endregion
+
+                // 鍒涘缓瀹炰緥锛堝鏋滄柟娉曟槸瀹炰緥鏂规硶锛� 鏃犳敞鍏� 蹇呴』鏈夌┖鍙傛暟鐨勬瀯閫犲嚱鏁�
+                object instance = Activator.CreateInstance(classType);
+
+                // 鑾峰彇鏂规硶淇℃伅
+                MethodInfo methodInfo = classType.GetMethod(methodName);
+
+                if (methodInfo == null)
+                {
+                    throw new ArgumentException($"鎵句笉鍒拌鏂规硶{methodName}");
+                }
+
+                // 璋冪敤鏂规硶
+                object result = null;
+                if (methodInfo.GetParameters().Length == 0)
+                {
+                    // 鏃犲弬鏂规硶
+                    result = methodInfo.Invoke(instance, null);
+                }
+                else
+                {
+                    // 鏈夊弬鏂规硶
+                    var parameters = JsonConvert.DeserializeObject<object[]>(methodParameters); // 瑙f瀽鏂规硶鍙傛暟
+                    result = await (Task<object>)methodInfo.Invoke(instance, parameters);
+                }
+
+                // 澶勭悊鏂规硶鎵ц缁撴灉
+                LogInfo.Result = JsonConvert.SerializeObject(result);
+            }
+            catch (Exception ex)
+            {
+                LogInfo.ErrorMsg = ex.Message;
+                context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"<div class='err-time'>{LogInfo.BeginTime}</div>{JsonConvert.SerializeObject(LogInfo)}";
+            }
+            //_logger.Error(ex, $"鎵ц鏂规硶鏃跺嚭閿� {methodName}: {ex.Message}");
+        }
+    }
+}
diff --git a/Wms/Utility/Job/JobBase.cs b/Wms/Utility/Job/JobBase.cs
index d6ba708..be14f99 100644
--- a/Wms/Utility/Job/JobBase.cs
+++ b/Wms/Utility/Job/JobBase.cs
@@ -19,11 +19,9 @@
         protected Stopwatch stopwatch = new Stopwatch();
         protected T LogInfo { get; private set; }
 
-        private ILogger _logger;
-        public JobBase(T logInfo,ILogger logger)
+        public JobBase(T logInfo)
         {
             LogInfo = logInfo;
-            _logger = logger;
         }
 
         public async Task Execute(IJobExecutionContext context)
@@ -36,7 +34,15 @@
                 return;
             }
             //璁板綍鎵ц娆℃暟
-            var runNumber = context.JobDetail.JobDataMap.GetLong(Constant.RUNNUMBER);
+            long runNumber = 0;
+            try
+            {
+                runNumber = context.JobDetail.JobDataMap.GetLong(Constant.RUNNUMBER);
+            }
+            catch (Exception)
+            {
+
+            }
             context.JobDetail.JobDataMap[Constant.RUNNUMBER] = ++runNumber;
 
             var logs = context.JobDetail.JobDataMap[Constant.LOGLIST] as List<string> ?? new List<string>();
@@ -75,19 +81,19 @@
 
         public abstract Task NextExecute(IJobExecutionContext context);
 
-        public async Task WarningAsync(string title, string msg)
-        {
-            _logger.Warning(msg);
-        }
+        //public async Task WarningAsync(string title, string msg)
+        //{
+        //    _logger.Warning(msg);
+        //}
 
-        public async Task InformationAsync(string title, string msg)
-        {
-            _logger.Information(msg);
-        }
+        //public async Task InformationAsync(string title, string msg)
+        //{
+        //    _logger.Information(msg);
+        //}
 
-        public async Task ErrorAsync(string title, Exception ex, string msg)
-        {
-            _logger.Error(ex, msg);
-        }
+        //public async Task ErrorAsync(string title, Exception ex, string msg)
+        //{
+        //    _logger.Error(ex, msg);
+        //}
     }
 }
diff --git a/Wms/Utility/Job/SchedulerCenter.cs b/Wms/Utility/Job/SchedulerCenter.cs
index 73f3642..8ee31a7 100644
--- a/Wms/Utility/Job/SchedulerCenter.cs
+++ b/Wms/Utility/Job/SchedulerCenter.cs
@@ -143,6 +143,13 @@
                 httpDir.Add(Constant.REQUESTPARAMETERS, entity.RequestParameters);
                 httpDir.Add(Constant.REQUESTTYPE, ((int)entity.RequestType).ToString());
             }
+            else if (entity.JobType == JobTypeEnum.BuiltIn)
+            {
+                jobConfigurator = JobBuilder.Create<InternalMethodJob>();
+                httpDir.Add(Constant.CLASSNAME, entity.ClassName);
+                httpDir.Add(Constant.METHODNAME, entity.MethodName);
+                httpDir.Add(Constant.METHODPARAMETERS, entity.MethodParameters);
+            }
 
             // 瀹氫箟杩欎釜宸ヤ綔锛屽苟灏嗗叾缁戝畾鍒版垜浠殑IJob瀹炵幇绫�                
             IJobDetail job = jobConfigurator
diff --git a/Wms/Utility/Utility.csproj b/Wms/Utility/Utility.csproj
index 92ea9bb..2b5c558 100644
--- a/Wms/Utility/Utility.csproj
+++ b/Wms/Utility/Utility.csproj
@@ -14,6 +14,7 @@
 
   <ItemGroup>
     <PackageReference Include="Autofac" Version="8.0.0" />
+    <PackageReference Include="AutoMapper" Version="12.0.1" />
     <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.1.32" />
     <PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
     <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="8.0.0" />
diff --git a/Wms/Wms/Controllers/JobController.cs b/Wms/Wms/Controllers/JobController.cs
index f42da03..e7f8e2e 100644
--- a/Wms/Wms/Controllers/JobController.cs
+++ b/Wms/Wms/Controllers/JobController.cs
@@ -6,6 +6,7 @@
 using System.Threading.Tasks;
 using Utility.Entity;
 using Utility;
+using Model.ModelVm;
 
 namespace Wms.Controllers
 {
@@ -50,7 +51,7 @@
         /// </summary>
         /// <returns></returns>
         [HttpPost]
-        public async Task<string> StopJob([FromBody] JobKey job)
+        public async Task<string> StopJob(JobVm job)
         {
             return await scheduler.StopOrDelScheduleJobAsync(job.Group, job.Name);
         }
@@ -60,7 +61,7 @@
         /// </summary> 
         /// <returns></returns>
         [HttpPost]
-        public async Task<string> RemoveJob([FromBody] JobKey job)
+        public async Task<string> RemoveJob(JobVm job)
         {
             return await scheduler.StopOrDelScheduleJobAsync(job.Group, job.Name, true);
         }
@@ -70,7 +71,7 @@
         /// </summary> 
         /// <returns></returns>
         [HttpPost]
-        public async Task<string> ResumeJob([FromBody] JobKey job)
+        public async Task<string> ResumeJob(JobVm job)
         {
             return await scheduler.ResumeJobAsync(job.Group, job.Name);
         }
@@ -80,7 +81,7 @@
         /// </summary>
         /// <returns></returns>
         [HttpPost]
-        public async Task<ScheduleEntity> QueryJob([FromBody] JobKey job)
+        public async Task<ScheduleEntity> QueryJob(JobVm job)
         {
             return await scheduler.QueryJobAsync(job.Group, job.Name);
         }
@@ -106,9 +107,10 @@
         /// <param name="job"></param>
         /// <returns></returns>
         [HttpPost]
-        public async Task<bool> TriggerJob([FromBody] JobKey job)
+        public async Task<bool> TriggerJob(JobVm job)
         {
-            await scheduler.TriggerJobAsync(job);
+            JobKey modKey = new JobKey(job.Name, job.Group);
+            await scheduler.TriggerJobAsync(modKey);
             return true;
         }
 
@@ -118,9 +120,10 @@
         /// <param name="jobKey"></param>
         /// <returns></returns>
         [HttpPost]
-        public async Task<List<string>> GetJobLogs([FromBody] JobKey jobKey)
+        public async Task<List<string>> GetJobLogs(JobVm job)
         {
-            var logs = await scheduler.GetJobLogsAsync(jobKey);
+            JobKey modKey = new JobKey(job.Name, job.Group);
+            var logs = await scheduler.GetJobLogsAsync(modKey);
             logs?.Reverse();
             return logs;
         }

--
Gitblit v1.8.0