服务端的TigerApi 框架,基于.NET6 2024 版本
Ben Lin
2025-01-10 7896af53e190bcecea516b1203d5020a0103f155
Tiger.Business/Services/Base/TigerJobBase.cs
@@ -1,8 +1,11 @@
using Rhea.Common;
using FluentScheduler;
using Newtonsoft.Json;
using Rhea.Common;
using Sundial;
using System;
using Tiger.IBusiness;
using Tiger.Model;
using Tiger.Model.Entitys.MES.Position;
namespace Tiger.Business
{
@@ -11,20 +14,26 @@
    /// </summary>
    public class TigerJobBase
    {
        public Schedule Schedule;
        public TSK_JOB Job = new TSK_JOB();
        public TSK_TRIG Trig = new TSK_TRIG();
        public TrigArgs Args = new TrigArgs();
        /// <summary>
        /// 开始时间
        /// </summary>
        public static DateTime StartTime { get; set; }
        public DateTime StartTime { get; set; }
        /// <summary>
        /// 保存日志
        /// </summary>
        public static ApiAction SaveLog(JobExecutingContext context,string remark) {
        public ApiAction SaveLog(JobExecutingContext context, string remark)
        {
            ApiAction action = new ApiAction();
            Type type = Type.GetType(context.JobDetail.JobType, throwOnError: true);
            var job = Biz.Db.Queryable<TSK_JOB>().Where(x=>x.JobName == context.JobId && x.JobType == type.Name).First();
            var logentity = new TSK_LOG {
            var job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == context.JobId && x.JobType == type.Name).First();
            var logentity = new TSK_LOG
            {
                JobId = job.ID,
                TriggerType =context.JobDetail.JobType,
                TriggerType = context.JobDetail.JobType,
                AssemblyName = context.JobDetail.AssemblyName,
                Args = context.Trigger.Args,
                Operation = context.Trigger.Status.ToString(),
@@ -54,18 +63,17 @@
        /// <param name="JobName"></param>
        /// <param name="remark"></param>
        /// <returns></returns>
        public static ApiAction SaveFluentSchedulerLog(string JobName,string status, string remark)
        public ApiAction SaveFluentSchedulerLog(string status, string remark)
        {
            ApiAction action = new ApiAction();
            var job = Biz.Db.Queryable<TSK_JOB>().Where(x => x.JobName == JobName).IncludesAllFirstLayer().First();
            var trig = job.Triggers?[0];
            if (trig != null)
            if (Trig != null)
            {
                trig.ElapsedTime = (long)Math.Ceiling((DateTime.Now-StartTime).TotalMilliseconds);
                trig.StartTime = StartTime;
                trig.EndTime = DateTime.Now;
                Trig.ElapsedTime = (long)Math.Ceiling((DateTime.Now - StartTime).TotalMilliseconds);
                Trig.StartTime = StartTime;
                Trig.EndTime = DateTime.Now;
            }
            else {
            else
            {
                action.IsSuccessed = false;
                action.LocaleMsg = new($"工作任务不存在");
                Logger.Scheduler.Error("工作任务不存在\r\n");
@@ -73,14 +81,14 @@
            }
            var logentity = new TSK_LOG
            {
                JobId = job.ID,
                AssemblyName = job.AssemblyName,
                Args = trig.Args,
                JobId = Job.ID,
                AssemblyName = Job.AssemblyName,
                Args = Trig.Args,
                //Operation = job.Triggers?[0].Status.ToString(),
                Status = status, //job.Triggers?[0].Status.ToString(),
                StartTime = trig.StartTime,
                EndTime = trig.EndTime,
                ElapsedTime = trig.ElapsedTime,
                StartTime = Trig.StartTime,
                EndTime = Trig.EndTime,
                ElapsedTime = Trig.ElapsedTime,
                Remark = remark
            };
@@ -88,16 +96,113 @@
            //保存到数据库
            var dbTran = db.UseTran(() =>
            {
                db.Updateable(trig, "System_Job").UpdateColumns(q => new { q.StartTime, q.ElapsedTime,q.UpdatedTime,q.UPDATE_USER}).ExecuteCommand();
                db.Updateable(Trig, "System_Job").UpdateColumns(q => new { q.StartTime, q.LastRunTime, q.ElapsedTime, q.UpdatedTime, q.UPDATE_USER }).ExecuteCommand();
                db.Insertable(logentity).ExecuteCommand();
            });
            if (!dbTran.IsSuccess)
            {
                action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"作业日志保存到数据库异常");
            }
            Logger.Scheduler.Info($"计划调度(名称:{JobName})作业日志保存到数据库完成\r\n");
            Logger.Scheduler.Info($"计划调度(名称:{Job.JobName})作业日志保存到数据库完成\r\n");
            return action;
        }
        /// <summary>
        /// 获取任务
        /// </summary>
        public void GetJob(string jobType)
        {
            Job = Biz.Db.Queryable<TSK_JOB>().Where(q => q.JobType == jobType).IncludesAllFirstLayer().First();
            Args = JsonConvert.DeserializeObject<TrigArgs>(Job.Triggers[0].Args);
            Trig = Job.Triggers[0];
        }
        /// <summary>
        /// 判断时间,返回是否可以继续工作任务
        /// </summary>
        /// <returns></returns>
        public TskJobInput CheckHowToDo()
        {
            TskJobInput tskJobInput = new TskJobInput();
            var dateTime = DateTime.Now;
            //按时间类型来运行
            switch (Args.Type)
            {
                case TrigArgs.EveryType.Milliseconds:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddMilliseconds(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalMilliseconds > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y"? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddMilliseconds(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Seconds:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddSeconds(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalSeconds > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddSeconds(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Minutes:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddMinutes(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalMinutes > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddMinutes(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Hours:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddHours(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalHours > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddHours(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Days:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Weeks:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-7);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * 7;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Weekdays:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddDays(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery;
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddDays(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
                case TrigArgs.EveryType.Months:
                    dateTime = Trig.LastRunTime ?? DateTime.Now.AddMonths(-Args.ToRunEvery);
                    tskJobInput.result = Args.Interval > 0 ? true : (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
                    tskJobInput.input = new()
                    {
                        startTime = Args.Interval > 0 ? ((DateTime)Trig.LastRunTime).AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss") : dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
                        endTime = Args.ByInterval == "Y" ? dateTime.ToString("yyyy-MM-dd HH:mm:ss") : dateTime.AddMonths(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
                    };
                    break;
            }
            return tskJobInput;
        }
    }
}