Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| import folium | |
| from streamlit_folium import st_folium | |
| from datetime import datetime | |
| from geopy.distance import geodesic | |
| import requests | |
| import os | |
| import json | |
| # ----------------------------- | |
| # GROQ API Configuration | |
| # ----------------------------- | |
| GROQ_API_URL = "https://api.groq.com/openai/v1/chat/completions" | |
| GROQ_API_KEY = st.secrets["TMS"] if "GROQ_API_KEY" in st.secrets else os.getenv("GROQ_API_KEY") | |
| HEADERS = { | |
| "Authorization": f"Bearer {GROQ_API_KEY}", | |
| "Content-Type": "application/json" | |
| } | |
| # ----------------------------- | |
| # Traccar API Configuration (Simulated Setup) | |
| # ----------------------------- | |
| TRACCAR_API_URL = "https://demo.traccar.org/api" | |
| TRACCAR_USERNAME = st.secrets["TRACCAR_USERNAME"] if "TRACCAR_USERNAME" in st.secrets else os.getenv("TRACCAR_USERNAME") | |
| TRACCAR_PASSWORD = st.secrets["TRACCAR_PASSWORD"] if "TRACCAR_PASSWORD" in st.secrets else os.getenv("TRACCAR_PASSWORD") | |
| # ----------------------------- | |
| # Simulated Databases | |
| # ----------------------------- | |
| employee_data = pd.DataFrame({ | |
| "Employee ID": ["E001", "E002", "E003"], | |
| "Name": ["Alice", "Bob", "Charlie"], | |
| "Pickup Location": [(28.6139, 77.2090), (28.7041, 77.1025), (28.5355, 77.3910)] | |
| }) | |
| vehicle_data = pd.DataFrame({ | |
| "Vehicle ID": ["V001", "V002"], | |
| "Driver Name": ["Ravi", "Sunil"], | |
| "Capacity": [2, 2], | |
| "Current Location": [(28.6448, 77.2167), (28.4595, 77.0266)] | |
| }) | |
| allocation = {} | |
| # ----------------------------- | |
| # Utility Functions | |
| # ----------------------------- | |
| def allocate_vehicles(): | |
| global allocation | |
| allocation = {v_id: [] for v_id in vehicle_data["Vehicle ID"]} | |
| emp_index = 0 | |
| for v_id in allocation: | |
| cap = int(vehicle_data[vehicle_data["Vehicle ID"] == v_id]["Capacity"].values[0]) | |
| while cap > 0 and emp_index < len(employee_data): | |
| allocation[v_id].append(employee_data.iloc[emp_index].to_dict()) | |
| emp_index += 1 | |
| cap -= 1 | |
| def show_map(): | |
| m = folium.Map(location=[28.6139, 77.2090], zoom_start=10) | |
| # Employee locations | |
| for _, row in employee_data.iterrows(): | |
| folium.Marker(location=row["Pickup Location"], tooltip=f"{row['Name']}").add_to(m) | |
| # Vehicle locations | |
| for _, row in vehicle_data.iterrows(): | |
| folium.Marker(location=row["Current Location"], tooltip=f"Vehicle: {row['Vehicle ID']} (Driver: {row['Driver Name']})", icon=folium.Icon(color='green')).add_to(m) | |
| st_folium(m, width=700) | |
| def generate_summary(log_text): | |
| if not GROQ_API_KEY: | |
| return "GROQ API key not provided." | |
| payload = { | |
| "model": "mixtral-8x7b-32768", | |
| "messages": [ | |
| {"role": "system", "content": "You are a helpful assistant summarizing GPS log data."}, | |
| {"role": "user", "content": log_text} | |
| ] | |
| } | |
| try: | |
| response = requests.post(GROQ_API_URL, headers=HEADERS, data=json.dumps(payload)) | |
| result = response.json() | |
| return result['choices'][0]['message']['content'] | |
| except Exception as e: | |
| return f"Error: {e}" | |
| def fetch_traccar_device_locations(): | |
| if not TRACCAR_USERNAME or not TRACCAR_PASSWORD: | |
| return [] | |
| try: | |
| response = requests.get( | |
| f"{TRACCAR_API_URL}/positions", | |
| auth=(TRACCAR_USERNAME, TRACCAR_PASSWORD) | |
| ) | |
| if response.status_code == 200: | |
| return response.json() | |
| else: | |
| st.warning("Failed to fetch real-time data from Traccar API.") | |
| return [] | |
| except Exception as e: | |
| st.error(f"Traccar API error: {e}") | |
| return [] | |
| # ----------------------------- | |
| # Streamlit UI | |
| # ----------------------------- | |
| st.title("Company Vehicle Transport Management System") | |
| menu = st.sidebar.selectbox("Menu", ["Dashboard", "Allocate Vehicles", "Track Vehicles", "Summarize Logs"]) | |
| if menu == "Dashboard": | |
| st.subheader("Employee Data") | |
| st.dataframe(employee_data) | |
| st.subheader("Vehicle Data") | |
| st.dataframe(vehicle_data) | |
| elif menu == "Allocate Vehicles": | |
| allocate_vehicles() | |
| st.subheader("Allocation Result") | |
| for v_id, emp_list in allocation.items(): | |
| st.write(f"**Vehicle {v_id}**") | |
| for emp in emp_list: | |
| st.write(f"- {emp['Name']} (ID: {emp['Employee ID']})") | |
| elif menu == "Track Vehicles": | |
| st.subheader("Live Vehicle and Employee Location Map") | |
| positions = fetch_traccar_device_locations() | |
| if positions: | |
| m = folium.Map(location=[28.6139, 77.2090], zoom_start=10) | |
| for pos in positions: | |
| lat = pos.get("latitude") | |
| lon = pos.get("longitude") | |
| device_id = pos.get("deviceId") | |
| folium.Marker(location=[lat, lon], tooltip=f"Device ID: {device_id}", icon=folium.Icon(color='blue')).add_to(m) | |
| st_folium(m, width=700) | |
| else: | |
| show_map() | |
| elif menu == "Summarize Logs": | |
| st.subheader("Summarize Driver/Vehicle Logs") | |
| log_text = st.text_area("Paste GPS or Driver Log Text:") | |
| if st.button("Summarize with GROQ"): | |
| with st.spinner("Generating summary..."): | |
| summary = generate_summary(log_text) | |
| st.success("Summary:") | |
| st.write(summary) | |
| # ----------------------------- | |
| # TODO: Integration Points | |
| # ----------------------------- | |
| # - Add user authentication system | |
| # - Store and retrieve persistent data from a database like Firebase or Supabase |