123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- using Comal.Classes;
- using InABox.Clients;
- using InABox.Core;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Timers;
- namespace Comal.TaskScheduler.Shared
- {
- public class Scheduler
- {
- private Timer timer;
- public TimeSpan Interval { get; set; }
- public Scheduler()
- {
- CoreUtils.RegisterClasses();
- ComalUtils.RegisterClasses();
- // Set the Interval to 1 minute
- Interval = new TimeSpan(0, 1, 0);
- timer = new System.Timers.Timer(Interval.TotalMilliseconds);
- timer.Elapsed += new ElapsedEventHandler(CheckSchedules);
- }
- public void Start()
- {
- DoCheckSchedules();
- }
- public void Stop()
- {
- timer.Enabled = false;
- }
- private object? GetEntity(Type type, Guid id)
- {
- if (type == typeof(Equipment))
- return new Client<Equipment>().Load(new Filter<Equipment>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- else if (type == typeof(Customer))
- return new Client<Customer>().Load(new Filter<Customer>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- else if (type == typeof(Employee))
- return new Client<Employee>().Load(new Filter<Employee>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- else if (type == typeof(CustomModule))
- return new Client<CustomModule>().Load(new Filter<CustomModule>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- else if (type == typeof(ScheduledScript))
- return new Client<ScheduledScript>().Load(new Filter<ScheduledScript>(x => x.ID).IsEqualTo(id)).FirstOrDefault();
- return null;
- //var type = schedule.DocumentType;
- //IClient client = ClientFactory.CreateClient(type);
- //var filter = new Filter<Entity>(x => x.ID).IsEqualTo(schedule.DocumentID);
- //Entity entity = client.Load(filter).FirstOrDefault();
- //var item = entity as ISchedulable;
- }
- private void DoCheckSchedules()
- {
- timer.Enabled = false;
- Logger.Send(LogType.Information, ClientFactory.UserID, "Checking Schedules");
- var scheduleClient = new Client<Schedule>();
- try
- {
- Schedule[] schedules = scheduleClient.Load(
- new Filter<Schedule>(x => x.DocumentClass).IsNotEqualTo("")
- .And(x => x.DocumentID).IsNotEqualTo(Guid.Empty)
- .And(x => x.Active).IsEqualTo(true) //.And(x => x.DueDate).IsLessThan(DateTime.Now)
- );
- EmployeeRole[] EmployeeRoles = new Client<EmployeeRole>().Load();
- var cache = new Dictionary<string, Entity[]>();
- for (int i = 0; i < schedules.Length; i++)
- {
- Schedule schedule = schedules[i];
- if ((schedule.DocumentClass != "") && (schedule.DocumentID != Guid.Empty))
- {
- ISchedulePlugin? plugin = SchedulePluginFactory.GetPlugin(schedule.DocumentClass);
- if(plugin == null)
- {
- Logger.Send(LogType.Error, ClientFactory.UserID, $"No plugin for {schedule.DocumentClass}");
- continue;
- }
- //var entity = plugin.LoadEntity(schedule.DocumentID);
- if (!cache.ContainsKey(schedule.DocumentClass))
- {
- Guid[] ids = schedules.Where(x => x.DocumentClass.Equals(schedule.DocumentClass)).Select(x => x.DocumentID).ToArray();
- cache[schedule.DocumentClass] = plugin.LoadEntities(ids);
- }
- var entities = cache[schedule.DocumentClass];
- var entity = entities.FirstOrDefault(x => x.ID.Equals(schedule.DocumentID));
- if (entity != null)
- {
- Logger.Send(LogType.Information, ClientFactory.UserID, $"- {entity} - {schedule.Title}");
- try
- {
- if (!plugin.Execute(schedule, entity))
- Logger.Send(LogType.Information, ClientFactory.UserID, " * Schedule not yet due");
- }
- catch (Exception e)
- {
- Logger.Send(LogType.Information, ClientFactory.UserID, $" * Exception while processing schedule: {e.Message}\n" + String.Join("\n",e.StackTrace));
- }
- }
- else
- Logger.Send(LogType.Information, ClientFactory.UserID, $"- {schedule.Title}: cannot find linked entity({schedule.DocumentClass})");
- }
- }
- }
- catch (Exception err)
- {
- Logger.Send(LogType.Information, ClientFactory.UserID, err.Message + "\r\n" + err.StackTrace);
- }
- GC.Collect();
- GC.WaitForPendingFinalizers();
- GC.Collect();
- timer.Enabled = true;
- }
- private void CheckSchedules(object source, ElapsedEventArgs e)
- {
- DoCheckSchedules();
- }
-
- }
- }
|