Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 70 additions & 0 deletions AtendimentoService.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
from datetime import datetime
from flask import session

class AtendimentoService:

def __init__(self, fila, historico):
self.fila = fila
self.historico = historico

# CONTROLE DE SESSÃO

def get_atual(self):
return session.get('paciente_atual')

def set_atual(self, paciente):
if paciente:
session['paciente_atual'] = paciente
else:
session.pop('paciente_atual', None)

def get_anterior(self):
return session.get('paciente_anterior')

def set_anterior(self, paciente):
if paciente:
session['paciente_anterior'] = paciente
else:
session.pop('paciente_anterior', None)



def chamar_proximo(self):

atual = self.get_atual()
proximo = self.fila.dequeue()

if not proximo:
raise ValueError("Fila vazia")

atendimento = {
**proximo,
"hora_atendimento": datetime.now().strftime("%H:%M:%S"),
"data_atendimento": datetime.now().strftime("%d/%m/%Y")
}

self.historico.push(atendimento)

self.set_anterior(atual)
self.set_atual(proximo)


def voltar_anterior(self):

atual = self.get_atual()
anterior = self.get_anterior()

if not atual and not anterior:
raise ValueError("Não há paciente anterior")


if atual:
self.fila.add_first(atual)
self.historico.pop()

self.set_atual(anterior)

if self.historico.size < 2:
self.set_anterior(None)
else:
self.set_anterior(self.historico.peek().prev.data)
34 changes: 34 additions & 0 deletions TriagemService.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from datetime import datetime

class TriagemService:

PRIORIDADES_VALIDAS = ["normal", "urgente", "emergência"]

def processar_dados(self, dados):

try:
idade = int(dados.get('idade'))
except:
raise ValueError("Idade inválida")

prioridade = dados.get('prioridade', 'normal')

if prioridade not in self.PRIORIDADES_VALIDAS:
prioridade = "normal"

paciente = {
'nome': dados.get('nome'),
'cpf': dados.get('cpf'),
'idade': idade,
'contato': dados.get('contato'),
'prioridade': prioridade,
'sintomas': dados.get('sintomas', ''),
'hora_cadastro': datetime.now().strftime('%H:%M:%S'),
'data_cadastro': datetime.now().strftime('%d/%m/%Y')
}


if not all([paciente['nome'], paciente['cpf'], paciente['contato']]):
raise ValueError("Preencha todos os campos obrigatórios")

return paciente
Binary file modified __pycache__/estrutura_dados.cpython-313.pyc
Binary file not shown.
235 changes: 99 additions & 136 deletions app.py
Original file line number Diff line number Diff line change
@@ -1,191 +1,154 @@
from flask import Flask, render_template, request, redirect, url_for, jsonify, session
from datetime import datetime
from estrutura_dados import PriorityQueue, Stack

# Estruturas de dados
from estrutura_dados.priority_queue import PriorityQueue
from estrutura_dados.stack import Stack

# Serviços
from services.triagem_service import TriagemService
from services.atendimento_service import AtendimentoService

app = Flask(__name__)
app.secret_key = 'sua_chave_secreta_aqui_mude_em_producao'
app.secret_key = "sua_chave_secreta_aqui"

# Instâncias globais (em produção, usar banco de dados)
# Instâncias globais
fila_atendimento = PriorityQueue()
historico_atendimentos = Stack()

def get_paciente_atual():
"""Retorna paciente atual da sessão"""
return session.get('paciente_atual')

def set_paciente_atual(paciente):
"""Define paciente atual na sessão"""
if paciente:
session['paciente_atual'] = paciente
else:
session.pop('paciente_atual', None)

def get_paciente_anterior():
"""Retorna paciente anterior da sessão"""
return session.get('paciente_anterior')
# Serviços
triagem_service = TriagemService()
atendimento_service = AtendimentoService(fila_atendimento, historico_atendimentos)

def set_paciente_anterior(paciente):
"""Define paciente anterior na sessão"""
if paciente:
session['paciente_anterior'] = paciente
else:
session.pop('paciente_anterior', None)

# PÁGINA PRINCIPAL


@app.route('/')
@app.route("/")
def index():
"""Tela principal - fila de atendimento"""
paciente_atual = get_paciente_atual()
paciente_anterior = get_paciente_anterior()
paciente_atual = atendimento_service.get_atual()
paciente_anterior = atendimento_service.get_anterior()
fila = fila_atendimento.to_list()

return render_template('index.html',
paciente_atual=paciente_atual,
paciente_anterior=paciente_anterior,
fila=fila,
total_fila=len(fila),
total_historico=historico_atendimentos.size)

return render_template(
"index.html",
paciente_atual=paciente_atual,
paciente_anterior=paciente_anterior,
fila=fila,
total_fila=len(fila),
total_historico=historico_atendimentos.size
)


# ZERAR SISTEMA (TESTES)

@app.route('/zerar')
@app.route("/zerar")
def zerar():
"""Zera fila e histórico (para testes)"""
global fila_atendimento, historico_atendimentos

fila_atendimento = PriorityQueue()
historico_atendimentos = Stack()
set_paciente_atual(None)
set_paciente_anterior(None)
return redirect(url_for('index'))

@app.route('/historico')
atendimento_service.set_atual(None)
atendimento_service.set_anterior(None)

return redirect(url_for("index"))


# HISTÓRICO

@app.route("/historico")
def historico():
"""Tela de histórico de atendimentos"""
historico_list = historico_atendimentos.get_history()

return render_template('historico.html',
historico=historico_list,
total_fila=fila_atendimento.size,
total_historico=len(historico_list))

return render_template(
"historico.html",
historico=historico_list,
total_fila=fila_atendimento.size,
total_historico=len(historico_list)
)


@app.route('/cadastro')
# CADASTRO DE PACIENTE

@app.route("/cadastro")
def cadastro():
"""Tela de cadastro de paciente"""
return render_template('cadastro.html',
total_fila=fila_atendimento.size,
total_historico=historico_atendimentos.size)
return render_template(
"cadastro.html",
total_fila=fila_atendimento.size,
total_historico=historico_atendimentos.size
)



@app.route('/adicionar_paciente', methods=['POST'])
# ADICIONAR PACIENTE

@app.route("/adicionar_paciente", methods=["POST"])
def adicionar_paciente():
"""Adiciona paciente à fila"""
try:
paciente = {
'nome': request.form.get('nome'),
'cpf': request.form.get('cpf'),
'idade': int(request.form.get('idade')),
'contato': request.form.get('contato'),
'prioridade': request.form.get('prioridade', 'normal'),
'sintomas': request.form.get('sintomas', ''),
'hora_cadastro': datetime.now().strftime('%H:%M:%S'),
'data_cadastro': datetime.now().strftime('%d/%m/%Y')
dados = {
"nome": request.form.get("nome"),
"cpf": request.form.get("cpf"),
"idade": request.form.get("idade"),
"contato": request.form.get("contato"),
"prioridade": request.form.get("prioridade", "normal"),
"sintomas": request.form.get("sintomas", "")
}
print(paciente)

# Validações básicas
if not all([paciente['nome'], paciente['cpf'], paciente['idade'], paciente['contato']]):
return jsonify({'success': False, 'message': 'Preencha todos os campos obrigatórios'}), 400


paciente = triagem_service.processar_dados(dados)

fila_atendimento.enqueue(paciente)
print(fila_atendimento.to_list())
return redirect(url_for('index'))

return redirect(url_for("index"))

except Exception as e:
return jsonify({'success': False, 'message': str(e)}), 400
return jsonify({"success": False, "message": str(e)}), 400


@app.route('/chamar_proximo', methods=['POST'])
# CHAMAR PRÓXIMO

@app.route("/chamar_proximo", methods=["POST"])
def chamar_proximo():
"""Chama próximo paciente da fila"""
try:
# Salvar paciente atual no histórico se existir
paciente_atual = get_paciente_atual()

# Pegar próximo da fila
proximo = fila_atendimento.dequeue()

if proximo:
print('Chamando próximo paciente:', proximo)
atendimento = {
**proximo,
'hora_atendimento': datetime.now().strftime('%H:%M:%S'),
'data_atendimento': datetime.now().strftime('%d/%m/%Y')
}
historico_atendimentos.push(atendimento)
print('colocou no histórico:', atendimento)
set_paciente_anterior(paciente_atual)
print('anterior setado como:', paciente_atual)
set_paciente_atual(proximo)
print('atual setado como:', proximo)
return jsonify({'success': True})
else:
return jsonify({'success': False, 'message': 'Fila vazia'}), 400

atendimento_service.chamar_proximo()
return jsonify({"success": True})

except Exception as e:
return jsonify({'success': False, 'message': str(e)}), 400
return jsonify({"success": False, "message": str(e)}), 400


# VOLTAR AO ANTERIOR

@app.route('/voltar_anterior', methods=['POST'])
@app.route("/voltar_anterior", methods=["POST"])
def voltar_anterior():
"""Volta para o paciente anterior"""
try:
paciente_anterior = get_paciente_anterior()
paciente_atual = get_paciente_atual()

if not paciente_anterior and not paciente_atual:
return jsonify({'success': False, 'message': 'Não há paciente anterior'}), 400

paciente_atual = get_paciente_atual()

# Retorna paciente atual para a fila
if paciente_atual:
fila_atendimento.add_first(paciente_atual)
historico_atendimentos.pop() # Remove do histórico
print(f"removido histórico: {paciente_atual}")
print(paciente_atual)

# Restaura paciente anterior
set_paciente_atual(paciente_anterior)
print('atual setado como:', paciente_anterior)

set_paciente_anterior(None if historico_atendimentos.size < 2 else historico_atendimentos.peek().prev.data)
print('anterior setado como:', None if historico_atendimentos.size < 2 else historico_atendimentos.peek())

return jsonify({'success': True})

atendimento_service.voltar_anterior()
return jsonify({"success": True})

except Exception as e:
return jsonify({'success': False, 'message': str(e)}), 400
return jsonify({"success": False, "message": str(e)}), 400


# API – Fila

@app.route('/api/fila')
@app.route("/api/fila")
def api_fila():
"""API para obter fila atualizada"""
return jsonify({
'fila': fila_atendimento.to_list(),
'total': fila_atendimento.size
"fila": fila_atendimento.to_list(),
"total": fila_atendimento.size
})


@app.route('/api/status')
# API – Status

@app.route("/api/status")
def api_status():
"""API para status geral do sistema"""
return jsonify({
'paciente_atual': get_paciente_atual(),
'total_fila': fila_atendimento.size,
'total_historico': historico_atendimentos.size
"paciente_atual": atendimento_service.get_atual(),
"total_fila": fila_atendimento.size,
"total_historico": historico_atendimentos.size
})

# EXECUTAR

if __name__ == '__main__':
if __name__ == "__main__":
app.run(debug=True, port=5000)