#include "stdafx.h" #include "SpBase.h" #include "CustomerHandleFSM.h" #include "EventCode.h" #include "Event.h" static char* sts[] = { "N", // None "A", // Attention "C", // Control "T", // Assist "G", // Agent "A", // Attention "N", // None }; static struct { int state_id; int evt_code; } state_id_evt[] = { {0, USER_EVT_RECOVER_TO_CONTROL - 2}, {1, USER_EVT_RECOVER_TO_CONTROL - 1}, {2, USER_EVT_RECOVER_TO_CONTROL}, {3, USER_EVT_RECOVER_TO_CONTROL + 1}, {4, USER_EVT_RECOVER_TO_CONTROL + 2}, {5, USER_EVT_RECOVER_TO_CONTROL + 3} }; CCustomerHandleFSM::CCustomerHandleFSM() { } CCustomerHandleFSM::~CCustomerHandleFSM() { } void CCustomerHandleFSM::OnStateTrans( int iSrcState, int iDstState ) { //客户经理录像,或者用户桌面状态为'I'和'U'时屏蔽客户感知 //Dbg("%d, %d", iSrcState, iDstState); if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT) { SetSysState(iDstState); } else { if (FSM_STATE_INIT == iSrcState){ CSimpleStringA strSysVar; GetEntityBase()->GetFunction()->GetSysVar("CustomerHandle", strSysVar); char* strState = (char*)strSysVar.GetData(); if ('N' != *strState){ int stateid = GetStateIdBySysState(strState); PostEventFIFO(new FSMEvent(state_id_evt[stateid].evt_code)); } } } } ErrorCodeEnum CCustomerHandleFSM::SetSysState( int state ) { ErrorCodeEnum errCode; if (*sts[state] != 'N' && *sts[nOldstate] == 'N') { m_uid = CUUID::Create(m_uid); errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString()); if (errCode != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set SessionID failed (%d).",errCode); } LogEvent(Severity_Middle, EVENT_MOD_CUSTOMERAWARE_BEGIN, m_uid.ToString()); } //当从S5(录音录像状态)跳到S2(接近状态),或者进入S5状态时生成新的uuid防止uuid不断开 else if((state == s2 && *sts[state] == 'A' && *sts[nOldstate] == 'A')||(state == s5)) { m_uid = CUUID::Create(m_uid); errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString()); if (errCode != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set SessionID failed (%d).",errCode); } } else if (*sts[state] == 'N') { if (*sts[nOldstate] != 'N') { LogEvent(Severity_Middle, EVENT_MOD_CUSTOMERAWARE_END, m_uid.ToString()); //客户离开,清空sessionid errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID","N"); if (errCode != Error_Succeed){ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("customeraware end set SessionID to Null failed (%d).", errCode); } } } nOldstate = state; return GetEntityBase()->GetFunction()->SetSysVar("CustomerHandle", sts[state]); } int CCustomerHandleFSM::GetStateIdBySysState(char* strState) { int iret = 0; if (NULL == strState){ return iret; } if (*strState == 'N'){ return iret; } for (int i = 0 ; i < sizeof(sts)/sizeof(char*); i++){ if (*sts[i] == *strState) { iret = i; break; } } return iret; } ErrorCodeEnum CCustomerHandleFSM::OnInit() { AddStateHooker(this); nOldstate = 0; m_bIsSalesRecord = false; return Error_Succeed; } ErrorCodeEnum CCustomerHandleFSM::OnExit() { return Error_Succeed; } void CCustomerHandleFSM::s0_on_entry() { LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_GREEN_OFF, "LOG_EVT_HEADLIGHT_GREEN_OFF"); } void CCustomerHandleFSM::s0_on_exit() { LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_GREEN_ON, "LOG_EVT_HEADLIGHT_GREEN_ON"); } unsigned int CCustomerHandleFSM::s0_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s1_on_entry() {} void CCustomerHandleFSM::s1_on_exit() {} unsigned int CCustomerHandleFSM::s1_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s2_on_entry() {} void CCustomerHandleFSM::s2_on_exit() {} unsigned int CCustomerHandleFSM::s2_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s3_on_entry() {} void CCustomerHandleFSM::s3_on_exit() {} unsigned int CCustomerHandleFSM::s3_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s4_on_entry() {} void CCustomerHandleFSM::s4_on_exit() {} unsigned int CCustomerHandleFSM::s4_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s5_on_entry() { return; } void CCustomerHandleFSM::s5_on_exit() { return; } unsigned int CCustomerHandleFSM::s5_on_event(FSMEvent* event) { return 0; } void CCustomerHandleFSM::s6_on_entry() { return; } void CCustomerHandleFSM::s6_on_exit() { return; } unsigned int CCustomerHandleFSM::s6_on_event(FSMEvent* event) { return 0; }