Автоматизированное рабочее место диспетчера службы ЖКХ: приём, маршрутизация и контроль исполнения заявок плюс планирование профилактических работ через интерактивный календарь и систему чек-листов.
Проект выполнен на заказ. Это обезличенная демо-версия для портфолио: все пользователи, адреса, телефоны, организации и заявки вымышлены. Реальные данные заказчика удалены и не входят в репозиторий.
Диспетчерская служба ЖКХ принимает поток разнородных заявок (аварии, плановое ТО, административные задачи) по телефону, в мессенджерах и на бумаге. Это приводит к потерянным заявкам, отсутствию контроля качества работ на местах и трудоёмкой ручной отчётности перед руководством и ГЖИ.
Задача системы - превратить хаотичный поток обращений в структурированный план работ с прозрачным контролем исполнения и автоматической отчётностью.
- Интерактивный календарь - задачи по дням, drag-and-drop переноса с проверкой загруженности исполнителя, цветовая индикация (аварии / просрочки / выполнено), быстрые личные заметки на дату.
- Управление заявками - три типа (аварийная / плановая / административная), приоритеты, дедлайны, статусы, журнал изменений, прикрепление файлов.
- Конструктор чек-листов - типовые шаблоны работ; обязательные пункты и пункты с обязательной фотофиксацией; задачу нельзя закрыть, пока не отмечены все обязательные пункты.
- Справочники - дома/объекты и исполнители (бригады, график, контакты).
- Отчётность - выгрузка заявок и сводки в Excel (.xlsx) и PDF за период, статистика по статусам и типам, рейтинг исполнителей.
- Ролевая модель -
admin,dispatcher,master,manager. Мастер видит только свои задачи и не может их удалять; руководитель видит аналитику. - Уведомления - оповещения о новых авариях, приближении дедлайна и смене статуса.
- Погодный виджет - прогноз в шапке календаря (OpenWeatherMap, опционально).
- Backend: Python 3.10+, Flask 3.x
- База данных: SQLite (модуль
sqlite3, чистый SQL без ORM) - Frontend: серверный рендеринг Jinja2 + HTML5/CSS3 + vanilla JavaScript (без фреймворков)
- Отчёты:
openpyxl(Excel),reportlab(PDF) - Десктоп (опционально, Windows):
pywebview- нативное окно поверх локального Flask-сервера
fieldops/
├── backend/
│ ├── app.py # Flask-приложение: маршруты, авторизация, отчёты, API
│ ├── db.py # подключение к SQLite (per-request, через flask.g)
│ ├── schema.sql # DDL: таблицы, индексы, дефолтные настройки
│ ├── init_db.py # создание БД + вымышленные демо-данные
│ ├── templates/ # Jinja2-шаблоны (base + страницы по модулям)
│ └── static/
│ ├── css/style.css # стили (sidebar-навигация, минимализм)
│ ├── js/main.js # поиск, уведомления, drag-and-drop календаря, виджет погоды
│ └── uploads/ # вложения к задачам (в репозитории пусто)
├── start_web.py # запуск в браузере (находит свободный порт, открывает вкладку)
├── main.py # запуск как десктоп-приложение (pywebview)
├── setup.bat # установка зависимостей и БД на Windows
├── requirements.txt
├── .env.example # шаблон переменных окружения
└── DEMO_ACCOUNTS.txt # демо-логины
Ключевые решения:
- Без ORM - прямой SQL через
sqlite3для прозрачности и предсказуемости запросов. - Соединение на запрос хранится в
flask.gи закрывается вteardown_appcontext. - Ролевой доступ реализован декораторами
login_required/dispatcher_required/admin_required. - Целостность данных обеспечивается на уровне схемы (
CHECK-ограничения статусов и типов, внешние ключи сON DELETE). - Бизнес-правило завершения задачи (все обязательные пункты чек-листа отмечены) проверяется и на сервере, и в UI.
- Пароли хранятся как хэши (
werkzeug.security),SECRET_KEYгенерируется при первом запуске.
Требуется Python 3.10+.
# 1. Установить зависимости
pip install -r requirements.txt
# 2. (необязательно) скопировать шаблон окружения
cp .env.example .env
# 3. Запустить в браузере - БД с демо-данными создаётся автоматически
python start_web.pyПриложение поднимется на http://127.0.0.1:<свободный порт> и откроется в браузере.
Создать/пересоздать базу вручную можно так:
python -c "import sys; sys.path.insert(0, 'backend'); from init_db import init_db; init_db()"Удаление
backend/data.dbсбрасывает базу - при следующем запуске она будет создана заново с демо-данными.
| Роль | Логин | Пароль |
|---|---|---|
| Администратор | admin |
admin123 |
| Диспетчер | dispatcher |
disp123 |
| Мастер | master |
master123 |
| Руководитель | manager |
mngr123 |
- Виджет погоды и email-уведомления требуют ключей в
.env(или в разделе «Настройки»); без них приложение полностью работоспособно. - Десктоп-режим (
main.py/setup.bat) рассчитан на Windows и Microsoft Edge WebView2; кроссплатформенный путь - веб-режим (start_web.py).