public IList<Record> GetInRange(DateTimeIntervals intervalType, OperatorBarInfo barInfo, int startIdx, int count)
 {
     switch (barInfo.Level)
     {
         case 0:
             return GetOperatorsEfficiency(barInfo, startIdx, count);
         //case 1:
             //return GetOperatorProcessReport(barInfo);
     }
     return new List<Record>();
 }
Exemplo n.º 2
0
		public void InitializeProviders(object param)
		{
            var barInfo = new OperatorBarInfo {StartDate = StartDate, EndDate = EndDate};

		    if (param == null)
		        _history.Push(new OperatorBarInfo());
		    else
                barInfo = (OperatorBarInfo)param;

		    barInfo.IsCountBase = CurrentType == OEType.CountBased;


            LittleWindowWidth = 20;

		    int intervalCount = GetIntervalCount();

		    BarSlides = new VirtualizingCollection<BarSlideItemVm>(new OperatorBarSlideProvider(intervalCount), 100);

		    var barProvider = new OperatorBarProvider(intervalCount, 600, CurrentInterval, DataService, barInfo);
		    Bars = new VirtualizingCollection<OperatorBarVm>(barProvider, 100);

		    Scales.Clear();
		    ScaleLines.Clear();
		    ScaleHeight = barProvider.ScaleHeight;

		    for (int i = barProvider.MaxScale; i >= 0; i -= barProvider.StepScale)
		    {
		        Scales.Add(i);
		        ScaleLines.Add(0);
		    }
		    ScaleLines.RemoveAt(0);
		    
		    OnPropertyChanged("ScaleHeaders");
		}
        private IList<Record> GetOperatorsEfficiency(OperatorBarInfo oprInfo, int startIndex, int count)
        {
            IList<Record> records = new List<Record>();


            using (var context = new SoheilEdmContext())
            {
                var operatorRepository = new Repository<Operator>(context);
                var operatorProcessReportRepository = new Repository<OperatorProcessReport>(context);
                var processReportRepository = new Repository<ProcessReport>(context);
                var processRepository = new Repository<Process>(context);
                var ssaRepository = new Repository<StateStationActivity>(context);
                var srRepository = new Repository<StoppageReport>(context);
                var osrRepository = new Repository<OperatorStoppageReport>(context);
                var drRepository = new Repository<DefectionReport>(context);
                var odrRepository = new Repository<OperatorDefectionReport>(context);

                var operatorList = operatorRepository.Find(item=> item.Status != (decimal) Status.Deleted);
                var oprList = operatorProcessReportRepository.GetAll(); 
                var processReportList = processReportRepository.GetAll();
                var processList = processRepository.GetAll();
                var ssaList = ssaRepository.GetAll();
                var srList = srRepository.GetAll();
                var osrList = osrRepository.GetAll();
                var drList = drRepository.GetAll();
                var odrList = odrRepository.GetAll();

                var indexList = operatorList.Skip(startIndex).Take(count).Select((o, index) => new { interval = index, o.Id, o.Code, o.Name });

                var oprQuery = from opr in oprList
                               from processReport in processReportList.Where(pr=> opr.ProcessReport != null && opr.ProcessReport.Id == pr.Id && pr.StartDateTime >= oprInfo.StartDate && pr.StartDateTime < oprInfo.EndDate).DefaultIfEmpty()
                               from process in processList.Where(p=> processReport != null && processReport.Process != null && p.Id == processReport.Process.Id).DefaultIfEmpty()
                               from ssActivity in ssaList.Where(ssa => process!=null && process.StateStationActivity != null && ssa.Id == process.StateStationActivity.Id).DefaultIfEmpty()
                               let oprId = opr == null ? -1 : opr.Id
                               let prId = opr == null ? -1 : opr.ProcessReport == null ? -1 : opr.ProcessReport.Id
							   let oId = opr == null ? -1 : opr.ProcessOperator.Operator == null ? -1 : opr.ProcessOperator.Operator.Id
                               let ct = ssActivity == null ? 0 : ssActivity.CycleTime
                               let productionTime = opr == null || ssActivity == null ? 0 : opr.OperatorProducedG1 * ct
                               let productionCount = opr == null || ssActivity == null ? 0 : opr.OperatorProducedG1
                               select new { oprId, prId, oId, productionTime, productionCount, ct };

                var srQuery = from sReport in srList
                              from osReport in osrList.Where(osr => sReport != null && osr.StoppageReport != null && osr.StoppageReport.Id == sReport.Id)
                              from pReport in processReportList.Where(pr => sReport != null && sReport.ProcessReport != null && sReport.ProcessReport.Id == pr.Id && pr.StartDateTime >= oprInfo.StartDate && pr.StartDateTime < oprInfo.EndDate)
                              from opReport in oprList.Where(opr => pReport != null && opr.ProcessReport != null && opr.ProcessOperator != null && opr.ProcessOperator.Operator != null 
                                  && opr.ProcessReport.Id == pReport.Id && (osReport == null || osReport.Operator == null || opr.ProcessOperator.Operator.Id == osReport.Operator.Id))
                              let oId = osReport == null ? -1 : osReport.Operator == null ? -1 : osReport.Operator.Id
                              let prId = pReport == null ? -1 : pReport.Id
                              select new { sReport.Id, oId, prId, sReport.LostCount, sReport.LostTime };

                var sQuery = from opr in oprQuery
                             from sReport in srQuery.Where(sr => sr.oId == opr.oId && sr.prId == opr.prId).DefaultIfEmpty()
                             let oprId = opr == null ? -1 : opr.oprId
                             let ct = opr == null ? 0 : opr.ct
                             let lostTime = sReport == null ? 0 : (sReport.LostCount * ct) + sReport.LostTime
                             let lostCount = sReport == null ? 0 : ct == 0 ? 0 : sReport.LostCount + (sReport.LostTime / ct)
                             let prId = opr == null ? -1 : opr.prId
                             let oId = opr == null ? -1 : opr.oId
                             let productionTime = opr == null ? 0 : opr.productionTime
                             let productionCount = opr == null ? 0 : opr.productionCount
                             select new {oprId, oId, prId, lostTime, lostCount, productionTime, productionCount, ct };

                var sgQuery = from s in sQuery
                            group s by new {s.oId, s.oprId, s.prId, s.productionTime, s.productionCount, s.ct}
                            into g
                            let stoppageTime = g.Any() ? g.Sum(item => item.lostTime) : 0
                            let stoppageCount = g.Any() ? g.Sum(item => item.lostCount) : 0
                            select new {g.Key.oId, g.Key.oprId, g.Key.prId, g.Key.productionTime, g.Key.productionCount, g.Key.ct, stoppageTime, stoppageCount};

                var drQuery = from dReport in drList
                              from odReport in odrList.Where(odr=> dReport != null && odr.DefectionReport != null && odr.DefectionReport.Id == dReport.Id)
                              from pReport in processReportList.Where(pr => dReport != null && dReport.ProcessReport != null && dReport.ProcessReport.Id == pr.Id && pr.StartDateTime >= oprInfo.StartDate && pr.StartDateTime < oprInfo.EndDate)
                              from opReport in oprList.Where(opr => pReport != null && opr.ProcessReport != null && opr.ProcessOperator != null && opr.ProcessOperator.Operator != null && odReport != null && odReport.Operator != null && opr.ProcessReport.Id == pReport.Id && opr.ProcessOperator.Operator.Id == odReport.Operator.Id)
                              let oId = odReport == null ? -1 : odReport.Operator == null ? -1 : odReport.Operator.Id
                              let prId = pReport == null ? -1 : pReport.Id
                              select new { dReport.Id, oId, prId, dReport.LostCount, dReport.LostTime };

                var dQuery = from sg in sgQuery
                             from dReport in drQuery.Where(dr => sg.oId == dr.oId).DefaultIfEmpty()
                             let oprId = sg == null ? -1 : sg.oprId
                             let ct = sg == null ? 0 : sg.ct
                             let lostTime = dReport == null ? 0 : (dReport.LostCount * ct) + dReport.LostTime
                             let lostCount = dReport == null ? 0 : ct == 0 ? 0 : dReport.LostCount + (dReport.LostTime / ct)
                             let prId = sg == null ? -1 : sg.prId
                             let oId = sg == null ? -1 : sg.oId
                             let productionTime = sg == null? 0 : sg.productionTime
                             let stoppageTime = sg == null ? 0 : sg.stoppageTime
                             let productionCount = sg == null ? 0 : sg.productionCount
                             let stoppageCount = sg == null ? 0 : sg.stoppageCount
                             select new { oId, oprId, prId, lostTime, lostCount, stoppageTime, productionTime, stoppageCount, productionCount, ct };

                var dgQuery = from d in dQuery
                              group d by new { d.oId, d.oprId, d.prId, d.productionTime, d.stoppageTime, d.productionCount, d.stoppageCount, d.ct }
                                  into g
                                  let defectionTime = g.Any() ? g.Sum(item => item.lostTime) : 0
                                  let defectionCount = g.Any() ? g.Sum(item => item.lostCount) : 0
                                  select new { g.Key.oId, g.Key.oprId, g.Key.prId, g.Key.productionTime, g.Key.ct, g.Key.stoppageTime, defectionTime, g.Key.productionCount, g.Key.stoppageCount, defectionCount };

                var prQuery = from opr in dgQuery
                              from processReport in processReportList.Where(pr => opr.prId == pr.Id && pr.StartDateTime >= oprInfo.StartDate && pr.StartDateTime < oprInfo.EndDate).DefaultIfEmpty()
                              group processReport by new { opr.oId, opr.oprId, operatorId = opr.oId, opr.productionTime, opr.stoppageTime, opr.defectionTime, opr.productionCount, opr.stoppageCount, opr.defectionCount } into g
                              let duration = g.Sum(item => item == null ? 0 : item.OperatorProcessReports.Count == 0 ? 0 : item.DurationSeconds / item.OperatorProcessReports.Count)
                              let target = g.Sum(item => item == null ? 0 : item.OperatorProcessReports.Count == 0 ? 0 : item.ProcessReportTargetPoint / item.OperatorProcessReports.Count)
                              select new { g.Key.oprId, g.Key.operatorId, g.Key.productionTime, g.Key.stoppageTime, g.Key.defectionTime, duration, g.Key.productionCount, g.Key.stoppageCount, g.Key.defectionCount, target };

                var query = from oprt in indexList
                            from pr in prQuery.Where(p => p.operatorId == oprt.Id).DefaultIfEmpty()
                            group pr by new {oprt.interval, oprt.Id, oprt.Code, oprt.Name} into g

                            let targetTime = g.Any() ?  g.Sum(item => item == null ? 0 : item.duration) : 0
                            let productionTime = g.Any() ? g.Sum(item => item == null ? 0 : item.productionTime) : 0
                            let stoppageTime = g.Any() ? g.Max(item => item == null ? 0 : item.stoppageTime) : 0
                            let defectionTime = g.Any() ? g.Max(item => item == null ? 0 : item.defectionTime) : 0

                            let targetCount = g.Any() ? g.Sum(item => item == null ? 0 : item.target) : 0
                            let productionCount = g.Any() ? g.Sum(item => item == null ? 0 : item.productionCount) : 0
                            let stoppageCount = g.Any() ? g.Max(item => item == null ? 0 : item.stoppageCount) : 0
                            let defectionCount = g.Any() ? g.Max(item => item == null ? 0 : item.defectionCount) : 0

                            select new { g.Key.interval, g.Key.Id, g.Key.Code, g.Key.Name, stoppageTime, defectionTime, productionTime, targetTime, stoppageCount, defectionCount, productionCount, targetCount };

                var sortedQuery = query.OrderBy(item => item.targetTime == 0 ? item.productionTime  : item.productionTime / item.targetTime).ToList();

                for (int i = startIndex; i < count; i++)
                {
                    var newRecord = new Record();
                    newRecord.Data = new List<object>(8) {0,0,0,0,0,0,0,0};
                    foreach (var line in sortedQuery)
                    {
                        if (line.interval + startIndex == i)
                        {
                            newRecord.Id = line.Id;
                            newRecord.Data = new List<object>
                            {
                                line.targetTime,
                                line.productionTime,
                                line.defectionTime,
                                line.stoppageTime,
                                line.targetCount,
                                line.productionCount,
                                line.defectionCount,
                                line.stoppageCount
                            };

                            newRecord.StartDate = oprInfo.StartDate;
                            newRecord.EndDate = oprInfo.EndDate;
                            newRecord.Header = line.Name;
                        }
                    }
                    records.Add(newRecord);
                }
            }
            return records;
        }
        private double GetMaxOperatorEfficiency(OperatorBarInfo oprInfo)
        {
            using (var context = new SoheilEdmContext())
            {
                var operatorProcessReportRepository = new Repository<OperatorProcessReport>(context);
                var processReportRepository = new Repository<ProcessReport>(context);
                var operatorRepository = new Repository<Operator>(context);

                var oprList = operatorProcessReportRepository.GetAll();
                var processReportList = processReportRepository.GetAll();
                var operatorList = operatorRepository.Find(o => o.Status != (decimal) Status.Deleted);

                var oprQuery = from opr in oprList
                            from processReport in processReportList.Where(pr=> opr.ProcessReport != null && opr.ProcessReport.Id == pr.Id && pr.StartDateTime >= oprInfo.StartDate && pr.StartDateTime < oprInfo.EndDate).DefaultIfEmpty()
							group processReport by new { opr.Id, operatorId = opr.ProcessOperator.Operator.Id, opr.OperatorProducedG1 } into g
                            let duration = g.Sum(item => item == null ? 0 : item.DurationSeconds / item.OperatorProcessReports.Count)
                            let target = g.Sum(item => item == null ? 0 : item.ProcessReportTargetPoint / item.OperatorProcessReports.Count)
                            select new { g.Key.Id, g.Key.operatorId, duration, target };

                var query = from oprt in operatorList
                    from opReport in oprQuery.Where(opr => opr.operatorId == oprt.Id).DefaultIfEmpty()
                    group opReport by new {oprt.Id}
                    into g
                    let targetTime = g.Any() ? g.Sum(item => item == null ? 0 : item.duration) : 0
                    let targetCount = g.Any() ? g.Sum(item => item == null ? 0 : item.target) : 0
                    select new {g.Key.Id, targetCount, targetTime};

                var result = query.ToList();
                if (oprInfo.IsCountBase)
                {
                    return result.Any() ? result.Max(item => item == null ? 100 : item.targetCount) : 100;
                }
                return result.Any() ? result.Max(item => item == null ? 100000 : item.targetTime) : 100000;

            }
        }
 public double GetMax(DateTimeIntervals intervalType, OperatorBarInfo barInfo, int count)
 {
     return GetMaxOperatorEfficiency(barInfo);
 }