| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481 |
- @extends('layouts.app')
- @php
- $labels_manager = $notDone = $labels = '';
- $la = [];
- foreach ($mountMafsType as $id => $count) {
- $la[] = $objectTypes[$id] . ' ' . $mountMafsType[$id] .'/'. $notMountMafsType[$id];
- $labels .= '"' . $objectTypes[$id] . ' (' . $mountMafsType[$id] .'/'. $notMountMafsType[$id] . ')",';
- $notDone .= '[' . $totalMafsType[$id] . ', ' . $mountMafsType[$id] . '],';
- }
- foreach ($doneMafsManager as $id => $count) {
- $labels_manager .= '"' . $managers[$id] . ' (' . $doneMafsManager[$id] .'/'. $notDoneMafsManager[$id] . ')",';
- }
- @endphp
- @section('content')
- <div class="row mb-2">
- <div class="col-md-6">
- <h3>Отчеты</h3>
- </div>
- <div class="col-md-6 text-center">
- <div class="fw-bold fs-2 lh-1">{{ year() }}</div>
- </div>
- </div>
- <ul class="nav nav-tabs report-tabs" id="myTab" role="tablist">
- <li class="nav-item" role="presentation">
- <button class="nav-link active" id="home-tab" data-bs-toggle="tab" data-bs-target="#mount" type="button"
- role="tab" aria-controls="mount" aria-selected="true">Монтаж МАФ
- </button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="profile-tab" data-bs-toggle="tab" data-bs-target="#done" type="button"
- role="tab" aria-controls="done" aria-selected="false">Сдача МАФ
- </button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="contact-tab" data-bs-toggle="tab" data-bs-target="#all" type="button"
- role="tab" aria-controls="all" aria-selected="false">Свод
- </button>
- </li>
- <li class="nav-item" role="presentation">
- <button class="nav-link" id="disabled-tab" data-bs-toggle="tab" data-bs-target="#reclamation" type="button"
- role="tab" aria-controls="reclamations" aria-selected="false">Рекламации
- </button>
- </li>
- </ul>
- <div class="tab-content border-end border-start border-bottom report-tab-content" id="myTabContent">
- <div class="tab-pane fade show active" id="mount" role="tabpanel" aria-labelledby="home-tab" tabindex="0">
- <div class="row">
- <div class="col-12 text-center">
- <h1 class="text-success my-3">Выполнение плана по монтажу МАФ</h1>
- </div>
- </div>
- <div class="row">
- <div class="col-xl-4 mb-2">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $totalMafs }} / {{ $totalOrders }}
- </div>
- <div class="text-center">
- Всего МАФ / Площадок
- </div>
- </div>
- <div class="col-xl-4 mb-2">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $mountMafs }} / {{ $mountOrders }}
- </div>
- <div class="text-center">
- Установлено МАФ / Площадок
- </div>
- </div>
- <div class="col-xl-4 mb-2">
- <div class="text-center text-success fs-6 fw-bold">
- {{ implode('; ', $la) }}
- </div>
- <div class="text-center">
- Установлено по типам объекта
- </div>
- </div>
- </div>
- <div class="col-12 border-top my-3"></div>
- <div class="row align-items-center">
- <div class="col-xl-6">
- <div class="ms-md-5 ps-md-5 max-h-50vh">
- <canvas id="total_orders" class="mx-4"></canvas>
- </div>
- </div>
- <div class="col-xl-6 ">
- <div class=" mb-3">
- <canvas id="order_types" class="mx-4 max-h-50vh"></canvas>
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane fade" id="done" role="tabpanel" aria-labelledby="home-tab" tabindex="1">
- <div class="row">
- <div class="col-12 text-center">
- <h1 class="text-success my-3">Выполнение плана по сдаче МАФ</h1>
- </div>
- </div>
- <div class="row">
- <div class="col-xl-4">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $totalMafs }} / {{ $totalOrders }}
- </div>
- <div class="text-center">
- Всего МАФ / Площадок
- </div>
- </div>
- <div class="col-xl-4">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $doneMafs }} / {{ $doneOrders }}
- </div>
- <div class="text-center">
- Сдано МАФ / Площадок
- </div>
- </div>
- <div class="col-xl-4">
- <div class="text-center text-success fs-4 fw-bold">
- {!! $totalMountSum !!}
- </div>
- <div class="text-center">
- Сдано на сумму
- </div>
- </div>
- </div>
- <div class="col-12 border-top my-3"></div>
- <div class="row align-items-center">
- <div class="col-xl-6 align-middle">
- <div class="ms-md-5 ps-md-5 max-h-50vh">
- <canvas id="done_orders" class="mx-4"></canvas>
- </div>
- </div>
- <div class="col-xl-6 align-middle">
- <div class=" mb-3">
- <canvas id="done_users" class="mx-4"></canvas>
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane fade" id="all" role="tabpanel" aria-labelledby="home-tab" tabindex="2">
- <div class="row">
- <div class="col-12 text-center">
- <h1 class="text-success my-3">Свод по МАФ</h1>
- </div>
- </div>
- <div class="row">
- <div class="col">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $totalMafs }} / {{ $totalOrders }}
- </div>
- <div class="text-center">
- Всего МАФ / Площадок
- </div>
- </div>
- @foreach($orderStatuses as $name => $orders)
- <div class="col">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $orderMafStatuses[$name] }} / {{ $orders }}
- </div>
- <div class="text-center">
- {{ $name }}
- </div>
- </div>
- @endforeach
- </div>
- <div class="col-12 border-top my-3"></div>
- <div class="row">
- <div class="col-12">
- @include('reports.svod')
- </div>
- </div>
- <div class="col-12 border-top my-3"></div>
- <div class="row">
- <div class="col">
- <div class="text-center text-success fs-4 fw-bold">
- {!! $totalSum !!}
- </div>
- <div class="text-center">
- Всего МАФ на сумму
- </div>
- </div>
- <div class="col">
- <div class="text-center text-success fs-4 fw-bold">
- {!! $totalDoneSum !!}
- </div>
- <div class="text-center">
- Сдано МАФ на сумму
- </div>
- </div>
- </div>
- </div>
- <div class="tab-pane fade" id="reclamation" role="tabpanel" aria-labelledby="home-tab" tabindex="3">
- <div class="row">
- <div class="col-12 text-center">
- <h1 class="text-success my-3">Отчет по рекламациям</h1>
- </div>
- </div>
- <div class="row">
- <div class="col">
- <div class="text-center text-success fs-5 fw-bold">
- {{ $totalReclamations }}
- </div>
- <div class="text-center">
- Всего рекламаций
- </div>
- </div>
- @foreach($reclamations as $name => $r)
- <div class="col">
- <div class="text-center text-success fs-4 fw-bold">
- {{ $r }}
- </div>
- <div class="text-center">
- {{ $name }}
- </div>
- </div>
- @endforeach
- </div>
- <div class="col-12 border-top my-3"></div>
- <div class="row ">
- <div class="col-xl-6 p-3">
- <h4 class="text-success">
- Общий свод по МАФ
- </h4>
- <div class="table-responsive js-subtable-scroll">
- <table class="table js-sortable-table" id="table-mafs">
- <thead>
- <tr>
- <th class="sortable" data-col="0" data-dir="asc" style="cursor:pointer;user-select:none">Артикул МАФ <span class="sort-icon"></span></th>
- <th class="sortable" data-col="1" data-dir="asc" style="cursor:pointer;user-select:none">Кол-во <span class="sort-icon"></span></th>
- </tr>
- </thead>
- <tbody>
- @foreach($reclamationMafs as $n => $val)
- <tr>
- <td>{{ $n }}</td>
- <td>{{ $val }}</td>
- </tr>
- @endforeach
- </tbody>
- </table>
- </div>
- </div>
- <div class="col-xl-6 p-3">
- <h4 class="text-success">
- Общий свод по деталям
- </h4>
- <div class="table-responsive js-subtable-scroll">
- <table class="table js-sortable-table" id="table-details">
- <thead>
- <tr>
- <th class="sortable" data-col="0" data-dir="asc" style="cursor:pointer;user-select:none">Деталь <span class="sort-icon"></span></th>
- <th class="sortable" data-col="1" data-dir="asc" style="cursor:pointer;user-select:none">Кол-во <span class="sort-icon"></span></th>
- </tr>
- </thead>
- <tbody>
- @foreach($reclamationDetails as $n => $val)
- <tr>
- <td>{{ $n }}</td>
- <td>{{ $val }}</td>
- </tr>
- @endforeach
- </tbody>
- </table>
- </div>
- </div>
- </div>
- </div>
- </div>
- {{--@dump($reclamationMafs, $reclamationDetails)--}}
- @endsection
- @push('scripts')
- <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
- <script>
- const ctx = document.getElementById('order_types');
- new Chart(ctx, {
- type: 'bar',
- data: {
- labels: [{!! $labels !!}],
- datasets: [
- {
- label: 'Установлено',
- data: [{{ implode(',', $mountMafsType) }}],
- borderWidth: 1,
- backgroundColor: [
- 'rgb(114,180,150)',
- ],
- grouped: false,
- },
- {
- label: 'Осталось установить',
- data: [{{ $notDone }}],
- borderWidth: 1,
- backgroundColor: [
- 'rgb(251,215,105)',
- ],
- grouped: false,
- }
- ]
- },
- options: {
- scales: {
- y: {
- beginAtZero: true
- }
- },
- }
- });
- // by users
- const ctx1 = document.getElementById('done_users');
- new Chart(ctx1, {
- type: 'bar',
- data: {
- labels: [{!! $labels_manager !!}],
- datasets: [
- {
- label: 'Сдано',
- data: [{{ implode(',', $doneMafsManager) }}],
- borderWidth: 1,
- backgroundColor: [
- 'rgb(114,180,150)',
- ],
- grouped: false,
- },
- {
- label: 'Осталось сдать',
- data: [{{ implode(',', $notDoneMafsManager) }}],
- borderWidth: 1,
- backgroundColor: [
- 'rgb(251,215,105)',
- ],
- grouped: false,
- }
- ]
- },
- options: {
- scales: {
- y: {
- beginAtZero: true
- }
- },
- }
- });
- // круговая диаграмма 1
- let circleDiag = document.getElementById('total_orders');
- new Chart(circleDiag, {
- type: 'doughnut',
- data: {
- labels: ['Установлено', 'Осталось установить'],
- datasets: [{
- data: [{{ $doneMafs }}, {{ $totalMafs - $doneMafs }}],
- backgroundColor: [
- 'rgb(114,180,150)',
- 'rgb(251,215,105)',
- ]
- }],
- },
- });
- // круговая диаграмма 2
- let circleDiag2 = document.getElementById('done_orders');
- new Chart(circleDiag2, {
- type: 'doughnut',
- data: {
- labels: ['Установлено', 'Осталось установить'],
- datasets: [{
- data: [{{ $doneMafs }}, {{ $totalMafs - $doneMafs }}],
- backgroundColor: [
- 'rgb(114,180,150)',
- 'rgb(251,215,105)',
- ]
- }],
- },
- });
- // Сортировка таблиц рекламаций
- function sortTable(table, colIndex, dir) {
- const tbody = table.querySelector('tbody');
- const rows = Array.from(tbody.querySelectorAll('tr'));
- rows.sort((a, b) => {
- const aVal = a.cells[colIndex].textContent.trim();
- const bVal = b.cells[colIndex].textContent.trim();
- const aNum = parseFloat(aVal);
- const bNum = parseFloat(bVal);
- const isNum = !isNaN(aNum) && !isNaN(bNum);
- let cmp = isNum ? aNum - bNum : aVal.localeCompare(bVal, 'ru');
- return dir === 'desc' ? -cmp : cmp;
- });
- rows.forEach(r => tbody.appendChild(r));
- }
- function initSortableTable(table, defaultCol, defaultDir) {
- const headers = table.querySelectorAll('th.sortable');
- let currentCol = defaultCol;
- let currentDir = defaultDir;
- function updateIcons() {
- headers.forEach(h => {
- const icon = h.querySelector('.sort-icon');
- const col = parseInt(h.dataset.col);
- if (col === currentCol) {
- icon.innerHTML = currentDir === 'asc'
- ? '<i class="bi bi-arrow-down-square-fill text-primary"></i>'
- : '<i class="bi bi-arrow-up-square-fill text-primary"></i>';
- } else {
- icon.innerHTML = '';
- }
- });
- }
- headers.forEach(th => {
- th.addEventListener('click', () => {
- const col = parseInt(th.dataset.col);
- if (col === currentCol) {
- currentDir = currentDir === 'asc' ? 'desc' : 'asc';
- } else {
- currentCol = col;
- currentDir = col === 1 ? 'desc' : 'asc';
- }
- sortTable(table, currentCol, currentDir);
- updateIcons();
- });
- });
- sortTable(table, currentCol, currentDir);
- updateIcons();
- }
- document.querySelectorAll('.js-sortable-table').forEach(table => {
- initSortableTable(table, 1, 'desc');
- });
- </script>
- @endpush
|