Data_request / app.py
Rathapoom's picture
Update app.py
f169455 verified
raw
history blame
8.29 kB
import gradio as gr
import os
import json
from data_service import DataAssessmentService
from sheets_integration import SheetsLogger
from datetime import datetime
# Initialize services
service = DataAssessmentService(api_key=os.environ.get("OPENAI_API_KEY"))
sheets_logger = SheetsLogger()
# Department mapping from abbreviations to full names
DEPARTMENTS = {
"Executive Management": "บริหาร ผอ รอง ผู้ช่วย",
"Education Support": "สนับสนุนการศึกษา",
"Medicine": "MED",
"Cardiology": "Cardio",
"Gastroenterology": "GI",
"Medical Oncology": "Onco MED",
"Hematology": "Hematology",
"Operating Room": "OR",
"Surgery": "Sx",
"Orthopedics": "Ortho",
"Obstetrics and Gynecology": "OBgyne",
"Ophthalmology": "Oph",
"Ear, Nose, and Throat": "ENT",
"Anesthesiology": "Anes",
"Emergency Medicine & EMS": "ER and EMS",
"Pediatrics": "PED",
"Family Medicine & Preventive Medicine": "GP Fammed preventive med",
"Psychiatry": "Psych",
"Physical Medicine & Rehabilitation": "PM&R Physiotherapy",
"Pathology": "Patho",
"Radiology": "Xray",
"Radiation Oncology": "Onco radiology",
"Cyclotron": "Cyclotron",
"Inpatient Department": "IPD",
"Outpatient Department": "OPD",
"Pharmacy": "Pharmacy",
"Dentistry": "dentistry",
"Nutrition": "Nutrition",
"Medical Records": "เวชระเบียน",
"Finance": "การเงิน",
"Other": "Other"
}
# Frequency options
FREQUENCIES = ["One-time request", "Weekly", "Monthly"]
# Urgency options
URGENCY = ["Within a week", "Within a month", "Within a year"]
# Example requests
EXAMPLE_REQUESTS = """
### Example 1: Clinical Data Request
I need OPD patient statistics for the Cardiology department from January to June 2024, including daily patient volume, types of cardiac conditions (ICD-10 codes), average waiting times, and number of follow-up vs. new cases. This data will be used for department capacity planning and resource allocation.
### Example 2: Quality Improvement Request
Requesting waiting time analysis for all OPD clinics for Q1 2024, including:
- Registration to first nurse contact time
- Nurse station to doctor examination time
- Doctor examination duration
- Time at pharmacy
- Total visit duration
Break down by day of week and time slots (morning/afternoon). This data will help identify service bottlenecks.
### Example 3: Department Performance Analysis
Need Emergency Department performance data for March 2024:
- Daily patient volume by triage level
- Door-to-doctor times
- Length of stay in ED
- Admission rates
- Transfer rates to other departments
Purpose: Monthly performance review and staff allocation planning.
"""
def format_user_summary(analysis_result):
"""Format analysis result into user-friendly summary"""
available = analysis_result.get("data_availability", {}).get("available_reports", [])
data_lake = analysis_result.get("data_lake_requirements", {}).get("reports_needed", [])
unavailable = analysis_result.get("unavailable_data", [])
interpretation = analysis_result.get("request_analysis", {}).get("interpretation", "")
summary = [
"### Summary of Your Request",
f"**What you need**: {interpretation}\n",
"\n**Data Availability Status:**\n"
]
if available:
summary.append("✅ **Available in Web Data System:**")
for report in available:
summary.append(f"- {report['name']}")
summary.append(f"\nEstimated processing time: 3 working days\n")
if data_lake:
summary.append("🔄 **Requires Additional Database Query:**")
for report in data_lake:
summary.append(f"- {report['report_type']}")
summary.append(f"\nEstimated processing time: 2 weeks\n")
if unavailable:
summary.append("❌ **Data Not Currently Available:**")
for item in unavailable:
summary.append(f"- {item['report_type']}")
summary.append("\nRecommendation: Schedule a meeting to discuss alternative data sources or solutions\n")
return "\n".join(summary)
def process_request(name, employee_id, email, department, other_dept, request_details, frequency, urgency):
# Validate inputs
if not all([name, employee_id, email, request_details]):
return "Please fill in all required fields.", None
# Combine department info
final_department = other_dept if department == "Other" else department
try:
# Process the request through GPT
result = service.assess_request(request_details)
# Create user-friendly summary
user_summary = format_user_summary(result)
# Prepare data for logging
sheet_data = {
"timestamp": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"name": name,
"employee_id": employee_id,
"email": email,
"department": final_department,
"request_details": request_details,
"frequency": frequency,
"urgency": urgency,
"user_summary": user_summary,
"system_analysis": json.dumps(result, ensure_ascii=False)
}
# Log to Google Sheets
sheets_logger.log_request(sheet_data)
return user_summary, result
except Exception as e:
error_message = f"Error processing request: {str(e)}"
return error_message, None
# Create Gradio interface
with gr.Blocks() as demo:
gr.Markdown("# Hospital Data Request System")
gr.Markdown("Please fill in the following information to request data access.")
with gr.Row():
with gr.Column():
name = gr.Textbox(
label="Full Name*",
placeholder="Enter your full name"
)
employee_id = gr.Textbox(
label="Employee ID*",
placeholder="Enter your employee ID"
)
email = gr.Textbox(
label="Email*",
placeholder="Enter your email for contact"
)
with gr.Row():
with gr.Column():
department = gr.Dropdown(
choices=list(DEPARTMENTS.keys()),
label="Department*",
info="Select your department"
)
other_dept = gr.Textbox(
label="Other Department",
placeholder="Specify your department if not in the list",
visible=False
)
department.change(
fn=lambda x: gr.update(visible=x=="Other"),
inputs=[department],
outputs=[other_dept]
)
with gr.Accordion("📝 Click here to see example requests", open=False):
gr.Markdown(EXAMPLE_REQUESTS)
with gr.Row():
request_details = gr.Textbox(
label="Request Details*",
placeholder="Please describe in detail what data you need, including time period, specific parameters, etc.",
lines=5
)
with gr.Row():
with gr.Column():
frequency = gr.Dropdown(
choices=FREQUENCIES,
label="Request Frequency*"
)
urgency = gr.Dropdown(
choices=URGENCY,
label="Urgency Level*"
)
submit_btn = gr.Button("Submit Request")
with gr.Row():
user_output = gr.Markdown(label="Request Summary")
with gr.Accordion("Technical Analysis (For Data Team)", open=False):
tech_output = gr.JSON()
submit_btn.click(
fn=process_request,
inputs=[name, employee_id, email, department, other_dept,
request_details, frequency, urgency],
outputs=[user_output, tech_output]
)
gr.Markdown("""
### Notes:
- Fields marked with * are required
- Please provide detailed information about the data you need
- Include specific time periods and parameters
- Clearly state the purpose of your request
- All communications will be sent to the provided email
""")
if __name__ == "__main__":
demo.launch()