ad3ad9f6 |
1 | /* |
2 | * To change this template, choose Tools | Templates |
3 | * and open the template in the editor. |
4 | */ |
5 | package org.ufcspa.simdecs.comunicacao; |
6 | |
ad3ad9f6 |
7 | import java.io.PrintWriter; |
a837b415 |
8 | import java.util.ArrayList; |
ad3ad9f6 |
9 | import java.util.Date; |
10 | import java.util.Iterator; |
11 | import java.util.List; |
12 | import javax.persistence.EntityManager; |
ad3ad9f6 |
13 | import javax.servlet.http.HttpServletRequest; |
14 | import javax.servlet.http.HttpServletResponse; |
ad3ad9f6 |
15 | import org.ufcspa.simdecs.entities.*; |
16 | import org.ufcspa.simdecs.util.DbUtil; |
25aea581 |
17 | import org.ufcspa.simdecs.util.UnBBayesUtil; |
c1897a7f |
18 | import unbbayes.prs.bn.ProbabilisticNode; |
25aea581 |
19 | import unbbayes.prs.bn.TreeVariable; |
ad3ad9f6 |
20 | |
21 | /** |
22 | * |
23 | * @author maroni |
24 | */ |
cff9bc95 |
25 | public class MetodoIniciaCaso extends BaseComunicacao { |
ad3ad9f6 |
26 | |
c68b2731 |
27 | private String getPerguntaNodo(Long idNodo, EntityManager em) { |
ad3ad9f6 |
28 | List <PerguntaNodo> perguntas = em.createQuery("From PerguntaNodo where nodo.id=:pIdNodo") |
29 | .setParameter("pIdNodo", idNodo) |
30 | .getResultList(); |
31 | |
32 | int random = (int) (1+Math.random()*perguntas.size()); |
33 | int i=1; |
34 | |
35 | for(PerguntaNodo pergunta : perguntas) { |
36 | if (i++ == random) |
37 | return pergunta.getTexto(); |
38 | } |
39 | |
40 | return ""; |
41 | } |
c1897a7f |
42 | |
ad3ad9f6 |
43 | |
25aea581 |
44 | private String getRespostaNodo(Nodo nodo, Paciente paciente) throws Exception { |
024c8c40 |
45 | EntityManager em = DbUtil.getInstance().getEntityManager(); |
c1897a7f |
46 | |
25aea581 |
47 | |
48 | UnBBayesUtil unBUtil = new UnBBayesUtil(paciente.getRede()); |
39c9eade |
49 | unBUtil.abreRede(paciente.getRede()); |
c1897a7f |
50 | |
51 | Iterator<NodoPaciente> it = em.createQuery("From NodoPaciente Where paciente.id=:pIdPaciente") |
39c9eade |
52 | .setParameter("pIdPaciente", paciente.getId()) |
c1897a7f |
53 | .getResultList() |
54 | .iterator(); |
55 | |
5123af69 |
56 | float pcProbabilidade=0; |
c1897a7f |
57 | while(it.hasNext()) { |
58 | NodoPaciente nodoPac = it.next(); |
59 | |
5123af69 |
60 | if (nodoPac.getNodo().getBogus()) { |
61 | if (nodoPac.getNodo().getId() == nodo.getId()) |
62 | pcProbabilidade = 100; |
63 | |
64 | continue; |
65 | } |
25aea581 |
66 | ProbabilisticNode pn = (ProbabilisticNode) unBUtil.getNodeByName(nodoPac.getNodo().getNome()); |
67 | unBUtil.setNodeState(pn, "Yes", 1, "Not", 0); |
c1897a7f |
68 | } |
69 | |
5123af69 |
70 | |
71 | if (nodo.getBogus()) { |
72 | if (pcProbabilidade == 0) |
73 | pcProbabilidade = (int) (1+Math.random()*50); |
74 | } |
75 | else { |
25aea581 |
76 | pcProbabilidade = unBUtil.getProbabilidadeByState((TreeVariable) unBUtil.getNodeByName(nodo.getNome()), "Yes") * 100; |
db744358 |
77 | } |
78 | |
79 | // Ajusta os percentuais de probabilidade caso ultrapasse em decimos os extremos |
80 | if (pcProbabilidade < 0) |
81 | pcProbabilidade = 0; |
82 | |
83 | if (pcProbabilidade > 100) |
84 | pcProbabilidade = 100; |
c1897a7f |
85 | |
be36ba96 |
86 | List <RespostaNodo> respostas = em.createQuery("From RespostaNodo where nodo.id=:pIdNodo") |
39c9eade |
87 | .setParameter("pIdNodo", nodo.getId()) |
024c8c40 |
88 | .getResultList(); |
db744358 |
89 | |
be36ba96 |
90 | int random = (int) (1+Math.random()*respostas.size()); |
024c8c40 |
91 | int i=1; |
92 | |
a837b415 |
93 | |
be36ba96 |
94 | for(RespostaNodo resposta : respostas) { |
c1897a7f |
95 | if (i++ == random) { |
924227dc |
96 | List<IntervaloTabelaResposta> listaInt = em.createQuery("From IntervaloTabelaResposta Where tabelaResposta.id=:pIdTabela and :pProbabilidade between pesoMinimo and pesoMaximo") |
c1897a7f |
97 | .setParameter("pIdTabela", resposta.getTabelaResposta().getId()) |
5123af69 |
98 | .setParameter("pProbabilidade", pcProbabilidade) |
c1897a7f |
99 | .getResultList(); |
100 | |
101 | int randomInt = (int) (1+Math.random()*listaInt.size()); |
102 | int x=1; |
3c6b9f2e |
103 | for(IntervaloTabelaResposta intervalo : listaInt) { |
7dddea5a |
104 | if (x++ == random) { |
105 | String returnResposta = resposta.getTexto().replaceAll("&&tabela", intervalo.getTexto()); |
106 | |
107 | if (returnResposta.substring(0,1).equals(returnResposta.substring(0,1).toLowerCase())) |
108 | return returnResposta.substring(0,1).toUpperCase() + returnResposta.substring(1); |
ff92a9b4 |
109 | else |
110 | return returnResposta; |
7dddea5a |
111 | |
112 | } |
c1897a7f |
113 | } |
114 | } |
024c8c40 |
115 | } |
7470aeb9 |
116 | |
024c8c40 |
117 | return ""; |
118 | } |
119 | |
ad3ad9f6 |
120 | private String getDependencia(Long idNodo) { |
121 | return ""; |
122 | } |
123 | |
56f36e0a |
124 | |
125 | private void registraPerguntaLog(EntityManager em, SessaoUsuario sessaoUsuario, Paciente paciente, Nodo nodo, boolean ativo, String tipoNodo, String pergunta, String nomeAmigavel, String resposta) { |
126 | if (!em.getTransaction().isActive()) |
127 | em.getTransaction().begin(); |
128 | |
129 | LogPerguntas logPerguntas = new LogPerguntas(); |
130 | logPerguntas.setNodo(nodo); |
131 | logPerguntas.setAtivo(ativo); |
132 | logPerguntas.setPaciente(paciente); |
133 | logPerguntas.setPergunta(pergunta); |
134 | logPerguntas.setSessaoUsuario(sessaoUsuario); |
135 | logPerguntas.setTipoNodo(tipoNodo); |
136 | logPerguntas.setNomeAmigavel(nomeAmigavel); |
137 | logPerguntas.setResposta(resposta); |
138 | |
139 | em.persist(logPerguntas); |
140 | em.getTransaction().commit(); |
141 | |
142 | } |
143 | |
144 | |
cff9bc95 |
145 | @Override |
146 | protected void executaServico(EntityManager em, HttpServletRequest request, HttpServletResponse response, PrintWriter out) throws Exception |
147 | { |
ad3ad9f6 |
148 | response.setContentType("text/html;charset=UTF-8"); |
cff9bc95 |
149 | Caso caso = em.find(Caso.class, Long.parseLong(request.getParameter("idcaso"))); |
ad3ad9f6 |
150 | |
39c9eade |
151 | |
cff9bc95 |
152 | if (!em.getTransaction().isActive()) { |
153 | em.getTransaction().begin(); |
154 | } |
ad3ad9f6 |
155 | |
cff9bc95 |
156 | // Cria sessao |
157 | SessaoUsuario sessaoUsuario = new SessaoUsuario(); |
158 | sessaoUsuario.setData(new Date()); |
159 | sessaoUsuario.setCaso(caso); |
ec18a5ac |
160 | sessaoUsuario.setUsuario((Usuario)request.getSession(true).getAttribute("usuario")); |
cff9bc95 |
161 | em.persist(sessaoUsuario); |
26b5eb8a |
162 | //em.flush(); |
ad3ad9f6 |
163 | |
cff9bc95 |
164 | // Logo inicio do caso. |
165 | Log log = new Log(); |
166 | log.setTipo(em.find(TipoEventoLog.class, TipoEventoLog.INICIO_CASO)); |
167 | log.setCaso(caso); |
168 | log.setData(new Date()); |
169 | log.setSessaoUsuario(sessaoUsuario); |
170 | |
171 | |
172 | em.persist(log); |
173 | |
174 | |
175 | em.getTransaction().commit(); |
176 | |
177 | |
e5335b9d |
178 | out.println("<xml>"); |
e1005ea9 |
179 | out.println(" <caso uid=\"caso-" + clear(caso.getId()) + "\" sessao=\"" + clear(sessaoUsuario.getId()) + "\" titulo=\"" + clear(caso.getNome()) + "\" modelo=\"" + clear(caso.getModelo()) + "\" descricaoAmbiente=\"" + clear(caso.getTextoInicial()) + "\">"); |
cff9bc95 |
180 | |
181 | Iterator<Paciente> itPac = em.createQuery("From Paciente where caso.id=:pIdCaso").setParameter("pIdCaso", caso.getId()).getResultList().iterator(); |
182 | while (itPac.hasNext()) { |
183 | Paciente paciente = itPac.next(); |
e1005ea9 |
184 | out.println(" <ator uid=\"" + clear(paciente.getId()) + "\" tipo=\"paciente\" nome=\"" + clear(paciente.getNome()) + "\" modelo=\"" + clear(paciente.getModelo()) + "\" idade=\"" + clear(paciente.getIdade()) + "\" peso=\"" + clear(paciente.getPeso()) + "\" altura=\"" + clear(paciente.getAltura()) + "\" >"); |
cff9bc95 |
185 | |
186 | out.println(" <etapa uid=\"etapa-1\" nome=\"Investigação\" sequencia=\"1\" tipo=\"investigacao\">"); |
187 | |
a837b415 |
188 | List<String> listaSintomas = new ArrayList<String>(); |
189 | |
cff9bc95 |
190 | List<NodoPaciente> nodos = em.createQuery("From NodoPaciente Where paciente.id=:pIDPaciente").setParameter("pIDPaciente", paciente.getId()).getResultList(); |
191 | for (NodoPaciente nodo : nodos) { |
192 | if (!nodo.getNodo().getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) { |
193 | continue; |
ad3ad9f6 |
194 | } |
cff9bc95 |
195 | |
56f36e0a |
196 | { |
c68b2731 |
197 | String pergunta = getPerguntaNodo(nodo.getNodo().getId(), em); |
56f36e0a |
198 | String resposta = getRespostaNodo(nodo.getNodo(), paciente); |
199 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), true, Nodo.SINAL_SINTOMA, pergunta, nodo.getNodo().getNomeAmigavel(), resposta); |
e1005ea9 |
200 | listaSintomas.add(" <sintoma uid=\"sintoma-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + clear(nodo.getNodo().getNome()) + "\" nomePopular=\"" + clear(pergunta) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" falaPaciente=\"" + clear(resposta) + "\" />"); |
56f36e0a |
201 | } |
cff9bc95 |
202 | } |
203 | |
204 | // Sinais e sintomas inativos |
205 | List<Nodo> nodosNaoSelecionados = em.createQuery("From Nodo Where rede.id=:pIDRede and id not in (Select nodo.id from NodoPaciente Where paciente.id=:pIDPaciente)").setParameter("pIDRede", paciente.getRede().getId()).setParameter("pIDPaciente", paciente.getId()).getResultList(); |
206 | for (Nodo nodo : nodosNaoSelecionados) { |
207 | if (!nodo.getTipo().equals(Nodo.SINAL_SINTOMA) && !nodo.getTipo().equals(Nodo.HISTORICO)) { |
208 | continue; |
ad3ad9f6 |
209 | } |
cff9bc95 |
210 | |
56f36e0a |
211 | { |
c68b2731 |
212 | String pergunta = getPerguntaNodo(nodo.getId(), em); |
56f36e0a |
213 | String resposta = getRespostaNodo(nodo, paciente); |
214 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.SINAL_SINTOMA, pergunta, nodo.getNomeAmigavel(), resposta); |
e1005ea9 |
215 | listaSintomas.add(" <sintoma uid=\"sintoma-nd-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nomeCientifico=\"" + clear(nodo.getNome()) + "\" nomePopular=\"" + clear(pergunta) + "\" imagem=\"\" som=\"\" video=\"\" dependencia=\"" + getDependencia(nodo.getId()) + "\" falaPaciente=\"" + clear(resposta) + "\" />"); |
56f36e0a |
216 | } |
cff9bc95 |
217 | } |
a837b415 |
218 | |
219 | // Randomiza sinais e sintomas |
220 | Object[] listaRandom = listaSintomas.toArray(); |
221 | for(int i=0; i < listaRandom.length; i++) { |
222 | int random = (int) (Math.random()*listaRandom.length); |
223 | Object temp = listaRandom[i]; |
224 | listaRandom[i] = listaRandom[random]; |
225 | listaRandom[random] = temp; |
226 | } |
227 | |
a837b415 |
228 | // Sinais e sintomas |
229 | out.println(" <perguntar_sintoma uid=\"perguntar-sintoma-" + paciente.getId() + "\" descricao=\"Perguntar Sinais/Sintomas\">"); |
230 | for(int i=0; i < listaRandom.length; i++) { |
231 | out.println(listaRandom[i]); |
232 | } |
cff9bc95 |
233 | out.println(" </perguntar_sintoma>"); |
234 | |
235 | // Exame Físico |
236 | out.println(" <realiza_exame_fisico uid=\"realiza-exame-fisico-" + paciente.getId() + "\" descricao=\"Realizar Exame Físico\">"); |
237 | for (NodoPaciente nodo : nodos) { |
238 | if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_FISICO)) { |
239 | continue; |
ad3ad9f6 |
240 | } |
cff9bc95 |
241 | |
56f36e0a |
242 | { |
243 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_FISICO, null, nodo.getNodo().getNomeAmigavel(), null); |
e1005ea9 |
244 | out.println(" <exame_fisico uid=\"exame-fisico-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" descricao=\"" + clear(nodo.getNodo().getNomeAmigavel()) + "\" resultado=\"\" imagem=\"\" som=\"\" video=\"\" />"); |
56f36e0a |
245 | } |
cff9bc95 |
246 | } |
247 | out.println(" </realiza_exame_fisico>"); |
248 | |
249 | // Exame Complementar |
250 | out.println(" <solicitar_exames_complementar uid=\"solicitar-exame-complementar-" + paciente.getId() + "\" descricao=\"Solicitar Exame Complementar\">\""); |
251 | for (NodoPaciente nodo : nodos) { |
252 | if (!nodo.getNodo().getTipo().equals(Nodo.EXAME_COMPLEMENTAR)) { |
253 | continue; |
ad3ad9f6 |
254 | } |
cff9bc95 |
255 | |
56f36e0a |
256 | { |
257 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo.getNodo(), false, Nodo.EXAME_COMPLEMENTAR, null, nodo.getNodo().getNomeAmigavel(), null); |
e1005ea9 |
258 | out.println(" <exame_complementar uid=\"exame-complementar-np-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" dependencia=\"" + getDependencia(nodo.getNodo().getId()) + "\" descricao=\"" + clear(nodo.getNodo().getNomeAmigavel()) + "\" resultado=\"\" imagem=\"\" som=\"\" video=\"\" />"); |
56f36e0a |
259 | } |
cff9bc95 |
260 | } |
261 | out.println(" </solicitar_exames_complementar>"); |
262 | /* |
263 | * // historico for(NodoPaciente nodo : nodos) { if |
264 | * (!nodo.getNodo().getTipo().equals(Nodo.HISTORICO)) continue; |
265 | * |
266 | * out.println(" <historico_medico uid=\"historico-medico-" + |
267 | * nodo.getId() + "\" dependencia=\"" + |
268 | * getDependencia(nodo.getNodo().getId()) + "\" |
269 | * descricao=\"Histórico Médico\" historico=\"" + |
270 | * nodo.getNodo().getNomeAmigavel() + "\" imagem=\"\" som=\"\" |
271 | * video=\"\" />"); } |
272 | */ |
e1005ea9 |
273 | out.println(" <historico_medico uid=\"historico-medico-1" + ":paciente-" + paciente.getId() + "\" dependencia=\"\" descricao=\"Histórico Médico\" historico=\"" + clear(paciente.getCaso().getTextoInicial()) + "\n\n" + clear(paciente.getHistorico()) + "\" imagem=\"\" som=\"\" video=\"\" />"); |
cff9bc95 |
274 | |
275 | |
276 | out.println(" </etapa>"); |
277 | |
278 | out.println(" <etapa uid=\"etapa-2\" nome=\"Diagnóstico\" sequencia=\"2\" tipo=\"diagnostico\">"); |
279 | Iterator<Nodo> itDiagnosticos = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.DIAGNOSTICO).getResultList().iterator(); |
280 | while (itDiagnosticos.hasNext()) { |
281 | Nodo nodo = itDiagnosticos.next(); |
56f36e0a |
282 | { |
c68b2731 |
283 | String resposta = getPerguntaNodo(nodo.getId(), em); |
56f36e0a |
284 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.DIAGNOSTICO, null, nodo.getNomeAmigavel(), resposta); |
e1005ea9 |
285 | out.println(" <diagnostico uid=\"diagnostico-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />"); |
56f36e0a |
286 | } |
cff9bc95 |
287 | } |
288 | out.println(" </etapa>"); |
289 | |
290 | out.println(" <etapa uid=\"etapa-3\" nome=\"Conduta\" sequencia=\"3\" tipo=\"conduta\">"); |
291 | Iterator<Nodo> itConduta = em.createQuery("From Nodo where tipo=:pTipo").setParameter("pTipo", Nodo.CONDUTA).getResultList().iterator(); |
292 | while (itConduta.hasNext()) { |
293 | Nodo nodo = itConduta.next(); |
56f36e0a |
294 | { |
c68b2731 |
295 | String resposta = getPerguntaNodo(nodo.getId(), em); |
56f36e0a |
296 | registraPerguntaLog(em, sessaoUsuario, paciente, nodo, false, Nodo.CONDUTA, null, nodo.getNomeAmigavel(), resposta); |
e1005ea9 |
297 | out.println(" <conduta uid=\"conduta-" + nodo.getId() + ":paciente-" + paciente.getId() + "\" nome=\"" + clear(nodo.getNomeAmigavel()) + "\" falaMedico=\"" + clear(resposta) + "\" />"); |
56f36e0a |
298 | } |
cff9bc95 |
299 | } |
300 | out.println(" </etapa>"); |
301 | out.println(" </ator>"); |
ad3ad9f6 |
302 | } |
ad3ad9f6 |
303 | |
ad3ad9f6 |
304 | |
28042ed9 |
305 | out.println(" </caso>"); |
e5335b9d |
306 | out.println(" <execucao sucesso=\"sim\" />" ); |
307 | out.println("</xml>"); |
ad3ad9f6 |
308 | } |
309 | |
ad3ad9f6 |
310 | } |