CustomerHandleFSM.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. #include "stdafx.h"
  2. #include "SpBase.h"
  3. #include "CustomerHandleFSM.h"
  4. #include "EventCode.h"
  5. #include "Event.h"
  6. static char* sts[] = {
  7. "N", // None
  8. "A", // Attention
  9. "C", // Control
  10. "T", // Assist
  11. "G", // Agent
  12. "A", // Attention
  13. "N", // None
  14. };
  15. static struct {
  16. int state_id;
  17. int evt_code;
  18. } state_id_evt[] = {
  19. {0, USER_EVT_RECOVER_TO_CONTROL - 2},
  20. {1, USER_EVT_RECOVER_TO_CONTROL - 1},
  21. {2, USER_EVT_RECOVER_TO_CONTROL},
  22. {3, USER_EVT_RECOVER_TO_CONTROL + 1},
  23. {4, USER_EVT_RECOVER_TO_CONTROL + 2},
  24. {5, USER_EVT_RECOVER_TO_CONTROL + 3}
  25. };
  26. CCustomerHandleFSM::CCustomerHandleFSM()
  27. {
  28. }
  29. CCustomerHandleFSM::~CCustomerHandleFSM()
  30. {
  31. }
  32. void CCustomerHandleFSM::OnStateTrans( int iSrcState, int iDstState )
  33. {
  34. LOG_TRACE("CustomerHandle from state %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
  35. //客户经理录像,或者用户桌面状态为'I'和'U'时屏蔽客户感知
  36. //Dbg("%d, %d", iSrcState, iDstState);
  37. if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT)
  38. {
  39. SetSysState(iDstState);
  40. }
  41. else
  42. {
  43. if (FSM_STATE_INIT == iSrcState){
  44. CSimpleStringA strSysVar;
  45. GetEntityBase()->GetFunction()->GetSysVar("CustomerHandle", strSysVar);
  46. char* strState = (char*)strSysVar.GetData();
  47. Dbg("CustomerHandle is %s", strState);
  48. if ('N' != *strState){
  49. int stateid = GetStateIdBySysState(strState);
  50. PostEventFIFO(new FSMEvent(state_id_evt[stateid].evt_code));
  51. }
  52. }
  53. Dbg("Sales Recording or other desktop type,ignore all event!");
  54. }
  55. }
  56. ErrorCodeEnum CCustomerHandleFSM::SetSysState( int state )
  57. {
  58. ErrorCodeEnum errCode;
  59. if (*sts[state] != 'N' && *sts[nOldstate] == 'N')
  60. {
  61. m_uid = CUUID::Create(m_uid);
  62. Dbg("customeraware start new SessionID=%s",m_uid.ToString().GetData());
  63. errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString());
  64. if (errCode != Error_Succeed)
  65. {
  66. Dbg("set SessionID failed (%d).",errCode);
  67. }
  68. LogEvent(Severity_Middle, EVENT_MOD_CUSTOMERAWARE_BEGIN, m_uid.ToString());
  69. }
  70. //当从S5(录音录像状态)跳到S2(接近状态),或者进入S5状态时生成新的uuid防止uuid不断开
  71. else if((state == s2 && *sts[state] == 'A' && *sts[nOldstate] == 'A')||(state == s5))
  72. {
  73. m_uid = CUUID::Create(m_uid);
  74. Dbg("state(%d) current state name is %s, oldstate name is %s, new SessionID=%s",state, sts[state], sts[nOldstate], m_uid.ToString().GetData());
  75. errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString());
  76. if (errCode != Error_Succeed)
  77. {
  78. Dbg("set SessionID failed (%d).",errCode);
  79. }
  80. }
  81. else if (*sts[state] == 'N')
  82. {
  83. if (*sts[nOldstate] != 'N')
  84. {
  85. LogEvent(Severity_Middle, EVENT_MOD_CUSTOMERAWARE_END, m_uid.ToString());
  86. //客户离开,清空sessionid
  87. errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID","N");
  88. if (errCode != Error_Succeed){
  89. Dbg("customeraware end set SessionID to Null failed (%d).",errCode);
  90. }
  91. else {
  92. Dbg("customeraware end set SessionID to N success.", errCode);
  93. }
  94. }
  95. }
  96. nOldstate = state;
  97. Dbg("SetsysVar CustomerHandle to %s",sts[state]);
  98. return GetEntityBase()->GetFunction()->SetSysVar("CustomerHandle", sts[state]);
  99. }
  100. int CCustomerHandleFSM::GetStateIdBySysState(char* strState)
  101. {
  102. int iret = 0;
  103. if (NULL == strState){
  104. return iret;
  105. }
  106. if (*strState == 'N'){
  107. return iret;
  108. }
  109. for (int i = 0 ; i < sizeof(sts)/sizeof(char*); i++){
  110. if (*sts[i] == *strState) {
  111. iret = i;
  112. break;
  113. }
  114. }
  115. return iret;
  116. }
  117. ErrorCodeEnum CCustomerHandleFSM::OnInit()
  118. {
  119. AddStateHooker(this);
  120. nOldstate = 0;
  121. m_bIsSalesRecord = FALSE;
  122. return Error_Succeed;
  123. }
  124. ErrorCodeEnum CCustomerHandleFSM::OnExit()
  125. {
  126. return Error_Succeed;
  127. }
  128. void CCustomerHandleFSM::s0_on_entry()
  129. {
  130. LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_GREEN_OFF, "LOG_EVT_HEADLIGHT_GREEN_OFF");
  131. }
  132. void CCustomerHandleFSM::s0_on_exit()
  133. {
  134. LogEvent(Severity_Middle, LOG_EVT_HEADLIGHT_GREEN_ON, "LOG_EVT_HEADLIGHT_GREEN_ON");
  135. }
  136. unsigned int CCustomerHandleFSM::s0_on_event(FSMEvent* event)
  137. {
  138. return 0;
  139. }
  140. void CCustomerHandleFSM::s1_on_entry() {}
  141. void CCustomerHandleFSM::s1_on_exit() {}
  142. unsigned int CCustomerHandleFSM::s1_on_event(FSMEvent* event)
  143. {
  144. return 0;
  145. }
  146. void CCustomerHandleFSM::s2_on_entry() {}
  147. void CCustomerHandleFSM::s2_on_exit() {}
  148. unsigned int CCustomerHandleFSM::s2_on_event(FSMEvent* event)
  149. {
  150. return 0;
  151. }
  152. void CCustomerHandleFSM::s3_on_entry() {}
  153. void CCustomerHandleFSM::s3_on_exit() {}
  154. unsigned int CCustomerHandleFSM::s3_on_event(FSMEvent* event)
  155. {
  156. return 0;
  157. }
  158. void CCustomerHandleFSM::s4_on_entry() {}
  159. void CCustomerHandleFSM::s4_on_exit() {}
  160. unsigned int CCustomerHandleFSM::s4_on_event(FSMEvent* event)
  161. {
  162. return 0;
  163. }
  164. void CCustomerHandleFSM::s5_on_entry()
  165. {
  166. return;
  167. }
  168. void CCustomerHandleFSM::s5_on_exit()
  169. {
  170. return;
  171. }
  172. unsigned int CCustomerHandleFSM::s5_on_event(FSMEvent* event)
  173. {
  174. return 0;
  175. }
  176. void CCustomerHandleFSM::s6_on_entry()
  177. {
  178. return;
  179. }
  180. void CCustomerHandleFSM::s6_on_exit()
  181. {
  182. return;
  183. }
  184. unsigned int CCustomerHandleFSM::s6_on_event(FSMEvent* event)
  185. {
  186. return 0;
  187. }