private ChartViewModel GetKpisOptions(MachineInfoModel machine, PeriodModel period) { var options = new ChartViewModel(); var data = _stateService.GetAggregationStates(machine, period, enDataType.Dashboard); var stateProd = data.FirstOrDefault(w => w.enState == enState.Production); var stateManual = data.FirstOrDefault(w => w.enState == enState.Manual); var totalValue = machine.MachineTypeId == (int)enMachineType.Troncatrice || machine.MachineTypeId == (int)enMachineType.CentroLavoro ? stateProd?.ElapsedTime + stateManual?.ElapsedTime : stateProd?.ElapsedTime; var totalOn = data.Where(w => w.enState != enState.Offline).Select(s => s.ElapsedTime).Sum(); decimal?percProd = Common.GetPercentage(totalValue, totalOn); options.series = new List <SerieViewModel>() { new SerieViewModel { stateProductivityGreenThreshold = machine.StateProductivityGreenThreshold ?? 0, stateProductivityYellowThreshold = machine.StateProductivityYellowThreshold ?? 0, y = CommonViewService.getKpiViewModel(percProd, machine.StateProductivityGreenThreshold, machine.StateProductivityYellowThreshold).value ?? (decimal)0 } }; return(options); }
private ProductivityVueModel GetVueModel(List <EfficiencyStateMachineModel> operatorActivities, MachineInfoModel machine, PeriodModel period) { var result = new ProductivityVueModel(); if (machine.MachineTypeId == (int)enMachineType.CentroLavoro || machine.MachineTypeId == (int)enMachineType.LineaTaglio || (machine.MachineTypeId == (int)enMachineType.LineaTaglioLavoro)) { result.currentState = GetCurrentState(machine.Id); } var data = _pieceService.GetAggregationPieces(machine, period, enDataType.Dashboard); //var operatorActivities =_stateService.GetOperatorsActivity(machine, period.StartDate, period.EndDate); if (data.Count == 0) { return(result); } // tempo lordo: devo andare sulla tabella degli stati perchè non ce l'ho sui pezzi var grossTime = operatorActivities.Sum(m => m.TotalTime); var netTime = operatorActivities.Sum(m => m.ProducingTime); var productionTime = operatorActivities.Sum(m => m.ProducionModeTime ?? 0); //var grossTime = data.Select(s => s.ElapsedTime).Sum(); var doneCount = data.Select(s => s.CompletedCount).Sum() ?? 0; var redoneCount = data.Select(s => s.RedoneCount).Sum() ?? 0; // kpi pezzi all'ora var ratio = Common.GetRatioProductivity(doneCount, grossTime); result.kpi = CommonViewService.getKpiViewModel(ratio, machine.PiecesProductivityGreenThreshold, machine.PiecesProductivityYellowThreshold); // pieces var piece = new PieceViewModel(); piece.total = doneCount + redoneCount; var done = new ProdDataModel(); done.perc = Common.GetPercentage(doneCount, piece.total); done.number = doneCount; piece.done = done; var redone = new ProdDataModel(); redone.perc = Common.GetPercentage(redoneCount, piece.total); redone.number = redoneCount; piece.redone = redone; result.piece = piece; // materials var dataBars = _barService.GetAggregationBar(machine, period); if (dataBars.Count > 0) { var barLength = dataBars.Select(s => s.Length ?? 0).Sum().RoundToInt(); double cutoffLength = dataBars.Select(s => s.OffcutLength ?? 0).Sum(); var totalLength = barLength + cutoffLength; var material = new MaterialViewModel(); material.total = (totalLength / 1000); var bar = new ProdDataModel(); bar.perc = Common.GetPercentage(barLength, totalLength); bar.number = ((double)barLength / 1000); material.bar = bar; //Nelle troncatrici questi dati sono nascosti, non ci sono, //per le altre è da verificare cosa prendono var cutoff = new ProdDataModel(); cutoff.perc = Common.GetPercentage(cutoffLength, totalLength); cutoff.number = ((double)cutoffLength / 1000); material.cutoff = cutoff; result.material = material; } // phases var phases = new List <ProdDataModel>(); switch (machine.MachineTypeId) { case (int)enMachineType.Troncatrice: case (int)enMachineType.LineaTaglio: var cut = new ProdDataModel(); cut.text = Resource.Cut; cut.perc = Common.GetPercentage(netTime, grossTime); phases.Add(cut); break; case (int)enMachineType.CentroLavoro: var working = new ProdDataModel(); working.text = Resource.Working; working.perc = Common.GetPercentage(productionTime, grossTime); phases.Add(working); break; default: working = new ProdDataModel(); working.text = Resource.Working; working.perc = Common.GetPercentage(data.Select(s => s.ElapsedTimeWorking ?? 0).Sum(), grossTime); phases.Add(working); var trim = new ProdDataModel(); trim.text = Resource.Trim; trim.perc = Common.GetPercentage(data.Select(s => s.ElapsedTimeTrim ?? 0).Sum(), grossTime); phases.Add(trim); cut = new ProdDataModel(); cut.text = Resource.Cut; cut.perc = Common.GetPercentage(data.Select(s => s.ElapsedTimeCut ?? 0).Sum(), grossTime); phases.Add(cut); break; } result.phases = phases.OrderByDescending(o => o.perc).ToList(); // operators //var dataOperators = _pieceService.GetAggregationPieces(machine, period, enDataType.Operators); var dataOperators = operatorActivities; if (dataOperators.Count > 0) { var groupOperator = dataOperators.GroupBy(g => new { g.Operator, g.TotalTime }).OrderByDescending(x => x.Key.TotalTime).ToList(); if (groupOperator.Count <= 3) { result.operators = groupOperator.Select(o => new ProdDataModel() { text = o.Key.Operator, perc = Common.GetPercentage(o.Key.TotalTime ?? 0, grossTime) }).OrderByDescending(p => p.perc).ToList(); } else { var firstGroup = groupOperator.GetRange(0, 2); var secondGroup = groupOperator.GetRange(2, groupOperator.Count - 2); if (firstGroup.Count > 0) { result.operators = firstGroup.Select(o => new ProdDataModel() { text = o.Key.Operator, perc = Common.GetPercentage(o.Key.TotalTime ?? 0, grossTime) }).OrderByDescending(p => p.perc).ToList(); } if (secondGroup.Count > 0) { var elpasedTimeTotal = secondGroup.Select(s => s.Key.TotalTime ?? 0).Sum(); result.operators.Add(new ProdDataModel() { text = Resource.Others, perc = Common.GetPercentage(elpasedTimeTotal, grossTime) }); } } } // gross time result.time = CommonViewService.getTimeViewModel(grossTime); return(result); }
private List <MesDataViewModel> GetVueModel(PlantModel plant, List <MachineInfoModel> allMachines, bool onlyActive) { var result = new List <MesDataViewModel>(); var dataAllMachines = _mesService.GetPlantData(plant); if (onlyActive) { dataAllMachines = dataAllMachines.Where(m => m.Expired == false).ToList(); } foreach (var dataMachine in dataAllMachines) { var mes = new MesDataViewModel(); var machine = allMachines.FirstOrDefault(w => w.Id == dataMachine.MachineId); if (machine?.Type == null || machine.Model == null) { continue; } mes.info = new MachineInfoViewModel { id = machine.Id, description = machine.Description == string.Empty ? null : machine.Description, model = machine.Model.Name, machineName = machine.MachineName, icon = machine.Type.Image, expired = dataMachine.Expired, id_mtype = machine.Type?.Id ?? 0, serial = machine.Serial }; var data = dataAllMachines.FirstOrDefault(w => w.MachineId == machine.Id); if (data == null) { result.Add(mes); continue; } if (data.enActualState != null) { mes.state = new StateViewModel { code = data.enActualState.GetDescription(), text = LocalizationService.GetResource(data.enActualState.ToString()) }; mes.error = data.ActualStateCode; } if (data.ActualJobPerc != null) { mes.job = new JobDataModel { code = data.ActualJobCode, perc = (data.ActualJobPerc ?? 0).RoundToInt() }; } mes.@operator = data.ActualOperator; if (data.StateEfficiency != null) { mes.efficiency = new EfficiencyVueModel(); mes.efficiency.kpi = CommonViewService.getKpiViewModel((decimal)(data.StateEfficiency ?? 0), machine.StateProductivityGreenThreshold, machine.StateProductivityYellowThreshold); mes.efficiency.overfeed = CommonViewService.getKpiViewModel((decimal)(data.StateOverfeedAvg ?? 0), null, null); } if (data.PieceCompletedCount != null) { mes.productivity = new ProductivityVueModel(); mes.productivity.kpi = CommonViewService.getKpiViewModel(Common.GetRatioProductivity(data.PieceCompletedCount, data.PieceElapsedTime), machine.PiecesProductivityGreenThreshold, machine.PiecesProductivityYellowThreshold); mes.productivity.piece = new PieceViewModel() { total = (data.PieceCompletedCount ?? 0) + (data.PieceRedoneCount ?? 0) }; } if (data.AlarmCount != null) { mes.errors = new ErrorViewModel(); mes.errors.quantity = data.AlarmCount; } result.Add(mes); } return(result); }
private EfficiencyVueModel GetVueModel(MachineInfoModel machine, PeriodModel period) { var result = new EfficiencyVueModel(); var data = _stateService.GetAggregationStates(machine, period, enDataType.Dashboard); if (data.Count == 0) { return(result); } var stateProd = data.FirstOrDefault(w => w.enState == enState.Production); var totalProd = stateProd?.ElapsedTime; var totalOn = data.Where(w => w.enState != enState.Offline).Select(s => s.ElapsedTime).Sum(); //long? totalOff = data.Where(w => w.enState == enState.Offline).Select(s => s.ElapsedTime).Sum(); decimal?percProd = Common.GetPercentage(totalProd, totalOn); var total = new TotalTimeModel(); total.on = CommonViewService.getTimeViewModel(totalOn); //total.off = CommonViewService.getTimeViewModel(totalOff); result.total = total; var states = new List <StateViewModel>(); // state prod var prod = new StateViewModel(); prod.code = enState.Production.GetDescription(); prod.text = enState.Production.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage); prod.perc = percProd; prod.time = CommonViewService.getTimeViewModel(totalProd); prod.orderView = _stateService.GetOrderViewState(enState.Production.GetDescription()); states.Add(prod); // state pause var pause = new StateViewModel(); pause.code = enState.Pause.GetDescription(); pause.text = enState.Pause.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage); var statePause = data.FirstOrDefault(w => w.enState == enState.Pause); if (statePause != null) { var totalPause = statePause.ElapsedTime; pause.perc = Common.GetPercentage(totalPause, totalOn); pause.time = CommonViewService.getTimeViewModel(totalPause); } pause.orderView = _stateService.GetOrderViewState(enState.Pause.GetDescription()); states.Add(pause); // state manual var manual = new StateViewModel(); manual.code = enState.Manual.GetDescription(); manual.text = enState.Manual.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage); var stateManual = data.FirstOrDefault(w => w.enState == enState.Manual); if (stateManual != null) { var totalManual = stateManual.ElapsedTime; manual.perc = Common.GetPercentage(totalManual, totalOn); manual.time = CommonViewService.getTimeViewModel(totalManual); } manual.orderView = _stateService.GetOrderViewState(enState.Manual.GetDescription()); states.Add(manual); // state error var error = new StateViewModel(); error.code = enState.Error.GetDescription(); error.text = enState.Error.ToLocalizedString(_contextService.GetContext().ActualLanguage.InitialsLanguage); var stateError = data.FirstOrDefault(w => w.enState == enState.Error); if (stateError != null) { var totalError = stateError.ElapsedTime; error.perc = Common.GetPercentage(totalError, totalOn); error.time = CommonViewService.getTimeViewModel(totalError); } error.orderView = _stateService.GetOrderViewState(enState.Error.GetDescription()); states.Add(error); result.states = states.OrderBy(o => o.orderView).ToList(); var overfeed = stateProd?.OverfeedAvg; decimal percKpi; if (machine.MachineTypeId == (int)enMachineType.Troncatrice || machine.MachineTypeId == (int)enMachineType.CentroLavoro) { percKpi = (decimal)percProd + (manual.perc ?? 0); } else { percKpi = (decimal)percProd; } result.kpi = CommonViewService.getKpiViewModel(percKpi, machine.StateProductivityGreenThreshold, machine.StateProductivityYellowThreshold); result.overfeed = CommonViewService.getKpiViewModel(overfeed, machine.OverfeedGreenThreshold, machine.OverfeedYellowThreshold); return(result); }