public TipoServicioCicloVo(TipoServicioCiclo tipoServicio) { Id = tipoServicio.Id; Codigo = tipoServicio.Codigo; Empresa = tipoServicio.Empresa != null ? tipoServicio.Empresa.RazonSocial : string.Empty; Linea = tipoServicio.Linea != null ? tipoServicio.Linea.Descripcion : string.Empty; Descripcion = tipoServicio.Descripcion; Demora = tipoServicio.Demora; Default = tipoServicio.Default; }
public ViajeDistribucion Parse(out int rutas, out int entregas) { const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath).Rows; STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; var sLinea = rows[Properties.DistribucionSos.Base][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sFecha = rows[Properties.DistribucionSos.Fecha][0].ToString().Replace("\t", string.Empty).Split(':'); var sHora = rows[Properties.DistribucionSos.HoraProgramada][0].ToString().Replace("\t", string.Empty).Split(':'); var sEntrega = rows[Properties.DistribucionSos.Entrega][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sPatente = rows[Properties.DistribucionSos.Patente][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLatO = rows[Properties.DistribucionSos.LatitudOrigen][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLonO = rows[Properties.DistribucionSos.LongitudOrigen][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLatD = rows[Properties.DistribucionSos.LatitudDestino][0].ToString().Replace("\t", string.Empty).Split(':')[1]; var sLonD = rows[Properties.DistribucionSos.LongitudDestino][0].ToString().Replace("\t", string.Empty).Split(':')[1]; if (string.IsNullOrEmpty(sEntrega)) { ThrowProperty("CODIGO ENTREGA", Llfile.Strategy); } if (string.IsNullOrEmpty(sPatente)) { ThrowProperty("PATENTE", Llfile.Strategy); } var linea = DaoFactory.LineaDAO.FindByCodigo(Empresa.Id, sLinea); if (linea == null) { ThrowProperty("BASE", Llfile.Strategy); } var viaje = DaoFactory.ViajeDistribucionDAO.FindByCodigo(Empresa.Id, linea.Id, sEntrega); if (viaje != null) { return(viaje); } var dia = Convert.ToInt32(sFecha[1].Substring(0, 2)); var mes = Convert.ToInt32(sFecha[1].Substring(3, 2)); var anio = Convert.ToInt32(sFecha[1].Substring(6, 4)); var hora = Convert.ToInt32(sHora[1]); var min = Convert.ToInt32(sHora[2]); var seg = Convert.ToInt32(sHora[3]); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, seg).Subtract(gmt); var vehiculo = DaoFactory.CocheDAO.FindByPatente(Empresa.Id, sPatente); if (vehiculo == null) { ThrowProperty("VEHICULO", Llfile.Strategy); } viaje = new ViajeDistribucion { Inicio = fecha, Codigo = sEntrega, Empresa = Empresa, Linea = linea, Vehiculo = vehiculo, Tipo = ViajeDistribucion.Tipos.Desordenado, Alta = DateTime.UtcNow, RegresoABase = false, Estado = ViajeDistribucion.Estados.Pendiente }; rutas++; var origen = new EntregaDistribucion { Linea = linea, Descripcion = linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(origen); var nombreOrigen = sEntrega + " - O"; var nombreDestino = sEntrega + " - D"; TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { Empresa.Id }, new[] { linea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } sLatO = sLatO.Replace(',', '.'); sLonO = sLonO.Replace(',', '.'); var latO = Convert.ToDouble(sLatO, CultureInfo.InvariantCulture); var lonO = Convert.ToDouble(sLonO, CultureInfo.InvariantCulture); ValidateGpsPoint(nombreOrigen, nombreOrigen, (float)latO, (float)lonO); sLatD = sLatD.Replace(',', '.'); sLonD = sLonD.Replace(',', '.'); var latD = Convert.ToDouble(sLatD, CultureInfo.InvariantCulture); var lonD = Convert.ToDouble(sLonD, CultureInfo.InvariantCulture); ValidateGpsPoint(nombreOrigen, nombreOrigen, (float)latD, (float)lonD); #region Origen var puntoEntregaO = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { Empresa.Id }, new[] { linea.Id }, new[] { Cliente.Id }, nombreOrigen); if (puntoEntregaO == null) { var empresaGeoRef = Empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreOrigen, Descripcion = nombreOrigen, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(latO, lonO); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonO, (float)latO) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntregaO = new PuntoEntrega { Cliente = Cliente, Codigo = nombreOrigen, Descripcion = nombreOrigen, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombreOrigen }; } else { if (!puntoEntregaO.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaO.ReferenciaGeografica.Latitude != latO || puntoEntregaO.ReferenciaGeografica.Longitude != lonO)) { puntoEntregaO.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaO.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(latO, lonO); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonO, (float)latO) }); puntoEntregaO.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaO.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaO.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntregaO.ReferenciaGeografica); } listPuntos.Add(puntoEntregaO); var entregaO = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntregaO, Descripcion = nombreOrigen, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaO); entregas++; #endregion #region Destino var puntoEntregaD = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { Empresa.Id }, new[] { linea.Id }, new[] { Cliente.Id }, nombreDestino); if (puntoEntregaD == null) { var empresaGeoRef = Empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreDestino, Descripcion = nombreDestino, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(latD, lonD); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonD, (float)latD) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntregaD = new PuntoEntrega { Cliente = Cliente, Codigo = nombreDestino, Descripcion = nombreDestino, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombreDestino }; } else { if (!puntoEntregaD.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaD.ReferenciaGeografica.Latitude != latD || puntoEntregaD.ReferenciaGeografica.Longitude != lonD)) { puntoEntregaD.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaD.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(latD, lonD); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lonD, (float)latD) }); puntoEntregaD.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaD.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaD.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntregaD.ReferenciaGeografica); } listPuntos.Add(puntoEntregaD); var anterior = puntoEntregaO.ReferenciaGeografica; var siguiente = puntoEntregaD.ReferenciaGeografica; var o = new LatLon(anterior.Latitude, anterior.Longitude); var d = new LatLon(siguiente.Latitude, siguiente.Longitude); var directions = GoogleDirections.GetDirections(o, d, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var duracion = directions.Duration; fecha = entregaO.Programado.Add(duracion); } var entregaD = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntregaD, Descripcion = nombreDestino, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaD); entregas++; viaje.Fin = fecha; #endregion STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); foreach (var referenciaGeografica in listReferencias) { DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count); te.Restart(); foreach (var puntoEntrega in listPuntos) { DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando Viaje"); te.Restart(); DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viaje); STrace.Trace(Component, string.Format("Viaje guardado en {0} segundos", te.getTimeElapsed().TotalSeconds)); return(viaje); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var patente = data.AsString(Properties.Distribution.Coche, 32).Trim(); var vehiculo = patente != string.Empty ? DaoFactory.CocheDAO.FindByPatente(empresa, patente) : null; var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : DaoFactory.LineaDAO.FindById(linea); if (oLinea == null) { ThrowProperty("LINEA"); } var oCliente = DaoFactory.ClienteDAO.GetList(new[] { empresa }, new[] { -1 }).FirstOrDefault(); if (oCliente == null) { ThrowProperty("CLIENTE"); } const int vigencia = 12; var sFecha = data.AsString(Properties.Distribution.Fecha, 6).Trim(); var codigo = sFecha + data.AsString(Properties.Distribution.Codigo, 8).Trim(); var item = GetDistribucion(empresa, oLinea.Id, codigo); if (data.Operation == (int)Operation.Delete) { return(item); } var sHora = data.AsString(Properties.Distribution.Horario, 4).Trim(); if (sHora.Length == 3) { sHora = "0" + sHora; } else if (sHora.Length != 4) { ThrowProperty("HORARIO"); } var latitud = data.AsString(Properties.Distribution.Latitud, 10).Trim(); var longitud = data.AsString(Properties.Distribution.Longitud, 10).Trim(); var esBase = latitud.Trim().Equals(string.Empty) && longitud.Trim().Equals(string.Empty); //var orden = data.AsString(Properties.Distribution.Orden, 2).Trim(); // HACE FALTA AGREGAR EL CAMPO AL MAPEO var dia = Convert.ToInt32(sFecha.Substring(0, 2)); var mes = Convert.ToInt32(sFecha.Substring(2, 2)); var anio = Convert.ToInt32(sFecha.Substring(4, 2)) + 2000; var hora = Convert.ToInt32(sHora.Substring(0, 2)); var min = Convert.ToInt32(sHora.Substring(2, 2)); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, 0).Subtract(gmt); if (item.Id == 0) { item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fecha; item.Fin = fecha; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = codigo.Contains("TR"); var nroViaje = data.AsString(Properties.Distribution.NroViaje, 1).Trim(); item.NumeroViaje = Convert.ToInt32(nroViaje); if (patente != string.Empty) { if (vehiculo != null) { item.Empleado = !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } else { STrace.Error("Logiclink", string.Format("Patente {0} no encontrada para el viaje: {1}", patente, codigo)); } } else { STrace.Error("Logiclink", "Patente vacía para el viaje: " + codigo); } } else { if (fecha < item.Inicio) { item.Inicio = fecha; } } var km = data.AsString(Properties.Distribution.Km, 32).Trim(); var distance = Convert.ToDouble(km, CultureInfo.InvariantCulture); if (esBase) { if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(oLinea.ReferenciaGeografica.Latitude, oLinea.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = item, KmCalculado = distance }; item.Detalles.Add(llegada); return(item); } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = item }; item.Detalles.Add(origen); } var codigoPuntoEntrega = data.AsString(Properties.Distribution.PuntoEntrega, 16).Trim(); var nombre = data.AsString(Properties.Distribution.Nombre, 32).Trim(); if (string.IsNullOrEmpty(codigoPuntoEntrega)) { ThrowProperty("PuntoEntrega"); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codigoPuntoEntrega)) { return(item); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { oLinea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } latitud = latitud.Replace(',', '.'); longitud = longitud.Replace(',', '.'); var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); ValidateGpsPoint(codigo, codigoPuntoEntrega, (float)lat, (float)lon); var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { oLinea.Id }, new[] { oCliente.Id }, codigoPuntoEntrega); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : oCliente.Empresa == null ? null : oEmpresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : oCliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPuntoEntrega, Descripcion = nombre, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codigoPuntoEntrega, Descripcion = nombre, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombre }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } if (item.Detalles.Last().TipoServicio != null) { fecha = fecha.AddMinutes(item.Detalles.Last().TipoServicio.Demora); } var entrega = new EntregaDistribucion { Cliente = oCliente, PuntoEntrega = puntoEntrega, Descripcion = codigoPuntoEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, //Orden = Convert.ToInt32(orden, CultureInfo.InvariantCulture), Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = item, KmCalculado = distance }; item.Detalles.Add(entrega); var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; return(item); }
public void Parse(out int rutas, out int entregas) { const char separator = '|'; const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath, separator).Rows; STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); te.Restart(); PreBufferRows(rows); STrace.Trace(Component, string.Format("PreBufferRows en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listViajes = new List <ViajeDistribucion>(rows.Count); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; STrace.Trace(Component, "Cantidad de filas: " + rows.Count); var filas = 0; foreach (var row in rows) { filas++; STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count)); var patente = row.Cells[Properties.DistribucionQuilmes.Patente].ToString().Trim(); var vehiculo = _cochesBuffer.SingleOrDefault(v => v.Patente == patente); var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : Linea; if (oLinea == null) { ThrowProperty("LINEA", Llfile.Strategy); } var sFecha = row.Cells[Properties.DistribucionQuilmes.Fecha].ToString().Trim(); var codigo = sFecha + row.Cells[Properties.DistribucionQuilmes.Ruta].ToString().Trim(); var sHora = row.Cells[Properties.DistribucionQuilmes.Hora].ToString().Trim(); if (sHora.Length == 3) { sHora = "0" + sHora; } else if (sHora.Length != 4) { ThrowProperty("HORARIO", Llfile.Strategy); } var latitud = row.Cells[Properties.DistribucionQuilmes.Latitud].ToString().Trim(); var longitud = row.Cells[Properties.DistribucionQuilmes.Longitud].ToString().Trim(); var esBase = latitud.Trim().Equals(string.Empty) && longitud.Trim().Equals(string.Empty); var dia = Convert.ToInt32(sFecha.Substring(0, 2)); var mes = Convert.ToInt32(sFecha.Substring(2, 2)); var anio = Convert.ToInt32(sFecha.Substring(4, 2)) + 2000; var hora = Convert.ToInt32(sHora.Substring(0, 2)); var min = Convert.ToInt32(sHora.Substring(2, 2)); var gmt = new TimeSpan(-3, 0, 0); var fecha = new DateTime(anio, mes, dia, hora, min, 0).Subtract(gmt); if (listViajes.Count == 0 || codigo != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigo); if (byCode != null) { continue; } } ViajeDistribucion item; if (listViajes.Count > 0 && listViajes.Any(v => v.Codigo == codigo)) { item = listViajes.SingleOrDefault(v => v.Codigo == codigo); if (fecha < item.Inicio) { item.Inicio = fecha; } } else { item = new ViajeDistribucion { Codigo = codigo }; rutas++; item.Empresa = Empresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fecha; item.Fin = fecha; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = codigo.Contains("TR"); var nroViaje = row.Cells[Properties.DistribucionQuilmes.Viaje].ToString().Trim(); item.NumeroViaje = Convert.ToInt32(nroViaje); if (vehiculo != null) { item.Empleado = !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } else { STrace.Error(Component, string.Format("Patente {0} no encontrada para el viaje: {1}", patente, codigo)); } listViajes.Add(item); } var kms = row.Cells[Properties.DistribucionQuilmes.Kms].ToString().Trim(); var distance = Convert.ToDouble(kms, CultureInfo.InvariantCulture); if (esBase) { if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(oLinea.ReferenciaGeografica.Latitude, oLinea.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = item, KmCalculado = distance }; item.Detalles.Add(llegada); continue; } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = item }; item.Detalles.Add(origen); } var codigoPuntoEntrega = row.Cells[Properties.DistribucionQuilmes.CodigoCliente].ToString().Trim(); var nombre = row.Cells[Properties.DistribucionQuilmes.DescripcionCliente].ToString().Trim(); if (string.IsNullOrEmpty(codigoPuntoEntrega)) { ThrowProperty("PUNTO ENTREGA", Llfile.Strategy); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codigoPuntoEntrega)) { continue; } TipoServicioCiclo tipoServicio = null; var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea == null || ts.Linea.Id == oLinea.Id); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } latitud = latitud.Replace(',', '.'); longitud = longitud.Replace(',', '.'); var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); ValidateGpsPoint(codigo, codigoPuntoEntrega, (float)lat, (float)lon); var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codigoPuntoEntrega); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : Cliente.Empresa == null ? null : Empresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : Cliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPuntoEntrega, Descripcion = nombre, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); listReferencias.Add(puntoDeInteres); puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codigoPuntoEntrega, Descripcion = nombre, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = nombre }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } listReferencias.Add(puntoEntrega.ReferenciaGeografica); } listPuntos.Add(puntoEntrega); if (codigo.Contains("TR")) { var ultimo = item.Detalles.Last().ReferenciaGeografica; var origen = new LatLon(ultimo.Latitude, ultimo.Longitude); var destino = new LatLon(puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); var directions = GoogleDirections.GetDirections(origen, destino, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { distance = directions.Distance / 1000.0; var duracion = directions.Duration; fecha = item.Detalles.Last().Programado.Add(duracion); } } if (item.Detalles.Last().TipoServicio != null) { fecha = fecha.AddMinutes(item.Detalles.Last().TipoServicio.Demora); } var entrega = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntrega, Descripcion = codigoPuntoEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, //Orden = Convert.ToInt32(orden, CultureInfo.InvariantCulture), Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = item, KmCalculado = distance }; item.Detalles.Add(entrega); entregas++; var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; } STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); foreach (var referenciaGeografica in listReferencias) { DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count); te.Restart(); foreach (var puntoEntrega in listPuntos) { DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando Viajes: " + listViajes.Count); te.Restart(); foreach (var viajeDistribucion in listViajes) { DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viajeDistribucion); } STrace.Trace(Component, string.Format("Viajes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(-1, -1); DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, -1); var lineas = DaoFactory.LineaDAO.FindList(new[] { Empresa.Id }); foreach (var lin in lineas) { DaoFactory.ReferenciaGeograficaDAO.DeleteCacheList(Empresa.Id, lin.Id); } }
public void Parse(out int rutas, out int entregas) { const int vigencia = 24; var te = new TimeElapsed(); var rows = ParseFile(Llfile.FilePath, Properties.DistribucionReginaldLee.Anchos).Rows; STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); te.Restart(); PreBufferRows(rows); STrace.Trace(Component, string.Format("PreBufferRows en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listViajes = new List <ViajeDistribucion>(rows.Count); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; STrace.Trace(Component, "Cantidad de filas: " + rows.Count); var filas = 0; foreach (var row in rows) { filas++; STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count)); var ruta = row.Cells[Properties.DistribucionReginaldLee.CodigoRuta].ToString().Trim(); if (ruta == string.Empty) { ThrowProperty("CODIGO_RUTA", Llfile.Strategy); } var nroViaje = 1; if (ruta.Contains(",")) { var rutaSplitted = ruta.Split(','); int.TryParse(rutaSplitted[1], out nroViaje); } var codEntrega = row.Cells[Properties.DistribucionReginaldLee.CodigoPedido].ToString().Trim(); if (codEntrega == string.Empty) { ThrowProperty("CODIGO_ENTREGA", Llfile.Strategy); } var codCliente = row.Cells[Properties.DistribucionReginaldLee.CodigoCliente].ToString().Trim(); if (codCliente == string.Empty) { ThrowProperty("CODIGO_CLIENTE", Llfile.Strategy); } var rowWithCoords = true; double latitud; double longitud; if (!double.TryParse(row.Cells[Properties.DistribucionReginaldLee.Latitud].ToString().Trim(), out latitud)) { rowWithCoords = false; } if (!double.TryParse(row.Cells[Properties.DistribucionReginaldLee.Longitud].ToString().Trim(), out longitud)) { rowWithCoords = false; } var orientacionSouthNorth = row.Cells[Properties.DistribucionReginaldLee.OrientacionNorthSouth].ToString().Trim(); var orientacionEastWest = row.Cells[Properties.DistribucionReginaldLee.OrientacionEastWest].ToString().Trim(); if (orientacionSouthNorth.Equals("S")) { latitud = latitud * (-1); } if (orientacionEastWest.Equals("W")) { longitud = longitud * (-1); } var fecha = row.Cells[Properties.DistribucionReginaldLee.Fecha].ToString().Trim(); if (fecha == string.Empty) { ThrowProperty("FECHA", Llfile.Strategy); } int dia, mes, anio, hr, min; int.TryParse(fecha.Substring(0, 4), out anio); int.TryParse(fecha.Substring(5, 2), out mes); int.TryParse(fecha.Substring(8, 2), out dia); int.TryParse(fecha.Substring(11, 2), out hr); int.TryParse(fecha.Substring(14, 2), out min); var gmt = new TimeSpan(-3, 0, 0); var date = new DateTime(anio, mes, dia, hr, min, 0).Subtract(gmt); int packs; if (!int.TryParse(row.Cells[Properties.DistribucionReginaldLee.Packs].ToString().Trim(), out packs)) { try { ThrowProperty("PACKS", Llfile.Strategy); } catch (Exception ex2) { STrace.Exception(Component, ex2, String.Format("Error en Fila #{0}: {1}", filas, ex2.Message)); continue; } } var codigo = date.ToString("yyMMdd") + "|" + ruta; if (listViajes.Count == 0 || codigo != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigo); if (byCode != null) { continue; } } ViajeDistribucion item; if (listViajes.Count > 0 && listViajes.Any(v => v.Codigo == codigo)) { item = listViajes.SingleOrDefault(v => v.Codigo == codigo); } else { item = new ViajeDistribucion { Codigo = codigo }; rutas++; Coche vehiculo = null; var interno = row.Cells[Properties.DistribucionReginaldLee.Interno].ToString().Trim(); if (interno.Length == 3) { interno = "0" + interno; } if (!string.IsNullOrEmpty(interno)) { vehiculo = _cochesBuffer.SingleOrDefault(c => c.Interno == interno); } if (vehiculo == null) { ThrowProperty("VEHICULO", Llfile.Strategy); } else if (vehiculo.Linea == null) { ThrowProperty("BASE", Llfile.Strategy); } item.Empresa = Empresa; item.Linea = vehiculo.Linea; item.Vehiculo = vehiculo; item.Inicio = date; item.Fin = date; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.NumeroViaje = Convert.ToInt32(nroViaje); listViajes.Add(item); } // Entregas if (item.Detalles.Count == 0) { // Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = item.Linea, Descripcion = item.Linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = item.Linea, Descripcion = item.Linea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(llegada); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente)) { var repetido = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente); repetido.Bultos += packs; continue; } TipoServicioCiclo tipoServicio = null; var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea.Id == item.Linea.Id || ts.Linea == null); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codCliente); if (puntoEntrega == null) { var descCliente = row.Cells[Properties.DistribucionReginaldLee.DescripcionCliente].ToString().Trim(); var puntoDeInteres = new ReferenciaGeografica { Codigo = codCliente, Descripcion = descCliente, Empresa = Empresa, Linea = item.Linea, EsFin = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = date.Date, Fin = date.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; if (!rowWithCoords) { try { ThrowProperty("LATITUD_LONGITUD", Llfile.Strategy); } catch (Exception ex) { STrace.Exception(Component, ex, String.Format("Error en Fila #{0}: {1}", filas, ex.Message)); continue; } } var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = date.Date } }); listReferencias.Add(puntoDeInteres); puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codCliente, Descripcion = descCliente, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = descCliente }; } else { if (!rowWithCoords) { try { ThrowProperty("LATITUD_LONGITUD", Llfile.Strategy); } catch (Exception ex) { STrace.Exception(Component, ex, String.Format("Error en Fila #{0}: {1}", filas, ex.Message)); continue; } } if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud || puntoEntrega.ReferenciaGeografica.Longitude != longitud)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = date.Date; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = date.Date; var posicion = GetNewDireccion(latitud, longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, date.Date); } if (puntoEntrega.ReferenciaGeografica.Vigencia.Inicio > date.Date) { puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date; } var end = date.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } puntoEntrega.ReferenciaGeografica.Linea = item.Linea; listReferencias.Add(puntoEntrega.ReferenciaGeografica); } listPuntos.Add(puntoEntrega); var kms = 0.0; var orden = item.Detalles.Count - 1; var anterior = item.Detalles.FirstOrDefault(d => d.Orden == orden - 1); if (anterior != null) { kms = GeocoderHelper.CalcularDistacia(anterior.ReferenciaGeografica.Latitude, anterior.ReferenciaGeografica.Longitude, puntoEntrega.ReferenciaGeografica.Latitude, puntoEntrega.ReferenciaGeografica.Longitude); } var entrega = new EntregaDistribucion { Cliente = puntoEntrega.Cliente, PuntoEntrega = puntoEntrega, Descripcion = codEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = orden, Programado = date, ProgramadoHasta = date, TipoServicio = tipoServicio, Viaje = item, Bultos = packs }; item.Detalles.Add(entrega); entregas++; var maxDate = item.Detalles.Max(d => d.Programado); item.Fin = maxDate; var ultimo = item.Detalles.Last(e => e.Linea != null); ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate; ultimo.Orden = item.Detalles.Count - 1; } STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); foreach (var referenciaGeografica in listReferencias) { DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count); te.Restart(); foreach (var puntoEntrega in listPuntos) { DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando Viajes: " + listViajes.Count); te.Restart(); foreach (var viajeDistribucion in listViajes) { DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viajeDistribucion); } STrace.Trace(Component, string.Format("Viajes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var oLinea = DaoFactory.LineaDAO.FindById(linea); if (oLinea == null) { ThrowProperty("LINEA"); } const int vigencia = 24; var codRuta = data[Properties.DistribucionB.CodigoRuta].Trim(); if (string.IsNullOrEmpty(codRuta)) { ThrowProperty("RUTA"); } var codEntrega = data[Properties.DistribucionB.CodigoEntrega].Trim(); if (string.IsNullOrEmpty(codEntrega)) { ThrowProperty("ENTREGA"); } var codPuntoEntrega = data[Properties.DistribucionB.CodigoPuntoEntrega].Trim(); if (string.IsNullOrEmpty(codPuntoEntrega)) { ThrowProperty("PUNTO_ENTREGA"); } var estado = data[Properties.DistribucionB.Estado].Trim(); var fecha = data[Properties.DistribucionB.Fecha].Trim(); if (string.IsNullOrEmpty(fecha)) { ThrowProperty("FECHA"); } if (fecha.Length != 8) { ThrowProperty("FECHA"); } var hora = data[Properties.DistribucionB.HoraProgramada].Trim(); if (string.IsNullOrEmpty(hora)) { ThrowProperty("HORA"); } if (hora.Length != 8) { ThrowProperty("HORA"); } int dia, mes, anio, hr, min, seg; if (!int.TryParse(fecha.Substring(0, 4), out anio)) { ThrowProperty("AÑO"); } if (!int.TryParse(fecha.Substring(4, 2), out mes)) { ThrowProperty("MES"); } if (!int.TryParse(fecha.Substring(6, 2), out dia)) { ThrowProperty("DIA"); } if (!int.TryParse(hora.Substring(0, 2), out hr)) { ThrowProperty("HORA"); } if (!int.TryParse(hora.Substring(3, 2), out min)) { ThrowProperty("MINUTO"); } if (!int.TryParse(hora.Substring(6, 2), out seg)) { ThrowProperty("SEGUNDO"); } var gmt = new TimeSpan(-3, 0, 0); var date = new DateTime(anio, mes, dia, hr, min, seg).Subtract(gmt); var item = GetDistribucion(empresa, linea, codRuta); if (data.Operation == (int)Operation.Delete) { return(item); } if (!string.IsNullOrEmpty(estado)) { if (item.Id != 0) { var ptoEntrega = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.Descripcion == codEntrega); if (ptoEntrega == null) { return(item); } item.Detalles.Remove(ptoEntrega); DaoFactory.EntregaDistribucionDAO.Delete(ptoEntrega); } return(item); } if (item.Id == 0) { Coche vehiculo = null; var interno = data[Properties.DistribucionB.Interno].Trim(); if (!string.IsNullOrEmpty(interno)) { vehiculo = DaoFactory.CocheDAO.GetByInternoEndsWith(new[] { empresa }, new[] { linea }, interno); if (vehiculo == null) { STrace.Error("Logiclink", string.Format("Interno {0} no encontrado para el viaje: {1}", interno, codRuta)); } } else { STrace.Error("Logiclink", "Interno vacío para el viaje: " + codRuta); } item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = date; item.Fin = date; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.NumeroViaje = 1; } // Entregas if (item.Detalles.Count == 0) { // Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(llegada); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { linea }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { linea }, new[] { -1 }, codPuntoEntrega); if (puntoEntrega == null) { ThrowProperty("PUNTO_ENTREGA_INEXISTENTE"); } else { var end = date.AddHours(vigencia); puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date.ToDataBaseDateTime(); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionBV1"); DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } var entrega = new EntregaDistribucion { Cliente = puntoEntrega.Cliente, PuntoEntrega = puntoEntrega, Descripcion = codEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count - 1, Programado = date, ProgramadoHasta = date, TipoServicio = tipoServicio, Viaje = item }; item.Detalles.Add(entrega); var maxDate = item.Detalles.Max(d => d.Programado); item.Fin = maxDate; var ultimo = item.Detalles.Last(e => e.Linea != null); if (ultimo.Id > 0) { ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate; ultimo.Orden = item.Detalles.Count - 1; DaoFactory.EntregaDistribucionDAO.SaveOrUpdate(ultimo); } return(item); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var tipo = data[Properties.DistribucionE.Tipo].Trim(); var nroDoc = data[Properties.DistribucionE.NroDocumento].Trim(); var despacho = data[Properties.DistribucionE.FechaDespacho].Trim(); var generacion = data[Properties.DistribucionE.FechaGeneracion].Trim(); var guardia = data[Properties.DistribucionE.Guardia].Trim(); var latitud = data[Properties.DistribucionE.Latitud].Trim(); var longitud = data[Properties.DistribucionE.Longitud].Trim(); var codigoViaje = DateTime.Today.ToString("ddMMyy") + "|" + guardia; var codigoTarea = tipo + "|" + nroDoc; var empleado = DaoFactory.EmpleadoDAO.FindByLegajo(empresa, -1, guardia); if (empleado == null) { ThrowProperty("EMPLEADO"); } var vehiculo = DaoFactory.CocheDAO.FindByChofer(empleado.Id); if (vehiculo == null) { ThrowProperty("VEHICULO"); } var oLinea = vehiculo.Linea != null ? vehiculo.Linea : empleado.Linea; if (oLinea == null) { ThrowProperty("LINEA"); } var oCliente = DaoFactory.ClienteDAO.GetList(new[] { empresa }, new[] { -1 }).FirstOrDefault(); if (oCliente == null) { ThrowProperty("CLIENTE"); } const int vigencia = 24; var item = GetDistribucion(empresa, oLinea.Id, codigoViaje); if (data.Operation == (int)Operation.Delete) { return(item); } var anioDespacho = Convert.ToInt32(despacho.Substring(0, 4)); var mesDespacho = Convert.ToInt32(despacho.Substring(5, 2)); var diaDespacho = Convert.ToInt32(despacho.Substring(8, 2)); var horaDespacho = Convert.ToInt32(despacho.Substring(11, 2)); var minDespacho = Convert.ToInt32(despacho.Substring(14, 2)); var gmt = new TimeSpan(-3, 0, 0); var fechaDespacho = new DateTime(anioDespacho, mesDespacho, diaDespacho, horaDespacho, minDespacho, 0).Subtract(gmt); var anioGeneracion = Convert.ToInt32(generacion.Substring(0, 4)); var mesGeneracion = Convert.ToInt32(generacion.Substring(5, 2)); var diaGeneracion = Convert.ToInt32(generacion.Substring(8, 2)); var horaGeneracion = Convert.ToInt32(generacion.Substring(11, 2)); var minGeneracion = Convert.ToInt32(generacion.Substring(14, 2)); var fechaGeneracion = new DateTime(anioGeneracion, mesGeneracion, diaGeneracion, horaGeneracion, minGeneracion, 0).Subtract(gmt); if (item.Id == 0) { item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Inicio = fechaDespacho; item.Fin = fechaDespacho; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = false; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.ProgramacionDinamica = false; item.NumeroViaje = 1; item.Empleado = empleado; item.CentroDeCostos = vehiculo.CentroDeCostos; item.SubCentroDeCostos = vehiculo.SubCentroDeCostos; } // Entregas if (item.Detalles.Count == 0) { //Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fechaDespacho, ProgramadoHasta = fechaDespacho, Viaje = item }; item.Detalles.Add(origen); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { oLinea.Id }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var lat = Convert.ToDouble(latitud, CultureInfo.InvariantCulture); var lon = Convert.ToDouble(longitud, CultureInfo.InvariantCulture); var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { oLinea.Id }, new[] { oCliente.Id }, codigoTarea); if (puntoEntrega == null) { var empresaGeoRef = item.Vehiculo != null && item.Vehiculo.Empresa == null ? null : oCliente.Empresa == null ? null : oEmpresa; var lineaGeoRef = item.Vehiculo != null && item.Vehiculo.Linea == null ? null : oCliente.Linea == null ? null : oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoTarea, Descripcion = codigoTarea, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fechaDespacho.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionEV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codigoTarea, Descripcion = codigoTarea, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = codigoTarea }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != lat || puntoEntrega.ReferenciaGeografica.Longitude != lon)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(lat, lon); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)lon, (float)lat) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fechaDespacho.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionEV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); var entrega = new EntregaDistribucion { Cliente = oCliente, PuntoEntrega = puntoEntrega, Descripcion = codigoTarea, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = fechaDespacho, ProgramadoHasta = fechaDespacho, TipoServicio = tipoServicio, Viaje = item }; item.Detalles.Add(entrega); var lastDetail = item.Detalles.LastOrDefault(); item.Fin = lastDetail == null ? item.Inicio : lastDetail.Programado; return(item); }
public override object Parse(int empresa, int linea, IData data) { var oEmpresa = DaoFactory.EmpresaDAO.FindById(empresa); var oCliente = DaoFactory.ClienteDAO.FindById(4186); // RESTO DE MERCADO const int vigencia = 24; var codLinea = data.AsString(Properties.DistribucionF.Centro, 4).Trim(); if (string.IsNullOrEmpty(codLinea)) { ThrowProperty("LINEA"); } var oLinea = DaoFactory.LineaDAO.FindByCodigo(empresa, codLinea); if (oLinea == null) { ThrowProperty("LINEA"); } var ruta = data.AsString(Properties.DistribucionF.Ruta, 8).Trim(); if (string.IsNullOrEmpty(ruta)) { ThrowProperty("RUTA"); } int nroViaje; if (!int.TryParse(ruta.Split(',')[1], out nroViaje)) { ThrowProperty("NUMERO_VIAJE"); } var codEntrega = data.AsString(Properties.DistribucionF.Entrega, 10).Trim(); if (string.IsNullOrEmpty(codEntrega)) { ThrowProperty("ENTREGA"); } var codCliente = data.AsString(Properties.DistribucionF.CodigoCliente, 9).Trim(); if (string.IsNullOrEmpty(codCliente)) { ThrowProperty("CODIGO_CLIENTE"); } var latitud = data.AsDouble(Properties.DistribucionF.Latitud) / 1000000.0; if (!latitud.HasValue) { ThrowProperty("LATITUD"); } var longitud = data.AsDouble(Properties.DistribucionF.Longitud) / 1000000.0; if (!longitud.HasValue) { ThrowProperty("LONGITUD"); } var fecha = data.AsString(Properties.DistribucionF.Fecha, 10).Trim(); if (string.IsNullOrEmpty(fecha)) { ThrowProperty("FECHA"); } var hora = data.AsString(Properties.DistribucionF.Hora, 8).Trim(); if (string.IsNullOrEmpty(hora)) { ThrowProperty("HORA"); } int dia, mes, anio, hr, min, seg; if (!int.TryParse(fecha.Substring(0, 2), out dia)) { ThrowProperty("DIA"); } if (!int.TryParse(fecha.Substring(3, 2), out mes)) { ThrowProperty("MES"); } if (!int.TryParse(fecha.Substring(6, 4), out anio)) { ThrowProperty("AÑO"); } if (!int.TryParse(hora.Substring(0, 2), out hr)) { ThrowProperty("HORA"); } if (hr == 0) { hr = nroViaje <= 1 ? 6 : 12; } if (!int.TryParse(hora.Substring(3, 2), out min)) { ThrowProperty("MINUTO"); } if (!int.TryParse(hora.Substring(6, 2), out seg)) { ThrowProperty("SEGUNDO"); } var gmt = new TimeSpan(-3, 0, 0); var date = new DateTime(anio, mes, dia, hr, min, seg).Subtract(gmt); var cajas = data.AsInt32(Properties.DistribucionF.Cajas); if (!cajas.HasValue) { ThrowProperty("CAJAS"); } var codigo = date.ToString("yyMMdd") + "|" + ruta; var item = GetDistribucion(empresa, linea, codigo); if (data.Operation == (int)Operation.Delete) { return(item); } if (item.Id == 0) { Coche vehiculo = null; var patente = data.AsString(Properties.DistribucionF.Patente, 10).Trim(); if (!string.IsNullOrEmpty(patente)) { vehiculo = DaoFactory.CocheDAO.GetByPatente(new[] { empresa }, new[] { oLinea.Id }, patente); } if (vehiculo == null) { var asig = DaoFactory.PreasignacionViajeVehiculoDAO.FindByCodigo(empresa, oLinea.Id, -1, ruta); if (asig != null) { vehiculo = asig.Vehiculo; } } Empleado empleado = null; var legajo = data.AsString(Properties.DistribucionF.Legajo, 10).Trim(); if (!string.IsNullOrEmpty(legajo)) { empleado = DaoFactory.EmpleadoDAO.GetByLegajo(empresa, oLinea.Id, legajo); } item.Empresa = oEmpresa; item.Linea = oLinea; item.Vehiculo = vehiculo; item.Empleado = empleado; item.Inicio = date; item.Fin = date; item.Tipo = ViajeDistribucion.Tipos.Desordenado; item.RegresoABase = true; item.Estado = ViajeDistribucion.Estados.Pendiente; item.Alta = DateTime.UtcNow; item.NumeroViaje = Convert.ToInt32(nroViaje); } // Entregas if (item.Detalles.Count == 0) { // Si no existe, agrego la salida de base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count, Programado = date, ProgramadoHasta = date, Viaje = item }; item.Detalles.Add(llegada); } if (item.Detalles.Any(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente)) { var repetido = item.Detalles.FirstOrDefault(d => d.PuntoEntrega != null && d.PuntoEntrega.Codigo == codCliente); repetido.Bultos += cajas.Value; DaoFactory.EntregaDistribucionDAO.SaveOrUpdate(repetido); return(item); } TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa }, new[] { linea }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } var puntoEntrega = DaoFactory.PuntoEntregaDAO.GetByCode(new[] { empresa }, new[] { linea }, new[] { -1 }, codCliente); if (puntoEntrega == null) { var descCliente = data.AsString(Properties.DistribucionF.DescripcionCliente, 128).Trim(); if (string.IsNullOrEmpty(descCliente)) { ThrowProperty("NOMBRE_CLIENTE"); } var puntoDeInteres = new ReferenciaGeografica { Codigo = codCliente, Descripcion = descCliente, Empresa = oEmpresa, Linea = oLinea, EsFin = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = oCliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = date.Date, Fin = date.AddHours(vigencia) }, Icono = oCliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(latitud.Value, longitud.Value); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud.Value, (float)latitud.Value) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = date.Date } }); DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoDeInteres); STrace.Trace("QtreeReset", "DistribucionFV1 1"); puntoEntrega = new PuntoEntrega { Cliente = oCliente, Codigo = codCliente, Descripcion = descCliente, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Nombre = descCliente }; } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud.Value || puntoEntrega.ReferenciaGeografica.Longitude != longitud.Value)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = date.Date; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = date.Date; var posicion = GetNewDireccion(latitud.Value, longitud.Value); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = date.Date } }; poligono.AddPoints(new[] { new PointF((float)longitud.Value, (float)latitud.Value) }); puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, date.Date); } puntoEntrega.ReferenciaGeografica.Vigencia.Inicio = date.Date; var end = date.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SingleSaveOrUpdate(puntoEntrega.ReferenciaGeografica); STrace.Trace("QtreeReset", "DistribucionFV1 2"); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); var entrega = new EntregaDistribucion { Cliente = puntoEntrega.Cliente, PuntoEntrega = puntoEntrega, Descripcion = codEntrega, Estado = EntregaDistribucion.Estados.Pendiente, Orden = item.Detalles.Count - 1, Programado = date, ProgramadoHasta = date, TipoServicio = tipoServicio, Viaje = item, Bultos = cajas.Value }; item.Detalles.Add(entrega); var maxDate = item.Detalles.Max(d => d.Programado); item.Fin = maxDate; var ultimo = item.Detalles.Last(e => e.Linea != null); if (ultimo.Id > 0) { ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate; ultimo.Orden = item.Detalles.Count - 1; DaoFactory.EntregaDistribucionDAO.SaveOrUpdate(ultimo); } return(item); }
private ViajeDistribucion BuildRoute(SosTicket service) { var empresa = DaoFactory.EmpresaDAO.FindByCodigo(CodigoEmpresa); var linea = DaoFactory.LineaDAO.FindByCodigo(empresa.Id, CodigoLinea); var cliente = DaoFactory.ClienteDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, CodigoCliente); const int vigencia = 12; var fecha = service.HoraServicio; var viaje = new ViajeDistribucion(); if (service.Distribucion == null) { //viaje viaje.Codigo = service.NumeroServicio; viaje.Empresa = empresa; viaje.Linea = linea; viaje.Estado = ViajeDistribucion.Estados.Pendiente; viaje.Tipo = ViajeDistribucion.Tipos.Desordenado; viaje.Inicio = fecha; viaje.RegresoABase = false; viaje.Fin = fecha.AddHours(1); viaje.Vehiculo = DaoFactory.CocheDAO.FindByInterno(new[] { empresa.Id }, new[] { -1 }, service.Movil.ToString()); //base al inicio var entregaBase = new EntregaDistribucion(); entregaBase.Linea = linea; entregaBase.Descripcion = linea.Descripcion; entregaBase.Estado = EntregaDistribucion.Estados.Pendiente; entregaBase.Programado = fecha; entregaBase.ProgramadoHasta = fecha.AddHours(1); entregaBase.Orden = viaje.Detalles.Count; entregaBase.Viaje = viaje; entregaBase.KmCalculado = 0; viaje.Detalles.Add(entregaBase); var nombreOrigen = service.NumeroServicio + " - A"; var nombreDestino = service.NumeroServicio + " - B"; TipoServicioCiclo tipoServicio = null; var tipoServ = DaoFactory.TipoServicioCicloDAO.FindDefault(new[] { empresa.Id }, new[] { -1 }); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } #region Origen var puntoEntregaO = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, new[] { cliente.Id }, nombreOrigen); if (puntoEntregaO == null) { var empresaGeoRef = empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreOrigen, Descripcion = nombreOrigen, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(service.Origen.Latitud, service.Origen.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Origen.Longitud, (float)service.Origen.Latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoDeInteres); puntoEntregaO = new PuntoEntrega { Cliente = cliente, Codigo = nombreOrigen, Descripcion = nombreOrigen, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = service.Origen.Direccion + ", " + service.Origen.Localidad, Nombre = nombreOrigen }; } else { if (!puntoEntregaO.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaO.ReferenciaGeografica.Latitude != service.Origen.Latitud || puntoEntregaO.ReferenciaGeografica.Longitude != service.Origen.Longitud)) { puntoEntregaO.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaO.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(service.Origen.Latitud, service.Origen.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Origen.Longitud, (float)service.Origen.Latitud) }); puntoEntregaO.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaO.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaO.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoEntregaO.ReferenciaGeografica); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntregaO); var entregaO = new EntregaDistribucion { Cliente = cliente, PuntoEntrega = puntoEntregaO, Descripcion = nombreOrigen, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaO); #endregion #region Destino var puntoEntregaD = DaoFactory.PuntoEntregaDAO.FindByCode(new[] { empresa.Id }, new[] { -1 }, new[] { cliente.Id }, nombreDestino); if (puntoEntregaD == null) { var empresaGeoRef = empresa; var lineaGeoRef = linea; var puntoDeInteres = new ReferenciaGeografica { Codigo = nombreDestino, Descripcion = nombreDestino, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; var posicion = GetNewDireccion(service.Destino.Latitud, service.Destino.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Destino.Longitud, (float)service.Destino.Latitud) }); puntoDeInteres.Historia.Add(new HistoriaGeoRef { ReferenciaGeografica = puntoDeInteres, Direccion = posicion, Poligono = poligono, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }); DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoDeInteres); puntoEntregaD = new PuntoEntrega { Cliente = cliente, Codigo = nombreDestino, Descripcion = nombreDestino, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = service.Destino.Direccion + ", " + service.Destino.Localidad, Nombre = nombreDestino }; } else { if (!puntoEntregaD.ReferenciaGeografica.IgnoraLogiclink && (puntoEntregaD.ReferenciaGeografica.Latitude != service.Destino.Latitud || puntoEntregaD.ReferenciaGeografica.Longitude != service.Destino.Longitud)) { puntoEntregaD.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntregaD.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; var posicion = GetNewDireccion(service.Destino.Latitud, service.Destino.Longitud); var poligono = new Poligono { Radio = 50, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)service.Destino.Longitud, (float)service.Destino.Latitud) }); puntoEntregaD.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } var end = fecha.AddHours(vigencia); if (puntoEntregaD.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntregaD.ReferenciaGeografica.Vigencia.Fin = end; } DaoFactory.ReferenciaGeograficaDAO.SaveOrUpdate(puntoEntregaD.ReferenciaGeografica); } DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntregaD); var anterior = puntoEntregaO.ReferenciaGeografica; var siguiente = puntoEntregaD.ReferenciaGeografica; var o = new LatLon(anterior.Latitude, anterior.Longitude); var d = new LatLon(siguiente.Latitude, siguiente.Longitude); var directions = GoogleDirections.GetDirections(o, d, GoogleDirections.Modes.Driving, string.Empty, null); if (directions != null) { var duracion = directions.Duration; fecha = entregaO.Programado.Add(duracion); } var entregaD = new EntregaDistribucion { Cliente = cliente, PuntoEntrega = puntoEntregaD, Descripcion = nombreDestino, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, TipoServicio = tipoServicio, Viaje = viaje }; viaje.Detalles.Add(entregaD); viaje.Fin = fecha; #endregion } return(viaje); }
public void Parse(out int rutas, out int entregas, out string observaciones) { const int vigencia = 12; var te = new TimeElapsed(); var rows = ParseExcelFile(Llfile.FilePath, true); STrace.Trace(Component, string.Format("Archivo parseado en {0} segundos", te.getTimeElapsed().TotalSeconds)); te.Restart(); PreBufferRows(rows); STrace.Trace(Component, string.Format("PreBufferRows en {0} segundos", te.getTimeElapsed().TotalSeconds)); var listViajes = new List <ViajeDistribucion>(rows.Count); var listPuntos = new List <PuntoEntrega>(); var listReferencias = new List <ReferenciaGeografica>(); rutas = 0; entregas = 0; observaciones = string.Empty; STrace.Trace(Component, "Cantidad de filas: " + rows.Count); var filas = 0; foreach (var row in rows) { filas++; STrace.Trace(Component, string.Format("Procesando fila: {0}/{1}", filas, rows.Count)); var stringFecha = row[Properties.DistribucionMusimundo.Fecha].ToString().Trim(); var fecha = new DateTime(Convert.ToInt32(stringFecha.Substring(0, 4)), Convert.ToInt32(stringFecha.Substring(4, 2)), Convert.ToInt32(stringFecha.Substring(6, 2)), Convert.ToInt32(stringFecha.Substring(8, 2)), 0, 0).AddHours(-3); var patente = row[Properties.DistribucionMusimundo.Patente].ToString().Trim(); var codigoPedido = row[Properties.DistribucionMusimundo.Factura].ToString().Trim(); var numeroViaje = Convert.ToInt32(row[Properties.DistribucionMusimundo.TM].ToString().Trim()); //var secuencia = Convert.ToInt32(row[GetColumnByValue(Fields.Secuencia.Value)]); var codigoViaje = string.Format("{0}|{1}|{2}", stringFecha.Substring(0, 8), patente, numeroViaje); var strLat = row[Properties.DistribucionMusimundo.Coord1].ToString().Trim().Replace('.', ','); var strLon = row[Properties.DistribucionMusimundo.Coord2].ToString().Trim().Replace('.', ','); var latitud = Convert.ToDouble(strLat); var longitud = Convert.ToDouble(strLon); var importe = row[Properties.DistribucionMusimundo.Importe].ToString().Trim() != "" ? Convert.ToDouble(row[Properties.DistribucionMusimundo.Importe].ToString().Trim()) : 0.0; var nombre = row[Properties.DistribucionMusimundo.Direccion].ToString().Trim(); var vehiculo = _cochesBuffer.SingleOrDefault(v => v.Patente.Contains(patente)); var chofer = vehiculo != null && !vehiculo.IdentificaChoferes ? vehiculo.Chofer : null; var oLinea = vehiculo != null && vehiculo.Linea != null ? vehiculo.Linea : Linea; if (oLinea == null) { observaciones = "Valor inválido para el campo LINEA"; continue; } TipoServicioCiclo tipoServicio = null; var tipoServ = _tiposServicioBuffer.SingleOrDefault(ts => ts.Linea == null || ts.Linea.Id == oLinea.Id); if (tipoServ != null && tipoServ.Id > 0) { tipoServicio = tipoServ; } if (listViajes.Count == 0 || codigoViaje != listViajes.Last().Codigo) { var byCode = _viajesBuffer.SingleOrDefault(v => v.Codigo == codigoViaje); if (byCode != null) { continue; } } ViajeDistribucion viaje; if (listViajes.Count > 0 && codigoViaje == listViajes.Last().Codigo) { viaje = listViajes.Last(); } else { #region viaje = new ViajeDistribucion() viaje = new ViajeDistribucion { Empresa = vehiculo.Empresa, Linea = oLinea, Vehiculo = vehiculo, Empleado = chofer, Codigo = codigoViaje, Estado = ViajeDistribucion.Estados.Pendiente, Inicio = fecha, Fin = fecha, NumeroViaje = Convert.ToInt32(numeroViaje), Tipo = ViajeDistribucion.Tipos.Desordenado, Alta = DateTime.UtcNow, RegresoABase = true }; #endregion listViajes.Add(viaje); rutas++; } viaje.Fin = fecha; if (viaje.Detalles.Count == 0) { //el primer elemento es la base var origen = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = 0, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(origen); var llegada = new EntregaDistribucion { Linea = oLinea, Descripcion = oLinea.Descripcion, Estado = EntregaDistribucion.Estados.Pendiente, Orden = viaje.Detalles.Count, Programado = fecha, ProgramadoHasta = fecha, Viaje = viaje }; viaje.Detalles.Add(llegada); } var puntoEntrega = _puntosBuffer.SingleOrDefault(p => p.Codigo == codigoPedido); if (puntoEntrega == null) { #region var puntoDeInteres = new ReferenciaGeografica() var empresaGeoRef = viaje.Vehiculo != null && viaje.Vehiculo.Empresa == null ? null : Cliente.Empresa == null ? null : Empresa; var lineaGeoRef = viaje.Vehiculo != null && viaje.Vehiculo.Linea != null ? viaje.Vehiculo.Linea : Cliente.Linea ?? oLinea; var puntoDeInteres = new ReferenciaGeografica { Codigo = codigoPedido, Descripcion = codigoPedido, Empresa = empresaGeoRef, Linea = lineaGeoRef, EsFin = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsFin, EsInicio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsInicio, EsIntermedio = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.EsIntermedio, InhibeAlarma = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.InhibeAlarma, TipoReferenciaGeografica = Cliente.ReferenciaGeografica.TipoReferenciaGeografica, Vigencia = new Vigencia { Inicio = DateTime.UtcNow, Fin = fecha.AddHours(vigencia) }, Icono = Cliente.ReferenciaGeografica.TipoReferenciaGeografica.Icono }; #endregion #region var posicion = new Direccion() var posicion = GetNewDireccion(latitud, longitud); #endregion #region var poligono = new Poligono() var poligono = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); #endregion puntoDeInteres.AddHistoria(posicion, poligono, DateTime.UtcNow); listReferencias.Add(puntoDeInteres); #region puntoEntrega = new PuntoEntrega() puntoEntrega = new PuntoEntrega { Cliente = Cliente, Codigo = codigoPedido, Descripcion = codigoPedido, Telefono = string.Empty, Baja = false, ReferenciaGeografica = puntoDeInteres, Nomenclado = true, DireccionNomenclada = string.Empty, Importe = importe, Nombre = nombre }; #endregion listPuntos.Add(puntoEntrega); } else { if (!puntoEntrega.ReferenciaGeografica.IgnoraLogiclink && (puntoEntrega.ReferenciaGeografica.Latitude != latitud || puntoEntrega.ReferenciaGeografica.Longitude != longitud)) { puntoEntrega.ReferenciaGeografica.Direccion.Vigencia.Fin = DateTime.UtcNow; puntoEntrega.ReferenciaGeografica.Poligono.Vigencia.Fin = DateTime.UtcNow; #region var posicion = new Direccion() var posicion = GetNewDireccion(latitud, longitud); #endregion #region var poligono = new Poligono() var poligono = new Poligono { Radio = 100, Vigencia = new Vigencia { Inicio = DateTime.UtcNow } }; poligono.AddPoints(new[] { new PointF((float)longitud, (float)latitud) }); #endregion puntoEntrega.ReferenciaGeografica.AddHistoria(posicion, poligono, DateTime.UtcNow); } #region puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end var end = fecha.AddHours(vigencia); if (puntoEntrega.ReferenciaGeografica.Vigencia.Fin < end) { puntoEntrega.ReferenciaGeografica.Vigencia.Fin = end; } #endregion puntoEntrega.ReferenciaGeografica.Linea = oLinea; listReferencias.Add(puntoEntrega.ReferenciaGeografica); puntoEntrega.Nombre = nombre; puntoEntrega.Importe = importe; listPuntos.Add(puntoEntrega); } #region var entrega = new EntregaDistribucion() var entrega = new EntregaDistribucion { Cliente = Cliente, PuntoEntrega = puntoEntrega, Descripcion = nombre.Length > 128 ? nombre.Substring(0, 128) : nombre, Estado = EntregaDistribucion.Estados.Pendiente, //Orden = secuencia, Orden = viaje.Detalles.Count - 1, Programado = fecha, ProgramadoHasta = fecha.AddMinutes(Empresa.MarginMinutes), TipoServicio = tipoServicio, Viaje = viaje }; #endregion viaje.Detalles.Add(entrega); entregas++; } foreach (var viajeDistribucion in listViajes) { if (viajeDistribucion.Detalles.Count > 0) { var dirBase = viajeDistribucion.Detalles.First().ReferenciaGeografica; var coche = viajeDistribucion.Vehiculo; var velocidadPromedio = coche != null && coche.VelocidadPromedio > 0 ? coche.VelocidadPromedio : coche != null && coche.TipoCoche.VelocidadPromedio > 0 ? coche.TipoCoche.VelocidadPromedio : 20; var hora = viajeDistribucion.Inicio; foreach (var detalle in viajeDistribucion.Detalles) { var distancia = GeocoderHelper.CalcularDistacia(dirBase.Latitude, dirBase.Longitude, detalle.ReferenciaGeografica.Latitude, detalle.ReferenciaGeografica.Longitude); var horas = distancia / velocidadPromedio; var demora = detalle.TipoServicio != null ? detalle.TipoServicio.Demora : 0; detalle.Programado = hora.AddHours(horas).AddMinutes(demora); detalle.ProgramadoHasta = detalle.Programado.AddMinutes(Empresa.MarginMinutes); detalle.KmCalculado = distancia; dirBase = detalle.ReferenciaGeografica; hora = detalle.Programado; } } var maxDate = viajeDistribucion.Detalles.Max(d => d.Programado); viajeDistribucion.Fin = maxDate; var ultimo = viajeDistribucion.Detalles.Last(e => e.Linea != null); ultimo.Programado = maxDate; ultimo.ProgramadoHasta = maxDate.AddMinutes(Empresa.MarginMinutes); ultimo.Orden = viajeDistribucion.Detalles.Count - 1; } STrace.Trace(Component, "Guardando referencias geográficas: " + listReferencias.Count); te.Restart(); foreach (var referenciaGeografica in listReferencias) { DaoFactory.ReferenciaGeograficaDAO.Guardar(referenciaGeografica); } STrace.Trace(Component, string.Format("Referencias guardadas en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando puntos de entrega: " + listPuntos.Count); te.Restart(); foreach (var puntoEntrega in listPuntos) { DaoFactory.PuntoEntregaDAO.SaveOrUpdate(puntoEntrega); } STrace.Trace(Component, string.Format("Puntos guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); STrace.Trace(Component, "Guardando Viajes: " + listViajes.Count); te.Restart(); foreach (var viajeDistribucion in listViajes) { DaoFactory.ViajeDistribucionDAO.SaveOrUpdate(viajeDistribucion); } STrace.Trace(Component, string.Format("Viajes guardados en {0} segundos", te.getTimeElapsed().TotalSeconds)); }