From dcd80459e1ad3b7fc9ba6bcd581feb430f0778d3 Mon Sep 17 00:00:00 2001
From: Ben Lin <maobin001@msn.com>
Date: 星期六, 26 十月 2024 00:35:01 +0800
Subject: [PATCH] 计划任务更新

---
 Tiger.Business/Services/Base/InterfaceServiceNew.cs |  149 +++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 118 insertions(+), 31 deletions(-)

diff --git a/Tiger.Business/Services/Base/InterfaceServiceNew.cs b/Tiger.Business/Services/Base/InterfaceServiceNew.cs
index fae4b69..c876b3d 100644
--- a/Tiger.Business/Services/Base/InterfaceServiceNew.cs
+++ b/Tiger.Business/Services/Base/InterfaceServiceNew.cs
@@ -5,12 +5,16 @@
 using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
+using System.Security.Cryptography;
 using System.Text;
 using System.Threading;
 using System.Threading.Tasks;
 using Tiger.IBusiness;
 using Tiger.Model;
+using Tiger.Model.Entitys.MES.Position;
 using Tiger.Model.Minsun;
+using static Microsoft.CodeAnalysis.CSharp.SyntaxTokenParser;
+using static Tiger.Model.TrigArgs;
 
 namespace Tiger.Business
 {
@@ -270,6 +274,34 @@
             JobManager.JobException += info => Logger.Scheduler.Error("An error just happened with a scheduled job: " + info.Exception);
             JobManager.JobStart += info => Logger.Scheduler.Info($"{info.Name}: started\r\n");
             JobManager.JobEnd += info => Logger.Scheduler.Info($"{info.Name}: ended ({info.Duration})\r\n");
+            SaveRunningStatus(); //淇濆瓨鐘舵��
+        }
+
+        private void SaveRunningStatus() {
+            TSK_TRIG trig = new TSK_TRIG();
+            foreach (var schedule in JobManager.RunningSchedules)
+            {
+                var job = Biz.Db.Queryable<TSK_JOB>().Where(q => q.JobName == schedule.Name).First();
+                if (job != null)
+                {
+                    trig = Biz.Db.Queryable<TSK_TRIG>().Where(q => q.JobId == job.ID).First();
+                    trig.Status = TSK_TRIG.Statuss.Running.GetValue();
+                    trig.StartTime = DateTime.Now;
+                }
+            }
+            var db = Biz.Db;
+            //淇濆瓨鍒版暟鎹簱
+            var dbTran = db.UseTran(() =>
+            {
+                if (trig != null)
+                {
+                    db.Updateable(trig, "system").UpdateColumns(q => new { q.Status, q.UPDATE_USER, q.UPDATE_TIME }).ExecuteCommand();
+                }
+            });
+            if (!dbTran.IsSuccess)
+            {
+                Logger.Scheduler.Trace(dbTran.ErrorException, $"浣滀笟淇濆瓨鍒版暟鎹簱寮傚父");
+            }
         }
 
         /// <summary>
@@ -279,26 +311,51 @@
         /// <param name="newEntity"></param>
         /// <param name="jobParam"></param>
         /// <returns></returns>
-        public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, IJob
+        public ApiAction AddJob<TJob>(TJob newEntity, FluentJobParam jobParam) where TJob : class, ITJob
         {
             ApiAction apiAction = new();
             try
             {
-                JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(jobParam.JobName)));
-
-                //Sundial.TriggerBuilder triggerBuilder = Sundial.Triggers.Period(jobParam.Period * 60 * 1000).LoadFrom(new
-                //{
-                //    TriggerId = jobParam.JobName + "_trigger1",
-                //});
-                //_schedulerFactory.AddJob<TJob>(jobParam.JobName, triggerBuilder);
-                //var trigger = GetJob(jobParam.JobName).GetTrigger($"{jobParam.JobName}_trigger1");
-                //TSK_JOB entity = ReturnDetail(jobParam.JobName);
-                //entity.Remark = jobParam.Remark;
-                //entity.JobType = typeof(TJob).Name;
-                //entity.JobName = jobParam.JobName;
-                //entity.TriggersWithGhost = new List<TSK_TRIG> { JsonConvert.DeserializeObject<TSK_TRIG>(JsonConvert.SerializeObject(trigger)) };
-                //entity.Triggers[0].Args = jobParam.Period.ToString();
-                //apiAction = SaveJob(entity);
+                JobManager.AddJob<TJob>((s) => GenerateSchedule(jobParam.Args, s.WithName(typeof(TJob).Name)));
+                string guid = Guid.NewGuid().ToString("N");
+                var trigger = new TSK_TRIG()
+                {
+                    JobId = guid,
+                    Args = JsonConvert.SerializeObject(jobParam.Args),
+                    Status = TSK_TRIG.Statuss.Running.GetValue(),
+                    StartTime = DateTime.Now,
+                    NumberOfRuns = 1,
+                };
+                TSK_JOB job = new()
+                {
+                    ID = guid,
+                    Remark = jobParam.Remark,
+                    JobType = typeof(TJob).Name,
+                    AssemblyName = jobParam.AssemblyName,
+                    JobName = jobParam.JobName,
+                };
+                if (Biz.Db.Queryable<TSK_JOB>().Any(q=>q.JobName == typeof(TJob).Name)) {
+                    apiAction.IsSuccessed = false;
+                    apiAction.LocaleMsg = new($"浠诲姟宸茬粡瀛樺湪");
+                    return apiAction;
+                }
+                var db = Biz.Db;
+                //淇濆瓨鍒版暟鎹簱
+                var dbTran = db.UseTran(() =>
+                {
+                    if (job != null)
+                    {
+                        db.Insertable(job, "system").ExecuteCommand();
+                    }
+                    if (trigger != null)
+                    {
+                        db.Insertable(trigger, "system").ExecuteCommand();
+                    }
+                });
+                if (!dbTran.IsSuccess)
+                {
+                    Logger.Scheduler.Trace(dbTran.ErrorException, $"娣诲姞宸ヤ綔浠诲姟鏃朵繚瀛樺埌鏁版嵁搴撳紓甯�");
+                }
                 //apiAction.Data = entity;
 
             }
@@ -307,6 +364,15 @@
                 Logger.Console.Fatal(ex, "Add Job From DB Exception");
             }
             return apiAction;
+        }
+
+        /// <summary>
+        /// 鍒犻櫎浣滀笟
+        /// </summary>
+        /// <param name="jobname"></param>
+        public void RemovefJob(string jobname)
+        {
+            JobManager.RemoveJob(jobname);
         }
 
         /// <summary>
@@ -344,9 +410,9 @@
         /// <param name="JobName"></param>
         /// <param name="registry"></param>
         /// <returns></returns>
-        private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, IJob
+        private Schedule Schedule<TJob>(TJob entity, string JobName, Registry registry) where TJob : class, ITJob
         {
-            return registry.Schedule<TJob>().WithName(JobName);
+            return registry.Schedule<TJob>().WithName(typeof(TJob).Name);
         }
 
         /// <summary>
@@ -358,12 +424,23 @@
         {
             SpecificTimeUnit specificTimeUnit = null;
             TimeUnit timeUnit = null;
-            if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); }
-            if (args.ToRunNow == "Y") { specificTimeUnit = schedule.ToRunNow(); }
-            if (args.ToRunOnceAt == "Y") { specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); }
-            if (args.ToRunOnceIn > 0) { timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); }
-            else if (args.ToRunEvery >= 0) { timeUnit = schedule.ToRunEvery(args.ToRunEvery); }
-            if (specificTimeUnit != null && args.AndEvery>0) { timeUnit = specificTimeUnit.AndEvery(args.AndEvery); }
+            if (args.NonReentrant == "Y") { schedule = schedule.NonReentrant(); } //灏辨槸鏄惁璺熶箣鍓嶇殑杩樻病杩愯瀹岀殑璁″垝鍚屾椂杩愯銆�
+            switch (args.runType)
+            {
+                case RunType.ToRunNow:
+                    specificTimeUnit = schedule.ToRunNow(); //椹笂杩愯
+                    break;
+                case RunType.ToRunOnceAt:
+                    specificTimeUnit = schedule.ToRunOnceAt(args.ToRunOnceAtDt.AddMinutes(args.NowAddMinutes)); //杩愯涓�娆″湪鍝釜鏃堕棿,
+                    break;
+                case RunType.ToRunOnceIn:
+                    timeUnit = schedule.ToRunOnceIn(args.ToRunOnceIn); //鍦ㄥ灏戝悗杩愯涓�娆�
+                    break;
+                case RunType.ToRunEvery:
+                    timeUnit = schedule.ToRunEvery(args.ToRunEvery); //姣忛殧澶氬皯杩愯涓�鍥�
+                    break;
+            }
+            if (specificTimeUnit != null) { timeUnit = specificTimeUnit.AndEvery(args.ToRunEvery); } //姣忛殧澶氬皯杩愯涓�鍥烇紝鍔犲湪ToRunNow銆乀oRunOnceAt鍚庨潰
             //鎸夋椂闂寸被鍨嬫潵杩愯
             switch (args.Type)
             {
@@ -371,7 +448,7 @@
                     timeUnit.Milliseconds();
                     break;
                 case TrigArgs.EveryType.Seconds:
-                    timeUnit.Seconds();
+                    timeUnit.Seconds(); //琛ㄧず鎸夌锛屽灏戠瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(5).Seconds() 杩欎釜灏辫〃绀� 闅�5绉掕繍琛屼竴娆�
                     break;
                 case TrigArgs.EveryType.Minutes:
                     timeUnit.Minutes();
@@ -379,7 +456,7 @@
                 case TrigArgs.EveryType.Hours:
                     if (args.Minutes > 0)
                     {
-                        timeUnit.Hours().At(args.Minutes);
+                        timeUnit.Hours().At(args.Minutes); //琛ㄧず鎸夋瘡灏忔椂鐨勫垎閽燂紝澶氬皯鍒嗚鐪嬪墠闈very鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Hours().At(5) 杩欎釜灏辫〃绀� 闅�1灏忔椂鐨勭5鍒嗛挓杩愯涓�娆�
                     }
                     else
                     {
@@ -387,9 +464,9 @@
                     }
                     break;
                 case TrigArgs.EveryType.Days:
-                    if (args.Hours > 0 && args.Minutes > 0)
+                    if (args.Hours > 0)
                     {
-                        timeUnit.Days().At(args.Hours, args.Minutes);
+                        timeUnit.Days().At(args.Hours, args.Minutes); //琛ㄧず鎸夊ぉ锛屽灏戝ぉ瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(2).Days().At(14, 15) 杩欎釜灏辫〃绀� 闅�2澶╃殑14:15杩愯涓�娆�
                     }
                     else
                     {
@@ -397,9 +474,9 @@
                     }
                     break;
                 case TrigArgs.EveryType.Weeks:
-                    if (args.Hours > 0 && args.Minutes > 0)
+                    if (args.Hours > 0)
                     {
-                        timeUnit.Weeks().At(args.Hours, args.Minutes);
+                        timeUnit.Weeks().At(args.Hours, args.Minutes); //琛ㄧず鎸夊懆锛屽灏戝懆瑕佺湅鍓嶉潰Every鐨勬暟锛屾瘮濡傦細ToRunEvery(1).Weeks().At(14, 15) 杩欎釜灏辫〃绀� 闅�1鍛ㄧ殑14:15杩愯涓�娆�
                     }
                     else
                     {
@@ -407,7 +484,7 @@
                     }
                     break;
                 case TrigArgs.EveryType.Weekdays:
-                    if (args.Hours > 0 && args.Minutes > 0)
+                    if (args.Hours > 0 )
                     {
                         timeUnit.Weekdays().At(args.Hours, args.Minutes);
                     }
@@ -416,6 +493,16 @@
                         timeUnit.Weekdays();
                     }
                     break;
+                case TrigArgs.EveryType.Months:
+                    if (args.Days>0 && args.Hours > 0)
+                    {
+                        timeUnit.Months().On(args.Days).At(args.Hours, args.Minutes);
+                    }
+                    else
+                    {
+                        timeUnit.Months();
+                    }
+                    break;
             }
         }
 

--
Gitblit v1.9.3