diff --git a/src/dialogs/GetWorkListDialog.cpp b/src/dialogs/GetWorkListDialog.cpp index 09eaa86..148d3a3 100644 --- a/src/dialogs/GetWorkListDialog.cpp +++ b/src/dialogs/GetWorkListDialog.cpp @@ -257,6 +257,7 @@ void GetWorkListDialog::insertPatient(PatientInformationPointer aPatient) mSqlModel->data(mSqlModel->index(i, accessionNumberIndex)) == aPatient->AccessionNumber) { mTableView->selectRow(i); + aPatient->PatientUID = mSqlModel->data(mSqlModel->index(i, 0)).toString(); EventCenter::Default()->triggerEvent(PatientSelected, nullptr, (QObject*)(aPatient.data())); return; } @@ -269,7 +270,7 @@ void GetWorkListDialog::insertPatient(PatientInformationPointer aPatient) mSqlModel->insertRow(0); #define ADD_PATIENT_PROPERTY(val)\ mSqlModel->setData(mSqlModel->index(0, PatientInformationEnum:: val),aPatient->val); - EDIT_PATIENT() + ADD_PATIENT() #undef ADD_PATIENT_PROPERTY if (!mSqlModel->submitAll()) { diff --git a/src/dicom/WorkListManager.cpp b/src/dicom/WorkListManager.cpp index 1d60411..e606be0 100644 --- a/src/dicom/WorkListManager.cpp +++ b/src/dicom/WorkListManager.cpp @@ -2,38 +2,42 @@ #include #include +#include +#include +#include + #include "json/jsonobject.h" #include #include -WorkListManager* WorkListManager::getInstance() +WorkListManager *WorkListManager::getInstance() { static WorkListManager instance; return &instance; } -void WorkListManager::setTableModel(QSqlTableModel* aModel) +void WorkListManager::setTableModel(QSqlTableModel *aModel) { mTableModel = aModel; } -void WorkListManager::setTableView(QTableView* aTableView) +void WorkListManager::setTableView(QTableView *aTableView) { mTableView = aTableView; } -QSqlTableModel* WorkListManager::getTableModel() +QSqlTableModel *WorkListManager::getTableModel() { return mTableModel; } -QTableView* WorkListManager::getTableView() +QTableView *WorkListManager::getTableView() { return mTableView; } -void WorkListManager::setSearchString(const QString& aSearchString) +void WorkListManager::setSearchString(const QString &aSearchString) { mSearchString += aSearchString; } @@ -47,30 +51,25 @@ QString WorkListManager::getSearchString() WorkListManager::WorkListManager() { + } WorkListManager::~WorkListManager() { } -QList WorkListManager::getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId) +int WorkListManager::getPatientFromWorkList(const QString &aAccessionNum, const QString &aPatientId, QList& aOutPatient) { + if (!dcmDataDict.isDictionaryLoaded()) + { + qDebug() << "dcmdatadict error"; + } + DcmSCU scu; - OFString temp_str; host serverInfo = JsonObject::Instance()->getServer(JsonObject::WORKLIST); QByteArray ip = serverInfo.ip.toLatin1(); QByteArray aeTitle = serverInfo.ae.toLatin1(); - OFList 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*/ OFList syntaxes; syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax); @@ -78,97 +77,169 @@ QList WorkListManager::getPatientFromWorkList(const Q scu.setACSETimeout(30); scu.setDIMSEBlockingMode(DIMSE_BLOCKING); scu.setDIMSETimeout(0); - scu.setAETitle(serverInfo.name.toLatin1().data()); + scu.setAETitle(serverInfo.localAE.toLatin1().data()); scu.setPeerHostName(ip.data()); scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt())); scu.setPeerAETitle(aeTitle.data()); scu.setVerbosePCMode(OFFalse); - scu.addPresentationContext(UID_FINDModalityWorklistInformationModel, syntaxes);//UID_FINDStudyRootQueryRetrieveInformationModel + scu.addPresentationContext(UID_FINDModalityWorklistInformationModel, syntaxes); // UID_FINDStudyRootQueryRetrieveInformationModel OFCondition cond = scu.initNetwork(); - if(cond.bad()) + if (cond.bad()) { - qDebug()<(); + qDebug() << cond.code() << cond.text(); + qDebug() << "worklist initNetwork failed"; + return InitNetWorkError; } cond = scu.negotiateAssociation(); - if(cond.bad()) + if (cond.bad()) { - qDebug()<(); + qDebug() << cond.code()<< "----"<(); + qDebug() << "worklist pcid bad"; + return ContextError; } DcmFileFormat dcmff; DcmDataset *dset = dcmff.getDataset(); - OFList responses; - DcmPathProcessor proc; - proc.setItemWildcardSupport(OFFalse); - proc.checkPrivateReservations(OFFalse); - - for(auto &item:overrideKeys) + if (!aPatientId.isEmpty()) { - proc.applyPathWithValue(dset, item); + dset->putAndInsertString(DCM_PatientID, aPatientId.toStdString().data()); } - QList 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 responses; + cond = scu.sendFINDRequest(pcid, dset, &responses); + int result = Success; if (responses.size() > 1) { - for(auto item = responses.begin(); item != responses.end(); ++item) + qDebug()<<"cfind Response size:"<m_dataset) { + // (*item)->m_dataset->print(std::cout); PatientInformationPointer patient = PatientInformationPointer(new PatientInformation()); OFString ID; OFString Name; OFString BirthDate; OFString Sex; OFString AccessionNumber; + OFString studyInstanceUID; + OFString modality; + OFString scheduledStartDateStr; + OFString scheduledProcedureStepID; + OFString requestedProcedureID; + (*item)->m_dataset->findAndGetOFString(DCM_PatientID, ID); if (ID.empty()) { - return QList(); + continue; } (*item)->m_dataset->findAndGetOFString(DCM_PatientName, Name); (*item)->m_dataset->findAndGetOFString(DCM_PatientBirthDate, BirthDate); (*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_ScheduledProcedureStepStartDate, scheduledStartDateStr); - //(*item)->m_dataset->print(std::cerr); + (*item)->m_dataset->findAndGetOFString(DCM_RequestedProcedureID, requestedProcedureID); + + 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->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->AccessionNumber = QString(AccessionNumber.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(); - OFListConstIterator(QRResponse*) last = responses.end(); + OFListIterator(QRResponse *) iter = responses.begin(); + OFListConstIterator(QRResponse *) last = responses.end(); while (iter != last) { delete (*iter); iter = responses.erase(iter); } } - else - { - return QList(); - } - + if (cond == EC_Normal) { scu.releaseAssociation(); @@ -183,7 +254,6 @@ QList WorkListManager::getPatientFromWorkList(const Q { scu.abortAssociation(); } - } return result; } diff --git a/src/dicom/WorkListManager.h b/src/dicom/WorkListManager.h index ef65f22..ef2f115 100644 --- a/src/dicom/WorkListManager.h +++ b/src/dicom/WorkListManager.h @@ -9,11 +9,19 @@ class QSqlTableModel; class QTableView; +enum WorklistQueryResult{ + InitNetWorkError, + ConnectError, + ContextError, + ResponseError, + Success +}; + class WorkListManager { public: static WorkListManager* getInstance(); - static QList getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId); + static int getPatientFromWorkList(const QString& aAccessionNum, const QString& aPatientId, QList& aOutPatients); void setTableModel(QSqlTableModel* aModel); void setTableView(QTableView* aTableView); @@ -22,7 +30,6 @@ public: QSqlTableModel* getTableModel(); QTableView* getTableView(); - private: WorkListManager(); ~WorkListManager();