#include "EventDAO.h" #include #include #include "DatabaseManager.h" #include "time/DateUtils.h" EventInfo parseEvent(const QSqlQuery &query) { EventInfo event; event.id = query.value("id").toInt(); event.status = eventStatusFromString(query.value("status").toString()); event.externalId = query.value("external_id").toInt(); event.accountId = query.value("account_id").toInt(); event.deviceId = query.value("device_id").toString(); event.amount = query.value("amount").toDouble(); event.phone = query.value("phone").toString(); event.bankName = query.value("bank_name").toString(); event.timestamp = DateUtils::fromUtcString(query.value("timestamp").toString()); event.updateTime = DateUtils::fromUtcString(query.value("update_time").toString()); event.completeTime = DateUtils::fromUtcString(query.value("complete_time").toString()); return event; } int EventDAO::insertEvent(const EventInfo &event) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( INSERT INTO events ( status, external_id, account_id, amount, phone, bank_name, timestamp, device_id ) VALUES ( :status, :external_id, :account_id, :amount, :phone, :bank_name, :timestamp, :device_id ) )"); query.bindValue(":status", eventStatusToString(event.status)); query.bindValue(":external_id", event.externalId); query.bindValue(":account_id", event.accountId); query.bindValue(":device_id", event.deviceId); query.bindValue(":amount", event.amount); query.bindValue(":phone", event.phone); query.bindValue(":bank_name", event.bankName); query.bindValue(":timestamp", DateUtils::toUtcString(event.timestamp)); if (!query.exec()) { qCritical() << "Ошибка при вставке event:" << query.lastError().text(); return -1; } return query.lastInsertId().toInt(); } bool EventDAO::updateEvent( const int id, const EventStatus &status, const QString &comment ) { QSqlQuery query(DatabaseManager::instance().database()); if (status == EventStatus::InProgress) { query.prepare(R"( UPDATE events SET status = :status, update_time = :update_time WHERE id = :id )"); query.bindValue(":update_time", DateUtils::toUtcString(DateUtils::getUtcNow())); } if (status == EventStatus::Complete) { query.prepare(R"( UPDATE events SET status = :status, complete_time = :complete_time WHERE id = :id )"); query.bindValue(":complete_time", DateUtils::toUtcString(DateUtils::getUtcNow())); } if (status == EventStatus::Error) { query.prepare(R"( UPDATE events SET status = :status, update_time = :update_time, comment = :comment WHERE id = :id )"); query.bindValue(":update_time", DateUtils::toUtcString(DateUtils::getUtcNow())); query.bindValue(":comment", comment); } query.bindValue(":id", id); query.bindValue(":status", eventStatusToString(status)); if (!query.exec()) { qCritical() << "Ошибка при обновлении event:" << query.lastError().text(); return false; } return true; } QList EventDAO::getAllEvents(const EventStatus &status) { QList events; QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( SELECT id, account_id, device_id, external_id, amount, phone, bank_name, status, update_time, complete_time, timestamp FROM events WHERE status = :status )"); query.bindValue(":status", eventStatusToString(status)); if (!query.exec()) { qWarning() << "Ошибка при получении getAllEvents:" << query.lastError().text(); return events; } while (query.next()) { events.append(parseEvent(query)); } return events; } EventInfo EventDAO::getFirstWaitEventByDeviceId(const QString &key) { QSqlQuery query(DatabaseManager::instance().database()); query.prepare(R"( SELECT id, account_id, device_id, external_id, amount, phone, bank_name, status, update_time, complete_time, timestamp FROM events WHERE status = :status AND device_id = :device_id ORDER BY timestamp ASC LIMIT 1 )"); query.bindValue(":status", eventStatusToString(EventStatus::Wait)); query.bindValue(":device_id", key); if (!query.exec()) { qCritical() << "Ошибка при получении getFirstWaitEventByDeviceId:" << query.lastError().text(); return {}; } while (query.next()) { return parseEvent(query); } return {}; }