コード例 #1
0
        public void CalcularVelocidadeMediaDeCadaPiloto(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            StringBuilder velocidadeMediaByPiloto = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            velocidadeMediaByPiloto.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Velocidade Média")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(velocidadeMediaByPiloto);

            velocidadeMediaByPiloto.Insert(0, primeiraLinha);
            velocidadeMediaByPiloto.Append(primeiraLinha).AppendLine();

            // constroi  relatorio da velocidade Média de Cada Piloto
            pDadosVoltaPilotos.ToList().ForEach(x =>
            {
                velocidadeMediaByPiloto.AppendFormat(Culture, formatString, x.Value.Piloto.Codigo.ToString("D3"), x.Value.Piloto.NomePiloto, x.Value.VelocidadeMediaCorrida.ToString()).AppendLine();
            });

            //acrescenta no relatorio Final título seção Velcidade Média por Piloto
            RelatorioFinal.Append(Environment.NewLine).AppendLine().Append("-> [ VELOCIDADE MÉDIA POR PILOTO ]").AppendLine().AppendLine();
            //append no relatorio Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(velocidadeMediaByPiloto.ToString());
        }
コード例 #2
0
        public void CalcularMelhorVoltaDeCadaPiloto(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            var melhorVoltaByPilotoRelatorio = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            melhorVoltaByPilotoRelatorio.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Melhor Volta")
            .AppendLine();

            string primeiraLinha = CriarLinhaFormatadoraColunasTabelas(melhorVoltaByPilotoRelatorio);

            melhorVoltaByPilotoRelatorio.Insert(0, primeiraLinha);
            melhorVoltaByPilotoRelatorio.Append(primeiraLinha).AppendLine();

            // constrói  relatório da melhor Volta De Cada Piloto
            pDadosVoltaPilotos.ToList().ForEach(elem =>
            {
                int codigoPiloto     = elem.Key;
                String nomePiloto    = elem.Value.Piloto.NomePiloto;
                TimeSpan melhorVolta = elem.Value.MelhorVolta;

                melhorVoltaByPilotoRelatorio.AppendFormat(Culture, formatString, codigoPiloto.ToString("D4"), nomePiloto, melhorVolta.ToString(@"hh\:mm\:ss\:fff")).AppendLine();
            });

            //acrescenta no relatório Final título como: [ MELHOR VOLTA POR PILOTO ]
            RelatorioFinal.AppendLine().AppendLine().Append("-> [ MELHOR VOLTA POR PILOTO ]").AppendLine().AppendLine();
            //append no relatório Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(melhorVoltaByPilotoRelatorio.ToString());
        }
コード例 #3
0
        private Resultado DadosValidos(RelatorioFinal dados)
        {
            var resultado = new Resultado();

            if (dados == null)
            {
                resultado.Inconsistencias.Add(
                    "Preencha os Dados do RelatorioFinal");
            }

            return(resultado);
        }
コード例 #4
0
 public ActionResult <Resultado> Post([FromBody] RelatorioFinal RelatorioFinal)
 {
     if (_service.UserProjectCan(RelatorioFinal.ProjetoId, User, Authorizations.ProjectPermissions.LeituraEscrita))
     {
         var resultado = _service.Incluir(RelatorioFinal);
         if (resultado.Sucesso)
         {
             this.CreateLog(_service, RelatorioFinal.ProjetoId, RelatorioFinal);
         }
         return(resultado);
     }
     return(Forbid());
 }
コード例 #5
0
        public Resultado Excluir(int id)
        {
            Resultado resultado = new Resultado();

            resultado.Acao = "Exclusão de RelatorioFinal";

            RelatorioFinal RelatorioFinal = _context.RelatorioFinal.FirstOrDefault(p => p.Id == id);

            if (RelatorioFinal == null)
            {
                resultado.Inconsistencias.Add("RelatorioFinal não encontrado");
            }
            else
            {
                _context.Uploads.RemoveRange(_context.Uploads.Where(t => t.RelatorioFinalId == id));
                _context.RelatorioFinal.Remove(RelatorioFinal);
                _context.SaveChanges();
            }

            return(resultado);
        }
コード例 #6
0
        public ActionResult <Resultado> Put([FromBody] RelatorioFinal RelatorioFinal)
        {
            var Relatorio = _service._context.RelatorioFinal.Find(RelatorioFinal.Id);

            if (Relatorio != null)
            {
                if (_service.UserProjectCan(Relatorio.ProjetoId, User, Authorizations.ProjectPermissions.LeituraEscrita))
                {
                    _service._context.Entry(Relatorio).State = Microsoft.EntityFrameworkCore.EntityState.Detached;

                    var resultado = _service.Atualizar(RelatorioFinal);

                    if (resultado.Sucesso)
                    {
                        this.CreateLog(_service, Relatorio.ProjetoId, RelatorioFinal, Relatorio);
                    }
                    return(resultado);
                }
                return(Forbid());
            }
            return(NotFound());
        }
コード例 #7
0
        public Resultado Incluir(RelatorioFinal dados)
        {
            Resultado resultado = DadosValidos(dados);

            resultado.Acao = "Inclusão de RelatorioFinal";

            RelatorioFinal RelatorioFinal = _context.RelatorioFinal
                                            .Where(p => p.ProjetoId == dados.ProjetoId)
                                            .FirstOrDefault();

            if (RelatorioFinal != null)
            {
                resultado.Inconsistencias.Add("Já existe um RelatorioFinal final para o projeto. Remova-o ou atualize.");
            }

            if (resultado.Inconsistencias.Count == 0)
            {
                _context.RelatorioFinal.Add(dados);
                _context.SaveChanges();
                resultado.Id = dados.Id.ToString();
            }
            return(resultado);
        }
コード例 #8
0
        public void CalcularMelhorVoltaDaCorrida(Dictionary <int, DadosCorridaPiloto> pDadosVoltaPilotos)
        {
            StringBuilder melhorVoltaDaCorrida = new StringBuilder();

            var formatString = "|{0,-35}|{1,-35}|{2,-35}|";

            melhorVoltaDaCorrida.AppendLine()
            .AppendFormat(Culture, formatString, "Código Piloto", "Nome Piloto", "Tempo da Volta")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(melhorVoltaDaCorrida);

            melhorVoltaDaCorrida.Insert(0, primeiraLinha);
            melhorVoltaDaCorrida.Append(primeiraLinha).AppendLine();


            //hashmap que sera retornado. OBS é um LinkedHashMap pois ele sempre preserva a ordem de insercão
            //pilotos ordenados pelo menor tempo de volta
            var pilotosOrdenadosByMenorTempoVolta = new Dictionary <int, DadosCorridaPiloto>();

            //ordena o dicionário pelo menor tempo de volta de cada piloto
            pDadosVoltaPilotos.ToList().OrderBy(x => x.Value.MelhorVolta).ToList()
            .ForEach(x => pilotosOrdenadosByMenorTempoVolta.Add(x.Key, x.Value));

            DadosCorridaPiloto dadosMelhorPiloto = pilotosOrdenadosByMenorTempoVolta.FirstOrDefault().Value;

            int      codigoPiloto = dadosMelhorPiloto.Piloto.Codigo;
            String   nomePiloto   = dadosMelhorPiloto.Piloto.NomePiloto;
            TimeSpan melhorVolta  = dadosMelhorPiloto.MelhorVolta;

            melhorVoltaDaCorrida.AppendFormat(Culture, formatString, codigoPiloto.ToString("D3"), nomePiloto, melhorVolta.ToString(@"hh\:mm\:ss\:fff")).AppendLine();

            //acrescenta no relatorio Final título seção MELHOR VOLTA POR PILOTO
            RelatorioFinal.AppendLine().AppendLine().Append("-> [ MELHOR VOLTA DA CORRIDA ]").AppendLine().AppendLine();
            //append no relatorio Final dados sobre MELHOR VOLTA POR PILOTO
            RelatorioFinal.Append(melhorVoltaDaCorrida.ToString());
        }
コード例 #9
0
        public Resultado Atualizar(RelatorioFinal dados)
        {
            Resultado resultado = DadosValidos(dados);

            resultado.Acao = "Atualização de RelatorioFinal";

            if (resultado.Inconsistencias.Count == 0)
            {
                RelatorioFinal RelatorioFinal = _context.RelatorioFinal.Where(
                    p => p.Id == dados.Id).FirstOrDefault();

                if (RelatorioFinal == null)
                {
                    resultado.Inconsistencias.Add(
                        "RelatorioFinal não encontrado");
                }
                else
                {
                    RelatorioFinal.ProdutoAlcancado            = !dados.ProdutoAlcancado.HasValue ? RelatorioFinal.ProdutoAlcancado : dados.ProdutoAlcancado;
                    RelatorioFinal.JustificativaProduto        = (dados.JustificativaProduto == null) ? RelatorioFinal.JustificativaProduto : dados.JustificativaProduto;
                    RelatorioFinal.EspecificacaoProduto        = (dados.EspecificacaoProduto == null) ? RelatorioFinal.EspecificacaoProduto : dados.EspecificacaoProduto;
                    RelatorioFinal.TecnicaPrevista             = !dados.TecnicaPrevista.HasValue ? RelatorioFinal.TecnicaPrevista : dados.TecnicaPrevista;
                    RelatorioFinal.JustificativaTecnica        = (dados.JustificativaTecnica == null) ? RelatorioFinal.JustificativaTecnica : dados.JustificativaTecnica;
                    RelatorioFinal.DescTecnica                 = (dados.DescTecnica == null) ? RelatorioFinal.DescTecnica : dados.DescTecnica;
                    RelatorioFinal.AplicabilidadePrevista      = !dados.AplicabilidadePrevista.HasValue ? RelatorioFinal.AplicabilidadePrevista : dados.AplicabilidadePrevista;
                    RelatorioFinal.JustificativaAplicabilidade = (dados.JustificativaAplicabilidade == null) ? RelatorioFinal.JustificativaAplicabilidade : dados.JustificativaAplicabilidade;
                    RelatorioFinal.DescTestes      = (dados.DescTestes == null) ? RelatorioFinal.DescTestes : dados.DescTestes;
                    RelatorioFinal.DescAbrangencia = (dados.DescAbrangencia == null) ? RelatorioFinal.DescAbrangencia : dados.DescAbrangencia;
                    RelatorioFinal.DescAmbito      = (dados.DescAmbito == null) ? RelatorioFinal.DescAmbito : dados.DescAmbito;
                    RelatorioFinal.DescAtividades  = (dados.DescAtividades == null) ? RelatorioFinal.DescAtividades : dados.DescAtividades;
                    _context.SaveChanges();
                }
            }

            return(resultado);
        }
コード例 #10
0
        public void CalcularClassificacaoFinalPilotos(Dictionary <int, DadosCorridaPiloto> pPosicaoFinal)
        {
            StringBuilder classificacaoFinal = new StringBuilder();

            var formatString = "|{0,-30}|{1,-30}|{2,-30}|{3,-30}|{4,-30}|{5,-30}|";

            classificacaoFinal.AppendLine()
            .AppendFormat(Culture, formatString, "Posição Chegada", "Código Piloto", "Nome Piloto", "Qtde Voltas Completadas", "Tempo Total de Prova", "Tempo de Chegada Após Vencedor")
            .AppendLine();

            String primeiraLinha = CriarLinhaFormatadoraColunasTabelas(classificacaoFinal);

            classificacaoFinal.Insert(0, primeiraLinha);
            classificacaoFinal.Append(primeiraLinha).AppendLine();

            TimeSpan tempoChegadaVencedor = pPosicaoFinal.FirstOrDefault().Value.HoraUltimaVolta;
            int      count = 1;

            // constrói  relatorio da classificação final de cada piloto
            pPosicaoFinal.ToList().ForEach(x =>
            {
                int codigoPiloto     = x.Key;
                string nomePiloto    = x.Value.Piloto.NomePiloto;
                int qtdVoltas        = x.Value.NumeroDeVoltasTotais;
                string tempoTotal    = x.Value.TempoTotalCorrida.ToString(@"hh\:mm\:ss\:fff");
                TimeSpan horaChegada = x.Value.HoraUltimaVolta;

                string diferencaToVencedor = (tempoChegadaVencedor.CompareTo(horaChegada) == 0) ? "(Não se Aplica)" : TimeSpanUtils.OperarTimeSpans(horaChegada, tempoChegadaVencedor, ETimeSpanOperacao.Subtracao).ToString(@"hh\:mm\:ss\:fff");

                classificacaoFinal.AppendFormat(Culture, formatString, count++, codigoPiloto.ToString("D3"), nomePiloto, qtdVoltas, tempoTotal, diferencaToVencedor).AppendLine();
            });


            RelatorioFinal.Append("[ RESULTADO FINAL DA CORRIDA (CLASSIFICAÇÃO) E DIFERENÇA DE TEMPO DE CHEGADA DE CADA PILOTO PARA O VENCEDOR ]").AppendLine().AppendLine();
            RelatorioFinal.Append(classificacaoFinal.ToString());
        }
コード例 #11
0
        // função que calcula e faz chamadas para métodos que ajudarão a construir o relatório final
        public string CalcularResultadoCorrida(List <IVoltaCorrida> pVoltas)
        {
            // Dicionário que conterá dados relevantes de cada piloto ao final da corrida
            var dDadosPilotosCorrida = new Dictionary <int, DadosCorridaPiloto>();

            // agrupa voltas por cada piloto
            var voltasGroupedByPiloto = pVoltas.GroupBy(x => x.Piloto.Codigo);

            // para cada piloto, itere sobre suas voltas

            foreach (var voltaG in voltasGroupedByPiloto)
            {
                var voltasPiloto = voltaG.Select(volta => volta);

                var somadorVelocidades = 0.0f;

                var ultimaVolta = voltasPiloto.Last();

                //para cada volta do piloto atual
                foreach (var volta in voltasPiloto)
                {
                    if (!dDadosPilotosCorrida.ContainsKey(voltaG.Key))
                    {
                        somadorVelocidades += volta.VelocidadeMediaVolta;

                        var dadosCorrida = new DadosCorridaPiloto(volta.HoraVolta, volta.NumeroVolta, volta.TempoVolta, volta.VelocidadeMediaVolta, volta.Piloto);

                        dDadosPilotosCorrida.Add(voltaG.Key, dadosCorrida);
                    }
                    else
                    {
                        //se o piloto já esta no hashmap dados_pilotos_final_da_corrida, atualize seus dados//
                        DadosCorridaPiloto dadosPiloto = dDadosPilotosCorrida[voltaG.Key];

                        //atualiza hora da última volta
                        dadosPiloto.HoraUltimaVolta = volta.HoraVolta;
                        //atualiza número da volta
                        dadosPiloto.NumeroDeVoltasTotais = volta.NumeroVolta;
                        //atualiza velocidadeTotal
                        dadosPiloto.VelocidadeTotalCorrida = dadosPiloto.VelocidadeTotalCorrida + volta.VelocidadeMediaVolta;
                        //atualiza tempo total durante a corrida
                        dadosPiloto.TempoTotalCorrida = TimeSpanUtils.OperarTimeSpans(dadosPiloto.TempoTotalCorrida, volta.TempoVolta, ETimeSpanOperacao.Adicao);

                        //se tempo da volta atual for melhor (menor) que o anterior, atualize este valor
                        if (volta.TempoVolta < dadosPiloto.MelhorVolta)
                        {
                            dadosPiloto.MelhorVolta = volta.TempoVolta;
                        }

                        // variável que armazena a soma das velocidades de cada volta do piloto atual
                        somadorVelocidades += volta.VelocidadeMediaVolta;

                        // se for a última volta do piloto atual calcule sua Velocidade Média
                        if (volta.Equals(ultimaVolta))
                        {
                            float velocidadeMedia = somadorVelocidades / voltasPiloto.Count();
                            dadosPiloto.VelocidadeMediaCorrida = velocidadeMedia;

                            somadorVelocidades = 0.0F; // reseta somadorVelocidades
                        }

                        //atualiza dados do piloto atual no dicionário dDadosPilotosCorrida
                        dDadosPilotosCorrida[voltaG.Key] = dadosPiloto;
                    }
                }
            }

            //Dicionário com classificação final dos pilotos
            Dictionary <int, DadosCorridaPiloto> posicaoFinal = ComputarPosicaoFinalDosPilotos(dDadosPilotosCorrida);

            //gera relatório da classificação final da corrida
            CalcularClassificacaoFinalPilotos(posicaoFinal);

            //gera relatório da melhor volta de cada piloto na corrida
            CalcularMelhorVoltaDeCadaPiloto(dDadosPilotosCorrida);

            //gera relatório da melhor volta da corrida
            CalcularMelhorVoltaDaCorrida(dDadosPilotosCorrida);

            //gera relatório da velocidade média de cada piloto na corrida
            CalcularVelocidadeMediaDeCadaPiloto(dDadosPilotosCorrida);

            return(RelatorioFinal.ToString());
        }