public void Execute(IJobExecutionContext context) { var pmList = _pmRepository.GetAll() .Where(s => s.PMStatus.Name == "Active" && (s.WorkOrders.All(w => w.Assignment.Name == WorkflowStatus.Closed || w.Assignment.Name == WorkflowStatus.Cancelled))) .ToList(); if (pmList.Count == 0) { return; } var wo = new WorkOrder(); foreach (var pm in pmList) { #region Time-Based if (pm.FirstWorkExpectedStartDateTime.HasValue) { // get the latest WO var latestWO = pm.WorkOrders.OrderByDescending(w => w.ActualEndDateTime).FirstOrDefault(); // This is the first work if (latestWO == null) { wo = _pmService.CreateNextWorkOrder(pm, pm.FirstWorkExpectedStartDateTime.Value, pm.FirstWorkDueDateTime.Value); s_log.InfoFormat("Generated WO = {0} for PM = {1}", wo.Number, pm.Number); // Generate WO for only one PM at a time return; } else if ((latestWO.Assignment.Name == WorkflowStatus.Closed || latestWO.Assignment.Name == WorkflowStatus.Cancelled) && latestWO.DueDateTime <= pm.EndDateTime) { wo = _workOrderService.CreateNextWorkOrderForPM(latestWO); s_log.InfoFormat("Generated WO = {0} for PM = {1}", wo.Number, pm.Number); // Generate WO for only one PM at a time return; } } #endregion #region Meter-Based if (pm.PMMeterFrequencies.Count > 0) { foreach (var pMMeterFrequency in pm.PMMeterFrequencies) { var pointMeterLineItem = _pointMeterLineItemRepository.GetAll() .Where(m => pMMeterFrequency.MeterId != null && m.MeterId == pMMeterFrequency.MeterId && ((m.Point.AssetId != null && m.Point.AssetId == pMMeterFrequency.PreventiveMaintenance.AssetId) || (m.Point.LocationId != null && m.Point.LocationId == pMMeterFrequency.PreventiveMaintenance.LocationId))).FirstOrDefault(); var lastReadingValueRange = (int)Math.Round(pointMeterLineItem.LastReadingValue.Value / pMMeterFrequency.Frequency.Value); var generatedReadingRange = (int)Math.Round(pMMeterFrequency.GeneratedReading.HasValue ? pMMeterFrequency.GeneratedReading.Value / pMMeterFrequency.Frequency.Value : 0); if (pMMeterFrequency.GeneratedReading == null || (lastReadingValueRange != generatedReadingRange && pointMeterLineItem.LastReadingValue <= pMMeterFrequency.EndReading.Value)) { wo = _pmService.CreateNextWorkOrder(pm, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); s_log.InfoFormat("Generated WO = {0} for PM = {1}", wo.Number, pm.Number); pMMeterFrequency.GeneratedReading = pointMeterLineItem.LastReadingValue; _pMMeterFrequencyRepository.UpdateAndCommit(pMMeterFrequency); return; } } } #endregion #region Event-Based if (pm.MeterEvents.Count > 0) { foreach (var meterEvent in pm.MeterEvents) { var meterEventHistory = _meterEventHistoryRepository.GetAll().Where(h => h.MeterEventId == meterEvent.Id && h.IsWorkOrderCreated == false).FirstOrDefault(); if (meterEventHistory != null) { wo = _pmService.CreateNextWorkOrder(pm, DateTime.UtcNow, DateTime.UtcNow.AddDays(1)); s_log.InfoFormat("Generated WO = {0} for PM = {1}", wo.Number, pm.Number); meterEventHistory.IsWorkOrderCreated = true; _meterEventHistoryRepository.UpdateAndCommit(meterEventHistory); return; } } } #endregion } }