#ifndef CUSTOMERHANDLE_H #define CUSTOMERHANDLE_H #pragma once #include "CustomerBeingFSM.h" #define USER_EVT_ATTENTION EVT_USER+1 #define USER_EVT_CONTROL EVT_USER+2 #define USER_EVT_NOACTION EVT_USER+3 #define USER_EVT_LEAVE_TO_ATTENTION EVT_USER+4 #define USER_EVT_ASSIST EVT_USER+5 #define USER_EVT_LEAVE_TO_CONTROL EVT_USER+6 #define USER_EVT_AGENT EVT_USER+7 #define USER_EVT_EMERGENCY_CHANGE_CUSTOMER EVT_USER+8 #define USER_EVT_HEALTH_UPS_NO_ELECTOR EVT_USER+9 #define USER_EVT_INTO_CUSTOMERRECORD EVT_USER+10 #define USER_EVT_EXIT_CUSTOMERRECORD EVT_USER+11 #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, public IFSMStateHooker { public: enum {s0, s1, s2, s3, s4, s5, s6}; BEGIN_FSM_STATE(CCustomerHandleFSM) FSM_STATE_ENTRY(s0,"None",s0_on_entry,s0_on_exit,s0_on_event) FSM_STATE_ENTRY(s1,"Attention",s1_on_entry,s1_on_exit,s1_on_event) FSM_STATE_ENTRY(s2,"Control",s2_on_entry,s2_on_exit,s2_on_event) FSM_STATE_ENTRY(s3,"Assist",s3_on_entry,s3_on_exit,s3_on_event) FSM_STATE_ENTRY(s4,"AgentOperation",s4_on_entry,s4_on_exit,s4_on_event) FSM_STATE_ENTRY(s5,"CustomerRecord",s5_on_entry,s5_on_exit,s5_on_event) FSM_STATE_ENTRY(s6,"UserDesktop",s6_on_entry,s6_on_exit,s6_on_event) END_FSM_STATE() BEGIN_FSM_RULE(CCustomerHandleFSM, s0) 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) FSM_RULE_ENTRY_ANY(s2, s0, USER_EVT_NOACTION) FSM_RULE_ENTRY_ANY(s2, s3, USER_EVT_ASSIST) FSM_RULE_ENTRY_ANY(s3, s2, USER_EVT_LEAVE_TO_CONTROL) FSM_RULE_ENTRY_ANY(s3, s4, USER_EVT_AGENT) FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_EMERGENCY_CHANGE_CUSTOMER) FSM_RULE_ENTRY_ANY(s4, s2, USER_EVT_LEAVE_TO_CONTROL) FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_EMERGENCY_CHANGE_CUSTOMER) //ups no elector, customerHandle goto "N" FSM_RULE_ENTRY_ANY(s1, s0, USER_EVT_HEALTH_UPS_NO_ELECTOR) FSM_RULE_ENTRY_ANY(s2, s0, USER_EVT_HEALTH_UPS_NO_ELECTOR) FSM_RULE_ENTRY_ANY(s3, s0, USER_EVT_HEALTH_UPS_NO_ELECTOR) FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_HEALTH_UPS_NO_ELECTOR) //add by chh 20180925,进入双录状态 FSM_RULE_ENTRY_ANY(s1, s5, USER_EVT_INTO_CUSTOMERRECORD) FSM_RULE_ENTRY_ANY(s2, s5, USER_EVT_INTO_CUSTOMERRECORD) FSM_RULE_ENTRY_ANY(s3, s5, USER_EVT_INTO_CUSTOMERRECORD) FSM_RULE_ENTRY_ANY(s4, s5, USER_EVT_INTO_CUSTOMERRECORD) FSM_RULE_ENTRY_ANY(s5, s1, USER_EVT_EXIT_CUSTOMERRECORD) //add by chh 20180925,进入用户桌面状态 FSM_RULE_ENTRY_ANY(s1, s6, USER_EVT_INTO_USERDESKTOP) FSM_RULE_ENTRY_ANY(s2, s6, USER_EVT_INTO_USERDESKTOP) FSM_RULE_ENTRY_ANY(s3, s6, USER_EVT_INTO_USERDESKTOP) FSM_RULE_ENTRY_ANY(s4, s6, USER_EVT_INTO_USERDESKTOP) FSM_RULE_ENTRY_ANY(s6, s1, USER_EVT_EXIT_USERDESKTOP) END_FSM_RULE() CCustomerHandleFSM(); ~CCustomerHandleFSM(); virtual void OnStateTrans(int iSrcState, int iDstState); virtual ErrorCodeEnum OnInit(); virtual ErrorCodeEnum OnExit(); void s0_on_entry(); void s0_on_exit(); unsigned int s0_on_event(FSMEvent* event); void s1_on_entry(); void s1_on_exit(); unsigned int s1_on_event(FSMEvent* event); void s2_on_entry(); void s2_on_exit(); unsigned int s2_on_event(FSMEvent* event); void s3_on_entry(); void s3_on_exit(); unsigned int s3_on_event(FSMEvent* event); void s4_on_entry(); void s4_on_exit(); unsigned int s4_on_event(FSMEvent* event); void s5_on_entry(); void s5_on_exit(); unsigned int s5_on_event(FSMEvent* event); 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; int nOldstate; }; #endif // CUSTOMERHANDLE_H