289 lines
7.5 KiB
C++
289 lines
7.5 KiB
C++
|
|
#include "boost/thread.hpp"
|
|||
|
|
#include "pub_utility_api/TimeUtil.h"
|
|||
|
|
#include "boost/format.hpp"
|
|||
|
|
|
|||
|
|
#include "pub_logger_api/logger.h"
|
|||
|
|
#include "pub_utility_api/I18N.h"
|
|||
|
|
|
|||
|
|
#include "CMethodAction.h"
|
|||
|
|
#include "CNodeAction.h"
|
|||
|
|
#include "CNodeFunc.h"
|
|||
|
|
#include "CNodeSeq.h"
|
|||
|
|
#include "CMbCommunicateInfo.h"
|
|||
|
|
#include "CModuleDbAccessMngr.h"
|
|||
|
|
#include "CModuleAlarmCreater.h"
|
|||
|
|
|
|||
|
|
#include "CDbSaveCtrl.h"
|
|||
|
|
#include "CRecoverNode.h"
|
|||
|
|
|
|||
|
|
CMethodAction::CMethodAction(CNodeAction& action)
|
|||
|
|
: m_objAction(action),
|
|||
|
|
m_ptrFailedPro(NULL),
|
|||
|
|
m_nStartTime(0),
|
|||
|
|
m_nStopTime(0)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CMethodAction::~CMethodAction()
|
|||
|
|
{
|
|||
|
|
if (m_ptrFailedPro)
|
|||
|
|
{
|
|||
|
|
delete m_ptrFailedPro;
|
|||
|
|
m_ptrFailedPro = NULL;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::execute()
|
|||
|
|
{
|
|||
|
|
LOGINFO("动作: [%s]-[%s]-[%s] 开始执行!",
|
|||
|
|
m_objAction.getNodeSeq().description().c_str(),
|
|||
|
|
m_objAction.getNodeFunc().description().c_str(),
|
|||
|
|
m_objAction.description().c_str());
|
|||
|
|
|
|||
|
|
m_nStartTime = kbd_public::getUTCTimeSec();
|
|||
|
|
|
|||
|
|
//初始化节点状态
|
|||
|
|
m_objAction.resetBeginStart();
|
|||
|
|
|
|||
|
|
//开始执行
|
|||
|
|
bool bRet = startExecuteNode();
|
|||
|
|
|
|||
|
|
m_nStopTime = kbd_public::getUTCTimeSec();
|
|||
|
|
|
|||
|
|
updateActionEvent();//一个动作结束后 才记录
|
|||
|
|
alarmEvent();
|
|||
|
|
|
|||
|
|
LOGINFO("动作: [%s]-[%s]-[%s] 结束执行 状态[%s]!",
|
|||
|
|
m_objAction.getNodeSeq().description().c_str(),
|
|||
|
|
m_objAction.getNodeFunc().description().c_str(),
|
|||
|
|
m_objAction.description().c_str(),
|
|||
|
|
(bRet ? ("成功") : ("失败")));
|
|||
|
|
|
|||
|
|
return bRet;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::startExecuteNode()
|
|||
|
|
{
|
|||
|
|
//变更状态为 正在执行
|
|||
|
|
changeStateToStart();
|
|||
|
|
|
|||
|
|
//发送动作执行指令
|
|||
|
|
bool bRet = sendMessageToOpt();
|
|||
|
|
if (!bRet)
|
|||
|
|
{
|
|||
|
|
//失败,发送指令属于链路出错,不走重试流程, 变更状态为 执行失败
|
|||
|
|
changeStateToFailed(
|
|||
|
|
SActionErrorInfo(enumCode_ERRO_ACTION_SEND_FAILED,
|
|||
|
|
I18N("发送操作指令错误!")));
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//处理执行结果
|
|||
|
|
bRet = executeResult(m_objAction.ctrlTimeOut());
|
|||
|
|
|
|||
|
|
m_objAction.resetOptResult("");
|
|||
|
|
|
|||
|
|
return bRet;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//执行结果 一定要在 一定时间内返回,如果没有执行结果,那么就按超时处理
|
|||
|
|
bool CMethodAction::executeResult(uint64 nWaitTime)
|
|||
|
|
{
|
|||
|
|
SOptResult result
|
|||
|
|
= m_objAction.getOptResult(nWaitTime);
|
|||
|
|
|
|||
|
|
//成功
|
|||
|
|
if (result.resultCode == OPT_RESPONSE_TYPE_SUCCESS)
|
|||
|
|
{
|
|||
|
|
return doSuccessPro();
|
|||
|
|
}
|
|||
|
|
//失败
|
|||
|
|
else if (result.resultCode == OPT_RESPONSE_TYPE_FAILED)
|
|||
|
|
{
|
|||
|
|
//std::string desc = result.resultDesc;
|
|||
|
|
return doFailedPro(
|
|||
|
|
SActionErrorInfo(
|
|||
|
|
enumCode_ERRO_ACTION_OPT_FAILED,
|
|||
|
|
result.resultDesc));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return doResultTimeOutPro(nWaitTime);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//超时也是属于执行失败
|
|||
|
|
bool CMethodAction::doResultTimeOutPro(
|
|||
|
|
uint64 timeOut)
|
|||
|
|
{
|
|||
|
|
boost::format formater(I18N("动作执行超时 超时时间:[%d]s"));
|
|||
|
|
std::string desc = (
|
|||
|
|
formater
|
|||
|
|
% timeOut
|
|||
|
|
).str();
|
|||
|
|
|
|||
|
|
LOGINFO(desc.c_str());
|
|||
|
|
|
|||
|
|
return doFailedPro(SActionErrorInfo(
|
|||
|
|
enumCode_ERRO_ACTION_TIMEOUT,
|
|||
|
|
desc));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::doSuccessPro()
|
|||
|
|
{
|
|||
|
|
changeStateToSuccess();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//重试
|
|||
|
|
bool CMethodAction::doFailedPro(const SActionErrorInfo& erroInfo)
|
|||
|
|
{
|
|||
|
|
//如果没有创建失败 流程 那就先创建
|
|||
|
|
if (!m_ptrFailedPro)
|
|||
|
|
{
|
|||
|
|
m_ptrFailedPro = new CMethodFailedAction(*this, m_objAction);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return m_ptrFailedPro->doFailedPro(erroInfo);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::sendMessageToOpt()
|
|||
|
|
{
|
|||
|
|
CMbCommunicateInfo& mb
|
|||
|
|
= m_objAction.getNodeSeq().getMbCmmInfo();
|
|||
|
|
|
|||
|
|
if (mb.sendActionToOpt(m_objAction))
|
|||
|
|
{
|
|||
|
|
m_objAction.resetOptResult(m_objAction.keyIdTag());
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::changeStateToStart()
|
|||
|
|
{
|
|||
|
|
m_objAction.updateState(SEQ_RUNNING_STATUS);
|
|||
|
|
updateSeqRunning(false);
|
|||
|
|
notifyStateToHmi();
|
|||
|
|
m_strDescribe = "";
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::changeStateToStop(const SActionErrorInfo& erroInfo)
|
|||
|
|
{
|
|||
|
|
m_objAction.updateState(SEQ_STOP_STATUS);
|
|||
|
|
updateSeqRunning();
|
|||
|
|
notifyStateToHmi(erroInfo);
|
|||
|
|
m_strDescribe = (erroInfo.erroStr);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::changeStateToFailed(const SActionErrorInfo& erroInfo)
|
|||
|
|
{
|
|||
|
|
m_objAction.updateState(SEQ_FAILED_STATUS);
|
|||
|
|
updateSeqRunning();
|
|||
|
|
notifyStateToHmi(erroInfo);
|
|||
|
|
m_strDescribe = (erroInfo.erroStr);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::changeStateToSkip(const SActionErrorInfo& erroInfo)
|
|||
|
|
{
|
|||
|
|
m_objAction.updateState(SEQ_SKIP_STATUS);
|
|||
|
|
updateSeqRunning();
|
|||
|
|
notifyStateToHmi(erroInfo);
|
|||
|
|
m_strDescribe = (erroInfo.erroStr);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::changeStateToSuccess()
|
|||
|
|
{
|
|||
|
|
m_objAction.updateState(SEQ_SUCCESS_STATUS);
|
|||
|
|
updateSeqRunning();
|
|||
|
|
notifyStateToHmi();
|
|||
|
|
m_strDescribe = I18N("执行成功");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::notifyStateToHmi()
|
|||
|
|
{
|
|||
|
|
CMbCommunicateInfo& mb
|
|||
|
|
= m_objAction.getNodeSeq().getMbCmmInfo();
|
|||
|
|
|
|||
|
|
mb.nodeStatusToHmi(m_objAction);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CMethodAction::notifyStateToHmi(
|
|||
|
|
const SActionErrorInfo& erroInfo)
|
|||
|
|
{
|
|||
|
|
CMbCommunicateInfo& mb
|
|||
|
|
= m_objAction.getNodeSeq().getMbCmmInfo();
|
|||
|
|
|
|||
|
|
mb.nodeStatusToHmi(m_objAction, erroInfo);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::updateSeqRunning(bool onlyState)
|
|||
|
|
{
|
|||
|
|
SSeqCtrlRunning info;
|
|||
|
|
memset(&info, 0, sizeof(info));
|
|||
|
|
CNodeSeq& seq = m_objAction.getNodeSeq();
|
|||
|
|
CNodeFunc& func = m_objAction.getNodeFunc();
|
|||
|
|
|
|||
|
|
SNodeSeqActor actor = seq.getSeqActor();
|
|||
|
|
|
|||
|
|
strcpy(info.seq_name, seq.nodeName().c_str());
|
|||
|
|
strcpy(info.func_name, func.nodeName().c_str());
|
|||
|
|
strcpy(info.action_name, m_objAction.nodeName().c_str());
|
|||
|
|
strcpy(info.node_desc, m_objAction.description().c_str());
|
|||
|
|
info.action_no = m_objAction.actionNo();
|
|||
|
|
info.func_no = func.funcNo();
|
|||
|
|
info.node_type = 2;
|
|||
|
|
info.status = m_objAction.getState();
|
|||
|
|
info.checked = m_objAction.checkStatus();
|
|||
|
|
info.start_time = m_nStartTime;
|
|||
|
|
info.user_id = actor.user_id;
|
|||
|
|
info.user_groupid = actor.user_grounp_id;
|
|||
|
|
strcpy(info.host_name, actor.host_name.c_str());
|
|||
|
|
strcpy(info.user_name, actor.user_name.c_str());
|
|||
|
|
info.timeflag = m_objAction.timeFlag();
|
|||
|
|
info.relation = func.relation();
|
|||
|
|
info.delay_time = m_objAction.delayTime();
|
|||
|
|
info.fail_strage = m_objAction.failStrage();
|
|||
|
|
info.isses = seq.isSecExe();
|
|||
|
|
strcpy(info.key_id_tag, m_objAction.keyIdTag().c_str());
|
|||
|
|
info.targetvalue = m_objAction.targetValue();
|
|||
|
|
info.location_id = m_objAction.locationId();
|
|||
|
|
info.seq_type = seq.seqType();
|
|||
|
|
|
|||
|
|
CModuleDbAccessMngr& access = seq.getDbAccess();
|
|||
|
|
return access.updateSeqRunningRecord(info, onlyState);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::alarmEvent()
|
|||
|
|
{
|
|||
|
|
CModuleAlarmCreater& obj = m_objAction.getNodeSeq().getAlarmCreater();
|
|||
|
|
return obj.actionExecute(m_objAction);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CMethodAction::updateActionEvent()
|
|||
|
|
{
|
|||
|
|
CDbSaveCtrl db;
|
|||
|
|
|
|||
|
|
CNodeSeq& seq = m_objAction.getNodeSeq();
|
|||
|
|
CNodeFunc& func = m_objAction.getNodeFunc();
|
|||
|
|
|
|||
|
|
SSeqCtrlActionEvent info;
|
|||
|
|
info.seq_name = seq.nodeName();
|
|||
|
|
info.time = seq.getStartTime();//执行时间
|
|||
|
|
BOOST_ASSERT(info.time != 0);
|
|||
|
|
info.func_name = func.nodeName();
|
|||
|
|
info.action_no = m_objAction.actionNo();
|
|||
|
|
info.action_name = m_objAction.nodeName();
|
|||
|
|
info.action_desc = m_objAction.description();
|
|||
|
|
info.status = CNode::getStateStr(m_objAction.getState());
|
|||
|
|
info.starttime = m_nStartTime;
|
|||
|
|
info.stoptime = m_nStopTime;
|
|||
|
|
info.key_id_tag = m_objAction.keyIdTag();
|
|||
|
|
info.targetvalue = m_objAction.targetValue();
|
|||
|
|
info.location_id = m_objAction.locationId();
|
|||
|
|
info.discribe = m_strDescribe;
|
|||
|
|
|
|||
|
|
bool bRet = db.updateActionEvent(info);
|
|||
|
|
return bRet;
|
|||
|
|
}
|