#include "stdafx.h" #include "SpBase.h" #include "CustomerBeingFSM.h" #include "CustomerHandleFSM.h" #include "Event.h" #include "EventCode.h" #include "../mod_interactivecontrol/Event.h" #define EVT_CONVERTER "EventConverter" #define FSM_BEING 1 #define FSM_HANDLE 2 static struct { int usr_code; int evt_code; int fsm_id; } g_ts[] = { {0x10303080, USER_EVT_APPROACH, FSM_BEING}, {0x10303081, USER_EVT_LEAVE, FSM_BEING}, {0x10303082, USER_EVT_FRONT, FSM_BEING}, {0x10303083, USER_EVT_LEAVE_APPROACH, FSM_BEING}, {0x10303084, USER_EVT_LOCK, FSM_BEING}, {0x10303085, USER_EVT_UNLOCK, FSM_BEING}, {0x10313080, USER_EVT_ATTENTION, FSM_HANDLE}, {0x10313081, USER_EVT_NOACTION, FSM_HANDLE}, {0x10313082, USER_EVT_EMERGENCY_CHANGE_CUSTOMER, FSM_HANDLE}, {0x10313083, USER_EVT_CONTROL, FSM_HANDLE}, {0x10313084, USER_EVT_LEAVE_TO_ATTENTION, FSM_HANDLE}, {0x10313085, USER_EVT_ASSIST, FSM_HANDLE}, {0x10313086, USER_EVT_AGENT, FSM_HANDLE}, {0x10313087, USER_EVT_LEAVE_TO_CONTROL, FSM_HANDLE}, {0x50100001, USER_EVT_HEALTH_UPS_NO_ELECTOR, FSM_HANDLE} }; class CCustomerAwareEntity : public CEntityBase, public ILogListener, public ISysVarListener { public: CCustomerAwareEntity() {} virtual ~CCustomerAwareEntity() {} virtual const char *GetEntityName() const { return "CustomerAware"; } virtual void OnPreStart(CAutoArray strArgs,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnStart(Error_Succeed); pTransactionContext->SendAnswer(Error); } virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer pTransactionContext) { ErrorCodeEnum Error = __OnClose(Error_Succeed); pTransactionContext->SendAnswer(Error); } ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError) { if (preOperationError != Error_Succeed) { return preOperationError; } getDeviceType(); m_customerBegingFSM.Init(this); m_customerHandleFSM.Init(this); m_arrListener.Init(sizeof(g_ts)/sizeof(g_ts[0])); int i = 0; for (i = 0; i < sizeof(g_ts)/sizeof(g_ts[0]); ++i) { GetFunction()->SubscribeLog(m_arrListener[i], this, Log_Event, Severity_None, Error_IgnoreAll, g_ts[i].usr_code, EVT_CONVERTER); } { CSmartPointer Func = GetFunction(); CSimpleStringA strValue; if (Func->RegistSysVarEvent(SYSVAR_DESKTOPTYPE, this) != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", SYSVAR_DESKTOPTYPE); } else { Func->GetSysVar(SYSVAR_DESKTOPTYPE, strValue); } } CUUID Listener1,Listener2,Listener3; GetFunction()->SubscribeLog(Listener1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU); GetFunction()->SubscribeLog(Listener2, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_EXITSALESRECORD); GetFunction()->SubscribeLog(Listener3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD); ErrorCodeEnum Error; Error = GetFunction()->RegistSysVarEvent("CustomerID", this); if (Error != Error_Succeed) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "CustomerID"); } return Error_Succeed; } ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError) { if (preOperationError != Error_Succeed) return preOperationError; int i; CSmartPointer spFunction = GetFunction(); for (i = 0; i < m_arrListener.GetCount(); ++i) { spFunction->UnsubscribeLog(m_arrListener[i]); } m_arrListener.Clear(); m_customerBegingFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT)); m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT)); return Error_Succeed; } //virtual void OnLog(CLogListener *pListener, unsigned __int64 nLogID, LogTypeEnum eLogType, SeverityLevelEnum eLevel,DWORD dwSysError, DWORD dwUserCode,DWORD dwEntityId, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo) virtual void OnLog(const CAutoArray &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel, const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID, const CAutoArray &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo) { //是否进入客户经理录像 if(LOG_EVT_UI_STARTREMOTERECORD == dwUserCode) { m_customerHandleFSM.m_bIsSalesRecord = true; m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_INTO_CUSTOMERRECORD)); } //是否在客户经理录像的时候退出到了首页,进入有人接近状态 else if (dwUserCode == LOG_EVT_UI_RETURNMENU||dwUserCode == LOG_EVT_UI_EXITSALESRECORD) { if (m_customerHandleFSM.m_bIsSalesRecord) { m_customerHandleFSM.m_bIsSalesRecord = false; m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT_CUSTOMERRECORD)); } } else { for (int i = 0; i < sizeof(g_ts)/sizeof(g_ts[0]); ++i) { if (g_ts[i].usr_code == dwUserCode) { if (g_ts[i].fsm_id & FSM_BEING) { m_customerBegingFSM.PostEventFIFO(new FSMEvent(g_ts[i].evt_code)); } if (g_ts[i].fsm_id & FSM_HANDLE) { m_customerHandleFSM.PostEventFIFO(new FSMEvent(g_ts[i].evt_code)); } break; } } } } virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName) { if (_stricmp(pszKey,"CustomerID") == 0) { CSimpleStringA strCustomerID; GetFunction()->GetSysVar("CustomerID",strCustomerID); if(_stricmp(strCustomerID,"N") == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CustomerID to N!"); } else { if (_stricmp(pszOldValue,"N") != 0 ) { //customerid改变生成新的sessionid CUUID m_uid = CUUID::Create(m_uid); ErrorCodeEnum errCode = GetFunction()->SetSysVar("SessionID",m_uid.ToString()); if (errCode != Error_Succeed) { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set SessionID failed (%d).",errCode); } } } } } private: void getDeviceType() { m_eDeviceType = eStand2sType; //is Pad Version CSmartPointer spFunction = GetFunction(); CSystemStaticInfo stStaticinfo; spFunction->GetSystemStaticInfo(stStaticinfo); if (_stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) { m_eDeviceType = eStand1SPlusType; } else { m_eDeviceType = eStand2sType; } } DeviceTypeEnum m_eDeviceType; CAutoArray m_arrListener; CCustomerBeingFSM m_customerBegingFSM; CCustomerHandleFSM m_customerHandleFSM; }; SP_BEGIN_ENTITY_MAP() SP_ENTITY(CCustomerAwareEntity) SP_END_ENTITY_MAP()