123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268 |
- #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<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);
- 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<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)
- {
- 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<IEntityFunction> 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<CUUID> m_arrListener;
- CCustomerBeingFSM m_customerBegingFSM;
- CCustomerHandleFSM m_customerHandleFSM;
- };
- SP_BEGIN_ENTITY_MAP()
- SP_ENTITY(CCustomerAwareEntity)
- SP_END_ENTITY_MAP()
|