#include "OpAutoCall.h" #include "VirtualChan.h" #include "OperationReactor.h" #include "FsProxy.h" COpAutoCall::COpAutoCall(COperationReactor * pParent, long Instance) : COperation(pParent, Instance) { } COpAutoCall::~COpAutoCall(void) { } bool COpAutoCall::start(LineOpParam * pParam) { // 保存主被叫号码 m_CallerNum = pParam->szParam1; // 分机 主叫 m_CalleeNum = pParam->szParam2; // 被叫 m_CallerAgent = pParam->nParam1; // 分机对应的坐席 int taskId = pParam->nParam3; // 任务id int callType = pParam->nParam2; // 自动外呼任务类型 // 启动日志 LOG_INFO("{OpAutoCall}: 执行自动外呼, AgentID = %s, CallerNum = %s, CalleeNum = %s", m_CallerAgent.c_str(), m_CallerNum.c_str(), m_CalleeNum.c_str()); return CFsProxy::GetInstance().AutoCall(uniqueId() , m_CallerNum, m_CalleeNum, callType, taskId); } bool COpAutoCall::hangup(long InstanceHangup) { // 外呼取消日志 LOG_INFO("{OpAutoCall}: 中继自动呼叫中挂机, TrunkNo = %lu, DestNum = %s", m_pHostChan->no(), m_CalleeNum.c_str()); if (m_pHostChan == nullptr) return false; m_InstanceCancel = InstanceHangup; return CFsProxy::GetInstance().kill(uniqueId(), m_pHostChan); } void COpAutoCall::onBackgroudJobDone(PBG_JOB_NOTIFY pNotify) { if (pNotify->JobCmd == ESL_CMD_MAKE_CALL) { if(pNotify->JobBody.find(ESL_JOB_DONE_RES_OK) ==string::npos) _end(false); } } //void COpAutoCall::onAssoChanStateUpdated(VirtualChan * pAssoChan) //{ // if (m_pHostChan == nullptr) // { // attachHostChan(pAssoChan); // onHostChanStateUpdated(pAssoChan); // } //} void COpAutoCall::onHostChanStateUpdated(VirtualChan * pHostChan) { switch ((int)pHostChan->state()) { case CHAN_LOGIC_STATE_RING_BACK: m_pParent->onOpProcess(m_Instance, pHostChan->no(), pHostChan->no(), pHostChan->type(), pHostChan->callerNum(), pHostChan->calleeNum()); break; case CHAN_LOGIC_STATE_STANDBY: _end(true); break; case CHAN_LOGIC_STATE_FREE: _end(false); break; } } void COpAutoCall::_end(bool IsSucceed) { uint32_t TrunkNo = 0; if (m_pHostChan != nullptr) TrunkNo = m_pHostChan->no(); if (IsSucceed) { LOG_INFO("{OpAutoCall}: 中继自动外呼成功, TrunkNo = %lu, DestNum = %s", TrunkNo, m_CalleeNum.c_str()); } else { LOG_WARN("{OpAutoCall}: 中继自动外呼失败, TrunkNo = %lu, DestNum = %s", TrunkNo, m_CalleeNum.c_str()); } // 返回执行结果 if (m_InstanceCancel != FS_LINK_INSTANCE_INVALID) m_pParent->onOpResult(m_InstanceCancel, !IsSucceed); m_pParent->onOpResult(m_Instance, this, IsSucceed, std::to_string(TrunkNo)); }