BRD Mobile 4.2.2 Мои заказы > Список архивных заказов > Повтор заказа
Направление работ: Mobile Код раздела: 4.2.2 Раздел: Мои заказы > Список архивных заказов > Повтор заказа Статус: черновик Ответственный: Панкова Л.А. Версия: 0.1 Обновлено: 21.08.26
1. Назначение
Раздел обеспечивает клиенту мобильного приложения возможность быстро создать новый заказ по параметрам ранее завершенного заказа.
Клиент запускает повтор из информации об архивном заказе, выбирает новые доступные таймслоты и продолжает стандартное оформление. Значения опций и дополнительные позиции исходного заказа подставляются автоматически, поэтому клиенту не требуется заполнять их заново.
Выбор нового времени, дополнительные позиции, проверка и результат оформления описаны в разделах Mobile: 2.4.1 Выбор таймслотов, Mobile: 2.5 Дополнительные позиции к заказу, Mobile: 2.6 Итоговая информация о заказе и Mobile: 2.7 Заказ успешно создан. Состав и создание повторного заказа определяются правилами Back: 3.1 Состав заказа, Back: 3.2 Процессинг заказов, Back: 2.4.1 Условия создания, Back: 2.5 Дополнительные позиции, Back: 4.2 Стоимость заказа и позиций и Back: 8.2.1 Сферы и Опции.
2. Ключевые понятия
Сценарий «Повтор заказа» — переход от архивного заказа к стандартному созданию нового заказа с автоматически подставленными опциями и дополнительными позициями.
Исходный архивный заказ — ранее завершенный заказ, параметры которого используются для предзаполнения нового заказа.
Состав нового заказа — выбранные для нового заказа площадка, время, опции и дополнительные позиции после проверки и изменения клиентом.
Опция заказа — параметр выбранной сферы, например «Кол-во человек» или «Вид работ», значение которого переносится из исходного заказа.
Дополнительная позиция — оборудование или услуга площадки, количество которой подставляется из исходного заказа и может быть изменено до создания нового заказа.
3. Scope
Входит
S1: Запуск повтора архивного заказа и переход к выбору новых таймслотов с предзаполненными опциями
S2: Переход к дополнительным позициям с предзаполненным составом исходного заказа
S3: Передача нового заказа в стандартные шаги проверки и завершения создания
Не входит
- Mobile: 4.2.1 Информация об архивном заказе — просмотр исходного заказа и действие «Повторить».
- Mobile: 2.4.1 Выбор таймслотов — правила отображения площадок, опций и выбора нового времени.
- Mobile: 2.5 Дополнительные позиции к заказу — просмотр позиций, управление количеством и расчет их стоимости.
- Mobile: 2.6 Итоговая информация о заказе — проверка состава, выбор способа оплаты и подтверждение нового заказа.
- Mobile: 2.7 Заказ успешно создан — отображение результата создания бронирования или заявки.
4. BR
Указаны в пункте 4 разделов Back: 3.1 Состав заказа, Back: 3.2 Процессинг заказов, Back: 2.4.1 Условия создания, Back: 2.5 Дополнительные позиции, Back: 4.2 Стоимость заказа и позиций и Back: 8.2.1 Сферы и Опции.
5. Функциональные требования (UC + FR)
FR — functional requirements, что интерфейс должен уметь делать по определенному UC.
| ID | Сценарий | Функциональное требование | BR | Вес | Статус |
|---|---|---|---|---|---|
| S1: FR4.2.2-1 | Клиент нажимает «Повторить» в информации об архивном заказе | Интерфейс использует выбранный архивный заказ как источник предзаполнения и открывает раздел Mobile: 2.4.1 Выбор таймслотов. | 1 | Частично OQ4.2.2-1 | |
| S1: FR4.2.2-2 | Клиент открывает экран «Выберите время» из сценария повтора | Интерфейс автоматически подставляет значения применимых опций исходного заказа, включая «Кол-во человек» и «Вид работ», если соответствующие опции предусмотрены выбранной сферой. | 1 | Не реализовано OQ4.2.2-2 | |
| S1: FR4.2.2-3 | Клиент просматривает предзаполненные опции | Интерфейс показывает значения опций доступными для изменения по правилам раздела Mobile: 2.4.1 Выбор таймслотов. | 2 | Частично OQ4.2.2-2 | |
| S1: FR4.2.2-4 | Клиент выбирает площадку и время нового заказа | Интерфейс предварительно выбирает площадку исходного заказа и позволяет клиенту выбрать другую площадку того же объекта. Дата и время исходного заказа не переносятся: клиент выбирает новый допустимый период из актуальных таймслотов. | 1 | Частично OQ4.2.2-1, OQ4.2.2-3 | |
| S1: FR4.2.2-5 | Клиент сформировал допустимый период и нажимает «Продолжить» | Интерфейс передает выбранную площадку, новые таймслоты и значения опций в раздел Mobile: 2.5 Дополнительные позиции к заказу. | 1 | Частично OQ4.2.2-2 | |
| S2: FR4.2.2-6 | Клиент открывает экран «Дополнительно» из сценария повтора | Интерфейс автоматически устанавливает сохраненное в исходном заказе количество только для существующих дополнительных позиций с достаточным доступным остатком. Отсутствующая позиция и позиция с нулевым остатком не отображаются в списке. Если доступный остаток меньше сохраненного количества, интерфейс показывает позицию невыбранной, без предупреждения. | 1 | Не реализовано OQ4.2.2-4 | |
| S2: FR4.2.2-7 | Клиент просматривает предзаполненные дополнительные позиции | Интерфейс показывает позиции на вкладках «Оборудование» и «Услуги», их актуальную стоимость, доступный остаток и подставленное количество по правилам раздела Mobile: 2.5 Дополнительные позиции к заказу. Стоимость каждой позиции пересчитывается по актуальной цене и не переносится из исходного заказа. | 1 | Частично OQ4.2.2-4 | |
| S2: FR4.2.2-8 | Клиент изменяет предзаполненный состав | Интерфейс позволяет увеличить или уменьшить количество доступной позиции либо сбросить весь выбранный состав действием «Очистить» и обновляет итоговую стоимость позиций. | 1 | Частично OQ4.2.2-4 | |
| S2: FR4.2.2-9 | Клиент нажимает «Продолжить» на экране «Дополнительно» | Интерфейс передает текущий набор дополнительных позиций и их количество в раздел Mobile: 2.6 Итоговая информация о заказе. | 1 | Частично OQ4.2.2-4 | |
| S3: FR4.2.2-10 | Клиент переходит к итоговой информации повторяемого заказа | Интерфейс открывает экран «Проверьте запись» и показывает новый заказ с выбранными таймслотами, опциями и текущим набором дополнительных позиций по правилам раздела Mobile: 2.6 Итоговая информация о заказе. | 1 | Частично OQ4.2.2-2, OQ4.2.2-4 | |
| S3: FR4.2.2-11 | Клиент подтверждает создание нового заказа | После успешного создания интерфейс переходит в раздел Mobile: 2.7 Заказ успешно создан и показывает применимое состояние результата. | 1 | Частично OQ4.2.2-5 |
6. Открытые вопросы
Сверка с кодом: BRD 4.2.2 v0.1 · репозиторий
booking.mobile.flutter· commit9db8346/dev· 28.08.26 · якорьlib/src/feature/orders_tab/order_room/utils/order_utils.dart(точка входа «Повторить») → далее по цепочкеlib/src/feature/time_widget/,lib/src/feature/equipment/,lib/src/feature/order_result/,lib/src/feature/order_success/Сводка: 5 вопросов (Open 5 · Подтверждено 0)
Маршрутизация без сверки с гайдбуком (гайдбук не передавался).
Границы обхода: сверялась цепочка «Повторить» от карточки архивного заказа до создания нового заказа — переход на 2.4.1, экран выбора времени, переход на 2.5, экран «Дополнительно», переход на 2.6 и создание заказа. Разделы Mobile 4.2.1, 2.4.1, 2.5, 2.6 и 2.7 прямо отмечены в этом BRD как «Не входит» и заново не переисследовались; там, где их код пересекается со сценарием повтора, использованы уже готовые сверки этих разделов (4.2.1 и 2.7 сверялись на этом же коммите
9db8346; 2.4.1 — на более раннем89ca502; 2.5 — наb44cfa2; ключевые находки, использованные здесь, перепроверены заново на9db8346).
| ID | Источник | Вопрос | Кому | Статус | Рекомендации | Итоговое решение |
|---|---|---|---|---|---|---|
| OQ4.2.2-1 | Код FR4.2.2-1, FR4.2.2-4, FR4.2.2-5 | Требование говорит: клиент нажимает «Повторить» на архивном заказе — интерфейс использует его как источник предзаполнения и открывает раздел 2.4.1 «Выбор таймслотов»; площадка исходного заказа выбирается заранее, а дата и время — нет, клиент выбирает их заново. В коде у кнопки «Повторить» два разных обработчика, и выбор между ними зависит не от сценария повтора, а от того, показывается ли рядом кнопка «Оценить» (она доступна первые 14 дней после завершения заказа, пока отзыв не оставлен). Если панель показывает обе кнопки — «Повторить» открывает не выбор времени, а карточку площадки, и клиент должен ещё раз нажать «К выбору времени», чтобы попасть на 2.4.1. Если панель показывает только «Повторить» — экран времени открывается сразу, как и требует BRD. Площадка исходного заказа в обоих случаях подставляется корректно; дата и время в обоих случаях действительно не переносятся — в этой части код соответствует требованию. \ lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:196-227 (ветка с двумя кнопками, «Повторить» → OrderUtils.jumpToTimePage), lib/src/feature/orders_tab/order_room/utils/order_utils.dart:16-34,49-94 (переход на карточку площадки), lib/src/feature/room_details/widget/room_details_screen.dart:1159-1201 (только повторный тап там открывает выбор времени), lib/src/feature/orders_tab/order_room/widget/actullity/buttons_panel_widget.dart:134-150 (ветка с одной кнопкой, «Повторить» → OrderUtils.jumpToTimeWidget), lib/src/feature/orders_tab/order_room/utils/order_utils.dart:110-172 (переход сразу на выбор времени) | Разработка | Open | (А, рекоменд.) свести оба обработчика к одному прямому переходу на 2.4.1, как описано в требовании, — это техническое решение, продуктового вопроса тут нет: разница объясняется составом кнопок панели, а не сознательным сценарием. (Б) если промежуточный показ площадки — намеренное решение, закрепить это отдельным пунктом в FR4.2.2-1 и объяснить, зачем сценарий раздваивается по признаку, не относящемуся к повтору. | |
| OQ4.2.2-2 | Код FR4.2.2-2, FR4.2.2-3, FR4.2.2-5, FR4.2.2-10 | Требование говорит: на экране «Выберите время» значения опций исходного заказа (например, «Кол-во человек» и «Вид работ») подставляются автоматически, если сфера площадки их предусматривает, и остаются доступными для изменения. В коде ни в одной из двух веток «Повторить» сохранённое значение опции до экрана не доезжает. Если повтор идёт через карточку площадки, экран времени открывается с захардкоженным «пустым» идентификатором опции — идентификатор архивного заказа никуда не передаётся. Если повтор идёт напрямую на экран времени, идентификатор опции архивного заказа технически передаётся, но экран всё равно выбирает опцию по умолчанию, настроенную для сферы, а не переданную; числовой диапазон («Кол-во человек») всегда стартует с фиксированных значений 2–3, потому что сохранённое в заказе количество нигде не читается на этом пути — при этом на клиенте оно точно есть (поля capacity и range в модели архивного заказа). Экран с опциями есть и опции действительно редактируются — но подставлять клиенту нечего, поэтому и на следующих шагах (переход в 2.5, экран «Проверьте запись» в 2.6) показываются не сохранённые, а произвольные/дефолтные значения опции. \ lib/src/feature/room_details/widget/room_details_screen.dart:1168-1176 (захардкоженный идентификатор опции fe7f09ae-14ac-4071-9d99-e278cef61ea5 вместо значения из заказа), lib/src/feature/time_widget/widget/time_widget_screen.dart:521-524 (диапазон по умолчанию 2–3), :585-647 (_loadOptionsFromSphere выбирает опцию по признаку сферы, widget.optionId не учитывается), lib/src/feature/search_params/bloc/search_params_bloc.dart:286-330 (_initSearchParams тоже берёт опцию по умолчанию сферы), lib/src/feature/orders_tab/order_room/model/order_screen_dto.dart:55-56,119 (capacity, range — сохранённые значения архивного заказа, существуют, но не читаются на пути повтора) | Разработка | Open | (А, рекоменд.) передавать сохранённые capacity/range архивного заказа в переход на экран времени и использовать их вместо значения по умолчанию сферы — данные уже есть на клиенте, доработка локальная, в пределах уже найденных мест. (Б) если предзаполнение опций признано ненужным (например, потому что площадка и время всё равно выбираются заново) — снять эту часть из FR4.2.2-2, FR4.2.2-3, FR4.2.2-5 и FR4.2.2-10, оставив только «интерфейс позволяет выбрать опции». | |
| OQ4.2.2-3 | Код FR4.2.2-4 | Требование говорит: интерфейс предварительно выбирает площадку исходного заказа и позволяет клиенту выбрать другую площадку того же объекта. В коде первая часть работает — площадка исходного заказа корректно подставляется в обеих ветках повтора. Вторая часть не работает нигде на этом экране, независимо от сценария: список площадок объекта, которым можно было бы переключиться, всегда передаётся пустым (рядом стоит комментарий разработчика «пусто для простоты»), поэтому горизонтальный переключатель площадок, который умеет всё остальное — отметку выбранной, прокрутку, перезагрузку таймслотов, — просто нечем заполнить. Это не специфично для повтора: раздел Mobile: 2.4.1 Выбор таймслотов уже фиксирует эту находку в собственной сверке (OQ2.4.1-2); здесь тот же код подтверждён заново, на текущем коммите 9db8346. \ lib/src/feature/time_widget/bloc/time_slot_bloc.dart:88-95 (rooms: [], // Empty for simplicity, рядом захардкоженный sphereId с символами, недопустимыми в UUID) | Разработка | Open | Чинить одной задачей с OQ2.4.1-2 в разделе 2.4.1 — это общий код, а не отдельная проблема повтора; здесь достаточно ссылки, отдельный тикет заводить не нужно. | |
| OQ4.2.2-4 | Код FR4.2.2-6, FR4.2.2-7, FR4.2.2-8, FR4.2.2-9 | Требование говорит: на экране «Дополнительно» количество ранее выбранных позиций подставляется автоматически, но только для позиций, которые всё ещё существуют и есть в достаточном остатке; отсутствующая позиция и позиция с нулевым остатком не показываются вовсе; позиция, остатка которой не хватает на сохранённое количество, показывается невыбранной без предупреждения; стоимость каждой позиции пересчитывается по актуальной цене. В коде ни один из переходов на экран «Дополнительно» из сценария повтора не передаёт состав позиций архивного заказа — параметр экрана, отвечающий за предзаполнение, на путях повтора нигде не заполняется, хотя сохранённый состав (order.positions) есть на клиенте. Единственное место, где список позиций реально передаётся тем же параметром, — кнопка «Добавить/редактировать позиции» на карточке заказа, и она доступна только для ещё не оплаченного заказа в статусе «резерв»; архивный (завершённый или отменённый) заказ этому условию никогда не соответствует. Похожая логика фильтрации (пропустить позицию, которой больше нет в каталоге площадки; уменьшить остаток на сохранённое количество) в коде действительно есть, но она обслуживает просмотр самого архивного заказа (раздел 4.2.1), а не создание нового через повтор — и правил «нулевой остаток — скрыть» и «остатка не хватает — показать невыбранной без предупреждения» там тоже нет. Единственный механизм, который на практике может подставить хоть какое-то количество на экран «Дополнительно» при повторе, — общий на всё приложение кеш выбора позиций (не привязанный к заказу или площадке), которым экран «Дополнительно» обменивается с «Проверьте запись» в рамках одного, ещё не завершённого оформления; он не очищается в начале сценария повтора и подставляет сохранённое в нём количество без проверки текущего остатка позиции. То есть при повторе клиент либо видит пустой список позиций, либо — если незадолго до этого он что-то выбирал на другой площадке и не закончил оформление — получает чужие, не относящиеся к архивному заказу количества. Отдельно, независимо от повтора: позиция с нулевым остатком на этом экране не скрывается — строка остаётся видимой с подписью «В наличии 0», блокируется только кнопка «+». \ lib/src/feature/time_widget/widget/time_widget_screen.dart:961,992,1644 и lib/src/feature/room_details/widget/room_details_screen.dart:1183,1188 (все переходы на экран «Дополнительно» из сценария повтора передают только площадку, без списка позиций), lib/src/feature/orders_tab/order_room/widget/actullity/equip_service_widget.dart:186-194 (единственное место, где список позиций реально передаётся, — карточка заказа), lib/src/feature/orders_tab/utils/conditions_btns_util.dart:130-140 (условие для этой кнопки — заказ в статусе «резерв»), lib/src/feature/orders_tab/order_room/cubit/order_room_cubit.dart:76-113 (_fillListEquipmentScreenModel — похожая фильтрация, но для экрана 4.2.1, не для повтора), lib/src/feature/equipment/bloc/equipment_bloc.dart:151-184 (общий кеш EquipmentSelectionsService: подстановка без проверки остатка на строке 178, очистка на строке 184), lib/src/feature/equipment/widget/equipment_screen.dart:512-520 и lib/src/feature/order_result/widget/order_result_screen.dart:407-408 (кеш заполняется при обычном переходе «Дополнительно» → «Проверьте запись», не связан с архивными заказами), lib/src/core/utils/widgets/equipment_cell.dart:69 (позиция с нулевым остатком остаётся видимой) | Разработка | Open | (А, рекоменд.) на переходе из сценария повтора передавать в экран «Дополнительно» состав позиций архивного заказа (order.positions) тем же параметром, что уже использует карточка заказа, с фильтрацией по текущему остатку по правилам FR4.2.2-6; отдельно — не полагаться на общий кеш выбора позиций для этого сценария, он существует для другой задачи (навигация внутри одного оформления). (Б) если решено, что клиент при повторе всегда выбирает позиции заново, — упростить FR4.2.2-6…FR4.2.2-9 до «клиент видит пустой список и выбирает позиции самостоятельно», это правка BRD, не кода. Это самое серьёзное расхождение в разделе: не работает вся заявленная логика предзаполнения второго шага повтора — четыре требования веса 1. | |
| OQ4.2.2-5 | Код FR4.2.2-10, FR4.2.2-11 | Требование говорит: клиент попадает на экран «Проверьте запись» с новым заказом (таймслоты, опции, текущие дополнительные позиции), а после подтверждения — в раздел 2.7 «Заказ успешно создан» с применимым состоянием результата. В коде экран «Проверьте запись» открывается и показывает то, что реально собралось на предыдущих шагах, то есть корректно отражает уже описанные выше пробелы в опциях и составе позиций, а не добавляет новых. Хорошая новость: создание заказа при повторе идёт тем же общим методом, что и при обычном оформлении, — в запросе на создание нет ссылки на исходный архивный заказ и вообще нет способа его изменить, то есть повтор архивного заказа не может случайно затронуть сам архивный заказ. Переход в раздел 2.7 после успеха происходит. Раздел 2.7 в этом BRD отмечен как «Не входит», поэтому его собственное поведение заново не переисследовалось; в частности, уже описанный в сверке самого раздела 2.7 дефект (для оплаты на месте номер только что созданного заказа не передаётся на экран успеха, из-за чего вместо срока бесплатной отмены и телефона площадки показываются условные значения) в равной мере касается заказов, созданных через повтор, — отдельного пути для повтора на этом шаге нет. \ lib/src/feature/order_result/model/create_order_request.dart:11-30 (в запросе создания заказа нет поля со ссылкой на исходный заказ), lib/src/feature/order_result/data/create_order_repository.dart:207-208,215-216 (createAsReserve всегда true — заказ создаётся как обычный новый резерв), lib/src/feature/order_result/widget/order_result_screen.dart:543-546 (создание заказа — общий вызов OrderResultEvent.createOrder, без признаков сценария повтора) | Разработка | Open | Отдельный тикет по этому вопросу заводить не нужно — это подтверждение (создание заказа безопасно устроено) плюс ссылка на уже описанные выше находки (OQ4.2.2-2, OQ4.2.2-4) и на уже открытый дефект раздела 2.7 (см. его собственную сверку) и связанную находку раздела 2.6. Чинить в рамках тех разделов, не здесь. |