private static List <InformeTrazabilidad> TrazabilidadUbicacionesProcess(ContextService db, bool insert = false, int?IdAgente = null, DateTime?FechaInicio = null, DateTime?FechaFin = null, bool?totalizar = false) { long index = InformeTrazabilidad.Max(); List <InformeTrazabilidad> model = new List <InformeTrazabilidad>(); var listUbicacion = db.AgenteUbicaciones.Get(p => p.Fecha >= FechaInicio && p.Fecha <= FechaFin && (IdAgente == null || p.IdAgente == IdAgente)).OrderBy(p => p.Fecha).ToList(); var listAgente = listUbicacion.Select(p => p.IdAgente).Distinct(); db.ParametroHelper.Load(); foreach (var currentIdAgente in listAgente) { var list = listUbicacion.Where(p => p.IdAgente == currentIdAgente).ToList(); foreach (var item in list) { item.Ubicacion = String.Format("{0}|{1}|{2}", item.Fecha.ToString("HH:mm"), item.Latitud, item.Longitud); } foreach (var item in list) { item.Reportes = 1; } for (int i = list.Count - 1; i > 0; i--) { var actual = list[i]; var anterior = list[i - 1]; if (actual.Latitud == anterior.Latitud && actual.Longitud == anterior.Longitud) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Reportes += actual.Reportes; list.Remove(actual); } else { var distance = Ubicacion.Distance(actual.Longitud ?? 0, actual.Latitud ?? 0, anterior.Longitud ?? 0, anterior.Latitud ?? 0); anterior.Distancia += distance; if (distance < db.ParametroHelper.RoutedDistance)//0.050) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Reportes += actual.Reportes; list.Remove(actual); } } } foreach (var item in list) { if (item.FechaHasta != null && item.Fecha.ToString("yyyy-MM-dd HH:mm") == item.FechaHasta.Value.ToString("yyyy-MM-dd HH:mm")) { item.FechaHasta = item.Fecha; } if (item.Reportes == 1 || item.FechaHasta == null || item.Fecha == item.FechaHasta || (item.FechaHasta.Value - item.Fecha).TotalMinutes < db.ParametroHelper.MinutosIntervaloTrackingPosition) { item.EsMovimiento = true; } } for (int i = list.Count - 1; i > 0; i--) { var actual = list[i]; var anterior = list[i - 1]; if (actual.EsMovimiento && anterior.EsMovimiento)//if (actual.Reportes == 1 && anterior.Reportes == 1) { if (actual.FechaHasta == null) { anterior.FechaHasta = actual.Fecha; } else { anterior.FechaHasta = actual.FechaHasta; } anterior.Distancia += actual.Distancia; //anterior.Reportes += actual.Reportes; anterior.Ubicacion = String.Format("{0}~{1}", anterior.Ubicacion, actual.Ubicacion); list.Remove(actual); } } for (int i = 0; i < list.Count; i++) { AgenteUbicacion anterior = null; AgenteUbicacion siguiente = null; AgenteUbicacion actual = list[i]; if (actual.EsMovimiento) { if (i - 1 >= 0) { anterior = list[i - 1]; } if (i + 1 < list.Count) { siguiente = list[i + 1]; } if (anterior != null) { actual.Fecha = anterior.FechaHasta ?? anterior.Fecha; //actual.Ubicacion = String.Format("{0}~{1}", anterior.Ubicacion, actual.Ubicacion); var array = anterior.Ubicacion.Split('~'); actual.Ubicacion = String.Format("{0}~{1}", array[array.Count() - 1], actual.Ubicacion); } if (siguiente != null) { var array = siguiente.Ubicacion.Split('~'); actual.FechaHasta = siguiente.Fecha; //actual.Ubicacion = String.Format("{0}~{1}", actual.Ubicacion, siguiente.Ubicacion); actual.Ubicacion = String.Format("{0}~{1}", actual.Ubicacion, array[0]); } } } for (int i = 0; i < list.Count; i++) { AgenteUbicacion siguiente = null; AgenteUbicacion actual = list[i]; if (!actual.EsMovimiento) { if (i + 1 < list.Count) { siguiente = list[i + 1]; } if (siguiente != null && !siguiente.EsMovimiento) { var distance = Ubicacion.Distance(actual.Longitud ?? 0, actual.Latitud ?? 0, siguiente.Longitud ?? 0, siguiente.Latitud ?? 0); var movimiento = new AgenteUbicacion() { IdAgente = actual.IdAgente, Fecha = actual.FechaHasta ?? actual.Fecha, FechaHasta = siguiente.Fecha, Distancia = distance, Latitud = actual.Latitud, Longitud = actual.Longitud, Ubicacion = String.Format("{0}|{1}|{2}~{3}|{4}|{5}", actual.Fecha.ToString("HH:mm"), actual.Latitud, actual.Longitud, siguiente.Fecha.ToString("HH:mm"), siguiente.Latitud, siguiente.Longitud), EsMovimiento = true }; list.Insert(i + 1, movimiento); } } } foreach (var item in list) { string titulo = String.Empty; string tiempo = String.Empty; double TotalMinutes = 0; if (item.FechaHasta == null || item.Fecha.ToString("HH:mm") == item.FechaHasta.Value.ToString("HH:mm")) { titulo = item.Fecha.ToString("HH:mm"); } else { titulo = String.Format("{0} - {1}", item.Fecha.ToString("HH:mm"), item.FechaHasta.Value.ToString("HH:mm")); var dif = item.FechaHasta.Value - item.Fecha; TotalMinutes = dif.TotalMinutes; if (dif.Hours > 0) { tiempo = String.Format("{0} H.", dif.Hours); } if (dif.Minutes > 0) { if (!String.IsNullOrEmpty(tiempo)) { tiempo += ", "; } tiempo += String.Format("{0} Min.", dif.Minutes); } if (!String.IsNullOrEmpty(tiempo)) { titulo = String.Format("{0} ({1})", titulo, tiempo); } } model.Add(new InformeTrazabilidad() { IdInformeTrazabilidad = index, IdAgente = currentIdAgente, Fecha = item.Fecha.Date, HoraEntrada = item.Fecha.ToString("HH:mm"), Tiempo = !String.IsNullOrEmpty(tiempo) ? tiempo : "0 min.", HoraSalida = item.FechaHasta != null ? item.FechaHasta.Value.ToString("HH:mm") : item.Fecha.ToString("HH:mm"), Distancia = item.Distancia, EsMovimiento = item.EsMovimiento, Minutos = TotalMinutes, Ubicacion = item.Ubicacion.Replace(',', '.'), Latitud = item.Latitud ?? 0, Longitud = item.Longitud ?? 0, TipoTabla = Constantes.TipoEntradaTrazabilidad.Tabla, Tipo = item.EsMovimiento ? Constantes.TipoEntradaTrazabilidad.EnMovimiento : Constantes.TipoEntradaTrazabilidad.Detenido }); index++; } } if (totalizar.HasValue && !totalizar.Value) { foreach (var item in model.Where(p => !p.EsMovimiento)) { item.Direccion = Process.RutaOptima.GetAddress(item.Latitud, item.Longitud); } } if (insert) { db.AgenteUbicaciones.DeleteInformeTrazabilidad(FechaInicio.Value, FechaFin.Value); foreach (var item in model) { db.InformeTrazabilidads.Insert(item); } db.Save(); } return(model); }
public ActionResult GetUbicaciones(int?idAgente, long?fecha, bool incluirClientes, bool incluirRecorrido, bool incluirGestion) { RecorridoAgenteResult result = new RecorridoAgenteResult(); result.IdAgente = idAgente; result.Clientes = new List <ClienteAgendaUbicacion>(); result.Recorrido = new List <Ubicacion>(); result.RadioDistancia = 100; result.Fecha = new DateTime(fecha ?? 0); result.IncluirGestion = incluirGestion; result.IncluirClientes = incluirClientes; result.IncluirRecorrido = incluirRecorrido; if (idAgente != null && fecha != null) { DateTime fechaConsulta = new DateTime(fecha ?? 0); try { List <Ubicacion> model = new List <Ubicacion>(); DateTime fechaFin = fechaConsulta.AddDays(1).Date.AddSeconds(-1); DateTime fechaInicio = fechaConsulta.Date; if (incluirRecorrido) { var agenteUbicaciones = DataBase.AgenteUbicaciones.Get(p => p.Fecha >= fechaInicio && p.Fecha <= fechaFin && p.IdAgente == idAgente).OrderBy(p => p.Fecha).ToList(); DataBase.ParametroHelper.Load(); result.RadioDistancia = DataBase.ParametroHelper.VisitDistance; model = Ubicacion.Recorrido(agenteUbicaciones, DataBase.ParametroHelper.RoutedDistance); result.Recorrido.AddRange(model); } if (incluirClientes || incluirGestion) { var agente = DataBase.Agentes.GetByID(idAgente); if (agente != null && agente.IdRuta != null) { var agendas = DataBase.Agendas.Get(p => p.IdRuta == agente.IdRuta && p.FechaInicio >= fechaInicio && p.FechaInicio <= fechaFin && p.EstadoAgenda != Models.Constantes.EstadoAgenda.Eliminado, includeProperties: "ClienteDireccion.Cliente,EstadoAgendaGeneralValue,ClienteContacto"); foreach (var item in agendas) { ClienteAgendaUbicacion app = new ClienteAgendaUbicacion() { Latitud = item.ClienteDireccion.Latitud, Longitud = item.ClienteDireccion.Longitud, MarkerIndex = 0, Estado = item.EstadoAgendaGeneralValue.Content, ColorEstado = item.EstadoAgendaGeneralValue.Reference01, Direccion = item.ClienteDireccion.DescriptionName, Fecha = item.FechaInicio.Value, FechaInicioGestion = item.FechaInicioGestion, FechaFinGestion = item.FechaFinGestion, IdAgenda = item.IdAgenda, IdRuta = item.IdRuta, LongitudGestion = item.Longitud, LatitudGestion = item.Latitud }; if (item.EstadoAgenda == Models.Constantes.EstadoAgenda.NoVisitado) { app.Advertencia = true; } if (item.EstadoAgenda == Models.Constantes.EstadoAgenda.Visitada) { app.Realizada = true; } if (app.LongitudGestion.HasValue && app.LatitudGestion.HasValue && app.Latitud.HasValue && app.Longitud.HasValue && app.LongitudGestion != 0 && app.LatitudGestion != 0) { app.DistanciaGestion = Ubicacion.Distance(app.LongitudGestion.Value, app.LatitudGestion.Value, app.Longitud.Value, app.Latitud.Value) * 1000;//Transformar a metros } if (app.DistanciaGestion.HasValue && app.DistanciaGestion > 0 && app.DistanciaGestion > result.RadioDistancia) { app.Advertencia = true; } if (app.Realizada && (app.LongitudGestion.HasValue || app.LongitudGestion == 0)) { app.Advertencia = true; } if (item.ClienteContacto != null) { app.Titulo = item.ClienteContacto.NombresCompletos; } else { app.Titulo = item.ClienteDireccion.Cliente.NombresCompletos; } if (item.ClienteContacto != null && !string.IsNullOrEmpty(item.ClienteContacto.FotoMin)) { app.FotoPath = item.ClienteContacto.FotoMin; } else if (!string.IsNullOrEmpty(item.ClienteDireccion.Cliente.FotoMin)) { app.FotoPath = item.ClienteDireccion.Cliente.FotoMin; } result.Clientes.Add(app); } } } return(PartialView("_Map", result)); } catch { this.AddDefaultErrorMessage(); } } return(PartialView("_Map", result)); }