BRD Mobile 2.5 Дополнительные позиции к заказу

Направление работ: Mobile Код раздела: 2.5 Раздел: Поиск > Дополнительные позиции к заказу Статус: Готов Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 27.07.26


1. Назначение

Раздел обеспечивает клиенту мобильного приложения интерфейс для просмотра дополнительных позиций площадки перед оформлением заказа.

Клиент просматривает доступное оборудование и услуги, открывает подробную информацию о позиции, выбирает нужное количество в пределах наличия и видит итоговую стоимость выбранных позиций.

Раздел описывает выбор дополнительных позиций и переход к итоговой информации о заказе. Правила хранения, доступности и расчета позиций определены в Back: 2.5 Дополнительные позиции.

2. Ключевые понятия

Экран «Дополнительно» — экран мобильного приложения, на котором клиент просматривает и выбирает дополнительные позиции площадки.

Дополнительная позиция — оборудование или дополнительная услуга партнера, которую клиент может добавить к заказу.

Группа позиций — категория, объединяющая дополнительные позиции по назначению и отображаемая отдельным сворачиваемым блоком.

Доступный остаток — количество позиции, доступное для добавления к заказу на выбранное время.

3. Scope

Входит

S1: Открытие и просмотр списка дополнительных позиций

S2: Просмотр подробной информации о позиции

S3: Выбор позиций, управление количеством и переход к следующему шагу

S4: Состояние загрузки списка

Не входит

4. BR

Указаны в пункте 4 раздела Back: 2.5 Дополнительные позиции.

5. Функциональные требования (UC + FR)

FR — functional requirements, что интерфейс должен уметь делать по определенному UC.

IDСценарийФункциональное требованиеBRВесСтатус
S1: FR2.5-1Клиент открывает дополнительные позиции к заказуИнтерфейс открывает экран «Дополнительно» и показывает позиции выбранной площадки.1Реализовано
OQ2.5-13
S1: FR2.5-2Клиент просматривает оборудование и услугиЕсли для площадки доступны позиции обоих типов, интерфейс показывает вкладки «Оборудование» и «Услуги» и позволяет переключать соответствующие списки без выхода с экрана.1Реализовано
S1: FR2.5-3Клиент открывает экран, где для площадки доступно только оборудование или только услугиИнтерфейс не показывает вкладки и сразу отображает список доступного типа позиций.1Не реализовано
OQ2.5-2
S1: FR2.5-4Клиент просматривает список позицийИнтерфейс группирует позиции по категориям и первоначально показывает категории развернутыми.1Частично
OQ2.5-3, OQ2.5-11
S1: FR2.5-5Клиент сворачивает или разворачивает категориюИнтерфейс скрывает или повторно показывает позиции выбранной категории.2Частично
OQ2.5-3
S1: FR2.5-6Клиент просматривает позицию в спискеИнтерфейс показывает изображение, название, стоимость в формате «{стоимость} ₽» и доступный остаток в формате «В наличии {N}».1Частично
OQ2.5-4
S1: FR2.5-7Клиент видит позицию с нулевым остаткомИнтерфейс показывает «В наличии 0» и блокирует выбор позиции и изменение ее количества.1Реализовано
OQ2.5-4
S2: FR2.5-8Клиент нажимает на позициюИнтерфейс открывает подробную информацию о позиции с названием, изображением и блоками «Основные характеристики» и «Описание».1Частично
OQ2.5-5
S2: FR2.5-9Клиент возвращается из подробной информацииИнтерфейс возвращает клиента к списку дополнительных позиций.1Реализовано
S3: FR2.5-10Клиент изменяет количество позицииИнтерфейс позволяет уменьшать и увеличивать количество счетчиком; при количестве 0 позиция считается невыбранной.1Реализовано
S3: FR2.5-11Клиент достигает границы доступного количестваИнтерфейс блокирует уменьшение количества ниже 0 и увеличение выше доступного остатка.1Частично
OQ2.5-12
S3: FR2.5-12Клиент выбирает или убирает позицииИнтерфейс пересчитывает и показывает в футере итоговую стоимость всех выбранных позиций.1Реализовано
S3: FR2.5-13Клиент нажимает «Очистить»Интерфейс сбрасывает количество всех выбранных позиций до 0 и обновляет итоговую стоимость.1Реализовано
S3: FR2.5-14Клиент нажимает «Продолжить»Интерфейс сохраняет текущий набор выбранных позиций и их количество и переходит в раздел Mobile: 2.6 Итоговая информация о заказе.1Частично
OQ2.5-6
S4: FR2.5-15Клиент открывает экран, данные загружаютсяИнтерфейс показывает skeleton-состояние категорий и карточек позиций до завершения загрузки списка.2Не реализовано
OQ2.5-7

6. Открытые вопросы

Сверка с кодом: BRD 2.5 v0.1 · репозиторий booking.mobile.flutter · commit b44cfa2 / origin/dev · 29.07.26 · якорь lib/src/feature/equipment/ и lib/src/core/utils/widgets/equipment_cell.dart Сводка: 15 вопросов (Open 13 · Подтверждено 2), из них 1 — из исходного материала Маршрутизация без сверки с гайдбуком (гайдбук не передавался).

IDИсточникВопросКомуСтатусРекомендацииИтоговое решение
OQ2.5-1Пользовательские правила / FigmaКак должен выглядеть экран, если для площадки доступны только услуги: без вкладок со списком услуг или с единственной вкладкой «Услуги»?ПродуктOpenЕсли для площадки доступно только оборудование или только услуги, интерфейс не показывает вкладки и сразу отображает список доступного типа позиций.
OQ2.5-2Код FR2.5-3Требование говорит: если у площадки доступен только один тип позиций, вкладки не показываются и сразу выводится список доступного типа. В коде вкладки «Оборудование» и «Услуги» создаются всегда, безусловно: переключатель на две вкладки задаётся при открытии экрана, а сами вкладки описаны константой. Проверки «есть ли позиции второго типа» нет нигде. Площадка с одним оборудованием откроется с пустой вкладкой «Услуги», и наоборот. Это тот самый сценарий, по которому в OQ2.5-1 уже принято решение — но в коде оно не выполнено. \ equipment_screen.dart:158 (переключатель всегда на две вкладки), :423-426 (постоянный список вкладок), :429-451 (оба списка)РазработкаOpenЗавести тикет в Bitrix: скрывать переключатель, когда позиции только одного типа, и открывать сразу нужный список. Продуктового решения не требуется — оно уже зафиксировано в «Итоговом решении» OQ2.5-1. Разделение позиций на оборудование и услуги в коде уже есть (по признаку типа при загрузке), так что правка сводится к условию на отрисовку.
OQ2.5-3Код FR2.5-4, FR2.5-5Требование говорит: интерфейс группирует позиции по категориям, изначально показывает их развёрнутыми и позволяет сворачивать и разворачивать категорию. В коде это сделано только для оборудования: оборудование раскладывается по названию группы из ответа сервера и выводится сворачиваемыми блоками. Услуги выводятся плоским списком без категорий — сворачивать там нечего. Позиции без названия группы попадают в категорию «Другое», которой в BRD нет. \ equipment_screen.dart:587-596 (сворачиваемые категории оборудования, развёрнуты по умолчанию), :435-450 (плоский список услуг), :628-636 (категория «Другое» по умолчанию)РазработкаOpenУточнить у бизнеса, группируются ли услуги по категориям так же, как оборудование (в модели данных группа есть у любой позиции, поэтому технически разницы нет). Если да — завести тикет в Bitrix и переиспользовать для услуг тот же список с категориями. Отдельно зафиксировать в FR2.5-4 категорию «Другое» для позиций без группы: сейчас она появляется, но в требованиях не описана.
OQ2.5-4Код FR2.5-6, FR2.5-7Требование говорит: в позиции показывается доступный остаток в формате «В наличии {N}», а при нулевом остатке выбор блокируется. В коде «В наличии {N}» показывает не исходный остаток, а оставшийся: с каждым добавлением к заказу число уменьшается. Выбрав всё доступное, пользователь видит «В наличии 0» у позиции, которую он же и набрал; кнопка «плюс» при этом гаснет — формально ровно то, что описано в FR2.5-7, но смысл надписи получается другой. Кроме того, стоимость выводится без пробела перед знаком рубля («1500₽»), а требование задаёт формат «{стоимость} ₽». \ equipment_bloc.dart:330-332 (пересчёт остатка при выборе), equipment_cell.dart:69 (вывод остатка), :213-218 (блокировка «плюса» по остатку), :74 (формат стоимости)БизнесOpenПодтвердить, что «В наличии» — это оставшееся количество (рекоменд.: так и работает, и это понятнее при выборе), и уточнить формулировку FR2.5-6, иначе при следующей сверке вопрос возникнет снова. Формат стоимости стоит привести к единому виду с остальными экранами приложения — там тоже «1500₽» без пробела, так что менять разумнее требование, а не пять экранов.
OQ2.5-5Код FR2.5-8Требование говорит: подробная информация о позиции содержит название, изображение и блоки «Основные характеристики» и «Описание». В коде открывается панель с названием, изображением и текстом описания — без заголовков блоков, а вместо характеристик выводится одна зашитая строка «Доступно для заказа» с галочкой, одинаковая для всех позиций. Характеристик у позиции в модели данных вообще нет: с сервера приходят название, описание, цена, остаток и группа — брать содержимое блока неоткуда. \ equipment_cell.dart:54-64 (открытие панели, зашитый список характеристик), :139-146 (описание без заголовка), :147-173 (вывод «характеристик»), equipment.dart:13-32 (состав полей позиции)БизнесOpenОпределить, что такое «Основные характеристики» для дополнительной позиции и откуда берутся эти данные — сейчас источника нет ни в мобильном приложении, ни в ответе сервиса позиций. (А) Если это отдельное поле — задача сначала на бэкенд (Back: 2.5 Дополнительные позиции), потом на приложение. (Б) Если характеристик не будет — убрать блок из FR2.5-8 и завести тикет в Bitrix на удаление заглушки «Доступно для заказа»: сейчас она выглядит как реальная характеристика позиции.
OQ2.5-6Код FR2.5-14Проблема: при нажатии «Продолжить» часть выбранных позиций переклассифицируется по названию. Перед передачей в заказ код проверяет, содержит ли название позиции подстроки «Настройка» или «Запись» (а также сверяет идентификаторы «8» и «9»), и таким позициям принудительно меняет тип на «пакетное предложение». Судя по комментарию, это писалось под тестовые данные, но выполняется всегда — проверки режима моков рядом нет. Любая позиция партнёра со словом «запись» в названии, например «Запись вокала» или «Аудиозапись репетиции», уедет в заказ с чужим типом. Требование говорит «сохраняет текущий набор выбранных позиций» — набор сохраняется искажённым. \ equipment_screen.dart:483-492 (переклассификация по подстроке названия и по идентификаторам тестовых данных)РазработкаOpenЗавести тикет в Bitrix: убрать переклассификацию по названию — тип позиции приходит с сервера и должен использоваться как есть. Если для тестовых данных нужна подмена, её место — в слое моков, а не в обработчике перехода к заказу. Продуктовых решений не требуется.
OQ2.5-7Код FR2.5-15Требование говорит: до завершения загрузки показывается skeleton-состояние категорий и карточек позиций. В коде состояние «идёт загрузка» заводится, но экраном не используется: разметка строится одинаково для всех состояний и во время загрузки просто показывает пустые вкладки. Skeleton встречается только внутри карточки — как заглушка для картинки, пока она подгружается. \ equipment_bloc.dart:113-119 (состояние загрузки), equipment_screen.dart:407-453 (разметка не различает состояния), equipment_cell.dart:41-47 (skeleton только для изображения)РазработкаOpenЗавести тикет в Bitrix: показывать skeleton категорий и карточек, пока список грузится. Требование веса 2, поэтому его логично взять вместе с OQ2.5-8 — оба про состояния экрана и лежат в одном файле.
OQ2.5-8Код (обратный проход)Проблема: если у площадки нет ни одной дополнительной позиции, экран остаётся в тупике. Успешный ответ применяется только при непустом списке — при пустом внутреннее состояние навсегда остаётся «идёт загрузка». Поскольку разметка состояния загрузки не различает (см. OQ2.5-7), пользователь видит не индикатор, а две пустые вкладки с работающим футером: итог 0 ₽ и активную кнопку «Продолжить». Пустого состояния («у площадки нет дополнительных позиций») в разделе не описано. То же самое произойдёт, если не удалось получить параметры поиска — обработчик просто прекращает работу, не меняя состояние. Отдельно: при ошибке загрузки исключение и показывается пользователю диалогом, и пробрасывается наружу обработчика, то есть уходит в необработанные. \ equipment_bloc.dart:277-285 (ответ применяется только при непустом списке), :126-127 (выход без смены состояния при отсутствии параметров поиска), :286-296 (эмит ошибки и повторный проброс исключения)РазработкаOpenЗавести тикет в Bitrix: применять ответ и при пустом списке позиций, убрать повторный проброс исключения после показа ошибки. Параллельно уточнить у бизнеса, что показывать в этом случае — пустое состояние на экране или вовсе не давать открыть «Дополнительно» с карточки площадки. Второе выглядит уместнее и почти готово технически, см. OQ2.5-10.
OQ2.5-9Код (обратный проход)Что нашли: две карточки одной и той же позиции берут изображение по-разному. В модели позиции есть метод, который достраивает относительный путь до полного адреса; экран заказа им пользуется, а общая ячейка списка «Дополнительно» берёт сырое поле напрямую. Пока сервер присылает полные ссылки, разницы не видно; как только придёт относительный путь, на экране «Дополнительно» вместо картинки появится значок ошибки, а в заказе та же позиция отрисуется нормально. \ equipment.dart:35-42 (метод сборки адреса), order_room_screen.dart:908 и :949 (экран заказа использует метод), equipment_cell.dart:32 и :59 (ячейка «Дополнительно» использует сырое поле)РазработкаOpenЗавести тикет в Bitrix (техуборка): перевести ячейку «Дополнительно» на тот же метод сборки адреса, что и экран заказа. Удалять метод нельзя — он используется. Продуктовых решений не требуется.
OQ2.5-10Код (обратный проход)Что нашли: у площадки есть признак «есть дополнительные позиции», и на карточке площадки он проверяется — но результат ни на что не влияет: обе ветки условия делают одно и то же, открывают экран «Дополнительно». То есть механизм, которым можно было бы не пускать пользователя на пустой экран из OQ2.5-8, уже написан и обесточен. \ room_details_screen.dart:1180-1189 (обе ветки условия открывают один и тот же экран)РазработкаOpenЗавести тикет в Bitrix: оживить проверку — не открывать экран «Дополнительно», если у площадки нет позиций (или заменить переход на пустое состояние, если бизнес решит иначе в OQ2.5-8). Правка на одну строку и закрывает самый заметный симптом.
OQ2.5-11Код FR2.5-4Проблема: позиции раскладываются по вкладкам по признаку типа, где ноль — оборудование, единица — услуги. Любое другое значение признака не попадает ни в один список: такая позиция молча исчезает с экрана, её не видно ни в оборудовании, ни в услугах, и в заказ она попасть не может. Ни ошибки, ни сообщения при этом не появляется. \ equipment_bloc.dart:189-190 (списки строятся по строгому равенству признака нулю и единице)РазработкаOpenУточнить у бизнеса и в Back: 2.5 Дополнительные позиции, какие значения признака типа вообще возможны. Если только два — завести тикет в Bitrix на защитную ветку: всё, что не услуги, показывать как оборудование, чтобы позиция не пропадала. Если типов планируется больше — это отдельная задача на вкладки.
OQ2.5-12Код FR2.5-11Проблема: при возврате на экран «Дополнительно» ранее выбранные количества восстанавливаются, но остаток при этом не уменьшается. Потолок количества считается как «остаток плюс уже выбранное», поэтому после восстановления он оказывается завышен ровно на восстановленное количество. Пользователь может набрать позиций больше, чем реально доступно, — и упрётся уже в отказ на стороне сервера, а не в границу на экране. Требование FR2.5-11 обещает блокировку увеличения выше доступного остатка. \ equipment_bloc.dart:161-181 (восстановление количеств без пересчёта остатка), :330 (потолок как остаток плюс выбранное)РазработкаOpenЗавести тикет в Bitrix: при восстановлении сохранённого выбора уменьшать остаток на восстановленное количество — тогда потолок останется корректным. Продуктовых решений не требуется, требование однозначное.
OQ2.5-13Код FR2.5-1Проблема: экран берёт данные площадки не только из перехода, но и из глобального хранилища последней просмотренной площадки — и подставляет их без проверки, та ли это площадка. Рядом, при переходе к итоговой информации о заказе, такая проверка есть: там данные из хранилища используются только если идентификатор совпал. При открытии экрана её нет. В сценарии «посмотрел одну площадку, вернулся, открыл «Дополнительно» у другой» есть риск загрузить позиции чужой площадки. \ equipment_screen.dart:75-87 (подстановка из хранилища без сверки идентификатора), :529-533 (та же подстановка со сверкой идентификатора)РазработкаOpenЗавести тикет в Bitrix: сверять идентификатор площадки перед подстановкой из хранилища — ровно так, как это уже сделано двумя сотнями строк ниже. Отдельно стоит проверить, воспроизводится ли сценарий на практике: если нет, вопрос закрывается техуборкой, если да — это дефект с неверными данными в заказе.
OQ2.5-14Код FR2.5-10, FR2.5-12, FR2.5-13Что подтверждено: работа с количеством и итогом соответствует требованиям. Счётчик уменьшает и увеличивает количество; «минус» гаснет на нуле, «плюс» — когда доступный остаток исчерпан; поверх этого количество дополнительно ограничивается в логике загрузки и выбора позиций, поэтому выйти за остаток одними нажатиями нельзя (отдельный случай с восстановленным выбором разобран в OQ2.5-12). Позиция с количеством 0 считается невыбранной и убирается из набора. Итоговая стоимость в футере считается как сумма «цена × количество» по выбранным позициям и пересчитывается при каждом изменении. «Очистить» обнуляет все количества и возвращает остатки к исходным, итог становится нулевым. \ equipment_cell.dart:195-221 (счётчик и границы), equipment_bloc.dart:331 (ограничение количества), :344-347 (нулевое количество убирает позицию из набора), equipment_screen.dart:548-551 (итог), equipment_bloc.dart:398-422 («Очистить»)ПодтвержденоРасхождения нет.
OQ2.5-15Код FR2.5-1, FR2.5-2, FR2.5-9Что подтверждено: экран открывается под названием «Дополнительно» и загружает позиции выбранной площадки на выбранный интервал; переключение между «Оборудованием» и «Услугами» происходит без выхода с экрана; возврат из подробностей позиции возвращает к списку; «Продолжить» переводит в Mobile: 2.6 Итоговая информация о заказе. Дополнительно: этот же экран открывается из уже созданного заказа — там он работает как модальное окно, возвращает выбранные позиции обратно в заказ, а доступность считается по датам заказа, а не по параметрам поиска. Этот второй сценарий в разделе не описан, но требованиям не противоречит. \ equipment_screen.dart:259 (заголовок), :169-176 (загрузка по площадке и интервалу), :429-451 (переключение вкладок), equipment_cell.dart:54-64 (панель подробностей), equipment_screen.dart:541-546 (переход к итоговой информации), :499-502 (возврат выбора в заказ), room_details_screen.dart:1183 (вход из карточки площадки), equip_service_widget.dart:186 (вход из заказа)ПодтвержденоРасхождения нет. При следующей правке раздела стоит решить, описывать ли здесь вход с экрана заказа или оставить его в разделе заказов.

0 items under this folder.