Модули
Главная
Версия: 1.0
Дата: 2025-11-28
Статус: Частично реализован
Общее описание
Текущая реализация
Требования заказчика
План реализации
Технические детали
Результат для заказчика
Модуль "Главная" — это стартовая страница личного кабинета, которая:
Предоставляет быстрый доступ к ключевым функциям системы
Отображает актуальную сводку по задачам пользователя
Показывает уведомления о важных событиях
Визуализирует ключевые метрики и статистику
Роль group_id Кол-во пользователей Dashboard Администратор 1 6 ❌ Пустая страница Дилер 2 13 ✅ Реализован Менеджер 3 10 ❌ Пустая страница Производство 4 1 ❌ Пустая страница Логист — 0 ❌ Роль не создана Руководитель — 0 ❌ Роль не создана Инженер — 0 ❌ Роль не создана
routes/web.php
└── GET / → DashboardController@index
app/Http/Controllers/DashboardController.php
└── return view('templates.dashboard', ['groupId' => $user->group_id])
resources/views/templates/dashboard.blade.php
└── @switch($groupId)
├── @case(2) → <x-dashboard.dealer />
└── @default → (пусто)
Файл: resources/views/components/dashboard/dealer.blade.php
┌─────────────────────────────────────────────────────────────────────────┐
│ SIDEBAR │ MAIN CONTENT │
│ │ │
│ • Главная │ ┌─────────────────┐ ┌──────────────────┐ │
│ • Заказы │ │ 11 Всего заказов│ │ [Новый заказ] │ │
│ • Новости │ │ На сумму 1.4М р.│ └──────────────────┘ │
│ • Календарь │ └─────────────────┘ │
│ • Каталог │ │
│ │ ┌─ Новости ─────────────────────────────┐ │
│ [Новый заказ] │ │ ┌────────┐ ┌────────┐ ┌────────┐ │ │
│ │ │ │Новость1│ │Новость2│ │Новость3│ │ │
│ Менеджер: │ │ └────────┘ └────────┘ └────────┘ │ │
│ Александрова М.С. │ └────────────────────────────────────────┘ │
│ +7(352) 222 98 99 │ │
│ │ ┌─ Скидки ─────┐ ┌─ Файлы ──────────┐ │
│ │ │ 20% Базовая │ │ • ghcngvh.png │ │
│ │ │ 25% LITE │ │ • договор.pdf │ │
│ │ │ 30% CLASSIC │ └──────────────────┘ │
│ │ │ 35% AERO │ │
│ │ └──────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
Виджет Компонент Источник данных Описание Счётчик заказов Widget/OrdersOrder::where('dealer_id', $user->id)Количество и сумма заказов дилера Кнопка "Новый заказ" Inline — Ссылка на /catalog Новости Widget/NewsWidgetNews::where('published', true)->paginate(6)6 последних новостей Скидки Widget/DiscountCategoryCompany::where('company_id', ...)Базовая + по категориям Файлы FilesCompany->files (JSON поле)Файлы компании дилера Контакт менеджера Sidebar User::find($dealer->manager_id)ФИО + телефон
Элемент Видимость Интерактивность Счётчик заказов Только свои Только просмотр Новости Все опубликованные Переход по клику Скидки Только свои Только просмотр Файлы Только своей компании Скачивание Кнопка "Новый заказ" Всегда Переход в каталог
Текущее состояние: Пустая страница (только sidebar)
// dashboard.blade.php
@switch ($groupId)
@case( 2 )
<x-dashboard.dealer />
@break
@default
// ПУСТО - ничего не отображается
@endswitch
Источники:
/docs/Пояснительная_записка_к_системе_ЛК.docx
/docs/Список_проблем_и_задач_по_системе_ЛК_дилеров.docx
/docs/ТЗ_на_создание_кабинета_Дилера10_2023.docx
Виджет Описание Приоритет Новые заказы от дилеров Список непросмотренных заявок, выделение цветом 🔴 Высокий Значок уведомлений Счётчик непрочитанных, переход к задачам 🔴 Высокий Мои дилеры Карточки с количеством заказов 🟡 Средний Календарь монтажей Фильтр по менеджеру, уведомления 🟡 Средний Заказы в производстве Раскрывающийся список 🟢 Низкий Календарь производства Свободные слоты на заводах 🟢 Низкий Новости Для внутренних коммуникаций 🟢 Низкий
┌─────────────────────────────────────────────────────────────────────────┐
│ 🔔 (5) │ Иванов И.И. │
├─────────────────────────────────────────────────────────────────────────┤
│ SIDEBAR │ MAIN CONTENT │
│ │ │
│ • Главная │ ┌─ Новые заказы от дилеров ──────────────────────┐ │
│ • Заказы │ │ 🔴 ООО "Рога и копыта" — Тверь CLASSIC 0,8НПН │ │
│ • Мои дилеры │ │ ⚪ ИП Петров — Кессон К-2 │ │
│ • Календарь │ │ ⚪ ОАО БухТех — Тверь PRO 1,5 │ │
│ • Новости │ └────────────────────────────────────────────────┘ │
│ │ │
│ │ ┌─ Мои дилеры ─────┐ ┌─ Календарь монтажей ────┐ │
│ │ │ ООО "Рога" (12) │ │ Сегодня: 2 монтажа │ │
│ │ │ ИП Петров (5) │ │ Завтра: 1 монтаж │ │
│ │ │ ОАО БухТех (8) │ │ [Открыть календарь] │ │
│ │ └──────────────────┘ └─────────────────────────┘ │
│ │ │
│ │ ┌─ Новости ─────────────────────────────────────┐ │
│ │ │ 03.10.2025 — Новый прайс-лист │ │
│ │ │ 01.10.2025 — Изменения в графике работы │ │
│ │ └───────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
Аналогичен менеджеру, но с дополнительными возможностями:
Дополнительно Описание Все заказы Без фильтра по менеджеру Все дилеры Полный список с фильтрами Статистика Сводка по продажам
Виджет Описание Приоритет Заказы в производстве Список активных заказов на заводе 🔴 Высокий План на сегодня Заказы с датой изготовления = сегодня 🔴 Высокий Без серийных номеров Заказы, ожидающие присвоения SN 🔴 Высокий Произведённые Готовые к отгрузке 🟡 Средний Календарь производства Загрузка по дням 🟡 Средний
┌─────────────────────────────────────────────────────────────────────────┐
│ SIDEBAR │ MAIN CONTENT │
│ │ │
│ • Главная │ ┌─ План на сегодня (3 станции) ──────────────────┐ │
│ • Заказы │ │ #2025_10_14 — Тверь CLASSIC 0,8НПН — ⚠️ Нет SN │ │
│ • Календарь │ │ #2025_10_13 — Тверь PRO 1,5 — ✅ SN: 12345 │ │
│ │ │ #2025_10_12 — Кессон К-2 — ⚠️ Нет SN │ │
│ │ └────────────────────────────────────────────────┘ │
│ │ │
│ │ ┌─ Без серийных номеров ─┐ ┌─ Статистика ───────┐ │
│ │ │ 5 станций ожидают SN │ │ Сегодня: 3 │ │
│ │ │ [Открыть список] │ │ На неделе: 12 │ │
│ │ └────────────────────────┘ │ В месяце: 45 │ │
│ │ └─────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────┘
Требование из ТЗ: Роль "Логист" для сотрудника ТД ИО
Виджет Описание Заказы к отгрузке Статус "Произведено", планирование даты Календарь отгрузок Drag&Drop перемещение заказов Монтажи График монтажных работ Контроль оплат Заказы с просроченной оплатой
Виджет Статус Описание Значок уведомлений ❌ Нет Непрочитанные сообщения в чатах Прайс-лист ❌ Нет Отдельная страница с ценами Адреса складов ❌ Нет Карта/список складов самовывоза Статус заказов ⚠️ Частично Визуальное выделение статусов
app/View/Components/
├── Dashboard/
│ ├── Manager.php # Главный компонент
│ └── Widget/
│ ├── NewOrders.php # Новые заказы
│ ├── MyDealers.php # Мои дилеры
│ ├── TodayMontages.php # Монтажи сегодня
│ └── Notifications.php # Уведомления
resources/views/components/dashboard/
├── manager.blade.php
└── widget/
├── new-orders.blade.php
├── my-dealers.blade.php
├── today-montages.blade.php
└── notifications.blade.php
// dashboard.blade.php
@switch ($groupId)
@case( 1 ) // Администратор
<x-dashboard.manager :isAdmin="true" />
@break
@case( 2 ) // Дилер
<x-dashboard.dealer />
@break
@case( 3 ) // Менеджер
<x-dashboard.manager />
@break
@case( 4 ) // Производство
<x-dashboard.production />
@break
@default
@endswitch
app/View/Components/Dashboard/
├── Production.php
└── Widget/
├── TodayPlan.php # План на сегодня
├── WithoutSn.php # Без серийных номеров
└── ProductionStats.php # Статистика
// Новая таблица notifications
Schema :: create ( 'notifications' , function ( Blueprint $table) {
$table -> id ();
$table -> foreignId ( 'user_id' ) -> constrained ();
$table -> string ( 'type' ); // order_new, chat_message, status_change
$table -> morphs ( 'notifiable' ); // Полиморфная связь
$table -> text ( 'message' );
$table -> boolean ( 'read' ) -> default ( false );
$table -> timestamps ();
});
<!-- navbar.blade.php -->
< div class = "relative" >
< button @click ="showNotifications = !showNotifications " >
< x-heroicon-o-bell class = "w-6 h-6" />
@if ($unreadCount > 0 )
< span class = "absolute -top-1 -right-1 bg-red-500 text-white text-xs rounded-full px-1" >
{{ $unreadCount }}
</ span >
@endif
</ button >
< div x-show = "showNotifications" class = "absolute right-0 mt-2 w-80 bg-white shadow-lg rounded-lg" >
@foreach ($notifications as $notification)
< a href = " {{ $notification -> url }} " class = "block p-3 hover:bg-gray-50" >
{{ $notification -> message }}
</ a >
@endforeach
</ div >
</ div >
Создать группу "Логист" (group_id = 5)
Настроить политики доступа
Реализовать Dashboard с календарём отгрузок
Добавить Drag&Drop в календарь
// app/View/Components/Dashboard/Widget/NewOrders.php
<? php
namespace App\View\Components\Dashboard\Widget ;
use App\Models\Order ;
use App\Models\Status ;
use Illuminate\View\Component ;
class NewOrders extends Component
{
public $orders;
public $isAdmin;
public function __construct ( bool $isAdmin = false )
{
$this -> isAdmin = $isAdmin;
$query = Order :: with ([ 'dealer.company' , 'product' , 'status' ])
-> whereIn ( 'status_id' , [
Status :: where ( 'key' , 'new' ) -> first () ?-> id,
Status :: where ( 'key' , 'awaiting_sign' ) -> first () ?-> id,
])
-> orderBy ( 'created_at' , 'desc' );
// Менеджер видит только заказы своих дилеров
if ( ! $isAdmin) {
$user = auth () -> user ();
$dealerIds = \App\Models\User :: where ( 'manager_id' , $user -> id) -> pluck ( 'id' );
$query -> whereIn ( 'dealer_id' , $dealerIds);
}
$this -> orders = $query -> limit ( 10 ) -> get ();
}
public function render ()
{
return view ( 'components.dashboard.widget.new-orders' );
}
}
<!-- resources/views/components/dashboard/widget/new-orders.blade.php -->
< div class = "bg-white rounded-lg shadow p-4" >
< h3 class = "text-lg font-semibold mb-3 flex items-center" >
< x-heroicon-o-inbox class = "w-5 h-5 mr-2 text-blue-500" />
Новые заказы от дилеров
@if ($orders -> count () > 0 )
< span class = "ml-2 bg-red-500 text-white text-xs px-2 py-1 rounded-full" >
{{ $orders -> count () }}
</ span >
@endif
</ h3 >
@forelse ($orders as $order)
< a href = " {{ route ('order-edit', $order -> id ) }} "
class = "block p-3 mb-2 rounded-lg transition
{{ $order -> viewed ? 'bg-gray-50' : 'bg-blue-50 border-l-4 border-blue-500' }}
hover:bg-gray-100" >
< div class = "flex justify-between items-start" >
< div >
< span class = "font-medium" > {{ $order -> dealer -> company -> name ?? 'Без компании' }} </ span >
< p class = "text-sm text-gray-600" > {{ $order -> product -> name ?? 'Товар не выбран' }} </ p >
</ div >
< div class = "text-right" >
< span class = "text-xs text-gray-500" > {{ $order -> created_at -> format ( 'd.m.Y' ) }} </ span >
< p class = "text-sm font-medium" > @formatPrice ($order -> cost) ₽</ p >
</ div >
</ div >
</ a >
@empty
< p class = "text-gray-500 text-center py-4" >Нет новых заказов</ p >
@endforelse
@if ($orders -> count () >= 10 )
< a href = " {{ route ('orders') }} ?status=new" class = "block text-center text-blue-600 mt-3" >
Показать все →
</ a >
@endif
</ div >
// app/View/Components/Dashboard/Widget/TodayPlan.php
<? php
namespace App\View\Components\Dashboard\Widget ;
use App\Models\Order ;
use App\Models\Status ;
use Illuminate\View\Component ;
use Carbon\Carbon ;
class TodayPlan extends Component
{
public $orders;
public $manufactureId;
public function __construct ()
{
$user = auth () -> user ();
$this -> manufactureId = $user -> manufacture_id;
$productionStatusId = Status :: where ( 'key' , 'in_production' ) -> first () ?-> id;
$this -> orders = Order :: with ([ 'product' , 'items' ])
-> where ( 'status_id' , $productionStatusId)
-> where ( 'manufacture_id' , $this -> manufactureId)
-> whereDate ( 'date_manufacture' , Carbon :: today ())
-> orderBy ( 'date_manufacture' )
-> get ();
}
public function render ()
{
return view ( 'components.dashboard.widget.today-plan' );
}
}
Виджет Админ Менеджер Дилер Производство Новые заказы ✅ Все ✅ Своих дилеров ❌ ❌ Мои дилеры ✅ Все ✅ Свои ❌ ❌ Счётчик заказов ✅ Все ✅ Своих дилеров ✅ Свои ✅ Своего завода Календарь монтажей ✅ ✅ ✅ Свои ❌ План на сегодня ❌ ❌ ❌ ✅ Без SN ❌ ❌ ❌ ✅ Скидки ❌ ❌ ✅ ❌ Файлы компании ❌ ❌ ✅ ❌ Уведомления ✅ ✅ ✅ ✅
Элемент Действие Результат Карточка заказа Клик Переход в карточку заказа Карточка дилера Клик Переход в профиль дилера Уведомление Клик Переход к источнику + пометка "прочитано" Файл Клик Скачивание файла "Показать все" Клик Переход к полному списку Календарь Клик на день Фильтр заказов по дате
Функция Польза Виджет новых заказов Мгновенное видение непросмотренных заявок, приоритизация работы Цветовое выделение Визуальное разделение новых/просмотренных заказов Мои дилеры Быстрый доступ к карточкам дилеров и их истории Уведомления Не пропустит важные события (новый заказ, сообщение в чате) Календарь монтажей Планирование рабочего дня
Всё то же + :
Функция Польза Полный обзор Видит заказы всех менеджеров Статистика Аналитика по продажам Контроль Мониторинг работы менеджеров
Функция Польза План на сегодня Чёткий список станций к производству Индикатор SN Видно, каким станциям нужно присвоить номер Статистика Понимание загрузки
Функция Польза Уведомления Оперативное информирование о статусах заказов Улучшенная визуализация Более понятный интерфейс
Метрика До После (ожидание) Время поиска нового заказа 30-60 сек (через список) 0 сек (на главной) Пропущенные заказы Возможно Невозможно (уведомления) Ошибки производства (без SN) Возможно Минимум (визуальный контроль) Удобство работы (субъективно) Низкое Высокое
Тип Цвет фона Цвет акцента Информационный #E5EEF5 (голубой)#344694 (синий)Предупреждение #FEF3C7 (жёлтый)#D97706 (оранжевый)Ошибка/Срочно #FEE2E2 (красный)#DC2626 (красный)Успех #D1FAE5 (зелёный)#059669 (зелёный)
Виджет Иконка Новые заказы heroicon-o-inboxДилеры heroicon-o-user-groupКалендарь heroicon-o-calendarУведомления heroicon-o-bellПроизводство heroicon-o-cogСтатистика heroicon-o-chart-bar
SELECT o. * , c . name as company_name, p . name as product_name
FROM orders o
LEFT JOIN users d ON o . dealer_id = d . id
LEFT JOIN companies c ON d . company_id = c . id
LEFT JOIN products p ON o . product_id = p . id
WHERE o . status_id IN ( 1 , 2 ) -- new, awaiting_sign
AND d . manager_id = :current_user_id
AND o . deleted_at IS NULL
ORDER BY o . created_at DESC
LIMIT 10 ;
SELECT o. * , p . name as product_name,
( SELECT COUNT ( * ) FROM order_items WHERE order_id = o . id AND sn IS NULL ) as items_without_sn
FROM orders o
LEFT JOIN products p ON o . product_id = p . id
WHERE o . status_id = :in_production_status_id
AND o . manufacture_id = :current_user_manufacture_id
AND DATE ( o . date_manufacture ) = CURDATE()
AND o . deleted_at IS NULL
ORDER BY o . date_manufacture ;
Документ подготовлен на основе анализа исходного кода и требований из /docs