13 KiB
BI-дашборд для оценки эффективности автобаз
Корпоративный веб-сервис для мониторинга и анализа работы транспортных подразделений.
📋 Возможности
- Многофакторный рейтинг подразделений на основе 5 KPI
- Авторизация и RBAC (роли: админ, руководитель, бухгалтер, водитель)
- Экспорт отчётов для обоснования бюджета
- Абстракция данных (легко переключиться с Google Sheets на ERP API)
- Политика конфиденциальности на всех экранах
🏗 Архитектура
Паттерн Repository (DataFetcher)
┌─────────────────────────────────────────┐
│ DataFetcher (Interface) │
│ - get_fleet_data() -> DataFrame │
│ - get_requests_data() -> DataFrame │
│ - get_accidents_data() -> DataFrame │
│ - get_maintenance_data() -> DataFrame │
│ - get_fuel_data() -> DataFrame │
│ - get_employees_data() -> DataFrame │
└─────────────────────────────────────────┘
▲
┌───────────┼───────────┐
│ │ │
┌───────┴────┐ ┌───┴────────┐ ┌┴──────────────┐
│MockData │ │GoogleSheets│ │ApiFetcher │
│Fetcher │ │Fetcher │ │(будущая ERP) │
└────────────┘ └────────────┘ └───────────────┘
Преимущества:
- Код бизнес-логики (
KPICalculator) не зависит от источника данных - Для подключения ERP нужно лишь создать класс
ApiFetcherс теми же методами - Тестирование на mock-данных без подключения к внешним сервисам
📁 Структура проекта
autobase-bi/
├── app.py # Главное приложение Streamlit
├── data_fetcher.py # Абстракция доступа к данным
├── requirements.txt # Зависимости Python
├── .env.example # Шаблон переменных окружения
├── service_account.json # Ключ Google Service Account (не в git!)
└── README.md # Эта документация
🚀 Быстрый старт
1. Установка зависимостей
pip install -r requirements.txt
2. Настройка окружения
Скопируйте .env.example в .env:
cp .env.example .env
Отредактируйте .env при необходимости (для демо можно оставить значения по умолчанию).
3. Запуск приложения
streamlit run app.py
Приложение откроется по адресу: http://localhost:8501
4. Вход в систему
Используйте тестовые учётные данные:
| Логин | Пароль | Роль | Права доступа |
|---|---|---|---|
| admin | admin123 | Администратор | Полный доступ |
| manager | manager123 | Руководитель | Просмотр + экспорт |
| accountant | accountant123 | Бухгалтер | Финансы + экспорт |
| driver | driver123 | Водитель | Только свои данные |
🔧 Настройка Google Sheets API
Шаг 1: Создание сервиса в Google Cloud
- Откройте Google Cloud Console
- Создайте новый проект или выберите существующий
- Включите Google Sheets API:
- Перейдите в "APIs & Services" → "Library"
- Найдите "Google Sheets API" и нажмите "Enable"
Шаг 2: Создание сервисного аккаунта
- Перейдите в "APIs & Services" → "Credentials"
- Нажмите "Create Credentials" → "Service Account"
- Заполните данные:
- Service account name:
autobase-bi-service - Service account ID: создастся автоматически
- Role: Viewer (только чтение)
- Service account name:
- Нажмите "Create and Continue"
Шаг 3: Генерация ключа
- На странице сервисного аккаунта перейдите во вкладку "Keys"
- "Add Key" → "Create new key"
- Выберите формат JSON
- Скачайте файл и сохраните как
service_account.jsonв корне проекта
Шаг 4: Предоставление доступа к таблице
- Откройте вашу Google Таблицу
- Нажмите кнопку "Поделиться" (Share)
- Вставьте email сервисного аккаунта (вида
autobase-bi-service@project-id.iam.gserviceaccount.com) - Дайте права Читатель (Viewer)
- Скопируйте ID таблицы из URL (между
/d/и/edit)
Шаг 5: Настройка .env
Отредактируйте .env:
GOOGLE_SERVICE_ACCOUNT_KEY_PATH=./service_account.json
GOOGLE_SHEET_ID=ваш_id_таблицы_здесь
Шаг 6: Структура Google Таблицы
Создайте листы со следующими названиями и колонками:
Лист "Автопарк":
vehicle_id | vehicle_type | department | status | year | mileage | purchase_cost
V001 | Грузовой | Автобаза №1 | В работе | 2022 | 75000 | 2500000
Лист "Заявки":
request_id | department | date | status | fulfilled | vehicle_id
R0001 | Автобаза №1 | 2024-01-15 | Исполнено | 1 | V001
Лист "ДТП_ПДД":
incident_id | date | vehicle_id | driver_id | type | severity | fine_amount
I001 | 2024-02-10 | V001 | D005 | ДТП | Средний | 15000
Лист "ТО_Ремонты":
maintenance_id | vehicle_id | date | type | downtime_days | cost
M0001 | V001 | 2024-01-20 | Плановое ТО | 2 | 25000
Лист "ГСМ_Финансы":
vehicle_id | date | fuel_liters | fuel_cost | planned_cost | actual_cost
V001 | 2024-01-15 | 250 | 12500 | 12000 | 12500
Лист "Сотрудники":
employee_id | name | department | position | license_category
D001 | Иванов А.А. | Автобаза №1 | Водитель | C
Шаг 7: Переключение на Google Sheets
В приложении выберите в боковой панели:
- Источник данных: Google Sheets
Или измените app.py:
# Было (демо):
st.session_state.data_fetcher = MockDataFetcher()
# Стало (Google Sheets):
from data_fetcher import GoogleSheetsFetcher
st.session_state.data_fetcher = GoogleSheetsFetcher(
service_account_path=os.getenv('GOOGLE_SERVICE_ACCOUNT_KEY_PATH'),
sheet_id=os.getenv('GOOGLE_SHEET_ID')
)
📊 Метрики и KPI
1. Коэффициент исполнения заявок (25%)
Исполнено заявок / Всего заявок × 100%
2. Коэффициент использования парка (КИП) (20%)
(Всего ТС - В ремонте) / Всего ТС × 100%
3. Безопасность (20%)
100 - (ДТП × 5 + Нарушения × 2) / Всего ТС × 10
4. Эксплуатация и ремонты (15%)
100 - (Простой дней / Всего ТС) × 2
5. Финансы и ГСМ (20%)
Перерасход: (Факт - План) / План × 100%
Стоимость 1 км: Общие расходы / Пробег × 1000
Сводный рейтинг
Рейтинг = KPI1×0.25 + KPI2×0.20 + KPI3×0.20 + KPI4×0.15 + KPI5×0.20
🔐 Безопасность
Ролевая модель (RBAC)
| Роль | Просмотр всех | Экспорт | Финансы | Управление |
|---|---|---|---|---|
| Администратор | ✅ | ✅ | ✅ | ✅ |
| Руководитель | ✅ | ✅ | ✅ | ❌ |
| Бухгалтер | ❌ | ✅ | ✅ | ❌ |
| Водитель | ❌ | ❌ | ❌ | ❌ |
Продакшен-рекомендации
- Замените хардкод логинов на LDAP/Active Directory
- Настройте HTTPS через reverse proxy (nginx)
- Добавьте логирование действий пользователей
- Регулярно ротируйте токены и ключи
# Пример LDAP авторизации (заменить в check_credentials)
import ldap
def ldap_auth(username, password):
conn = ldap.initialize('ldap://your-domain.local')
try:
conn.simple_bind_s(f'{username}@domain.local', password)
return True
except:
return False
📈 Экспорт отчёта для бюджета
- Войдите под ролью admin или manager
- Перейдите в раздел "💰 Бюджет 2027"
- Нажмите "📥 Скачать отчёт (CSV)"
Отчёт содержит:
- Текущие расходы за 2024 год
- Прогноз на 2027 год с учётом инфляции и износа
- Рекомендуемый бюджет
- Потребность в обновлении автопарка
🔄 Подключение ERP API (Фаза 2)
Для перехода с Google Sheets на ERP:
1. Создайте класс ApiFetcher
# data_fetcher.py
class ApiFetcher(DataFetcher):
def __init__(self, api_base_url: str, api_token: str):
self.api_base_url = api_base_url
self.api_token = api_token
def get_fleet_data(self) -> pd.DataFrame:
response = requests.get(
f'{self.api_base_url}/fleet/vehicles',
headers={'Authorization': f'Bearer {self.api_token}'}
)
return pd.DataFrame(response.json())
# Реализуйте остальные 5 методов аналогично
2. Обновите app.py
from data_fetcher import ApiFetcher
st.session_state.data_fetcher = ApiFetcher(
api_base_url=os.getenv('ERP_API_URL'),
api_token=os.getenv('ERP_API_TOKEN')
)
3. Добавьте в .env
ERP_API_URL=https://erp.your-company.local/api/v1
ERP_API_TOKEN=your_token_here
Никаких изменений в бизнес-логике не требуется!
🛠 Troubleshooting
Ошибка "ModuleNotFoundError"
pip install -r requirements.txt --upgrade
Ошибка Google API "credentials invalid"
- Проверьте путь к
service_account.json - Убедитесь, что сервисный аккаунт имеет доступ к таблице
- Проверьте ID таблицы в
.env
Приложение не запускается
# Проверьте версию Python (требуется 3.8+)
python --version
# Пересоздайте виртуальное окружение
python -m venv venv
source venv/bin/activate # Linux/Mac
# или
venv\Scripts\activate # Windows
pip install -r requirements.txt
Streamlit показывает кэш
- Очистите кэш:
st.cache_resource.clear() - Перезапустите приложение
📄 Лицензия
Внутренний корпоративный сервис. Не для публикации.
⚠️ Политика конфиденциальности:
Внимание: информация носит строго конфиденциальный характер. Я передаю данные для обработки, но требую хранить их в безопасности и не передавать третьим лицам согласно закону. Запрещено размещение в открытом доступе.