package br.usp.nds.remote.persistencia; import java.io.Serializable; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.ManyToOne; import javax.persistence.NamedQueries; import javax.persistence.Transient; import br.usp.nds.remote.servico.TipoRetorno; @Entity @NamedQueries({ }) public class Leitura extends Entidade implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private int codigo; @ManyToOne private Aquisicao aquisicao; @ManyToOne private Sensor sensor; private BigDecimal valor; private BigDecimal valorConvertido; @Transient private String codigosSensores; @Transient private String codigosEmbarcacoes; @Transient private String dataInicio; @Transient private String dataFim; public Leitura() { } public Leitura(Aquisicao aquisicao, Sensor sensor, BigDecimal valor) { super(); this.aquisicao = aquisicao; this.sensor = sensor; this.valor = valor; } public Leitura converterValor() { valorConvertido = valor.multiply(sensor.getCoeficienteAngular()).add(sensor.getCoeficienteLinear()); return this; } @TipoRetorno(mediaType = "text/csv", arquivo = "remote.csv") public String gerarRelatorioCSV() { StringBuilder sb = new StringBuilder(); sb.append("Data;Hora;Frota;Embarcacao;Sensor;Valor\n"); for (Map leitura : (List)gerarRelatorio()) { sb.append(leitura.get("data")); sb.append(";"); sb.append(leitura.get("hora")); sb.append(";"); sb.append(leitura.get("frota")); sb.append(";"); sb.append(leitura.get("embarcacao")); sb.append(";"); sb.append(leitura.get("sensor")); sb.append(";"); sb.append(leitura.get("valor")); sb.append("\n"); } return sb.toString(); } public List gerarRelatorio() { List result = new LinkedList(); String sensores = codigosEmbarcacoes.replace('e', ','); String restricoes = ""; if (dataInicio != null && !dataInicio.isEmpty()) { restricoes += " AND YEAR(l.aquisicao.instante) * 10000 + MONTH(l.aquisicao.instante) * 100 + DAY(l.aquisicao.instante) >= " + dataInicio.substring(6, 10) + dataInicio.substring(3, 5) + dataInicio.substring(0, 2); } if (dataFim != null && !dataFim.isEmpty()) { restricoes += " AND YEAR(l.aquisicao.instante) * 10000 + MONTH(l.aquisicao.instante) * 100 + DAY(l.aquisicao.instante) <= " + dataFim.substring(6, 10) + dataFim.substring(3, 5) + dataFim.substring(0, 2); } for (Leitura l : (List)em.createQuery("SELECT l FROM Leitura l WHERE l.sensor.embarcacao.codigo IN (" + sensores + ") " + restricoes + " ORDER BY l.aquisicao.instante, l.sensor.embarcacao.frota.nome, l.sensor.embarcacao.nome, l.sensor.nome").getResultList()) { Map leitura = new HashMap(); leitura.put("data", new SimpleDateFormat("dd/MM/yyyy").format(l.getAquisicao().getInstante())); leitura.put("hora", new SimpleDateFormat("HH:mm:ss").format(l.getAquisicao().getInstante())); leitura.put("frota", l.getSensor().getEmbarcacao().getFrota().getNome()); leitura.put("embarcacao", l.getSensor().getEmbarcacao().getNome()); leitura.put("sensor", l.getSensor().getNome()); leitura.put("valor", l.getValorConvertido()); result.add(leitura); } return result; } public List listarUltimasLeituras() { return em.createQuery("SELECT l FROM Leitura l WHERE l.aquisicao.codigo = (SELECT MAX(l.aquisicao.codigo) FROM Leitura l WHERE l.sensor.embarcacao.codigo = " + codigo + ") ORDER BY l.sensor.nome").getResultList(); } public List listarLeituras() throws Exception { List result = new LinkedList(); for (String sensor : codigosSensores.split("[e]")) { Map s = new HashMap(); List leituras = new LinkedList(); String query = "SELECT l FROM Leitura l WHERE l.sensor.codigo = " + sensor; if (dataInicio != null && !dataInicio.isEmpty()) { query += " AND YEAR(l.aquisicao.instante) * 10000 + MONTH(l.aquisicao.instante) * 100 + DAY(l.aquisicao.instante) >= " + new SimpleDateFormat("yyyyMMdd").format(new SimpleDateFormat("dd/MM/yyyy").parse(dataInicio)); } if (dataFim != null && !dataFim.isEmpty()) { query += " AND YEAR(l.aquisicao.instante) * 10000 + MONTH(l.aquisicao.instante) * 100 + DAY(l.aquisicao.instante) <= " + new SimpleDateFormat("yyyyMMdd").format(new SimpleDateFormat("dd/MM/yyyy").parse(dataFim)); } query += " ORDER BY l.aquisicao.instante"; for (Leitura l : (List)em.createQuery(query).getResultList()) { Map map = new HashMap(); map.put("codigo", l.getCodigo()); map.put("valor", l.getValor()); map.put("timestamp", l.getAquisicao().getInstante().getTime() - 1000 * 60 * 60 * 3); leituras.add(map); } s.put("leituras", leituras); Sensor sB = em.find(Sensor.class, Integer.parseInt(sensor)); s.put("nome", sB.getNome()); result.add(s); } return result; } public String getCodigosEmbarcacoes() { return codigosEmbarcacoes; } public void setCodigosEmbarcacoes(String codigosEmbarcacoes) { this.codigosEmbarcacoes = codigosEmbarcacoes; } public int getCodigo() { return codigo; } public void setCodigo(int codigo) { this.codigo = codigo; } public Aquisicao getAquisicao() { return aquisicao; } public void setAquisicao(Aquisicao aquisicao) { this.aquisicao = aquisicao; } public Sensor getSensor() { return sensor; } public void setSensor(Sensor sensor) { this.sensor = sensor; } public BigDecimal getValor() { return valor; } public void setValor(BigDecimal valor) { this.valor = valor; } public BigDecimal getValorConvertido() { return valorConvertido; } public void setValorConvertido(BigDecimal valorConvertido) { this.valorConvertido = valorConvertido; } public String getCodigosSensores() { return codigosSensores; } public void setCodigosSensores(String codigosSensores) { this.codigosSensores = codigosSensores; } public String getDataInicio() { return dataInicio; } public void setDataInicio(String dataInicio) { this.dataInicio = dataInicio; } public String getDataFim() { return dataFim; } public void setDataFim(String dataFim) { this.dataFim = dataFim; } }