Files
GUI/src/dicom/MPPSAsyncAction.cpp
2024-06-06 13:35:48 +08:00

180 lines
6.5 KiB
C++

#include "MPPSAsyncAction.h"
#include <QDebug>
#include <dcmtk/dcmnet/scu.h>
#include <dcmtk/dcmdata/dcpath.h>
#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmdata/dcdict.h>
#include <dcmtk/dcmnet/diutil.h>
#include <QDateTime>
#include "json/jsonobject.h"
#include "MPPSSCU.h"
MPPSAsyncAction::MPPSAsyncAction(QObject* aParent):AsyncAction(aParent)
{
}
MPPSAsyncAction::~MPPSAsyncAction()
{
}
void MPPSAsyncAction::run()
{
if (mPatient.isNull()||mPatient->PatientUID.isEmpty() || !mPatient->MPPSUID.isEmpty())return;
if (!dcmDataDict.isDictionaryLoaded())
{
qDebug() << "dcmdatadict error";
emit actionCompleted(ActionResult(Failed,tr("MPPS fail by dcmdatadict error!")));
return;
}
MPPSSCU scu;
host serverInfo = JsonObject::Instance()->getServer(JsonObject::MPPS);
/*scu*/
OFList<OFString> syntaxes;
syntaxes.push_back(UID_LittleEndianImplicitTransferSyntax);
scu.setMaxReceivePDULength(ASC_DEFAULTMAXPDU);
scu.setACSETimeout(30);
scu.setDIMSEBlockingMode(DIMSE_BLOCKING);
scu.setDIMSETimeout(0);
scu.setAETitle(serverInfo.localAE.toLatin1().data());
scu.setPeerHostName(serverInfo.ip.toLatin1().data());
scu.setPeerPort(OFstatic_cast(Uint16, serverInfo.port.toInt()));
scu.setPeerAETitle(serverInfo.ae.toLatin1().data());
scu.setVerbosePCMode(OFFalse);
scu.addPresentationContext(UID_ModalityPerformedProcedureStepSOPClass, syntaxes);
OFCondition cond = scu.initNetwork();
if (cond.bad())
{
qDebug() << cond.code() << cond.text();
qDebug() << "MPPS initNetwork failed";
emit actionCompleted(ActionResult(Failed,tr("MPPS initNetwork failed!")));
return;
}
cond = scu.negotiateAssociation();
if (cond.bad())
{
qDebug() << cond.code(); //<< "----"<<cond.text();
qDebug() << "MPPS connect failed";
emit actionCompleted(ActionResult(Failed,tr("MPPS connect failed!")));
return;
}
cond = EC_Normal;
T_ASC_PresentationContextID pcid = scu.findPresentationContextID(UID_ModalityPerformedProcedureStepSOPClass, "");
if (pcid == 0)
{
qDebug() << "MPPS pcid bad";
emit actionCompleted(ActionResult(Failed,tr("MPPS context error!")));
return;
}
DcmFileFormat dcmff;
DcmDataset *dset = dcmff.getDataset();
DcmSequenceOfItems *attr_Seq = new DcmSequenceOfItems(DCM_ScheduledStepAttributesSequence);
DcmItem *attr_item = new DcmItem();
attr_item->putAndInsertString(DCM_StudyInstanceUID, mPatient->StudyUID.toStdString().data());
DcmSequenceOfItems *refSeq = new DcmSequenceOfItems(DCM_ReferencedStudySequence);
attr_item->insert(refSeq);
attr_item->putAndInsertString(DCM_AccessionNumber, mPatient->AccessionNumber.toStdString().data());
attr_item->putAndInsertString(DCM_RequestedProcedureID, mPatient->RPID.toStdString().data());
attr_item->putAndInsertString(DCM_ScheduledProcedureStepID, mPatient->SPSID.toStdString().data());
DcmSequenceOfItems *protocolSeq = new DcmSequenceOfItems(DCM_ScheduledProtocolCodeSequence);
attr_item->insert(protocolSeq);
attr_Seq->insert(attr_item);
dset->insert(attr_Seq);
DcmSequenceOfItems *codeSeq = new DcmSequenceOfItems(DCM_ProcedureCodeSequence);
dset->insert(codeSeq);
dset->putAndInsertString(DCM_PatientName, mPatient->Name.toStdString().data());
dset->putAndInsertString(DCM_PatientID, mPatient->ID.toStdString().data());
dset->putAndInsertString(DCM_PatientBirthDate, mPatient->BirthDate.toStdString().data());
dset->putAndInsertString(DCM_PatientSex, mPatient->Sex.toStdString().data());
DcmSequenceOfItems *refPSeq = new DcmSequenceOfItems(DCM_ReferencedPatientSequence);
dset->insert(refPSeq);
dset->putAndInsertString(DCM_PerformedProcedureStepID, QDateTime::currentDateTime().toString("yyyyMMddHHmmss").toStdString().data());
dset->putAndInsertString(DCM_PerformedStationAETitle, serverInfo.localAE.toStdString().data());
dset->putAndInsertString(DCM_PerformedStationName, "");
dset->putAndInsertString(DCM_PerformedLocation, "");
dset->putAndInsertString(DCM_PerformedProcedureStepStartDate,
QDateTime::currentDateTime().toString("yyyyMMdd").toStdString().data());
dset->putAndInsertString(DCM_PerformedProcedureStepStartTime,
QDateTime::currentDateTime().toString("hhmmss").toStdString().data());
// set status
dset->putAndInsertString(DCM_PerformedProcedureStepStatus, "IN PROGRESS");
dset->putAndInsertString(DCM_PerformedProcedureStepDescription, "");
dset->putAndInsertString(DCM_PerformedProcedureTypeDescription, "");
dset->putAndInsertString(DCM_PerformedProcedureStepEndDate, "");
dset->putAndInsertString(DCM_PerformedProcedureStepEndTime, "");
// get modality from MWL query resault
dset->putAndInsertString(DCM_Modality, mPatient->Modality.toStdString().data());
dset->putAndInsertString(DCM_StudyID, "");
DcmSequenceOfItems *refpPSeq = new DcmSequenceOfItems(DCM_PerformedProtocolCodeSequence);
dset->insert(refpPSeq);
// dset->print(std::cout);
Uint16 responses = 0;
OFString uid;
{
char uidbuff[100];
dcmGenerateUniqueIdentifier(uidbuff);
uid.append(uidbuff);
mPatient->MPPSUID = uidbuff;
}
cond = scu.sendNCreateRequest(pcid, uid, dset, responses);
bool result = true;
if (responses != 0)
{
OFString statusString;
const char *statusStringPtr = DU_ncreateStatusString(responses);
statusString.append(tr("MPPS fail by error:").toStdString().data());
statusString.append(statusStringPtr);
if (statusStringPtr != NULL)
{
// 输出错误消息
qDebug() << "Error Message: " << statusString.data() ;
}
emit actionCompleted(ActionResult(Failed,statusString.data()));
return;
}
if (cond == EC_Normal)
{
scu.releaseAssociation();
}
else
{
if (cond == DUL_PEERREQUESTEDRELEASE)
scu.closeAssociation(DCMSCU_PEER_REQUESTED_RELEASE);
else if (cond == DUL_PEERABORTEDASSOCIATION)
scu.closeAssociation(DCMSCU_PEER_ABORTED_ASSOCIATION);
else
{
scu.abortAssociation();
}
}
emit actionCompleted(ActionResult(Sucessed,QString("%0|%1").arg(mPatient->PatientUID).arg(mPatient->MPPSUID)));
return;
}
void MPPSAsyncAction::setPatient(PatientInformationPointer aPatient)
{
mPatient = aPatient;
}
PatientInformationPointer MPPSAsyncAction::getPatient()
{
return mPatient;
}