#include "StdAfx.h" #include "CellTimer.h" #include "IvrFlow.h" #include "FlowDataProvider.h" IMPLEMENT_CELL_AUTOCREATE(CCellTimer, CELL_NAME_TIMER) CCellTimer::CCellTimer(void) { m_NextPos = 0; m_Interval = 0; m_BeginTime = ""; m_EndTime = ""; } CCellTimer::CCellTimer( CCellTimer & cellTimer ) : CCellBase(cellTimer) { m_NextPos = cellTimer.m_NextPos; m_Interval = cellTimer.m_Interval; m_BeginTime = cellTimer.m_BeginTime; m_EndTime = cellTimer.m_EndTime; CreateEx(0, AfxRegisterWndClass(CS_GLOBALCLASS), "", 0, 0, 0, 0, 0, 0, 0); } CCellTimer::~CCellTimer(void) { DestroyWindow(); } BEGIN_MESSAGE_MAP(CCellTimer, CWnd) ON_WM_TIMER() END_MESSAGE_MAP() /***************************************************************** **【函数名称】 operate **【函数功能】 节点执行函数 **【参数】 **【返回值】 下一个节点编号 ****************************************************************/ int CCellTimer::operate( void ) { if(m_pIvrFlow == NULL) return CELL_OP_ERROR; CString Info; _getCellInfo(Info); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info); CTime CurTime = CTime::GetCurrentTime(); //BeginTime 摘机时间 YYYY-MM-DD HH:MM:SS CString strBeginTime = CurTime.Format("%Y-%m-%d %H:%M:%S"); m_pIvrFlow->addVar(SYSTEM_VAR_TIME_BEGIN, strBeginTime); //StartTime 摘机时间 yyyymmddhhmmss CString strStartTime = CurTime.Format("%Y%m%d%H%M%S") ; m_pIvrFlow->addVar(SYSTEM_VAR_TIME_START, strStartTime); //HourMinute 摘机时间 HH:MM CString strHoutMinute = CurTime.Format("%H%M"); m_pIvrFlow->addVar(SYSTEM_VAR_TIME_HM, strHoutMinute); //Week 摘机时是星期几 CString strWeek = CurTime.Format("%w"); m_pIvrFlow->addVar(SYSTEM_VAR_TIME_WEEK, strWeek); // 定时器启动 SetTimer((long)this, m_Interval * 1000, NULL); return CELL_OP_WAIT_FOR; } /***************************************************************** **【函数名称】 copy **【函数功能】 拷贝自身 **【参数】 **【返回值】 拷贝副本 ****************************************************************/ CCellBase * CCellTimer::copy( void ) { CCellBase *pCellBase = new CCellTimer(*this); return pCellBase; } /***************************************************************** **【函数名称】 fillData **【函数功能】 节点解析,填充数据 **【参数】 Provider:数据提供器 **【返回值】 成功true,失败false ****************************************************************/ bool CCellTimer::fillData( IFlowDataProvider& Provider ) { CString Data; do { if(!Provider.getData(CELL_ATTRIBUTE_POS, Data)) { Data = _T("节点号"); break; } else { sscanf_s(Data, _T("%d"), &m_Pos); if(m_Pos < 1) { Data = _T("节点号"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_TIMER_INTERVAL, Data)) { Data = _T("定时器间隔"); break; } else { sscanf_s(Data, _T("%d"), &m_Interval); if(m_Interval < 0) { Data = _T("定时器间隔"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_BEGIN_TIME, m_BeginTime)) { Data = _T("开始时间"); break; } if(!Provider.getData(CELL_ATTRIBUTE_END_TIME, m_EndTime)) { Data = _T("结束时间"); break; } if(!Provider.getData(CELL_ATTRIBUTE_NEXT, Data)) { Data = _T("跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_NextPos); if(m_NextPos < 1) { Data = _T("跳转节点"); break; } } Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note); return true; } while (false); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_TIMER, Data); return false; } /***************************************************************** **【函数名称】 OnTimer **【函数功能】 定时器处理 **【参数】 **【返回值】 ****************************************************************/ void CCellTimer::OnTimer( UINT_PTR nIDEvent ) { if(nIDEvent != reinterpret_cast(this)) return; // 关闭定时器 KillTimer(nIDEvent); CWnd::OnTimer(nIDEvent); // 判断当前时间是否在指定的时间区间 CTime tCurTime = CTime::GetCurrentTime(); CString strCurHM = tCurTime.Format("%H:%M"); int nBeginCompare = strCurHM.Compare(m_BeginTime ); int nEndCompare = strCurHM.Compare(m_EndTime); if(nBeginCompare < 0 || nEndCompare > 0) { // 不在时间区间,定时器重新启动 SetTimer(reinterpret_cast(this), m_Interval * 1000, NULL); } else { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 定时器节点时间到, Flow = %d"), m_pIvrFlow->id()); // 在时间区间,提示流程执行下一结点 m_pIvrFlow->onTimerTimeUp(m_NextPos); } }