#include "stdafx.h" #include "TaskAgentTurnIvr.h" #include "LineHolder.h" #include "LogicLine.h" #include "CtiCore.h" #include "NetworkCti.h" CTaskAgentTurnIvr::CTaskAgentTurnIvr(CPduEntity &PduEntity) : CTask(PduEntity) { } CTaskAgentTurnIvr::~CTaskAgentTurnIvr(void) { } /***************************************************************** **【函数名称】 DoTask **【函数功能】 Task处理 **【参数】 **【返回值】 void ****************************************************************/ BOOL CTaskAgentTurnIvr::DoTask() { // 显示日志 ShowLog(); // 校验 if(!Verify()) return FALSE; // 向底层设备发送转IVR命令 LineOpParam LineOpParam; memset(&LineOpParam, 0, sizeof(LineOpParam)); LineOpParam.nParam1 = LINE_TURN_TO_IVR; LineOpParam.nParam2 = m_pCurrLine->lineId(); LineOpParam.nParam3 = m_CurrCmd.GetDataBool(8) ? 1 : 0; return CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_TURNIVR, m_pCurrLine->assoLine()->lineId(), &LineOpParam); } /***************************************************************** **【函数名称】 Verify **【函数功能】 校验 **【参数】 **【返回值】 BOOL ****************************************************************/ BOOL CTaskAgentTurnIvr::Verify() { // 线路绑定校验 if(!_bindLogicLine(m_CurrCmd.GetDataUInt(1))) return FALSE; // 如果线路在监听状态,则不允许转IVR if (PDU_CMD_AGENT_MONI_LISTEN == m_pCurrLine->opType()) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行座席转IVR任务校验时失败:监听状态下不允许转IVR!"), m_pCurrLine->lineId()); return FALSE; } // 获取关联中继线路 CLogicLine* pAssoLine = m_pCurrLine->assoLine(); ASSERT(pAssoLine != NULL); if(pAssoLine == NULL) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行座席转IVR任务校验时失败:无法获取对应线路"), m_CurrCmd.GetDataUInt(1)); return FALSE; } // 状态校验 if(m_pCurrLine->status() != INNER_STATE_TALKING || pAssoLine->status() != TRUNK_STATE_TALKING) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行座席转IVR任务校验时失败:当前线路状态校验不通过!"), m_pCurrLine->lineId()); return FALSE; } // 解绑座席分机线路 _freeLogicLine(); // 重新绑定座席线路关联的中继线路 if(!_bindLogicLine(pAssoLine->lineId())) return FALSE; // 命令保存信息 m_CurrCmd.SetDataULong(3, m_pCurrLine->callId()); // 获取CallId m_CurrCmd.SetDataUInt(4, m_pCurrLine->lineId()); // 获取外线Id return TRUE; } /***************************************************************** **【函数名称】 ShowLog **【函数功能】 显示日志 **【参数】 **【返回值】 void ****************************************************************/ void CTaskAgentTurnIvr::ShowLog() { // 显示日志 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("AGENT->CTI, CMD = [座席转IVR], \ Exten = %d, IvrFileName = %s"), m_CurrCmd.GetDataUInt(1), m_CurrCmd.GetDataString(6)); } /***************************************************************** **【函数名称】 OnDevOpResult **【函数功能】 底层线路操作结果 **【参数】 **【返回值】 void ****************************************************************/ BOOL CTaskAgentTurnIvr::OnDevOpResult(EventOpResult &EvtInfo) { if(!EvtInfo.bIsSucceed) { // 返回转Ivr失败 _ProcCmdReturn(EvtInfo.bIsSucceed); return TRUE; } else { // 向Ivr发送转Ivr命令 CPduEntity CmdTurnIvr(PDU_CMD_CTI_IVR_TURNIVR); CmdTurnIvr.SetDataULong(2, m_pCurrLine->callId()); // CallId CmdTurnIvr.SetDataString(3, m_pCurrLine->callerNum()); // 主叫 CmdTurnIvr.SetDataString(4, m_pCurrLine->calleeNum()); // 被叫 CmdTurnIvr.SetDataUInt(5, m_pCurrLine->lineId()); // 外线Id CmdTurnIvr.SetDataUInt(6, m_CurrCmd.GetDataUInt(1)); // 分机Id CmdTurnIvr.SetDataUInt(7, m_CurrCmd.GetDataUInt(5)); // IVr节点号 CmdTurnIvr.SetDataString(8, m_CurrCmd.GetDataString(6)); // Ivr文件名 CmdTurnIvr.SetDataString(9, m_CurrCmd.GetDataString(7)); // 随路数据 CmdTurnIvr.SetDataBool(10, m_CurrCmd.GetDataBool(8)); // 是否返回 BOOL bRet = CNetworkCti::GetInstance().send2IVR(CmdTurnIvr); // 发送IVR失败,转IVR失败,外线挂机 if(!bRet) { LineOpParam pLineOpParam; memset(&pLineOpParam,0,sizeof(pLineOpParam)); CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_HANG_UP, m_pCurrLine->lineId(), &pLineOpParam); _ProcCmdReturn(FALSE); } return !bRet; } } /***************************************************************** **【函数名称】 OnCmdOperation **【函数功能】 Task命令处理 **【参数】 成功还是失败 **【返回值】 void ****************************************************************/ BOOL CTaskAgentTurnIvr::OnCmdOperation(CPduEntity &PduEntity) { if(PduEntity.GetCmdType() != PDU_CMD_CTI_IVR_TURNIVR) return FALSE; _ProcCmdReturn(PduEntity.GetDataBool(0)); return TRUE; }