コード例 #1
0
        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
            }
        }