alberto 2013-10-18 22:59:33 +00:00
parent a5378b60be
commit 34e4177184
3 changed files with 150 additions and 107 deletions

View File

@ -26,12 +26,14 @@ import com.rjconsultores.ventaboletos.dao.sqlbuilder.SQLBuilder;
import com.rjconsultores.ventaboletos.entidad.ClaseServicio;
import com.rjconsultores.ventaboletos.entidad.Corrida;
import com.rjconsultores.ventaboletos.entidad.Corrida.Id;
import com.rjconsultores.ventaboletos.entidad.CorridaTramo;
import com.rjconsultores.ventaboletos.entidad.DiagramaAutobus;
import com.rjconsultores.ventaboletos.entidad.Estado;
import com.rjconsultores.ventaboletos.entidad.Marca;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.utilerias.ApplicationProperties;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
/**
*
@ -46,6 +48,7 @@ public class CorridaHibernateDAO extends GenericHibernateDAO<Corrida, Corrida.Id
private static final Integer ULTIMO_MINUTO_SEGUNDO = Integer.valueOf(59);
private static final Integer ULTIMO_MILLISEGUNDO = Integer.valueOf(99);
private static final Integer MAX_ARRAY = Integer.valueOf(1000);
private static final Integer HORAS_NO_DIA = Integer.valueOf(24);
@Autowired
public CorridaHibernateDAO(@Qualifier("sessionFactory") final SessionFactory factory) {
@ -465,61 +468,105 @@ public class CorridaHibernateDAO extends GenericHibernateDAO<Corrida, Corrida.Id
@Override
public void actualizaFecHusoFecVerano(final List<Corrida> corridas) {
List<ArrayList<Integer>> corridaIdList = new ArrayList<ArrayList<Integer>>();
List<ArrayList<Date>> fecorridaList = new ArrayList<ArrayList<Date>>();
ArrayList<Integer> corridaIds = new ArrayList<Integer>();
ArrayList<Date> fecorridas = new ArrayList<Date>();
Integer cont = NumberUtils.INTEGER_ONE;
for (Corrida corrida : corridas) {
if (cont < MAX_ARRAY) {
corridaIds.add(corrida.getId().getCorridaId());
fecorridas.add(corrida.getId().getFeccorrida());
cont++;
} else {
cont = NumberUtils.INTEGER_ONE;
corridaIdList.add(corridaIds);
fecorridaList.add(fecorridas);
corridaIds = new ArrayList<Integer>();
fecorridas = new ArrayList<Date>();
corridaIds.add(corrida.getId().getCorridaId());
fecorridas.add(corrida.getId().getFeccorrida());
}
}
List<Object[]> tramos = null;
corridaIdList.add(corridaIds);
fecorridaList.add(fecorridas);
if (corridaIdList.size() == fecorridaList.size()) {
for (int i = 0; i < corridaIdList.size(); i++) {
try {
Query queryCorrida = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaFecHusoFecVerano());
queryCorrida.setParameterList("corridaId", corridaIdList.get(i));
queryCorrida.setParameterList("feccorrida", fecorridaList.get(i));
queryCorrida.executeUpdate();
Query queryCorridaTramo = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaTramoFecHusoFecVerano());
queryCorridaTramo.setParameterList("corridaId", corridaIdList.get(i));
queryCorridaTramo.setParameterList("feccorrida", fecorridaList.get(i));
queryCorridaTramo.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
Integer corridatramoId = 0;
Date fechorSalidaOriginal = null;
Date fechorsalida = null;
Date fechorllegada = null;
Integer tiempoHorHusoOrigem = Integer.valueOf(0);
Integer tiempoHorVeranoOrigem = Integer.valueOf(0);
Integer tiempoHorHusoDestino = Integer.valueOf(0);
Integer tiempoHorVeranoDestino = Integer.valueOf(0);
Date husoHorVeranoLlegadaAnterior = null;
Date fechorSalidaOriginalUpdate = null;
Date fechorsalidaUpdate = null;
Date fechorllegadaUpdate = null;
for (Corrida corrida : corridas) {
tramos = buscarTramosCorrida(corrida);
husoHorVeranoLlegadaAnterior = null;
for (Object[] objeto : tramos) {
corridatramoId = Integer.valueOf(objeto[0].toString());
fechorSalidaOriginal = (Date) objeto[2];
fechorsalida = (Date) objeto[3];
fechorllegada = (Date) objeto[4];
tiempoHorHusoOrigem = Integer.valueOf(objeto[5].toString());
tiempoHorVeranoOrigem = Integer.valueOf(objeto[6].toString());
tiempoHorHusoDestino = Integer.valueOf(objeto[7].toString());
tiempoHorVeranoDestino = Integer.valueOf(objeto[8].toString());
if (husoHorVeranoLlegadaAnterior == null){
fechorSalidaOriginalUpdate = fechorSalidaOriginal;
fechorsalidaUpdate = fechorsalida;
}else{
fechorSalidaOriginalUpdate = husoHorVeranoLlegadaAnterior;
fechorsalidaUpdate = husoHorVeranoLlegadaAnterior;
}
husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada(
fechorsalida,
fechorllegada,
fechorsalidaUpdate,
tiempoHorHusoOrigem + tiempoHorVeranoOrigem,
tiempoHorHusoDestino + tiempoHorVeranoDestino);
if (husoHorVeranoLlegadaAnterior != null){
fechorllegadaUpdate = husoHorVeranoLlegadaAnterior;
}else{
fechorllegadaUpdate = fechorllegada;
}
Query queryCorridaTramo = getSession().createQuery(sqlBuilder.getSQLActualizarCorridaTramoFecHusoFecVerano());
queryCorridaTramo.setTimestamp("fechorSalidaOriginalH", fechorSalidaOriginalUpdate);
queryCorridaTramo.setTimestamp("fechorsalidaH", fechorsalidaUpdate);
queryCorridaTramo.setTimestamp("fechorllegadaH", fechorllegadaUpdate);
queryCorridaTramo.setInteger("corridatramoId", corridatramoId);
queryCorridaTramo.executeUpdate();
}
}
}
private Date calcularHusoHorVeranoLlegada(Date fechorsalida, Date fechorllegada, Date fechorsalidaH, int tiempoOrigen, int tiempoDestino) {
Calendar horLlegada = null;
// Si los tiempos son distintos, hube cambio de huso horario/horario de verano
if (tiempoOrigen != tiempoDestino) {
long elapsedHoras = DateUtil.getElapsedHoras(fechorsalida,fechorllegada);
horLlegada = Calendar.getInstance();
horLlegada.setTime(fechorsalidaH);
horLlegada.add(Calendar.HOUR, (int)elapsedHoras);
horLlegada.add(Calendar.HOUR, difHuso(tiempoOrigen,tiempoDestino));
}
return (horLlegada == null) ? null : horLlegada.getTime();
}
private int difHuso(int a,int b){
int mult=0;
if ( (a < b) && (b<=0) ){
mult = -1;
}else if ( (a<b) && (a>=0) ){
mult = -1;
}else if (a> b){
mult = -1;
}else{
mult = 1;
}
return ((Math.abs(a)-Math.abs(b)) * mult);
}
@Override
public List<Corrida> buscarPorEstado(final Estado estado, final Date dataInicial) {
StringBuilder hql = new StringBuilder();
hql.append(" select ");
@ -544,4 +591,42 @@ public class CorridaHibernateDAO extends GenericHibernateDAO<Corrida, Corrida.Id
return query.list();
}
private List<Object[]> buscarTramosCorrida(final Corrida corrida) {
StringBuilder hql = new StringBuilder();
hql.append(" select ");
hql.append(" ct.corridatramoId, ");
hql.append(" ct.numsecuencia,");
hql.append(" ct.fechorSalidaOriginal,");
hql.append(" ct.fechorsalida,");
hql.append(" ct.fechorllegada,");
hql.append(" nvl(ct.origem.ciudad.estado.tiempoHorHuso, 0) as tiempoHorHusoOrigem,");
hql.append(" nvl( case when ");
hql.append(" ct.fechorSalidaOriginal between ");
hql.append(" ct.origem.ciudad.estado.fecInicioHorVerano ");
hql.append(" and ct.origem.ciudad.estado.fecFinoHorVerano ");
hql.append(" then (ct.origem.ciudad.estado.tiempoHorVerano)");
hql.append(" else 0 end, 0) as tiempoHorVeranoOrigem,");
hql.append(" nvl(ct.destino.ciudad.estado.tiempoHorHuso, 0) as tiempoHorHusoDestino,");
hql.append(" nvl( case when ");
hql.append(" ct.fechorSalidaOriginal between ");
hql.append(" ct.destino.ciudad.estado.fecInicioHorVerano ");
hql.append(" and ct.destino.ciudad.estado.fecFinoHorVerano ");
hql.append(" then (ct.destino.ciudad.estado.tiempoHorVerano)");
hql.append(" else 0 end, 0) as tiempoHorVeranoDestino");
hql.append(" from CorridaTramo ct ");
hql.append(" where ct.corrida.activo = :isActivo ");
hql.append(" and ct.corrida.id.corridaId = :corridaId ");
hql.append(" and ct.corrida.id.feccorrida = :feccorrida ");
hql.append(" order by ");
hql.append(" ct.numsecuencia ");
Query query = getSession().createQuery(hql.toString());
query.setBoolean("isActivo", Boolean.TRUE);
query.setDate("feccorrida", corrida.getId().getFeccorrida());
query.setInteger("corridaId", corrida.getId().getCorridaId());
return query.list();
}
}

View File

@ -537,65 +537,8 @@ public class SQLBuilderOracle implements SQLBuilder {
StringBuilder sb = new StringBuilder();
sb.append(" update CorridaTramo ctq ");
sb.append(" set ctq.fechorSalidaOriginalH = ");
sb.append(" ( ");
sb.append(" select ");
sb.append(" ct.fechorSalidaOriginal ");
sb.append(" + nvl((ct.origem.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) ");
sb.append(" + nvl( case when ");
sb.append(" ct.fechorSalidaOriginal between ");
sb.append(" ct.origem.ciudad.estado.fecInicioHorVerano ");
sb.append(" and ct.origem.ciudad.estado.fecFinoHorVerano ");
sb.append(" then (ct.origem.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") ");
sb.append(" else 0 end, 0) ");
sb.append(" from CorridaTramo ct ");
sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) ");
sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) ");
sb.append(" and ctq.corridatramoId = ct.corridatramoId ");
sb.append(" ) ");
sb.append(" , ");
sb.append(" ctq.fechorsalidaH = ");
sb.append(" ( ");
sb.append(" select ");
sb.append(" ct.fechorsalida ");
sb.append(" + nvl((ct.origem.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) ");
sb.append(" + nvl( case when ");
sb.append(" ct.fechorsalida between ");
sb.append(" ct.origem.ciudad.estado.fecInicioHorVerano ");
sb.append(" and ct.origem.ciudad.estado.fecFinoHorVerano ");
sb.append(" then (ct.origem.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") ");
sb.append(" else 0 end, 0) ");
sb.append(" from CorridaTramo ct ");
sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) ");
sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) ");
sb.append(" and ctq.corridatramoId = ct.corridatramoId ");
sb.append(" ) ");
sb.append(" , ");
sb.append(" ctq.fechorllegadaH = ");
sb.append(" ( ");
sb.append(" select ");
sb.append(" ct.fechorllegada ");
sb.append(" + nvl((ct.destino.ciudad.estado.tiempoHorHuso/").append(HORAS_NO_DIA).append("), 0) ");
sb.append(" + nvl( case when ");
sb.append(" ct.fechorllegada between ");
sb.append(" ct.destino.ciudad.estado.fecInicioHorVerano ");
sb.append(" and ct.destino.ciudad.estado.fecFinoHorVerano ");
sb.append(" then (ct.destino.ciudad.estado.tiempoHorVerano/").append(HORAS_NO_DIA).append(") ");
sb.append(" else 0 end, 0) ");
sb.append(" from CorridaTramo ct ");
sb.append(" where ct.corrida.id.corridaId in ( :corridaId ) ");
sb.append(" and ct.corrida.id.feccorrida in ( :feccorrida ) ");
sb.append(" and ctq.corridatramoId = ct.corridatramoId ");
sb.append(" ) ");
sb.append(" where ctq.corrida.id.corridaId in ( :corridaId ) ");
sb.append(" and ctq.corrida.id.feccorrida in ( :feccorrida ) ");
sb.append(" set ctq.fechorSalidaOriginalH = :fechorSalidaOriginalH, ctq.fechorsalidaH = :fechorsalidaH, ctq.fechorllegadaH = :fechorllegadaH");
sb.append(" where ctq.corridatramoId = :corridatramoId ");
return sb.toString();
}

View File

@ -528,7 +528,6 @@ public class CorridaServiceImpl implements CorridaService {
Date husoHorVeranoLlegadaAnterior = null;
for (EsquemaTramo esquemaTramo : lsEsquemaTramo) {
CorridaTramo corridaTramo = new CorridaTramo();
corridaTramo.setAutobus(null);
corridaTramo.setConductor(null);
@ -585,6 +584,21 @@ public class CorridaServiceImpl implements CorridaService {
corridaTramo.setCorrida(corrida);
corridaTramo.setFechorSalidaOriginal(fecHorSalida);
if (husoHorVeranoLlegadaAnterior == null){
corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida());
}else{
corridaTramo.setFechorsalidaH(husoHorVeranoLlegadaAnterior);
}
husoHorVeranoLlegadaAnterior = calcularHusoHorVeranoLlegada(esquemaTramo, corridaTramo);
if (husoHorVeranoLlegadaAnterior != null){
corridaTramo.setFechorllegadaH(husoHorVeranoLlegadaAnterior);
}else{
corridaTramo.setFechorllegadaH(corridaTramo.getFechorllegada());
}
if (husoHorVeranoLlegadaAnterior == null){
corridaTramo.setFechorsalidaH(corridaTramo.getFechorsalida());
}else{
@ -1126,6 +1140,7 @@ public class CorridaServiceImpl implements CorridaService {
public Boolean atualizarCorridaFecHusoFecVerano(Estado estado, Date dataInicial) {
try {
List<Corrida> corridas = corridaDAO.buscarPorEstado(estado, dataInicial);
corridaDAO.actualizaFecHusoFecVerano(corridas);
return Boolean.TRUE;