1
0
forked from BRT/arc
arc/services/EventHandler.h

55 lines
1.9 KiB
C++

#pragma once
#include <QJsonArray>
#include <QJsonObject>
#include <QMap>
#include <QObject>
#include <QTimer>
#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<QString, QThread *> m_threads;
QMap<QString, QTimer *> m_timers;
QMap<QString, QByteArray> m_screenshots; // deviceId → скриншот от скрипта
QMap<QString, int> m_parsedTxCount; // key → сколько транзакций уже отправлено на сервер (FETCH_TRANSACTIONS, per-tx streaming)
QMap<QString, QJsonArray> m_parsedTxJson; // key → сами отправленные tx (для показа JSON в task_success мониторинга)
QMap<int, int> 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);
};