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"); }
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"); }