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 static DateTime StartTime { get; set; }
///
/// 保存日志
///
public static 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 CheckIFCanGo()
{
TskJobInput tskJobInput = new TskJobInput();
var dateTime = DateTime.Now;
if (Args.Interval > 0)
{
tskJobInput.result = true;
tskJobInput.input = new()
{
startTime = dateTime.AddHours(-Args.Interval).ToString("yyyy-MM-dd HH:mm:ss"),
endTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
};
}
else
{
//按时间类型来运行
switch (Args.Type)
{
case TrigArgs.EveryType.Milliseconds:
dateTime = Trig.LastRunTime ?? DateTime.Now.AddMilliseconds(-Args.ToRunEvery);
tskJobInput.result = (DateTime.Now - dateTime).TotalMilliseconds > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalSeconds > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalMinutes > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalHours > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * 7;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery;
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = 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 = (DateTime.Now - dateTime).TotalDays > Args.ToRunEvery * DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month);
tskJobInput.input = new()
{
startTime = dateTime.ToString("yyyy-MM-dd HH:mm:ss"),
endTime = dateTime.AddMonths(Args.ToRunEvery).ToString("yyyy-MM-dd HH:mm:ss"),
};
break;
}
}
return tskJobInput;
}
}
}