예제 #1
0
        public void MostraRotas()
        {
            viewModel.Rotas = new ObservableCollection <RotaModel>();

            List <RotasBD> lista = RotasBD.GetRotas(App.usrCorrente.Email);

            if (lista == null)
            {
                return;
            }

            RotaModel            nova;
            MyPosition           pos;
            List <MyPosition>    posicoes;
            List <CoordenadasBD> bdCoord;

            foreach (RotasBD rota in lista)
            {
                posicoes = new List <MyPosition>();
                bdCoord  = CoordenadasBD.GetCoordenadas(rota.Id);
                foreach (CoordenadasBD coord in bdCoord)
                {
                    pos = new MyPosition(coord.Latitude, coord.Longitude, coord.DataHora);
                    posicoes.Add(pos);
                }

                nova = new RotaModel(rota.Id, rota.DtHrInicial, rota.DtHrFinal,
                                     rota.Distancia, posicoes);
                viewModel.Rotas.Add(nova);
            }

            viewModel.InformaAlteracao("Rotas");
        }
예제 #2
0
        public async void OnSincronizar_Clicked(object sender, EventArgs e)
        {
            if (viewModel.IsBusy)
            {
                return;
            }

            // verificar se o e-mail do usuário existe
            if (string.IsNullOrEmpty(App.usrCorrente.WSUrl))
            {
                DependencyService.Get <IMessage>().ShortAlert("Web Service ainda não foi configurado.");
                return;
            }

            // verificar se o Web Service já foi configurado
            if (string.IsNullOrEmpty(App.usrCorrente.WSUrl))
            {
                DependencyService.Get <IMessage>().ShortAlert("Web Service ainda não foi configurado.");
                return;
            }

            // verificar se existe conexão com Internet
            if (App.ExisteConexaoInternet() == false)
            {
                DependencyService.Get <IMessage>().ShortAlert("Sem conexão com a Internet.");
                return;
            }

            // verificar se tem sinal de Wi-Fi
            if (App.usrCorrente.WiFi != 0)
            {
                if (App.ExisteWiFi() == false)
                {
                    DependencyService.Get <IMessage>().ShortAlert("Sem sinal de Wi-Fi.");
                    return;
                }
            }

            // totalizadores de rotas
            int transmidas = 0;
            int recebidas  = 0;
            int tErros     = 0;
            int rErros     = 0;

            // indica processamento em segundo plano
            viewModel.IsBusy = true;

            // cadastra ou atualiza dados do usuário no servidor
            bool resp = await WSUsuariosJson.UpdateData();

            if (resp == false)
            {
                DependencyService.Get <IMessage>().ShortAlert("Dados do usuário não puderam ser atualizados no servidor!.");
                viewModel.IsBusy = false;
                return;
            }

            // lista de rotas cadastradas localmente
            List <RotasBD> rotasLocal = RotasBD.GetRotas(App.usrCorrente.Email);

            // ======================================================
            // primeira parte: receber do servidor lista de rotas
            // ======================================================

            // lista das rotas cadastradas no Web Service
            List <WSRotaResumoJson> listResumo = null;

            // requisitar lista de rotas para o Web Service
            string request  = "Rotas/" + App.usrCorrente.Email;
            string resposta = await WSMostraRota.GetStringAsync(request);

            // verificar se Web Service retornou dados válidos
            WSRotasJson rota;

            if ((resposta != null) && (resposta.ToLower().CompareTo("null") != 0))
            {
                // converter string retornada pelo WebService em uma lista de rotas
                listResumo = JsonConvert.DeserializeObject <List <WSRotaResumoJson> >(resposta);
                if (listResumo.Count > 0)
                {
                    // para cada rota, verificar se ela já está cadastrada na base de dados local
                    int novaRotaId;
                    foreach (WSRotaResumoJson resumo in listResumo)
                    {
                        if (RotaExisteNoBDLocal(rotasLocal, resumo) == false)
                        {
                            // obter dados completo da rota via Web Service
                            request  = "Rota?email=" + App.usrCorrente.Email + "&rota=" + resumo.NumRota.ToString();
                            resposta = await WSMostraRota.GetStringAsync(request);

                            // verificar se Web Service retornou dados válidos
                            if ((resposta != null) && (resposta.ToLower().CompareTo("null") != 0))
                            {
                                // desserializar dados da rota
                                rota = JsonConvert.DeserializeObject <WSRotasJson>(resposta);

                                // não sincronizar rotas que não tenham pelo menos duas coordenadas
                                if ((rota.Coordenadas == null) ||
                                    (rota.Coordenadas.Count < 2))
                                {
                                    continue;
                                }

                                // ordenar coordenadas pela sequência
                                rota.Coordenadas.Sort();

                                // inserir rota na base de dados local
                                novaRotaId = RotasBD.InsereRota(App.usrCorrente.Email, DateTime.Parse(rota.DtHrIni),
                                                                DateTime.Parse(rota.DtHrFim), rota.Distancia);

                                if (novaRotaId > 0)
                                {
                                    // insere lista de coordenadas da rota na base de dados local
                                    CoordenadasBD.ImportarCoordenadas(novaRotaId, rota.Coordenadas);

                                    ++recebidas;
                                }
                                else
                                {
                                    ++rErros;
                                }
                            }
                            else
                            {
                                ++rErros;
                            }
                        }
                    }
                }
            }

            // ======================================================
            // segunda parte: enviar para o servidor
            // ======================================================
            List <CoordenadasBD>     coords;
            List <WSCoordenadasJson> listaCoord;
            WSCoordenadasJson        cJson;

            foreach (RotasBD rotaBD in rotasLocal)
            {
                if (RotaExisteNoWS(listResumo, rotaBD) == false)
                {
                    rota = new WSRotasJson
                    {
                        NumRota      = rotaBD.Id,
                        EmailUsuario = App.usrCorrente.Email,
                        DtHrIni      = rotaBD.DtHrInicial.ToString("G"),
                        DtHrFim      = rotaBD.DtHrFinal.ToString("G"),
                        Distancia    = rotaBD.Distancia
                    };

                    //obtem coordenadas da rota
                    coords = CoordenadasBD.GetCoordenadas(rotaBD.Id);

                    // não sincronizar rotas que não tenham pelo menos duas coordenadas
                    if ((coords == null) || (coords.Count < 2))
                    {
                        continue;
                    }

                    // monta lista de coordenadas
                    listaCoord = new List <WSCoordenadasJson>();
                    foreach (CoordenadasBD c in coords)
                    {
                        cJson = new WSCoordenadasJson
                        {
                            EmailUsr  = App.usrCorrente.Email,
                            IdRota    = rotaBD.Id,
                            Seq       = c.Seq,
                            DataHora  = c.DataHora.ToString("G"),
                            Latitute  = c.Latitude.ToString(),
                            Longitude = c.Longitude.ToString()
                        };

                        listaCoord.Add(cJson);
                    }

                    rota.Coordenadas = listaCoord;

                    resposta = await WSMostraRota.UpdateData("Rota", rota, true);

                    if ((resposta == null) || (resposta.ToLower().CompareTo("true") != 0))
                    {
                        ++tErros;
                    }
                    else
                    {
                        ++transmidas;
                    }
                }
            }

            // fim do processamento em segundo plano
            viewModel.IsBusy = false;

            // mostra mensagem mostrando totais de rotas sincronizadas
            string msg = "Rotas recebidas: " + recebidas.ToString();

            msg += "\nRotas transmitidas: " + transmidas.ToString();
            msg += "\n\nErros recepção: " + rErros.ToString();
            msg += "\nErros transmissão: " + tErros.ToString();

            await DisplayAlert("Sincronização de Rotas", msg, "OK");
        }