feat: Change Worklist reference class to suit MPPS
This commit is contained in:
@@ -257,6 +257,7 @@ void GetWorkListDialog::insertPatient(PatientInformationPointer aPatient)
|
|||||||
mSqlModel->data(mSqlModel->index(i, accessionNumberIndex)) == aPatient->AccessionNumber)
|
mSqlModel->data(mSqlModel->index(i, accessionNumberIndex)) == aPatient->AccessionNumber)
|
||||||
{
|
{
|
||||||
mTableView->selectRow(i);
|
mTableView->selectRow(i);
|
||||||
|
aPatient->PatientUID = mSqlModel->data(mSqlModel->index(i, 0)).toString();
|
||||||
EventCenter::Default()->triggerEvent(PatientSelected, nullptr, (QObject*)(aPatient.data()));
|
EventCenter::Default()->triggerEvent(PatientSelected, nullptr, (QObject*)(aPatient.data()));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -269,7 +270,7 @@ void GetWorkListDialog::insertPatient(PatientInformationPointer aPatient)
|
|||||||
mSqlModel->insertRow(0);
|
mSqlModel->insertRow(0);
|
||||||
#define ADD_PATIENT_PROPERTY(val)\
|
#define ADD_PATIENT_PROPERTY(val)\
|
||||||
mSqlModel->setData(mSqlModel->index(0, PatientInformationEnum:: val),aPatient->val);
|
mSqlModel->setData(mSqlModel->index(0, PatientInformationEnum:: val),aPatient->val);
|
||||||
EDIT_PATIENT()
|
ADD_PATIENT()
|
||||||
#undef ADD_PATIENT_PROPERTY
|
#undef ADD_PATIENT_PROPERTY
|
||||||
if (!mSqlModel->submitAll())
|
if (!mSqlModel->submitAll())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -2,38 +2,42 @@
|
|||||||
|
|
||||||
#include <dcmtk/dcmnet/scu.h>
|
#include <dcmtk/dcmnet/scu.h>
|
||||||
#include <dcmtk/dcmdata/dcpath.h>
|
#include <dcmtk/dcmdata/dcpath.h>
|
||||||
|
#include <dcmtk/dcmdata/dctk.h>
|
||||||
|
#include <dcmtk/dcmdata/dcdict.h>
|
||||||
|
#include <dcmtk/dcmnet/diutil.h>
|
||||||
|
|
||||||
#include "json/jsonobject.h"
|
#include "json/jsonobject.h"
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
#include <QDate>
|
#include <QDate>
|
||||||
|
|
||||||
WorkListManager* WorkListManager::getInstance()
|
WorkListManager *WorkListManager::getInstance()
|
||||||
{
|
{
|
||||||
static WorkListManager instance;
|
static WorkListManager instance;
|
||||||
return &instance;
|
return &instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorkListManager::setTableModel(QSqlTableModel* aModel)
|
void WorkListManager::setTableModel(QSqlTableModel *aModel)
|
||||||
{
|
{
|
||||||
mTableModel = aModel;
|
mTableModel = aModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorkListManager::setTableView(QTableView* aTableView)
|
void WorkListManager::setTableView(QTableView *aTableView)
|
||||||
{
|
{
|
||||||
mTableView = aTableView;
|
mTableView = aTableView;
|
||||||
}
|
}
|
||||||
|
|
||||||
QSqlTableModel* WorkListManager::getTableModel()
|
QSqlTableModel *WorkListManager::getTableModel()
|
||||||
{
|
{
|
||||||
return mTableModel;
|
return mTableModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTableView* WorkListManager::getTableView()
|
QTableView *WorkListManager::getTableView()
|
||||||
{
|
{
|
||||||
return mTableView;
|
return mTableView;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WorkListManager::setSearchString(const QString& aSearchString)
|
void WorkListManager::setSearchString(const QString &aSearchString)
|
||||||
{
|
{
|
||||||
mSearchString += aSearchString;
|
mSearchString += aSearchString;
|
||||||
}
|
}
|
||||||
@@ -47,30 +51,25 @@ QString WorkListManager::getSearchString()
|
|||||||
|
|
||||||
WorkListManager::WorkListManager()
|
WorkListManager::WorkListManager()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
WorkListManager::~WorkListManager()
|
WorkListManager::~WorkListManager()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
QList<PatientInformationPointer> WorkListManager::getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId)
|
int WorkListManager::getPatientFromWorkList(const QString &aAccessionNum, const QString &aPatientId, QList<PatientInformationPointer>& aOutPatient)
|
||||||
{
|
{
|
||||||
|
if (!dcmDataDict.isDictionaryLoaded())
|
||||||
|
{
|
||||||
|
qDebug() << "dcmdatadict error";
|
||||||
|
}
|
||||||
|
|
||||||
DcmSCU scu;
|
DcmSCU scu;
|
||||||
OFString temp_str;
|
|
||||||
host serverInfo = JsonObject::Instance()->getServer(JsonObject::WORKLIST);
|
host serverInfo = JsonObject::Instance()->getServer(JsonObject::WORKLIST);
|
||||||
QByteArray ip = serverInfo.ip.toLatin1();
|
QByteArray ip = serverInfo.ip.toLatin1();
|
||||||
QByteArray aeTitle = serverInfo.ae.toLatin1();
|
QByteArray aeTitle = serverInfo.ae.toLatin1();
|
||||||
OFList<OFString> overrideKeys;
|
|
||||||
overrideKeys.push_back(OFString((QString("0008,0050=") + aAccessionNum).toLatin1()));
|
|
||||||
overrideKeys.push_back(OFString((QString("0010,0020=") + aPatientId).toLatin1()));
|
|
||||||
overrideKeys.push_back("0010,0010");
|
|
||||||
overrideKeys.push_back("0010,0030");
|
|
||||||
overrideKeys.push_back("0010,0040");
|
|
||||||
overrideKeys.push_back("0040,0002");
|
|
||||||
if (!dcmDataDict.isDictionaryLoaded())
|
|
||||||
{
|
|
||||||
qDebug()<<"dcmdatadict error";
|
|
||||||
}
|
|
||||||
/*scu*/
|
/*scu*/
|
||||||
OFList<OFString> syntaxes;
|
OFList<OFString> syntaxes;
|
||||||
syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax);
|
syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax);
|
||||||
@@ -78,96 +77,168 @@ QList<PatientInformationPointer> WorkListManager::getPatientFromWorkList(const Q
|
|||||||
scu.setACSETimeout(30);
|
scu.setACSETimeout(30);
|
||||||
scu.setDIMSEBlockingMode(DIMSE_BLOCKING);
|
scu.setDIMSEBlockingMode(DIMSE_BLOCKING);
|
||||||
scu.setDIMSETimeout(0);
|
scu.setDIMSETimeout(0);
|
||||||
scu.setAETitle(serverInfo.name.toLatin1().data());
|
scu.setAETitle(serverInfo.localAE.toLatin1().data());
|
||||||
scu.setPeerHostName(ip.data());
|
scu.setPeerHostName(ip.data());
|
||||||
scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt()));
|
scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt()));
|
||||||
scu.setPeerAETitle(aeTitle.data());
|
scu.setPeerAETitle(aeTitle.data());
|
||||||
scu.setVerbosePCMode(OFFalse);
|
scu.setVerbosePCMode(OFFalse);
|
||||||
scu.addPresentationContext(UID_FINDModalityWorklistInformationModel, syntaxes);//UID_FINDStudyRootQueryRetrieveInformationModel
|
scu.addPresentationContext(UID_FINDModalityWorklistInformationModel, syntaxes); // UID_FINDStudyRootQueryRetrieveInformationModel
|
||||||
OFCondition cond = scu.initNetwork();
|
OFCondition cond = scu.initNetwork();
|
||||||
|
|
||||||
if(cond.bad())
|
if (cond.bad())
|
||||||
{
|
{
|
||||||
qDebug()<<cond.code() <<cond.text();
|
qDebug() << cond.code() << cond.text();
|
||||||
qDebug()<<"worklist initNetwork failed";
|
qDebug() << "worklist initNetwork failed";
|
||||||
return QList<PatientInformationPointer>();
|
return InitNetWorkError;
|
||||||
}
|
}
|
||||||
cond = scu.negotiateAssociation();
|
cond = scu.negotiateAssociation();
|
||||||
if(cond.bad())
|
if (cond.bad())
|
||||||
{
|
{
|
||||||
qDebug()<<cond.code();//<< "----"<<cond.text();
|
qDebug() << cond.code()<< "----"<<cond.text();
|
||||||
qDebug()<<"worklist connect failed";
|
qDebug() << "worklist connect failed";
|
||||||
return QList<PatientInformationPointer>();
|
return ConnectError;
|
||||||
}
|
}
|
||||||
|
|
||||||
cond = EC_Normal;
|
cond = EC_Normal;
|
||||||
T_ASC_PresentationContextID pcid = scu.findPresentationContextID(UID_FINDModalityWorklistInformationModel,"");
|
T_ASC_PresentationContextID pcid = scu.findPresentationContextID(UID_FINDModalityWorklistInformationModel, "");
|
||||||
if (pcid == 0)
|
if (pcid == 0)
|
||||||
{
|
{
|
||||||
qDebug()<<"worklist pcid bad";
|
qDebug() << "worklist pcid bad";
|
||||||
return QList<PatientInformationPointer>();
|
return ContextError;
|
||||||
}
|
}
|
||||||
|
|
||||||
DcmFileFormat dcmff;
|
DcmFileFormat dcmff;
|
||||||
DcmDataset *dset = dcmff.getDataset();
|
DcmDataset *dset = dcmff.getDataset();
|
||||||
OFList<QRResponse*> responses;
|
if (!aPatientId.isEmpty())
|
||||||
DcmPathProcessor proc;
|
|
||||||
proc.setItemWildcardSupport(OFFalse);
|
|
||||||
proc.checkPrivateReservations(OFFalse);
|
|
||||||
|
|
||||||
for(auto &item:overrideKeys)
|
|
||||||
{
|
{
|
||||||
proc.applyPathWithValue(dset, item);
|
dset->putAndInsertString(DCM_PatientID, aPatientId.toStdString().data());
|
||||||
}
|
}
|
||||||
QList<PatientInformationPointer> result;
|
else
|
||||||
|
{
|
||||||
|
dset->insertEmptyElement(DCM_PatientID);
|
||||||
|
}
|
||||||
|
if (!aAccessionNum.isEmpty())
|
||||||
|
{
|
||||||
|
dset->putAndInsertString(DCM_AccessionNumber, aAccessionNum.toStdString().data());
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
dset->insertEmptyElement(DCM_AccessionNumber);
|
||||||
|
}
|
||||||
|
dset->insertEmptyElement(DCM_PatientName);
|
||||||
|
dset->insertEmptyElement(DCM_PatientSex);
|
||||||
|
dset->insertEmptyElement(DCM_PatientBirthDate);
|
||||||
|
dset->insertEmptyElement(DCM_StudyInstanceUID);
|
||||||
|
dset->insertEmptyElement(DCM_WorklistLabel);
|
||||||
|
dset->insertEmptyElement(DCM_RequestedProcedureID);
|
||||||
|
|
||||||
|
DcmSequenceOfItems *step_Seq = new DcmSequenceOfItems(DCM_ScheduledProcedureStepSequence);
|
||||||
|
DcmItem *step_item = new DcmItem();
|
||||||
|
|
||||||
|
// use local aetitle to retrieve
|
||||||
|
step_item->putAndInsertString(DCM_ScheduledStationAETitle, "USCT");
|
||||||
|
// PS: begin time fit begin date like date: 20240328-20240528 time:011201-020101
|
||||||
|
// means 2024-03-28 01:12:01 - 2024-05-28 02:01:01
|
||||||
|
// step_item->putAndInsertString(DCM_ScheduledProcedureStepStartDate,"20240528-20240528");
|
||||||
|
// step_item->putAndInsertString(DCM_ScheduledProcedureStepStartTime,"011201-030101");
|
||||||
|
step_item->putAndInsertString(DCM_Modality, "CT");
|
||||||
|
step_item->insertEmptyElement(DCM_ScheduledProtocolCodeSequence);
|
||||||
|
step_item->insertEmptyElement(DCM_ScheduledProcedureStepID);
|
||||||
|
|
||||||
|
step_Seq->insert(step_item);
|
||||||
|
dset->insert(step_Seq);
|
||||||
|
|
||||||
|
OFList<QRResponse *> responses;
|
||||||
|
|
||||||
cond = scu.sendFINDRequest(pcid, dset, &responses);
|
cond = scu.sendFINDRequest(pcid, dset, &responses);
|
||||||
|
int result = Success;
|
||||||
if (responses.size() > 1)
|
if (responses.size() > 1)
|
||||||
{
|
{
|
||||||
for(auto item = responses.begin(); item != responses.end(); ++item)
|
qDebug()<<"cfind Response size:"<<responses.size();
|
||||||
|
for (auto item = responses.begin(); item != responses.end(); ++item)
|
||||||
{
|
{
|
||||||
if ((*item)->m_dataset)
|
if ((*item)->m_dataset)
|
||||||
{
|
{
|
||||||
|
// (*item)->m_dataset->print(std::cout);
|
||||||
PatientInformationPointer patient = PatientInformationPointer(new PatientInformation());
|
PatientInformationPointer patient = PatientInformationPointer(new PatientInformation());
|
||||||
OFString ID;
|
OFString ID;
|
||||||
OFString Name;
|
OFString Name;
|
||||||
OFString BirthDate;
|
OFString BirthDate;
|
||||||
OFString Sex;
|
OFString Sex;
|
||||||
OFString AccessionNumber;
|
OFString AccessionNumber;
|
||||||
|
OFString studyInstanceUID;
|
||||||
|
OFString modality;
|
||||||
|
|
||||||
OFString scheduledStartDateStr;
|
OFString scheduledStartDateStr;
|
||||||
|
OFString scheduledProcedureStepID;
|
||||||
|
OFString requestedProcedureID;
|
||||||
|
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_PatientID, ID);
|
(*item)->m_dataset->findAndGetOFString(DCM_PatientID, ID);
|
||||||
|
|
||||||
if (ID.empty())
|
if (ID.empty())
|
||||||
{
|
{
|
||||||
return QList<PatientInformationPointer>();
|
continue;
|
||||||
}
|
}
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_PatientName, Name);
|
(*item)->m_dataset->findAndGetOFString(DCM_PatientName, Name);
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_PatientBirthDate, BirthDate);
|
(*item)->m_dataset->findAndGetOFString(DCM_PatientBirthDate, BirthDate);
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_PatientSex, Sex);
|
(*item)->m_dataset->findAndGetOFString(DCM_PatientSex, Sex);
|
||||||
|
|
||||||
|
if ((*item)->m_dataset->findAndGetOFString(DCM_StudyInstanceUID, studyInstanceUID).bad())
|
||||||
|
{
|
||||||
|
char uid[100];
|
||||||
|
dcmGenerateUniqueIdentifier(uid, SITE_STUDY_UID_ROOT);
|
||||||
|
studyInstanceUID = uid;
|
||||||
|
}
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_AccessionNumber, AccessionNumber);
|
(*item)->m_dataset->findAndGetOFString(DCM_AccessionNumber, AccessionNumber);
|
||||||
(*item)->m_dataset->findAndGetOFString(DCM_ScheduledProcedureStepStartDate, scheduledStartDateStr);
|
(*item)->m_dataset->findAndGetOFString(DCM_RequestedProcedureID, requestedProcedureID);
|
||||||
//(*item)->m_dataset->print(std::cerr);
|
|
||||||
|
DcmItem *seqItem = nullptr;
|
||||||
|
(*item)->m_dataset->findAndGetSequenceItem(DCM_ScheduledProcedureStepSequence, seqItem);
|
||||||
|
seqItem->findAndGetOFString(DCM_Modality, modality);
|
||||||
|
seqItem->findAndGetOFString(DCM_ScheduledProcedureStepStartDate, scheduledStartDateStr);
|
||||||
|
|
||||||
|
seqItem->findAndGetOFString(DCM_ScheduledProcedureStepID, scheduledProcedureStepID);
|
||||||
|
|
||||||
patient->ID = QString(ID.c_str());
|
patient->ID = QString(ID.c_str());
|
||||||
patient->Name = QString(Name.c_str());
|
patient->Name = QString(Name.c_str());
|
||||||
patient->BirthDate = QString(BirthDate.c_str()).insert(4,"-").insert(7,"-");
|
patient->BirthDate = QString(BirthDate.c_str()).insert(4, "-").insert(7, "-");
|
||||||
patient->Sex = QString(Sex.c_str());
|
patient->Sex = QString(Sex.c_str());
|
||||||
patient->AccessionNumber = QString(AccessionNumber.c_str());
|
patient->AccessionNumber = QString(AccessionNumber.c_str());
|
||||||
patient->ScheduledStartDate = QString(scheduledStartDateStr.c_str());
|
patient->ScheduledStartDate = QString(scheduledStartDateStr.c_str());
|
||||||
result.push_back(patient);
|
patient->StudyUID = QString(studyInstanceUID.c_str());
|
||||||
|
patient->Modality = QString(modality.c_str());
|
||||||
|
patient->SPSID = QString(scheduledProcedureStepID.c_str());
|
||||||
|
patient->RPID = QString(requestedProcedureID.c_str());
|
||||||
|
// {
|
||||||
|
// char uid[100];
|
||||||
|
// dcmGenerateUniqueIdentifier(uid);
|
||||||
|
// patient->MPPSUID = uid;
|
||||||
|
// }
|
||||||
|
aOutPatient.push_back(patient);
|
||||||
|
}
|
||||||
|
|
||||||
|
else{
|
||||||
|
if ((*item)->m_status== STATUS_Success)continue;
|
||||||
|
OFString statusString;
|
||||||
|
const char *statusStringPtr = DU_ncreateStatusString((*item)->m_status);
|
||||||
|
statusString.append(statusStringPtr);
|
||||||
|
if (statusStringPtr != NULL)
|
||||||
|
{
|
||||||
|
// 输出错误消息
|
||||||
|
qDebug() << "Worklist find fail, response status:" << statusString.data();
|
||||||
|
result = ResponseError;
|
||||||
|
if((*item)->m_statusDetail)(*item)->m_statusDetail->print(std::cout);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
OFListIterator(QRResponse*) iter = responses.begin();
|
OFListIterator(QRResponse *) iter = responses.begin();
|
||||||
OFListConstIterator(QRResponse*) last = responses.end();
|
OFListConstIterator(QRResponse *) last = responses.end();
|
||||||
while (iter != last)
|
while (iter != last)
|
||||||
{
|
{
|
||||||
delete (*iter);
|
delete (*iter);
|
||||||
iter = responses.erase(iter);
|
iter = responses.erase(iter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
return QList<PatientInformationPointer>();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cond == EC_Normal)
|
if (cond == EC_Normal)
|
||||||
{
|
{
|
||||||
@@ -183,7 +254,6 @@ QList<PatientInformationPointer> WorkListManager::getPatientFromWorkList(const Q
|
|||||||
{
|
{
|
||||||
scu.abortAssociation();
|
scu.abortAssociation();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,19 @@
|
|||||||
class QSqlTableModel;
|
class QSqlTableModel;
|
||||||
class QTableView;
|
class QTableView;
|
||||||
|
|
||||||
|
enum WorklistQueryResult{
|
||||||
|
InitNetWorkError,
|
||||||
|
ConnectError,
|
||||||
|
ContextError,
|
||||||
|
ResponseError,
|
||||||
|
Success
|
||||||
|
};
|
||||||
|
|
||||||
class WorkListManager
|
class WorkListManager
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static WorkListManager* getInstance();
|
static WorkListManager* getInstance();
|
||||||
static QList<PatientInformationPointer> getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId);
|
static int getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId, QList<PatientInformationPointer>& aOutPatients);
|
||||||
|
|
||||||
void setTableModel(QSqlTableModel* aModel);
|
void setTableModel(QSqlTableModel* aModel);
|
||||||
void setTableView(QTableView* aTableView);
|
void setTableView(QTableView* aTableView);
|
||||||
@@ -22,7 +30,6 @@ public:
|
|||||||
QSqlTableModel* getTableModel();
|
QSqlTableModel* getTableModel();
|
||||||
QTableView* getTableView();
|
QTableView* getTableView();
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
WorkListManager();
|
WorkListManager();
|
||||||
~WorkListManager();
|
~WorkListManager();
|
||||||
|
|||||||
Reference in New Issue
Block a user