klg-asutk-app/backend/app/models/maintenance.py
Yuriy aa052763f6 Безопасность и качество: 8 исправлений + обновления
- .env.example: полный шаблон, защита секретов
- .gitignore: явное исключение .env.* и секретов
- layout.tsx: XSS — заменён dangerouslySetInnerHTML на next/script для SW
- ESLint: no-console error (allow warn/error), ignore scripts/
- scripts/remove-console-logs.js: очистка console.log без glob
- backend/routes/modules: README с планом рефакторинга крупных файлов
- SECURITY.md: гид по секретам, XSS, CORS, auth, линту
- .husky/pre-commit: запуск npm run lint

+ прочие правки приложения и бэкенда

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-14 21:29:16 +03:00

101 lines
8.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from datetime import datetime, date
"""
Модели для отслеживания технического обслуживания согласно ТЗ.
Соответствует формам из ТЗ:
- Статус выполненного технического обслуживания
- Статус компонентов с ограниченным межремонтным ресурсом/сроком службы (LLP, HT)
- Комплектующие изделия с ограниченным ресурсом (шасси)
"""
from sqlalchemy import String, ForeignKey, Integer, DateTime, Text, Numeric
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.db.base import Base
from app.models.common import TimestampMixin, uuid4_str
class MaintenanceTask(Base, TimestampMixin):
"""Статус выполненного технического обслуживания.
Соответствует форме из ТЗ: Статус выполненного технического обслуживания.
"""
__tablename__ = "maintenance_tasks"
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=uuid4_str)
aircraft_id: Mapped[str] = mapped_column(String(36), ForeignKey("aircraft.id"), nullable=False, index=True)
aircraft = relationship("Aircraft", foreign_keys=[aircraft_id])
ata_code: Mapped[str] = mapped_column(String(16), nullable=False, doc="Код ATA")
task_number: Mapped[str] = mapped_column(String(32), nullable=False, doc="Номер карты программы ТО")
rev: Mapped[str | None] = mapped_column(String(16), nullable=True, doc="Ревизия карты программы ТО")
references: Mapped[str | None] = mapped_column(Text, nullable=True, doc="Ссылки")
type: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Тип карты программы ТО")
status: Mapped[str] = mapped_column(String(32), nullable=False, doc="Статус")
description: Mapped[str | None] = mapped_column(Text, nullable=True, doc="Заголовок карты программы ТО")
remarks: Mapped[str | None] = mapped_column(Text, nullable=True, doc="Примечания к карте программы ТО")
threshold: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Порог выполнения карты")
interval: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Интервал выполнения карты")
last_accomplished: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Дата предыдущего выполнения карты")
next_due: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Дата планируемого выполнения карты")
time_remaining: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Остаток до наступления Dead-line по таску")
class LimitedLifeComponent(Base, TimestampMixin):
"""Компоненты с ограниченным межремонтным ресурсом/сроком службы (LLP, HT).
Соответствует форме из ТЗ: Статус компонентов с ограниченным межремонтным ресурсом/сроком службы (LLP, HT).
"""
__tablename__ = "limited_life_components"
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=uuid4_str)
aircraft_id: Mapped[str] = mapped_column(String(36), ForeignKey("aircraft.id"), nullable=False, index=True)
aircraft = relationship("Aircraft", foreign_keys=[aircraft_id])
ata_code: Mapped[str] = mapped_column(String(16), nullable=False, doc="Код ATA")
part_number: Mapped[str] = mapped_column(String(64), nullable=False, doc="Партийный номер компонента")
serial_number: Mapped[str] = mapped_column(String(64), nullable=False, doc="Серийный номер компонента")
description: Mapped[str | None] = mapped_column(Text, nullable=True, doc="Описание события TO")
current_status: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Текущий статус компонента")
position: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Позиция компонента на ВС")
release_no: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Номер релиза/номер ярлыка")
install_date: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Дата установки")
tah_inst: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Значение счётчика FH компонента на момент установки")
tac_inst: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Значение счётчика FC компонента на момент установки")
requirement_title: Mapped[str | None] = mapped_column(String(255), nullable=True, doc="Наименование требования")
requirement_type: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Тип требования")
interval: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Интервал выполнения требования")
expected_date: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Ожидаемая дата выполнения требования")
to_go: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Остаток до следствия")
tsn: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Текущее значение счётчика FH компонента")
csn: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Текущее значение счётчика FC компонента")
class LandingGearComponent(Base, TimestampMixin):
"""Комплектующие изделия с ограниченным ресурсом (шасси).
Соответствует форме из ТЗ: Комплектующие изделия с ограниченным ресурсом (шасси).
"""
__tablename__ = "landing_gear_components"
id: Mapped[str] = mapped_column(String(36), primary_key=True, default=uuid4_str)
aircraft_id: Mapped[str] = mapped_column(String(36), ForeignKey("aircraft.id"), nullable=False, index=True)
aircraft = relationship("Aircraft", foreign_keys=[aircraft_id])
ata_code: Mapped[str] = mapped_column(String(16), nullable=False, doc="Код ATA")
part_number: Mapped[str] = mapped_column(String(64), nullable=False, doc="Партийный номер компонента")
serial_number: Mapped[str] = mapped_column(String(64), nullable=False, doc="Серийный номер компонента")
description: Mapped[str | None] = mapped_column(Text, nullable=True, doc="Описание события технического обслуживания")
position: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Позиция компонента на ВС")
release_no: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Номер релиза/номер ярлыка")
install_date: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Дата установки")
tsn: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Текущее значение счётчика FH компонента")
csn: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Текущее значение счётчика FC компонента")
requirement: Mapped[str | None] = mapped_column(String(255), nullable=True, doc="Требование по обслуживанию")
dim: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Единица изменения")
due_at: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Дедлайн")
interval: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Интервал выполнения требования")
tsr: Mapped[str | None] = mapped_column(String(32), nullable=True, doc="Значение, прошедшее с момента крайнего выполнения требования")
expected: Mapped[str | None] = mapped_column(DateTime(timezone=True), nullable=True, doc="Ожидаемая дата")
to_go: Mapped[str | None] = mapped_column(String(64), nullable=True, doc="Остаток до наступления требования")