Browse Source

added spare parts images

Alexander Musikhin 1 month ago
parent
commit
36358b0360
100 changed files with 155 additions and 4 deletions
  1. 7 0
      app/Helpers/roles.php
  2. 3 0
      app/Http/Controllers/SparePartController.php
  3. 17 4
      app/Models/SparePart.php
  4. 65 0
      docs/spare-parts.md
  5. 63 0
      public/images/readme.md
  6. BIN
      public/images/spare_parts/0000.0000.0041.jpg
  7. BIN
      public/images/spare_parts/0000.0000.0046.jpg
  8. BIN
      public/images/spare_parts/0000.0000.0094 .jpg
  9. BIN
      public/images/spare_parts/0000.0000.0136.jpg
  10. BIN
      public/images/spare_parts/0000.0000.0137.jpg
  11. BIN
      public/images/spare_parts/0000.0000.0290.jpg
  12. BIN
      public/images/spare_parts/0000.0000.0314.jpg
  13. BIN
      public/images/spare_parts/0000.0000.0337.jpg
  14. BIN
      public/images/spare_parts/0000.0000.0483_50.jpg
  15. BIN
      public/images/spare_parts/0000.0000.0483_70.jpg
  16. BIN
      public/images/spare_parts/0000.0000.0486.jpg
  17. BIN
      public/images/spare_parts/0000.0000.0592.jpg
  18. BIN
      public/images/spare_parts/0000.0000.0600.jpg
  19. BIN
      public/images/spare_parts/0000.0000.0628.jpg
  20. BIN
      public/images/spare_parts/0000.0000.1660.jpg
  21. BIN
      public/images/spare_parts/0000.0000.1666.jpg
  22. BIN
      public/images/spare_parts/0000.0000.1668.jpg
  23. BIN
      public/images/spare_parts/0000.0000.1673.jpg
  24. BIN
      public/images/spare_parts/0000.0000.1675.jpg
  25. BIN
      public/images/spare_parts/0000.0000.1679.jpg
  26. BIN
      public/images/spare_parts/0000.0000.1681.jpg
  27. BIN
      public/images/spare_parts/0000.0000.1683.jpg
  28. BIN
      public/images/spare_parts/0000.0000.1687.jpg
  29. BIN
      public/images/spare_parts/0000.0000.1693.jpg
  30. BIN
      public/images/spare_parts/0000.0000.1741.jpg
  31. BIN
      public/images/spare_parts/0000.0000.1748.jpg
  32. BIN
      public/images/spare_parts/0000.0000.1786.jpg
  33. BIN
      public/images/spare_parts/0000.0000.1796.jpg
  34. BIN
      public/images/spare_parts/0000.0000.1798.jpg
  35. BIN
      public/images/spare_parts/0000.0000.1811.jpg
  36. BIN
      public/images/spare_parts/0000.0000.1812.jpg
  37. BIN
      public/images/spare_parts/0000.0000.1815.jpg
  38. BIN
      public/images/spare_parts/0000.0000.1816.jpg
  39. BIN
      public/images/spare_parts/0000.0000.1821.jpg
  40. BIN
      public/images/spare_parts/0000.0000.1823.jpg
  41. BIN
      public/images/spare_parts/0000.0000.1854.jpg
  42. BIN
      public/images/spare_parts/0000.0000.2264.jpg
  43. BIN
      public/images/spare_parts/0000.0000.2267.jpg
  44. BIN
      public/images/spare_parts/0000.0000.2277.jpg
  45. BIN
      public/images/spare_parts/0000.0000.2279.jpg
  46. BIN
      public/images/spare_parts/0000.0000.2295.jpg
  47. BIN
      public/images/spare_parts/0000.0000.2326.jpg
  48. BIN
      public/images/spare_parts/0000.0000.2338.jpg
  49. BIN
      public/images/spare_parts/0000.0000.2339.jpg
  50. BIN
      public/images/spare_parts/0000.0000.3264.jpg
  51. BIN
      public/images/spare_parts/0000.0000.3266.jpg
  52. BIN
      public/images/spare_parts/0000.0000.3268.jpg
  53. BIN
      public/images/spare_parts/0000.0000.3269.jpg
  54. BIN
      public/images/spare_parts/0000.0000.3293.jpg
  55. BIN
      public/images/spare_parts/0000.0000.3294 .jpg
  56. BIN
      public/images/spare_parts/0000.0000.4223.jpg
  57. BIN
      public/images/spare_parts/0000.0000.4224.jpg
  58. BIN
      public/images/spare_parts/0000.0000.4225.jpg
  59. BIN
      public/images/spare_parts/0000.0000.4226.jpg
  60. BIN
      public/images/spare_parts/0000.0000.5233.jpg
  61. BIN
      public/images/spare_parts/0000.0000.5280.jpg
  62. BIN
      public/images/spare_parts/0000.0000.5284.jpg
  63. BIN
      public/images/spare_parts/0000.0000.5287.jpg
  64. BIN
      public/images/spare_parts/0000.0000.5290.jpg
  65. BIN
      public/images/spare_parts/0000.0000.6019.jpg
  66. BIN
      public/images/spare_parts/0000.0000.6064.jpg
  67. BIN
      public/images/spare_parts/0000.0000.6065.jpg
  68. BIN
      public/images/spare_parts/0000.0000.6088.jpg
  69. BIN
      public/images/spare_parts/0000.0000.6102.jpg
  70. BIN
      public/images/spare_parts/0000.0000.6116.jpg
  71. BIN
      public/images/spare_parts/0000.0000.6117.jpg
  72. BIN
      public/images/spare_parts/0000.0000.6262 .jpg
  73. BIN
      public/images/spare_parts/0000.0000.6262.jpg
  74. BIN
      public/images/spare_parts/0000.0000.6266.jpg
  75. BIN
      public/images/spare_parts/0000.0000.6268.jpg
  76. BIN
      public/images/spare_parts/0000.0000.6273.jpg
  77. BIN
      public/images/spare_parts/0000.0000.6274.jpg
  78. BIN
      public/images/spare_parts/0000.0000.6275.jpg
  79. BIN
      public/images/spare_parts/0000.0000.6278.jpg
  80. BIN
      public/images/spare_parts/0000.0000.6280.jpg
  81. BIN
      public/images/spare_parts/0000.0000.6286.jpg
  82. BIN
      public/images/spare_parts/0000.0000.6287.jpg
  83. BIN
      public/images/spare_parts/0000.0000.6298.jpg
  84. BIN
      public/images/spare_parts/0000.0000.6299.jpg
  85. BIN
      public/images/spare_parts/0000.0000.6301.jpg
  86. BIN
      public/images/spare_parts/0000.0000.6302.jpg
  87. BIN
      public/images/spare_parts/0000.0000.6304.jpg
  88. BIN
      public/images/spare_parts/0000.0000.6307.jpg
  89. BIN
      public/images/spare_parts/0000.0000.6308.jpg
  90. BIN
      public/images/spare_parts/0000.0000.6309.jpg
  91. BIN
      public/images/spare_parts/0000.0000.6311.jpg
  92. BIN
      public/images/spare_parts/0000.0000.6317.jpg
  93. BIN
      public/images/spare_parts/0000.0000.6328.jpg
  94. BIN
      public/images/spare_parts/0000.0000.7167.jpg
  95. BIN
      public/images/spare_parts/0000.0000.7303.jpg
  96. BIN
      public/images/spare_parts/0000.0000.7304.jpg
  97. BIN
      public/images/spare_parts/0000.0000.7306.jpg
  98. BIN
      public/images/spare_parts/0000.0000.7307.jpg
  99. BIN
      public/images/spare_parts/0000.0000.7312.jpg
  100. BIN
      public/images/spare_parts/0000.0000.7314.jpg

+ 7 - 0
app/Helpers/roles.php

@@ -42,6 +42,13 @@ if(!function_exists('year')) {
     }
 }
 
+if(!function_exists('glob_safe')) {
+    function glob_safe(string $str): string
+    {
+        return str_replace(['[', ']', '*', '?'], ['[[]', '[]]', '[*]', '[?]'], $str);
+    }
+}
+
 if(!function_exists('fileName')) {
     function fileName($file): string
     {

+ 3 - 0
app/Http/Controllers/SparePartController.php

@@ -10,6 +10,7 @@ use App\Models\SparePart;
 use App\Models\SparePartsView;
 use Illuminate\Http\RedirectResponse;
 use Illuminate\Http\Request;
+use Illuminate\Support\Facades\Cache;
 use Illuminate\Support\Facades\File;
 use Illuminate\Support\Facades\Log;
 use Illuminate\Support\Facades\Storage;
@@ -273,6 +274,8 @@ class SparePartController extends Controller
             // Сохраняем изображение
             $image->move($directory, $filename);
 
+            Cache::forget('spare_part_image:' . $sparePart->article);
+
             return redirect()->route('spare_parts.show', $sparePart)
                 ->with(['success' => 'Изображение успешно загружено!']);
         }

+ 17 - 4
app/Models/SparePart.php

@@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\Cache;
 
 /**
  * Каталог запчастей — СПРАВОЧНИК.
@@ -123,10 +124,22 @@ class SparePart extends Model
     // Атрибут для картинки
     public function image(): Attribute
     {
-        $path = '';
-        if (file_exists(public_path() . '/images/spare_parts/' . $this->article . '.jpg')) {
-            $path = url('/images/spare_parts/' . $this->article . '.jpg');
-        }
+        $article = $this->article;
+        $cacheKey = 'spare_part_image:' . $article;
+
+        $path = Cache::remember($cacheKey, 3600, function () use ($article) {
+            $dir = public_path('images/spare_parts');
+            $pattern = $dir . '/' . glob_safe($article) . '*.*';
+            $files = glob($pattern, GLOB_NOSORT);
+
+            if (empty($files)) {
+                return '';
+            }
+
+            $filename = basename($files[0]);
+            return url('/images/spare_parts/' . rawurlencode($filename));
+        });
+
         return Attribute::make(get: fn() => $path);
     }
 

+ 65 - 0
docs/spare-parts.md

@@ -11,6 +11,7 @@
 5. [Движения запасов](#5-движения-запасов)
 6. [Контроль наличия](#6-контроль-наличия)
 7. [Связь с рекламациями](#7-связь-с-рекламациями)
+8. [Загрузка файлов по FTP](#загрузка-файлов-по-ftp)
 
 ---
 
@@ -358,6 +359,70 @@
 
 ---
 
+## Загрузка файлов по FTP
+
+По FTP доступна папка `public/images/`. В ней находятся три каталога:
+
+### Структура папок
+
+```
+public/images/
+├── main/              ← картинки каталога МАФ
+├── spare_parts/       ← картинки запчастей
+└── tech-docs/         ← техническая документация (схемы сборки, габариты и т.д.)
+```
+
+### 1. Картинки каталога МАФ (`main/`)
+
+Формат имени файла: `{артикул}.0000.0000.jpg`
+
+Примеры: `0001.0000.0000.jpg`, `1112.0000.0000.jpg`
+
+Поддерживаются форматы: jpg, jpeg, png.
+
+### 2. Картинки запчастей (`spare_parts/`)
+
+Файлы кладутся в корень папки (без подпапок).
+
+Имя файла должно **начинаться с артикула** запчасти. Допускается суффикс после артикула (например, вариант размера).
+
+Примеры:
+- `0000.0000.0041.jpg` — артикул `0000.0000.0041`
+- `0000.0000.0483_50.jpg` — артикул `0000.0000.0483`, вариант 50
+- `BR08.050.jpg` — артикул `BR08.050`
+
+Поддерживаются форматы: jpg, jpeg, png.
+
+> Картинки кешируются на 1 час. После загрузки новых файлов они появятся в системе в течение часа.
+
+### 3. Техническая документация (`tech-docs/`)
+
+Файлы раскладываются **по подпапкам с артикулом** изделия.
+
+Структура:
+```
+tech-docs/
+├── 1112/
+│   ├── 1112.0000.0000 – Габаритные размеры.pdf
+│   ├── 1112.0000.0000 – Инструкция по сборке (Бетон. СУПП).pdf
+│   ├── 1112.0000.0000 – Схема скважин (Бетон. СУПП).pdf
+│   └── 1112.0000.0000 – Схемы установки опор (Бетон. СУПП).pdf
+├── 4005/
+│   └── ...
+```
+
+Типичные документы в папке артикула:
+- Габаритные размеры
+- Инструкция по сборке
+- Схема скважин
+- Схемы установки опор
+
+Формат: PDF.
+
+Эти документы используются при формировании монтажного пакета для площадки и при скачивании архива техдокументации по заказу.
+
+---
+
 ## Часто задаваемые вопросы
 
 ### Почему не могу удалить запчасть?

+ 63 - 0
public/images/readme.md

@@ -0,0 +1,63 @@
+## Загрузка файлов по FTP
+
+По FTP доступна папка `public/images/`. В ней находятся три каталога:
+
+### Структура папок
+
+```
+public/images/
+├── main/              ← картинки каталога МАФ
+├── spare_parts/       ← картинки запчастей
+└── tech-docs/         ← техническая документация (схемы сборки, габариты и т.д.)
+```
+
+### 1. Картинки каталога МАФ (`main/`)
+
+Формат имени файла: `{артикул}.0000.0000.jpg`
+
+Примеры: `0001.0000.0000.jpg`, `1112.0000.0000.jpg`
+
+Поддерживаются форматы: jpg, jpeg, png.
+
+### 2. Картинки запчастей (`spare_parts/`)
+
+Файлы кладутся в корень папки (без подпапок).
+
+Имя файла должно **начинаться с артикула** запчасти. Допускается суффикс после артикула (например, вариант размера).
+
+Примеры:
+- `0000.0000.0041.jpg` — артикул `0000.0000.0041`
+- `0000.0000.0483_50.jpg` — артикул `0000.0000.0483`, вариант 50
+- `BR08.050.jpg` — артикул `BR08.050`
+
+Поддерживаются форматы: jpg, jpeg, png.
+
+> Картинки кешируются на 1 час. После загрузки новых файлов они появятся в системе в течение часа.
+
+### 3. Техническая документация (`tech-docs/`)
+
+Файлы раскладываются **по подпапкам с артикулом** изделия.
+
+Структура:
+```
+tech-docs/
+├── 1112/
+│   ├── 1112.0000.0000 – Габаритные размеры.pdf
+│   ├── 1112.0000.0000 – Инструкция по сборке (Бетон. СУПП).pdf
+│   ├── 1112.0000.0000 – Схема скважин (Бетон. СУПП).pdf
+│   └── 1112.0000.0000 – Схемы установки опор (Бетон. СУПП).pdf
+├── 4005/
+│   └── ...
+```
+
+Типичные документы в папке артикула:
+- Габаритные размеры
+- Инструкция по сборке
+- Схема скважин
+- Схемы установки опор
+
+Формат: PDF.
+
+Эти документы используются при формировании монтажного пакета для площадки и при скачивании архива техдокументации по заказу.
+
+---

BIN
public/images/spare_parts/0000.0000.0041.jpg


BIN
public/images/spare_parts/0000.0000.0046.jpg


BIN
public/images/spare_parts/0000.0000.0094 .jpg


BIN
public/images/spare_parts/0000.0000.0136.jpg


BIN
public/images/spare_parts/0000.0000.0137.jpg


BIN
public/images/spare_parts/0000.0000.0290.jpg


BIN
public/images/spare_parts/0000.0000.0314.jpg


BIN
public/images/spare_parts/0000.0000.0337.jpg


BIN
public/images/spare_parts/0000.0000.0483_50.jpg


BIN
public/images/spare_parts/0000.0000.0483_70.jpg


BIN
public/images/spare_parts/0000.0000.0486.jpg


BIN
public/images/spare_parts/0000.0000.0592.jpg


BIN
public/images/spare_parts/0000.0000.0600.jpg


BIN
public/images/spare_parts/0000.0000.0628.jpg


BIN
public/images/spare_parts/0000.0000.1660.jpg


BIN
public/images/spare_parts/0000.0000.1666.jpg


BIN
public/images/spare_parts/0000.0000.1668.jpg


BIN
public/images/spare_parts/0000.0000.1673.jpg


BIN
public/images/spare_parts/0000.0000.1675.jpg


BIN
public/images/spare_parts/0000.0000.1679.jpg


BIN
public/images/spare_parts/0000.0000.1681.jpg


BIN
public/images/spare_parts/0000.0000.1683.jpg


BIN
public/images/spare_parts/0000.0000.1687.jpg


BIN
public/images/spare_parts/0000.0000.1693.jpg


BIN
public/images/spare_parts/0000.0000.1741.jpg


BIN
public/images/spare_parts/0000.0000.1748.jpg


BIN
public/images/spare_parts/0000.0000.1786.jpg


BIN
public/images/spare_parts/0000.0000.1796.jpg


BIN
public/images/spare_parts/0000.0000.1798.jpg


BIN
public/images/spare_parts/0000.0000.1811.jpg


BIN
public/images/spare_parts/0000.0000.1812.jpg


BIN
public/images/spare_parts/0000.0000.1815.jpg


BIN
public/images/spare_parts/0000.0000.1816.jpg


BIN
public/images/spare_parts/0000.0000.1821.jpg


BIN
public/images/spare_parts/0000.0000.1823.jpg


BIN
public/images/spare_parts/0000.0000.1854.jpg


BIN
public/images/spare_parts/0000.0000.2264.jpg


BIN
public/images/spare_parts/0000.0000.2267.jpg


BIN
public/images/spare_parts/0000.0000.2277.jpg


BIN
public/images/spare_parts/0000.0000.2279.jpg


BIN
public/images/spare_parts/0000.0000.2295.jpg


BIN
public/images/spare_parts/0000.0000.2326.jpg


BIN
public/images/spare_parts/0000.0000.2338.jpg


BIN
public/images/spare_parts/0000.0000.2339.jpg


BIN
public/images/spare_parts/0000.0000.3264.jpg


BIN
public/images/spare_parts/0000.0000.3266.jpg


BIN
public/images/spare_parts/0000.0000.3268.jpg


BIN
public/images/spare_parts/0000.0000.3269.jpg


BIN
public/images/spare_parts/0000.0000.3293.jpg


BIN
public/images/spare_parts/0000.0000.3294 .jpg


BIN
public/images/spare_parts/0000.0000.4223.jpg


BIN
public/images/spare_parts/0000.0000.4224.jpg


BIN
public/images/spare_parts/0000.0000.4225.jpg


BIN
public/images/spare_parts/0000.0000.4226.jpg


BIN
public/images/spare_parts/0000.0000.5233.jpg


BIN
public/images/spare_parts/0000.0000.5280.jpg


BIN
public/images/spare_parts/0000.0000.5284.jpg


BIN
public/images/spare_parts/0000.0000.5287.jpg


BIN
public/images/spare_parts/0000.0000.5290.jpg


BIN
public/images/spare_parts/0000.0000.6019.jpg


BIN
public/images/spare_parts/0000.0000.6064.jpg


BIN
public/images/spare_parts/0000.0000.6065.jpg


BIN
public/images/spare_parts/0000.0000.6088.jpg


BIN
public/images/spare_parts/0000.0000.6102.jpg


BIN
public/images/spare_parts/0000.0000.6116.jpg


BIN
public/images/spare_parts/0000.0000.6117.jpg


BIN
public/images/spare_parts/0000.0000.6262 .jpg


BIN
public/images/spare_parts/0000.0000.6262.jpg


BIN
public/images/spare_parts/0000.0000.6266.jpg


BIN
public/images/spare_parts/0000.0000.6268.jpg


BIN
public/images/spare_parts/0000.0000.6273.jpg


BIN
public/images/spare_parts/0000.0000.6274.jpg


BIN
public/images/spare_parts/0000.0000.6275.jpg


BIN
public/images/spare_parts/0000.0000.6278.jpg


BIN
public/images/spare_parts/0000.0000.6280.jpg


BIN
public/images/spare_parts/0000.0000.6286.jpg


BIN
public/images/spare_parts/0000.0000.6287.jpg


BIN
public/images/spare_parts/0000.0000.6298.jpg


BIN
public/images/spare_parts/0000.0000.6299.jpg


BIN
public/images/spare_parts/0000.0000.6301.jpg


BIN
public/images/spare_parts/0000.0000.6302.jpg


BIN
public/images/spare_parts/0000.0000.6304.jpg


BIN
public/images/spare_parts/0000.0000.6307.jpg


BIN
public/images/spare_parts/0000.0000.6308.jpg


BIN
public/images/spare_parts/0000.0000.6309.jpg


BIN
public/images/spare_parts/0000.0000.6311.jpg


BIN
public/images/spare_parts/0000.0000.6317.jpg


BIN
public/images/spare_parts/0000.0000.6328.jpg


BIN
public/images/spare_parts/0000.0000.7167.jpg


BIN
public/images/spare_parts/0000.0000.7303.jpg


BIN
public/images/spare_parts/0000.0000.7304.jpg


BIN
public/images/spare_parts/0000.0000.7306.jpg


BIN
public/images/spare_parts/0000.0000.7307.jpg


BIN
public/images/spare_parts/0000.0000.7312.jpg


BIN
public/images/spare_parts/0000.0000.7314.jpg


Some files were not shown because too many files changed in this diff