Skip to main content

Схемы потоков данных системы "Симулятор регионов"

Схемы потоков данных системы "Симулятор регионов"

1. Общая архитектурная диаграмма

graph TB
    %% Клиентская часть
    Client[Клиент/Браузер]
    
    %% Веб-сервер
    Nginx[Nginx<br/>Reverse Proxy]
    
    %% Основное приложение
    Backend[Backend API<br/>Node.js/Express<br/>Port 3000]
    
    %% Базы данных и сторонние сервисы
    PostgreSQL[(PostgreSQL<br/>База данных<br/>Port 5432)]
    Minio[(Minio<br/>Объектное хранилище<br/>Port 9000)]
    
    %% Мониторинг и управление
    PM2[PM2<br/>Process Manager]
    TelegramBot[Telegram Bot<br/>Мониторинг]
    
    %% Статические файлы
    Static[Static Files<br/>/static/]
    
    %% Связи
    Client --> Nginx
    Nginx --> Backend
    Nginx --> Static
    Backend --> PostgreSQL
    Backend --> Minio
    PM2 --> Backend
    TelegramBot --> Backend
    
    %% Стили
    classDef clientStyle fill:#e1f5fe
    classDef serverStyle fill:#f3e5f5
    classDef dbStyle fill:#e8f5e8
    classDef monitorStyle fill:#fff3e0
    
    class Client clientStyle
    class Nginx,Backend serverStyle
    class PostgreSQL,Minio dbStyle
    class PM2,TelegramBot monitorStyle

2. Схема API взаимодействия

graph LR
    subgraph "Аутентификация"
        A1[POST /api/auth/login]
        A2[POST /api/auth/select-game]
    end
    
    subgraph "Управление игрой"
        G1[POST /api/service/game/:id/start-game]
        G2[POST /api/service/game/:id/end-round]
        G3[GET /api/status]
    end
    
    subgraph "Работа с решениями"
        S1[GET /api/solutions/draft]
        S2[POST /api/solutions/draft]
        S3[PUT /api/solutions/draft/current/:id]
        S4[GET /api/solutions/select/:id]
        S5[GET /api/solutions]
        S6[POST /api/solutions/forecast]
        S7[PUT /api/solutions/draft/editable]
        S8[PUT /api/solutions/draft/:id/rename]
    end
    
    subgraph "Работа с кейсами"
        C1[GET /api/cases]
        C2[POST /api/cases]
    end
    
    Client --> A1
    Client --> A2
    Client --> G1
    Client --> G2
    Client --> G3
    Client --> S1
    Client --> S2
    Client --> S3
    Client --> S4
    Client --> S5
    Client --> S6
    Client --> S7
    Client --> S8
    Client --> C1
    Client --> C2

3. Поток данных игрового процесса

sequenceDiagram
    participant Admin as Администратор
    participant API as Backend API
    participant DB as PostgreSQL
    participant Engine as Calculation Engine
    participant Team as Команда/Регион
    
    %% Создание и запуск игры
    Admin->>API: POST /api/service/game/:id/start-game
    API->>DB: Создание начальных данных
    API->>Engine: Инициализация параметров
    Engine->>DB: Сохранение начальных расчетов
    API-->>Admin: Игра запущена
    
    %% Игровой раунд
    loop Каждый раунд
        Team->>API: GET /api/solutions/draft
        API->>DB: Получение текущих решений
        API-->>Team: Текущие решения
        
        Team->>API: POST /api/solutions/draft
        API->>DB: Сохранение черновика решения
        API-->>Team: Решение сохранено
        
        Team->>API: POST /api/solutions/forecast
        API->>Engine: Прогноз результатов
        Engine-->>API: Прогнозные данные
        API-->>Team: Прогноз результатов
        
        Team->>API: PUT /api/solutions/draft/current/:id
        API->>DB: Установка текущего решения
        API-->>Team: Решение принято
        
        Admin->>API: POST /api/service/game/:id/end-round
        API->>Engine: Расчет результатов раунда
        Engine->>DB: Сохранение результатов
        API->>DB: Подготовка следующего раунда
        API-->>Admin: Раунд завершен
    end

4. Схема базы данных (основные таблицы)

erDiagram
    Users ||--o{ TeamUsers : "участвует"
    Teams ||--o{ TeamUsers : "включает"
    Teams ||--o{ GameRegions : "контролирует"
    Games ||--o{ GameRegions : "содержит"
    Games ||--|| Scenarios : "использует"
    
    GameRegions ||--o{ Solutions : "принимает"
    Solutions ||--|| SolutionsDraft : "основано на"
    SolutionsDraft ||--o{ SolutionDraftParameters : "содержит"
    
    GameRegions ||--o{ GameCaseAnswers : "отвечает"
    GameCaseQuestions ||--o{ GameCaseAnswers : "получает ответы"
    Games ||--o{ GameCaseQuestions : "содержит вопросы"
    
    Scenarios ||--o{ Projects : "включает"
    GameRegions ||--o{ GameRegionProjects : "реализует"
    Projects ||--o{ GameRegionProjects : "может быть реализован"
    
    Users {
        string id PK
        string email
        string passwd
        string role
        datetime created_at
    }
    
    Teams {
        string id PK
        string name
        datetime created_at
    }
    
    Games {
        string id PK
        string name
        int currentStep
        int maxSteps
        string gameState
        string scenarioId FK
        datetime created_at
    }
    
    GameRegions {
        string id PK
        string idTeam FK
        string idGame FK
        string regionId FK
        float gamePoints
        datetime created_at
    }
    
    Solutions {
        string id PK
        int step
        string dataId FK
        string gameId FK
        string regionId FK
        datetime created_at
    }
    
    SolutionsDraft {
        string id PK
        string name
        int step
        json values
        json results
        boolean isCurrent
        string teamUserId FK
        string gameId FK
        datetime created_at
    }

5. Поток обработки решений команд

flowchart TD
    Start([Команда создает решение]) --> Draft[Создание черновика]
    Draft --> SaveDraft[Сохранение в SolutionsDraft]
    SaveDraft --> Forecast{Нужен прогноз?}
    
    Forecast -->|Да| CalcForecast[Вызов Engine для прогноза]
    Forecast -->|Нет| Edit[Редактирование решения]
    
    CalcForecast --> ShowForecast[Показ прогноза команде]
    ShowForecast --> Edit
    
    Edit --> SetCurrent{Принять решение?}
    SetCurrent -->|Нет| Edit
    SetCurrent -->|Да| MarkCurrent[Установить как текущее]
    
    MarkCurrent --> WaitEndRound[Ожидание окончания раунда]
    WaitEndRound --> EndRound[Администратор завершает раунд]
    
    EndRound --> CalcResults[Engine: расчет результатов]
    CalcResults --> SaveResults[Сохранение результатов в БД]
    SaveResults --> PrepareNext[Подготовка следующего раунда]
    PrepareNext --> NextRound([Следующий раунд])
    
    %% Стили
    classDef processStyle fill:#e3f2fd
    classDef decisionStyle fill:#fff3e0
    classDef engineStyle fill:#e8f5e8
    classDef endStyle fill:#fce4ec
    
    class Draft,SaveDraft,Edit,MarkCurrent,WaitEndRound processStyle
    class Forecast,SetCurrent decisionStyle
    class CalcForecast,CalcResults,SaveResults,PrepareNext engineStyle
    class Start,NextRound endStyle

6. Архитектура движка расчетов

graph TB
    subgraph "Входные данные"
        SD[SolutionsDraft<br/>Решения команд]
        SP[ScenarioParams<br/>Параметры сценария]
        GP[GameParams<br/>Игровые параметры]
        RP[RegionParams<br/>Региональные параметры]
    end
    
    subgraph "Calculation Engine"
        CE[Основной движок расчетов]
        
        subgraph "Отраслевые расчеты"
            IND1[Промышленность]
            IND2[Сельское хозяйство]
            IND3[Строительство]
            IND4[Торговля]
            IND5[Транспорт]
            IND6[Связь]
            IND7[Образование]
            IND8[Здравоохранение]
            INDN[... другие отрасли]
        end
        
        subgraph "Агрегированные расчеты"
            VRP[ВРП расчеты]
            BUD[Бюджетные расчеты]
            DEM[Демографические расчеты]
            ECO[Экологические расчеты]
            SOC[Социальные показатели]
        end
        
        subgraph "Индексы и рейтинги"
            IDX[Расчет индексов]
            RAT[Рейтинги регионов]
        end
    end
    
    subgraph "Выходные данные"
        GRC[GameRegionCalculatedParams<br/>Расчетные параметры]
        RS[RegionStatistics<br/>Статистика региона]
        RES[Results<br/>Результаты раунда]
    end
    
    %% Связи входных данных
    SD --> CE
    SP --> CE
    GP --> CE
    RP --> CE
    
    %% Связи внутри движка
    CE --> IND1
    CE --> IND2
    CE --> IND3
    CE --> IND4
    CE --> IND5
    CE --> IND6
    CE --> IND7
    CE --> IND8
    CE --> INDN
    
    IND1 --> VRP
    IND2 --> VRP
    IND3 --> VRP
    IND4 --> VRP
    IND5 --> VRP
    IND6 --> VRP
    IND7 --> VRP
    IND8 --> VRP
    INDN --> VRP
    
    VRP --> BUD
    VRP --> DEM
    VRP --> ECO
    VRP --> SOC
    
    BUD --> IDX
    DEM --> IDX
    ECO --> IDX
    SOC --> IDX
    
    IDX --> RAT
    
    %% Связи выходных данных
    VRP --> GRC
    BUD --> GRC
    DEM --> GRC
    ECO --> GRC
    SOC --> GRC
    IDX --> GRC
    RAT --> GRC
    
    GRC --> RS
    RS --> RES

7. Поток обработки кейсов

sequenceDiagram
    participant Admin as Администратор
    participant System as Система
    participant DB as База данных
    participant Team as Команда
    
    %% Подготовка кейсов для раунда
    Admin->>System: Запуск нового раунда
    System->>DB: Получение шаблонов кейсов (ScenarioCases)
    DB-->>System: Шаблоны кейсов для текущего шага
    System->>DB: Случайный выбор вопросов (CaseQuestions)
    System->>DB: Создание GameCaseQuestions для раунда
    DB-->>System: Кейсы подготовлены
    System-->>Admin: Раунд запущен
    
    %% Команды отвечают на кейсы
    Team->>System: GET /api/cases
    System->>DB: Получение кейсов для команды/региона
    DB-->>System: Список вопросов с вариантами ответов
    System-->>Team: Кейсы для решения
    
    Team->>System: POST /api/cases (ответы)
    System->>DB: Сохранение ответов (GameCaseAnswers)
    System->>DB: Проверка правильности ответов
    DB-->>System: Результаты проверки
    System->>DB: Начисление баллов команде
    System-->>Team: Ответы сохранены
    
    %% Завершение раунда
    Admin->>System: Завершение раунда
    System->>DB: Подсчет итоговых баллов за кейсы
    DB-->>System: Итоговые результаты
    System-->>Admin: Результаты по кейсам готовы

8. Схема мониторинга и алертов

graph TB
    subgraph "Мониторируемые компоненты"
        API[Backend API<br/>Port 3000]
        DB[(PostgreSQL<br/>Port 5432)]
        PM2_PROC[PM2 Processes]
        SYS[System Resources<br/>CPU, Memory, Disk]
    end
    
    subgraph "Система мониторинга"
        MONITOR[Monitor Script<br/>/opt/regionsim/monitor.sh]
        CRON[Cron Job<br/>*/5 * * * *]
    end
    
    subgraph "Алерты и уведомления"
        TELEGRAM[Telegram Bot]
        ADMIN[Администраторы]
    end
    
    subgraph "Логирование"
        PM2_LOGS[PM2 Logs<br/>~/.pm2/logs/]
        NGINX_LOGS[Nginx Logs<br/>/var/log/nginx/]
        PG_LOGS[PostgreSQL Logs<br/>/var/log/postgresql/]
        SYS_LOGS[System Logs<br/>/var/log/syslog]
    end
    
    %% Связи мониторинга
    CRON --> MONITOR
    MONITOR --> API
    MONITOR --> DB
    MONITOR --> PM2_PROC
    MONITOR --> SYS
    
    %% Алерты
    MONITOR -->|Проблемы обнаружены| TELEGRAM
    TELEGRAM --> ADMIN
    
    %% Логирование
    API --> PM2_LOGS
    API --> NGINX_LOGS
    DB --> PG_LOGS
    SYS --> SYS_LOGS
    
    %% Условия алертов
    API -.->|Недоступен| MONITOR
    DB -.->|Недоступен| MONITOR
    PM2_PROC -.->|Процессы остановлены| MONITOR
    SYS -.->|Высокое использование ресурсов| MONITOR

9. Поток развертывания и обновления

flowchart TD
    Start([Начало развертывания]) --> CheckReq{Проверка требований}
    CheckReq -->|Требования не выполнены| InstallReq[Установка зависимостей]
    CheckReq -->|OK| PrepareEnv[Подготовка окружения]
    InstallReq --> PrepareEnv
    
    PrepareEnv --> CloneRepo[Клонирование репозитория]
    CloneRepo --> SetupEnv[Настройка .env файла]
    SetupEnv --> StartInfra[Запуск инфраструктуры<br/>docker-compose up -d]
    
    StartInfra --> InstallDeps[npm install]
    InstallDeps --> PrismaGen[Генерация Prisma клиента]
    PrismaGen --> Migrate[Выполнение миграций]
    Migrate --> Seed[Заполнение начальными данными]
    Seed --> Build[Сборка приложения]
    Build --> StartPM2[Запуск через PM2]
    StartPM2 --> ConfigNginx[Настройка Nginx]
    ConfigNginx --> SetupMonitor[Настройка мониторинга]
    SetupMonitor --> Success([Развертывание завершено])
    
    %% Процесс обновления
    Update([Обновление системы]) --> Backup[Создание резервной копии]
    Backup --> GitPull[git pull origin main]
    GitPull --> UpdateDeps[npm install]
    UpdateDeps --> MigrateUpdate[Выполнение миграций]
    MigrateUpdate --> BuildUpdate[npm run build]
    BuildUpdate --> RestartPM2[pm2 restart all]
    RestartPM2 --> TestUpdate{Тестирование}
    TestUpdate -->|OK| UpdateSuccess([Обновление завершено])
    TestUpdate -->|Ошибки| Rollback[Откат к резервной копии]
    Rollback --> UpdateSuccess
    
    %% Стили
    classDef startStyle fill:#e8f5e8
    classDef processStyle fill:#e3f2fd
    classDef decisionStyle fill:#fff3e0
    classDef errorStyle fill:#ffebee
    
    class Start,Success,Update,UpdateSuccess startStyle
    class PrepareEnv,CloneRepo,SetupEnv,StartInfra,InstallDeps,PrismaGen,Migrate,Seed,Build,StartPM2,ConfigNginx,SetupMonitor,Backup,GitPull,UpdateDeps,MigrateUpdate,BuildUpdate,RestartPM2 processStyle
    class CheckReq,TestUpdate decisionStyle
    class InstallReq,Rollback errorStyle

10. Диаграмма безопасности и аутентификации

sequenceDiagram
    participant Client as Клиент
    participant Nginx as Nginx
    participant API as Backend API
    participant Auth as AuthService
    participant DB as PostgreSQL
    participant JWT as JWT Token
    
    %% Процесс аутентификации
    Client->>Nginx: POST /api/auth/login
    Nginx->>API: Проксирование запроса
    API->>Auth: Проверка учетных данных
    Auth->>DB: Запрос пользователя
    DB-->>Auth: Данные пользователя
    Auth->>Auth: Проверка пароля (hash)
    Auth->>JWT: Генерация JWT токена
    JWT-->>Auth: JWT токен
    Auth-->>API: Токен и данные пользователя
    API-->>Nginx: Ответ с токеном
    Nginx-->>Client: Set-Cookie с JWT
    
    %% Авторизованный запрос
    Client->>Nginx: GET /api/status (с токеном)
    Nginx->>API: Проксирование с заголовками
    API->>Auth: Проверка JWT токена
    Auth->>JWT: Валидация токена
    JWT-->>Auth: Данные из токена
    Auth-->>API: Пользователь авторизован
    API->>DB: Выполнение запроса
    DB-->>API: Результат
    API-->>Nginx: Ответ
    Nginx-->>Client: Данные
    
    %% Неавторизованный доступ
    Client->>Nginx: GET /api/solutions (без токена)
    Nginx->>API: Проксирование
    API->>Auth: Проверка токена
    Auth-->>API: 401 Unauthorized
    API-->>Nginx: Ошибка аутентификации
    Nginx-->>Client: 401 Unauthorized

Эти диаграммы показывают основные потоки данных в системе "Симулятор регионов" и помогают понять взаимодействие между различными компонентами системы, процессы обработки данных и архитектурные решения.