From 6ca711ca2018b9ba412c608638d3f5b9b2de9ce6 Mon Sep 17 00:00:00 2001 From: Fanda Vacek Date: Thu, 14 May 2026 00:16:41 +0200 Subject: [PATCH] Show missing controls in column Error in module Card reader #1149 --- .../libquickeventcore/src/si/checkedcard.h | 1 + .../CardReader/src/cardcheckerclassiccpp.cpp | 16 +++-- .../CardReader/src/cardreaderplugin.cpp | 65 ++++++++----------- .../plugins/CardReader/src/cardreaderplugin.h | 2 +- .../CardReader/src/cardreaderwidget.cpp | 18 ++++- .../plugins/CardReader/src/cardreaderwidget.h | 9 +-- .../plugins/Oris/src/txtimporter.cpp | 3 +- 7 files changed, 64 insertions(+), 50 deletions(-) diff --git a/libquickevent/libquickeventcore/src/si/checkedcard.h b/libquickevent/libquickeventcore/src/si/checkedcard.h index d8ed83750..43883f2f1 100644 --- a/libquickevent/libquickeventcore/src/si/checkedcard.h +++ b/libquickevent/libquickeventcore/src/si/checkedcard.h @@ -31,6 +31,7 @@ class QUICKEVENTCORE_DECL_EXPORT CheckedCard : public QVariantMap QF_VARIANTMAP_FIELD(bool, is, set, BadCheck) QF_VARIANTMAP_FIELD(bool, is, set, MisPunch) QF_VARIANTMAP_FIELD(QVariantMap, d, setD, ata) + QF_VARIANTMAP_FIELD(QVariantList, m, setM, issingCodes) public: CheckedCard(const QVariantMap &data = QVariantMap()); diff --git a/quickevent/app/quickevent/plugins/CardReader/src/cardcheckerclassiccpp.cpp b/quickevent/app/quickevent/plugins/CardReader/src/cardcheckerclassiccpp.cpp index c5edfffd2..bc0ce1a7a 100644 --- a/quickevent/app/quickevent/plugins/CardReader/src/cardcheckerclassiccpp.cpp +++ b/quickevent/app/quickevent/plugins/CardReader/src/cardcheckerclassiccpp.cpp @@ -101,22 +101,24 @@ quickevent::core::si::CheckedCard CardCheckerClassicCpp::checkCard(const quickev } } + QVariantList missing_codes; int read_punch_check_ix = 0; for(int j=0; jupdateDbRecord("runs", run_id, rec); + { + QVariantMap rec { + {"checkTimeMs", checked_card.checkTimeMs()}, + {"timeMs", checked_card.timeMs()}, + {"finishTimeMs", checked_card.finishTimeMs()}, + {"misPunch", checked_card.isMisPunch()}, + {"badCheck", checked_card.isBadCheck()}, + {"notStart", false}, + {"penaltyTimeMs", {}}, + }; + app->updateDbRecord("runs", run_id, rec); + } + if (auto missing_codes = checked_card.missingCodes(); !missing_codes.isEmpty()) { + QStringList missing_str; + for (const auto &vl : missing_codes) { + auto vll = vl.toList(); + missing_str << QStringLiteral("%1-%2").arg(vll.value(0).toInt()).arg(vll.value(1).toInt()); + } + QVariantMap rec { + {"runIdAssignError", tr("Missing codes: %1").arg(missing_str.join(','))}, + }; + app->updateDbRecord("cards", card_id, rec); + } } catch (const std::exception &e) { qfError() << "Update runs error, query:" << e.what(); @@ -583,9 +574,9 @@ bool CardReaderPlugin::processCardToRunAssignment(int card_id, int run_id) } } } - quickevent::core::si::CheckedCard checked_card = checkCard(card_id, run_id); + auto checked_card = checkCard(card_id, run_id); //qfDebug() << checked_card.toString(); - updateCheckedCardValuesSql(checked_card); + updateCheckedCardValuesSql(card_id, checked_card); getPlugin()->emitDbEvent(Event::EventPlugin::DBEVENT_CARD_PROCESSED_AND_ASSIGNED, checked_card, true); q.execThrow("SELECT id, startTimeMs, finishTimeMs FROM runs" @@ -620,8 +611,8 @@ bool CardReaderPlugin::processCardToRunAssignment(int card_id, int run_id) } } else { - quickevent::core::si::CheckedCard checked_card = checkCard(card_id, run_id); - updateCheckedCardValuesSql(checked_card); + auto checked_card = checkCard(card_id, run_id); + updateCheckedCardValuesSql(card_id, checked_card); getPlugin()->emitDbEvent(Event::EventPlugin::DBEVENT_CARD_PROCESSED_AND_ASSIGNED, checked_card, true); } return true; diff --git a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderplugin.h b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderplugin.h index 3142dc4fe..302755f16 100644 --- a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderplugin.h +++ b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderplugin.h @@ -54,7 +54,7 @@ class CardReaderPlugin : public qf::gui::framework::Plugin void updateCardToRunAssignmentInPunches(int stage_id, int card_id, int run_id); bool saveCardAssignedRunnerIdSql(int card_id, int run_id); - void updateCheckedCardValuesSql(const quickevent::core::si::CheckedCard &checked_card) noexcept(false); + void updateCheckedCardValuesSql(int card_id, const quickevent::core::si::CheckedCard &checked_card) ; void setStartTime(int relay_id, int leg, int start_time); private: QList m_cardCheckers; diff --git a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.cpp b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.cpp index 3bb8dc472..c6e03da0e 100644 --- a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.cpp +++ b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.cpp @@ -46,7 +46,6 @@ #include #include #include -// #include #include #include @@ -69,7 +68,6 @@ using qf::gui::framework::getPlugin; using Event::EventPlugin; using CardReader::CardReaderPlugin; using Receipts::ReceiptsPlugin; -// using Competitors::CompetitorsPlugin; using Runs::RunsPlugin; namespace { @@ -261,6 +259,8 @@ CardReaderWidget::CardReaderWidget(QWidget *parent) } } }, Qt::QueuedConnection); + + connect(qf::gui::framework::Application::instance(), &qf::gui::framework::Application::dbRecChng, this, &CardReaderWidget::onDbRecChng, Qt::QueuedConnection); } CardReaderWidget::~CardReaderWidget() @@ -511,6 +511,20 @@ void CardReaderWidget::reload() m_cardsModel->reload(); } +void CardReaderWidget::onDbRecChng(const qf::core::sql::RecChng &recchng) +{ + if(isVisible()) { + if (recchng.table == "cards" && recchng.op == qf::core::sql::RecOp::Update) { + for (int i = 0; i < m_cardsModel->rowCount(); ++i) { + if (m_cardsModel->value(i, "cards.id").toInt() == recchng.id) { + m_cardsModel->reloadRow(i); + break; + } + } + } + } +} + void CardReaderWidget::onDbEventNotify(const QString &domain, int connection_id, const QVariant &data) { Q_UNUSED(connection_id) diff --git a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.h b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.h index 8dd7c2409..d3df45d63 100644 --- a/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.h +++ b/quickevent/app/quickevent/plugins/CardReader/src/cardreaderwidget.h @@ -17,13 +17,13 @@ namespace Ui { } namespace quickevent::gui::og { class SqlTableModel; } +namespace qf::core::sql { struct RecChng; } -namespace qf { -namespace gui { +namespace qf::gui { class Action; namespace framework { class PartWidget; class Plugin; } } -} + namespace siut { class DeviceDriver; class CommPort; class SICard; class SIPunch; } @@ -67,8 +67,9 @@ class CardReaderWidget : public QFrame Q_SLOT void reset(); Q_SLOT void reload(); +private: + void onDbRecChng(const qf::core::sql::RecChng &recchng); void onDbEventNotify(const QString &domain, int connection_id, const QVariant &data); -private slots: void appendLog(NecroLog::Level level, const QString &msg); void processDriverInfo(NecroLog::Level level, const QString &msg); void logDriverRawData(const QByteArray &data); diff --git a/quickevent/app/quickevent/plugins/Oris/src/txtimporter.cpp b/quickevent/app/quickevent/plugins/Oris/src/txtimporter.cpp index a5a09368e..bb46a2165 100644 --- a/quickevent/app/quickevent/plugins/Oris/src/txtimporter.cpp +++ b/quickevent/app/quickevent/plugins/Oris/src/txtimporter.cpp @@ -222,8 +222,9 @@ void TxtImporter::importParsedCsv(const QList &csv) QString reg = row.value(ColRegistration).toString(); QString class_name = row.value(ColClassName).toString(); int class_id = classes_map.value(class_name); - if(class_id == 0) + if(class_id == 0) { QF_EXCEPTION(tr("Undefined class name: '%1'").arg(class_name)); + } //fwk->showProgress("Importing: " + reg_no + ' ' + last_name + ' ' + first_name, items_processed, items_count); // qfWarning() << tr("%1 %2 %3 SI: %4 is duplicit!").arg(reg_no).arg(last_name).arg(first_name).arg(siid); doc.setValue("classId", class_id);