Счётчики ЖКХ — исходный код приложения

Мобильное приложение для ОС Аврора: учёт показаний приборов учёта и расчёт коммунальных платежей. Курсовая работа по дисциплине «Разработка мобильных приложений».

Автор: Кривошеин Максим Константинович, группа ИС-2301, СПбГЭУ
Платформа: ОС Аврора 5.2 (Aurora SDK 5.2.0.180), Qt 5.6, C++ / QML (Sailfish Silica), SQLite
Пакет: ru.krivoshein.UtilityMeters, версия 1.0, архитектуры aarch64, armv7hl, x86_64

Возможности

  • Список приборов учёта пяти типов: холодная и горячая вода, электроэнергия, газ, отопление. Для каждого задаются название, тариф и заводской номер; счётчики можно изменять и удалять.
  • Ввод показаний с датой. Показание проверяется во время ввода:
    • не меньше предыдущего и не больше следующего по дате;
    • дата не в будущем, на одну дату — одно показание;
    • если расход более чем в 3 раза выше среднего, показывается предупреждение.
  • Расчёт расхода (разница с предыдущим показанием) и стоимости (расход × тариф), сумма к оплате за текущий месяц и сравнение с прошлым месяцем.
  • Карточка счётчика: последнее показание, средний расход, расход и начисления за 12 месяцев, график расхода по месяцам, история показаний с удалением ошибочных записей.
  • Статистика платежей: итог и среднее за 12 месяцев, самый дорогой месяц, график по месяцам и структура выбранного месяца по счётчикам.
  • Напоминание с 20 по 25 число, если за текущий месяц переданы не все показания.
  • Экспорт отчёта в CSV (~/Documents/UtilityMeters_<дата>.csv, UTF-8, разделитель ;), файл открывается в табличных редакторах.
  • Демо-данные: четыре счётчика с показаниями за 12 месяцев для знакомства с приложением.
  • Работает без интернета, данные хранятся на устройстве в базе SQLite и сохраняются после перезапуска.

Архитектура

QML (Sailfish Silica)                    C++
──────────────────────────────           ─────────────────────────────────────────
MainPage, MeterPage, StatisticsPage  ──▶  MeterStore  ── фасад для QML (meterStore)
MeterDialog, ReadingDialog                 │  MeterListModel ── модель списка счётчиков
BarChart, MessageBanner, TypeIcon          │  Consumption    ── расчёты и проверка показаний
                                           │  MeterType      ── типы счётчиков и единицы
                                           └─ Database       ── SQLite (QtSql)
  • Database (src/database.*) — таблицы meters и readings, внешний ключ с каскадным удалением, уникальность пары «счётчик — дата», версия схемы в PRAGMA user_version, запросы с подстановкой параметров, добавление счётчика и демо-данных в транзакции.
  • Consumption (src/consumption.*) — правила расчёта без зависимости от базы и интерфейса: расход по показаниям, расход по месяцам, средний расход, стоимость с округлением до копеек, проверка нового показания. Покрыты юнит-тестами.
  • MeterStore (src/meterstore.*) — объект, подключённый в корневой контекст QML: модель списка, итоги месяца, данные для графиков и статистики, проверка и сохранение показаний, экспорт CSV. Ошибки и уведомления передаёт в QML сигналами.
  • QML — экраны и диалоги Silica, собственные компоненты: столбчатая диаграмма BarChart, всплывающее сообщение MessageBanner, значок типа счётчика TypeIcon.

Расход показания относится к месяцу, в котором показание снято: так начисляют плату управляющие компании по показаниям, переданным жильцами.

Структура

ru.krivoshein.UtilityMeters.pro      проект qmake (QT += sql)
ru.krivoshein.UtilityMeters.desktop  ярлык, разрешение Documents для экспорта
rpm/ru.krivoshein.UtilityMeters.spec описание RPM-пакета
resources.qrc, images/types/         значки типов счётчиков
src/main.cpp                         запуск, открытие базы, регистрация meterStore
src/database.*                       работа с SQLite
src/consumption.*                    расчёты и проверка показаний
src/metertype.*                      типы счётчиков
src/meter.h                          структуры Meter и Reading
src/meterlistmodel.*                 модель списка счётчиков
src/meterstore.*                     фасад для QML
qml/UtilityMeters.qml                окно приложения
qml/pages/                           экраны и диалоги
qml/components/                      BarChart, MessageBanner, TypeIcon
qml/cover/DefaultCoverPage.qml       обложка с суммой к оплате
tests/                               юнит-тесты QtTest
screenshots/                         снимки экрана

Сборка и запуск

Проект открывается в Аврора IDE (Qt Creator из Aurora SDK 5.2) и собирается для любой архитектуры. Пакеты подписываются и проходят rpm-validator с профилем regular.

Тесты

Юнит-тесты правил расчёта собираются для компьютера разработчика:

cd tests
qmake tests.pro && make && ./tst_consumption

Результат: Totals: 25 passed, 0 failed, 0 skipped.

Ограничения

  • Тариф хранится у счётчика: если его изменить, стоимость пересчитывается и за прошлые месяцы. Для учёта смены тарифов нужна история тарифов с датой начала действия.
  • Нет передачи показаний в управляющую компанию: приложение работает без интернета.

Скриншоты

Первый запуск Главный экран Счётчик История
Показание Ошибка Предупреждение Новый счётчик
Статистика Экспорт CSV