|
@@ -6,6 +6,28 @@
|
|
|
#include "Event.h"
|
|
|
|
|
|
|
|
|
+static char* sts[] = {
|
|
|
+ "N", // None
|
|
|
+ "A", // Attention
|
|
|
+ "C", // Control
|
|
|
+ "T", // Assist
|
|
|
+ "G", // Agent
|
|
|
+ "A", // Attention
|
|
|
+ "N", // None
|
|
|
+};
|
|
|
+
|
|
|
+static struct {
|
|
|
+ int state_id;
|
|
|
+ int evt_code;
|
|
|
+} state_id_evt[] = {
|
|
|
+ {0, USER_EVT_RECOVER_TO_CONTROL - 2},
|
|
|
+ {1, USER_EVT_RECOVER_TO_CONTROL - 1},
|
|
|
+ {2, USER_EVT_RECOVER_TO_CONTROL},
|
|
|
+ {3, USER_EVT_RECOVER_TO_CONTROL + 1},
|
|
|
+ {4, USER_EVT_RECOVER_TO_CONTROL + 2},
|
|
|
+ {5, USER_EVT_RECOVER_TO_CONTROL + 3}
|
|
|
+};
|
|
|
+
|
|
|
CCustomerHandleFSM::CCustomerHandleFSM()
|
|
|
{
|
|
|
|
|
@@ -20,32 +42,36 @@ void CCustomerHandleFSM::OnStateTrans( int iSrcState, int iDstState )
|
|
|
{
|
|
|
LOG_TRACE("CustomerHandle from state %s to %s", GetStateName(iSrcState), GetStateName(iDstState));
|
|
|
//客户经理录像,或者用户桌面状态为'I'和'U'时屏蔽客户感知
|
|
|
- if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT)
|
|
|
+ //Dbg("%d, %d", iSrcState, iDstState);
|
|
|
+ if (iSrcState != FSM_STATE_INIT && iDstState != FSM_STATE_EXIT)
|
|
|
{
|
|
|
SetSysState(iDstState);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
- Dbg("Sales Recoding or other desktop type,ignore all event!");
|
|
|
+ if (FSM_STATE_INIT == iSrcState){
|
|
|
+ CSimpleStringA strSysVar;
|
|
|
+ GetEntityBase()->GetFunction()->GetSysVar("CustomerHandle", strSysVar);
|
|
|
+ char* strState = (char*)strSysVar.GetData();
|
|
|
+ Dbg("CustomerHandle is %s", strState);
|
|
|
+ if ('N' != *strState){
|
|
|
+ int stateid = GetStateIdBySysState(strState);
|
|
|
+ PostEventFIFO(new FSMEvent(state_id_evt[stateid].evt_code));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Dbg("Sales Recording or other desktop type,ignore all event!");
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
|
|
|
ErrorCodeEnum CCustomerHandleFSM::SetSysState( int state )
|
|
|
{
|
|
|
- static char *sts[] = {
|
|
|
- "N", // None
|
|
|
- "A", // Attention
|
|
|
- "C", // Control
|
|
|
- "T", // Assist
|
|
|
- "G", // Agent
|
|
|
- "A", // Attention
|
|
|
- "N", // None
|
|
|
- };
|
|
|
ErrorCodeEnum errCode;
|
|
|
if (*sts[state] != 'N' && *sts[nOldstate] == 'N')
|
|
|
{
|
|
|
m_uid = CUUID::Create(m_uid);
|
|
|
- Dbg("NEW SessionID=%s",m_uid.ToString());
|
|
|
+ Dbg("NEW SessionID=%s",m_uid.ToString().GetData());
|
|
|
errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString());
|
|
|
if (errCode != Error_Succeed)
|
|
|
{
|
|
@@ -57,7 +83,7 @@ ErrorCodeEnum CCustomerHandleFSM::SetSysState( int state )
|
|
|
else if((state == s2 && *sts[state] == 'A' && *sts[nOldstate] == 'A')||(state == s5))
|
|
|
{
|
|
|
m_uid = CUUID::Create(m_uid);
|
|
|
- Dbg("NEW SessionID=%s",m_uid.ToString());
|
|
|
+ Dbg("NEW SessionID=%s",m_uid.ToString().GetData());
|
|
|
errCode = GetEntityBase()->GetFunction()->SetSysVar("SessionID",m_uid.ToString());
|
|
|
if (errCode != Error_Succeed)
|
|
|
{
|
|
@@ -82,6 +108,27 @@ ErrorCodeEnum CCustomerHandleFSM::SetSysState( int state )
|
|
|
return GetEntityBase()->GetFunction()->SetSysVar("CustomerHandle", sts[state]);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+int CCustomerHandleFSM::GetStateIdBySysState(char* strState)
|
|
|
+{
|
|
|
+ int iret = 0;
|
|
|
+ if (NULL == strState){
|
|
|
+ return iret;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (*strState == 'N'){
|
|
|
+ return iret;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (int i = 0 ; i < sizeof(sts)/sizeof(char*); i++){
|
|
|
+ if (*sts[i] == *strState) {
|
|
|
+ iret = i;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return iret;
|
|
|
+}
|
|
|
+
|
|
|
ErrorCodeEnum CCustomerHandleFSM::OnInit()
|
|
|
{
|
|
|
AddStateHooker(this);
|