本文基于freeswitch的ACD算法之精简透析,并非讲解fs自带的ACD排队,而是作者多年工作经验,首创并且研制的基于c++ STL模板基础上的ACD算法。之所以称之为精简,在于算法简介,代码量少、运算速度快;透析在于,不依赖于freeswitch本身,灵活度大,比如此套ACD算法除了应用于freeswitch软交换外,还可广泛应用于AVAYA、CISCO、ALCATEL等交换系统。
主要实现以下几种算法:
free_time_type:按空闲平均算法,即哪个坐席最先空闲,则此坐席接电话
total_talk_time_type:平均通话时间算法,即某个时间段内,哪个坐席通话时间最少,则此坐席接电话
loop_type:轮询算法(此算法不在此处展现)
tel_num_type:电话个数平均算法,即某个时间段内,哪个坐席接的电话数量少,则此坐席接电话。
skill_value_type:按技能值排队算法,即哪个坐席的技能值越大,则此坐席接电话。
主要由CSortPm类构成,此CSortPm即实现了ACD的排队算法。
以下对类进行说明
#ifndef _SORT_PM_H_
#define _SORT_PM_H_
#include "queue.h"
class CSortPm
{
public:
CSortPm(PMONIEXT pM, int iGrpNo);
virtual ~CSortPm();
public:
bool operator < (const CSortPm &rh) const;
public:
PMONIEXT m_pM;
private:
int m_iGrpNo;
};
#endif
简要说明:
(1)、构造函数:CSortPm(PMONIEXT pM, int iGrpNo);
pM:组的信息,此组里面包含了坐席工号、分机号等信息
iGrpNo:组号,可根据iGrpNo查找到组信息pM
(2)、bool operator < (const CSortPm &rh) const;
关键的函数,ACD排队的算法排队
#include "SortPm.h"
#include "QueProc.h"
extern CQueProc g_QueProc;
CSortPm::CSortPm(PMONIEXT pM, int iGrpNo)
{
m_iGrpNo = iGrpNo;
m_pM = pM;
}
CSortPm::~CSortPm()
{
}
bool CSortPm::operator < (const CSortPm &rh ) const
{
try
{
bool bResult = false;
PGRPAGENT pGA = g_QueProc.m_GroupAgentMap.Find( m_iGrpNo );
if( pGA == NULL )
return bResult;
switch( pGA->iACDType )
{
case free_time_type://空闲平均
bResult = m_pM->lFreeTime < rh.m_pM->lFreeTime ? true : false;
break;
case total_talk_time_type://通话时间平均
bResult = m_pM->lTotalTalkTime < rh.m_pM->lTotalTalkTime ? true : false;
break;
case loop_type://轮询
bResult = true;
break;
case tel_num_type://电话个数平局
bResult = m_pM->lTelNum < rh.m_pM->lTelNum ? true : false;
break;
case skill_value_type://技能值优先
bResult = m_pM->iSkillValue < rh.m_pM->iSkillValue ? true : false;
break;
default:
bResult = true;
break;
}
return bResult;
}
catch(...)
{
}
return false;
}
简要说明:
bool CSortPm::operator < (const CSortPm &rh ) const
ACD排队算法实现的函数。
这里实现了基本的几种算法
free_time_type:按空闲平均算法,即哪个坐席最先空闲,则此坐席接电话
total_talk_time_type:平均通话时间算法,即某个时间段内,哪个坐席通话时间最少,则此坐席接电话
loop_type:轮询算法(此算法不在此处展现)
tel_num_type:电话个数平均算法,即某个时间段内,哪个坐席接的电话数量少,则此坐席接电话。
skill_value_type:按技能值排队算法,即哪个坐席的技能值越大,则此坐席接电话。
m_sortPmMap.Lock();
//根据组号找到组的信息
vector<CSortPm> *pStPmList = m_sortPmMap.Find( pGA->iGrpNo );
if( pStPmList != NULL )
{
//利用sort函数,给组排序
sort( pStPmList->begin(), pStPmList->end() );
//以下就是排序后的结果
vector<CSortPm>::iterator it;
for(it = pStPmList->begin(); it != pStPmList->end(); ++it )
{
CSortPm StPm = *it;
//取出组中的第一个信息
//再判断此坐席是否登录状态和空闲状态,如果是把电话分配给此坐席,若果不是则继续
}
}
m_sortPmMap.Unlock();
简要说明:
//根据组号找到组的信息:vector< CSortPm > *pStPmList
vector< CSortPm > *pStPmList = m_sortPmMap.Find( pGA->iGrpNo );
//利用sort函数,给组排序,sort函数为STL中的标准函数
sort( pStPmList->begin(), pStPmList->end() );
//以下就是排序后的结果
vector< CSortPm >::iterator it;
for(it = pStPmList->begin(); it != pStPmList->end(); ++it )
{
CSortPm StPm = *it;
//依次取出组中的信息
//再判断此坐席是否登录状态和空闲状态,如果是把电话分配给此坐席,若果不是则继续
}
本文实现了主要·的ACD排队算法,其他诸如还有溢出组算法、VIP算法、插队算法等可以通过结合IVR的方式来实现。
大家如果对此算法感兴趣或觉得此算法对于自己的项目开发正好有用,欢迎在评论区留言,根据留言情况,后续会链接上源代码以供大家参考。
欢迎大家一起踊跃探讨!以上如有不正支出,欢迎指教~