Перейти к содержанию

🏗️ Архитектура системы

📐 Общая архитектура

Система охраны труда построена по принципу многоуровневой архитектуры с четким разделением ответственности между компонентами.

graph TB
    subgraph "Frontend Layer"
        A[React Frontend]
        B[Mobile App]
    end

    subgraph "API Gateway"
        C[FastAPI Backend]
        D[Authentication]
        E[Rate Limiting]
    end

    subgraph "Business Logic"
        F[Document Management]
        G[Risk Assessment]
        H[PPE Management]
        I[User Management]
    end

    subgraph "Data Layer"
        J[PostgreSQL Database]
        K[File Storage]
        L[Cache Layer]
    end

    subgraph "External Services"
        M[FNS API]
        N[SMTP Server]
        O[SFTP Storage]
    end

    A --> C
    B --> C
    C --> F
    C --> G
    C --> H
    C --> I
    F --> J
    G --> J
    H --> J
    I --> J
    F --> K
    C --> L
    C --> M
    C --> N
    C --> O

🎯 Принципы архитектуры

1. Разделение ответственности (Separation of Concerns)

  • Каждый компонент отвечает за свою область функциональности
  • Четкие границы между слоями
  • Независимость компонентов

2. Масштабируемость (Scalability)

  • Горизонтальное масштабирование
  • Асинхронная обработка
  • Кэширование данных

3. Безопасность (Security)

  • Многоуровневая аутентификация
  • Авторизация на уровне ресурсов
  • Шифрование данных

4. Надежность (Reliability)

  • Обработка ошибок
  • Резервное копирование
  • Мониторинг системы

🖥️ Frontend Layer

React Frontend

  • Технологии: React 18, TypeScript, Vite
  • UI Framework: shadcn/ui + Tailwind CSS
  • State Management: TanStack Query
  • Routing: Wouter
// Пример структуры компонента
interface DocumentFormProps {
  documentId: number;
  onSubmit: (data: FormData) => void;
}

const DocumentForm: React.FC<DocumentFormProps> = ({ documentId, onSubmit }) => {
  const { data: document } = useQuery(['document', documentId], 
    () => fetchDocument(documentId)
  );

  return (
    <form onSubmit={handleSubmit}>
      {/* Форма документа */}
    </form>
  );
};

Мобильное приложение

  • Технологии: React Native
  • Функциональность: просмотр документов, уведомления, заполнение форм
  • Синхронизация: офлайн-режим с последующей синхронизацией

🔌 API Gateway

FastAPI Backend

  • Технологии: Python 3.11+, FastAPI, Pydantic
  • Аутентификация: JWT токены
  • Документация: автоматическая генерация OpenAPI/Swagger
# Пример API эндпоинта
@router.post("/documents/upload", response_model=DocumentResponse)
async def upload_document(
    file: UploadFile = File(...),
    name: str = Form(...),
    current_user: User = Depends(get_current_active_user),
    db: Session = Depends(get_db)
):
    """Загрузка нового документа"""
    # Логика загрузки документа
    pass

Middleware

  • CORS: настройка для фронтенда
  • Rate Limiting: ограничение запросов
  • Logging: логирование всех запросов
  • Error Handling: централизованная обработка ошибок

🧠 Business Logic Layer

Модули системы

1. Document Management

class DocumentService:
    def upload_document(self, file: UploadFile, metadata: dict) -> Document:
        """Загрузка и обработка документа"""
        pass

    def extract_template_fields(self, file_path: str) -> dict:
        """Извлечение полей шаблона"""
        pass

    def generate_filled_document(self, template_id: int, data: dict) -> str:
        """Генерация заполненного документа"""
        pass

2. Risk Assessment

class RiskAssessmentService:
    def calculate_risk_score(self, severity: int, probability: int, 
                           coefficients: dict) -> RiskResult:
        """Расчет балла риска"""
        pass

    def get_risk_recommendations(self, risk_level: str) -> list:
        """Получение рекомендаций по снижению риска"""
        pass

3. PPE Management

class PPEService:
    def get_ppe_norms(self, position_id: int) -> list:
        """Получение норм выдачи СИЗ для должности"""
        pass

    def track_ppe_issuance(self, employee_id: int, ppe_items: list) -> None:
        """Учет выдачи СИЗ"""
        pass

🗄️ Data Layer

PostgreSQL Database

  • Версия: PostgreSQL 14+
  • ORM: SQLAlchemy 2.0
  • Миграции: Alembic
  • Индексы: оптимизированы для частых запросов
-- Пример структуры таблицы
CREATE TABLE safety_users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    full_name VARCHAR(200) NOT NULL,
    password_hash VARCHAR(255) NOT NULL,
    role VARCHAR(20) DEFAULT 'user',
    is_active BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE INDEX idx_users_username ON safety_users(username);
CREATE INDEX idx_users_email ON safety_users(email);
CREATE INDEX idx_users_role ON safety_users(role);

File Storage

  • Локальное хранилище: для разработки и тестирования
  • SFTP: для продакшн среды
  • Структура: организована по типам документов и организациям
uploads/
├── documents/
│   ├── templates/
│   ├── filled/
│   └── public/
├── organizations/
│   ├── {org_id}/
│   │   ├── documents/
│   │   ├── forms/
│   │   └── reports/
└── temp/

Cache Layer

  • Redis: для кэширования сессий и часто запрашиваемых данных
  • TTL: настраиваемое время жизни кэша
  • Invalidation: автоматическая инвалидация при изменениях

🔗 External Services

FNS API Integration

class FNSService:
    def get_organization_data(self, inn: str) -> OrganizationData:
        """Получение данных организации из ФНС"""
        pass

    def validate_inn(self, inn: str) -> bool:
        """Валидация ИНН"""
        pass

Email Service

class EmailService:
    def send_notification(self, to: str, subject: str, body: str) -> bool:
        """Отправка email уведомления"""
        pass

    def send_bulk_notifications(self, recipients: list, message: dict) -> int:
        """Массовая отправка уведомлений"""
        pass

🔒 Security Architecture

Аутентификация

sequenceDiagram
    participant U as User
    participant F as Frontend
    participant A as API
    participant D as Database

    U->>F: Login credentials
    F->>A: POST /auth/login
    A->>D: Validate credentials
    D-->>A: User data
    A-->>F: JWT token
    F-->>U: Success + token

Авторизация

  • RBAC: Role-Based Access Control
  • Уровни доступа: system, organization, user
  • Проверка прав: на каждом эндпоинте
def require_organization_membership(organization_id: int):
    def decorator(func):
        @wraps(func)
        async def wrapper(*args, **kwargs):
            current_user = kwargs.get('current_user')
            if not check_membership(current_user.id, organization_id):
                raise HTTPException(403, "Access denied")
            return await func(*args, **kwargs)
        return wrapper
    return decorator

📊 Monitoring & Logging

Логирование

  • Структурированные логи: JSON формат
  • Уровни: DEBUG, INFO, WARNING, ERROR, CRITICAL
  • Ротация: по размеру и времени
  • Централизованный сбор: ELK Stack

Мониторинг

  • Метрики: производительность, использование ресурсов
  • Алерты: автоматические уведомления о проблемах
  • Дашборды: визуализация состояния системы

🚀 Deployment Architecture

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

# Dockerfile для backend
FROM python:3.11-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt

COPY . .
EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

Orchestration

  • Docker Compose: для разработки
  • Kubernetes: для продакшн
  • Load Balancer: распределение нагрузки
  • Auto-scaling: автоматическое масштабирование

🔄 Data Flow

Типичный запрос

sequenceDiagram
    participant U as User
    participant F as Frontend
    participant A as API
    participant S as Service
    participant D as Database
    participant C as Cache

    U->>F: User action
    F->>A: API request + JWT
    A->>A: Validate token
    A->>C: Check cache
    alt Cache hit
        C-->>A: Cached data
    else Cache miss
        A->>S: Business logic
        S->>D: Database query
        D-->>S: Data
        S-->>A: Processed data
        A->>C: Store in cache
    end
    A-->>F: Response
    F-->>U: UI update

📈 Performance Considerations

Оптимизация базы данных

  • Индексы: на часто используемых полях
  • Партиционирование: для больших таблиц
  • Connection pooling: переиспользование соединений
  • Query optimization: оптимизированные запросы

Кэширование

  • Application cache: часто используемые данные
  • Database cache: результаты запросов
  • CDN: статические ресурсы
  • Browser cache: клиентское кэширование

Асинхронность

  • Background tasks: тяжелые операции
  • Message queues: обработка событий
  • WebSockets: real-time уведомления
  • Streaming: большие файлы

Архитектура системы спроектирована с учетом требований масштабируемости, безопасности и производительности.