中间件底层,websocket

CellAudioAndDtmf.cpp 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. #include "StdAfx.h"
  2. #include "CellAudioAndDtmf.h"
  3. #include "NetworkIvr.h"
  4. #include "IvrFlow.h"
  5. #include "FlowDataProvider.h"
  6. #include "IvrCore.h"
  7. IMPLEMENT_CELL_AUTOCREATE(CCellAudioAndDtmf, CELL_NAME_AUDIO_AND_DTMF)
  8. CCellAudioAndDtmf::CCellAudioAndDtmf(void)
  9. {
  10. m_PlayType = PLAY_TYPE_AUDIO_DTMF;
  11. m_ContentType = PLAY_CONTENT_AUDIO;
  12. m_PlayContent = "";
  13. m_TTSNumberMode = 1;
  14. m_TTSSpeed = 50;
  15. m_TTSVolume = 50;
  16. m_TTSEngineID = 0;
  17. m_StopPlayWhenKeyPress = PLAY_STOP_WHEN_KEY_PRESS_TRUE;
  18. m_MaxKeyCount = 0;
  19. m_KeyPressInterval = 1;
  20. m_PlayCount = 1;
  21. m_FinishKey = "";
  22. m_KeyVar = "";
  23. m_SuccessPos = 0;
  24. m_FailPos = 0;
  25. m_HangUpPos = 0;
  26. }
  27. CCellAudioAndDtmf::CCellAudioAndDtmf( CCellAudioAndDtmf& CellAudioAndDtmf ) : CCellBase(CellAudioAndDtmf)
  28. {
  29. m_PlayType = CellAudioAndDtmf.m_PlayType;
  30. m_ContentType = CellAudioAndDtmf.m_ContentType;
  31. m_PlayContent = CellAudioAndDtmf.m_PlayContent;
  32. m_TTSNumberMode = CellAudioAndDtmf.m_TTSNumberMode;
  33. m_TTSSpeed = CellAudioAndDtmf.m_TTSSpeed;
  34. m_TTSVolume = CellAudioAndDtmf.m_TTSVolume;
  35. m_TTSEngineID = CellAudioAndDtmf.m_TTSEngineID;
  36. m_StopPlayWhenKeyPress = CellAudioAndDtmf.m_StopPlayWhenKeyPress;
  37. m_MaxKeyCount = CellAudioAndDtmf.m_MaxKeyCount;
  38. m_KeyPressInterval = CellAudioAndDtmf.m_KeyPressInterval;
  39. m_PlayCount = CellAudioAndDtmf.m_PlayCount;
  40. m_FinishKey = CellAudioAndDtmf.m_FinishKey;
  41. m_KeyVar = CellAudioAndDtmf.m_KeyVar;
  42. m_SuccessPos = CellAudioAndDtmf.m_SuccessPos;
  43. m_FailPos = CellAudioAndDtmf.m_FailPos;
  44. m_HangUpPos = CellAudioAndDtmf.m_HangUpPos;
  45. }
  46. CCellAudioAndDtmf::~CCellAudioAndDtmf(void)
  47. {
  48. }
  49. /*****************************************************************
  50. **【函数名称】 operate
  51. **【函数功能】 节点执行函数
  52. **【参数】
  53. **【返回值】 下一个节点编号
  54. ****************************************************************/
  55. int CCellAudioAndDtmf::operate( void )
  56. {
  57. if(m_pIvrFlow == NULL)
  58. return CELL_OP_ERROR;
  59. CString Info;
  60. _getCellInfo(Info);
  61. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  62. if(m_pIvrFlow->hangUpSign())
  63. {
  64. m_pIvrFlow->hangUpSign() = false;
  65. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]取消执行, 检测到外线挂机"), Info);
  66. return m_HangUpPos;
  67. }
  68. CString PlayContent;
  69. if(m_PlayType != PLAY_TYPE_DTMF)
  70. {
  71. // 替换播放内容中的变量
  72. if(!m_pIvrFlow->replaceVar(m_PlayContent, PlayContent))
  73. {
  74. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 替换播放内容中的变量失败, PlayContent = %s"), Info, PlayContent);
  75. return m_FailPos;
  76. }
  77. }
  78. // 让CTI放音收号的打包
  79. CPduEntity cmdPlay(PDU_CMD_IVR_PLAY_DTMF);
  80. cmdPlay.SetDataInt(1, m_pIvrFlow->id()); // Ivr流程Id
  81. cmdPlay.SetDataInt(4, m_PlayType); // 放音模式
  82. cmdPlay.SetDataInt(5, m_ContentType); // 放音内容类型
  83. cmdPlay.SetDataInt(6, m_TTSNumberMode); // 数字播报方式
  84. cmdPlay.SetDataInt(7, m_TTSEngineID); // 引擎音库类型
  85. cmdPlay.SetDataInt(8, m_TTSSpeed); // 语速
  86. cmdPlay.SetDataInt(9, m_TTSVolume); // 音大小
  87. cmdPlay.SetDataInt(10, m_MaxKeyCount); // 收号位数
  88. cmdPlay.SetDataString(11, m_FinishKey); // 结束标志
  89. cmdPlay.SetDataInt(12, m_KeyPressInterval); // 收号时间间隔
  90. cmdPlay.SetDataInt(13, m_StopPlayWhenKeyPress); // 收号时,是否放音
  91. cmdPlay.SetDataString(15, PlayContent); // 放音内容
  92. cmdPlay.SetDataInt(18, m_PlayCount); // 放音收号时播放次数 2023-03-15
  93. // 向CTI发送命令
  94. if( !CNetworkIvr::GetInstance().send(cmdPlay))
  95. {
  96. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 向CTI发送消息失败"), Info);
  97. return CELL_OP_SEND_ERROR;
  98. }
  99. return CELL_OP_WAIT_FOR;
  100. }
  101. /*****************************************************************
  102. **【函数名称】 copy
  103. **【函数功能】 拷贝自身
  104. **【参数】
  105. **【返回值】 拷贝副本
  106. ****************************************************************/
  107. CCellBase * CCellAudioAndDtmf::copy( void )
  108. {
  109. CCellBase * pCellBase = new CCellAudioAndDtmf(*this);
  110. return pCellBase;
  111. }
  112. /*****************************************************************
  113. **【函数名称】 fillData
  114. **【函数功能】 节点解析,填充数据
  115. **【参数】 Provider:数据提供器
  116. **【返回值】 成功true,失败false
  117. ****************************************************************/
  118. bool CCellAudioAndDtmf::fillData( IFlowDataProvider& Provider )
  119. {
  120. CString Data;
  121. do
  122. {
  123. if(!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  124. {
  125. Data = _T("节点号");
  126. break;
  127. }
  128. else
  129. {
  130. sscanf_s(Data, _T("%d"), &m_Pos);
  131. if(m_Pos < 1)
  132. {
  133. Data = _T("节点号");
  134. break;
  135. }
  136. }
  137. if(!Provider.getData(CELL_ATTRIBUTE_PLAY_TYPE, Data))
  138. {
  139. Data = _T("执行类型");
  140. break;
  141. }
  142. else
  143. {
  144. sscanf_s(Data, _T("%d"), &m_PlayType);
  145. if(m_PlayType < PLAY_TYPE_AUDIO_DTMF || m_PlayType > PLAY_TYPE_DTMF)
  146. {
  147. Data = _T("执行类型");
  148. break;
  149. }
  150. }
  151. if(!Provider.getData(CELL_ATTRIBUTE_CONTENT_TYPE, Data))
  152. {
  153. Data = _T("内容类型");
  154. break;
  155. }
  156. else
  157. {
  158. sscanf_s(Data, _T("%d"), &m_ContentType);
  159. if(m_ContentType < PLAY_CONTENT_NULL || m_ContentType > PLAY_CONTENT_TTS_FILE)
  160. {
  161. Data = _T("内容类型");
  162. break;
  163. }
  164. }
  165. if(!Provider.getData(CELL_ATTRIBUTE_CONTENT, m_PlayContent))
  166. {
  167. Data = _T("放音内容");
  168. break;
  169. }
  170. if(!Provider.getData(CELL_ATTRIBUTE_TTS_NUM_MODE, Data))
  171. {
  172. Data = _T("TTS数字播放格式");
  173. break;
  174. }
  175. else
  176. {
  177. sscanf_s(Data, _T("%d"), &m_TTSNumberMode);
  178. if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE)
  179. && (m_TTSNumberMode < TTS_RN_AUTO_VALUE || m_TTSNumberMode > TTS_RN_AUTO_DIGIT))
  180. {
  181. Data = _T("TTS数字播放格式");
  182. break;
  183. }
  184. }
  185. if(!Provider.getData(CELL_ATTRIBUTE_TTS_SPEED, Data))
  186. {
  187. Data = _T("TTS语速");
  188. break;
  189. }
  190. else
  191. {
  192. sscanf_s(Data, _T("%d"), &m_TTSSpeed);
  193. if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE)
  194. && (m_TTSSpeed < TTS_NUMBER_VALUE_MIN || m_TTSSpeed > TTS_NUMBER_VALUE_MAX))
  195. {
  196. Data = _T("TTS语速");
  197. break;
  198. }
  199. }
  200. if(!Provider.getData(CELL_ATTRIBUTE_TTS_VOLUME, Data))
  201. {
  202. Data = _T("TTS音量");
  203. break;
  204. }
  205. else
  206. {
  207. sscanf_s(Data, _T("%d"), &m_TTSVolume);
  208. if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE)
  209. && (m_TTSVolume < TTS_NUMBER_VALUE_MIN || m_TTSVolume > TTS_NUMBER_VALUE_MAX))
  210. {
  211. Data = _T("TTS音量");
  212. break;
  213. }
  214. }
  215. if(!Provider.getData(CELL_ATTRIBUTE_TTS_ENGINE, Data))
  216. {
  217. Data = _T("TTS引擎");
  218. break;
  219. }
  220. else
  221. {
  222. sscanf_s(Data, _T("%d"), &m_TTSEngineID);
  223. if((m_ContentType == PLAY_CONTENT_TTS_STR || m_ContentType == PLAY_CONTENT_TTS_FILE) && m_TTSEngineID < TTS_NUMBER_VALUE_MIN)
  224. {
  225. Data = _T("TTS引擎");
  226. break;
  227. }
  228. }
  229. if(!Provider.getData(CELL_ATTRIBUTE_STOP_WHEN_DTMF, Data))
  230. {
  231. Data = _T("按键停止放音标志");
  232. break;
  233. }
  234. else
  235. {
  236. sscanf_s(Data, _T("%d"), &m_StopPlayWhenKeyPress);
  237. if(m_StopPlayWhenKeyPress != PLAY_STOP_WHEN_KEY_PRESS_TRUE && m_StopPlayWhenKeyPress != PLAY_STOP_WHEN_KEY_PRESS_FALSE)
  238. {
  239. Data = _T("按键停止放音标志");
  240. break;
  241. }
  242. }
  243. if(!Provider.getData(CELL_ATTRIBUTE_MAX_KEY_COUNT, Data))
  244. {
  245. Data = _T("最大收按键数");
  246. break;
  247. }
  248. else
  249. {
  250. sscanf_s(Data, _T("%d"), &m_MaxKeyCount);
  251. if(m_MaxKeyCount < 0)
  252. {
  253. Data = _T("最大收按键数");
  254. break;
  255. }
  256. }
  257. if(!Provider.getData(CELL_ATTRIBUTE_KEY_PRESS_INTERVAL, Data))
  258. {
  259. Data = _T("收按键间隔");
  260. break;
  261. }
  262. else
  263. {
  264. sscanf_s(Data, _T("%d"), &m_KeyPressInterval);
  265. if(m_KeyPressInterval < 0)
  266. {
  267. Data = _T("收按键间隔");
  268. break;
  269. }
  270. }
  271. if(!Provider.getData(CELL_ATTRIBUTE_FINISH_KEY, m_FinishKey))
  272. {
  273. Data = _T("收按键结束键");
  274. break;
  275. }
  276. if (!Provider.getData(CELL_ATTRIBUTE_KEY_VAR, m_KeyVar))
  277. {
  278. Data = _T("收按键变量");
  279. break;
  280. }
  281. if (!Provider.getData(CELL_ATTRIBUTE_KEY_PLAY_COUNT, Data))
  282. {
  283. Data = _T("询问按键次数");
  284. m_PlayCount = 1; // 默认1
  285. //break;
  286. }
  287. else {
  288. sscanf_s(Data, _T("%d"), &m_PlayCount);
  289. if (m_PlayCount <= 0) {
  290. m_PlayCount = 1;
  291. }
  292. }
  293. if(!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  294. {
  295. Data = _T("成功跳转节点");
  296. break;
  297. }
  298. else
  299. {
  300. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  301. if(m_SuccessPos < 1)
  302. {
  303. Data = _T("成功跳转节点");
  304. break;
  305. }
  306. }
  307. if(!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  308. {
  309. Data = _T("失败跳转节点");
  310. break;
  311. }
  312. else
  313. {
  314. sscanf_s(Data, _T("%d"), &m_FailPos);
  315. if(m_FailPos < 1)
  316. {
  317. Data = _T("失败跳转节点");
  318. break;
  319. }
  320. }
  321. if(!Provider.getData(CELL_ATTRIBUTE_HANGUP_POS, Data))
  322. {
  323. Data = _T("挂机跳转节点");
  324. break;
  325. }
  326. else
  327. {
  328. sscanf_s(Data, _T("%d"), &m_HangUpPos);
  329. if(m_HangUpPos < 1)
  330. {
  331. Data = _T("挂机跳转节点");
  332. break;
  333. }
  334. }
  335. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  336. return true;
  337. } while (false);
  338. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_AUDIO_AND_DTMF, Data);
  339. return false;
  340. }
  341. /*****************************************************************
  342. **【函数名称】 onOpResultReturn
  343. **【函数功能】 处理PDU命令
  344. **【参数】 a_pPduEntity:PDU命令
  345. **【返回值】 下一个节点编号
  346. ****************************************************************/
  347. int CCellAudioAndDtmf::onOpResultReturn( CPduEntity *a_pPduEntity )
  348. {
  349. CString Info;
  350. _getCellInfo(Info);
  351. //放音收号的返回结果
  352. if(a_pPduEntity->GetIsExecReturn() && a_pPduEntity->GetCmdType() == PDU_CMD_IVR_PLAY_DTMF)
  353. {
  354. // 放音收号成功
  355. if(a_pPduEntity->GetDataBool(0))
  356. {
  357. if(m_PlayType != PLAY_TYPE_AUDIO) // 放音收号或只收号
  358. {
  359. CString strDtmf = a_pPduEntity->GetDataString(16);
  360. if(!strDtmf.IsEmpty())
  361. m_pIvrFlow->addVar(m_KeyVar, strDtmf);
  362. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行成功, DTMF = %s"), Info, strDtmf);
  363. }
  364. else // 放音或收号
  365. {
  366. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行成功"), Info);
  367. }
  368. return m_SuccessPos;
  369. }
  370. else
  371. {
  372. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 节点[%s]执行失败"), Info);
  373. return m_FailPos;
  374. }
  375. }
  376. // 挂机命令
  377. if(a_pPduEntity->GetCmdType() == PDU_CMD_CTI_IVR_HANGUP)
  378. {
  379. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}; 节点[%s]取消执行, 收到挂机消息"), Info);
  380. return m_HangUpPos;
  381. }
  382. return CELL_OP_ERROR;
  383. }