Files
FT479/WPFWCSDemo/App.xaml.cs
2026-06-29 14:46:32 +08:00

194 lines
8.1 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Quartz;
using Quartz.Impl;
using Quartz.Simpl;
using Serilog;
using Serilog.Events;
using System;
using System.Configuration;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using WPFWCSDemo.Schedules.CircleRGV;
using WPFWCSDemo.Schedules.CommonTask;
using WPFWCSDemo.Schedules.TaskFinish;
using WPFWCSDemo.Utilities;
using WPFWCSDemo.ViewModels;
namespace WPFWCSDemo
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
private IScheduler _scheduler;
public App()
{
InitializeComponent();
//Serilog其他
//Serilog日志配置
//Debug-
//Info-调度信息
//Warning-设备读写/连接异常
//Error-执行异常,交互异常
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
//.Filter.ByIncludingOnly(logEvent => logEvent.Level == LogEventLevel.Debug)
.WriteTo.File(path: $"D:/Logs/Debug/Debug.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", restrictedToMinimumLevel: LogEventLevel.Debug, rollingInterval: RollingInterval.Day)
.WriteTo.File(path: $"D:/Logs/Info/Info.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", restrictedToMinimumLevel: LogEventLevel.Information, rollingInterval: RollingInterval.Day)
.WriteTo.File(path: $"D:/Logs/Warning/Warning.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", restrictedToMinimumLevel: LogEventLevel.Warning, rollingInterval: RollingInterval.Day)
.WriteTo.File(path: $"D:/Logs/Error/Error.txt", outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level}] {Message}{NewLine}{Exception}", restrictedToMinimumLevel: LogEventLevel.Error, rollingInterval: RollingInterval.Day)
//.Filter.ByExcluding(logEvent => logEvent.Level == LogEventLevel.Warning)
.Enrich.FromLogContext()
.CreateLogger();
//获取app.config中sql连接字符串
SqlHelper.ConStr = ConfigurationManager.ConnectionStrings["ConStr"].ConnectionString;
//检查进程是否已经启动,已经启动则显示报错信息退出程序。
string strProcessName = System.Diagnostics.Process.GetCurrentProcess().ProcessName;
if (System.Diagnostics.Process.GetProcessesByName(strProcessName).Length > 1)
{
MessageBox.Show("对不起,本地已经有系统正在运行", "退出", MessageBoxButton.OK, MessageBoxImage.Exclamation);
Current.Shutdown();
return;
}
}
protected async override void OnStartup(StartupEventArgs e)
{
try
{
Log.Information("**********************************Application Is Started**********************************");
Log.Information("**********************************Application Is Started**********************************");
Log.Information("**********************************Application Is Started**********************************");
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
//==============================================================================================
Log.Information("【Application is Starting】环穿设备初始化中...");
CircleRGVsViewModel.InitializeRgv();
//CircleRGVsViewModel.RGVStationInitialize();
Log.Information("【Application is Starting】环穿设备初始化完成!");
//==============================================================================================
Log.Information("【Application is Starting】报警信息初始化中...");
AlarmViewModel.AlarmInitialize();
Log.Information("【Application is Starting】报警信息初始化完成!");
//==============================================================================================
Log.Information("【Application is Starting】调度程序初始化中...");
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = schedulerFactory.GetScheduler().Result;
await _scheduler.Start();
Log.Information("【Application is Starting】调度程序启动中...");
#region 注册环穿调度任务
Log.Information("【Application is Starting】设备调度初始化中...");
GetScheduleJob(typeof(CircleRGVSchedule), "circleRGVJob", "circleRGVTrigger", "circleRGVSchedule", 2000);
#endregion
//-------------------------------------------------------------------------------
#region 调度任务处理
//任务处理---注册任务
Log.Information("【Application is Starting】任务处理调度初始化中...");
GetScheduleJob(typeof(TaskFinishSchedule), "taskHandlerJob", "taskHandlerTrigger", "taskHandlerSchedule", 1000);
#endregion
//-------------------------------------------------------------------------------
#region 全局任务
//全局任务---注册任务
Log.Information("【Application is Starting】全局任务初始化中...");
GetScheduleJob(typeof(CommonTask), "globalTaskJob", "globalTTrigger", "commonTask", 1000);
#endregion
Log.Information("【Application is Starting】调度程序初始化完成!");
//==============================================================================================
stopwatch.Stop();
Log.Information($"【Application is Starting】WCS工程已启动,用时{stopwatch.Elapsed.TotalSeconds}s");
SqlHelper.NewEventLog("WCS调度已启动", "SYS");
}
catch (Exception ex)
{
Log.Error($"【Application is Starting】{ex.Message}");
Log.Error($"【Application is Starting】{ex.InnerException}");
Current.Shutdown();
}
}
protected override void OnExit(ExitEventArgs e)
{
base.OnExit(e);
Log.Information("【Application is Exiting】程序正在退出!");
_scheduler.Shutdown(true).Wait();
//Current.Shutdown();
}
/// <summary>
/// Quartz调度任务注册
/// </summary>
/// <param name="className">类名</param>
/// <param name="jobName">作业名称</param>
/// <param name="triggerName">触发器名称</param>
/// <param name="group">任务组名称</param>
private async void GetScheduleJob(Type className, string jobName, string triggerName, string group,int time)
{
var method = typeof(JobBuilder)
.GetMethods()
.First(m => m.Name == "Create" && m.IsGenericMethod);
var genericMethod = method.MakeGenericMethod(className);
var jobBuilder = genericMethod.Invoke(null, null);
//任务处理---注册任务
IJobDetail job = ((JobBuilder)jobBuilder)
//.Create<className>()
.WithIdentity(jobName, group)
.DisallowConcurrentExecution()
.Build();
//任务处理---触发器
ITrigger trigger = TriggerBuilder
.Create()
.WithIdentity(triggerName, group)
.StartNow()
.WithSimpleSchedule(x => x
.WithInterval(TimeSpan.FromMilliseconds(time))
.RepeatForever())
.Build();
await _scheduler.ScheduleJob(job, trigger);
}
}
}