logplus/ModuleConsole/command/src/SubmitWorkflowCmd.cpp
2026-01-16 17:18:41 +08:00

185 lines
6.1 KiB
C++

/*
* SubmitWorkflowCmd.cpp
*
* Created on: 2012-10-19
* Author: shenpenglin
*/
#include <QApplication>
#include <QtDebug>
#include "SubmitWorkflowCmd.h"
#include "PAIConst.h"
#include "error.h"
#include "Log.h"
#include "Utils.h"
#include "ConsoleGUIService.h"
#include "SaveHelper.h"
#include "PaiWorkflowDataModel.h"
#include "PaiProject.h"
#include "PaiWorkflowSubmitter.h"
#include "SaveWorkflowCmd.h"
#include "PaiSurvey.h"
#include "PaiJobMaster.h"
#include "WorkflowConst.h"
#include "TimeStampLogger.h"
#include "WorkflowWidget.h"
#include "SubmitWorkflowDialog.h"
#include "WorkFlowFile.h"
using namespace pai::gui;
using namespace pai::objectmodel;
namespace pai
{
SubmitWorkflowCmd::SubmitWorkflowCmd(QObject *invoker, PaiObject* actionSender,QUuid viewID,
pai::objectmodel::PaiWorkflowDataModel *pActiveWorkflow, QUndoCommand *parent) :
QUndoCommand(parent),
m_pCmdInvoker(invoker),
m_pActionSender(actionSender),
m_ViewID(viewID),
m_pActiveWorkflow(pActiveWorkflow)
{
}
SubmitWorkflowCmd::~SubmitWorkflowCmd()
{
}
void SubmitWorkflowCmd::undo()
{
}
void SubmitWorkflowCmd::redo()
{
SubmitWorkflowHelper();
}
void SubmitWorkflowCmd::SubmitWorkflowHelper()
{
PaiWorkflowDataModel* pWorkflow = m_pActiveWorkflow;
PaiWorkflowDataModel* pTreeWorkflow = dynamic_cast<PaiWorkflowDataModel*> (m_pActionSender);
if (pTreeWorkflow != NULL)
{
pWorkflow = pTreeWorkflow;
}
if (NULL == pWorkflow)
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
return;
}
//如果工作流未保存
if (pWorkflow->HasDataModified())
{
if (PaiMessageBox::Cancel == PaiMessageBox::Information(NULL,
"π-Frame Workflow", QObject::tr("Please save the modification for workflow ") + pWorkflow->GetName()
+ " before submitting!", PaiMessageBox::Ok | PaiMessageBox::Cancel, PaiMessageBox::Ok))
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
return;
}
SaveWorkflowCmd saveWorkflowCmd(m_ViewID,m_pActiveWorkflow);
saveWorkflowCmd.redo();
if (saveWorkflowCmd.GetSaveResult() == false)
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
return;
}
pWorkflow = m_pActiveWorkflow; // Need to get active workflow after save
}
//获取数据树上对应的工作流
PaiObject *pDataTreeWorkflow = GetObjectModelService()->GetObject(pWorkflow->GetDBID());
if(!pDataTreeWorkflow)
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
return;
}
//获取工作流所在的项目
PaiProject *pProject = pDataTreeWorkflow->GetForebear<PaiProject> ();
if(!pProject)
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
return;
}
bool bShouldPromptDialog = true;
pai::ios::job::JobPriority priority;
QString queueName = "";
QString strNewJobName = pWorkflow->GetName();
while(bShouldPromptDialog)
{
if (GetSubmitInformation( pProject->GetDBID(), strNewJobName, priority, queueName))
{
if (!strNewJobName.isEmpty())
{
//重新设置workflowfile队列名称
if(pWorkflow->GetWorkflowFile())
{
pWorkflow->GetWorkflowFile()->SetQueueName(queueName.toStdString());
}
//重名处理
strNewJobName = QString::fromStdString(
pWorkflow->GetWorkflowPtr()->GetJobNameToGUI(strNewJobName.toStdString()));
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
//建立提交状态通知
QObject::connect(pWorkflow->GetSubmitter(), SIGNAL(SubmitSuccessFinished(pai::objectmodel::PaiWorkflowDataModel*, const QString&)), m_pCmdInvoker,
SLOT(slotOnJobSubmitFinished(pai::objectmodel::PaiWorkflowDataModel*, const QString&)), Qt::UniqueConnection);
QObject::connect(pWorkflow->GetSubmitter(), SIGNAL(SubmitErrorMsg(QString)), m_pCmdInvoker,
SLOT(ShowMsg(QString)), Qt::UniqueConnection);
//状态栏提示正在提交中。。。
GetConsoleGUIService()->GetStatusBarService()->BeginProcessMessage(strNewJobName + " is submitting...");
QApplication::processEvents();
//记录用户输入的用户名
pWorkflow->GetSubmitter()->SetNewJobName(strNewJobName);
//作业提交的优先级
pWorkflow->GetSubmitter()->SetJobPriority(priority);
//作业提交到的队列
pWorkflow->GetSubmitter()->SetQueueName(queueName);
//真正提交作业
pWorkflow->Submit();
// 刷新JobMaster
PaiSurvey *pSurvey = SaveHelper::GetSurveyByWfDBID(pWorkflow->GetDBID());
if(pSurvey)
{
PaiBaseMaster *pJobMaster = pSurvey->GetMaster(PaiJobMaster::GetTypeIDString());
if(pJobMaster)
{
GetObjectModelService()->SyncDB(pJobMaster->GetDBID(), pai::Force | pai::Children);
}
}
}
else
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
QString strMessage = "Submit failed for a empty job name.";
PaiMessageBox::Warning(NULL, PAI_NAME, strMessage);
pai::log::Error(_FLF(QObject::tr("QUndoCommand::ShowMessage ").toStdString()+strMessage.toStdString()));
}
}
else
{
GetConsoleGUIService()->GetStatusBarService()->EndProcessMessage("");
}
bShouldPromptDialog = false;
}
}
bool SubmitWorkflowCmd::GetSubmitInformation(long long projectID, QString& jobName, pai::ios::job::JobPriority& priority, QString& queueName)
{
return true;
}
}