Skip to content

ShadeSWD/production-control-system

Repository files navigation

Система контроля заданий на выпуск продукции

Функционал системы контроля заданий на выпуск продукции заключается в том, чтобы получать сменные задания (партии) и уникальные идентификаторы продукции в рамках этой партии, а так же проверять (по запросу из внешней системы), принадлежит ли данный идентификатор продукции данной партии.

Основные задачи:

  • Эндпойнт добавления сменных заданий
  • Эндпойнт получения сменного задания по 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), по которому можно получить информацию о конкретном сменном задании, либо же изменить ее (например, закрыть сменное задание).

Пара НомерПартии и ДатаПартии всегда уникальна! Если уже существует какая-то партия с аналогичным номером партии и датой партии, она будет перезаписана.

Эндпойнт получения сменного задания (партии) по ID (primary key).

Данный эндпойнт должен возвращает json со сменным заданием по его внутреннему ID вместе со списком уникальных кодов продукции, привязанных к этой партии.

Если сменного задания с данным ID нет, возвращается ошибка 404.

Эндпойнт изменения сменного задания (партии) по ID (primary key).

Данный эндпойнт позволяет изменить одно или несколько полей. Если сменного задания с данным 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.

Задачи "CI/CD"

Тесты

  • Для запуска тестов необходимо находясь в корне проекта активировать виртуальное окружение
    poetry shell
  • запустите тесты командой pytest
    pytest
  • для просмотра отчета о покрытии тестами выполните
    pytest --cov
  • сгенерировать интерактивный отчет о покрытии тестами можно следующим образом
    pytest --cov --cov-report=html
    для его просмотра необходимо зайти в папку htmlcov в корне проекта и открыть в браузере index.html

Контейнеризация (docker)

Для запуска приложения с помощью docker:

  • Склонируйте репозиторий:
    git clone https://github.com/ShadeSWD/production-control-system.git
  • перейдите в корневой каталог production-control-system
  • Выполните сборку образов
    docker-compose build
  • Запустите контейнер
    docker-compose up
  • Приложение будет доступно по адресу http://localhost:7777/

Запуск контейнера из Github Container Registry

Перед запуском контейнера должна быть создана база данных на хосте (или в другом контейнере), её переменные среды должны быть переданы в момент запуска контейнера

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>/

Базовый CI/CD

Github actions:

  1. Проверка кода линтерами (flake8) и форматерами (black, isort).
  2. Запуск тестов
  3. Сборка проекта в docker образ и отправка в Github Container Registry

About

The functionality of the system is to receive shift tasks (batch) and unique product identifiers within this batch, as well as check (upon request from an external system) whether a given product identifier belongs to this batch.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages