Files
GUI/src/dialogs/GetWorkListDialog.cpp
2023-09-05 16:32:38 +08:00

260 lines
9.0 KiB
C++

#include "GetWorkListDialog.h"
#include <QVBoxLayout>
#include <QPushButton>
#include <QTableView>
#include <QStandardItemModel>
#include <QLabel>
#include <QSqlTableModel>
#include <QUuid>
#include <QDateTime>
#include <QSqlRecord>
#include <QRadioButton>
#include <QButtonGroup>
#include "components/ULineEdit.h"
#include "action/GetWorkListAction.h"
#include "action/ActionCreator.h"
#include "log/UserOperationLog.h"
GetWorkListDialog::GetWorkListDialog(QSqlTableModel* aSqlModel, QTableView* aTableView, QWidget* aParent, Qt::WindowFlags aFlags)
: AsyncActionDialog(ActionCreator::getAsyncAction<GetWorkListAction>("GetWorkListAction"),"Work List", aParent, aFlags)
, mAccessionNumber(new ULineEdit(mContentWidget))
, mPatientId(new ULineEdit(mContentWidget))
, mErrorLabel(new QLabel(mContentWidget))
, mAccessionNumText(new QLabel(mContentWidget))
, mPatientIDText(new QLabel(mContentWidget))
, mEditEndLine(new QLabel(mContentWidget))
, mPatientSelectTable(new QTableView(mContentWidget))
, mMode(PatientSearchMode)
, mPatientSelectModel(new QStandardItemModel(mContentWidget))
, mSqlModel(aSqlModel)
, mTableView(aTableView)
, mSearchedPatients()
, mRadioButtonArea(new QWidget(mContentWidget))
{
initializeContentWidgets();
GetWorkListAction* action = qobject_cast<GetWorkListAction*>(getAction());
if (action != nullptr)
{
action->setSqlModel(aSqlModel);
}
}
GetWorkListDialog::~GetWorkListDialog()
{
}
void GetWorkListDialog::initializeContentWidgets()
{
QVBoxLayout* contentLayout = new QVBoxLayout(mContentWidget);
mRadioButtonArea->setObjectName("RadioButtonArea");
contentLayout->addWidget(mRadioButtonArea);
QHBoxLayout* radioButtonLayout = new QHBoxLayout(mRadioButtonArea);
radioButtonLayout->setSpacing(50);
QRadioButton* radioButton1 = new QRadioButton(tr("Accession Number"), this);
radioButton1->setChecked(true);
QRadioButton* radioButton2 = new QRadioButton(tr("Patient ID"), this);
radioButtonLayout->addWidget(radioButton1);
radioButtonLayout->addWidget(radioButton2);
QButtonGroup* buttonGroup = new QButtonGroup(this);
buttonGroup->addButton(radioButton1, 0);
buttonGroup->addButton(radioButton2, 1);
connect(buttonGroup, QOverload<int>::of(&QButtonGroup::buttonClicked), [this](int aButtonIndex)
{
mAccessionNumber->clear();
mPatientId->clear();
if(aButtonIndex == 0)
{
mPatientIDText->setVisible(false);
mPatientId->setVisible(false);
mAccessionNumText->setVisible(true);
mAccessionNumber->setVisible(true);
}
else
{
mAccessionNumText->setVisible(false);
mAccessionNumber->setVisible(false);
mPatientIDText->setVisible(true);
mPatientId->setVisible(true);
}
});
//Accession Nummber
mAccessionNumText->setText(tr("Accession Nummber"));
contentLayout->addWidget(mAccessionNumText);
contentLayout->addWidget(mAccessionNumber);
//PatientId
mPatientIDText->setText(tr("Patient ID"));
contentLayout->addWidget(mPatientIDText);
contentLayout->addWidget(mPatientId);
mEditEndLine->setObjectName("endline");
contentLayout->addWidget(mEditEndLine);
mPatientIDText->setVisible(false);
mPatientId->setVisible(false);
//TableView
contentLayout->addWidget(mPatientSelectTable);
mPatientSelectModel->setColumnCount(4);
mPatientSelectModel->setHorizontalHeaderItem(0, new QStandardItem("Patient ID"));
mPatientSelectModel->setHorizontalHeaderItem(1, new QStandardItem("Accession Number"));
mPatientSelectModel->setHorizontalHeaderItem(2, new QStandardItem("Patient Name"));
mPatientSelectModel->setHorizontalHeaderItem(3, new QStandardItem("Scheduled Date"));
mPatientSelectTable->setModel(mPatientSelectModel);
mPatientSelectTable->setColumnWidth(0, 200);
mPatientSelectTable->setColumnWidth(1, 200);
mPatientSelectTable->setColumnWidth(2, 200);
mPatientSelectTable->setColumnWidth(3, 200);
mPatientSelectTable->setAlternatingRowColors(true);
mPatientSelectTable->setSelectionMode(QAbstractItemView::SingleSelection);
mPatientSelectTable->setEditTriggers(QAbstractItemView::NoEditTriggers);
mPatientSelectTable->setSelectionBehavior(QAbstractItemView::SelectRows);
// mTableView->verticalHeader()->setDefaultSectionSize(38);
// mTableView->horizontalHeader()->setStretchLastSection(true);
mPatientSelectTable->viewport()->ungrabGesture(Qt::PanGesture);
mPatientSelectTable->setSortingEnabled(false); // enable sortingEnabled
mPatientSelectTable->hide();
//ErrorLabel
contentLayout->addWidget(mErrorLabel);
mErrorLabel->setObjectName("warn");
mErrorLabel->hide();
}
bool GetWorkListDialog::updateReferenceData()
{
if(mMode == PatientSelectMode)
{
insertPatient(mSearchedPatients.at(mPatientSelectTable->currentIndex().row()));
return true;
}
QString accessionNum = mAccessionNumber->text();
QString patientId = mPatientId->text();
if (accessionNum.isEmpty() && patientId.isEmpty())
{
mErrorLabel->setText(tr("Accession Number and Patient Id is Empty."));
mErrorLabel->show();
return false;
}
GetWorkListAction* action = qobject_cast<GetWorkListAction*>(getAction());
if (action == nullptr)
{
mErrorLabel->setText(tr("Unknow Error. code:001001001"));
return false;
}
action->setWorkListQueryData(WorkListQueryData(accessionNum, patientId));
return AsyncActionDialog::updateReferenceData();
}
void GetWorkListDialog::handleFinishedAction(const ActionResult& aResult)
{
if (aResult.Code == Failed)
{
mErrorLabel->setText(aResult.Data.toString());
mContentWidget->show();
mBtnWidget->show();
mErrorLabel->show();
return;
}
mSearchedPatients = aResult.Data.value<QList<PatientInformationPointer>>();
if(mSearchedPatients.size() > 1)
{
updatePatientSelectTable();
}
else if(mSearchedPatients.size() == 1)
{
insertPatient(mSearchedPatients.at(0));
AsyncActionDialog::handleFinishedAction(aResult);
}
}
void GetWorkListDialog::updatePatientSelectTable()
{
int rowCount = mSearchedPatients.size();
mPatientSelectModel->setRowCount(rowCount);
for(int i=0; i<rowCount; ++i)
{
PatientInformationPointer patient = mSearchedPatients.at(i);
QModelIndex index = mPatientSelectModel->index(i, 0, QModelIndex());
mPatientSelectModel->setData(index, patient->ID);
index = mPatientSelectModel->index(i, 1, QModelIndex());
mPatientSelectModel->setData(index, patient->AccessionNumber);
index = mPatientSelectModel->index(i, 2, QModelIndex());
mPatientSelectModel->setData(index, patient->Name);
index = mPatientSelectModel->index(i, 3, QModelIndex());
mPatientSelectModel->setData(index, patient->ScheduledStartDate);
}
showPatientSelectTable();
}
void GetWorkListDialog::showPatientSelectTable()
{
setFixedWidth(900);
QRect re = geometry();
setGeometry(re.x() - 200, re.y(), 900, re.height());
mMode = PatientSelectMode;
mRadioButtonArea->hide();
mAccessionNumber->hide();
mPatientId->hide();
mErrorLabel->hide();
mAccessionNumText->hide();
mPatientIDText->hide();
mEditEndLine->hide();
mPatientSelectTable->show();
mContentWidget->show();
mBtnWidget->show();
mLoadingWidget->hide();
}
void GetWorkListDialog::insertPatient(PatientInformationPointer aPatient)
{
if (mSqlModel == nullptr)
{
return;
}
if (aPatient.isNull())
{
return;
}
mSqlModel->setFilter(QString("PatientID='%1' And AccessionNumber='%2'").arg(aPatient->ID).arg(aPatient->AccessionNumber));
if (mSqlModel->rowCount() > 0)
{
mSqlModel->setFilter("");
int patientIdIndex = mSqlModel->record().indexOf("PatientID");
int accessionNumberIndex = mSqlModel->record().indexOf("AccessionNumber");
for (int i = 0; i < mSqlModel->rowCount(); ++i)
{
if (mSqlModel->data(mSqlModel->index(i, patientIdIndex)) == aPatient->ID &&
mSqlModel->data(mSqlModel->index(i, accessionNumberIndex)) == aPatient->AccessionNumber)
{
mTableView->selectRow(i);
return;
}
}
return;
}
mSqlModel->setFilter("");
aPatient->PatientUID = QUuid::createUuid().toString();
aPatient->AddDate = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
mSqlModel->insertRow(0);
#define ADD_PATIENT_PROPERTY(val)\
mSqlModel->setData(mSqlModel->index(0, PatientInformationEnum:: val),aPatient->val);
EDIT_PATIENT()
#undef ADD_PATIENT_PROPERTY
if (!mSqlModel->submitAll())
{
mErrorLabel->setText( tr("DB Error,Patient Write Failed"));
mErrorLabel->show();
}
mTableView->selectRow(0);
LOG_USER_OPERATION(QString("Add Patient, ID:%1").arg(aPatient->ID));
}