ТЗ для 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. Исходные материалы (передаёт заказчик)
planner_lb_v2.py— рабочий прототип. Эталон логики маршрутизации, регламента шва, плёнки, угла, разбора обозначения, чтения файла. Портировать из него, а не изобретать заново.Справочник_серий_ЛБ_БАЗ.xlsx— серии и типы основы (листы: Серии, Типы основы, Швы, Группы и размеры, Разбор обозначения).Нормы_НВ_ЛБ_БАЗ.xlsx— 259 шаблонов НВ, норма в ч/шт по размерному диапазону (ширина×длина). Данные встроить в приложение как JSON.Сменное_задание_ЛБ_26_06_ИТОГ.xlsxи/или сырой .xls «Заказ на день» за 26.06 — реальный файл для тестирования.- Два заполненных опросника — источник всех правил раскладки и карты переналадки (сведены в разделы 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 |
| 2 | BTFW2000/BTA4 | нарезка | 2 |
| 3 | CSM07 напильники | сборка | 4 |
| 4 | AWBL | сборка | 4 |
| 5 | CSM07 широкие | сборка | 4 |
| 6 | CSM07 сегментные | сборка | 4 |
| 7 | CSM02 узкие | сборка | 2 |
| 8 | CSM07 нетканка | сборка | 4 |
| 9 | Metis конуса | сборка | 5 |
| 10 | Участок ЛВП | сборка | 1 |
| 11 | SMA/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. Здесь — общая механика:
- Для каждого потока известна мощность смены = штат × 8 ч ÷ норма (см. 6, п. «Мощность»).
- Позиции потока сортируются по приоритету (срок + срочность), см. 6.
- Смена набивается позициями до предела мощности (в чел-часах), внутри — переупорядочивание под минимум переналадки (раздел 7). Остаток переходит в следующую смену/день.
- Нарезка ставится на смену раньше сборки той же позиции (задел, п. 1.6 опросника).
- Позиции, которые не влезают в свой срок, подсвечиваются и выносятся мастеру (см. 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/SMB4 | 13:20 | 2:20 | 1:30 | — | 2:20 |
| CSM 02 | 36:30 | 13:20 | 0:50 | — | 13:20 |
| AWBL | 33:30 | 19:40 | 9:30 | — | 19:40 |
| CSM 07 | 30:00 | 13:00 | 9:30 | — | 13:00 |
Смена размера ленты (ширина×длина) переналадки не требует ни на одном станке.
Матрица переходов по шву (5.6) — переопределяет обычную «смену шва» там, где указана:
| Станок | Переход | Время |
|---|---|---|
| AWBL | N1→N2, S1→S2 | 19:40 |
| AWBL | N→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).
Алгоритм секвенирования внутри смены
Внутри каждой смены потока переупорядочить позиции так, чтобы сумма переналадок была минимальной, не нарушая сроки:
- Группировать по ключам в порядке дороговизны перехода для этого станка (для сборки — сначала шов/серия как самые дорогие, внутри — плёнка; учитывать матрицу переходов, особенно N→S на AWBL).
- Группировать только внутри одного срока/дня (5.9) — не смешивать позиции с разными сроками ради экономии.
- Срочные вклинивать в ближайшую подходящую по шву/серии группу без нарушения сроков (3.1, 3.4).
- Мелкие одинаковые позиции объединять в партию по достижении 1000 шт (5.8).
8. Форматы вывода
- Календарь (экран): потоки × (день, смена), загрузка и подсветка срывов.
- Сменное задание по потоку (экран + экспорт в Excel): колонки — номенклатура, кол-во, тип шва, тип плёнки, угол, № заказа, заказчик, дата изготовления, ОУ; строки сгруппированы и упорядочены под минимум переналадки; в подвале — общее количество лент, штат по ТЗ, строка для фактического штата.
- Не распределено: номенклатура, кол-во, № заказа, причина.
- Передать на участок бобин и товарных рулонов: номенклатура, кол-во, № заказа, заказчик, дата.
- Невыполнимые сроки: позиция, поток, срок, на сколько не успеваем, действие мастера.
Экспорт в Excel — через SheetJS, одной книгой с листами по потокам (как в текущем planner_lb_v2.py, функция write_output).
9. Открытые вопросы и допущения
Реализовать с этими допущениями, пометить в коде как требующие подтверждения:
- Порядок целей. В 0.1 записано «переналадка → загрузка → срок», но 0.3 и 5.9 делают срок жёстким. Приоритет: срок — жёсткий предел; внутри допустимого минимизируем переналадку, затем максимизируем загрузку.
- Опрос мастера при срыве срока (0.1, 0.3): механику подтвердить — сейчас реализуем как подсветку позиций-нарушителей и действие мастера (разрешить опоздание / отложить).
- Времена нарезки (5.1): даны только настройки станка (СВ500 2:00, BTFW 20:00). Смену ширины/угла внутри бобины считаем бесплатной. Подтвердить.
- Порядок группировки на сборке (5.5 против 5.4): 5.5 просит «угол → плёнка → шов», но угол на сборочную переналадку не влияет. Для показа берём порядок 5.5, стоимость считаем по шву/плёнке/серии. Подтвердить.
- Точность нормы. Норма НВ — сводная на ленту (ч/шт по размеру), не по операциям. Вешаем её на сборку. Загрузка будет приблизительной, пока не появятся нормы по станкам раздельно на нарезку и сборку. Заложить возможность позже подменить норму таблицей «поток → стадия → норма».
- Дизамбигуация нормы по размеру. В справочнике НВ один типоразмер может подходить под несколько шаблонов с разбросом нормы до 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. Критерии приёмки
- Офлайн. Файл работает при полностью отключённой сети, без единого обращения наружу.
- Маршрутизация. На выгрузке 26.06 раскладка по потокам совпадает с выводом
planner_lb_v2.py; двойные итоговые блоки не задваивают количество; позиции без потока — на листе «Не распределено» с причиной, ничего не теряется молча. - Рулоны/бобины — на листе передачи, не маршрутизируются.
- Норма — по паре серия+размер, без стократных выбросов войлока на обычных лентах.
- Календарь — сроки не нарушаются; нарезка стоит на смену раньше сборки; внутри смены задания сгруппированы под минимум переналадки; переход N→S на AWBL не чаще раза за смену; мелочь объединяется в партию от 1000 шт; срочные — в начале очереди своего потока без срыва сроков.
- Невыполнимые сроки выносятся мастеру, а не прячутся.
- Экспорт в Excel формирует книгу сменных заданий по потокам.
- Ручные переключатели (срочно, простой станка, люди по сменам) влияют на пересчёт.
11. Этапность
Этап 1. Каркас и маршрутизация. HTML-файл, чтение .xls (с дедупом блоков), порт маршрутизации и регламента шва/плёнки/угла из planner_lb_v2.py, лист передачи для рулонов, экспорт задания в Excel. Проверка на 26.06 против прототипа.
Этап 2. Нормы и базовая раскладка. Встроить нормы НВ (с дизамбигуацией серия+размер), расчёт мощности смены, очередь по сроку+срочности, задел нарезка→сборка, разложить по дням и сменам на горизонт.
Этап 3. Переналадка и секвенирование. Встроить карту переналадки, переупорядочивание внутри смены под минимум переналадки, матрица переходов (N→S на AWBL), порог партии 1000, обработка срочных и пополнения.
Этап 4. Интерфейс мастера. Календарь, ручные переключатели (срочно, простой, люди по сменам), панель невыполнимых сроков, кнопка пересчёта, финальная выгрузка.
После каждого этапа — прогон на реальной выгрузке и показ заказчику.