File size: 6,911 Bytes
6c151a6
 
 
 
7f1cd2f
6c151a6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
abd03bf
 
 
 
 
 
 
7f1cd2f
 
 
 
 
 
 
 
 
 
 
 
 
 
abd03bf
7f1cd2f
abd03bf
 
7f1cd2f
 
 
 
153852a
abd03bf
153852a
 
7f1cd2f
 
 
 
6c151a6
 
7f1cd2f
6c151a6
7f1cd2f
 
abd03bf
7f1cd2f
 
 
 
 
 
 
 
 
 
 
 
 
 
f25141f
6c151a6
 
 
 
 
 
7f1cd2f
6c151a6
7f1cd2f
 
abd03bf
7f1cd2f
 
 
 
 
 
 
 
 
 
 
 
f25141f
6c151a6
 
 
 
 
 
7f1cd2f
6c151a6
7f1cd2f
 
abd03bf
7f1cd2f
 
 
 
 
 
 
 
 
 
 
 
f25141f
6c151a6
 
 
 
 
 
7f1cd2f
6c151a6
7f1cd2f
 
6c151a6
 
7f1cd2f
 
 
6c151a6
 
 
7f1cd2f
 
 
6c151a6
 
 
7f1cd2f
 
 
6c151a6
 
 
 
7f1cd2f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
import streamlit as st
import pandas as pd
import sqlite3
from datetime import datetime
import plotly.express as px

# Database connection
conn = sqlite3.connect('cafm.db', check_same_thread=False)
c = conn.cursor()

# Database initialization
def create_tables():
    c.execute('''
        CREATE TABLE IF NOT EXISTS assets (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            site_name TEXT,
            asset_name TEXT,
            asset_type TEXT,
            maintenance_history TEXT,
            warranty TEXT,
            current_condition TEXT
        )
    ''')
    c.execute('''
        CREATE TABLE IF NOT EXISTS work_orders (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            site_name TEXT,
            work_order_description TEXT,
            assigned_to TEXT,
            status TEXT,
            created_at TEXT
        )
    ''')
    c.execute('''
        CREATE TABLE IF NOT EXISTS preventive_maintenance (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            site_name TEXT,
            task_name TEXT,
            schedule_date TEXT,
            status TEXT
        )
    ''')

create_tables()

# Sidebar Navigation with Session State to retain page state
if "page" not in st.session_state:
    st.session_state.page = "Home"

def navigate_to(page):
    st.session_state.page = page

st.sidebar.title("CAFM Navigation")

# Define navigation options
pages = {
    "Home": "🏠",
    "Asset Management": "πŸ“‹",
    "Work Order Management": "πŸ› οΈ",
    "Preventive Maintenance": "⏰",
    "Reporting & Analytics": "πŸ“Š"
}

st.sidebar.markdown("---")
for page, icon in pages.items():
    if st.sidebar.button(f"{icon} {page}"):
        navigate_to(page)

# Main Page Logic
selected_page = st.session_state.page

# Home Page
if selected_page == "Home":
    st.title("Welcome to the Computer-Aided Facility Management (CAFM) System")
    st.image(
        "https://via.placeholder.com/800x300.png?text=CAFM+System",
        use_container_width=True
    )
    st.markdown("""
    This application centralizes all facility management tasks to improve efficiency and decision-making. 
    Explore the options to manage assets, track work orders, plan maintenance, and analyze data trends.
    """)

# Asset Management
elif selected_page == "Asset Management":
    st.title("Asset Management")
    st.markdown("Manage and monitor your facility's assets efficiently.")
    
    with st.form("asset_form"):
        site_name = st.text_input("Site Name")
        asset_name = st.text_input("Asset Name")
        asset_type = st.text_input("Asset Type")
        maintenance_history = st.text_area("Maintenance History")
        warranty = st.text_input("Warranty (e.g., 1 year)")
        current_condition = st.selectbox("Current Condition", ["Good", "Needs Repair", "Critical"])
        submitted = st.form_submit_button("Add Asset")
        if submitted:
            c.execute('''
                INSERT INTO assets (site_name, asset_name, asset_type, maintenance_history, warranty, current_condition)
                VALUES (?, ?, ?, ?, ?, ?)
            ''', (site_name, asset_name, asset_type, maintenance_history, warranty, current_condition))
            conn.commit()
            st.success("Asset added successfully!")
            st.session_state.page = "Asset Management"

    st.subheader("Asset List")
    assets = pd.read_sql_query("SELECT * FROM assets", conn)
    st.dataframe(assets)

# Work Order Management
elif selected_page == "Work Order Management":
    st.title("Work Order Management")
    st.markdown("Streamline the management of work orders from creation to completion.")

    with st.form("work_order_form"):
        site_name = st.text_input("Site Name")
        work_order_description = st.text_area("Work Order Description")
        assigned_to = st.text_input("Assigned To")
        status = st.selectbox("Status", ["Pending", "In Progress", "Completed"])
        submitted = st.form_submit_button("Create Work Order")
        if submitted:
            c.execute('''
                INSERT INTO work_orders (site_name, work_order_description, assigned_to, status, created_at)
                VALUES (?, ?, ?, ?, ?)
            ''', (site_name, work_order_description, assigned_to, status, datetime.now().strftime("%Y-%m-%d %H:%M:%S")))
            conn.commit()
            st.success("Work order created successfully!")
            st.session_state.page = "Work Order Management"

    st.subheader("Work Orders")
    work_orders = pd.read_sql_query("SELECT * FROM work_orders", conn)
    st.dataframe(work_orders)

# Preventive Maintenance
elif selected_page == "Preventive Maintenance":
    st.title("Preventive Maintenance")
    st.markdown("Plan and manage preventive maintenance tasks to ensure asset longevity.")

    with st.form("maintenance_form"):
        site_name = st.text_input("Site Name")
        task_name = st.text_input("Task Name")
        schedule_date = st.date_input("Schedule Date")
        status = st.selectbox("Status", ["Scheduled", "Completed"])
        submitted = st.form_submit_button("Schedule Task")
        if submitted:
            c.execute('''
                INSERT INTO preventive_maintenance (site_name, task_name, schedule_date, status)
                VALUES (?, ?, ?, ?)
            ''', (site_name, task_name, schedule_date, status))
            conn.commit()
            st.success("Task scheduled successfully!")
            st.session_state.page = "Preventive Maintenance"

    st.subheader("Scheduled Maintenance")
    maintenance = pd.read_sql_query("SELECT * FROM preventive_maintenance", conn)
    st.dataframe(maintenance)

# Reporting & Analytics
elif selected_page == "Reporting & Analytics":
    st.title("Reporting & Analytics")
    st.markdown("Visualize data to make informed, data-driven decisions.")

    st.subheader("Asset Overview")
    asset_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_assets FROM assets GROUP BY site_name", conn)
    if not asset_data.empty:
        fig = px.bar(asset_data, x="site_name", y="total_assets", title="Total Assets by Site")
        st.plotly_chart(fig)

    st.subheader("Work Order Summary")
    work_order_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_work_orders FROM work_orders GROUP BY site_name", conn)
    if not work_order_data.empty:
        fig = px.pie(work_order_data, values="total_work_orders", names="site_name", title="Work Orders Distribution by Site")
        st.plotly_chart(fig)

    st.subheader("Maintenance Tasks Overview")
    maintenance_data = pd.read_sql_query("SELECT site_name, COUNT(*) as total_tasks FROM preventive_maintenance GROUP BY site_name", conn)
    if not maintenance_data.empty:
        fig = px.line(maintenance_data, x="site_name", y="total_tasks", title="Maintenance Tasks by Site")
        st.plotly_chart(fig)

# Close database connection
conn.close()