Update app.py
Browse files
app.py
CHANGED
|
@@ -0,0 +1,128 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import streamlit as st
|
| 2 |
+
import pandas as pd
|
| 3 |
+
import sqlite3
|
| 4 |
+
from datetime import datetime
|
| 5 |
+
|
| 6 |
+
# Database connection
|
| 7 |
+
conn = sqlite3.connect('cafm.db', check_same_thread=False)
|
| 8 |
+
c = conn.cursor()
|
| 9 |
+
|
| 10 |
+
# Database initialization
|
| 11 |
+
def create_tables():
|
| 12 |
+
c.execute('''
|
| 13 |
+
CREATE TABLE IF NOT EXISTS assets (
|
| 14 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 15 |
+
site_name TEXT,
|
| 16 |
+
asset_name TEXT,
|
| 17 |
+
asset_type TEXT,
|
| 18 |
+
maintenance_history TEXT,
|
| 19 |
+
warranty TEXT,
|
| 20 |
+
current_condition TEXT
|
| 21 |
+
)
|
| 22 |
+
''')
|
| 23 |
+
c.execute('''
|
| 24 |
+
CREATE TABLE IF NOT EXISTS work_orders (
|
| 25 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 26 |
+
site_name TEXT,
|
| 27 |
+
work_order_description TEXT,
|
| 28 |
+
assigned_to TEXT,
|
| 29 |
+
status TEXT,
|
| 30 |
+
created_at TEXT
|
| 31 |
+
)
|
| 32 |
+
''')
|
| 33 |
+
c.execute('''
|
| 34 |
+
CREATE TABLE IF NOT EXISTS preventive_maintenance (
|
| 35 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 36 |
+
site_name TEXT,
|
| 37 |
+
task_name TEXT,
|
| 38 |
+
schedule_date TEXT,
|
| 39 |
+
status TEXT
|
| 40 |
+
)
|
| 41 |
+
''')
|
| 42 |
+
|
| 43 |
+
create_tables()
|
| 44 |
+
|
| 45 |
+
# Sidebar Navigation
|
| 46 |
+
st.sidebar.title("CAFM System")
|
| 47 |
+
menu = st.sidebar.selectbox("Menu", ["Asset Management", "Work Order Management", "Preventive Maintenance", "Reporting & Analytics"])
|
| 48 |
+
|
| 49 |
+
# Asset Management
|
| 50 |
+
if menu == "Asset Management":
|
| 51 |
+
st.title("Asset Management")
|
| 52 |
+
site_name = st.text_input("Site Name")
|
| 53 |
+
asset_name = st.text_input("Asset Name")
|
| 54 |
+
asset_type = st.text_input("Asset Type")
|
| 55 |
+
maintenance_history = st.text_area("Maintenance History")
|
| 56 |
+
warranty = st.text_input("Warranty (e.g., 1 year)")
|
| 57 |
+
current_condition = st.selectbox("Current Condition", ["Good", "Needs Repair", "Critical"])
|
| 58 |
+
|
| 59 |
+
if st.button("Add Asset"):
|
| 60 |
+
c.execute('''
|
| 61 |
+
INSERT INTO assets (site_name, asset_name, asset_type, maintenance_history, warranty, current_condition)
|
| 62 |
+
VALUES (?, ?, ?, ?, ?, ?)
|
| 63 |
+
''', (site_name, asset_name, asset_type, maintenance_history, warranty, current_condition))
|
| 64 |
+
conn.commit()
|
| 65 |
+
st.success("Asset added successfully!")
|
| 66 |
+
|
| 67 |
+
st.subheader("Asset List")
|
| 68 |
+
assets = pd.read_sql_query("SELECT * FROM assets", conn)
|
| 69 |
+
st.dataframe(assets)
|
| 70 |
+
|
| 71 |
+
# Work Order Management
|
| 72 |
+
elif menu == "Work Order Management":
|
| 73 |
+
st.title("Work Order Management")
|
| 74 |
+
site_name = st.text_input("Site Name")
|
| 75 |
+
work_order_description = st.text_area("Work Order Description")
|
| 76 |
+
assigned_to = st.text_input("Assigned To")
|
| 77 |
+
status = st.selectbox("Status", ["Pending", "In Progress", "Completed"])
|
| 78 |
+
|
| 79 |
+
if st.button("Create Work Order"):
|
| 80 |
+
c.execute('''
|
| 81 |
+
INSERT INTO work_orders (site_name, work_order_description, assigned_to, status, created_at)
|
| 82 |
+
VALUES (?, ?, ?, ?, ?)
|
| 83 |
+
''', (site_name, work_order_description, assigned_to, status, datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
|
| 84 |
+
conn.commit()
|
| 85 |
+
st.success("Work order created successfully!")
|
| 86 |
+
|
| 87 |
+
st.subheader("Work Orders")
|
| 88 |
+
work_orders = pd.read_sql_query("SELECT * FROM work_orders", conn)
|
| 89 |
+
st.dataframe(work_orders)
|
| 90 |
+
|
| 91 |
+
# Preventive Maintenance
|
| 92 |
+
elif menu == "Preventive Maintenance":
|
| 93 |
+
st.title("Preventive Maintenance")
|
| 94 |
+
site_name = st.text_input("Site Name")
|
| 95 |
+
task_name = st.text_input("Task Name")
|
| 96 |
+
schedule_date = st.date_input("Schedule Date")
|
| 97 |
+
status = st.selectbox("Status", ["Scheduled", "Completed"])
|
| 98 |
+
|
| 99 |
+
if st.button("Schedule Task"):
|
| 100 |
+
c.execute('''
|
| 101 |
+
INSERT INTO preventive_maintenance (site_name, task_name, schedule_date, status)
|
| 102 |
+
VALUES (?, ?, ?, ?)
|
| 103 |
+
''', (site_name, task_name, schedule_date, status))
|
| 104 |
+
conn.commit()
|
| 105 |
+
st.success("Task scheduled successfully!")
|
| 106 |
+
|
| 107 |
+
st.subheader("Scheduled Maintenance")
|
| 108 |
+
maintenance = pd.read_sql_query("SELECT * FROM preventive_maintenance", conn)
|
| 109 |
+
st.dataframe(maintenance)
|
| 110 |
+
|
| 111 |
+
# Reporting & Analytics
|
| 112 |
+
elif menu == "Reporting & Analytics":
|
| 113 |
+
st.title("Reporting & Analytics")
|
| 114 |
+
st.subheader("Asset Overview")
|
| 115 |
+
asset_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_assets FROM assets GROUP BY site_name", conn)
|
| 116 |
+
st.dataframe(asset_data)
|
| 117 |
+
|
| 118 |
+
st.subheader("Work Order Summary")
|
| 119 |
+
work_order_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_work_orders FROM work_orders GROUP BY site_name", conn)
|
| 120 |
+
st.dataframe(work_order_data)
|
| 121 |
+
|
| 122 |
+
st.subheader("Maintenance Tasks Overview")
|
| 123 |
+
maintenance_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_tasks FROM preventive_maintenance GROUP BY site_name", conn)
|
| 124 |
+
st.dataframe(maintenance_data)
|
| 125 |
+
|
| 126 |
+
# Close database connection
|
| 127 |
+
conn.close()
|
| 128 |
+
|