LiftTeam
Система учёта ремонта лифтового оборудования и склада радиодеталей.
Возможности
- Заказы на ремонт — оборудование в заказе с отдельным описанием
неисправности, стоимостью и статусами ремонта и оплаты, история изменений
с указанием сотрудника; поиск по номеру, заказчику, серийнику, счёту,
трек-номеру и неисправности с фильтрами по статусам, модели и датам.
Массовая отгрузка отмеченных заказов одним подтверждением — с отдельной
записью в истории и письмом заказчику по каждому
- Типовые неисправности — справочник по модели оборудования с готовым
набором деталей; в заказе выбор неисправности предлагает этот набор,
а кнопка «Применить шаблон» добавляет его к уже введённому списку деталей,
не заменяя его. У неисправности два текста: короткое рабочее название
для списков — оно в документы не попадает никогда — и полное описание,
которое печатается в акте дефектации и в коммерческом предложении.
Сложность ремонта задаётся у самой неисправности, и единица считается
сложной, если сложна хотя бы одна из выбранных у неё неисправностей.
Строку рецепта можно пометить версией модели: с какой-то версии тех же
деталей нужно другое количество
- Типы оборудования и версии моделей — два справочника. Тип
(«Привод дверей», «Преобразователь частоты») принадлежит модели, а версия
(«EkoDrive 2.0-1.1») — исполнению модели, с комментарием вроде
«алюминиевый корпус». И то и другое необязательно, а версия и её
комментарий — сведения для мастерской: ни в один документ они не идут
- Копирование справочных карточек — «Создать копию» у типовой
неисправности (вместе со всем рецептом) и у карточки детали открывает
форму создания, заполненную образцом; пока её не сохранили, ничего
не создаётся
- Склад радиодеталей — приход, расход, списание по заказу, журнал движений,
импорт и экспорт Excel, план закупок по деталям ниже минимального остатка.
Каждое списание распределяется по партиям прихода (FIFO — сначала уходит
самая старая), так что себестоимость детали в заказе считается по цене
именно той партии, из которой она физически ушла, а не по общей цене
детали. Инвентаризация — сверка фактического остатка с учётным по
одной кассетнице за раз: показывает учтённое количество, принимает
посчитанное и оформляет расхождение обычным движением склада (недостача
списывается по тем же партиям FIFO, излишек приходуется без цены и
требует комментария с причиной); история прошлых сессий — для аудита
- Выбор детали — везде, где нужно указать одну деталь (заказ, ячейка,
рецепт типовой неисправности, отбор в журнале движений), вместо списка
на весь каталог стоит поиск с теми же отборами, что и на складе: текст
по артикулу и названию, тип компонента, «только в наличии». В строке
результата — характеристики, текущий остаток и адрес ячейки; показываются
первые 50, и о том, что показаны не все, сказано прямо. Работает
с клавиатуры (стрелки, Enter, Escape) и на телефоне
- Ячейки хранения — кассетницы с настраиваемой раскладкой (число ячеек
задаётся отдельно для каждого ряда, поэтому сверху могут быть мелкие
секции, а снизу крупные ящики), визуальная сетка, перемещение деталей,
несколько деталей в одной ячейке
- История и гарантия по единице оборудования — все прошлые ремонты
конкретной железки, срок гарантии от даты завершения, предупреждение
о повторном обращении при приёме заказа
- Отчёты — план закупок, журнал движений, задолженности, аналитика
ремонта (сроки, загрузка по сотрудникам, типы неисправностей) за
произвольный период, прибыль по заказам (выручка минус себестоимость
деталей по партиям, разбивка по заказчику — доступно только бухгалтерии);
каждый выгружается в Excel
- Печатные документы — акты приёма, выполненных работ и дефектации,
плюс коммерческое предложение; A4 из карточки заказа, PDF сохраняется
через диалог печати браузера. Акт дефектации печатается по одной единице:
результаты диагностики, коды ошибок, гарантийность и оценка стоимости.
Предложение берёт цены из дефектации и печатается с банковскими
реквизитами
- Печать этикеток 43×25 мм с QR-кодом 12,3 мм — на детали, ячейки
и оборудование в заказе; по одной или пачкой, рулоном либо листом A4.
Деталь и ячейка печатаются одной раскладкой: артикул с характеристиками,
описание, тип корпуса и адрес ячейки. Ячейка с однотипными деталями
подписывается набором с перечнем номиналов. Текст, который не помещается,
ужимается по шрифту, а не обрезается.
Коды ведут на адрес Pi в Tailscale, поэтому сканирующий телефон должен
быть в той же сети Tailscale
- Сканирование — код с наклейки теперь не просто открывает страницу
в телефоне: программа узнаёт его на любом экране. Раздел «Сканирование» —
это ответ на вопрос «что это за коробка с полки»: поднесли код, увидели
деталь с остатком и ячейкой, ячейку с содержимым, прибор с историей
или заказ, и рядом кнопки, что с этим сделать. Проверенные подряд коды
копятся списком, чтобы разобрать несколько коробок и не терять
предыдущие ответы. О каждом скане программа говорит вслух — коротким
звуком, вспышкой и строкой текста, звук отключается на этом устройстве.
Чужой код (штрихкод товара из магазина) объявляется чужим, а не
открывает наугад чью-то карточку. Что покупать — в разделе «Сканеры»
ниже
- Остатки в реальном времени — цифры на открытой странице обновляются
сами, когда кто-то другой списывает или приходует деталь
- Кто на связи — список сотрудников с отметкой «в сети» или временем
последней активности: видно, стоит ли идти к терминалу коллеги или проще
позвонить. Отметку ставит сама открытая страница программы
- Понятное поведение при обрыве связи — сервер стоит дома, и связь
через интернет иногда моргает. Пока её нет, вверху страницы висит
предупреждение; оно пропадает само, когда связь возвращается. Форма,
отправленная в этот момент, никуда не уходит и ничего не теряет:
набранное остаётся в полях, а отправить её ещё раз предлагается кнопкой.
Работы без связи (офлайн-режима) и самостоятельной досылки накопленного
при этом нет — намеренно
- Оповещения — заказчику о готовности заказа, кладовщикам о дефиците
деталей, бухгалтеру сводка по должникам. Почта, MAX и Telegram; очередь
с повторами, письма заказчикам по умолчанию выключены
- Поступления из Т-Банка — выписка по расчётному счёту читается сама,
программа подсказывает, к какому заказу относится приход, разносит деньги
человек кнопкой
- Приём уведомлений об оплате (вебхуки) — адрес, на который банк
присылает уведомление, и это единственное, что открывается в интернет.
У Т-Банка приём работает: банк ничем не подписывает уведомления, поэтому
подлинность проверяется двумя условиями сразу — адрес отправителя
из списка банка и заголовок авторизации, который задаёте вы и сообщаете
банку при подключении. Уведомление ставит на заказе отметку «банк
сообщил об оплате» и зовёт бухгалтера; деньги оно не разносит —
суммы в уведомлении нет, поступление по-прежнему вносит человек
по выписке. У Точки проверять подлинность нечем (документация
недоступна), её адрес отказывает на каждом запросе
- Счёт заказчику через банк — счёт по заказу выставляется из карточки
и уходит заказчику почтой. Номер задаёте вы: банк берёт присланный.
Выключено по умолчанию, отправка только по нажатию.
Банков два — Т-Банк и Точка; какой из них подставится, задаётся
в карточке сотрудника, но на самой форме счёта банк открыт для правки.
Т-Банк работает; Точка подготовлена, но на живом счёте не проверялась —
подробности в CHANGELOG за v2.50.0
- Несколько своих юрлиц — реквизитов может быть несколько: у каждого
бухгалтера своё юрлицо и свой банк. Одно помечается основным, и от него
печатаются документы, пока по заказу не выставлен счёт; после — от того
юрлица, чей банк счёт выставил, чтобы заказчик не получал по одной
работе документы от двух разных фирм
- Оплаты и задолженности — поступления частями с датами, остаток
вместо полной стоимости, ежедневная проверка просрочки
- Роли сотрудников — администратор, кладовщик, менеджер по ремонту, бухгалтер
- REST API для всех сущностей
Сканеры: что покупать и как проверить
Коротко: нужен двумерный сканер (2D imager), он же «сканер QR-кодов».
Дешёвый одномерный лазерный сканер — тот, что светит красной полоской, —
QR-код не читает вовсе, ни при какой настройке. Это главная ошибка
при покупке: устройство работает, полоска светится, магазинные штрихкоды
читает, а наклейки LiftTeam — ни одной. Смотрите в описании товара слова
«2D», «QR», «image scanner», «имидж-сканер»; «лазерный» и «1D» —
не подходит.
Остальное:
- Ничего устанавливать не нужно. Сканер — что проводной USB, что
по Bluetooth — представляется компьютеру клавиатурой: он «набирает»
содержимое кода и жмёт Enter. Драйверов и настройки в программе нет,
нажимать перед сканированием тоже ничего не надо: программа узнаёт
сканер по скорости набора — так быстро руками не печатают.
- Сканер должен посылать Enter после кода. Почти все так настроены
с завода; если нет, это включается служебным кодом из инструкции
к сканеру (обычно называется «suffix Enter» или «CR»).
- Проверьте одно устройство на настоящей наклейке, прежде чем покупать
несколько. QR на этикетке 12,3 мм — это немного, и дешёвые сканеры
берут такой код не с любого расстояния. Напечатайте этикетку, наклейте
на пакет, откройте раздел «Сканирование» и поднесите. Если код читается
уверенно с 5–10 см — можно брать партию.
- Сканирующее устройство должно быть в той же сети Tailscale: в коде
записана ссылка на программу, и открыть её сможет только тот, кто
до неё дотягивается.
- Съёмки камерой телефона прямо в программе нет и пока быть не может.
Браузер отдаёт камеру странице только в защищённом окружении (HTTPS),
а программа открывается по обычному http на имени в Tailscale. Это
станет возможным, когда сайт будет открываться по HTTPS — Tailscale
умеет выдавать сертификат на имя
*.ts.net. Обходных путей нет, и
делать их не надо.
Сейчас скан открывает отсканированный объект, а на странице «Сканирование»
показывает, что это. Дальше сканирование встроится в саму работу: поднести
деталь при сборе заказа, ячейку при инвентаризации, прибор при отгрузке —
чтобы не искать нужную строку в списке руками.
Стек
Python 3.11+, Django 5.1, Django REST Framework, Django Channels, Bootstrap 5.
База — SQLite (по умолчанию) или PostgreSQL.
Запуск для разработки
python -m venv venv
venv\Scripts\activate # Windows
source venv/bin/activate # Linux и macOS
pip install -r requirements.txt
cp .env.example .env # и вписать SECRET_KEY
python manage.py migrate
python manage.py init_cells
python manage.py create_admin --username admin --name "Администратор" --password admin123
python manage.py runserver
Приложение откроется на http://127.0.0.1:8000
Быстрый вариант — python lifteam_launcher.py: проверит зависимости, создаст
базу и администратора, запустит сервер и откроет браузер.
Развёртывание
Установка на Raspberry Pi в офисе, с удалённым доступом через интернет
по Tailscale — DEPLOY.md. Там же — как открыть наружу
только каталог /webhooks/ для уведомлений банков, оставив всё остальное
в Tailscale.
Вариант с Docker (PostgreSQL, Redis, Nginx) — docker-compose.yml и start.sh.
Резервное копирование
python manage.py backup_db # копия с проверкой целостности
python manage.py restore_db --list # список копий
python manage.py restore_db # восстановить последнюю
Копия снимается штатным механизмом SQLite и безопасна на работающем сервере.
Копировать db.sqlite3 обычным cp нельзя: база работает в режиме WAL,
и такая копия окажется повреждённой.
На боевом сервере копирование выполняется по расписанию — см. DEPLOY.md.
Тесты
python manage.py test core
Документация
Безопасность
Перед запуском в эксплуатацию:
- сгенерируйте свой
SECRET_KEY
(python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())")
- смените стандартный пароль
admin / admin123
- не коммитьте
.env и db.sqlite3 — они исключены в .gitignore