METAL-ASIA
METAL-ASIAMARKET
WhatsApp
← Все проекты

План внедрения мульти-тип сортаментов (Чёрный / Нержавейка / Алюминий / Медь)

28.07.2026Metal-Asia Engineering
НПЗнефтепереработкаКитайоборудование

cat > ~/market.metal-asia.pw/next-app/docs/sortament.md << 'EOF'
# План внедрения мульти-тип сортаментов (Чёрный / Нержавейка / Алюминий / Медь) Ключевые направления: Гуанчжоу, Шанхай, Алматы.

## Цель
Заменить текущий статический селект сортамента на интерактивную систему:
- Выбор типа металла (4 кнопки) → плиточный поповер с сортаментами → динамические поля марки/ГОСТ.

---

## Фаза 1: Архитектура данных (src/data/metal/)

### Шаг 1.1 — Создать `types.ts`
- Интерфейс `SortamentItem` (id, name, icon, gost, brands[], params?, weightFormula?)
- Интерфейс `MetalMatrix` (label, items[])
- Тип `MetalType` = 'black' | 'stainless' | 'aluminum' | 'copper'

### Шаг 1.2 — Создать `black-steel.ts`
- 16 позиций сортамента (арматура, балка, швеллер, уголок, трубы, листы, круг, квадрат, шестигранник, полоса, катанка)
- Каждая позиция: id, name, icon (Lucide-название), gost, brands[] (с fobPrice, density)
- Параметры для веса: diameter, thickness, width, height, length

### Шаг 1.3 — Создать `stainless.ts`
- 10 позиций (труба бесшовная, труба сварная, труба профильная, лист матовый, лист зеркальный, лист рифленый, круг, шестигранник, уголок, лента)
- Двойная маркировка: ГОСТ + AISI
- Плотность: 7900-8000 кг/м³

### Шаг 1.4 — Создать `aluminum.ts`
- 9 позиций (лист гладкий, лист рифленый, лист перфорированный, труба круглая, труба профильная, пруток, шина, уголок, швеллер)
- Плотность: 2700 кг/м³
- Марки: А5, АД1, АМг2, АМг3, Д16Т

### Шаг 1.5 — Создать `copper.ts`
- 8 позиций (шина, лист, лента, труба, пруток, проволока, лист латунный, труба латунная)
- Плотность меди: 8960 кг/м³
- Плотность латуни: 8400 кг/м³
- Марки: М1, М2, М3, Л63, ЛС59-1

### Шаг 1.6 — Создать `index.ts`
- Единый экспорт: `METAL_MATRIX` объект
- Функция `getSortamentByType(type)` → SortamentItem[]
- Функция `getSortamentById(id)` → SortamentItem | undefined

---

## Фаза 2: Весовые формулы (src/utils/calculator.ts)

### Шаг 2.1 — Расширить `calculatePhysicalWeight.ts`
\-Добавитьплотности:black=7850,stainless=7900,aluminum=2700,copper=8960,brass=8400\- Добавить плотности: black=7850, stainless=7900, aluminum=2700, copper=8960, brass=8400 - Формулы для алюминия и меди (аналогичные стальным, но с другой плотностью)
- Формула для нержавейки (табличные + расчётные)

### Шаг 2.2 — Создать JSON-веса для цветных металлов
- `aluminum-weights.json` — табличные веса алюминиевого проката
- `copper-weights.json` — табличные веса медного проката
- `stainless-weights.json` — табличные веса нержавейки

### Шаг 2.3 — Загрузить на S3
- `data/aluminum-weights.json`
- `data/copper-weights.json`
- `data/stainless-weights.json`
- Обновить `.env.local` с URL

---

## Фаза 3: UI-компоненты

### Шаг 3.1 — `MetalTypeSelector.tsx`
- 4 кнопки: Чёрный | Нержавейка | Алюминий | Медь
- Активная кнопка: border-[#00FFAA], bg-[#00FFAA]/5
- При клике: `setMetalType(type)` + сброс `selectedSortament=null`, `selectedBrand=''`

### Шаг 3.2 — `SortamentPopover.tsx`
- Кнопка-триггер: "Выберите сортамент..." или активная плитка
- Поповер: grid 2-4 колонки, плитки 80-100px
- Плитка: иконка (Lucide, 24px), название, ГОСТ (мелкий текст)
- Активная плитка: border-[#00FFAA]
- При клике: `setSelectedSortament(tile)` + закрыть поповер

### Шаг 3.3 — `BrandSelect.tsx`
- Нативный `<select>`, стилизованный под тёмную тему
- Опции из `selectedSortament.brands`
- Disabled пока `!selectedSortament`
- Placeholder: "Сначала выберите сортамент"

### Шаг 3.4 — `GostDisplay.tsx`
- Read-only input
- Автозаполнение из `selectedSortament.gost`
- Стилизация: bg-[#141416]/50, text-zinc-400

---

## Фаза 4: Интеграция в MetalCalculator

### Шаг 4.1 — Модифицировать `PositionItem.tsx`
- Добавить `metalType` в `PositionData`
- Вставить `MetalTypeSelector` в шапку позиции
- Заменить текущий селект сортамента на `SortamentPopover`
- Добавить `BrandSelect` под сортамент
- Добавить `GostDisplay` рядом с маркой

### Шаг 4.2 — Обновить `calculateWeight()` в `PositionItem.tsx`
- Подтягивать плотность из `METAL_MATRIX[metalType].density`
- Для цветных металлов — использовать соответствующие формулы/таблицы
- Fallback на локальный файл если API недоступен

### Шаг 4.3 — Обновить `MetalCalculator.tsx`
- Передавать `metalType` в `PositionItem`
- При расчёте: использовать плотность выбранного типа металла
- Обновить отображение веса (тонны/кг)

---

## Фаза 5: S3 и деплой

### Шаг 5.1 — Создать и загрузить JSON-веса
- `aluminum-weights.json` → S3 `data/aluminum-weights.json`
- `copper-weights.json` → S3 `data/copper-weights.json`
- `stainless-weights.json` → S3 `data/stainless-weights.json`

### Шаг 5.2 — Создать API endpoints
- `src/app/api/aluminum-weights/route.ts`
- `src/app/api/copper-weights/route.ts`
- `src/app/api/stainless-weights/route.ts`
- Аналогично `metal-weights/route.ts` (кэш 55 мин)

### Шаг 5.3 — Обновить `.env.local`
- `ALUMINUM_WEIGHTS_S3_URL`
- `COPPER_WEIGHTS_S3_URL`
- `STAINLESS_WEIGHTS_S3_URL`

### Шаг 5.4 — Деплой
- Git commit → push → pull на сервере
- `rm -rf .next && npm run build`
- Перезапуск сервера
- Проверка API

---

## Фаза 6: Тестирование

### Шаг 6.1 — Чёрный металл (контроль)
- Арматура Ø12, 100 шт, 11.7м → вес ~10.39 кг/шт, общий ~1.04 т
- Сравнить с текущими расчётами — должно совпадать

### Шаг 6.2 — Нержавейка
\- Труба 108×4, 50 шт, 6м → вес \~10.26 кг/м × 6м \= 61.56 кг/шт \- Общий вес: 50 × 61.56 \= 3078 кг \= 3.08 т \- FOB: \~$2500/т × 3.08 \= $7 700

### Шаг 6.3 — Алюминий
- Лист 2мм, 1000×2000мм, 20 шт
\- Вес: 2 × 2.7 \= 5.4 кг/м² × 2м² \= 10.8 кг/шт \- Общий: 20 × 10.8 \= 216 кг \= 0.216 т \- FOB: \~$3500/т × 0.216 \= $756

### Шаг 6.4 — Медь
- Труба М1, 28×1.5мм, 100 шт, 3м
\- Вес: π × (28-1.5) × 1.5 × 8.96 / 1000 \= \~1.12 кг/м × 3м \= 3.36 кг/шт \- Общий: 100 × 3.36 \= 336 кг \= 0.336 т \- FOB: \~$9000/т × 0.336 \= $3 024

---

## Чек-лист готовности

- [ ] Фаза 1: Все 6 файлов данных созданы
- [ ] Фаза 2: Весовые формулы для цветных металлов
- [ ] Фаза 3: Все UI-компоненты работают
- [ ] Фаза 4: Интеграция в MetalCalculator
- [ ] Фаза 5: S3 + API + env
- [ ] Фаза 6: Все 4 типа протестированы

---

## Примечания

- **Иконки:** Lucide-React, уже установлен
- **Анимация:** Не нужна, мгновенная смена
- **Select марок:** Нативный, стилизованный
- **Popover:** Кастомный (текущий), без Radix
- **Big.js:** Уже установлен, использовать для всех расчётов
- **Zod:** Не нужен, TypeScript покрывает

---

## Стартовая команда

```bash
mkdir -p ~/market.metal-asia.pw/next-app/src/data/metal
mkdir -p ~/market.metal-asia.pw/next-app/src/components/sortament

Милош Ковачевич

Эксперт по международной логистике

Курирует направления доставки металлопроката из Европы и Азии. Знает все нюансы таможенного оформления, ЖД и морских перевозок. Оптимизирует цепочки поставок.

Профиль автора →
Милош Ковачевич
План внедрения мульти-тип сортаментов (Чёрный / Нержавейка / Алюминий / Медь)