#pragma once #include #include #include #include #include #include "db/MaterialInfo.h" #include "db/EventInfo.h" class NetworkService; class EventHandler final : public QObject { Q_OBJECT public: explicit EventHandler(QObject *parent = nullptr); ~EventHandler() override; public slots: void start(); void stop(); signals: void finished(); private slots: void onTasksReceived(const QJsonArray &tasks); private: bool m_running = true; QMap m_threads; QMap m_timers; QMap m_screenshots; // deviceId → скриншот от скрипта QMap m_parsedTxCount; // key → сколько транзакций уже отправлено на сервер (FETCH_TRANSACTIONS, per-tx streaming) QMap m_retryCount; // event.id → число уже сделанных ретраев (только FETCH_TRANSACTIONS) QTimer *m_pollTimer = nullptr; NetworkService *m_network = nullptr; void clearAll(); void updateEventThread(const QString &key, const EventInfo &event, const QString &result); // Перезапускает скрипт поиска транзакции при ошибке (до 2 ретраев). Возвращает // true, если ретрай запущен; false — если попытки исчерпаны (обрабатывать как ошибку). bool tryRetry(const QString &key, const EventInfo &event, const QString &reason); void startThreadForTask(const MaterialInfo &account, const EventInfo &event); void processNextTask(const QString &deviceId); };