#include "StdAfx.h" #include "SItemAgentStatus.h" CSItemAgentStatus::CSItemAgentStatus(UINT AgentId, ULONG LoginId, UINT Exten, CString GroupId) : m_AgentID(AgentId), m_LoginID(LoginId), m_ExtID(Exten), m_GroupID(GroupId) { } CSItemAgentStatus::~CSItemAgentStatus(void) { __flush(); } /***************************************************************** **【函数名称】 __onStateStart **【函数功能】 状态发生时的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__onStateStart( AGENT_STATE StartState ) { time_t StateTime; if(m_StateMap.Lookup(StartState, StateTime)) // 已经存在此状态,说明统计出现异常,该遗留状态未被记入数据库 { ASSERT(FALSE); __onStateOver(StartState); } StateTime = time(NULL); // 缓存此状态 m_StateMap.SetAt(StartState, StateTime); // 编写SQL语句 /*m_Sql.Format(_T("INSERT INTO rep_agent_state (AgentId, LoginId, State, OccurTime)VALUES\ (%d, %d, %d, %s)"), m_AgentID, m_LoginID, StartState, FormatTime(StateTime));*/ //2021-11-10 添加分机号,坐席组 m_Sql.Format(_T("INSERT INTO rep_agent_state (AgentId, ExtId, GroupId, LoginId, State, OccurTime)VALUES\ (%d, %d, '%s', %d, %d, %s)"), m_AgentID, m_ExtID, m_GroupID, m_LoginID, StartState, FormatTime(StateTime)); __execSQL(); } /***************************************************************** **【函数名称】 __onStateOver **【函数功能】 状态结束时的处理函数 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__onStateOver( AGENT_STATE OverState ) { time_t StateTime; if(!m_StateMap.Lookup(OverState, StateTime)) // 未找到此状态,说明统计出现异常 { ASSERT(FALSE); if (AGENT_STATE_LOGOUT == OverState) // 2021-11-11 签出 { __onStateStart(AGENT_STATE_LOGOUT); // 删除该状态 m_StateMap.RemoveKey(OverState); } return; } // 删除该状态 m_StateMap.RemoveKey(OverState); // 状态持续时间 UINT Duration = (UINT)(time(NULL) - StateTime); // 编写SQL语句 m_Sql.Format(_T("UPDATE rep_agent_state SET Duration = %d WHERE AgentId = %d AND LoginId = %d AND State = %d AND OccurTime = %s"), Duration, m_AgentID, m_LoginID, OverState, FormatTime(StateTime)); __execSQL(); } /***************************************************************** **【函数名称】 OnRepEvent **【函数功能】 统计事件变化通知 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::onSEvent( REP_EVENT EvtType, PARAM Param ) { switch(EvtType) { case REP_EVENT_STATE: { T_EvtStatus* pStatus = (T_EvtStatus*)Param; ASSERT(pStatus != NULL); if(pStatus == NULL) return; if(pStatus->StartFlag) __onStateStart(pStatus->State); else __onStateOver(pStatus->State); } break; case REP_EVENT_LOGIN: __onStateStart(AGENT_STATE_LOGING); // 2021-11-22 ,添加了置闲保存记录,签入后置闲会导致连续两条置闲记录,因此记录改为为登录状态 __onStateStart(AGENT_STATE_FREE); break; case REP_EVENT_LOGOUT: __onStateOver(AGENT_STATE_LOGOUT); break; } } /***************************************************************** **【函数名称】 __flush **【函数功能】 将所有遗留的状态统计存入数据库 **【参数】 **【返回值】 ****************************************************************/ void CSItemAgentStatus::__flush( void ) { AGENT_STATE State; time_t StateTime; // 重新显示 POSITION pos = m_StateMap.GetStartPosition(); while(pos != NULL) { m_StateMap.GetNextAssoc(pos, State, StateTime); __onStateOver(State); } // end while }