ТЗ для Claude Code: планировщик участка ЛБ (HTML-приложение)

Заказчик: планово-экономический отдел АО «БАЗ» Дата: 02.07.2026 Формат результата: один самодостаточный HTML-файл (см. раздел 3) Основание: ТЗ на планировщик ЛБ от 02.07.2026 + два заполненных опросника (по логике планирования и по рулонам/бобинам)


0. Коротко: что и зачем

Нужно построить инструмент ежедневного планирования участка ЛБ (бесконечные шлифовальные ленты). Мастер утром загружает выгрузку «Заказ на день» из 1С и получает: сменное задание по каждому станку и календарь по дням и сменам, где задания уже разложены по срокам и сгруппированы под минимум переналадки.

Инструмент уже существует как прототип на Python (planner_lb_v2.py, работает в Google Colab). Он умеет маршрутизацию — раскладывать ленты по 11 потокам в две стадии. Задача этого ТЗ: портировать логику маршрутизации в HTML/JS и достроить новый слой — раскладку по сменам, календарь и минимизацию переналадки, плюс упаковать всё в один HTML-файл для работы без интернета.

Ключевой урок проекта, который нельзя нарушить: маршрутизация двухстадийна. Нарезка заготовок и сборка ленты — это две разные стадии на разных станках, и позиция получает назначение на каждой стадии отдельно. Первая версия планировщика смешивала стадии и давала 19% совпадения с фактом 1С. Разделение нарезки и сборки — это то, что чинит точность. В planner_lb_v2.py это уже сделано правильно, порт должен сохранить эту структуру.


1. Исходные материалы (передаёт заказчик)

  1. planner_lb_v2.py — рабочий прототип. Эталон логики маршрутизации, регламента шва, плёнки, угла, разбора обозначения, чтения файла. Портировать из него, а не изобретать заново.
  2. Справочник_серий_ЛБ_БАЗ.xlsx — серии и типы основы (листы: Серии, Типы основы, Швы, Группы и размеры, Разбор обозначения).
  3. Нормы_НВ_ЛБ_БАЗ.xlsx — 259 шаблонов НВ, норма в ч/шт по размерному диапазону (ширина×длина). Данные встроить в приложение как JSON.
  4. Сменное_задание_ЛБ_26_06_ИТОГ.xlsx и/или сырой .xls «Заказ на день» за 26.06 — реальный файл для тестирования.
  5. Два заполненных опросника — источник всех правил раскладки и карты переналадки (сведены в разделы 5–7 ниже).

2. Термины

  • Поток — станок или линия сборки/нарезки. Всего 11 (см. 4.1).
  • Стадия А (нарезка) — резка заготовок из рулона шкурки: станки СВ500/АСАВ (ширина ≤499) или BTFW2000/BTA4 (≥500).
  • Стадия Б (сборка) — соединение заготовок в бесконечную ленту: потоки 3–11.
  • Переналадка — время перестройки станка при смене параметров партии (шов, плёнка, серия, бобина, ширина). Считается в минутах, см. раздел 7.
  • «Произвести к…» — плановый срок позиции из выгрузки 1С. Жёсткий предел.
  • Смена — 8 часов. В сутках 2 смены.

3. Целевая архитектура

Один HTML-файл, который открывается двойным кликом в любом браузере на заводской машине.

Жёсткие требования:

  • Без интернета в момент работы. Никаких обращений к CDN, внешним API, гугл-сервисам во время работы. Всё — внутри файла.
  • Без установки, без аккаунтов, без прав администратора.
  • Библиотеки встроены в файл. Чтение .xls и запись .xlsx — через SheetJS (xlsx), библиотеку встроить в файл инлайном, не подтягивать с CDN.
  • Все справочники встроены как JS-объекты/JSON: серии, нормы, регламент шва, таблицы 10 и 1а, карта переналадки, персонал, определения потоков.
  • Без сборочного шага. Итог — готовый .html, который просто работает. Предпочтителен ванильный JS без фреймворка; если фреймворк — он должен компилироваться в один самодостаточный файл без обращений в сеть.
  • Не использовать localStorage/sessionStorage как обязательную зависимость для основной логики (может быть заблокировано политиками). Состояние держать в памяти страницы. Если нужно сохранять между запусками — только как необязательное улучшение, работающее и без него.

Данные выгрузки не должны никуда уходить из браузера — это требование безопасности завода.


4. Функциональность

4.1. Маршрутизация (порт из planner_lb_v2.py)

Сохранить двухстадийную модель и все 11 потоков. Персонал — фиксированные штатные числа по потокам (мастер может переопределить вручную, см. 6.3).

ПотокСтадияШтат
1СВ500/АСАВнарезка2
2BTFW2000/BTA4нарезка2
3CSM07 напильникисборка4
4AWBLсборка4
5CSM07 широкиесборка4
6CSM07 сегментныесборка4
7CSM02 узкиесборка2
8CSM07 нетканкасборка4
9Metis конусасборка5
10Участок ЛВПсборка1
11SMA/SMB4/CSM07сборка6

Правила маршрутизации (нарезка по ширине; сборка по фильтрам ТЗ 02.07 — серия, ширина, количество, признаки corse/medium/veri fine/ЛВП, конус) — взять один в один из planner_lb_v2.py, функции route_cutting() и route_assembly(). Ключевые узлы, которые проверить при порте:

  • Узкие 21–499 мм: поток 7 (CSM 02) берёт только RX10RW/ZX10RW/MX10RW/KX10RW от 200 шт., поток 11 (SMA/SMB4) берёт все серии, а эти четыре — только при ≤199 шт.
  • Граница широких: AWBL от 100 шт., CSM07-широкие до 99.
  • Нормализация алфавита при разборе обозначения: КХ↔KX, С↔C, Х↔X (кириллица/латиница).
  • Позиция без потока не теряется, а выносится на лист «Не распределено» с причиной.

4.2. Регламент шва, плёнки, угла (порт из planner_lb_v2.py)

  • Шов — по таблице SEAM_RULES (серия + зернистость → N1/N2/N3/S1/S2).
  • Плёнка для шва встык (S): синяя при зернистости Р20–Р60 и для серий RX10RW/MX10RW/RX12RW/MX12RW и признаков corse/medium/veri fine/ЛВП; белая при Р80–Р800. Для шва внахлёст (N) — не заполняется.
  • Угол: узкие 67°, бумага 75°, ручные из таблицы 10 или ширина>400 или длина<1000 → 80°; для опрессовки на SPR-3500 (таблица 1а) — 67°.
  • Таблицы 10 и 1а — встроены в planner_lb_v2.py, перенести.

4.3. Рулоны и бобины → лист передачи (НЕ наш участок)

По ответу команды (опросник по рулонам, п.0.1): рулоны и бобины делают не на участке ЛБ. Планировщик их не маршрутизирует.

  • Распознавать позиции Ш/шкурка ... и Ш/бобина ... (в т.ч. «объёмное шлиф полотно VF»).
  • Выносить их на отдельный лист/вкладку «Передать на участок бобин и товарных рулонов» — просто списком (номенклатура, кол-во, № заказа, заказчик, дата).
  • Никаких потоков, норм, шва/плёнки/угла для них не считать.

4.4. Слой раскладки по сменам (НОВОЕ)

Это главная новая часть. После маршрутизации каждая позиция должна получить день и смену, а внутри смены встать в порядке минимальной переналадки. Полный свод правил — раздел 6, карта переналадки — раздел 7. Здесь — общая механика:

  1. Для каждого потока известна мощность смены = штат × 8 ч ÷ норма (см. 6, п. «Мощность»).
  2. Позиции потока сортируются по приоритету (срок + срочность), см. 6.
  3. Смена набивается позициями до предела мощности (в чел-часах), внутри — переупорядочивание под минимум переналадки (раздел 7). Остаток переходит в следующую смену/день.
  4. Нарезка ставится на смену раньше сборки той же позиции (задел, п. 1.6 опросника).
  5. Позиции, которые не влезают в свой срок, подсвечиваются и выносятся мастеру (см. 6, «Невыполнимый срок»).

4.5. Интерфейс мастера (НОВОЕ)

  • Загрузка файла: зона перетаскивания + кнопка выбора для .xls «Заказ на день».
  • Кнопка «Рассчитать / Пересчитать».
  • Календарь: строки — потоки, столбцы — день + смена (сегодня смена 1, смена 2; завтра смена 1, смена 2; горизонт см. п.1.2 опросника). В ячейке — позиции/количество лент и загрузка потока (%). Подсветкой — перегруз и срыв срока.
  • Сменное задание по потоку (форма из ТЗ): номенклатура, кол-во, тип шва, тип плёнки, угол, № заказа, заказчик, дата изготовления, ОУ. Внутри — группировка и порядок под минимум переналадки.
  • Ручные переключатели:
    • пометить позицию/заказ как «срочно»;
    • пометить простой станка на смену (обходить при планировании);
    • задать число людей на потоке по каждой смене.
  • Панель «Невыполнимые сроки»: список позиций, которые не успевают к сроку, с запросом мастеру (разрешить опоздание / отложить).
  • Лист «Не распределено» — позиции без потока с причиной.
  • Лист «Передать на участок бобин и товарных рулонов».
  • Кнопка «Выгрузить задание в Excel» — формирует книгу со сменными заданиями по потокам (как текущий вывод planner_lb_v2.py).

5. Чтение файла «Заказ на день»

Портировать из planner_lb_v2.py (read_orders) и учесть уточнения с боевой выгрузки:

  • Файл состоит из нескольких блоков «Производственное задание» подряд, у каждого свой итог. Читать детальные части и суммировать. Итоговый блок «Итого по производственному заданию» — это дубликат детальной части, его в позиции не брать (иначе задвоение количества — реально наблюдалось на 26.06, задание раздувалось в 2 раза).
  • Заголовок таблицы искать по колонке «Номенклатура»; служебные строки (группы, «Итого», «Всего») отфильтровывать.
  • Из позиции брать: обозначение, количество, № заказа, заказчик, дату/срок «Произвести к…», ОУ.
  • Срок «Произвести к…» обязателен для календаря. Он есть в сыром .xls из 1С (в итоговом файле 26.06 колонка даты пустая — брать из сырой выгрузки, не из итога).

6. Правила раскладки по сменам (из заполненного опросника)

Цель и главное правило

  • Срок — жёсткий предел, не нарушается никогда (п.0.3, 5.9).
  • Внутри допустимого по срокам: минимизируем переналадку, затем максимизируем загрузку (п.0.1, разрешено через 5.9).
  • Группируем только внутри одного срока/дня. Ради экономии переналадки срок не двигаем (5.9).
  • Главная стадия — сборка, нарезку подстраиваем под неё (5.7).
  • Все ленты равноценны — считаем только штуки и сроки, веса/маржи нет (0.2).
  • Невыполнимый срок: если позицию нельзя успеть к сроку, планировщик подсвечивает её и спрашивает мастера о возможности нарушить срок (0.1, 0.3). Реализовать как панель с позициями-нарушителями и действием мастера (разрешить/отложить).

Приоритет и мощность

  • Ключ очереди: срок «Произвести к…» + статус «срочно», далее компоновка по номенклатуре (1.1).
  • Горизонт: раскладываем вперёд на 1 рабочий день; если портфель заказов даёт больше 3 дней загрузки — план на 2 дня (1.2).
  • Мощность смены — по людям: штат потока × 8 ч ÷ норма. Норму берём из справочника НВ по серии и размеру (1.3). Норму вешаем на сборку как на узкое место (следствие 5.7). Про точность — см. раздел 9.
  • Дробление партии: можно дробить свободно, остаток — в следующую смену (1.4).
  • Свободная мощность: тянуть вперёд заказы с более поздним сроком, чтобы не простаивать (1.5).
  • Задел стадий: нарезка на смену раньше сборки (1.6).
  • Один поток = один станок, параллельных единиц нет, балансировать между станками не нужно (6.1).
  • Опрессовку в расчёт смен не берём — не узкое место (6.6).

Пополнение и пересмотр

  • Новые заказы среди дня дописываются в хвост, уже собранное не трогаем (2.1).
  • Невыполненное со вчера идёт раньше любых новых заказов текущего дня (2.2).
  • Запущенное не переставляем даже ради срочного (2.3).
  • Факт выполнения — из 1С: мастер по готовым заказам создаёт этап на производство, и они выпадают из следующего подбора. То есть входной файл сам очищается — планировщик доверяет ему и своего учёта факта не ведёт (2.4).
  • Пересчёт: раз в день + кнопка «пересчитать» (2.5, 4.3).

Срочность

  • Срочный встаёт в начало очереди своего потока, с учётом сроков; можно вклинить в позицию с наименьшей переналадкой без нарушения сроков (3.1).
  • Запущенную партию не прерывает — идёт первым после текущей (3.2).
  • Несколько срочных — между собой по сроку (3.3).
  • Срочный подбираем к похожим по шву/серии в ближайшей смене (3.4).
  • Статус бинарный: срочно / не срочно (3.5).

Изменение даты

  • Сдвиг даты — пересорт только того потока, где лежит заказ (4.1).
  • Сдвиг разрешается, только если не срывает чужой срок (4.2).

Ресурсы

  • Простой станка (ремонт/ППР) задаётся вручную, планировщик его обходит (6.2).
  • Число людей по сменам задаётся вручную (6.3).
  • Общей оснастки между станками нет (6.4).
  • Материал считаем всегда доступным — остатки шкурки не проверяем, это зона ПЭО (6.5).

Эксплуатация

  • Мастер видит полный календарь на горизонт (7.1).
  • Владелец сроков и статуса «срочно» — ПЭО (7.3).

7. Карта переналадки (из заполненного опросника, раздел 5)

Времена — из ответов команды. Формат мм:сс.

Нарезка

СтанокСобытиеВремя
СВ500/АСАВнастройка под установленную бобину2:00
BTFW2000/BTA4настройка под установленный рулон20:00
  • Правило смены бобины/рулона: меняется при смене серии или зернистости (5.2). Пока серия и зернистость те же — переналадки нет, позиции идут подряд.
  • Отдельные времена смены ширины реза и угла команда не проставила. Допущение: любую смену серии/зернистости считаем равной времени настройки станка (2:00 или 20:00); смену ширины и угла внутри той же бобины — без переналадки. (см. раздел 9, требует подтверждения).
  • Порядок группировки на нарезке: рулон (серия+зернистость+ширина полотна) → угол → размер заготовки (5.3).

Сборка

СтанокПервичная наладкаСмена шваСмена плёнкиСмена размераСмена серии
SMA/SMB413:202:201:302:20
CSM 0236:3013:200:5013:20
AWBL33:3019:409:3019:40
CSM 0730:0013:009:3013:00

Смена размера ленты (ширина×длина) переналадки не требует ни на одном станке.

Матрица переходов по шву (5.6) — переопределяет обычную «смену шва» там, где указана:

СтанокПереходВремя
AWBLN1→N2, S1→S219:40
AWBLN→S (между группами)90:00
CSM 02 / CSM 07любая смена шва13:00
SMA/SMB4любая смена шва2:20

Важно: переход N→S на AWBL — 90 минут. Это делает группировку по шву на AWBL критичной: все N-швы вместе, все S-швы вместе, переход между группами — один раз за смену максимум.

  • Порядок группировки на сборке (по ответу 5.5): угол → плёнка → шов. Заметь: стоимость переналадки на сборке идёт от шва, плёнки и серии (угол ставится на нарезке и на сборочную переналадку не влияет). Для отображения в форме использовать порядок из 5.5, стоимость переналадки при секвенировании считать по шву/плёнке/серии. (см. раздел 9 — уточнить противоречие).
  • Экономичная партия: одинаковые мелкие заказы копим до 1000 шт, потом пускаем партией (5.8).

Алгоритм секвенирования внутри смены

Внутри каждой смены потока переупорядочить позиции так, чтобы сумма переналадок была минимальной, не нарушая сроки:

  1. Группировать по ключам в порядке дороговизны перехода для этого станка (для сборки — сначала шов/серия как самые дорогие, внутри — плёнка; учитывать матрицу переходов, особенно N→S на AWBL).
  2. Группировать только внутри одного срока/дня (5.9) — не смешивать позиции с разными сроками ради экономии.
  3. Срочные вклинивать в ближайшую подходящую по шву/серии группу без нарушения сроков (3.1, 3.4).
  4. Мелкие одинаковые позиции объединять в партию по достижении 1000 шт (5.8).

8. Форматы вывода

  1. Календарь (экран): потоки × (день, смена), загрузка и подсветка срывов.
  2. Сменное задание по потоку (экран + экспорт в Excel): колонки — номенклатура, кол-во, тип шва, тип плёнки, угол, № заказа, заказчик, дата изготовления, ОУ; строки сгруппированы и упорядочены под минимум переналадки; в подвале — общее количество лент, штат по ТЗ, строка для фактического штата.
  3. Не распределено: номенклатура, кол-во, № заказа, причина.
  4. Передать на участок бобин и товарных рулонов: номенклатура, кол-во, № заказа, заказчик, дата.
  5. Невыполнимые сроки: позиция, поток, срок, на сколько не успеваем, действие мастера.

Экспорт в Excel — через SheetJS, одной книгой с листами по потокам (как в текущем planner_lb_v2.py, функция write_output).


9. Открытые вопросы и допущения

Реализовать с этими допущениями, пометить в коде как требующие подтверждения:

  1. Порядок целей. В 0.1 записано «переналадка → загрузка → срок», но 0.3 и 5.9 делают срок жёстким. Приоритет: срок — жёсткий предел; внутри допустимого минимизируем переналадку, затем максимизируем загрузку.
  2. Опрос мастера при срыве срока (0.1, 0.3): механику подтвердить — сейчас реализуем как подсветку позиций-нарушителей и действие мастера (разрешить опоздание / отложить).
  3. Времена нарезки (5.1): даны только настройки станка (СВ500 2:00, BTFW 20:00). Смену ширины/угла внутри бобины считаем бесплатной. Подтвердить.
  4. Порядок группировки на сборке (5.5 против 5.4): 5.5 просит «угол → плёнка → шов», но угол на сборочную переналадку не влияет. Для показа берём порядок 5.5, стоимость считаем по шву/плёнке/серии. Подтвердить.
  5. Точность нормы. Норма НВ — сводная на ленту (ч/шт по размеру), не по операциям. Вешаем её на сборку. Загрузка будет приблизительной, пока не появятся нормы по станкам раздельно на нарезку и сборку. Заложить возможность позже подменить норму таблицей «поток → стадия → норма».
  6. Дизамбигуация нормы по размеру. В справочнике НВ один типоразмер может подходить под несколько шаблонов с разбросом нормы до 100× (обычная лента 0.011 ч/шт против войлочной полировальной 0.916 при одном размере). При выборе шаблона отсекать спец-шаблоны (войлок, полировальные, Gigant) для обычных лент — сопоставлять по паре серия+размер, а не только по размеру. Логику проверить на 26.06.

Хвосты по ТЗ лент, всплывшие на боевом файле (из приложения к опроснику — не блокируют, но заложить обработку/заглушку):

  • Узкая ручная лента — какой угол в колонку: сейчас при длине <1000 мм ставится 80°.
  • В правиле потоков 7/11 названы только -10RW-серии; RX12RW/MX12RW/ZX20RW/SX10RW всегда идут в поток 11.
  • Плёнка: правило даёт цвет (синяя/белая), а в форме пример со значением «АДК4» — нужен переводник цвет→код либо цвет и есть значение колонки.
  • Серия KD20XW отсутствует в таблице шва — для неё шов встаёт как «?». Добавить KD20XW (и, возможно, другие KD-серии) в SEAM_RULES.
  • Часть нетканки не содержит серии в обозначении — для маршрутизации это не мешает (нетканка идёт по словам corse/medium/veri fine), для полноты справочника проверить на свежей выгрузке.

10. Критерии приёмки

  1. Офлайн. Файл работает при полностью отключённой сети, без единого обращения наружу.
  2. Маршрутизация. На выгрузке 26.06 раскладка по потокам совпадает с выводом planner_lb_v2.py; двойные итоговые блоки не задваивают количество; позиции без потока — на листе «Не распределено» с причиной, ничего не теряется молча.
  3. Рулоны/бобины — на листе передачи, не маршрутизируются.
  4. Норма — по паре серия+размер, без стократных выбросов войлока на обычных лентах.
  5. Календарь — сроки не нарушаются; нарезка стоит на смену раньше сборки; внутри смены задания сгруппированы под минимум переналадки; переход N→S на AWBL не чаще раза за смену; мелочь объединяется в партию от 1000 шт; срочные — в начале очереди своего потока без срыва сроков.
  6. Невыполнимые сроки выносятся мастеру, а не прячутся.
  7. Экспорт в Excel формирует книгу сменных заданий по потокам.
  8. Ручные переключатели (срочно, простой станка, люди по сменам) влияют на пересчёт.

11. Этапность

Этап 1. Каркас и маршрутизация. HTML-файл, чтение .xls (с дедупом блоков), порт маршрутизации и регламента шва/плёнки/угла из planner_lb_v2.py, лист передачи для рулонов, экспорт задания в Excel. Проверка на 26.06 против прототипа.

Этап 2. Нормы и базовая раскладка. Встроить нормы НВ (с дизамбигуацией серия+размер), расчёт мощности смены, очередь по сроку+срочности, задел нарезка→сборка, разложить по дням и сменам на горизонт.

Этап 3. Переналадка и секвенирование. Встроить карту переналадки, переупорядочивание внутри смены под минимум переналадки, матрица переходов (N→S на AWBL), порог партии 1000, обработка срочных и пополнения.

Этап 4. Интерфейс мастера. Календарь, ручные переключатели (срочно, простой, люди по сменам), панель невыполнимых сроков, кнопка пересчёта, финальная выгрузка.

После каждого этапа — прогон на реальной выгрузке и показ заказчику.