Документация ЛК
Модули

Главная

Модуль "Главная" (Dashboard)

Версия: 1.0
Дата: 2025-11-28
Статус: Частично реализован


Содержание

  1. Общее описание
  2. Текущая реализация
  3. Требования заказчика
  4. План реализации
  5. Технические детали
  6. Результат для заказчика

1. Общее описание

1.1 Предназначение модуля

Модуль "Главная" — это стартовая страница личного кабинета, которая:

  • Предоставляет быстрый доступ к ключевым функциям системы
  • Отображает актуальную сводку по задачам пользователя
  • Показывает уведомления о важных событиях
  • Визуализирует ключевые метрики и статистику

1.2 Роли пользователей

Рольgroup_idКол-во пользователейDashboard
Администратор16❌ Пустая страница
Дилер213✅ Реализован
Менеджер310❌ Пустая страница
Производство41❌ Пустая страница
Логист0❌ Роль не создана
Руководитель0❌ Роль не создана
Инженер0❌ Роль не создана

2. Текущая реализация

2.1 Архитектура

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 → (пусто)

2.2 Dashboard Дилера (✅ Реализован)

Файл: 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 поле)Файлы компании дилера
Контакт менеджераSidebarUser::find($dealer->manager_id)ФИО + телефон

Права доступа

ЭлементВидимостьИнтерактивность
Счётчик заказовТолько своиТолько просмотр
НовостиВсе опубликованныеПереход по клику
СкидкиТолько своиТолько просмотр
ФайлыТолько своей компанииСкачивание
Кнопка "Новый заказ"ВсегдаПереход в каталог

2.3 Dashboard Администратора/Менеджера/Производства

Текущее состояние: Пустая страница (только sidebar)

// dashboard.blade.php
@switch($groupId)
    @case(2)
        <x-dashboard.dealer />
        @break
    @default
        // ПУСТО - ничего не отображается
@endswitch

3. Требования заказчика

Источники:

  • /docs/Пояснительная_записка_к_системе_ЛК.docx
  • /docs/Список_проблем_и_задач_по_системе_ЛК_дилеров.docx
  • /docs/ТЗ_на_создание_кабинета_Дилера10_2023.docx

3.1 Dashboard Менеджера

Требуемые виджеты

ВиджетОписаниеПриоритет
Новые заказы от дилеровСписок непросмотренных заявок, выделение цветом🔴 Высокий
Значок уведомленийСчётчик непрочитанных, переход к задачам🔴 Высокий
Мои дилерыКарточки с количеством заказов🟡 Средний
Календарь монтажейФильтр по менеджеру, уведомления🟡 Средний
Заказы в производствеРаскрывающийся список🟢 Низкий
Календарь производстваСвободные слоты на заводах🟢 Низкий
НовостиДля внутренних коммуникаций🟢 Низкий

Макет (из ТЗ)

┌─────────────────────────────────────────────────────────────────────────┐
│                                                    🔔 (5) │ Иванов И.И. │
├─────────────────────────────────────────────────────────────────────────┤
│ SIDEBAR         │              MAIN CONTENT                             │
│                 │                                                       │
│ • Главная       │  ┌─ Новые заказы от дилеров ──────────────────────┐  │
│ • Заказы        │  │ 🔴 ООО "Рога и копыта" — Тверь CLASSIC 0,8НПН  │  │
│ • Мои дилеры    │  │ ⚪ ИП Петров — Кессон К-2                       │  │
│ • Календарь     │  │ ⚪ ОАО БухТех — Тверь PRO 1,5                   │  │
│ • Новости       │  └────────────────────────────────────────────────┘  │
│                 │                                                       │
│                 │  ┌─ Мои дилеры ─────┐  ┌─ Календарь монтажей ────┐   │
│                 │  │ ООО "Рога" (12)  │  │ Сегодня: 2 монтажа      │   │
│                 │  │ ИП Петров (5)    │  │ Завтра: 1 монтаж        │   │
│                 │  │ ОАО БухТех (8)   │  │ [Открыть календарь]     │   │
│                 │  └──────────────────┘  └─────────────────────────┘   │
│                 │                                                       │
│                 │  ┌─ Новости ─────────────────────────────────────┐   │
│                 │  │ 03.10.2025 — Новый прайс-лист                 │   │
│                 │  │ 01.10.2025 — Изменения в графике работы       │   │
│                 │  └───────────────────────────────────────────────┘   │
└─────────────────────────────────────────────────────────────────────────┘

3.2 Dashboard Администратора

Аналогичен менеджеру, но с дополнительными возможностями:

ДополнительноОписание
Все заказыБез фильтра по менеджеру
Все дилерыПолный список с фильтрами
СтатистикаСводка по продажам

3.3 Dashboard Производства

ВиджетОписаниеПриоритет
Заказы в производствеСписок активных заказов на заводе🔴 Высокий
План на сегодняЗаказы с датой изготовления = сегодня🔴 Высокий
Без серийных номеровЗаказы, ожидающие присвоения 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       │  │
│                 │                              └─────────────────────┘  │
└─────────────────────────────────────────────────────────────────────────┘

3.4 Dashboard Логиста (новая роль)

Требование из ТЗ: Роль "Логист" для сотрудника ТД ИО

ВиджетОписание
Заказы к отгрузкеСтатус "Произведено", планирование даты
Календарь отгрузокDrag&Drop перемещение заказов
МонтажиГрафик монтажных работ
Контроль оплатЗаказы с просроченной оплатой

3.5 Дополнения к Dashboard Дилера

ВиджетСтатусОписание
Значок уведомлений❌ НетНепрочитанные сообщения в чатах
Прайс-лист❌ НетОтдельная страница с ценами
Адреса складов❌ НетКарта/список складов самовывоза
Статус заказов⚠️ ЧастичноВизуальное выделение статусов

4. План реализации

4.1 Этап 1: Dashboard Менеджера/Админа (2-3 дня)

Создаваемые компоненты

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

4.2 Этап 2: Dashboard Производства (1-2 дня)

Создаваемые компоненты

app/View/Components/Dashboard/
├── Production.php
└── Widget/
    ├── TodayPlan.php           # План на сегодня
    ├── WithoutSn.php           # Без серийных номеров
    └── ProductionStats.php     # Статистика

4.3 Этап 3: Система уведомлений (2-3 дня)

Модель данных

// Новая таблица 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

<!-- 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>

4.4 Этап 4: Роль Логиста (3-5 дней)

  1. Создать группу "Логист" (group_id = 5)
  2. Настроить политики доступа
  3. Реализовать Dashboard с календарём отгрузок
  4. Добавить Drag&Drop в календарь

5. Технические детали

5.1 Виджет "Новые заказы"

// 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>

5.2 Виджет "План на сегодня" (Производство)

// 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');
    }
}

5.3 Права доступа по ролям

ВиджетАдминМенеджерДилерПроизводство
Новые заказы✅ Все✅ Своих дилеров
Мои дилеры✅ Все✅ Свои
Счётчик заказов✅ Все✅ Своих дилеров✅ Свои✅ Своего завода
Календарь монтажей✅ Свои
План на сегодня
Без SN
Скидки
Файлы компании
Уведомления

5.4 Интерактивность

ЭлементДействиеРезультат
Карточка заказаКликПереход в карточку заказа
Карточка дилераКликПереход в профиль дилера
УведомлениеКликПереход к источнику + пометка "прочитано"
ФайлКликСкачивание файла
"Показать все"КликПереход к полному списку
КалендарьКлик на деньФильтр заказов по дате

6. Результат для заказчика

6.1 Что получит Менеджер

ФункцияПольза
Виджет новых заказовМгновенное видение непросмотренных заявок, приоритизация работы
Цветовое выделениеВизуальное разделение новых/просмотренных заказов
Мои дилерыБыстрый доступ к карточкам дилеров и их истории
УведомленияНе пропустит важные события (новый заказ, сообщение в чате)
Календарь монтажейПланирование рабочего дня

6.2 Что получит Администратор

Всё то же + :

ФункцияПольза
Полный обзорВидит заказы всех менеджеров
СтатистикаАналитика по продажам
КонтрольМониторинг работы менеджеров

6.3 Что получит Производство

ФункцияПольза
План на сегодняЧёткий список станций к производству
Индикатор SNВидно, каким станциям нужно присвоить номер
СтатистикаПонимание загрузки

6.4 Что получит Дилер (дополнительно)

ФункцияПольза
УведомленияОперативное информирование о статусах заказов
Улучшенная визуализацияБолее понятный интерфейс

6.5 Метрики успеха

МетрикаДоПосле (ожидание)
Время поиска нового заказа30-60 сек (через список)0 сек (на главной)
Пропущенные заказыВозможноНевозможно (уведомления)
Ошибки производства (без SN)ВозможноМинимум (визуальный контроль)
Удобство работы (субъективно)НизкоеВысокое

Приложение A: Дизайн-референсы

Цветовая схема виджетов

ТипЦвет фонаЦвет акцента
Информационный#E5EEF5 (голубой)#344694 (синий)
Предупреждение#FEF3C7 (жёлтый)#D97706 (оранжевый)
Ошибка/Срочно#FEE2E2 (красный)#DC2626 (красный)
Успех#D1FAE5 (зелёный)#059669 (зелёный)

Иконки (Heroicons)

ВиджетИконка
Новые заказыheroicon-o-inbox
Дилерыheroicon-o-user-group
Календарьheroicon-o-calendar
Уведомленияheroicon-o-bell
Производствоheroicon-o-cog
Статистикаheroicon-o-chart-bar

Приложение B: SQL-запросы для виджетов

Новые заказы менеджера

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

On this page

Модуль "Главная" (Dashboard)Содержание1. Общее описание1.1 Предназначение модуля1.2 Роли пользователей2. Текущая реализация2.1 Архитектура2.2 Dashboard Дилера (✅ Реализован)Структура интерфейсаВиджетыПрава доступа2.3 Dashboard Администратора/Менеджера/Производства3. Требования заказчика3.1 Dashboard МенеджераТребуемые виджетыМакет (из ТЗ)3.2 Dashboard Администратора3.3 Dashboard ПроизводстваМакет3.4 Dashboard Логиста (новая роль)3.5 Дополнения к Dashboard Дилера4. План реализации4.1 Этап 1: Dashboard Менеджера/Админа (2-3 дня)Создаваемые компонентыИзменения в существующих файлах4.2 Этап 2: Dashboard Производства (1-2 дня)Создаваемые компоненты4.3 Этап 3: Система уведомлений (2-3 дня)Модель данныхКомпонент в navbar4.4 Этап 4: Роль Логиста (3-5 дней)5. Технические детали5.1 Виджет "Новые заказы"5.2 Виджет "План на сегодня" (Производство)5.3 Права доступа по ролям5.4 Интерактивность6. Результат для заказчика6.1 Что получит Менеджер6.2 Что получит Администратор6.3 Что получит Производство6.4 Что получит Дилер (дополнительно)6.5 Метрики успехаПриложение A: Дизайн-референсыЦветовая схема виджетовИконки (Heroicons)Приложение B: SQL-запросы для виджетовНовые заказы менеджераПлан производства на сегодня