From d4e46767a895b3b4cfac122f26afd27427971f61 Mon Sep 17 00:00:00 2001 From: sunwen Date: Tue, 22 Aug 2023 17:51:08 +0800 Subject: [PATCH] Update GUI and Recon connection. --- src/device/DeviceManager.cpp | 35 +++++++-- src/device/DeviceManager.h | 10 ++- src/forms/recon/ReconFormWidget.cpp | 52 +++++++++---- src/forms/recon/ReconFormWidget.h | 10 ++- src/forms/recon/ReconStateDelegate.cpp | 87 ++++++++++++++++++++++ src/forms/recon/ReconStateDelegate.h | 15 ++++ src/forms/recon/ScanSearchCriteriaForm.cpp | 74 ++++++++++++++++-- src/forms/recon/ScanSearchCriteriaForm.h | 9 +++ src/recon/ReconManager.cpp | 5 +- 9 files changed, 266 insertions(+), 31 deletions(-) create mode 100644 src/forms/recon/ReconStateDelegate.cpp create mode 100644 src/forms/recon/ReconStateDelegate.h diff --git a/src/device/DeviceManager.cpp b/src/device/DeviceManager.cpp index c409924..63dcc46 100644 --- a/src/device/DeviceManager.cpp +++ b/src/device/DeviceManager.cpp @@ -132,7 +132,7 @@ void DeviceManager::initDevice() mStopScanAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_STOP, this, "responseStopScan(const QString&)", this); mPreviewScanAction = new DmsSyncAction(USRV_SCAN, ACT_SCAN_PREVIEW, this, "responsePreviewScan(const QString&)", this); mTransferAction = new DmsSyncAction(USRV_XFR, ACT_XFR_START, this, "responseTransfer(const QString&)", this); - + mGetTransferProgressAction = new DmsSyncAction(USRV_XFR, ACT_XFR_PROGRESS_PASSIVE, this, "responseGetTransferProgress(const QString&)", this); //Async action mGetScanProgressAction = new DmsAsyncAction(USRV_SCAN, ACT_SCAN_PROGRESS_PASSIVE, this,"responseGetScanProgress(const QString&)", this); @@ -479,7 +479,7 @@ void DeviceManager::processReceiveDMSInfoResult(int aServerID, int aActionID, co emit responseTransfer(aContents); break; case ACT_XFR_PROGRESS_PASSIVE : - processTransferProgress(aContents); + emit responseGetTransferProgress(aContents); break; case ACT_XFR_PROGRESS_ACTIVE : processTransferProgress(aContents); @@ -654,7 +654,7 @@ void DeviceManager::startTransfer() return; } - QString sql = "SELECT ScanID FROM %1 WHERE State=0 ORDER BY ScanDateTime ASC LIMIT 1"; + QString sql = "SELECT ScanID FROM %1 WHERE State<200 ORDER BY ScanDateTime ASC LIMIT 1"; QString table = "EScan"; QVariant sqlResult = SQLHelper::queryValue(sql.arg(table)); mIsTransferEmptyScan = true; @@ -668,7 +668,6 @@ void DeviceManager::startTransfer() return; } } - QString scanID = sqlResult.toString(); auto host = JsonObject::Instance()->getServer(JsonObject::RECON); mTransferAction->setSendData("{\"MD5\":1, \"dst\":\"" + host.ae + "@" + host.ip +":" + RECON_TRANSFER_PATH + "\", \"src\":\"" + scanID + "\",\"delete\":1,\"active report\":0}"); @@ -812,6 +811,7 @@ void DeviceManager::processReconQueryScanState(const QMap aResult) emitInfoCallback(msg, MessageLevel::Error); } } + emit updateReconStateFinished(); } void DeviceManager::createScanReconRecord(const QString& aScanID, const QString& aPatientID, const QString& aReferenceID) @@ -834,6 +834,7 @@ void DeviceManager::initEmptyScanMeasurementID() void DeviceManager::updateReconState() { + updateTransferProgress(); QString sql = "SELECT ScanID FROM Scan WHERE State != 999"; auto result = SQLHelper::queryValues(sql); QStringList scanIDs; @@ -842,9 +843,31 @@ void DeviceManager::updateReconState() scanIDs << variant.toString(); } - if(!scanIDs.isEmpty()) + if(scanIDs.isEmpty()) { - emit queryScanStatusToRecon(scanIDs); + emit updateReconStateFinished(); + return; + } + emit queryScanStatusToRecon(scanIDs); +} + +void DeviceManager::updateTransferProgress() +{ + if(!mIsTransfering) + { + return; + } + mTransferProgress = 0; + auto result = mGetTransferProgressAction->execute(); + QJsonObject jsonObj = toJsonObject(result.mData); + if(jsonObj["code"].toInt() == 0 ) + { + mTransferProgress = jsonObj["info"].toInt(); } } +int DeviceManager::getTransferProgress() +{ + return mTransferProgress; +} + diff --git a/src/device/DeviceManager.h b/src/device/DeviceManager.h index 9f248fe..200c20a 100644 --- a/src/device/DeviceManager.h +++ b/src/device/DeviceManager.h @@ -69,6 +69,11 @@ public: void emitErrorCallback(const char *msg); void emitInfoCallback(const QString& aMessage,const unsigned int aInfoType); bool hasValidEmptyScan(); + void updateTransferProgress(); + int getTransferProgress(); + +public slots: + void updateReconState(); signals: @@ -98,7 +103,6 @@ private: void getScanProcess(); void startTransfer(); void initEmptyScanMeasurementID(); - void updateReconState(); void processScanProcess(const QString& aProgress); void prepareFinishScan(bool isNormalFinish, const QString& aReason = ""); @@ -132,15 +136,18 @@ signals: void responsePreviewScan(const QString& aResponse); void responseGetSoftwareVersion(const QString& aSoftwareVersion); void responseTransfer(const QString& aResponse); + void responseGetTransferProgress(const QString& aProgress); //Recon void createEmptyScanToRecon(const QString& aScanID, const QString& aPath); void createScanToRecon(const QString& aScanID, const QString& aPatientID, const QString& aReferenceID, const QString& aPath); void queryScanStatusToRecon(const QStringList& aScanIDs); + void updateReconStateFinished(); private: int mTemperatureTimer = -1; int mScanProgressTimer = -1; + int mTransferProgress = 0; bool mIsEmptyScan = false; bool mIsTransferEmptyScan = false; bool mIsScanning = false; @@ -164,6 +171,7 @@ private: DmsSyncAction* mCEScanAction = nullptr; DmsSyncAction* mStopScanAction = nullptr; DmsSyncAction* mTransferAction = nullptr; + DmsSyncAction* mGetTransferProgressAction = nullptr; DmsAsyncAction* mGetDeviceTemperatureAction = nullptr; DmsAsyncAction* mGetScanProgressAction = nullptr; diff --git a/src/forms/recon/ReconFormWidget.cpp b/src/forms/recon/ReconFormWidget.cpp index f7a8246..6498ddc 100644 --- a/src/forms/recon/ReconFormWidget.cpp +++ b/src/forms/recon/ReconFormWidget.cpp @@ -8,7 +8,9 @@ #include "components/SlideTableView.h" #include "db/SQLHelper.h" +#include "device/DeviceManager.h" #include "ScanSearchCriteriaForm.h" +#include "ReconStateDelegate.h" ReconFormWidget::ReconFormWidget(QWidget *parent) : TabFormWidget(parent) @@ -16,9 +18,9 @@ ReconFormWidget::ReconFormWidget(QWidget *parent) , mBtnDelete(new QToolButton(this)) , mBtnRefresh(new QToolButton(this)) , mScanTable(new SlideTableView(this)) -, mModel(nullptr){ - - +, mSearchWidget(new ScanSearchCriteriaForm(this)) +, mModel(nullptr) +{ auto layout = new QHBoxLayout(ui->commandWidget); layout->setAlignment(Qt::AlignmentFlag::AlignLeft); mBtnDiscard->setObjectName("btnDiscard"); @@ -37,17 +39,24 @@ ReconFormWidget::ReconFormWidget(QWidget *parent) initDataModel(); //Init content widget - QWidget * widget = new ScanSearchCriteriaForm(this); - widget->setObjectName("SearchCriteriaForm"); - ui->horizontalLayout->insertWidget(0,widget); + mSearchWidget->setObjectName("SearchCriteriaForm"); + ui->horizontalLayout->insertWidget(0, mSearchWidget); insertVerticalLine(1,ui->horizontalLayout); auto* contentLayout = new QHBoxLayout(this->ui->contentWidget); contentLayout->setContentsMargins(0, 0, 0, 0); initTableView(contentLayout); + connect(mBtnRefresh, &QToolButton::clicked, DeviceManager::Default(), &DeviceManager::updateReconState); + connect(DeviceManager::Default(), &DeviceManager::updateReconStateFinished, mModel, &QSqlTableModel::select); + connect(mSearchWidget, &ScanSearchCriteriaForm::searchFilterUpdated, this, &ReconFormWidget::updateSearchFilter); + } -void ReconFormWidget::initTableView(QHBoxLayout *contentLayout) {// TableView for Scan +void ReconFormWidget::initTableView(QHBoxLayout *contentLayout) +{ + // TableView for Scan + ReconStateDelegate* delegate = new ReconStateDelegate(this); + mScanTable->setItemDelegateForColumn(8, delegate); mScanTable->setAlternatingRowColors(true); mScanTable->setSelectionMode(QAbstractItemView::SingleSelection); mScanTable->setEditTriggers(QAbstractItemView::NoEditTriggers); @@ -60,30 +69,41 @@ void ReconFormWidget::initTableView(QHBoxLayout *contentLayout) {// TableView fo mScanTable->viewport()->ungrabGesture(Qt::PanGesture); mScanTable->setSortingEnabled(true); // enable sortingEnabled - mScanTable->setModel((QAbstractItemModel*) mModel); + mScanTable->setModel(mModel); mScanTable->hideColumn(0); mScanTable->hideColumn(1); - mScanTable->show(); + mScanTable->hideColumn(4); mScanTable->setColumnWidth(2, 250); - mScanTable->setColumnWidth(3, 200); - mScanTable->setColumnWidth(4, 160); + mScanTable->setColumnWidth(3, 250); mScanTable->setColumnWidth(5, 250); - mScanTable->setColumnWidth(6, 250); + mScanTable->setColumnWidth(6, 100); + mScanTable->setColumnWidth(7, 250); contentLayout->addWidget(mScanTable); + + mScanTable->show(); //table current row selection changing event // after sort by column } -void ReconFormWidget::initDataModel() {//TODO:单独初始化预防SQL错误 +void ReconFormWidget::initDataModel() +{ + //TODO:单独初始化预防SQL错误 mModel = SQLHelper::getTable("Scan"); - mModel->sort(5, Qt::DescendingOrder); - mModel->select(); - mModel->setHeaderData(2, Qt::Horizontal, "PatientID"); + mModel->sort(3, Qt::DescendingOrder); + updateSearchFilter(); + + mModel->setHeaderData(2, Qt::Horizontal, tr("PatientID")); mModel->setHeaderData(5, Qt::Horizontal, tr("PatientName")); mModel->setHeaderData(3, Qt::Horizontal, tr("Scan Time")); mModel->setHeaderData(6, Qt::Horizontal, tr("Laterality")); mModel->setHeaderData(7, Qt::Horizontal, tr("OperatorName")); mModel->setHeaderData(8, Qt::Horizontal, tr("State")); } + +void ReconFormWidget::updateSearchFilter() +{ + mModel->setFilter(mSearchWidget->getSearchFilter()); + mModel->select(); +} diff --git a/src/forms/recon/ReconFormWidget.h b/src/forms/recon/ReconFormWidget.h index 61b54f0..c52f4e9 100644 --- a/src/forms/recon/ReconFormWidget.h +++ b/src/forms/recon/ReconFormWidget.h @@ -3,21 +3,29 @@ #define IMG1_V2_BIN_RECONFORMWIDGET_H #include "forms/TabFormWidget.h" + class QToolButton; class SlideTableView; class QSqlTableModel; -class ReconFormWidget: public TabFormWidget { +class ScanSearchCriteriaForm; + +class ReconFormWidget: public TabFormWidget +{ Q_OBJECT public: explicit ReconFormWidget(QWidget *parent = nullptr); ~ReconFormWidget() override = default; +private slots: + void updateSearchFilter(); + private: QToolButton* mBtnDiscard; QToolButton* mBtnDelete; QToolButton* mBtnRefresh; SlideTableView* mScanTable; + ScanSearchCriteriaForm* mSearchWidget; QSqlTableModel *mModel; void initTableView(QHBoxLayout *contentLayout); diff --git a/src/forms/recon/ReconStateDelegate.cpp b/src/forms/recon/ReconStateDelegate.cpp new file mode 100644 index 0000000..12d67cb --- /dev/null +++ b/src/forms/recon/ReconStateDelegate.cpp @@ -0,0 +1,87 @@ +#include "ReconStateDelegate.h" +#include "device/DeviceManager.h" + +#include +#include +#include + +ReconStateDelegate::ReconStateDelegate(QObject* aParent) + : QStyledItemDelegate(aParent) +{ + +} + +void ReconStateDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QVariant data = index.data(Qt::DisplayRole); + + if (data.isValid()) + { + int state = data.toInt(); + QString displayText; + switch (state) + { + case 0: + displayText = tr("Wait to transfer"); + break; + case 100: + { + displayText = tr("Transfering"); + int progress = DeviceManager::Default()->getTransferProgress(); + QRect textRect = option.rect; + textRect.setRight(option.rect.right() - 300); + painter->drawText(textRect, Qt::AlignCenter, displayText); + + QRect progressBarRect = option.rect; + progressBarRect.setLeft(textRect.right() + 20); + progressBarRect.setRight(option.rect.right() - 5); + progressBarRect.setTop(option.rect.top() + 5); + progressBarRect.setBottom(option.rect.bottom() - 5); + + QStyleOptionProgressBarV2 progressBarOption; + progressBarOption.rect = progressBarRect; + progressBarOption.minimum = 0; + progressBarOption.maximum = 100; + progressBarOption.progress = progress; + QApplication::style()->drawControl(QStyle::CE_ProgressBar, &progressBarOption, painter); + + return; + } + case 104: + displayText = tr("Transfer failed"); + break; + case 200: + displayText = tr("Transfer completed"); + break; + case 204: + displayText = tr("Recon create failed"); + break; + case 300: + displayText = tr("Recon create succeed"); + break; + case 400: + displayText = tr("Wait to recon"); + break; + case 500: + displayText = tr("Recon ing"); + break; + case 504: + displayText = tr("Recon failed"); + break; + case 600: + displayText = tr("Recon succeed"); + break; + case 604: + displayText = tr("PACS failed"); + break; + case 999: + displayText = tr("PACS succeed"); + break; + default: + displayText = tr("Unknow"); + break; + } + + painter->drawText(option.rect, Qt::AlignCenter, displayText); + } +} diff --git a/src/forms/recon/ReconStateDelegate.h b/src/forms/recon/ReconStateDelegate.h new file mode 100644 index 0000000..e293465 --- /dev/null +++ b/src/forms/recon/ReconStateDelegate.h @@ -0,0 +1,15 @@ +#ifndef RECONSTATEDELEGATE_H +#define RECONSTATEDELEGATE_H + +#include + +class ReconStateDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + ReconStateDelegate(QObject* aParent); + + void paint(QPainter *aPainter, const QStyleOptionViewItem &aOption, const QModelIndex &aIndex) const override; +}; + +#endif // RECONSTATEDELEGATE_H diff --git a/src/forms/recon/ScanSearchCriteriaForm.cpp b/src/forms/recon/ScanSearchCriteriaForm.cpp index c5cddb5..3f10821 100644 --- a/src/forms/recon/ScanSearchCriteriaForm.cpp +++ b/src/forms/recon/ScanSearchCriteriaForm.cpp @@ -3,15 +3,17 @@ #include #include "components/ListBox.h" +#include "dialogs/DialogManager.h" -ScanSearchCriteriaForm::ScanSearchCriteriaForm(QWidget *parent) : - QWidget(parent), - ui(new Ui::ScanSearchCriteriaForm) +ScanSearchCriteriaForm::ScanSearchCriteriaForm(QWidget *parent) + : QWidget(parent) + , ui(new Ui::ScanSearchCriteriaForm) + , mSearchFilter() { ui->setupUi(this); auto beginBox = new ListBox(this); -// beginBox->setSmallBox(true); + // beginBox->setSmallBox(true); ui->verticalLayoutDate->replaceWidget(ui->mLBBeginDate,beginBox); ui->mLBBeginDate->setVisible(false); ui->mLBBeginDate->deleteLater(); @@ -21,7 +23,7 @@ ScanSearchCriteriaForm::ScanSearchCriteriaForm(QWidget *parent) : ui->mLBBeginDate->setText(QDate::currentDate().toString("yyyy-MM-dd")); auto endBox = new ListBox(this); -// endBox->setSmallBox(true); + // endBox->setSmallBox(true); ui->verticalLayoutDate->replaceWidget(ui->mLBEndDate,endBox); ui->mLBEndDate->setVisible(false); ui->mLBEndDate->deleteLater(); @@ -33,9 +35,71 @@ ScanSearchCriteriaForm::ScanSearchCriteriaForm(QWidget *parent) : ui->ScanTitle->setObjectName("parameterTitle"); ui->holder1->setObjectName("endSpaceLine"); + + connect(ui->mLBEndDate, &QToolButton::clicked, [=]() + { + DialogResult result = DialogManager::Default()->requestSelectDate(ui->mLBEndDate->text()); + if (result.ResultCode == QDialog::Accepted) + { + ui->mLBEndDate->setText(result.ResultData.toString()); + } + }); + + connect(ui->mLBBeginDate, &QToolButton::clicked, [=]() + { + DialogResult result = DialogManager::Default()->requestSelectDate(ui->mLBEndDate->text()); + if (result.ResultCode == QDialog::Accepted) + { + ui->mLBBeginDate->setText(result.ResultData.toString()); + } + }); + + connect(ui->mBtnToday, &QToolButton::clicked, [=]() + { + QString today = QDate::currentDate().toString("yyyy-MM-dd"); + ui->mLBEndDate->setText(today); + ui->mLBBeginDate->setText(today); + updateSearchFilter(); + }); + + connect(ui->mBtnSevenDays, &QToolButton::clicked, [=]() + { + ui->mLBEndDate->setText(QDate::currentDate().toString("yyyy-MM-dd")); + ui->mLBBeginDate->setText(QDate::currentDate().addDays(-7).toString("yyyy-MM-dd")); + updateSearchFilter(); + }); + + connect(ui->mBtnYesterday, &QToolButton::clicked, [=]() + { + QString yesterday = QDate::currentDate().addDays(-1).toString("yyyy-MM-dd"); + ui->mLBEndDate->setText(yesterday); + ui->mLBBeginDate->setText(yesterday); + updateSearchFilter(); + }); + + connect(ui->mBtnAll, &QToolButton::clicked, [=]() + { + QString today = QDate::currentDate().toString("yyyy-MM-dd"); + ui->mLBEndDate->setText(today); + ui->mLBBeginDate->setText("1990-01-01"); + updateSearchFilter(); + }); + + connect(ui->mBtnDates, &QPushButton::clicked, this, &ScanSearchCriteriaForm::updateSearchFilter); + } ScanSearchCriteriaForm::~ScanSearchCriteriaForm() { delete ui; } + +QString ScanSearchCriteriaForm::getSearchFilter() +{ + return QString("ScanDateTime >= '%1 00:00:00' And ScanDateTime <= '%2 23:59:59'").arg(ui->mLBBeginDate->text()).arg(ui->mLBEndDate->text()); +} + +void ScanSearchCriteriaForm::updateSearchFilter() +{ + emit searchFilterUpdated(); +} diff --git a/src/forms/recon/ScanSearchCriteriaForm.h b/src/forms/recon/ScanSearchCriteriaForm.h index 1dc9958..9c6e805 100644 --- a/src/forms/recon/ScanSearchCriteriaForm.h +++ b/src/forms/recon/ScanSearchCriteriaForm.h @@ -15,8 +15,17 @@ public: explicit ScanSearchCriteriaForm(QWidget *parent = nullptr); ~ScanSearchCriteriaForm(); + QString getSearchFilter(); + +private slots: + void updateSearchFilter(); + +signals: + void searchFilterUpdated(); + private: Ui::ScanSearchCriteriaForm *ui; + QString mSearchFilter; }; #endif // SCANSEARCHCRITERIAFORM_H diff --git a/src/recon/ReconManager.cpp b/src/recon/ReconManager.cpp index 9bf8c6a..227e425 100644 --- a/src/recon/ReconManager.cpp +++ b/src/recon/ReconManager.cpp @@ -66,12 +66,12 @@ void ReconManager::createScan(const QString& aScanID, const QString& aPatientID, auto response = mReconClient->Create(scan); if(response.good()) { - qDebug()<< "create scan success, scanID: "<< aScanID; + qDebug()<< "Recon create scan success, scanID: "<< aScanID; emit createScanResponsed(true, aScanID); } else { - qDebug()<< "Create scan fail by " << response.error().data(); + qDebug()<< "Recon create scan failed by " << response.error().data(); emit createScanResponsed(false, aScanID, response.error().data()); } } @@ -85,6 +85,7 @@ void ReconManager::queryReconStatus(const QStringList& aScanIDs) auto response = mReconClient->QueryScan(scanID.toStdString(), state); if(response.bad()) { + qDebug()<< "Recon query failed by " << response.error().data(); break; } result.insert(scanID, state);