package br.com.centralit.citcorpore.batch; import java.sql.Date; import java.sql.Timestamp; import java.util.Collection; import java.util.List; import java.util.concurrent.Semaphore; import br.com.centralit.citcorpore.bean.AcordoNivelServicoDTO; import br.com.centralit.citcorpore.bean.EscalonamentoDTO; import br.com.centralit.citcorpore.bean.OcorrenciaMudancaDTO; import br.com.centralit.citcorpore.bean.RegraEscalonamentoDTO; import br.com.centralit.citcorpore.bean.RelEscalonamentoMudancaDto; import br.com.centralit.citcorpore.bean.RequisicaoMudancaDTO; import br.com.centralit.citcorpore.bean.UsuarioDTO; import br.com.centralit.citcorpore.integracao.EscalonamentoDAO; import br.com.centralit.citcorpore.integracao.OcorrenciaMudancaDao; import br.com.centralit.citcorpore.integracao.RegraEscalonamentoDAO; import br.com.centralit.citcorpore.integracao.RelEscalonamentoMudancaDao; import br.com.centralit.citcorpore.integracao.RequisicaoMudancaDao; import br.com.centralit.citcorpore.mail.MensagemEmail; import br.com.centralit.citcorpore.negocio.AcordoNivelServicoService; import br.com.centralit.citcorpore.negocio.OcorrenciaMudancaServiceEjb; import br.com.centralit.citcorpore.negocio.RequisicaoMudancaServiceEjb; import br.com.centralit.citcorpore.util.CriptoUtils; import br.com.centralit.citcorpore.util.Enumerados.CategoriaOcorrencia; import br.com.centralit.citcorpore.util.Enumerados.OrigemOcorrencia; import br.com.centralit.citcorpore.util.Enumerados.ParametroSistema; import br.com.centralit.citcorpore.util.ParametroUtil; import br.com.citframework.dto.IDto; import br.com.citframework.excecao.LogicException; import br.com.citframework.service.ServiceLocator; import br.com.citframework.util.UtilDatas; public class MonitoraMudanca extends Thread { private final Semaphore performanceDataSemaphore = new Semaphore(1); private final RequisicaoMudancaServiceEjb mudancaServiceEjb = new RequisicaoMudancaServiceEjb(); private final EscalonamentoDAO escalonamentoDao = new EscalonamentoDAO(); private final OcorrenciaMudancaDao ocorrenciaDao = new OcorrenciaMudancaDao(); private final RegraEscalonamentoDAO regraEscalonamentoDao = new RegraEscalonamentoDAO(); private final RelEscalonamentoMudancaDao relEscalonamentoMudancaDao = new RelEscalonamentoMudancaDao(); private final RequisicaoMudancaDao mudancaDao = new RequisicaoMudancaDao(); private AcordoNivelServicoService acordoNivelServicoService; private AcordoNivelServicoService getAcordoNivelServicoService() throws Exception { if (acordoNivelServicoService == null) { acordoNivelServicoService = (AcordoNivelServicoService) ServiceLocator.getInstance().getService(AcordoNivelServicoService.class, null); } return acordoNivelServicoService; } private RequisicaoMudancaServiceEjb requisicaoMudancaService; private RequisicaoMudancaServiceEjb getRequisicaoMudancaService() { if (requisicaoMudancaService == null) { requisicaoMudancaService = new RequisicaoMudancaServiceEjb(); } return requisicaoMudancaService; } @Override public void run() { while (true) { performanceDataSemaphore.acquireUninterruptibly(); final Timestamp dataHoraAtual = UtilDatas.getDataHoraAtual(); String ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA_STR = ""; Integer ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA = 0; String ligaFuncionamentoRegrasEscalonamento = "N"; Integer ID_MODELO_EMAIL_PRAZO_VENCENDO = null; final String ID_MODELO_EMAIL_PRAZO_VENCENDO_STR = ""; Collection<RequisicaoMudancaDTO> col = null; try { ligaFuncionamentoRegrasEscalonamento = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.HABILITA_ESCALONAMENTO_MUDAN�A, "N"); ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA_STR = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA, "0"); if (!ID_MODELO_EMAIL_PRAZO_VENCENDO_STR.trim().equals("")) { ID_MODELO_EMAIL_PRAZO_VENCENDO = new Integer(ID_MODELO_EMAIL_PRAZO_VENCENDO_STR); } ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA = new Integer(ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA_STR.trim()); } catch (final Exception e) { e.printStackTrace(); } try { try { /* Lista todas as solicita��oes relacionadas a regra de escalonamento definido e demais. */ col = mudancaDao.listSolicitacoesByRegra(); } catch (final Exception e) { e.printStackTrace(); } if (col != null) { for (final RequisicaoMudancaDTO requisicaoMudancaDto : col) { OcorrenciaMudancaDTO ocorrSolDto = null; try { ocorrSolDto = ocorrenciaDao.findUltimoByIdSolicitacaoServico(requisicaoMudancaDto.getIdRequisicaoMudanca()); } catch (final Exception e) { e.printStackTrace(); } if (ligaFuncionamentoRegrasEscalonamento != null && ligaFuncionamentoRegrasEscalonamento.equalsIgnoreCase("S")) { Collection<RegraEscalonamentoDTO> colecaoRegrasEscalonamento = null; Collection<EscalonamentoDTO> colecaoEscalonamento = null; try { // regra: 1 para solicita��o/incidente, 3 para mudan�a, 2 para problema colecaoRegrasEscalonamento = regraEscalonamentoDao.findRegraByRequisicaoMudanca(requisicaoMudancaDto, 3); if (colecaoRegrasEscalonamento != null) { for (final RegraEscalonamentoDTO regraEscalonamentoDTO : colecaoRegrasEscalonamento) { this.trataSituacaoVencimentoSolicitacao(requisicaoMudancaDto, regraEscalonamentoDTO, mudancaServiceEjb, dataHoraAtual, ocorrSolDto, ID_MODELO_EMAIL_PRAZO_VENCENDO); colecaoEscalonamento = escalonamentoDao.findByRegraEscalonamento(regraEscalonamentoDTO); if (colecaoEscalonamento != null) { for (final EscalonamentoDTO escalonamentoDTO : colecaoEscalonamento) { // System.out.println("Estabelecendo regra... Solicita��o: " + solicitacaoServicoDTO.getIdRequisicaoMudanca()); if (escalonamentoDTO.getPrazoExecucao() == null || escalonamentoDTO.getPrazoExecucao().intValue() == 0) { continue; } // Verifica se j� existe referencia final boolean temEscalonamento = relEscalonamentoMudancaDao.temRelacionamentoSolicitacaoEscalonamento( requisicaoMudancaDto.getIdRequisicaoMudanca(), escalonamentoDTO.getIdEscalonamento()); if (temEscalonamento) { // System.out.println("Escalonamento " + escalonamentoDTO.getIdEscalonamento() + " j� executado."); continue; } if (regraEscalonamentoDTO.getTipoDataEscalonamento() != null && regraEscalonamentoDTO.getTipoDataEscalonamento().intValue() == 1) { /** * Verifica se o tempo que se passou � maior que o prazo de execu��o */ if (requisicaoMudancaDto.getDataHoraInicio() != null && dataHoraAtual.getTime() - requisicaoMudancaDto.getDataHoraInicio().getTime() > escalonamentoDTO.getPrazoExecucao() * 60 * 1000) { if (escalonamentoDTO.getIdGrupoExecutor() != null) { /** * Atualizando a tabela de relacionamento */ final RelEscalonamentoMudancaDto dto = new RelEscalonamentoMudancaDto(); dto.setIdRequisicaoMudanca(requisicaoMudancaDto.getIdRequisicaoMudanca()); dto.setIdEscalonamento(escalonamentoDTO.getIdEscalonamento()); relEscalonamentoMudancaDao.create(dto); /** * Realizando o escalonamento da solicita��o com base nas regras estabelecidas * Se prioridade for nula est�o se escalonamento com a mesma prioridade antiga */ mudancaServiceEjb.updateTimeAction( escalonamentoDTO.getIdGrupoExecutor(), escalonamentoDTO.getIdPrioridade() != null ? escalonamentoDTO.getIdPrioridade() : requisicaoMudancaDto .getPrioridade(), requisicaoMudancaDto.getIdRequisicaoMudanca()); /** * Enviando email de escala��o autom�tica */ this.enviaEmail(ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA, requisicaoMudancaDto.getIdRequisicaoMudanca()); final List<AcordoNivelServicoDTO> listaContratos = this.getAcordoNivelServicoService() .findIdEmailByIdSolicitacaoServico(requisicaoMudancaDto.getIdRequisicaoMudanca()); if (listaContratos != null && !listaContratos.isEmpty()) { this.enviaEmail(listaContratos.get(0).getIdEmail(), requisicaoMudancaDto.getIdRequisicaoMudanca()); } } } } else if (regraEscalonamentoDTO.getTipoDataEscalonamento() != null && regraEscalonamentoDTO.getTipoDataEscalonamento().intValue() == 2) { Date dateCons = null; final OcorrenciaMudancaDTO ocorrEscalacao = ocorrenciaDao.findUltimoByIdSolicitacaoServicoAndOcorrencia(requisicaoMudancaDto .getIdRequisicaoMudanca()); if (ocorrSolDto != null) { if (ocorrEscalacao != null) { ocorrSolDto = ocorrEscalacao; } dateCons = ocorrSolDto.getDataregistro(); final String hora = ocorrSolDto.getHoraregistro(); try { final Timestamp timeAux = UtilDatas.strToTimestamp(UtilDatas.dateToSTR(dateCons) + " " + hora + ":00"); if (dataHoraAtual.getTime() - timeAux.getTime() > escalonamentoDTO.getPrazoExecucao() * 60 * 1000) { if (escalonamentoDTO.getIdGrupoExecutor() != null) { /** * Atualizando a tabela de relacionamento */ final RelEscalonamentoMudancaDto dto = new RelEscalonamentoMudancaDto(); dto.setIdRequisicaoMudanca(requisicaoMudancaDto.getIdRequisicaoMudanca()); dto.setIdEscalonamento(escalonamentoDTO.getIdEscalonamento()); relEscalonamentoMudancaDao.create(dto); /** * Realizando o escalonamento da solicita��o com base nas regras estabelecidas * Se prioridade for nula est�o se escalonamento com a mesma prioridade antiga */ mudancaServiceEjb.updateTimeAction( escalonamentoDTO.getIdGrupoExecutor(), escalonamentoDTO.getIdPrioridade() != null ? escalonamentoDTO.getIdPrioridade() : requisicaoMudancaDto .getPrioridade(), requisicaoMudancaDto.getIdRequisicaoMudanca()); /** * Enviando email de escala��o autom�tica */ this.enviaEmail(ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA, requisicaoMudancaDto.getIdRequisicaoMudanca()); final List<AcordoNivelServicoDTO> listaContratos = this.getAcordoNivelServicoService() .findIdEmailByIdSolicitacaoServico(requisicaoMudancaDto.getIdRequisicaoMudanca()); if (listaContratos != null && !listaContratos.isEmpty()) { this.enviaEmail(listaContratos.get(0).getIdEmail(), requisicaoMudancaDto.getIdRequisicaoMudanca()); } } } System.out.println("Finalizando regra de escalonamento..."); } catch (final Exception e) { e.printStackTrace(); } } } } } } } } catch (final Exception e) { e.printStackTrace(); } } } } } finally { performanceDataSemaphore.release(); } try { Thread.sleep(60000); } catch (final InterruptedException e) {} } } private void trataSituacaoVencimentoSolicitacao(final RequisicaoMudancaDTO requisicaoMudancaDto, final RegraEscalonamentoDTO regraEscalonamentoDTO, final RequisicaoMudancaServiceEjb requisicaoMudancaServiceEjb, final Timestamp dataHoraAtual, final OcorrenciaMudancaDTO ocorrSolDto, final Integer idModeloEmail) throws Exception { // trata regra de classifica��o se est� vencendo if (requisicaoMudancaDto.getDataHoraTermino() != null && regraEscalonamentoDTO.getTempoExecucao() != null && (requisicaoMudancaDto.getPrazoHH() != 0 || requisicaoMudancaDto.getPrazoMM() != 0) && dataHoraAtual.getTime() - requisicaoMudancaDto.getDataHoraTermino().getTime() >= regraEscalonamentoDTO.getTempoExecucao() * 60 * 1000) { final double intervaloTempo = regraEscalonamentoDTO.getIntervaloNotificacao().intValue() * 60 * 1000; Date dateCons = null; if (ocorrSolDto != null) { dateCons = ocorrSolDto.getDataregistro(); final String hora = ocorrSolDto.getHoraregistro(); final Timestamp timeAux = UtilDatas.strToTimestamp(UtilDatas.dateToSTR(dateCons) + " " + hora + ":00"); if (dataHoraAtual.getTime() - timeAux.getTime() > intervaloTempo) { if (regraEscalonamentoDTO.getEnviarEmail() != null && regraEscalonamentoDTO.getEnviarEmail().equals("S")) { final UsuarioDTO usuarioDTO = new UsuarioDTO(); usuarioDTO.setLogin("Autom�tico"); OcorrenciaMudancaServiceEjb.create(requisicaoMudancaDto, null, "Vencendo", OrigemOcorrencia.OUTROS, CategoriaOcorrencia.Atualizacao, null, CategoriaOcorrencia.Atualizacao.getDescricao(), usuarioDTO, 0, null, null); if (idModeloEmail != null) { this.enviaEmail(idModeloEmail, requisicaoMudancaDto.getIdRequisicaoMudanca()); } } } } } if (requisicaoMudancaDto.getDataHoraTermino() != null && regraEscalonamentoDTO.getTempoExecucao() != null && (requisicaoMudancaDto.getPrazoHH() != 0 || requisicaoMudancaDto.getPrazoMM() != 0) && dataHoraAtual.getTime() - requisicaoMudancaDto.getDataHoraTermino().getTime() >= regraEscalonamentoDTO.getTempoExecucao() * 60 * 1000) { // trata caso o sla esteja vencendo if (requisicaoMudancaDto.getVencendo() == null || requisicaoMudancaDto.getVencendo() != null && !requisicaoMudancaDto.getVencendo().equalsIgnoreCase("S")) { RequisicaoMudancaDTO solicitacao = new RequisicaoMudancaDTO(); solicitacao.setIdRequisicaoMudanca(requisicaoMudancaDto.getIdRequisicaoMudanca()); solicitacao = (RequisicaoMudancaDTO) requisicaoMudancaServiceEjb.restore(solicitacao); solicitacao.setVencendo("S"); requisicaoMudancaServiceEjb.updateNotNull(solicitacao); solicitacao = null; } } else { if (requisicaoMudancaDto.getVencendo() == null) { RequisicaoMudancaDTO solicitacao = new RequisicaoMudancaDTO(); solicitacao.setIdRequisicaoMudanca(requisicaoMudancaDto.getIdRequisicaoMudanca()); solicitacao = (RequisicaoMudancaDTO) requisicaoMudancaServiceEjb.restore(solicitacao); solicitacao.setVencendo("N"); requisicaoMudancaServiceEjb.updateNotNull(solicitacao); solicitacao = null; } // trata caso o sla tenha sido alterado para mais if (requisicaoMudancaDto.getVencendo() != null && !requisicaoMudancaDto.getVencendo().equalsIgnoreCase("N")) { RequisicaoMudancaDTO solicitacao = new RequisicaoMudancaDTO(); solicitacao.setIdRequisicaoMudanca(requisicaoMudancaDto.getIdRequisicaoMudanca()); solicitacao = (RequisicaoMudancaDTO) requisicaoMudancaServiceEjb.restore(solicitacao); solicitacao.setVencendo("N"); requisicaoMudancaServiceEjb.updateNotNull(solicitacao); solicitacao = null; } } } public void enviaEmail(final Integer idModeloEmail, final Integer idRequisicaoMudanca) throws Exception { if (idModeloEmail == null || idModeloEmail.intValue() == 0) { return; } final String enviaEmail = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.EnviaEmailFluxo, "N"); if (!enviaEmail.equalsIgnoreCase("S")) { return; } final String remetente = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.RemetenteNotificacoesSolicitacao, null); if (remetente == null) { throw new LogicException("Remetente para notifica��es de solicita��o de servi�o n�o foi parametrizado"); } final String urlSistema = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.URL_Sistema, ""); final RequisicaoMudancaDTO requisicaoAuxDto = this.getRequisicaoMudancaService().restoreAll(idRequisicaoMudanca, null); requisicaoAuxDto.setNomeTarefa("Automatic escalation"); final String idHashValidacao = CriptoUtils.generateHash("CODED" + requisicaoAuxDto.getIdRequisicaoMudanca(), "MD5"); requisicaoAuxDto.setLinkPesquisaSatisfacao("<a href=\"" + urlSistema + "/pages/pesquisaSatisfacao/pesquisaSatisfacao.load?idSolicitacaoServico=" + requisicaoAuxDto.getIdRequisicaoMudanca() + "&hash=" + idHashValidacao + "\">Clique aqui para fazer a avalia��o do Atendimento</a>"); final MensagemEmail mensagem = new MensagemEmail(idModeloEmail, new IDto[] {requisicaoAuxDto}); try { mensagem.envia(requisicaoAuxDto.getEmailContato(), remetente, remetente); } catch (final Exception e) {} } }