#include "stdafx.h" #include "SpBase.h" #include "CustomerBeingFSM.h" #include "CustomerHandleFSM.h" #include "Event.h" #include "EventCode.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); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Desktop type is : %s",strValue.GetData()); } } CUUID Listener1,Listener2,Listener3,Listener4,Listener5,Listener6; GetFunction()->SubscribeLog(Listener1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORD); GetFunction()->SubscribeLog(Listener2, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU); GetFunction()->SubscribeLog(Listener3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_EXITSALESRECORD); GetFunction()->SubscribeLog(Listener4, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD); GetFunction()->SubscribeLog(Listener5, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTRECORDPREVIEW); GetFunction()->SubscribeLog(Listener6, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTAFTERPREVIEWRECORD); 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) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("user_code = %08x", dwUserCode); //是否进入客户经理录像 if (dwUserCode == LOG_EVT_UI_STARTRECORD || LOG_EVT_UI_STARTRECORDPREVIEW == dwUserCode) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter sales record!"); m_customerHandleFSM.m_bIsSalesRecord = TRUE; m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_INTO_CUSTOMERRECORD)); } else if(LOG_EVT_UI_STARTREMOTERECORD == dwUserCode) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("Enter sales remote record!"); 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) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("exit to main!"); 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, SYSVAR_DESKTOPTYPE) == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("desktop type from : %c to %c", pszOldValue[0], pszValue[0]); //不再进入客户感知用户桌面状态,解决用户桌面态返回main页面问题 if (eDesk2SType != m_eDeviceType) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("DeviceType:%d customeraware not go to USERDESKTOP state", m_eDeviceType); return; } if (pszValue[0] == DESKTOPTYPE_BUS) //切换到业务屏,打开客户感知,进入有人接近状态 { m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT_USERDESKTOP)); } else if (pszValue[0] == DESKTOPTYPE_INFO) //切换到信息屏,屏蔽客户感知,进入无人状态 { m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_INTO_USERDESKTOP)); } else if (pszValue[0] == DESKTOPTYPE_USER) //切换到用户桌面,屏蔽客户感知,进入无人状态 { m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_INTO_USERDESKTOP)); } else { DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unknown desktop type!"); } } else 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); DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CustomerID change,generate new sessionID=%s",m_uid.ToString().GetData()); 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 if (stricmp(stStaticinfo.strMachineType, "RVC.PAD") == 0) { if (stricmp(stStaticinfo.strSite, "CMB.FLB") == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the type is mobile pad"); m_eDeviceType = eMobilePadType; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the type is pad"); m_eDeviceType = ePadtype; } } else if (stricmp(stStaticinfo.strMachineType, "RPM.Stand1S") == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the type is rpm.stand1s"); m_eDeviceType = eRpm1sType; } else if (stricmp(stStaticinfo.strMachineType, "RVC.Desk2S") == 0) { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the type is Desk2S"); m_eDeviceType = eDesk2SType; } else { DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("the type is standard"); 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()