Функционал системы контроля заданий на выпуск продукции заключается в том, чтобы получать сменные задания (партии) и уникальные идентификаторы продукции в рамках этой партии, а так же проверять (по запросу из внешней системы), принадлежит ли данный идентификатор продукции данной партии.
Основные задачи:
- Эндпойнт добавления сменных заданий
- Эндпойнт получения сменного задания по ID
- Эндпойнт изменения сменного задания по ID
- Эндпойнт добавления продукции для сменного задания (партии)
- Эндпойнт получения списка сменных заданий по фильтрам
- Эндпойнт "агрегации" продукции
Задачи "CI/CD":
- Тесты
- docker
- Базовый CI/CD
Запуск проекта:
- Склонируйте репозиторий:
git clone https://github.com/ShadeSWD/production-control-system.git
- Установите пакетный менеджер poetry:
pip install poetry
- Создайте базу данных в
PostgreSQLи заполните файл.env, воспользовавшись.env.sample - Перейдите в папку с проектом и настройте виртуальное окружение
poetry install
- Войдите в виртуальное окружение
poetry shell
- Накатите миграции:
alembic upgrade head
- Запустите сервер:
uvicorn production_tasks.main:app --reload
- Перед первым коммитом необходимо выполнить
для автоматического выполнения проверок перед коммитами
pre-commit install
Принимает список сменных заданий в виде json.
Сменное задание состоит из следующих полей со следующими типами:
- СтатусЗакрытия: bool
- ПредставлениеЗаданияНаСмену: str
- Рабочий центр: str
- Смена: str
- Бригада: str
- НомерПартии: int
- ДатаПартии: date
- Номенклатура: str
- КодЕКН: str
- ИдентификаторРЦ: str
- ДатаВремяНачалаСмены: datetime
- ДатаВремяОкончанияСмены: datetime
Пример:
[
{
"СтатусЗакрытия": false,
"ПредставлениеЗаданияНаСмену": "Задание на смену 2345",
"РабочийЦентр": "Т2",
"Смена": "1",
"Бригада": "Бригада №4",
"НомерПартии": 22222,
"ДатаПартии": "2024-01-30",
"Номенклатура": "Какая то номенклатура",
"КодЕКН": "456678",
"ИдентификаторРЦ": "A",
"ДатаВремяНачалаСмены": "2024-01-30T20:00:00+05:00",
"ДатаВремяОкончанияСмены": "2024-01-31T08:00:00+05:00"
}
]У сменного задания помимо поля СтатусЗакрытия создается поле closed_at (время закрытия), которое выставляется при закрытии партии (если она еще открыта, то это поле имеет значение null). Так же у сменного задания есть внутренний id (primary key), по которому можно получить информацию о конкретном сменном задании, либо же изменить ее (например, закрыть сменное задание).
Пара НомерПартии и ДатаПартии всегда уникальна! Если уже существует какая-то партия с аналогичным номером партии и датой партии, она будет перезаписана.
Данный эндпойнт должен возвращает json со сменным заданием по его внутреннему ID вместе со списком уникальных кодов продукции, привязанных к этой партии.
Если сменного задания с данным ID нет, возвращается ошибка 404.
Данный эндпойнт позволяет изменить одно или несколько полей. Если сменного задания с данным ID нет, то возвращает 404 ошибку.
Если статус закрытия партии меняется на True, то в closed_at выставляется текущий datetime, а если наоборот -- то null.
В качестве респонса возвращает json обновленной партии.
Данный эндпойнт возвращает json со списком сменных заданий по различным фильтрам (closing_status, lot_number, shift_assignement, lot_date, shift_start, shift_end).
Также доступен order by по lot_date, lot_number, shift_start, shift_end, closed_at, реализована пагинация.
Данный эндпойнт получает из корпоративной системы заказчика список уникальных кодов продукции и сменных заданий (НомерПартии и ДатаПартии), к которому данный код продукции привязан.
Пример:
[
{
"УникальныйКодПродукта": "12gRV60MMsn1",
"НомерПартии": 22222,
"ДатаПартии": "2024-01-30"
},
{
"УникальныйКодПродукта": "12gRV60MMsn2",
"НомерПартии": 33333,
"ДатаПартии": "2024-01-31"
}
]Сохраняется уникальный код продукции с привязкой к партии. Дополнительно к коду добавляются поля is_aggregated (bool поле, был ли данный уникальный код продукции уже агрегирован) и aggregated_at (datetime, когда была агрегирована продукция с данным уникальным кодом). Если продукция передана с несуществующей партией (нет сменного задания с указанным номером партии и датой партии), то данную продукция игнорируется.
Если переданная продукция с данным уникальным кодом уже существует, она игнорируется.
Данный эндпойнт принимает ID партии (primary key) и уникальный код продукции. Если данный уникальный код продукции существует и привязан к партии с данным ID, и при этом данный уникальный код продукции не был использован (агрегирован), то is_aggregated изменяется на true и aggregated_at на текущий datetime. Возвращается уникальный код в виде json-а.
Если данный уникальный код уже был использован, то возвращается 400 ошибка с описанием: unique code already used at {aggregated_at}.
Если уникальный код существует, но привязан к другой партии, возвращается 400 ошибка с описанием: unique code is attached to another batch.
Если продукции с данным уникальным кодом не существует, то возвращается ошибка 404.
- Для запуска тестов необходимо находясь в корне проекта активировать виртуальное окружение
poetry shell
- запустите тесты командой
pytestpytest
- для просмотра отчета о покрытии тестами выполните
pytest --cov
- сгенерировать интерактивный отчет о покрытии тестами можно следующим образом
для его просмотра необходимо зайти в папку
pytest --cov --cov-report=html
htmlcovв корне проекта и открыть в браузереindex.html
Для запуска приложения с помощью docker:
- Склонируйте репозиторий:
git clone https://github.com/ShadeSWD/production-control-system.git
- перейдите в корневой каталог
production-control-system - Выполните сборку образов
docker-compose build
- Запустите контейнер
docker-compose up
- Приложение будет доступно по адресу
http://localhost:7777/
Перед запуском контейнера должна быть создана база данных на хосте (или в другом контейнере), её переменные среды должны быть переданы в момент запуска контейнера
docker run -e DB_NAME=<db name> -p <app port>:8000 -e DB_HOST=host.docker.internal -e DB_USER=<db user> -e DB_PASSWORD=<db password> -e DB_PORT=<db port> ghcr.io/shadeswd/production-control-system:latest<db name>- название базы данных<app port>- порт, на котором будет работать сервис<db user>- пользователь БД<db password>- пароль пользователя БД<db port>- порт БД
Приложение будет доступно по адресу http://localhost:<app port>/
Github actions:
- Проверка кода линтерами (
flake8) и форматерами (black,isort). - Запуск тестов
- Сборка проекта в docker образ и отправка в Github Container Registry