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 { /// /// 作业基类 /// 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(); /// /// 开始时间 /// public DateTime StartTime { get; set; } /// /// 保存日志 /// 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().Where(x => x.JobName == context.JobId && x.JobType == type.Name).First(); var logentity = new TSK_LOG { JobId = job.ID, TriggerType = context.JobDetail.JobType, AssemblyName = context.JobDetail.AssemblyName, Args = context.Trigger.Args, Operation = context.Trigger.Status.ToString(), Status = "Successed", StartTime = StartTime, EndTime = context.Trigger.EndTime, ElapsedTime = context.Trigger.ElapsedTime, Remark = remark }; var db = Business.Biz.Db; //保存到数据库 var dbTran = db.UseTran(() => { db.Insertable(logentity).ExecuteCommand(); }); if (!dbTran.IsSuccess) { action.GetResponse().CatchExceptionWithLog(dbTran.ErrorException, $"作业保存到数据库异常"); } return action; } /// /// 保存日志 /// /// /// /// public ApiAction SaveFluentSchedulerLog(string status, string remark) { ApiAction action = new ApiAction(); if (Trig != null) { Trig.ElapsedTime = (long)Math.Ceiling((DateTime.Now - StartTime).TotalMilliseconds); Trig.StartTime = StartTime; Trig.EndTime = DateTime.Now; } else { action.IsSuccessed = false; action.LocaleMsg = new($"工作任务不存在"); Logger.Scheduler.Error("工作任务不存在\r\n"); return action; } var logentity = new TSK_LOG { 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, Remark = remark }; var db = Business.Biz.Db; //保存到数据库 var dbTran = db.UseTran(() => { 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($"计划调度(名称:{Job.JobName})作业日志保存到数据库完成\r\n"); return action; } /// /// 获取任务 /// public void GetJob(string jobType) { Job = Biz.Db.Queryable().Where(q => q.JobType == jobType).IncludesAllFirstLayer().First(); Args = JsonConvert.DeserializeObject(Job.Triggers[0].Args); Trig = Job.Triggers[0]; } /// /// 判断时间,返回是否可以继续工作任务 /// /// 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; } } }