AddLayoutPanoramaShootingTaskCommand
Назначение
Добавление задачи панорамной съёмки по планировке в очередь. Задача содержит тип LayoutPoint, идентификаторы пресетов, планировку и список точек съёмки (Points в JSONB).
Цель
Поставить в очередь задачу на съёмку панорам по точкам планировки для последующего выполнения воркером (запуск, завершение, heartbeat).
Command: AddLayoutPanoramaShootingTaskCommand (Входные данные)
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
| ChessboardProjectId | long | Обязательное | Идентификатор проекта |
| PropertyLayoutId | long | Обязательное | Идентификатор планировки |
| PresetIds | Guid[] | Обязательное | Идентификаторы пресетов |
| Points | массив точек (PointId и др.) | Обязательное | Данные по точкам съёмки для постановки в очередь |
примечание
TenantId берётся из контекста запроса.
Result: AddLayoutPanoramaShootingTaskCommandResult (Выходные данные)
| Поле | Тип | Обязательность | Описание |
|---|---|---|---|
| TaskId | Guid | Обязательное | Идентификатор созданной задачи |
Валидация
- Проект с ChessboardProjectId должен существовать. Получить из БД; если не найден — вернуть ошибку.
- Планировка с PropertyLayoutId должна существовать и принадлежать проекту. Если не найдена — вернуть ошибку.
Ограничения
- Очередь по проекту создаётся при необходимости (если ещё нет записи PanoramasQueueEntity по ChessboardProjectId).
Бизнес-логика (Handler)
- Провалидировать зависимости: получить ChessboardProjectEntity по ChessboardProjectId и ChessboardProjectPropertyLayoutEntity по PropertyLayoutId. Если любая не найдена — вернуть ошибку.
- Найти или создать очередь PanoramasQueueEntity по ChessboardProjectId (и TenantId). Если очереди нет — создать запись очереди.
- Создать сущность PanoramasQueueTaskEntity в таблице PanoramasQueueTaskEntity: QueueId, TaskType = LayoutPoint, Status = Pending, PresetIds, ChessboardProjectId, PropertyLayoutId, PropertyObjectId = null, Points = сериализованные данные из команды.
- Сохранить в БД. Сформировать результат (TaskId = Id задачи). Вернуть результат клиенту.
События
Задача подхватывается воркером по очереди; при запуске вызывается StartQueueTask и т.д. Отдельные Kafka-события при добавлении задачи не обязательны.
Связанные сущности
- ChessboardProjectEntity
- ChessboardProjectPropertyLayoutEntity
- PanoramasQueueEntity
- PanoramasQueueTaskEntity
- PanoramaQueueTaskType, PanoramaQueueTaskStatus
API
QueueTasksController.AddLayoutPanoramaShootingTask — POST add