Beispiel #1
0
        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);
        }
Beispiel #2
0
        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));
        }