服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2024-10-26 dcd80459e1ad3b7fc9ba6bcd581feb430f0778d3
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、ToRunOnceAt后面
            //按时间类型来运行
            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); //表示按每小时的分钟,多少分要看前面Every的数,比如: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;
            }
        }