{{ pageTitle }}
{{ pageSub }}
{{ alertCount }}
данные на 31.08.2026
{{ k.label }}
{{ k.value }}
{{ k.sub }}
{{ c.label }}{{ c.count }}
Перетащите файл .xlsx или нажмите для выбора
Книга может содержать несколько листов, в том числе большие — до 60 000+ строк. На сервере файл обрабатывается потоково, пакетами по 500–1000 строк.
Читаем «{{ wizFile }}» — определяем листы и размеры…
или
{{ wizFile }}
{{ wizSize }} · выберите лист и укажите, какому набору данных он соответствует
{{ s.name }}
{{ s.dims }}
похоже на: {{ s.suggest }}
большой лист — потоковая обработка
Маппинг: лист «{{ wizSheetName }}» → {{ wizDtypeLabel }}
{{ headerRowNote }} · соответствия предложены по заголовкам с учётом синонимов и регистра
Применён сохранённый шаблон маппинга (от {{ tplSavedAt }}). Соответствия можно переопределить вручную.
Строк данных
{{ totalRows }}
Прошли проверку
{{ validCount }}
Строк с ошибками
{{ errCount }}
{{ approxNote }}
Проблемные строки (первые 12)
{{ e.row }}
{{ e.field }}
{{ e.msg }}
значение: {{ e.raw }}
{{ errMore }} Ошибочные строки не блокируют импорт — они остаются в staging-карантине для исправления.
Подтверждение импорта
{{ wizFile }} · «{{ wizSheetName }}» → {{ wizDtypeLabel }} · {{ batchNote }}
Новых записей
{{ sumNew }}
Обновлений
{{ sumUpd }}
В карантин
{{ sumErr }}
Загрузка в staging и перенос…{{ batchLabel }} · {{ progress }}
Импорт {{ jobId }} выполнен
Данные перенесены из staging в основные таблицы одной транзакцией. Рекомендуемые заказы будут пересчитаны по расписанию или вручную на странице параметров.
{{ k.label }}
{{ k.value }}
{{ k.sub }}
Распределение партий по срокам
просрочено
до 90 дней
до порога
свыше порога
Правило FEFO: резервирование и выдача — с ближайшего срока годности. Партии за порогом попадают в уведомления и в статус позиции на дашборде.
Истечение сроков по месяцам · партий
{{ b.n }}
{{ b.label }}
{{ k.label }}
{{ k.value }}
{{ k.sub }}
Правила контроля: уведомление за 180 дней до истечения РУ; при истёкшем РУ и статусе «снят с производства» отгрузка блокируется с указанием причины. В текущей выгрузке все РУ бессрочные — календарь истечения заполнится после импорта дат из 1С.
{{ t.label }}{{ t.count }}
{{ k.label }}
{{ k.value }}
{{ k.sub }}
{{ fvaSelStats }}
{{ g.label }}
{{ b.label }}
Факт, ед.
{{ b.fact }}
Прогноз, ед.
{{ b.fc }}
Отклонение
{{ b.delta }}
факт — списания 2025 (столбцы)
прогноз системы — линия с точками (walk-forward: только данные, известные до месяца)
Параметры движка
Изменения применяются пересчётом и сохраняются как новая версия
Целевой буфер запаса, мес
складской запас + логистика; норма 2.5–3.5
Надбавка для XYZ-класса Z, мес
страховой запас для нерегулярного спроса
Порог срока годности, дней
уведомление и статус «критичный СГ» (FEFO)
Порог истечения РУ, дней
уведомление регуляторного модуля
Пересчёт по расписанию
и вручную — кнопкой ниже
Веса последних 3 месяцев — выбираются автоматически по тренду услуг
рост → {{ weightsUp }}
снижение → {{ weightsDown }}
плато → равные
ABC / XYZ-классификация
ABC — доля объёма расхода · XYZ — стабильность спроса
X · стабильный
Y · колеблющийся
Z · нерегулярный
{{ a.label }} {{ a.desc }}
{{ c.v }}
Классы AX — точный прогноз по услугам; класс Z получает надбавку к буферу +{{ parZ }} мес.
Тесты модуля прогнозирования
{{ testsSummary }}
{{ t.icon }}
{{ t.name }}
{{ t.note }}
Версии параметров расчёта
{{ v.v }}
{{ v.date }}
{{ v.user }}
{{ v.note }}
Backend: NestJS (TypeScript) + SheetJS, потоковый парсинг
БД: PostgreSQL 16
Frontend: React / Next.js
Деплой: Docker Compose · VMware ESXi · CI/CD GitHub Actions
Абстракция источников данных
Бизнес-логика расчёта не знает об источнике: Excel сегодня, 1С (OData) и ЛИС Силаб — позже, без изменения движка
{{ a.name }}{{ a.tag }}
{{ a.note }}
interface DataSourceAdapter
{{ adapterCode }}
import_staging_rows
пакеты по 500–1000 строк, построчная валидация, карантин ошибок
основные таблицы
транзакционный перенос + снимок для отката
Нормализованная схема данных
{{ g.title }}
{{ t.name }}
{{ t.desc }}
{{ c.f }} {{ c.t }} {{ c.n }}
API-контракты модуля импорта и расчёта
POST /api/imports/:id/commit — ответ
{{ apiEx1 }}
GET /api/nomenclature/МТ--0006357/recommendation — ответ
{{ apiEx2 }}
Выбрано {{ selCountLabel }} · {{ selKits }} наб.
Сбросить