Просмотр исходного кода

Z991239-2055 #comment fix: 解决客户感知实体重启存在后续无法播放广告问题

陈礼鹏80274480 4 лет назад
Родитель
Сommit
f6cb1a34ec

+ 60 - 13
Module/mod_customeraware/CustomerHandleFSM.cpp

@@ -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);

+ 5 - 0
Module/mod_customeraware/CustomerHandleFSM.h

@@ -21,6 +21,8 @@
 #define USER_EVT_INTO_USERDESKTOP EVT_USER+12
 #define USER_EVT_EXIT_USERDESKTOP  EVT_USER+13
 
+#define USER_EVT_RECOVER_TO_CONTROL EVT_USER+20
+
 //#define USER_EVT_EXIT	EVT_USER+50 
 
 class CCustomerHandleFSM : public FSMImpl<CCustomerHandleFSM>, public IFSMStateHooker
@@ -42,6 +44,7 @@ public:
 		FSM_RULE_ENTRY_ANY(s0, s1, USER_EVT_ATTENTION)
 		FSM_RULE_ENTRY_ANY(s0, FSM_STATE_EXIT, USER_EVT_EXIT)
 		FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_CONTROL)
+		FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_RECOVER_TO_CONTROL)
 		FSM_RULE_ENTRY_ANY(s1, s2, USER_EVT_CONTROL)
 		FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_NOACTION)
 		FSM_RULE_ENTRY_ANY(s2, s1, USER_EVT_LEAVE_TO_ATTENTION)
@@ -106,8 +109,10 @@ public:
 	void s6_on_entry();
 	void s6_on_exit();
 	unsigned int s6_on_event(FSMEvent* event);
+
 	BOOL m_bIsSalesRecord;
 	ErrorCodeEnum SetSysState(int state);
+	int GetStateIdBySysState(char* strState);
 	int m_nDesktopType;		//0:业务屏,1:信息屏,2:用户桌面
 private:
 	CUUID m_uid;