From 8ec9f37160edd56a91ac9d07c06095dc45f3345c Mon Sep 17 00:00:00 2001 From: slava Date: Mon, 6 Apr 2026 19:45:51 +0700 Subject: [PATCH] Replace `nullptr` with `QCoreApplication::applicationDirPath()` in OCR initialization across automation scripts to ensure correct Tesseract setup paths. Add UI overlay updates in `AccountSettingsWindow` for better progress visibility and enhance error handling in `EventHandler` for transactions missing `bank_transaction_id`. --- .../dushanbe/GetLastTransactionsScript.cpp | 7 ++++--- android/dushanbe/PayByCardScript.cpp | 5 +++-- android/dushanbe/PayByPhoneScript.cpp | 5 +++-- android/ozon/GetLastTransactionsScript.cpp | 3 ++- android/ozon/PayByCardScript.cpp | 3 ++- android/ozon/PayByPhoneScript.cpp | 3 ++- services/EventHandler.cpp | 19 ++++++++++++++++++- views/bank/AccountSettingsWindow.cpp | 4 ++++ 8 files changed, 38 insertions(+), 11 deletions(-) diff --git a/android/dushanbe/GetLastTransactionsScript.cpp b/android/dushanbe/GetLastTransactionsScript.cpp index 4ef1cf9..4f5b502 100644 --- a/android/dushanbe/GetLastTransactionsScript.cpp +++ b/android/dushanbe/GetLastTransactionsScript.cpp @@ -14,9 +14,10 @@ #include "dao/TransactionDAO.h" #include "AppLogger.h" +#include static QString recognizeTextFromImage(const QByteArray &pngData) { auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { qWarning() << "[Dushanbe::OCR] Failed to init Tesseract"; delete api; return {}; @@ -49,7 +50,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { // 1. Полный OCR с координатами слов — ищем "операции" auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { pixDestroy(&pix); delete api; return {}; } @@ -103,7 +104,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { if (!cropped) return {}; auto *api2 = new tesseract::TessBaseAPI(); - if (api2->Init(nullptr, "eng")) { + if (api2->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "eng")) { pixDestroy(&cropped); delete api2; return {}; } diff --git a/android/dushanbe/PayByCardScript.cpp b/android/dushanbe/PayByCardScript.cpp index d412658..88524b1 100644 --- a/android/dushanbe/PayByCardScript.cpp +++ b/android/dushanbe/PayByCardScript.cpp @@ -12,6 +12,7 @@ #include "dao/TransactionDAO.h" #include "AppLogger.h" +#include // Точечный OCR: находит строку "операции" и кропает правую часть для digit-only OCR static QString recognizeOperationId(const QByteArray &pngData) { Pix *pix = pixReadMem(reinterpret_cast(pngData.constData()), @@ -22,7 +23,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { const int h = pixGetHeight(pix); auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { pixDestroy(&pix); delete api; return {}; } @@ -72,7 +73,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { if (!cropped) return {}; auto *api2 = new tesseract::TessBaseAPI(); - if (api2->Init(nullptr, "eng")) { + if (api2->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "eng")) { pixDestroy(&cropped); delete api2; return {}; } diff --git a/android/dushanbe/PayByPhoneScript.cpp b/android/dushanbe/PayByPhoneScript.cpp index 1927c5b..89f51ab 100644 --- a/android/dushanbe/PayByPhoneScript.cpp +++ b/android/dushanbe/PayByPhoneScript.cpp @@ -12,6 +12,7 @@ #include "dao/TransactionDAO.h" #include "AppLogger.h" +#include static QString recognizeOperationId(const QByteArray &pngData) { Pix *pix = pixReadMem(reinterpret_cast(pngData.constData()), static_cast(pngData.size())); @@ -21,7 +22,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { const int h = pixGetHeight(pix); auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { pixDestroy(&pix); delete api; return {}; } @@ -69,7 +70,7 @@ static QString recognizeOperationId(const QByteArray &pngData) { if (!cropped) return {}; auto *api2 = new tesseract::TessBaseAPI(); - if (api2->Init(nullptr, "eng")) { + if (api2->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "eng")) { pixDestroy(&cropped); delete api2; return {}; } diff --git a/android/ozon/GetLastTransactionsScript.cpp b/android/ozon/GetLastTransactionsScript.cpp index 3ee67da..8694bfd 100644 --- a/android/ozon/GetLastTransactionsScript.cpp +++ b/android/ozon/GetLastTransactionsScript.cpp @@ -16,9 +16,10 @@ #include "time/DateUtils.h" #include "AppLogger.h" +#include static QString recognizeTextFromImage(const QByteArray &pngData) { auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { qWarning() << "[OCR] Failed to init Tesseract"; delete api; return {}; diff --git a/android/ozon/PayByCardScript.cpp b/android/ozon/PayByCardScript.cpp index 6f69070..60a28ca 100644 --- a/android/ozon/PayByCardScript.cpp +++ b/android/ozon/PayByCardScript.cpp @@ -1,5 +1,6 @@ #include "PayByCardScript.h" +#include #include #include #include @@ -18,7 +19,7 @@ static QString recognizeTextFromImage(const QByteArray &pngData) { auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { qWarning() << "[OCR] Failed to init Tesseract"; delete api; return {}; diff --git a/android/ozon/PayByPhoneScript.cpp b/android/ozon/PayByPhoneScript.cpp index 9456ec5..6cce510 100644 --- a/android/ozon/PayByPhoneScript.cpp +++ b/android/ozon/PayByPhoneScript.cpp @@ -16,9 +16,10 @@ #include "dao/TransactionDAO.h" #include "time/DateUtils.h" +#include static QString recognizeTextFromImage(const QByteArray &pngData) { auto *api = new tesseract::TessBaseAPI(); - if (api->Init(nullptr, "rus+eng")) { + if (api->Init(QCoreApplication::applicationDirPath().toUtf8().constData(), "rus+eng")) { qWarning() << "[OCR] Failed to init Tesseract"; delete api; return {}; diff --git a/services/EventHandler.cpp b/services/EventHandler.cpp index a4e7a58..8474613 100644 --- a/services/EventHandler.cpp +++ b/services/EventHandler.cpp @@ -305,10 +305,16 @@ void EventHandler::updateEventThread(const QString &key, const EventInfo &event, taskData = obj; } else if (event.type == EventType::FetchTransactions) { QList txList = TransactionDAO::getTransactionsWithinHours(event.accountId, 24); + // Фильтруем: отправляем только транзакции с bank_transaction_id + bool hasWithoutId = false; QJsonArray arr; for (const auto &tx : txList) { + if (tx.bankTrExternalId.isEmpty()) { + hasWithoutId = true; + continue; + } QJsonObject txObj; - txObj["bank_transaction_id"] = tx.bankTrExternalId.isEmpty() ? QJsonValue(QJsonValue::Null) : QJsonValue(tx.bankTrExternalId); + txObj["bank_transaction_id"] = tx.bankTrExternalId; txObj["amount"] = static_cast(tx.amount * 100); txObj["currency"] = currencyCode; txObj["transaction_type"] = (tx.type == TransactionType::Phone) ? "top-up" : "bank"; @@ -341,6 +347,17 @@ void EventHandler::updateEventThread(const QString &key, const EventInfo &event, } arr.append(txObj); } + if (arr.isEmpty() && hasWithoutId) { + // Транзакция найдена но без bank_transaction_id — ошибка + qWarning() << "[EventHandler] FETCH_TRANSACTIONS: tx found but no bank_transaction_id"; + sendTaskError(eventTypeToString(event.type), event.externalId, event.bankName, + "Transaction found but bank_transaction_id is empty"); + EventDAO::updateEvent(event.id, EventStatus::Error, + "Transaction found but bank_transaction_id is empty (OCR failed)"); + EventDAO::markSentToServer(event.id); + m_threads.remove(key); + return; + } taskData = arr; } else if (event.type == EventType::CreateTransaction) { // Определяем тип транзакции из JSON задачи diff --git a/views/bank/AccountSettingsWindow.cpp b/views/bank/AccountSettingsWindow.cpp index 56a8476..16c9591 100644 --- a/views/bank/AccountSettingsWindow.cpp +++ b/views/bank/AccountSettingsWindow.cpp @@ -292,6 +292,7 @@ void AccountSettingsWindow::startCheckPinCode() { void AccountSettingsWindow::startGetProfileInfo() { m_profileBtn->setEnabled(false); m_cardsBtn->setEnabled(false); + showOverlay("Обновление профиля..."); pauseActiveProfiles(); auto *thread = new QThread(nullptr); @@ -305,6 +306,7 @@ void AccountSettingsWindow::startGetProfileInfo() { resumePausedProfiles(); m_app = BankProfileDAO::getApplication(m_deviceId, appCode); updateStatusUI(); + hideOverlay(true, "Профиль обновлён"); }, Qt::QueuedConnection); }; @@ -345,6 +347,7 @@ void AccountSettingsWindow::startGetProfileInfo() { void AccountSettingsWindow::startGetCardInfo() { m_profileBtn->setEnabled(false); m_cardsBtn->setEnabled(false); + showOverlay("Проверка аккаунтов..."); pauseActiveProfiles(); auto *thread = new QThread(nullptr); @@ -357,6 +360,7 @@ void AccountSettingsWindow::startGetCardInfo() { m_cardsBtn->setEnabled(true); resumePausedProfiles(); reloadCards(); + hideOverlay(true, "Аккаунты обновлены"); }, Qt::QueuedConnection); };