mod_customeraware.cpp 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "CustomerBeingFSM.h"
  4. #include "CustomerHandleFSM.h"
  5. #include "Event.h"
  6. #include "EventCode.h"
  7. #include "../mod_interactivecontrol/Event.h"
  8. #define EVT_CONVERTER "EventConverter"
  9. #define FSM_BEING 1
  10. #define FSM_HANDLE 2
  11. static struct {
  12. int usr_code;
  13. int evt_code;
  14. int fsm_id;
  15. } g_ts[] = {
  16. {0x10303080, USER_EVT_APPROACH, FSM_BEING},
  17. {0x10303081, USER_EVT_LEAVE, FSM_BEING},
  18. {0x10303082, USER_EVT_FRONT, FSM_BEING},
  19. {0x10303083, USER_EVT_LEAVE_APPROACH, FSM_BEING},
  20. {0x10303084, USER_EVT_LOCK, FSM_BEING},
  21. {0x10303085, USER_EVT_UNLOCK, FSM_BEING},
  22. {0x10313080, USER_EVT_ATTENTION, FSM_HANDLE},
  23. {0x10313081, USER_EVT_NOACTION, FSM_HANDLE},
  24. {0x10313082, USER_EVT_EMERGENCY_CHANGE_CUSTOMER, FSM_HANDLE},
  25. {0x10313083, USER_EVT_CONTROL, FSM_HANDLE},
  26. {0x10313084, USER_EVT_LEAVE_TO_ATTENTION, FSM_HANDLE},
  27. {0x10313085, USER_EVT_ASSIST, FSM_HANDLE},
  28. {0x10313086, USER_EVT_AGENT, FSM_HANDLE},
  29. {0x10313087, USER_EVT_LEAVE_TO_CONTROL, FSM_HANDLE},
  30. {0x50100001, USER_EVT_HEALTH_UPS_NO_ELECTOR, FSM_HANDLE}
  31. };
  32. class CCustomerAwareEntity : public CEntityBase, public ILogListener, public ISysVarListener
  33. {
  34. public:
  35. CCustomerAwareEntity() {}
  36. virtual ~CCustomerAwareEntity() {}
  37. virtual const char *GetEntityName() const { return "CustomerAware"; }
  38. virtual void OnPreStart(CAutoArray<CSimpleStringA> strArgs,CSmartPointer<ITransactionContext> pTransactionContext)
  39. {
  40. ErrorCodeEnum Error = __OnStart(Error_Succeed);
  41. pTransactionContext->SendAnswer(Error);
  42. }
  43. virtual void OnPreClose(EntityCloseCauseEnum eCloseCause,CSmartPointer<ITransactionContext> pTransactionContext)
  44. {
  45. ErrorCodeEnum Error = __OnClose(Error_Succeed);
  46. pTransactionContext->SendAnswer(Error);
  47. }
  48. ErrorCodeEnum __OnStart(ErrorCodeEnum preOperationError)
  49. {
  50. if (preOperationError != Error_Succeed) {
  51. return preOperationError;
  52. }
  53. getDeviceType();
  54. m_customerBegingFSM.Init(this);
  55. m_customerHandleFSM.Init(this);
  56. m_arrListener.Init(sizeof(g_ts)/sizeof(g_ts[0]));
  57. int i = 0;
  58. for (i = 0; i < sizeof(g_ts)/sizeof(g_ts[0]); ++i)
  59. {
  60. GetFunction()->SubscribeLog(m_arrListener[i], this, Log_Event, Severity_None, Error_IgnoreAll, g_ts[i].usr_code, EVT_CONVERTER);
  61. }
  62. {
  63. CSmartPointer<IEntityFunction> Func = GetFunction();
  64. CSimpleStringA strValue;
  65. if (Func->RegistSysVarEvent(SYSVAR_DESKTOPTYPE, this) != Error_Succeed)
  66. {
  67. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", SYSVAR_DESKTOPTYPE);
  68. }
  69. else
  70. {
  71. Func->GetSysVar(SYSVAR_DESKTOPTYPE, strValue);
  72. }
  73. }
  74. CUUID Listener1,Listener2,Listener3;
  75. GetFunction()->SubscribeLog(Listener1, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_RETURNMENU);
  76. GetFunction()->SubscribeLog(Listener2, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_EXITSALESRECORD);
  77. GetFunction()->SubscribeLog(Listener3, this, Log_Event, Severity_None, Error_IgnoreAll, LOG_EVT_UI_STARTREMOTERECORD);
  78. ErrorCodeEnum Error;
  79. Error = GetFunction()->RegistSysVarEvent("CustomerID", this);
  80. if (Error != Error_Succeed)
  81. {
  82. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("register sysvar %s failed!", "CustomerID");
  83. }
  84. return Error_Succeed;
  85. }
  86. ErrorCodeEnum __OnClose(ErrorCodeEnum preOperationError)
  87. {
  88. if (preOperationError != Error_Succeed)
  89. return preOperationError;
  90. int i;
  91. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  92. for (i = 0; i < m_arrListener.GetCount(); ++i)
  93. {
  94. spFunction->UnsubscribeLog(m_arrListener[i]);
  95. }
  96. m_arrListener.Clear();
  97. m_customerBegingFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT));
  98. m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT));
  99. return Error_Succeed;
  100. }
  101. //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)
  102. virtual void OnLog(const CAutoArray<CUUID> &SubIDs, const CUUID nLogID,const LogTypeEnum eLogType, const SeverityLevelEnum eLevel,
  103. const DWORD dwSysError,const DWORD dwUserCode,const DWORD dwEntityInstanceID, const WORD wEntityDevelID,
  104. const CAutoArray<DWORD> &Param, const char *pszEntityName, const char *pszModuleName,const char *pszMessage, const linkContext &pLinkInfo)
  105. {
  106. //是否进入客户经理录像
  107. if(LOG_EVT_UI_STARTREMOTERECORD == dwUserCode)
  108. {
  109. m_customerHandleFSM.m_bIsSalesRecord = true;
  110. m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_INTO_CUSTOMERRECORD));
  111. }
  112. //是否在客户经理录像的时候退出到了首页,进入有人接近状态
  113. else if (dwUserCode == LOG_EVT_UI_RETURNMENU||dwUserCode == LOG_EVT_UI_EXITSALESRECORD)
  114. {
  115. if (m_customerHandleFSM.m_bIsSalesRecord)
  116. {
  117. m_customerHandleFSM.m_bIsSalesRecord = false;
  118. m_customerHandleFSM.PostEventFIFO(new FSMEvent(USER_EVT_EXIT_CUSTOMERRECORD));
  119. }
  120. }
  121. else
  122. {
  123. for (int i = 0; i < sizeof(g_ts)/sizeof(g_ts[0]); ++i)
  124. {
  125. if (g_ts[i].usr_code == dwUserCode)
  126. {
  127. if (g_ts[i].fsm_id & FSM_BEING)
  128. {
  129. m_customerBegingFSM.PostEventFIFO(new FSMEvent(g_ts[i].evt_code));
  130. }
  131. if (g_ts[i].fsm_id & FSM_HANDLE)
  132. {
  133. m_customerHandleFSM.PostEventFIFO(new FSMEvent(g_ts[i].evt_code));
  134. }
  135. break;
  136. }
  137. }
  138. }
  139. }
  140. virtual void OnSysVarEvent(const char *pszKey, const char *pszValue,const char *pszOldValue,const char *pszEntityName)
  141. {
  142. if (_stricmp(pszKey,"CustomerID") == 0)
  143. {
  144. CSimpleStringA strCustomerID;
  145. GetFunction()->GetSysVar("CustomerID",strCustomerID);
  146. if(_stricmp(strCustomerID,"N") == 0)
  147. {
  148. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("CustomerID to N!");
  149. }
  150. else
  151. {
  152. if (_stricmp(pszOldValue,"N") != 0 )
  153. {
  154. //customerid改变生成新的sessionid
  155. CUUID m_uid = CUUID::Create(m_uid);
  156. ErrorCodeEnum errCode = GetFunction()->SetSysVar("SessionID",m_uid.ToString());
  157. if (errCode != Error_Succeed)
  158. {
  159. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set SessionID failed (%d).",errCode);
  160. }
  161. }
  162. }
  163. }
  164. }
  165. private:
  166. void getDeviceType() {
  167. m_eDeviceType = eStand2sType;
  168. //is Pad Version
  169. CSmartPointer<IEntityFunction> spFunction = GetFunction();
  170. CSystemStaticInfo stStaticinfo;
  171. spFunction->GetSystemStaticInfo(stStaticinfo);
  172. if (_stricmp(stStaticinfo.strMachineType, "RVC.Stand1SPlus") == 0) {
  173. m_eDeviceType = eStand1SPlusType;
  174. }
  175. else
  176. {
  177. m_eDeviceType = eStand2sType;
  178. }
  179. }
  180. DeviceTypeEnum m_eDeviceType;
  181. CAutoArray<CUUID> m_arrListener;
  182. CCustomerBeingFSM m_customerBegingFSM;
  183. CCustomerHandleFSM m_customerHandleFSM;
  184. };
  185. SP_BEGIN_ENTITY_MAP()
  186. SP_ENTITY(CCustomerAwareEntity)
  187. SP_END_ENTITY_MAP()