feat: Change Worklist reference class to suit MPPS

This commit is contained in:
chenhuijun
2024-06-06 13:37:12 +08:00
parent b864ccff71
commit 268d6f3f5c
3 changed files with 135 additions and 57 deletions

View File

@@ -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())
{ {

View File

@@ -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,97 +77,169 @@ 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)
{ {
scu.releaseAssociation(); scu.releaseAssociation();
@@ -183,7 +254,6 @@ QList<PatientInformationPointer> WorkListManager::getPatientFromWorkList(const Q
{ {
scu.abortAssociation(); scu.abortAssociation();
} }
} }
return result; return result;
} }

View File

@@ -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();