From ecad98aa74a1284a036572fa364bcc352480149c Mon Sep 17 00:00:00 2001
From: yl <ykxkd@outlook.com>
Date: 星期一, 11 五月 2026 08:01:35 +0800
Subject: [PATCH] 1.车间综合看板接口调整 2.报工记录子表和不良记录表写入报工人员,班组编码 3.修改调整定时任务写入到数据库,并实现消息推送

---
 VueWebCoreApi/Quartz/QuartzNETExtension.cs |  646 ++++++++++++++++++++++++++++------------------------------
 1 files changed, 309 insertions(+), 337 deletions(-)

diff --git a/VueWebCoreApi/Quartz/QuartzNETExtension.cs b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
index 51e3bdf..65aa095 100644
--- a/VueWebCoreApi/Quartz/QuartzNETExtension.cs
+++ b/VueWebCoreApi/Quartz/QuartzNETExtension.cs
@@ -17,110 +17,142 @@
 
 namespace VueWebCoreApi.Extensions
 {
+    /// <summary>
+    /// Quartz.NET 鎵╁睍鏂规硶绫�
+    /// 灏佽Quartz浠诲姟鐨勫垵濮嬪寲銆佸鍒犳敼鏌ャ�佸惎鍋溿�佺珛鍗虫墽琛岀瓑鏍稿績鎿嶄綔
+    /// 瑙e喅浜哠cheduler鍚姩銆佸唴瀛樹笌鏁版嵁搴撶姸鎬佸悓姝ャ�丆ron琛ㄨ揪寮忓吋瀹广�並ey鍖归厤绛夋牳蹇冮棶棰�
+    /// </summary>
     public static class QuartzNETExtension
     {
-        public static ToMessage mes = new ToMessage(); //瀹氫箟鍏ㄥ眬杩斿洖淇℃伅瀵硅薄
+        /// <summary>
+        /// 鍏ㄥ眬杩斿洖淇℃伅瀵硅薄锛堢粺涓�鎺ュ彛杩斿洖鏍煎紡锛�
+        /// 鍖呭惈code(鐘舵�佺爜)銆乧ount(鏁伴噺)銆乵essage(鎻愮ず淇℃伅)銆乨ata(鏁版嵁)
+        /// </summary>
+        public static ToMessage mes = new ToMessage(); 
+        /// <summary>
+        /// 鍐呭瓨绾т换鍔″垪琛ㄧ紦瀛�
+        /// 鐢ㄤ簬鍑忓皯鏁版嵁搴撴煡璇紝鍚屾椂淇濊瘉鍐呭瓨涓庢暟鎹簱鐘舵�佷竴鑷�
+        /// </summary>
         private static List<TaskOptions> _taskList = new List<TaskOptions>();
 
         /// <summary>
-        /// 鍒濆鍖栦綔涓�
+        /// 鎵╁睍IApplicationBuilder锛屽垵濮嬪寲Quartz浠诲姟璋冨害鍣ㄥ苟鍔犺浇鎵�鏈変换鍔�
+        /// 銆愭牳蹇冧慨澶嶃�戣В鍐砆uartz榛樿涓嶅惎鍔⊿cheduler鐨勯棶棰�
         /// </summary>
-        /// <param name="applicationBuilder"></param>
-        /// <param name="env"></param>
-        /// <returns></returns>
-        public static IApplicationBuilder UseQuartz(this IApplicationBuilder applicationBuilder, IWebHostEnvironment env)
+        /// <param name="app">ASP.NET Core搴旂敤鏋勫缓鍣�</param>
+        /// <param name="env">Web涓绘満鐜</param>
+        /// <returns>搴旂敤鏋勫缓鍣紙閾惧紡璋冪敤锛�</returns>
+        public static IApplicationBuilder UseQuartz(this IApplicationBuilder app, IWebHostEnvironment env)
         {
-            IServiceProvider services = applicationBuilder.ApplicationServices;
+            // 浠嶥I瀹瑰櫒鑾峰彇渚濊禆鏈嶅姟
+            var services = app.ApplicationServices;
+            // Quartz璋冨害鍣ㄥ伐鍘�
+            var schedulerFactory = services.GetService<ISchedulerFactory>();
+            // 鑷畾涔塓uartz浠撳偍锛堟暟鎹簱鎿嶄綔锛�
+            var quartzRepo = services.GetService<QuartzRepository>();
 
-            ISchedulerFactory _schedulerFactory = services.GetService<ISchedulerFactory>();
-
-            string path = FileQuartz.CreateQuartzRootPath(env);
-            //鏌ユ壘浠诲姟鍒楄〃
-            var data = QuartzSearchData.QuartzSearch();
-            if (data.Rows.Count <= 0) 
+            // 1. 鏍稿績淇锛歈uartz榛樿涓嶄細鑷姩鍚姩Scheduler锛屽繀椤绘樉寮忓惎鍔�
+            var scheduler = schedulerFactory.GetScheduler().GetAwaiter().GetResult();
+            if (!scheduler.IsStarted)
             {
-                FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
-                return applicationBuilder;
+                scheduler.Start().GetAwaiter().GetResult();
             }
-            string jobConfig = JsonConvert.SerializeObject(data);
-
-            //string jobConfig = FileHelper.ReadFile(path + QuartzFileInfo.JobConfigFileName);
-            //if (string.IsNullOrEmpty(jobConfig))
-            //{
-            //    FileHelper.WriteFile(FileQuartz.LogPath, "start.txt", $"{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")},娌℃湁榛樿閰嶇疆浠诲姟\r\n", true);
-            //    return applicationBuilder;
-            //}
-
+            // 2. 浠庢暟鎹簱鍔犺浇鎵�鏈夐厤缃殑浠诲姟
+            var taskList = quartzRepo.GetAllTasksAsync().GetAwaiter().GetResult();
+            if (taskList.Count == 0)
+            {
+                //鏃犱换鍔℃椂璁板綍鍚姩鏃ュ織
+                quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},娌℃湁榛樿閰嶇疆浠诲姟").GetAwaiter().GetResult();
+                return app;
+            }
+            // 3. 閬嶅巻浠诲姟骞跺垵濮嬪寲锛堣褰曞け璐ユ暟鍜屽紓甯镐俊鎭級
             int errorCount = 0;
-            string errorMsg = "";
-            TaskOptions options = null;
-            try
+            string errorMsg = string.Empty;
+            // 鍒濆鍖栧唴瀛樹换鍔″垪琛�
+            _taskList = taskList;
+
+            foreach (var task in taskList)
             {
-                _taskList = JsonConvert.DeserializeObject<List<TaskOptions>>(jobConfig);
-                _taskList.ForEach(x =>
+                try
                 {
-                    options = x;
-                    var result = x.AddJob(_schedulerFactory, true, jobFactory: services.GetService<IJobFactory>()).GetAwaiter().GetResult();
-                });
+                    //var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>()).GetAwaiter().GetResult();
+                    // 璋冪敤TaskOptions鐨凙ddJob鏂规硶娣诲姞浠诲姟鍒拌皟搴﹀櫒
+                    // 浼犲叆浠撳偍鐢ㄤ簬鏁版嵁搴撴搷浣滐紝浼犲叆JobFactory鐢ㄤ簬鑷畾涔塉ob瀹炰緥鍖�
+                    var result = task.AddJob(schedulerFactory, true, services.GetService<IJobFactory>(), quartzRepo).GetAwaiter().GetResult();
+                }
+                catch (Exception ex)
+                {
+                    // 璁板綍鍗曚釜浠诲姟鍒濆鍖栧け璐ヤ俊鎭�
+                    errorCount++;
+                    errorMsg += $"浣滀笟:{task.TaskName},寮傚父锛歿ex.Message};";
+                }
             }
-            catch (Exception ex)
-            {
-                errorCount = +1;
-                errorMsg += $"浣滀笟:{options?.TaskName},寮傚父锛歿ex.Message}";
-            }
-            string content = $"鎴愬姛:{   _taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}\r\n";
-            FileQuartz.WriteStartLog(content);
+            // 4. 璁板綍鏁翠綋鍒濆鍖栫粨鏋滄棩蹇�
+            var content = $"鎴愬姛:{taskList.Count - errorCount}涓�,澶辫触{errorCount}涓�,寮傚父锛歿errorMsg}";
+            quartzRepo.WriteStartLogAsync($"{DateTime.Now:yyyy-MM-dd HH:mm:ss},{content}").GetAwaiter().GetResult();
 
-
-            return applicationBuilder;
+            return app;
         }
 
         /// <summary>
-        /// 鑾峰彇鎵�鏈夌殑浣滀笟
+        /// 鑾峰彇璋冨害鍣ㄤ腑鎵�鏈変换鍔★紝骞跺悓姝ュ唴瀛�/鏁版嵁搴撶姸鎬侊紙鏍稿績淇锛氳В鍐冲唴瀛樺垪琛ㄤ笌鏁版嵁搴撲笉涓�鑷撮棶棰橈級
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <returns></returns>
-        public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鏈�鏂扮殑浠诲姟鍒楄〃</returns>
+        public static async Task<List<TaskOptions>> GetJobs(this ISchedulerFactory schedulerFactory, QuartzRepository quartzRepo)
         {
-            List<TaskOptions> list = new List<TaskOptions>();
+            var list = new List<TaskOptions>();
             try
             {
-                IScheduler _scheduler = await schedulerFactory.GetScheduler();
-                var groups = await _scheduler.GetJobGroupNames();
+                var scheduler = await schedulerFactory.GetScheduler();
+                // 纭繚Scheduler澶勪簬鍚姩鐘舵�侊紙闃插尽鎬х紪绋嬶級
+                if (!scheduler.IsStarted) await scheduler.Start();
+                // 1. 鑾峰彇鎵�鏈変换鍔″垎缁勶紙Quartz浠诲姟鎸夊垎缁勭鐞嗭級
+                var groups = await scheduler.GetJobGroupNames();
+
                 foreach (var groupName in groups)
                 {
-                    foreach (var jobKey in await _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)))
+                    // 2. 鑾峰彇鍒嗙粍涓嬫墍鏈塉obKey锛堜换鍔″敮涓�鏍囪瘑锛氬悕绉�+鍒嗙粍锛�
+                    var jobKeys = await scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName));
+                    foreach (var jobKey in jobKeys)
                     {
-                        TaskOptions taskOptions = _taskList.Where(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name)
-                            .FirstOrDefault();
-                        if (taskOptions == null)
-                            continue;
-
-                        var triggers = await _scheduler.GetTriggersOfJob(jobKey);
-                        foreach (ITrigger trigger in triggers)
+                        // 3. 鏍稿績淇锛氫紭鍏堜粠鏁版嵁搴撹幏鍙栨渶鏂颁换鍔★紙閬垮厤鍐呭瓨鏁版嵁杩囨湡锛�
+                        var dbTask = await quartzRepo.TaskExists(jobKey.Name, jobKey.Group);
+                        // 鏁版嵁搴撴棤鏁版嵁鏃讹紝闄嶇骇浠庡唴瀛樺垪琛ㄨ幏鍙�
+                        var task = dbTask.FirstOrDefault() ?? _taskList.FirstOrDefault(x => x.GroupName == jobKey.Group && x.TaskName == jobKey.Name);
+                        // 杩囨护鏃犳晥浠诲姟
+                        if (task == null) continue;
+                        // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛圦uartz浠诲姟閫氳繃瑙﹀彂鍣ㄨЕ鍙戞墽琛岋級
+                        var triggers = await scheduler.GetTriggersOfJob(jobKey);
+                        foreach (var trigger in triggers)
                         {
-                            DateTimeOffset? dateTimeOffset = trigger.GetPreviousFireTimeUtc();
-                            if (dateTimeOffset != null)
+                            // 5. 鍚屾瑙﹀彂鍣ㄥ疄闄呯姸鎬佸埌浠诲姟瀵硅薄锛屽苟鏇存柊鍒版暟鎹簱
+                            task.Status = (int)await scheduler.GetTriggerState(trigger.Key);
+                            await quartzRepo.UpdateTaskAsync(task); // 鐘舵�佸悓姝ュ埌搴�
+                            // 6. 鍚屾浠诲姟鏈�鍚庢墽琛屾椂闂�
+                            if (trigger.GetPreviousFireTimeUtc() != null)
                             {
-                                taskOptions.LastRunTime = Convert.ToDateTime(dateTimeOffset.ToString());
-                                //鏇存敼鏈�鍚庢墽琛屾椂闂�
-                                bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+                                // 浼樺厛浠庤Е鍙戝櫒鑾峰彇鏈�鍚庢墽琛屾椂闂达紙UTC杞湰鍦版椂闂达級
+                                task.LastRunTime = trigger.GetPreviousFireTimeUtc()?.LocalDateTime;
+                                await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, task.LastRunTime.Value);
                             }
                             else
                             {
-                                var runlog = FileQuartz.GetJobRunLog(taskOptions.TaskName, taskOptions.GroupName, 1, 2);
-                                if (runlog.Count > 0)
+                                // 瑙﹀彂鍣ㄦ棤璁板綍鏃讹紝浠庢墽琛屾棩蹇椾腑鑾峰彇鏈�鍚庢墽琛屾椂闂�
+                                var logs = await quartzRepo.GetJobRunLogAsync(task.TaskName, task.GroupName, 1, 1);
+                                if (logs.Count > 0 && DateTime.TryParse(logs[0].BeginDate, out var lastRunTime))
                                 {
-                                    DateTime.TryParse(runlog[0].BeginDate, out DateTime lastRunTime);
-                                    taskOptions.LastRunTime = lastRunTime;
-                                    //鏇存敼鏈�鍚庢墽琛屾椂闂�
-                                    bool aa = QuartzSearchData.QuartzUpdate(taskOptions);
+                                    task.LastRunTime = lastRunTime;
+                                    await quartzRepo.UpdateTaskLastRunTimeAsync(task.TaskName, task.GroupName, lastRunTime);
                                 }
                             }
                         }
-                        list.Add(taskOptions);
+                        list.Add(task);
                     }
                 }
+                // 7. 鍚屾鍐呭瓨鍒楄〃涓烘渶鏂版暟鎹紙淇濊瘉鍚庣画鎿嶄綔浣跨敤鏈�鏂扮姸鎬侊級
+                _taskList = list;
             }
             catch (Exception ex)
             {
@@ -128,314 +160,246 @@
                 mes.count = 0;
                 mes.message = ex.Message + ex.StackTrace;
                 mes.data = null;
-                FileQuartz.WriteStartLog("鑾峰彇浣滀笟寮傚父锛�" + ex.Message + ex.StackTrace);
+                await quartzRepo.WriteStartLogAsync($"鑾峰彇浣滀笟寮傚父锛歿ex.Message}{ex.StackTrace}");
+                return new List<TaskOptions>();
             }
             return list;
         }
 
         /// <summary>
-        /// 娣诲姞浣滀笟
+        /// 鏂板Quartz浠诲姟锛堝垵濮嬪寲/鎵嬪姩娣诲姞閫氱敤锛�
         /// </summary>
-        /// <param name="taskOptions"></param>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="init">鏄惁鍒濆鍖�,鍚�=闇�瑕侀噸鏂扮敓鎴愰厤缃枃浠讹紝鏄�=涓嶉噸鏂扮敓鎴愰厤缃枃浠�</param>
-        /// <returns></returns>
-        public static async Task<object> AddJob(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null)
+        /// <param name="task">浠诲姟閰嶇疆椤�</param>
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="init">鏄惁涓哄垵濮嬪寲闃舵锛堝垵濮嬪寲鏃朵笉閲嶅鍏ュ簱锛�</param>
+        /// <param name="jobFactory">Job宸ュ巶锛堣嚜瀹氫箟Job瀹炰緥鍖栭�昏緫锛�</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>缁熶竴杩斿洖缁撴灉锛圱oMessage锛�</returns>
+        public static async Task<object> AddJob(this TaskOptions task, ISchedulerFactory schedulerFactory, bool init = false, IJobFactory jobFactory = null, QuartzRepository quartzRepo = null)
         {
             try
             {
-                //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
-                string resultString = "";
-                string[] str = taskOptions.Interval.Split(" ");
-                if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
+                // 1. 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忓吋瀹规�ч棶棰�
+                task.Interval = FixCronExpression(task.Interval);
+                // 2. 楠岃瘉Cron琛ㄨ揪寮忔湁鏁堟��
+                var (isValid, msg) = task.Interval.IsValidExpression();
+                if (!isValid)
+                    return new ToMessage { code = "300", count = 0, message = msg, data = null };
+                // 3. 闈炲垵濮嬪寲闃舵锛氭牎楠屼换鍔℃槸鍚﹀凡瀛樺湪锛堥伩鍏嶉噸澶嶆坊鍔狅級
+                if (!init && await quartzRepo.TaskExistsAsync(task.TaskName, task.GroupName))
                 {
-                    str[5] = str[3];
-                    str[3] = "?";
-                    for (int i = 0; i < str.Length; i++)
-                    {
-                        resultString += str[i] + " ";
-                    }
-                    taskOptions.Interval = resultString;
+                    return new ToMessage { code = "300", count = 0, message = $"浣滀笟:{task.TaskName},鍒嗙粍锛歿task.GroupName}宸茬粡瀛樺湪", data = null };
                 }
-                (bool, string) validExpression = taskOptions.Interval.IsValidExpression();
-                if (!validExpression.Item1)
-                    return new { code = 300,count=0,Message=validExpression.Item2,data="null" };
-
-                (bool, object) result = taskOptions.Exists(init);
-                if (!result.Item1)
-                    return result.Item2;
+                // 4. 闈炲垵濮嬪寲闃舵锛氭柊澧炰换鍔″埌鍐呭瓨+鏁版嵁搴�+璁板綍鎿嶄綔鏃ュ織
                 if (!init)
                 {
-                    //灏嗗巻鍙蹭换鍔″強鏂板鍔犱换鍔″ぉ鍔犲埌List闆嗗悎
-                    _taskList.Add(taskOptions);
-                    //灏嗛泦鍚堟暟鎹坊鍔犲埌json鏂囦欢(瑕嗙洊寮�)
-                    FileQuartz.WriteJobConfig(_taskList);
-                    //灏嗗綋鍓嶆柊浠诲姟娣诲姞鍒版暟鎹〃
-                    bool aa = QuartzSearchData.QuartzCreate(taskOptions);
+                    _taskList.Add(task);// 鍐呭瓨娣诲姞
+                    await quartzRepo.CreateTaskAsync(task);// 鏁版嵁搴撴坊鍔�
+                    await quartzRepo.AddJobActionLogAsync(JobAction.鏂板.ToString(), task.TaskName, task.GroupName, "鏂板浠诲姟鎴愬姛");// 鎿嶄綔鏃ュ織
                 }
+                // 5. 鏋勫缓Quartz Job锛堜换鍔℃墽琛屼綋锛�
+                var job = JobBuilder.Create<HttpResultfulJob>()// HttpResultfulJob锛氳嚜瀹氫箟鐨凥TTP璇锋眰鍨婮ob
+                    .WithIdentity(task.TaskName, task.GroupName)// 璁剧疆Job鍞竴鏍囪瘑锛堝悕绉�+鍒嗙粍锛�
+                    .Build();
 
-                IJobDetail job = JobBuilder.Create<HttpResultfulJob>().WithIdentity(taskOptions.TaskName, taskOptions.GroupName).Build();
-                ITrigger trigger = TriggerBuilder.Create()
-                   .WithIdentity(taskOptions.TaskName, taskOptions.GroupName)
-                   .StartNow()
-                   .WithDescription(taskOptions.Describe)
-                   .WithCronSchedule(taskOptions.Interval)
-                   .Build();
+                // 6. 鏋勫缓Cron瑙﹀彂鍣紙鎸塁ron琛ㄨ揪寮忚Е鍙戯級
+                var trigger = TriggerBuilder.Create()
+                    .WithIdentity(task.TaskName, task.GroupName)// 瑙﹀彂鍣ㄥ敮涓�鏍囪瘑锛堜笌Job淇濇寔涓�鑷达級
+                    .StartNow()// 绔嬪嵆鍚姩
+                    .WithDescription(task.Describe)// 浠诲姟鎻忚堪
+                    .WithCronSchedule(task.Interval)// 缁戝畾Cron琛ㄨ揪寮�
+                    .Build();
 
-                IScheduler scheduler = await schedulerFactory.GetScheduler();
-
-                if (jobFactory == null)
-                {
-                    try
-                    {
-                        jobFactory = HttpContext.Current.RequestServices.GetService<IJobFactory>();
-                    }
-                    catch (Exception ex)
-                    {
-                        Console.WriteLine($"鍒涘缓浠诲姟[{taskOptions.TaskName}]寮傚父,{ex.Message}");
-                    }
-                }
-
+                // 7. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩
+                var scheduler = await schedulerFactory.GetScheduler();
+                if (!scheduler.IsStarted) await scheduler.Start(); // 纭繚鍚姩
+                // 8. 璁剧疆鑷畾涔塉obFactory锛堝闇�鎺у埗Job鐨勪緷璧栨敞鍏�/瀹炰緥鍖栵級
                 if (jobFactory != null)
                 {
                     scheduler.JobFactory = jobFactory;
                 }
 
+                // 9. 灏咼ob鍜岃Е鍙戝櫒缁戝畾鍒拌皟搴﹀櫒
                 await scheduler.ScheduleJob(job, trigger);
-                if (taskOptions.Status == (int)TriggerState.Normal)
+
+                // 10. 鏍规嵁浠诲姟鐘舵�佽缃Е鍙戝櫒鍚仠
+                if (task.Status == (int)TriggerState.Normal)
                 {
-                    await scheduler.Start();
+                    await scheduler.ResumeTrigger(trigger.Key);// 鏄惧紡鎭㈠锛堢‘淇濊Е鍙戝櫒姝e父杩愯锛�
                 }
                 else
                 {
-                    await scheduler.PauseJob(job.Key);
-                    //  await schedulerFactory.Pause(taskOptions);
-                    FileQuartz.WriteStartLog($"浣滀笟:{taskOptions.TaskName},鍒嗙粍:{taskOptions.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{taskOptions.Status}");
+                    await scheduler.PauseJob(job.Key);// 鏆傚仠浠诲姟
+                    await quartzRepo.WriteStartLogAsync($"浣滀笟:{task.TaskName},鍒嗙粍:{task.GroupName},鏂板缓鏃舵湭鍚姩鍘熷洜,鐘舵�佷负:{task.Status}");
                 }
-                if (!init)
-                    FileQuartz.WriteJobAction(JobAction.鏂板, taskOptions.TaskName, taskOptions.GroupName);
                 mes.code = "200";
                 mes.count = 0;
-                mes.message ="鎵ц鎴愬姛锛�";
+                mes.message = "鎵ц鎴愬姛锛�";
                 mes.data = null;
             }
             catch (Exception ex)
             {
-                mes.code = "300";
-                mes.count = 0;
-                mes.message = ex.Message;
-                mes.data = null;
-                return new { status = false, msg = ex.Message };
+                return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
             }
             return mes;
         }
 
         /// <summary>
-        /// 绉婚櫎浣滀笟
+        /// 绉婚櫎锛堝垹闄わ級浠诲姟
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskName"></param>
-        /// <param name="groupName"></param>
-        /// <returns></returns>
-        public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="task">浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public static Task<object> Remove(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
         {
-            return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鍒犻櫎, taskOptions);
+            return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鍒犻櫎, task, quartzRepo);
         }
 
         /// <summary>
-        /// 鏇存柊浣滀笟
+        /// 淇敼浠诲姟閰嶇疆
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskOptions"></param>
-        /// <returns></returns>
-        public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="task">鏂扮殑浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public static Task<object> Update(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
         {
-            return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.淇敼, taskOptions);
+            return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.淇敼, task, quartzRepo);
         }
 
         /// <summary>
-        /// 鏆傚仠浣滀笟
+        /// 鏆傚仠浠诲姟
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskOptions"></param>
-        /// <returns></returns>
-        public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="task">浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public static Task<object> Pause(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
         {
-            return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.鏆傚仠, taskOptions);
+            return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.鏆傚仠, task, quartzRepo);
         }
 
         /// <summary>
-        /// 鍚姩浣滀笟
+        /// 鍚姩锛堟仮澶嶏級浠诲姟
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskOptions"></param>
-        /// <returns></returns>
-        public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="task">浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public static Task<object> Start(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
         {
-            return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.寮�鍚�, taskOptions);
+            return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.寮�鍚�, task, quartzRepo);
         }
 
         /// <summary>
-        /// 绔嬪嵆鎵ц涓�娆′綔涓�
+        /// 绔嬪嵆鎵ц浠诲姟锛堟棤瑙咰ron琛ㄨ揪寮忥級
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskOptions"></param>
-        /// <returns></returns>
-        public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions taskOptions)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="task">浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        public static Task<object> Run(this ISchedulerFactory schedulerFactory, TaskOptions task, QuartzRepository quartzRepo)
         {
-            return schedulerFactory.TriggerAction(taskOptions.TaskName, taskOptions.GroupName, JobAction.绔嬪嵆鎵ц, taskOptions);
-        }
-
-        public static object ModifyTaskEntity(this TaskOptions taskOptions, ISchedulerFactory schedulerFactory, JobAction action)
-        {
-            TaskOptions options = null;
-            object result = null;
-            switch (action)
-            {
-                case JobAction.鍒犻櫎:
-                    for (int i = 0; i < _taskList.Count; i++)
-                    {
-                        options = _taskList[i];
-                        if (options.TaskName == taskOptions.TaskName && options.GroupName == taskOptions.GroupName)
-                        {
-                            _taskList.RemoveAt(i);
-                            //鍒犻櫎浠诲姟
-                            bool aa = QuartzSearchData.QuartzDelete(options);
-                        }
-                    }
-                    break;
-                case JobAction.淇敼:
-                    options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
-                    //绉婚櫎浠ュ墠鐨勯厤缃�
-                    if (options != null)
-                    {
-                        _taskList.Remove(options);
-                        //鍒犻櫎浠诲姟
-                        bool aa = QuartzSearchData.QuartzDelete(options);
-                    }
-
-                    //鐢熸垚浠诲姟骞舵坊鍔犳柊閰嶇疆
-                    result = taskOptions.AddJob(schedulerFactory, false).GetAwaiter().GetResult();
-                    break;
-                case JobAction.鏆傚仠:
-                case JobAction.寮�鍚�:
-                case JobAction.鍋滄:
-                case JobAction.绔嬪嵆鎵ц:
-                    options = _taskList.Where(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName).FirstOrDefault();
-                    if (action == JobAction.鏆傚仠)
-                    {
-                        options.Status = (int)TriggerState.Paused;
-                        //鏇存柊浠诲姟鐘舵��
-                        bool aa= QuartzSearchData.QuartzUpdate(options);
-                    }
-                    else if (action == JobAction.鍋滄)
-                    {
-                        options.Status = (int)action;
-                        //鏇存柊浠诲姟鐘舵��
-                        bool aa = QuartzSearchData.QuartzUpdate(options);
-                    }
-                    else
-                    {
-                        options.Status = (int)TriggerState.Normal;
-                        //鏇存柊浠诲姟鐘舵��
-                        bool aa = QuartzSearchData.QuartzUpdate(options);
-                    }
-                    break;
-            }
-            //鐢熸垚閰嶇疆鏂囦欢
-            FileQuartz.WriteJobConfig(_taskList);
-            FileQuartz.WriteJobAction(action, taskOptions.TaskName, taskOptions.GroupName, "鎿嶄綔瀵硅薄锛�" + JsonConvert.SerializeObject(taskOptions));
-            return result;
+            return TriggerAction(schedulerFactory, task.TaskName, task.GroupName, JobAction.绔嬪嵆鎵ц, task, quartzRepo);
         }
 
         /// <summary>
-        /// 瑙﹀彂鏂板銆佸垹闄ゃ�佷慨鏀广�佹殏鍋溿�佸惎鐢ㄣ�佺珛鍗虫墽琛屼簨浠�
+        /// 浠诲姟鎿嶄綔鏍稿績閫昏緫锛堟牳蹇冧慨澶嶏細Key鍖归厤+鐘舵�佸悓姝�+Scheduler鍚姩鏍¢獙锛�
+        /// 灏佽鍒犻櫎/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц鐨勯�氱敤閫昏緫锛岄伩鍏嶄唬鐮佸啑浣�
         /// </summary>
-        /// <param name="schedulerFactory"></param>
-        /// <param name="taskName"></param>
-        /// <param name="groupName"></param>
-        /// <param name="action"></param>
-        /// <param name="taskOptions"></param>
-        /// <returns></returns>
-        public static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions taskOptions = null)
+        /// <param name="schedulerFactory">璋冨害鍣ㄥ伐鍘�</param>
+        /// <param name="taskName">浠诲姟鍚嶇О</param>
+        /// <param name="groupName">鍒嗙粍鍚嶇О</param>
+        /// <param name="action">鎿嶄綔绫诲瀷锛堝垹闄�/淇敼/鏆傚仠/寮�鍚�/绔嬪嵆鎵ц锛�</param>
+        /// <param name="task">浠诲姟閰嶇疆</param>
+        /// <param name="quartzRepo">Quartz浠撳偍</param>
+        /// <returns>鎿嶄綔缁撴灉</returns>
+        private static async Task<object> TriggerAction(this ISchedulerFactory schedulerFactory, string taskName, string groupName, JobAction action, TaskOptions task, QuartzRepository quartzRepo)
         {
-            string errorMsg = "";
             try
             {
-                //澶勭悊鍓嶇Corn琛ㄨ揪寮忔渶鍚庝竴涓湀鐨勬槦鏈熷ぉ琛ㄨ揪寮忕己闄烽棶棰�
-                string resultString = "";
-                string[] str = taskOptions.Interval.Split(" ");
-                if ((str[3].Equals("1L") || str[3].Equals("2L") || str[3].Equals("3L") || str[3].Equals("4L") || str[3].Equals("5L") || str[3].Equals("6L") || str[3].Equals("7L")) && str[5].Equals("?"))
-                {
-                    str[5] = str[3];
-                    str[3] = "?";
-                    for (int i = 0; i < str.Length; i++)
-                    {
-                        resultString += str[i] + " ";
-                    }
-                    taskOptions.Interval = resultString;
-                }
-                IScheduler scheduler = await schedulerFactory.GetScheduler();
-                List<JobKey> jobKeys = scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(groupName)).Result.ToList();
-                if (jobKeys == null || jobKeys.Count() == 0)
-                {
-                    errorMsg = $"鏈壘鍒板垎缁刐{groupName}]";
-                    return new { code = 300, count = 0, Message = errorMsg, data = "null" };
-                    //return new { status = false, msg = errorMsg };
-                }
-                JobKey jobKey = jobKeys.Where(s => scheduler.GetTriggersOfJob(s).Result.Any(x => (x as CronTriggerImpl).Name == taskName)).FirstOrDefault();
-                if (jobKey == null)
-                {
-                    errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
-                    return new { code = 300, count = 0, Message = errorMsg, data = "null" };
-                }
-                var triggers = await scheduler.GetTriggersOfJob(jobKey);
-                ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault();
+                // 1. 棰勫鐞咰ron琛ㄨ揪寮忥紙淇鍓嶇浼犲叆鐨勮〃杈惧紡锛�
+                if (task != null) task.Interval = FixCronExpression(task.Interval);
 
-                if (trigger == null)
+                // 2. 鑾峰彇璋冨害鍣ㄥ苟纭繚鍚姩锛堟牳蹇冧慨澶�1锛氬叏灞�Scheduler鍚姩鏍¢獙锛�
+                var scheduler = await schedulerFactory.GetScheduler();
+                // 鏍稿績淇1锛氱‘淇漇cheduler鍏ㄥ眬鍚姩
+                if (!scheduler.IsStarted) await scheduler.Start();
+
+                // 3. 鏍稿績淇2锛氭纭瀯寤篔obKey锛堜换鍔″悕+鍒嗙粍锛夛紝瑙e喅Key鍖归厤澶辫触闂
+                var jobKey = new JobKey(taskName, groupName);
+                if (!await scheduler.CheckExists(jobKey))
                 {
-                    errorMsg = $"鏈壘鍒拌Е鍙戝櫒[{taskName}]";
-                    return new { code = 300, count = 0, Message = errorMsg, data = "null" };
+                    return new ToMessage { code = "300", count = 0, message = $"鏈壘鍒颁换鍔{taskName}-{groupName}]", data = null };
                 }
+
+                // 4. 鑾峰彇浠诲姟鍏宠仈鐨勮Е鍙戝櫒锛堟棤瑙﹀彂鍣ㄥ垯浠诲姟鏃犳硶鎵ц锛�
+                var triggers = await scheduler.GetTriggersOfJob(jobKey);
+                if (triggers == null || !triggers.Any())
+                {
+                    return new ToMessage { code = "300", count = 0, message = $"浠诲姟[{taskName}-{groupName}]鏃犺Е鍙戝櫒", data = null };
+                }
+                // 鍙栫涓�涓Е鍙戝櫒锛堝崟浠诲姟榛樿缁戝畾涓�涓Е鍙戝櫒锛�
+                var trigger = triggers.First();
+
                 object result = null;
+                // 5. 鏍规嵁鎿嶄綔绫诲瀷鎵ц涓嶅悓閫昏緫
                 switch (action)
                 {
                     case JobAction.鍒犻櫎:
-                    case JobAction.淇敼:
+                        // 鏆傚仠瑙﹀彂鍣� -> 瑙g粦瑙﹀彂鍣� -> 鍒犻櫎Job -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
                         await scheduler.PauseTrigger(trigger.Key);
-                        await scheduler.UnscheduleJob(trigger.Key);// 绉婚櫎瑙﹀彂鍣�
-                        await scheduler.DeleteJob(trigger.JobKey);
-                        result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
+                        await scheduler.UnscheduleJob(trigger.Key);
+                        await scheduler.DeleteJob(jobKey);
+                        _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+                        await quartzRepo.DeleteTaskAsync(taskName, groupName);
+                        await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鍒犻櫎浠诲姟鎴愬姛");
                         break;
+
+                    case JobAction.淇敼:
+                        // 淇敼閫昏緫锛氬厛鍒犻櫎鏃т换鍔� -> 閲嶆柊娣诲姞鏂伴厤缃� -> 璁板綍鏃ュ織
+                        await scheduler.PauseTrigger(trigger.Key);
+                        await scheduler.UnscheduleJob(trigger.Key);
+                        await scheduler.DeleteJob(jobKey);
+                        _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+                        await quartzRepo.DeleteTaskAsync(taskName, groupName);
+                        result = await task.AddJob(schedulerFactory, false, null, quartzRepo);// 閲嶆柊娣诲姞浠诲姟
+                        await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, JsonConvert.SerializeObject(task));
+                        break;
+
                     case JobAction.鏆傚仠:
-                    case JobAction.鍋滄:
-                    case JobAction.寮�鍚�:
-                        result = taskOptions.ModifyTaskEntity(schedulerFactory, action);
-                        if (action == JobAction.鏆傚仠)
-                        {
-                            await scheduler.PauseTrigger(trigger.Key);
-                        }
-                        else if (action == JobAction.寮�鍚�)
-                        {
-                            await scheduler.ResumeTrigger(trigger.Key);
-                            //   await scheduler.RescheduleJob(trigger.Key, trigger);
-                        }
-                        else
-                        {
-                            await scheduler.Shutdown();
-                        }
+                        // 鏆傚仠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+                        await scheduler.PauseTrigger(trigger.Key);
+                        task.Status = (int)TriggerState.Paused;
+                        await quartzRepo.UpdateTaskAsync(task);
+                        _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+                        _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+                        await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "鏆傚仠浠诲姟鎴愬姛");
                         break;
+
+                    case JobAction.寮�鍚�:
+                        // 鎭㈠瑙﹀彂鍣� -> 鏇存柊浠诲姟鐘舵�� -> 鍚屾鍐呭瓨+鏁版嵁搴� -> 璁板綍鏃ュ織
+                        await scheduler.ResumeTrigger(trigger.Key);
+                        task.Status = (int)TriggerState.Normal;
+                        await quartzRepo.UpdateTaskAsync(task);
+                        _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+                        _taskList.Add(task); // 鍚屾鍐呭瓨鐘舵��
+                        await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "寮�鍚换鍔℃垚鍔�");
+                        break;
+
                     case JobAction.绔嬪嵆鎵ц:
-                        if (taskOptions != null && taskOptions.Status != (int)TriggerState.Normal)
+                        // 绔嬪嵆鎵ц鍓嶇‘淇濅换鍔″浜庡惎鍔ㄧ姸鎬� -> 瑙﹀彂Job绔嬪嵆鎵ц -> 璁板綍鏃ュ織
+                        if (task.Status != (int)TriggerState.Normal)
                         {
-                            result = taskOptions.ModifyTaskEntity(schedulerFactory, JobAction.寮�鍚�);
-                             await scheduler.ResumeTrigger(trigger.Key);
-                        
+                            task.Status = (int)TriggerState.Normal;
+                            await quartzRepo.UpdateTaskAsync(task);
+                            _taskList.RemoveAll(x => x.TaskName == taskName && x.GroupName == groupName);
+                            _taskList.Add(task);
+                            await scheduler.ResumeTrigger(trigger.Key);
                         }
-                        else {
-                            await scheduler.TriggerJob(jobKey);
-                        }
-                    
+                        await scheduler.TriggerJob(jobKey); // 绔嬪嵆瑙﹀彂浠诲姟鎵ц
+                        await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, "绔嬪嵆鎵ц浠诲姟鎴愬姛");
                         break;
                 }
                 mes.code = "200";
@@ -443,70 +407,78 @@
                 mes.message = $"浣滀笟{action.ToString()}鎴愬姛";
                 mes.data = null;
                 return result ?? mes;
-                //return result ?? new { status = true, msg = $"浣滀笟{action.ToString()}鎴愬姛" };
             }
             catch (Exception ex)
             {
-                errorMsg = ex.Message;
-                mes.code = "300";
-                mes.count = 0;
-                mes.message = errorMsg;
-                mes.data = null;
-                return mes;
-                //return new { status = false, msg = ex.Message };
-            }
-            finally
-            {
-                FileQuartz.WriteJobAction(action, taskName, groupName, errorMsg);
+                await quartzRepo.AddJobActionLogAsync(action.ToString(), taskName, groupName, $"鎿嶄綔澶辫触锛歿ex.Message}");
+                return new ToMessage { code = "300", count = 0, message = ex.Message, data = null };
             }
         }
 
         /// <summary>
-        /// 
+        /// 淇鍓嶇浼犲叆鐨凜ron琛ㄨ揪寮忕己闄�
+        /// 鍏煎ASP.NET Core 3.1涓瑿ron琛ㄨ揪寮忕殑Day/Week瀛楁鍐欐硶闂
         /// </summary>
-        /// <param name="context"></param>閫氳繃浣滀笟涓婁笅鏂囪幏鍙栦綔涓氬搴旂殑閰嶇疆鍙傛暟
-        /// <returns></returns>
-        public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+        /// <param name="cron">鍘熷Cron琛ㄨ揪寮�</param>
+        /// <returns>淇鍚庣殑Cron琛ㄨ揪寮�</returns>
+        private static string FixCronExpression(string cron)
         {
-            AbstractTrigger trigger = (context as JobExecutionContextImpl).Trigger as AbstractTrigger;
-            TaskOptions taskOptions = _taskList.Where(x => x.TaskName == trigger.Name && x.GroupName == trigger.Group).FirstOrDefault();
-            return taskOptions ?? _taskList.Where(x => x.TaskName == trigger.JobName && x.GroupName == trigger.JobGroup).FirstOrDefault();
+            if (string.IsNullOrEmpty(cron))
+                return cron;
+
+            // 鎷嗗垎Cron琛ㄨ揪寮忥紙鏍囧噯Cron锛氱 鍒� 鏃� 鏃� 鏈� 鍛� 骞达紙鍙�夛級锛�
+            var str = cron.Split(" ", StringSplitOptions.RemoveEmptyEntries);
+            if (str.Length < 6)
+                return cron;
+
+            // 鍏煎 ASP.NET Core 3.1 鐨勫啓娉曪紙鏇挎崲 or 璇硶锛�
+            // 淇鍦烘櫙锛欴ay瀛楁涓�1L/2L...7L 涓� 鍛ㄥ瓧娈典负? 鏃讹紝浜ゆ崲Day鍜屽懆瀛楁
+            // 鍘熷洜锛氬墠绔彲鑳芥贩娣嗕簡Day/鍛ㄥ瓧娈电殑鍐欐硶锛孮uartz瀵筁锛堟渶鍚庝竴澶╋級鐨勮В鏋愭湁鐗瑰畾瑙勫垯
+            var dayValue = str[3];// 绗�4涓瓧娈碉細Day
+            if ((dayValue == "1L" || dayValue == "2L" || dayValue == "3L" ||
+                 dayValue == "4L" || dayValue == "5L" || dayValue == "6L" || dayValue == "7L") && str[5] == "?")
+            {
+                str[5] = str[3]; // 鍛ㄥ瓧娈� = 鍘烡ay瀛楁
+                str[3] = "?";    // Day瀛楁 = ?
+                return string.Join(" ", str);
+            }
+
+            return cron;
         }
 
         /// <summary>
-        /// 浣滀笟鏄惁瀛樺湪
+        /// 楠岃瘉Cron琛ㄨ揪寮忔槸鍚︽湁鏁�
         /// </summary>
-        /// <param name="taskOptions"></param>
-        /// <param name="init">鍒濆鍖栫殑涓嶉渶瑕佸垽鏂�</param>
-        /// <returns></returns>
-        public static (bool, object) Exists(this TaskOptions taskOptions, bool init)
-        {
-            if (!init && _taskList.Any(x => x.TaskName == taskOptions.TaskName && x.GroupName == taskOptions.GroupName))
-            {
-                return (false,
-                    new
-                    {
-                        status = false,
-                        msg = $"浣滀笟:{taskOptions.TaskName},鍒嗙粍锛歿taskOptions.GroupName}宸茬粡瀛樺湪"
-                    });
-            }
-            return (true, null);
-        }
-
+        /// <param name="cronExpression">Cron琛ㄨ揪寮�</param>
+        /// <returns>鏄惁鏈夋晥 + 閿欒淇℃伅</returns>
         public static (bool, string) IsValidExpression(this string cronExpression)
         {
             try
             {
-                CronTriggerImpl trigger = new CronTriggerImpl();
+                // 閫氳繃Quartz鍐呯疆鐨凜ronTriggerImpl楠岃瘉琛ㄨ揪寮�
+                var trigger = new CronTriggerImpl();
                 trigger.CronExpressionString = cronExpression;
-                DateTimeOffset? date = trigger.ComputeFirstFireTimeUtc(null);
-                return (date != null, date == null ? $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!" : "");
+                // 璁$畻绗竴涓Е鍙戞椂闂达細null琛ㄧず琛ㄨ揪寮忔棤鏁�
+                var date = trigger.ComputeFirstFireTimeUtc(null);
+                return (date != null, date == null ? $"琛ㄨ揪寮弡cronExpression}鏃犳晥!" : string.Empty);
             }
             catch (Exception e)
             {
-                return (false, $"璇风‘璁よ〃杈惧紡{cronExpression}鏄惁姝g‘!{e.Message}");
+                return (false, $"琛ㄨ揪寮弡cronExpression}鏃犳晥!{e.Message}");
             }
         }
-    }
 
+        /// <summary>
+        /// 浠嶫ob鎵ц涓婁笅鏂囪幏鍙栦换鍔¢厤缃�
+        /// 鐢ㄤ簬Job鎵ц鏃惰幏鍙栨渶鏂扮殑浠诲姟鍙傛暟
+        /// </summary>
+        /// <param name="context">Job鎵ц涓婁笅鏂�</param>
+        /// <returns>浠诲姟閰嶇疆椤�</returns>
+        public static TaskOptions GetTaskOptions(this IJobExecutionContext context)
+        {
+            var jobKey = context.JobDetail.Key;
+            // 浠庡唴瀛樺垪琛ㄤ腑鑾峰彇鍖归厤鐨勪换鍔★紙Job鎵ц鏃朵紭鍏堢敤鍐呭瓨锛屽噺灏戞暟鎹簱鏌ヨ锛�
+            return _taskList.FirstOrDefault(x => x.TaskName == jobKey.Name && x.GroupName == jobKey.Group);
+        }
+    }
 }

--
Gitblit v1.9.3