123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- #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<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
- {
- ErrorCodeEnum Error = __OnStart(Error_Succeed);
- pTransactionContext->SendAnswer(Error);
- }
- virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> 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<IEntityFunction> 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<IEntityFunction> 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<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
- const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
- const CAutoArray<DWORD> &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<IEntityFunction> 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<CUUID> m_arrListener;
- CCustomerBeingFSM m_customerBegingFSM;
- CCustomerHandleFSM m_customerHandleFSM;
- };
- SP_BEGIN_ENTITY_MAP()
- SP_ENTITY(CCustomerAwareEntity)
- SP_END_ENTITY_MAP()
|