To upload files, please first save the app
import streamlit as st
from collections import deque
from datetime import datetime
# --- 비즈니스 로직 클래스 ---
class HospitalQueue:
def __init__(self):
self.queue = deque()
def register_patient(self, name, birthdate, purpose, phone=None):
patient_info = {
"name": name,
"birthdate": birthdate,
"purpose": purpose,
"phone": phone,
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
}
self.queue.append(patient_info)
def call_patient(self):
if self.queue:
return self.queue.popleft()
return None
def clear_queue(self):
self.queue.clear()
def get_queue(self):
return list(self.queue)
# --- UI 구성 요소 함수 ---
def render_title():
st.title("🏥 내과 진료 대기 시스템")
def init_session():
if 'hospital_queue' not in st.session_state:
st.session_state.hospital_queue = HospitalQueue()
def render_form():
visit_purposes = [
"감기", "기침", "인후통", "두통",
"혈압 체크", "당뇨 관리", "고혈압 관리",
"건강검진", "체중 관리", "만성질환 관리",
"기타 (직접 입력)"
]
with st.form(key='registration_form'):
col1, col2 = st.columns(2)
with col1:
name = st.text_input("환자 이름")
birthdate = st.date_input("생년월일")
with col2:
selected_purpose = st.selectbox("방문 목적 선택", visit_purposes)
phone = st.text_input("전화번호 (선택)", placeholder="010-1234-5678")
if selected_purpose == "기타 (직접 입력)":
custom_purpose = st.text_input("직접 입력: 방문 목적을 작성해주세요")
else:
custom_purpose = selected_purpose
submitted = st.form_submit_button("접수하기")
if submitted:
if name and birthdate and custom_purpose:
st.session_state.hospital_queue.register_patient(
name, birthdate.strftime("%Y-%m-%d"), custom_purpose, phone if phone else None
)
st.success(f"{name}님이 '{custom_purpose}' 목적으로 접수되었습니다.")
else:
st.warning("모든 필수 항목을 입력하세요.")
def handle_buttons():
col1, col2, _ = st.columns(3)
with col1:
if st.button("다음 환자 호출"):
next_patient = st.session_state.hospital_queue.call_patient()
if next_patient:
st.success(f"다음 환자: {next_patient['name']}님 - 방문 목적: {next_patient['purpose']}")
else:
st.warning("대기 중인 환자가 없습니다.")
with col2:
if st.button("대기열 초기화"):
st.session_state.hospital_queue.clear_queue()
st.success("대기열이 초기화되었습니다.")
def display_queue():
st.subheader("현재 대기 중인 환자 목록 👩⚕️")
queue = st.session_state.hospital_queue.get_queue()
if queue:
for idx, patient in enumerate(queue, start=1):
info = f"{idx}. {patient['name']} ({patient['birthdate']}) - 방문 목적: {patient['purpose']}, 접수 시간: {patient['timestamp']}"
if patient['phone']:
info += f", 연락처: {patient['phone']}"
st.info(info)
else:
st.write("현재 대기 중인 환자가 없습니다.")
# --- 메인 앱 실행 ---
def main():
render_title()
init_session()
render_form()
handle_buttons()
display_queue()
if __name__ == "__main__":
main()
Hi! I can help you with any questions about Streamlit and Python. What would you like to know?