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.OcorrenciaProblemaDTO; import br.com.centralit.citcorpore.bean.ProblemaDTO; import br.com.centralit.citcorpore.bean.RegraEscalonamentoDTO; import br.com.centralit.citcorpore.bean.RelEscalonamentoProblemaDto; import br.com.centralit.citcorpore.integracao.EscalonamentoDAO; import br.com.centralit.citcorpore.integracao.OcorrenciaProblemaDAO; import br.com.centralit.citcorpore.integracao.ProblemaDAO; import br.com.centralit.citcorpore.integracao.RegraEscalonamentoDAO; import br.com.centralit.citcorpore.integracao.RelEscalonamentoProblemaDao; import br.com.centralit.citcorpore.mail.MensagemEmail; import br.com.centralit.citcorpore.negocio.AcordoNivelServicoService; import br.com.centralit.citcorpore.negocio.ProblemaServiceEjb; import br.com.centralit.citcorpore.util.CriptoUtils; 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 MonitoraProblema extends Thread{ private final ProblemaDAO problemaDao = new ProblemaDAO(); private final Semaphore performanceDataSemaphore = new Semaphore(1); @Override public void run() { while (true) { performanceDataSemaphore.acquireUninterruptibly(); ProblemaServiceEjb problemaServiceEjb = new ProblemaServiceEjb(); 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; String ID_MODELO_EMAIL_PRAZO_VENCENDO_STR = ""; OcorrenciaProblemaDAO ocorrenciaDao = new OcorrenciaProblemaDAO(); Collection<ProblemaDTO> col = null; try { ligaFuncionamentoRegrasEscalonamento = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.HABILITA_ESCALONAMENTO_PROBLEMA, "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 (Exception e) { e.printStackTrace(); } try{ try { //col = solicitacaoServicoDao.getEmAndamentoParaTratamentoBatch(); /* Lista todas as solicita��oes relacionadas a regra de escalonamento definido e demais.*/ col = problemaDao.listSolicitacoesByRegra(); } catch (Exception e) { e.printStackTrace(); } if (col != null) { for (ProblemaDTO problemaDTO : col) { OcorrenciaProblemaDTO ocorrSolDto = null; try { ocorrSolDto = ocorrenciaDao.findUltimoByIdSolicitacaoServico(problemaDTO.getIdProblema()); } catch (Exception e) { e.printStackTrace(); } if(ligaFuncionamentoRegrasEscalonamento!=null && ligaFuncionamentoRegrasEscalonamento.equalsIgnoreCase("S")) { RegraEscalonamentoDAO regraEscalonamentoDao = new RegraEscalonamentoDAO(); EscalonamentoDAO escalonamentoDao = new EscalonamentoDAO(); RelEscalonamentoProblemaDao relEscalonamentoProblemaDao = new RelEscalonamentoProblemaDao(); Collection<RegraEscalonamentoDTO> colecaoRegrasEscalonamento = null; Collection<EscalonamentoDTO> colecaoEscalonamento = null; try { //regra: 1 para solicita��o/incidente, 3 para mudan�a, 2 para problema colecaoRegrasEscalonamento = regraEscalonamentoDao.findRegraByProblema(problemaDTO, 2); if(colecaoRegrasEscalonamento != null) { for (RegraEscalonamentoDTO regraEscalonamentoDTO : colecaoRegrasEscalonamento) { //trataSituacaoVencimentoSolicitacao(requisicaoMudancaDto, regraEscalonamentoDTO, mudancaServiceEjb, dataHoraAtual, ocorrSolDto, ID_MODELO_EMAIL_PRAZO_VENCENDO); colecaoEscalonamento = escalonamentoDao.findByRegraEscalonamento(regraEscalonamentoDTO); if(colecaoEscalonamento != null) { for (EscalonamentoDTO escalonamentoDTO : colecaoEscalonamento) { //System.out.println("Estabelecendo regra... Solicita��o: " + solicitacaoServicoDTO.getIdProblema()); if (escalonamentoDTO.getPrazoExecucao() == null || escalonamentoDTO.getPrazoExecucao().intValue() == 0) continue; //Verifica se j� existe referencia boolean temEscalonamento = relEscalonamentoProblemaDao.temRelacionamentoSolicitacaoEscalonamento(problemaDTO.getIdProblema(), 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((problemaDTO.getDataHoraInicio() != null) && (dataHoraAtual.getTime() - problemaDTO.getDataHoraSolicitacao().getTime()) > (escalonamentoDTO.getPrazoExecucao() * 60 * 1000)){ if (escalonamentoDTO.getIdGrupoExecutor() != null) { /** * Atualizando a tabela de relacionamento */ RelEscalonamentoProblemaDto dto = new RelEscalonamentoProblemaDto(); dto.setIdProblema(problemaDTO.getIdProblema()); dto.setIdEscalonamento(escalonamentoDTO.getIdEscalonamento()); relEscalonamentoProblemaDao.create(dto); //System.out.println("Realizando escala��o autom�tica..."); /** * Realizando o escalonamento da solicita��o com base nas regras estabelecidas * Se prioridade for nula est�o se escalonamento com a mesma prioridade antiga */ problemaServiceEjb.updateTimeAction(escalonamentoDTO.getIdGrupoExecutor(), (escalonamentoDTO.getIdPrioridade() != null ? escalonamentoDTO.getIdPrioridade() : problemaDTO.getPrioridade()), problemaDTO.getIdProblema()); /** * Enviando email de escala��o autom�tica */ enviaEmail(ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA, problemaDTO.getIdProblema()); AcordoNivelServicoService acordoNivelServicoService = (AcordoNivelServicoService) ServiceLocator.getInstance().getService(AcordoNivelServicoService.class, null); List<AcordoNivelServicoDTO> listaContratos = acordoNivelServicoService.findIdEmailByIdSolicitacaoServico(problemaDTO.getIdProblema()); if(listaContratos != null && !listaContratos.isEmpty()) enviaEmail(listaContratos.get(0).getIdEmail(), problemaDTO.getIdProblema()); } } } else if (regraEscalonamentoDTO.getTipoDataEscalonamento() != null && regraEscalonamentoDTO.getTipoDataEscalonamento().intValue() == 2) { Date dateCons = null; OcorrenciaProblemaDTO ocorrEscalacao = ocorrenciaDao.findUltimoByIdSolicitacaoServicoAndOcorrencia(problemaDTO.getIdProblema()); if (ocorrSolDto != null) { if(ocorrEscalacao != null) ocorrSolDto = ocorrEscalacao; dateCons = ocorrSolDto.getDataregistro(); String hora = ocorrSolDto.getHoraregistro(); //System.out.println("Ultima ocorr�ncia: " + hora); try { 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 */ RelEscalonamentoProblemaDto dto = new RelEscalonamentoProblemaDto(); dto.setIdProblema(problemaDTO.getIdProblema()); dto.setIdEscalonamento(escalonamentoDTO.getIdEscalonamento()); relEscalonamentoProblemaDao.create(dto); //System.out.println("Realizando escala��o autom�tica..."); /** * Realizando o escalonamento da solicita��o com base nas regras estabelecidas * Se prioridade for nula est�o se escalonamento com a mesma prioridade antiga */ problemaServiceEjb.updateTimeAction(escalonamentoDTO.getIdGrupoExecutor(), (escalonamentoDTO.getIdPrioridade() != null ? escalonamentoDTO.getIdPrioridade() : problemaDTO.getPrioridade()), problemaDTO.getIdProblema()); /** * Enviando email de escala��o autom�tica */ enviaEmail(ID_MODELO_EMAIL_ESCALACAO_AUTOMATICA, problemaDTO.getIdProblema()); AcordoNivelServicoService acordoNivelServicoService = (AcordoNivelServicoService) ServiceLocator.getInstance().getService(AcordoNivelServicoService.class, null); List<AcordoNivelServicoDTO> listaContratos = acordoNivelServicoService.findIdEmailByIdSolicitacaoServico(problemaDTO.getIdProblema()); if(listaContratos != null && !listaContratos.isEmpty()) enviaEmail(listaContratos.get(0).getIdEmail(), problemaDTO.getIdProblema()); } } System.out.println("Finalizando regra de escalonamento..."); } catch (Exception e) { e.printStackTrace(); } } } } } } } } catch(Exception e){ e.printStackTrace(); } } } } } finally { performanceDataSemaphore.release(); } try { Thread.sleep(60000); } catch (InterruptedException e) { } } } public void enviaEmail(Integer idModeloEmail, Integer idProblema) throws Exception { if (idModeloEmail == null || idModeloEmail.intValue() == 0) return; String enviaEmail = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.EnviaEmailFluxo, "N"); if (!enviaEmail.equalsIgnoreCase("S")) return; 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"); String urlSistema = ParametroUtil.getValorParametroCitSmartHashMap(ParametroSistema.URL_Sistema, ""); ProblemaDTO problemaAuxDto = new ProblemaServiceEjb().restoreAll(idProblema, null); problemaAuxDto.setNomeTarefa("Automatic escalation"); String idHashValidacao = CriptoUtils.generateHash("CODED" + problemaAuxDto.getIdProblema(), "MD5"); problemaAuxDto.setLinkPesquisaSatisfacao("<a href=\"" + urlSistema + "/pages/pesquisaSatisfacao/pesquisaSatisfacao.load?idSolicitacaoServico=" + problemaAuxDto.getIdProblema() + "&hash=" + idHashValidacao + "\">Clique aqui para fazer a avalia��o do Atendimento</a>"); MensagemEmail mensagem = new MensagemEmail(idModeloEmail, new IDto[] { problemaAuxDto }); try { mensagem.envia(problemaAuxDto.getEmailContato(), remetente, remetente); } catch (Exception e) { } } }