#include "StdAfx.h" #include "CellAudioAndDtmf.h" #include "NetworkIvr.h" #include "IvrFlow.h" #include "FlowDataProvider.h" IMPLEMENT_CELL_AUTOCREATE(CCellAudioAndDtmf, CELL_NAME_AUDIO_AND_DTMF) CCellAudioAndDtmf::CCellAudioAndDtmf(void) { m_PlayType = PLAY_TYPE_AUDIO_DTMF; m_ContentType = PLAY_CONTENT_AUDIO; m_PlayContent = ""; m_TTSNumberMode = 1; m_TTSSpeed = 50; m_TTSVolume = 50; m_TTSEngineID = 0; m_StopPlayWhenKeyPress = PLAY_STOP_WHEN_KEY_PRESS_TRUE; m_MaxKeyCount = 0; m_KeyPressInterval = 1; m_FinishKey = ""; m_KeyVar = ""; m_SuccessPos = 0; m_FailPos = 0; m_HangUpPos = 0; } CCellAudioAndDtmf::CCellAudioAndDtmf( CCellAudioAndDtmf& CellAudioAndDtmf ) : CCellBase(CellAudioAndDtmf) { m_PlayType = CellAudioAndDtmf.m_PlayType; m_ContentType = CellAudioAndDtmf.m_ContentType; m_PlayContent = CellAudioAndDtmf.m_PlayContent; m_TTSNumberMode = CellAudioAndDtmf.m_TTSNumberMode; m_TTSSpeed = CellAudioAndDtmf.m_TTSSpeed; m_TTSVolume = CellAudioAndDtmf.m_TTSVolume; m_TTSEngineID = CellAudioAndDtmf.m_TTSEngineID; m_StopPlayWhenKeyPress = CellAudioAndDtmf.m_StopPlayWhenKeyPress; m_MaxKeyCount = CellAudioAndDtmf.m_MaxKeyCount; m_KeyPressInterval = CellAudioAndDtmf.m_KeyPressInterval; m_FinishKey = CellAudioAndDtmf.m_FinishKey; m_KeyVar = CellAudioAndDtmf.m_KeyVar; m_SuccessPos = CellAudioAndDtmf.m_SuccessPos; m_FailPos = CellAudioAndDtmf.m_FailPos; m_HangUpPos = CellAudioAndDtmf.m_HangUpPos; } CCellAudioAndDtmf::~CCellAudioAndDtmf(void) { } /***************************************************************** **【函数名称】 operate **【函数功能】 节点执行函数 **【参数】 **【返回值】 下一个节点编号 ****************************************************************/ int CCellAudioAndDtmf::operate( void ) { if(m_pIvrFlow == NULL) return CELL_OP_ERROR; CString Info; _getCellInfo(Info); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info); if(m_pIvrFlow->hangUpSign()) { m_pIvrFlow->hangUpSign() = false; ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]取消执行, 检测到外线挂机"), Info); return m_HangUpPos; } CString PlayContent; if(m_PlayType != PLAY_TYPE_DTMF) { // 替换播放内容中的变量 if(!m_pIvrFlow->replaceVar(m_PlayContent, PlayContent)) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换播放内容中的变量失败, PlayContent = %s"), Info, PlayContent); return m_FailPos; } } // 让CTI放音收号的打包 CPduEntity cmdPlay(PDU_CMD_IVR_PLAY_DTMF); cmdPlay.SetDataInt(1, m_pIvrFlow->id()); // Ivr流程Id cmdPlay.SetDataInt(4, m_PlayType); // 放音模式 cmdPlay.SetDataInt(5, m_ContentType); // 放音内容类型 cmdPlay.SetDataInt(6, m_TTSNumberMode); // 数字播报方式 cmdPlay.SetDataInt(7, m_TTSEngineID); // 引擎音库类型 cmdPlay.SetDataInt(8, m_TTSSpeed); // 语速 cmdPlay.SetDataInt(9, m_TTSVolume); // 音大小 cmdPlay.SetDataInt(10, m_MaxKeyCount); // 收号位数 cmdPlay.SetDataString(11, m_FinishKey); // 结束标志 cmdPlay.SetDataInt(12, m_KeyPressInterval); // 收号时间间隔 cmdPlay.SetDataInt(13, m_StopPlayWhenKeyPress); // 收号时,是否放音 cmdPlay.SetDataString(15, PlayContent); // 放音内容 // 向CTI发送命令 if( !CNetworkIvr::GetInstance().send(cmdPlay)) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 向CTI发送消息失败"), Info); return CELL_OP_SEND_ERROR; } return CELL_OP_WAIT_FOR; } /***************************************************************** **【函数名称】 copy **【函数功能】 拷贝自身 **【参数】 **【返回值】 拷贝副本 ****************************************************************/ CCellBase * CCellAudioAndDtmf::copy( void ) { CCellBase * pCellBase = new CCellAudioAndDtmf(*this); return pCellBase; } /***************************************************************** **【函数名称】 fillData **【函数功能】 节点解析,填充数据 **【参数】 Provider:数据提供器 **【返回值】 成功true,失败false ****************************************************************/ bool CCellAudioAndDtmf::fillData( IFlowDataProvider& Provider ) { CString Data; do { if(!Provider.getData(CELL_ATTRIBUTE_POS, Data)) { Data = _T("节点号"); break; } else { sscanf_s(Data, _T("%d"), &m_Pos); if(m_Pos < 1) { Data = _T("节点号"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_PLAY_TYPE, Data)) { Data = _T("执行类型"); break; } else { sscanf_s(Data, _T("%d"), &m_PlayType); if(m_PlayType < PLAY_TYPE_AUDIO_DTMF || m_PlayType > PLAY_TYPE_DTMF) { Data = _T("执行类型"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_CONTENT_TYPE, Data)) { Data = _T("内容类型"); break; } else { sscanf_s(Data, _T("%d"), &m_ContentType); if(m_ContentType < PLAY_CONTENT_NULL || m_ContentType > PLAY_CONTENT_TTS_FILE) { Data = _T("内容类型"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_CONTENT, m_PlayContent)) { Data = _T("放音内容"); break; } if(!Provider.getData(CELL_ATTRIBUTE_TTS_NUM_MODE, Data)) { Data = _T("TTS数字播放格式"); break; } else { sscanf_s(Data, _T("%d"), &m_TTSNumberMode); if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE) && (m_TTSNumberMode < TTS_RN_AUTO_VALUE || m_TTSNumberMode > TTS_RN_AUTO_DIGIT)) { Data = _T("TTS数字播放格式"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_TTS_SPEED, Data)) { Data = _T("TTS语速"); break; } else { sscanf_s(Data, _T("%d"), &m_TTSSpeed); if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE) && (m_TTSSpeed < TTS_NUMBER_VALUE_MIN || m_TTSSpeed > TTS_NUMBER_VALUE_MAX)) { Data = _T("TTS语速"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_TTS_VOLUME, Data)) { Data = _T("TTS音量"); break; } else { sscanf_s(Data, _T("%d"), &m_TTSVolume); if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE) && (m_TTSVolume < TTS_NUMBER_VALUE_MIN || m_TTSVolume > TTS_NUMBER_VALUE_MAX)) { Data = _T("TTS音量"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_TTS_ENGINE, Data)) { Data = _T("TTS引擎"); break; } else { sscanf_s(Data, _T("%d"), &m_TTSEngineID); if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE) && m_TTSEngineID < TTS_NUMBER_VALUE_MIN) { Data = _T("TTS引擎"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_STOP_WHEN_DTMF, Data)) { Data = _T("按键停止放音标志"); break; } else { sscanf_s(Data, _T("%d"), &m_StopPlayWhenKeyPress); if(m_StopPlayWhenKeyPress != PLAY_STOP_WHEN_KEY_PRESS_TRUE && m_StopPlayWhenKeyPress != PLAY_STOP_WHEN_KEY_PRESS_FALSE) { Data = _T("按键停止放音标志"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_MAX_KEY_COUNT, Data)) { Data = _T("最大收按键数"); break; } else { sscanf_s(Data, _T("%d"), &m_MaxKeyCount); if(m_MaxKeyCount < 0) { Data = _T("最大收按键数"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_KEY_PRESS_INTERVAL, Data)) { Data = _T("收按键间隔"); break; } else { sscanf_s(Data, _T("%d"), &m_KeyPressInterval); if(m_KeyPressInterval < 0) { Data = _T("收按键间隔"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_FINISH_KEY, m_FinishKey)) { Data = _T("收按键结束键"); break; } if(!Provider.getData(CELL_ATTRIBUTE_KEY_VAR, m_KeyVar)) { Data = _T("收按键变量"); break; } if(!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data)) { Data = _T("成功跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_SuccessPos); if(m_SuccessPos < 1) { Data = _T("成功跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data)) { Data = _T("失败跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_FailPos); if(m_FailPos < 1) { Data = _T("失败跳转节点"); break; } } if(!Provider.getData(CELL_ATTRIBUTE_HANGUP_POS, Data)) { Data = _T("挂机跳转节点"); break; } else { sscanf_s(Data, _T("%d"), &m_HangUpPos); if(m_HangUpPos < 1) { Data = _T("挂机跳转节点"); break; } } Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note); return true; } while (false); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_AUDIO_AND_DTMF, Data); return false; } /***************************************************************** **【函数名称】 onOpResultReturn **【函数功能】 处理PDU命令 **【参数】 a_pPduEntity:PDU命令 **【返回值】 下一个节点编号 ****************************************************************/ int CCellAudioAndDtmf::onOpResultReturn( CPduEntity *a_pPduEntity ) { CString Info; _getCellInfo(Info); //放音收号的返回结果 if(a_pPduEntity->GetIsExecReturn() && a_pPduEntity->GetCmdType() == PDU_CMD_IVR_PLAY_DTMF) { // 放音收号成功 if(a_pPduEntity->GetDataBool(0)) { if(m_PlayType != PLAY_TYPE_AUDIO) // 放音收号或只收号 { CString strDtmf = a_pPduEntity->GetDataString(16); if(!strDtmf.IsEmpty()) m_pIvrFlow->addVar(m_KeyVar, strDtmf); ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行成功, DTMF = %s"), Info, strDtmf); } else // 放音或收号 { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行成功"), Info); } return m_SuccessPos; } else { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 节点[%s]执行失败"), Info); return m_FailPos; } } // 挂机命令 if(a_pPduEntity->GetCmdType() == PDU_CMD_CTI_IVR_HANGUP) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}; 节点[%s]取消执行, 收到挂机消息"), Info); return m_HangUpPos; } return CELL_OP_ERROR; }