2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
5 package org.ufcspa.simdecs.mediador;
8 import javax.persistence.EntityManager;
9 import javax.persistence.NoResultException;
10 import javax.persistence.Persistence;
11 import org.ufcspa.simdecs.entities.*;
12 import org.ufcspa.simdecs.util.DbUtil;
13 import org.ufcspa.simdecs.util.NodoBean;
14 import org.ufcspa.simdecs.util.ProbabilisticBean;
15 import org.ufcspa.simdecs.util.UnBBayesUtil;
16 import unbbayes.prs.bn.ProbabilisticNode;
17 import unbbayes.prs.bn.TreeVariable;
18 import unbbayes.prs.id.DecisionNode;
24 public class NegociacaoPedagogica {
26 public static final String NAO_ABRIU_FICHA_PACIENTE = "NAO_ABRIU_FICHA_PACIENTE";
28 public static final String INVESTIGACAO_ADEQUADA = "INVESTIGACAO_ADEQUADA";
29 public static final String INVESTIGACAO_INSUFICIENTE = "INVESTIGACAO_INSUFICIENTE";
30 public static final String INVESTIGACAO_EXCESSIVA = "INVESTIGACAO_EXCESSIVA";
31 public static final String INVESTIGACAO_BOGUS = "INVESTIGACAO_BOGUS";
32 public static final String INVESTIGACAO_DISPENDIOSA = "INVESTIGACAO_DISPENDIOSA";
33 public static final String INVESTIGACAO_DEMORADA = "INVESTIGACAO_DEMORADA";
34 public static final String INVESTIGACAO_NAO_REALIZADA = "INVESTIGACAO_NAO_REALIZADA";
36 public static final String DIAGNOSTICO_ADEQUADO = "DIAGNOSTICO_ADEQUADO";
37 public static final String DIAGNOSTICO_INCORRETO_IMPLAUSIVEL= "DIAGNOSTICO_INCORRETO_IMPLAUSIVEL";
38 public static final String DIAGNOSTICO_INCORRETO_PLAUSIVEL = "DIAGNOSTICO_INCORRETO_PLAUSIVEL";
39 public static final String DIAGNOSTICO_NAO_SELECIONADO = "DIAGNOSTICO_NAO_SELECIONADO";
41 public static final String CONDUTA_ADEQUADA = "CONDUTA_ADEQUADA";
42 public static final String CONDUTA_INCORRETA_COERENTE = "CONDUTA_INCORRETA_COERENTE";
43 public static final String CONDUTA_INCORRETA_INCOERENTE = "CONDUTA_INCORRETA_INCOERENTE";
44 public static final String CONDUTA_INSUFICIENTE = "CONDUTA_INSUFICIENTE";
45 public static final String CONDUTA_EXCESSIVA = "CONDUTA_EXCESSIVA";
46 public static final String CONDUTA_DEMORADA = "CONDUTA_DEMORADA";
47 public static final String CONDUTA_DISPENDIOSA = "CONDUTA_DISPENDIOSA";
48 public static final String CONDUTA_NAO_SELECIONADA = "CONDUTA_NAO_SELECIONADA";
51 private LogExecucao logExecucao;
52 private EntityManager em;
54 private String estrategia;
55 private List<String> resultadosSimulacao;
58 private boolean anamneseInsuficiente = false;
59 private boolean anamneseExcessiva = false;
60 private boolean exameFisicoInsuficiente = false;
61 private boolean exameFisicoExcessivo = false;
62 private boolean exameComplementarInsuficiente = false;
63 private boolean exameComplementarExcessivo = false;
64 private boolean perguntouBogus = false;
66 private Paciente paciente;
67 private SessaoUsuario sessaoUsuario;
70 private void populaEstrategia() throws Exception {
71 // Carrega o endereço do diagrama de influencia do banco e abre a rede no disco
72 Rede redeDI = em.find(Rede.class, 1000L);
73 UnBBayesUtil diagramaInfluencia = new UnBBayesUtil(redeDI);
75 anamneseInsuficiente = false;
76 anamneseExcessiva = false;
77 exameFisicoInsuficiente = false;
78 exameFisicoExcessivo = false;
79 exameComplementarInsuficiente = false;
80 exameComplementarExcessivo = false;
81 perguntouBogus = false;
83 if (logExecucao.isConcluiuInvestigacao()) {
84 // Define a probabilidade do nodo Anamnese
86 if (logExecucao.getPerguntasDisponiveis() > 0) {
87 ProbabilisticNode nodoAnamnese = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Anamnese");
88 float pcPerguntasAnamnese = logExecucao.getPerguntasRealizadas() / logExecucao.getPerguntasDisponiveis() * 100;
89 //System.out.println("PERCENTUAL ANAMNESE: " + pcPerguntasAnamnese);
90 if (pcPerguntasAnamnese <= 25) {
91 diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0);
92 anamneseInsuficiente = true;
94 else if (pcPerguntasAnamnese > 25 && pcPerguntasAnamnese <= 75)
95 diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0);
97 diagramaInfluencia.setNodeState(nodoAnamnese, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1);
98 anamneseExcessiva = true;
103 // Define a probabilidade do nodo Exame Fisico
105 if (logExecucao.getExamesFisicosDisponiveis() > 0) {
106 ProbabilisticNode nodoExameFisico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameFisico");
107 float pcExameFisico = logExecucao.getExamesFisicosRealizados() / logExecucao.getExamesFisicosDisponiveis() * 100;
108 //System.out.println("PERCENTUAL EXAME FISICO: " + pcExameFisico);
110 if (pcExameFisico <= 25) {
111 diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0);
112 exameFisicoInsuficiente = true;
114 else if (pcExameFisico > 25 && pcExameFisico <= 75)
115 diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0);
117 diagramaInfluencia.setNodeState(nodoExameFisico, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1);
118 exameFisicoExcessivo = true;
123 // Define a probabilidade do nodo Exame Complementar
125 if (logExecucao.getExamesComplementaresProfessor() > 0) {
126 ProbabilisticNode nodoExameComplementar = (ProbabilisticNode) diagramaInfluencia.getNodeByName("ExameComplementar");
127 float pcExameComplementar = logExecucao.getExamesComplementaresRealizados() / logExecucao.getExamesComplementaresProfessor() * 100;
128 // System.out.println("PERCENTUAL EXAME COMPLEMENTAR: " + pcExameComplementar);
130 if (pcExameComplementar <= 25) {
131 diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 1, "Suficiente", 0, "Excessiva", 0);
132 exameComplementarInsuficiente = true;
134 else if (pcExameComplementar > 25 && pcExameComplementar <= 7)
135 diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 1, "Excessiva", 0);
137 diagramaInfluencia.setNodeState(nodoExameComplementar, "Insuficiente", 0, "Suficiente", 0, "Excessiva", 1);
138 exameFisicoExcessivo = true;
143 // Define a probabilidade do nodo abriu ficha do paciente
145 ProbabilisticNode nodoAbriuFichaPaciente = (ProbabilisticNode) diagramaInfluencia.getNodeByName("AbriuFichaPaciente");
147 if (logExecucao.isAbriuFichaPaciente())
148 diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 1, "Nao", 0);
150 diagramaInfluencia.setNodeState(nodoAbriuFichaPaciente, "Sim", 0, "Nao", 1);
153 // Define a probabilidade do nodo Bogus
155 if (logExecucao.getPerguntasDisponiveis() > 0) {
156 ProbabilisticNode nodoBogus = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Bogus");
157 float pcNodoBogus = logExecucao.getPerguntasBogusRealizadas() / logExecucao.getPerguntasDisponiveis() * 100;
158 // System.out.println("PERCENTUAL BOGUS: " + pcNodoBogus);
160 if (pcNodoBogus <= 10)
161 diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0, "Ausente", 1);
162 else if (pcNodoBogus > 10 && pcNodoBogus <= 30) {
163 diagramaInfluencia.setNodeState(nodoBogus, "Presente", 0.4f, "Ausente", 0.6f);
164 perguntouBogus = true;
167 diagramaInfluencia.setNodeState(nodoBogus, "Presente", 1, "Ausente", 0);
168 perguntouBogus = true;
175 if (logExecucao.isConcluiuDiagnostico()) {
176 // Define a probabilidade de hesitação diagnostica
178 ProbabilisticNode nodoHestiacaoDiagnostico = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoDiagnostico");
180 if (logExecucao.getDesmarcacoesDiagnostico() == 0)
181 diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0, "Ausente", 1);
182 else if (logExecucao.getDesmarcacoesDiagnostico() == 1)
183 diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 0.6f, "Ausente", 0.4f);
185 diagramaInfluencia.setNodeState(nodoHestiacaoDiagnostico, "Presente", 1, "Ausente", 0);
189 if (logExecucao.isConcluiuConduta()) {
190 // Define a probabilidade de hesitação na conduta
192 ProbabilisticNode nodoHestiacaoConduta = (ProbabilisticNode) diagramaInfluencia.getNodeByName("HesitacaoConduta");
194 if (logExecucao.getDesmarcacoesConduta() == 0)
195 diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0, "Ausente", 1);
196 else if (logExecucao.getDesmarcacoesConduta() == 1)
197 diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 0.6f, "Ausente", 0.4f);
199 diagramaInfluencia.setNodeState(nodoHestiacaoConduta, "Presente", 1, "Ausente", 0);
203 // Define o nodo confianca
205 ProbabilisticNode nodoConfianca = (ProbabilisticNode) diagramaInfluencia.getNodeByName("Confianca");
207 if (logExecucao.getConfiancaAtual().equals(Log.CONFIANCA_BAIXA))
208 diagramaInfluencia.setNodeState(nodoConfianca, "Baixa", 1, "Media", 0, "Alta", 0);
209 else if (logExecucao.getConfiancaAtual().equals(Log.CONFIANCA_MEDIA))
210 diagramaInfluencia.setNodeState(nodoConfianca, "Baixa", 0, "Media", 1, "Alta", 0);
211 else if (logExecucao.getConfiancaAtual().equals(Log.CONFIANCA_ALTA))
212 diagramaInfluencia.setNodeState(nodoConfianca, "Baixa", 0, "Media", 0, "Alta", 1);
215 // Debug das probabilidades do DI:
217 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ExameComplementar"));
218 System.out.println("NODO: EXAME COMPLEMENTAR");
219 for (ProbabilisticBean p : pd) {
220 System.out.println(p.getState() + ": " + p.getProbability());
224 // Debug das probabilidades do DI:
226 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ExameFisico"));
227 System.out.println("NODO: EXAME FISICO");
228 for (ProbabilisticBean p : pd) {
229 System.out.println(p.getState() + ": " + p.getProbability());
233 // Debug das probabilidades do DI:
235 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Anamnese"));
236 System.out.println("NODO: ANAMNESE");
237 for (ProbabilisticBean p : pd) {
238 System.out.println(p.getState() + ": " + p.getProbability());
242 // Debug das probabilidades do DI:
244 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Investigacao"));
245 System.out.println("NODO: INVESTIGACAO");
246 for (ProbabilisticBean p : pd) {
247 System.out.println(p.getState() + ": " + p.getProbability());
251 // Debug das probabilidades do DI:
253 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("AbriuFichaPaciente"));
254 System.out.println("NODO: ABRIU FICHA PACIENTE");
255 for (ProbabilisticBean p : pd) {
256 System.out.println(p.getState() + ": " + p.getProbability());
260 // Debug das probabilidades do DI:
262 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Bogus"));
263 System.out.println("NODO: Bogus");
264 for (ProbabilisticBean p : pd) {
265 System.out.println(p.getState() + ": " + p.getProbability());
269 // Debug das probabilidades do DI:
271 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("ResultadoInvestigacao"));
272 System.out.println("NODO: RESULTADO INVESTIGACAO");
273 for (ProbabilisticBean p : pd) {
274 System.out.println(p.getState() + ": " + p.getProbability());
278 // Debug das probabilidades do DI:
280 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Credibilidade"));
281 System.out.println("NODO: CREDIBILIDADE");
282 for (ProbabilisticBean p : pd) {
283 System.out.println(p.getState() + ": " + p.getProbability());
287 // Debug das probabilidades do DI:
289 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("HesitacaoDiagnostico"));
290 System.out.println("NODO: HESITACAO DIAGNOSTICO");
291 for (ProbabilisticBean p : pd) {
292 System.out.println(p.getState() + ": " + p.getProbability());
296 // Debug das probabilidades do DI:
298 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("HesitacaoConduta"));
299 System.out.println("NODO: HESITACAO CONDUTA");
300 for (ProbabilisticBean p : pd) {
301 System.out.println(p.getState() + ": " + p.getProbability());
305 // Debug das probabilidades do DI:
307 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Confianca"));
308 System.out.println("NODO: CONFIANCA");
309 for (ProbabilisticBean p : pd) {
310 System.out.println(p.getState() + ": " + p.getProbability());
314 // Debug das probabilidades do DI:
316 List<ProbabilisticBean> pd = diagramaInfluencia.getProbabilidadesDescOrder((TreeVariable) diagramaInfluencia.getNodeByName("Estrategia"));
317 System.out.println("NODO: ESTRATEGIA");
318 for (ProbabilisticBean p : pd) {
319 System.out.println(p.getState() + ": " + p.getProbability());
323 // Mostra o resultado do diagrama de influencia
324 DecisionNode nodoTatica = (DecisionNode) diagramaInfluencia.getNodeByName("Estrategia");
325 List<ProbabilisticBean> probs = diagramaInfluencia.getProbabilidadesDescOrder(nodoTatica);
327 for (ProbabilisticBean prob : probs) {
328 estrategia = prob.getState().toUpperCase();
333 private String getResultadoDiagnostico() throws Exception {
334 // Caso nao selecionou o diagnostico
335 if (logExecucao.getDiagnostico() == null)
336 return DIAGNOSTICO_NAO_SELECIONADO;
338 // Nao selecionou o primeiro diagnostico
339 if (logExecucao.getPrimeiroDiagnosticoCaso() != null && !logExecucao.getDiagnostico().equals(logExecucao.getPrimeiroDiagnosticoCaso()))
340 if (logExecucao.getSegundoDiagnosticoCaso() != null && logExecucao.getDiagnostico().equals(logExecucao.getSegundoDiagnosticoCaso()))
341 return DIAGNOSTICO_INCORRETO_PLAUSIVEL;
343 return DIAGNOSTICO_INCORRETO_IMPLAUSIVEL;
345 return DIAGNOSTICO_ADEQUADO;
348 private String getResultadoConduta() throws Exception {
350 // Caso nao selecionou a conduta
351 if (logExecucao.getCondutasIdeaisDiagnostico() == null || logExecucao.getCondutasIdeaisDiagnostico().isEmpty())
352 return CONDUTA_NAO_SELECIONADA;
354 // Caso o diagnóstico esteja adequado verifica se a conduta foi excessiva, insuficiente ou adequada!
355 if (getResultadoDiagnostico().equals(DIAGNOSTICO_ADEQUADO)) {
357 // Verifica se a conduta está certa ou errada!
358 boolean diferente=false;
359 for(Nodo conduta : logExecucao.getCondutas().values()) {
360 if (!logExecucao.getCondutasIdeaisDiagnostico().contains(conduta)) {
368 return CONDUTA_INCORRETA_INCOERENTE;
370 // Esta certa, agora verifica se é excessiva ou adequada!
371 if (logExecucao.getCondutas().size() > logExecucao.getCondutasIdeaisDiagnostico().size())
372 return CONDUTA_EXCESSIVA;
373 else if (logExecucao.getCondutas().size() < logExecucao.getCondutasIdeaisDiagnostico().size())
374 return CONDUTA_INSUFICIENTE;
376 return CONDUTA_ADEQUADA;
378 // Caso o diagnóstico esteja errado
380 // Verifica se a conduta está certa ou errada (avalia somente a primeira)
381 for(Nodo conduta : logExecucao.getCondutas().values()) {
382 if (logExecucao.getCondutasIdeaisDiagnostico().contains(conduta))
383 return CONDUTA_INCORRETA_COERENTE;
385 return CONDUTA_INCORRETA_INCOERENTE;
392 private String getResultadoCustoConduta() {
393 float custoRealizado=0;
394 float custoPrevisto=0;
396 if (logExecucao.getCondutas().isEmpty())
399 for(Nodo conduta : logExecucao.getCondutas().values())
400 custoRealizado+=conduta.getCusto();
402 for(Nodo conduta : logExecucao.getCondutasIdeaisDiagnostico())
403 custoPrevisto+=conduta.getCusto();
405 if (custoPrevisto > 0) {
406 float pcCusto = custoRealizado / custoPrevisto * 100;
409 return CONDUTA_DISPENDIOSA;
415 private String getResultadoTempoConduta() {
416 float tempoRealizado=0;
417 float tempoPrevisto=0;
419 if (logExecucao.getCondutas().isEmpty())
422 for(Nodo conduta : logExecucao.getCondutas().values())
423 tempoRealizado+=conduta.getTempo();
425 for(Nodo conduta : logExecucao.getCondutasIdeaisDiagnostico())
426 tempoPrevisto+=conduta.getTempo();
428 if (tempoPrevisto > 0) {
429 float pcTempo = tempoRealizado / tempoPrevisto * 100;
432 return CONDUTA_DEMORADA;
438 private String getResultadoCustoInvestigacao() {
439 // Verifica se a anamnese teve alto custo!
440 if (logExecucao.getExamesComplementaresCustoProfessor() > 0) {
441 float pcCusto = logExecucao.getExamesComplementaresCustoRealizado() / logExecucao.getExamesComplementaresCustoProfessor() * 100;
443 return INVESTIGACAO_DISPENDIOSA;
449 private String getResultadoTempoInvestigacao() {
450 if (logExecucao.getExamesComplementaresTempoProfessor() > 0 || logExecucao.getExamesFisicosTempoProfessor() > 0) {
451 float pcTempo = (logExecucao.getExamesComplementaresTempoRealizado() + logExecucao.getExamesFisicosTempoRealizado()) /
452 (logExecucao.getExamesComplementaresTempoProfessor() + logExecucao.getExamesFisicosTempoProfessor()) * 100;
455 return INVESTIGACAO_DEMORADA;
462 private void populaResultadoSimulacao() throws Exception {
466 resultadosSimulacao = new ArrayList<String>();
468 if (logExecucao.isConcluiuInvestigacao()) {
469 // Verifica se abriu a ficha do paciente
470 if (!logExecucao.isAbriuFichaPaciente())
471 resultadosSimulacao.add(NAO_ABRIU_FICHA_PACIENTE);
473 // Verifica se realmente realizou a investigacao
474 if (logExecucao.getNodosInvestigacao().size() == 0)
475 resultadosSimulacao.add(INVESTIGACAO_NAO_REALIZADA);
477 // Verifica se a investigação é insuficiente ou excessiva
478 int fatorInsuficiente = 0;
479 if (anamneseInsuficiente)
481 if (exameComplementarInsuficiente)
483 if (exameFisicoInsuficiente)
486 int fatorExcessivo = 0;
487 if (anamneseExcessiva)
489 if (exameComplementarExcessivo)
491 if (exameFisicoExcessivo)
494 if (fatorExcessivo != 0 || fatorInsuficiente != 0) {
495 if (fatorInsuficiente > fatorExcessivo)
496 resultadosSimulacao.add(INVESTIGACAO_INSUFICIENTE);
498 resultadosSimulacao.add(INVESTIGACAO_EXCESSIVA);
502 // Verifica se é bogus
504 resultadosSimulacao.add(INVESTIGACAO_BOGUS);
506 // Verifica se a anamnese teve alto custo!
507 String resultadoCustoInvestigacao = getResultadoCustoInvestigacao();
508 if (resultadoCustoInvestigacao != null)
509 resultadosSimulacao.add(resultadoCustoInvestigacao);
511 String resultadoTempoInvestigacao = getResultadoTempoInvestigacao();
512 if (resultadoTempoInvestigacao != null)
513 resultadosSimulacao.add(resultadoTempoInvestigacao);
516 // Verifica se o diagnóstico foi adequado
517 if (logExecucao.isConcluiuDiagnostico()) {
518 String resultadoDiagnostico = getResultadoDiagnostico();
519 resultadosSimulacao.add(resultadoDiagnostico);
523 // Verifica as condutas
524 if (logExecucao.isConcluiuConduta() && logExecucao.isConcluiuDiagnostico()) {
525 // Verifica a adequacao da conduta
526 String resultadoConduta = getResultadoConduta();
527 resultadosSimulacao.add(resultadoConduta);
531 String resultadoCondutaCusto = getResultadoCustoConduta();
532 if (resultadoCondutaCusto != null)
533 resultadosSimulacao.add(resultadoCondutaCusto);
536 String resultadoCondutaTempo = getResultadoTempoConduta();
537 if (resultadoCondutaTempo != null)
538 resultadosSimulacao.add(resultadoCondutaTempo);
541 // Após a execução da procura das falhas. Caso não haja problema da a simulação como correta
542 if (logExecucao.isConcluiuInvestigacao()) {
543 if (!resultadosSimulacao.contains(INVESTIGACAO_BOGUS) && !resultadosSimulacao.contains(INVESTIGACAO_DEMORADA) &&
544 !resultadosSimulacao.contains(INVESTIGACAO_DISPENDIOSA) && !resultadosSimulacao.contains(INVESTIGACAO_EXCESSIVA) &&
545 !resultadosSimulacao.contains(INVESTIGACAO_INSUFICIENTE) && !resultadosSimulacao.contains(INVESTIGACAO_NAO_REALIZADA)) {
547 resultadosSimulacao.add(INVESTIGACAO_ADEQUADA);
552 public NegociacaoPedagogica(long idSessao, Paciente paciente) throws Exception {
553 em = DbUtil.getInstance().getEntityManager();
554 SessaoUsuario sessaoUsuario = em.find(SessaoUsuario.class, idSessao);
555 this.sessaoUsuario = sessaoUsuario;
556 this.paciente = paciente;
558 // Busca o log de execução
559 logExecucao = new LogExecucao(sessaoUsuario, paciente, em);
562 public String getIntervencao(String etapa) throws Exception {
563 System.out.println(logExecucao);
565 populaResultadoSimulacao();
567 System.out.println("ESTRATÉGIA: " + estrategia);
568 System.out.println("RESULTADOS:");
570 for(String resultado : resultadosSimulacao) {
571 System.out.println(resultado + " - " + etapa);
573 // Registra somente resultados referentes a posicao atual do simulador
574 if (etapa.equals(Log.ETAPA_INVESTIGACAO) && !resultado.startsWith("INVESTIGACAO") && !resultado.equals(NAO_ABRIU_FICHA_PACIENTE))
577 // Registra somente resultados referentes a posicao atual do simulador
578 if (etapa.equals(Log.ETAPA_DIAGNOSTICO) && !resultado.startsWith("DIAGNOSTICO"))
581 // Registra somente resultados referentes a posicao atual do simulador
582 if (etapa.equals(Log.ETAPA_CONDUTA) && !resultado.startsWith("CONDUTA"))
588 IntervencaoPedagogica testarExistencia = (IntervencaoPedagogica) em.createQuery("From IntervencaoPedagogica where sessaoUsuario.id=:pSessao and estrategia=:pEstrategia and resultado=:pResultado")
589 .setParameter("pSessao", sessaoUsuario.getId())
590 .setParameter("pEstrategia", estrategia)
591 .setParameter("pResultado", resultado)
594 } catch(NoResultException e) { }
596 if (!em.getTransaction().isActive())
597 em.getTransaction().begin();
599 IntervencaoPedagogica intervencao = new IntervencaoPedagogica();
600 intervencao.setAplicada(false);
601 intervencao.setDataGeracao(new Date());
602 intervencao.setEstrategia(estrategia);
603 intervencao.setResultado(resultado);
604 intervencao.setSessaoUsuario(sessaoUsuario);
605 //System.out.println("pResultado: " + resultado);
606 //System.out.println("pEstrategia: " + estrategia);
607 TaticaPedagogica tatica = (TaticaPedagogica) em.createQuery("From TaticaPedagogica where resultado=:pResultado and estrategia=:pEstrategia")
608 .setParameter("pResultado", resultado)
609 .setParameter("pEstrategia", estrategia)
611 intervencao.setTatica(tatica);
613 em.persist(intervencao);
615 em.getTransaction().commit();
618 // Busca as intervencoes a serem mostradas agora!
620 StringBuilder retorno = new StringBuilder();
622 Iterator<IntervencaoPedagogica> itIntervencoes = em.createQuery("From IntervencaoPedagogica where sessaoUsuario.id=:pSessao and aplicada=false order by dataGeracao desc")
623 .setParameter("pSessao", sessaoUsuario.getId())
627 if (!itIntervencoes.hasNext())
628 return " <resposta_acao_mediador acao=\"nao\" />";
630 retorno.append(" <resposta_acao_mediador acao=\"sim\" mensagem=\"Atenção\" problema=\"");
632 while(itIntervencoes.hasNext()) {
633 IntervencaoPedagogica intervencao = itIntervencoes.next();
634 retorno.append(intervencao.getTatica().getMensagem());
635 retorno.append("\n\n");
637 if (!em.getTransaction().isActive())
638 em.getTransaction().begin();
641 intervencao.setAplicada(true);
642 em.merge(intervencao);
644 em.getTransaction().commit();
648 retorno.append("\" />");
649 return retorno.toString();
653 public String getMensagemFinal() throws Exception {
654 StringBuilder retorno = new StringBuilder();
656 retorno.append("PACIENTE: " + paciente.getNome() + "\n\n");
658 retorno.append("RESUMO:\n");
662 if (logExecucao.isConcluiuDiagnostico()) {
663 String resultadoDiagnostico = getResultadoDiagnostico();
664 if (resultadoDiagnostico.equals(DIAGNOSTICO_ADEQUADO))
665 retorno.append("-Você chegou ao diagnóstico previsto para esta simulação!\n");
666 else if (resultadoDiagnostico.equals(DIAGNOSTICO_NAO_SELECIONADO))
667 retorno.append("-Você finalizou o atendimento sem selecionar um diagnóstico!\n");
668 else if (resultadoDiagnostico.equals(DIAGNOSTICO_INCORRETO_PLAUSIVEL))
669 retorno.append("-Você não chegou ao diagnóstico previsto para esta simulação! Porém, seu diagnóstico é plausível! O diagnóstico esperado seria" + logExecucao.getPrimeiroDiagnosticoCaso().getNomeAmigavel() + ".\n");
671 if (logExecucao.getSegundoDiagnosticoCaso() != null)
672 retorno.append("-Você não chegou ao diagnóstico previsto para esta simulação! Seu diagnóstico não é plausível! O diagnóstico esperado seria " + logExecucao.getPrimeiroDiagnosticoCaso().getNomeAmigavel() + ", porém o diagnóstico " + logExecucao.getSegundoDiagnosticoCaso().getNomeAmigavel() + " também seria considerado plausúvel.\n");
674 retorno.append("-Você não chegou ao diagnóstico previsto para esta simulação! Seu diagnóstico não é plausível! O diagnóstico esperado seria " + logExecucao.getPrimeiroDiagnosticoCaso().getNomeAmigavel() + ".\n");
676 retorno.append("-Você finalizou o atendimento sem selecionar um diagnóstico!\n");
680 if (logExecucao.isConcluiuConduta() && logExecucao.isConcluiuDiagnostico()) {
681 String resultadoConduta = getResultadoConduta();
682 if (resultadoConduta.equals(CONDUTA_ADEQUADA))
683 retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação!\n");
684 else if (resultadoConduta.equals(CONDUTA_NAO_SELECIONADA))
685 retorno.append("-Você finalizou o atendimento sem selecionar uma conduta!\n");
686 else if (resultadoConduta.equals(CONDUTA_EXCESSIVA))
687 retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação, porém existem procedimentos em excesso!\n");
688 else if (resultadoConduta.equals(CONDUTA_INSUFICIENTE))
689 retorno.append("-A conduta selecionada esta adequada ao previsto pela simulação, porém a quantidade de procedimentos é insuficiente em relação ao previsto!\n");
690 else if (resultadoConduta.equals(CONDUTA_INCORRETA_COERENTE))
691 retorno.append("-A conduta selecionada esta inadequada ao previsto pela simulação, porém é coerente com o diagnóstico selecionado!\n");
692 else if (resultadoConduta.equals(CONDUTA_INCORRETA_INCOERENTE))
693 retorno.append("-A conduta selecionada esta inadequada e incoerente com o diagnóstico selecionado!\n");
695 String resultadoTempoConduta = getResultadoTempoConduta();
696 String resultadoTempoInvestigacao = getResultadoTempoInvestigacao();
697 if (resultadoTempoConduta != null || resultadoTempoInvestigacao != null) {
698 retorno.append("-Quanto a utilização do tempo ");
699 if (resultadoTempoInvestigacao != null && resultadoTempoConduta != null)
700 retorno.append("sua investigação e conduta foram demoradas");
701 else if (resultadoTempoInvestigacao != null)
702 retorno.append("sua investigação foi demorada");
703 else if (resultadoTempoConduta != null)
704 retorno.append("sua conduta foi demorada");
705 retorno.append("!\n");
708 String resultadoCustoConduta = getResultadoCustoConduta();
709 String resultadoCustoInvestigacao = getResultadoCustoInvestigacao();
710 if (resultadoCustoConduta != null || resultadoCustoInvestigacao != null) {
711 retorno.append("-Quanto a utilização de recursos ");
712 if (resultadoCustoInvestigacao != null && resultadoCustoConduta != null)
713 retorno.append("sua investigação e conduta foram dispendiosas");
714 else if (resultadoCustoInvestigacao != null)
715 retorno.append("sua investigação foi dispendiosa");
716 else if (resultadoCustoConduta != null)
717 retorno.append("sua conduta foi dispendiosa");
718 retorno.append("!\n");
721 retorno.append("-Você finalizou o atendimento sem selecionar uma conduta!\n");
725 List<LogPerguntas> logPerguntas = em.createQuery("From LogPerguntas where sessaoUsuario.id=:pIdSessao and paciente.id=:pIdPaciente")
726 .setParameter("pIdSessao", sessaoUsuario.getId())
727 .setParameter("pIdPaciente", paciente.getId())
731 // Mostra os sintomas selecionados:
732 retorno.append("\n\nAS PERGUNTAS SELECIONADAS NO DECORRER DA SUA SIMULAÇÃO FORAM:\n");
733 List<Nodo> nodosInvestigacao = logExecucao.getNodosInvestigacao();
734 for(Nodo nodoInvestigacao : nodosInvestigacao) {
735 if (nodoInvestigacao.getTipo().equals(Nodo.SINAL_SINTOMA)) {
736 for(LogPerguntas logPergunta : logPerguntas) {
737 if (logPergunta.getNodo().getId() == nodoInvestigacao.getId()) {
738 retorno.append(logPergunta.getPergunta() + "\n");
746 // Mostra os sintomas esperados:
747 StringBuilder retornoAux = new StringBuilder();
748 for(LogPerguntas logPergunta : logPerguntas) {
749 if (logPergunta.getTipoNodo().equals(Nodo.SINAL_SINTOMA) && logPergunta.isAtivo() && !logExecucao.getNodosInvestigacao().contains(logPergunta.getNodo()))
750 retornoAux.append(logPergunta.getPergunta() + "\n");
753 if (retornoAux.length() > 0) {
754 retorno.append("\n\nALÉM DISTO, AS SEGUINTES PERGUNTAS PODERIAM FORTALECER O DIAGNÓSTICO:\n");
755 retorno.append(retornoAux);
758 return retorno.toString();