add shel
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
# Фаза 10. Предметы и мебель
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 5](05-people-defs.md)
|
||||
- [Фаза 7](07-people-in-school.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Каталог учится описывать предметы, кабинет перестаёт быть таблицей слотов, а должность учителя
|
||||
становится одной на всех. Людей это ещё не двигает: школа собирается как прежде.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [x] `SubjectDef` в `HSchool.Content`: развиваемые навыки с долями, диапазон параллелей;
|
||||
ссылка на неизвестный навык — ошибка загрузки
|
||||
- [x] Ванильные предметы в `core`: начальные классы (1–4, всё понемногу) и предметники по
|
||||
существующим навыкам, включая физкультуру
|
||||
- [x] `PositionDef PETeacher` упраздняется; `Classroom`, `ComputerLab` и `GymHall` больше не
|
||||
открывают учительскую должность
|
||||
- [x] Кабинет-`Homeroom` описывается числом мест, а не таблицей именованных слотов; вместимость
|
||||
по-прежнему считается по мебели
|
||||
- [x] Слоты остаются у столовой, медкабинета, кабинета директора и библиотеки
|
||||
- [x] Редактор карты показывает у кабинета одно поле «мест», у прочих комнат — прежние слоты
|
||||
- [x] Ванильная карта переписана под новую форму, вместимость параллелей не изменилась
|
||||
- [x] `GET /api/catalog` отдаёт предметы — они понадобятся форме назначения
|
||||
- [x] Стартовая дата по умолчанию — суббота 31 марта 2012
|
||||
- [x] Снимок карты и `docs/protocol.md` правятся в том же коммите, если меняется раскладка узла
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Каталог `core` грузится, предметы проходят валидацию, тест на полноту локалей зелёный
|
||||
- Школа на ванильной карте даёт те же одиннадцать классов и ту же вместимость, что и до фазы
|
||||
- Редактор карты не показывает у кабинета ни доски, ни стула учителя
|
||||
- `dotnet test` и клиентские `npm test` / `build` проходят
|
||||
|
||||
## Стоп
|
||||
|
||||
Не трогать наём. Генератор пока закрывает должности сам — школа опустеет в следующей фазе.
|
||||
@@ -0,0 +1,44 @@
|
||||
# Фаза 11. Пустая школа и пул соискателей
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 10](10-subjects.md)
|
||||
- [Фаза 6](06-people-generator.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Школа открывается без единого сотрудника, а рядом появляется пул людей, готовых наняться.
|
||||
Нанимать пока нечем — это фаза про данные.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] `RosterGenerator` больше не закрывает должности: новая школа получает учеников, родителей
|
||||
и ноль сотрудников
|
||||
- [ ] Пул соискателей в `HSchool.People`: список полноценных `Person`, детерминированный от сида
|
||||
школы и номера недели
|
||||
- [ ] Соискателем может стать родитель ученика — тот же человек, без второй сущности
|
||||
- [ ] Базовый запрос по зарплате считается из навыков соискателя; шкала — в данных, не в коде
|
||||
- [ ] Еженедельное обновление: часть уходит, часть остаётся с теми же именами и запросом,
|
||||
приходят новые. Полная замена запрещена
|
||||
- [ ] Пул живёт в `saves/{id}.people.json` рядом с ростером и пишется по тем же правилам —
|
||||
при изменении состава, не по таймеру
|
||||
- [ ] Воркер публикует пул вместе со снимком ростера
|
||||
|
||||
## Тесты, без которых фаза не закрыта
|
||||
|
||||
- [ ] Тот же сид и та же неделя — тот же пул
|
||||
- [ ] После обновления часть людей та же самая, с теми же навыками и тем же запросом
|
||||
- [ ] Пул не пустеет и не растёт бесконечно за пятьдесят недель
|
||||
- [ ] Запрос по зарплате у сильного кандидата выше, чем у слабого
|
||||
- [ ] Новая школа не имеет ни одного сотрудника, но все ученические места заняты
|
||||
- [ ] Соискатель не попадает в ростер школы, пока не нанят
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Создать школу — в списке людей есть ученики и родители, работников нет
|
||||
- Перезапуск сервера поднимает тот же пул
|
||||
- `dotnet test` проходит
|
||||
|
||||
## Стоп
|
||||
|
||||
Ни найма, ни денег, ни назначения предметов. Пул только существует и обновляется.
|
||||
@@ -0,0 +1,42 @@
|
||||
# Фаза 12. Наём, предметы и предел бюджета
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 11](11-applicants.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Игрок нанимает людей и раздаёт предметы, а выделенная сумма ограничивает, сколько он может себе
|
||||
позволить. Экрана ещё нет — всё через API.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Выделяемая на месяц сумма — в `SimulationOptions`, с умолчанием
|
||||
- [ ] Фонд оплаты школы: сумма базовых ставок плюс надбавки за предметы сверх первого
|
||||
- [ ] Наём: соискатель уходит из пула, становится работником, попадает в ростер. Родитель
|
||||
остаётся родителем — новой сущности не заводится
|
||||
- [ ] Назначение предмета нанятому и снятие предмета
|
||||
- [ ] Предел проверяется **в момент действия**: наём или назначение, выводящее фонд за
|
||||
выделенную сумму, отклоняется с внятным кодом ошибки, а не откладывается до конца месяца
|
||||
- [ ] Покрытие предметов: какие предметы преподаются в существующих параллелях и не имеют ни
|
||||
одного учителя
|
||||
- [ ] `GET /api/schools/{id}/staffing` — деньги, покрытие, пул и штат; читает опубликованный
|
||||
снимок, воркер не трогает
|
||||
- [ ] Наём и назначение идут в воркер через мейлбокс с `TaskCompletionSource`, как create и delete
|
||||
- [ ] Состав пишется на диск при изменении, снимок публикуется заново
|
||||
- [ ] `docs/protocol.md` пополняется в том же коммите, что и обработчики
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Нанять двоих на 3 000 и 7 000 при выделенных 10 000 — третий наём отклонён
|
||||
- Снять предмет — фонд уменьшился, наём снова возможен
|
||||
- Назначение, не влезающее в предел, отклонено, и в ответе видно почему
|
||||
- Перезапуск сервера поднимает школу с тем же штатом и теми же назначениями
|
||||
- Тесты API: наём, повторный наём того же человека, отклонение по пределу, неизвестная школа,
|
||||
неизвестный соискатель
|
||||
- `dotnet test` проходит
|
||||
|
||||
## Стоп
|
||||
|
||||
Не увольнять. Не платить зарплату по месяцам — предел проверяется, деньги не движутся.
|
||||
Не расписание.
|
||||
@@ -0,0 +1,36 @@
|
||||
# Фаза 13. Раздел «Управление»
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 12](12-hiring-budget.md)
|
||||
- [Фаза 8](08-people-browser.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Игрок собирает школу руками: видит деньги, перебирает соискателей, нанимает и раздаёт предметы.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Под часами появляются два верхних раздела: «Обзор» и «Управление». В «Обзоре» — всё, что
|
||||
есть сейчас; часы и дата видны в обоих
|
||||
- [ ] Строка денег: выделено, расписано, свободно
|
||||
- [ ] Список непокрытых предметов — что школа не может преподавать
|
||||
- [ ] Список соискателей: имя, запрашиваемая ставка, сильные навыки; выбор показывает карточку
|
||||
человека справа — ту же, что в «Людях»
|
||||
- [ ] Кнопка найма; отказ по пределу показывается текстом, а не молчанием
|
||||
- [ ] Список штата: кто нанят, какие предметы ведёт, сколько стоит
|
||||
- [ ] Назначение и снятие предмета с карточки нанятого
|
||||
- [ ] Строки через `t(...)`, обе локали
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Создать школу, открыть «Управление», нанять учителя, назначить ему математику
|
||||
- Дойти до предела — попытка нанять ещё одного объясняет, что денег нет
|
||||
- Снять предмет и убедиться, что свободных денег стало больше
|
||||
- Перейти в «Обзор» → «Люди» и увидеть нанятого в общем списке с ролью работника
|
||||
- Нанять родителя ученика и увидеть у него обе роли на одной карточке
|
||||
- `dotnet test` и клиентские `npm test` / `build` проходят
|
||||
|
||||
## Стоп
|
||||
|
||||
Не увольнять из интерфейса. Не показывать расписание и нагрузку по часам — только предметы.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Фаза 14. Каркас дня и каникулы
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 10](10-subjects.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Школа получает учебный календарь: во сколько звонок, сколько уроков, какие дни рабочие и когда
|
||||
каникулы. Расписания ещё нет — есть время, в которое его можно будет положить.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Каркас дня в `core` дефом: начало первого урока, число уроков, длина урока, длины перемен
|
||||
и какая из них большая
|
||||
- [ ] Длина учебной недели — в `SimulationOptions`, пять дней по умолчанию
|
||||
- [ ] Каникулы дефами: осенние, зимние, весенние, лето — диапазонами дат внутри учебного года
|
||||
- [ ] Запрос «какой сейчас слот»: номер урока или перемена, или «вне учебного дня» — по игровому
|
||||
времени, выходным и каникулам
|
||||
- [ ] Требование к типу помещения у `SubjectDef`: физкультура в спортзале, информатика в
|
||||
компьютерном классе; без требования — кабинет класса
|
||||
- [ ] `GET /api/catalog` отдаёт каркас дня — он понадобится сетке расписания
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- В субботу, в каникулы и в 23:00 запрос слота отвечает «занятий нет»
|
||||
- В 10:20 буднего учебного дня отвечает конкретным номером урока
|
||||
- Смена длины недели в настройках делает субботу рабочей
|
||||
- `dotnet test` проходит
|
||||
|
||||
## Стоп
|
||||
|
||||
Ни одного урока не ставится. Ни планировщика, ни экрана.
|
||||
@@ -0,0 +1,41 @@
|
||||
# Фаза 15. Планировщик
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 14](14-school-calendar.md)
|
||||
- [Фаза 12](12-hiring-budget.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Из учебного плана, назначений и карты получается таблица уроков. Библиотека проверяется тестами,
|
||||
без мира и без хоста, как генератор людей.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Новый проект рядом с `HSchool.People`: зависит только на `HSchool.Content`, без Arch и
|
||||
ASP.NET; отдаёт простую таблицу уроков
|
||||
- [ ] Раскладка часов учебного плана по слотам недели для каждого класса
|
||||
- [ ] Кабинет урока: требование предмета, иначе кабинет класса
|
||||
- [ ] Четыре запрета соблюдаются: учитель, класс и кабинет не заняты дважды, класс влезает в кабинет
|
||||
- [ ] Непокрытые часы не ставятся, а возвращаются отдельным списком — их покажет «Управление»
|
||||
- [ ] Закреплённые игроком уроки принимаются на вход и переживают перестроение; остальное
|
||||
раскладывается вокруг них
|
||||
- [ ] Детерминированность: те же штат, назначения и карта дают ту же таблицу
|
||||
|
||||
## Тесты, без которых фаза не закрыта
|
||||
|
||||
- [ ] Один спортзал на одиннадцать классов — физкультура разъезжается по слотам, а не дублируется
|
||||
- [ ] Учитель с двумя предметами не стоит в двух местах в одном слоте
|
||||
- [ ] Класс на 16 не попадает в кабинет на 12
|
||||
- [ ] Предмет без учителя даёт дыру и запись в непокрытых
|
||||
- [ ] Закреплённый урок остаётся на месте после найма ещё одного учителя
|
||||
- [ ] Те же входы — та же таблица
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Тесты библиотеки зелёные
|
||||
- В проекте нет упоминаний сокетов, ECS и `DateTime.Now`
|
||||
|
||||
## Стоп
|
||||
|
||||
Не трогать сервер, сейв и клиент. Таблица пока никуда не уезжает.
|
||||
@@ -0,0 +1,38 @@
|
||||
# Фаза 16. Расписание в школе
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 15](15-timetable-planner.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Расписание живёт в школе, переживает перезапуск и отвечает на вопрос «кто где сейчас». Экрана
|
||||
ещё нет.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] Расписание пересобирается при найме, увольнении и изменении назначений — **не по тику**
|
||||
- [ ] Хранится в сейве рядом с составом; пишется при изменении, не по таймеру. Закреплённые
|
||||
игроком уроки сохраняются вместе с ним
|
||||
- [ ] Воркер публикует расписание снимком, как ростер
|
||||
- [ ] «Кто где сейчас» **вычисляется** из расписания и часов, а не хранится вторым состоянием
|
||||
- [ ] Команда закрепления и снятия закрепления урока — через мейлбокс воркера
|
||||
- [ ] `GET /api/schools/{id}/timetable` — расписание класса и расписание человека; читает
|
||||
опубликованный снимок
|
||||
- [ ] Снимок карты отдаёт по узлу, что там сейчас идёт и у кого; протокол и `docs/protocol.md`
|
||||
правятся тем же коммитом, версия бумпится
|
||||
- [ ] Панель локации получает данные для «Сейчас» и «Персонажей»
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Нанять учителя математики — в расписании появились уроки математики
|
||||
- Снять назначение — уроки исчезли, предмет стал непокрытым
|
||||
- Передвинуть урок, нанять ещё одного человека — передвинутый остался на месте
|
||||
- Перемотать время на ×4 через звонок — «кто где сейчас» меняется вместе с уроком
|
||||
- В каникулы и в выходной никто нигде не находится
|
||||
- Перезапуск сервера поднимает то же расписание с теми же закреплениями
|
||||
- `dotnet test` проходит
|
||||
|
||||
## Стоп
|
||||
|
||||
Не рисовать расписание на экране. Не перемещать людей по карте.
|
||||
@@ -0,0 +1,34 @@
|
||||
# Фаза 17. Расписание на экране
|
||||
|
||||
## Зависимости
|
||||
|
||||
- [Фаза 16](16-timetable-in-school.md)
|
||||
- [Фаза 13](13-management-tab.md)
|
||||
|
||||
## Зачем
|
||||
|
||||
Школа перестаёт быть списком имён: видно, что происходит в комнатах прямо сейчас и как выглядит
|
||||
неделя класса и учителя.
|
||||
|
||||
## Задачи
|
||||
|
||||
- [ ] В дереве карты рядом с комнатой — что и у кого там сейчас: `Кабинет 204 (Математика · 5Б)`.
|
||||
Свободная комната остаётся без скобок
|
||||
- [ ] Панель локации: «Сейчас» — урок и класс, «Персонажи» — учитель и ученики этого класса
|
||||
- [ ] В «Управлении» — расписание класса: сетка «день × урок», выбор параллели
|
||||
- [ ] В карточке человека — его личное расписание, рядом с навыками и семьёй
|
||||
- [ ] Правка урока из сетки: перенос и смена кабинета, видимая отметка «закреплено» и снятие
|
||||
- [ ] Отказ планировщика (некуда поставить, кабинет занят) объясняется текстом, а не молчанием
|
||||
- [ ] Строки через `t(...)`, обе локали
|
||||
|
||||
## Критерий готовности
|
||||
|
||||
- Открыть школу в учебное время и увидеть в дереве занятые кабинеты, а в каникулы — пустые
|
||||
- Открыть расписание 5Б, найти окно на месте непокрытого предмета
|
||||
- Открыть учителя и увидеть те же уроки с его стороны
|
||||
- Передвинуть урок и убедиться, что он не разъехался после найма
|
||||
- `dotnet test` и клиентские `npm test` / `build` проходят
|
||||
|
||||
## Стоп
|
||||
|
||||
Не общая сетка на всю школу. Не оценки и не посещаемость. Не анимация перемещений.
|
||||
@@ -36,3 +36,35 @@
|
||||
| [7. Люди в школе](07-people-in-school.md) | ✅ | Сущности в `World`, ростер на диске, 11 кабинетов в `core` |
|
||||
| [8. Просмотр людей](08-people-browser.md) | ✅ | Панель со списком, фильтрами и карточкой |
|
||||
| [9. Годовой набор](09-yearly-intake.md) | ✅ | Первое сентября: переход, выпуск, набор |
|
||||
|
||||
## Срез 3. Штат
|
||||
|
||||
Дизайн: [`../design/staffing.md`](../design/staffing.md).
|
||||
|
||||
Первый срез, где игрок принимает решения. Школа открывается пустой: надо нанять людей из пула
|
||||
соискателей, раздать им предметы и уложиться в выделенную на месяц сумму. Уроков по-прежнему нет —
|
||||
предмет это запись в нагрузке, а не событие в кабинете.
|
||||
|
||||
Фазы идут строго по порядку: каждая опирается на данные предыдущей.
|
||||
|
||||
| Фаза | Статус | Зачем |
|
||||
| --- | --- | --- |
|
||||
| [10. Предметы и мебель](10-subjects.md) | ✅ | `SubjectDef`, одна учительская должность, кабинет как число мест |
|
||||
| [11. Пустая школа и пул](11-applicants.md) | ⬜ | Школа без сотрудников, соискатели с запросом по зарплате |
|
||||
| [12. Наём и бюджет](12-hiring-budget.md) | ⬜ | Наём, назначение предметов, предел фонда оплаты |
|
||||
| [13. Раздел «Управление»](13-management-tab.md) | ⬜ | Деньги, соискатели, штат и назначения на экране |
|
||||
|
||||
## Срез 4. Расписание
|
||||
|
||||
Дизайн: [`../design/schedule.md`](../design/schedule.md).
|
||||
|
||||
Часы учебного плана раскладываются по дням и кабинетам. Школа начинает жить по времени: видно,
|
||||
что идёт в комнате прямо сейчас. Люди при этом по-прежнему **не ходят** — они находятся там, где
|
||||
их застало расписание.
|
||||
|
||||
| Фаза | Статус | Зачем |
|
||||
| --- | --- | --- |
|
||||
| [14. Каркас дня и каникулы](14-school-calendar.md) | ⬜ | Звонки, длина недели, каникулы |
|
||||
| [15. Планировщик](15-timetable-planner.md) | ⬜ | Раскладка часов по слотам, четыре запрета |
|
||||
| [16. Расписание в школе](16-timetable-in-school.md) | ⬜ | Сейв, снимок, «кто где сейчас» |
|
||||
| [17. Расписание на экране](17-timetable-screen.md) | ⬜ | Скобки в дереве, сетка класса, расписание учителя |
|
||||
|
||||
Reference in New Issue
Block a user