// TaskList.cpp : 实现文件 // #include "stdafx.h" #include "CallList.h" #include "../AcdCore.h" #include "../IncomingCall.h" // CTaskList IMPLEMENT_DYNAMIC(CCallList, CListCtrl) CCallList::CCallList() { m_bSortInc = TRUE; } CCallList::~CCallList() { } BEGIN_MESSAGE_MAP(CCallList, CListCtrl) ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick) END_MESSAGE_MAP() /***************************************************************** **【函数名称】 __indexItem **【函数功能】 索引任务 **【参数】 **【返回值】 *****************************************************************/ int CCallList::__indexItem( int _index ) { for (int i=0; i < GetItemCount(); i++) { if (GetItemData(i) == _index) return i; } return -1; } /***************************************************************** **【函数名称】 __transStrategy **【函数功能】 翻译座席分配策略 **【参数】 **【返回值】 *****************************************************************/ void CCallList::__transStrategy( AGENT_STRATEGY Strategy, CString& Data ) { switch(Strategy) { case AGENT_STRATEGY_LOOP: Data = _T("循环接听"); break; case AGENT_STRATEGY_MAX_CUR_FREE_TIME: Data = _T("目前空闲最长"); break; case AGENT_STRATEGY_SUMMAX_FREE_TIME: Data = _T("总空闲最长"); break; case AGENT_STRATEGY_MINI_CALLS: Data = _T("接听最少"); break; case AGENT_STRATEGY_MAX_SKILL: Data = _T("最高技能"); break; case AGENT_STRATEGY_MIN_SKILL: Data = _T("最低技能"); break; case AGENT_STRATEGY_KNOWN: Data = _T("之前服务过"); break; case AGENT_STRATEGY_MAXAVGFREE_TIME: Data = _T("平均最大空闲"); break; case AGENT_STRATEGY_MINAVG_CALLS: Data = _T("平均接听最少"); break; case AGENT_STRATEGY_LESS_SKILL: Data = _T("最少技能种类"); break; case AGENT_STRATEGY_UNKNOWN: default: ASSERT(FALSE); Data = _T("未知策略"); break; } } /***************************************************************** **【函数名称】 __transState **【函数功能】 翻译来电状态 **【参数】 **【返回值】 *****************************************************************/ void CCallList::__transState( OUTER_CALL_STATE State, CString& Data ) { if(State == OUTER_CALL_WAITING) Data = _T("等待排队"); else if(State = OUTER_CALL_PAUSE) Data = _T("暂停排队"); else if(State == OUTER_CALL_QUEUE) Data = _T("排队中"); } /***************************************************************** **【函数名称】 __showTask **【函数功能】 显示任务 **【参数】 **【返回值】 *****************************************************************/ void CCallList::__showTask( Call2Show& Info ) { CString Data; Data.Format(_T("%d"), Info.Index); InsertItem(0, Data); Data = _T(""); Data.Format(_T("%d"), Info.CallId); SetItemText(0, 1, Data); Data = _T(""); __transState(Info.State, Data); SetItemText(0, 2, Data); Data = _T(""); Data.Format(_T("%d"), Info.VipLevel); SetItemText(0, 3, Data); Data.Format(_T("%u"), Info.Group); SetItemText(0, 4, Data); SetItemText(0, 5, Info.Caller); Data = _T(""); __transStrategy(Info.Strategy, Data); SetItemText(0, 6, Data); SetItemData(0, Info.Index); } /***************************************************************** **【函数名称】 __updateTaskState **【函数功能】 更新任务 **【参数】 **【返回值】 *****************************************************************/ void CCallList::__updateCallState(int Item, Call2Show& Info) { CString Data = _T(""); /*Data.Format(_T("%d"), Info.callId); SetItemText(Item, 1, Data);*/ Data = _T(""); __transState(Info.State, Data); SetItemText(0, 2, Data); /*Data = _T(""); Data.Format(_T("%d"), Info.VipLevel); SetItemText(Item, 3, Data); Data.Format(_T("%u"), Info.Group); SetItemText(Item, 4, Data); SetItemText(Item, 5, Info.Caller); Data = _T(""); __transStrategy(Info.Strategy, Data); SetItemText(Item, 6, Data);*/ } /***************************************************************** **【函数名称】 format **【函数功能】 格式化控件 **【参数】 **【返回值】 *****************************************************************/ void CCallList::format( void ) { CRect mRect; GetWindowRect(&mRect); int length = mRect.right - mRect.left; int perLength = length / 6; //加载日志列表 SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES); InsertColumn(0, (LPCTSTR)_T("流程ID"), LVCFMT_LEFT, perLength - 5); InsertColumn(1, (LPCTSTR)_T("呼叫ID"), LVCFMT_LEFT, perLength); InsertColumn(2, (LPCTSTR)_T("状态"), LVCFMT_LEFT, perLength); InsertColumn(3, (LPCTSTR)_T("VIP级别"), LVCFMT_LEFT,perLength); InsertColumn(4, (LPCTSTR)_T("座席组"), LVCFMT_LEFT, perLength); InsertColumn(5, (LPCTSTR)_T("主叫号码"), LVCFMT_LEFT, perLength); InsertColumn(6, (LPCTSTR)_T("座席策略"), LVCFMT_LEFT, perLength); } /***************************************************************** **【函数名称】 onTaskStateUpdated **【函数功能】 任务状态变化处理函数 **【参数】 **【返回值】 *****************************************************************/ void CCallList::onCallStateUpdated( int _index ) { Call2Show Info; Info.Index = _index; int Item = __indexItem(_index); if(CAcdCore::GetInstance().getQueueMgr().getCallInfo(Info)) { if(Item != -1) __updateCallState(Item, Info); else __showTask(Info); } else { if (Item != -1) DeleteItem(Item); } } /***************************************************************** **【函数名称】 onCallFinish **【函数功能】 来电结束处理函数 **【参数】 **【返回值】 *****************************************************************/ void CCallList::onCallFinish( int _index ) { int Item = __indexItem(_index); if (Item != -1) DeleteItem(Item); } int CALLBACK CCallList::CompareFunction(LPARAM lParam1, LPARAM lParam2, LPARAM lParamData) { CCallList* pListCtrl = (CCallList*)lParamData; int nItem1 = 0, nItem2 = 0; LVFINDINFO FindInfo; FindInfo.flags = LVFI_PARAM; FindInfo.lParam = lParam1; nItem1 = pListCtrl->FindItem(&FindInfo, -1); FindInfo.lParam = lParam2; nItem2 = pListCtrl->FindItem(&FindInfo, -1); if ((nItem1 == -1) || (nItem2 == -1)) { TRACE("Not find!\n"); return 0; } CString strItem1, strItem2; strItem1 = pListCtrl->GetItemText(nItem1, pListCtrl->m_CurSortColum); strItem2 = pListCtrl->GetItemText(nItem2, pListCtrl->m_CurSortColum); if (pListCtrl->IsColumNumber(strItem1) && pListCtrl->IsColumNumber(strItem2)) // 数字列 { return pListCtrl->m_bSortInc ? atoi(strItem1) - atoi(strItem2)>0 : atoi(strItem1) - atoi(strItem2)<0; } else // 字符串 { return pListCtrl->m_bSortInc ? lstrcmp(strItem1, strItem2) : lstrcmp(strItem2, strItem1); } } void CCallList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; m_CurSortColum = pNMListView->iSubItem; m_bSortInc = !m_bSortInc; SortItems(CompareFunction, (LPARAM)this); *pResult = 0; } BOOL CCallList::IsColumNumber(LPCTSTR pszText) { for (int i = 0; i < lstrlen(pszText); i++) { if (pszText[i] == '.') continue; if (!_istdigit(pszText[i])) return false; } return true; }