MiddleWares_YiHe 郑州颐和医院随访系统中间件

CellHoldOn.cpp 8.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  1. #include "StdAfx.h"
  2. #include "CellHoldOn.h"
  3. #include "NetworkIvr.h"
  4. #include "IvrFlow.h"
  5. #include "FlowDataProvider.h"
  6. IMPLEMENT_CELL_AUTOCREATE(CCellHoldOn, CELL_NAME_HOLD_ON)
  7. CCellHoldOn::CCellHoldOn(void)
  8. {
  9. m_Exten = "";
  10. m_SuccessPos = 0;
  11. m_FailPos = 0;
  12. m_Timeout = 0;
  13. m_TimeoutPos = 0;
  14. m_HangUpPos = 0;
  15. }
  16. CCellHoldOn::CCellHoldOn(CCellHoldOn & cellHoldOn) : CCellBase(cellHoldOn)
  17. {
  18. m_Exten = cellHoldOn.m_Exten;
  19. m_Timeout = cellHoldOn.m_Timeout;
  20. m_SuccessPos = cellHoldOn.m_SuccessPos;
  21. m_TimeoutPos = cellHoldOn.m_TimeoutPos;
  22. m_FailPos = cellHoldOn.m_FailPos;
  23. m_HangUpPos = cellHoldOn.m_HangUpPos;
  24. POSITION pos = cellHoldOn.m_VarList.GetHeadPosition();
  25. while (pos != NULL)
  26. {
  27. CString strValue = cellHoldOn.m_VarList.GetNext(pos);
  28. if (!strValue.IsEmpty())
  29. this->m_VarList.AddTail(strValue);
  30. }
  31. }
  32. CCellHoldOn::~CCellHoldOn(void)
  33. {
  34. }
  35. /*****************************************************************
  36. **【函数名称】 operate
  37. **【函数功能】 节点执行函数
  38. **【参数】
  39. **【返回值】 下一个节点编号
  40. ****************************************************************/
  41. int CCellHoldOn::operate(void)
  42. {
  43. if (m_pIvrFlow == NULL)
  44. return CELL_OP_ERROR;
  45. CString Info;
  46. _getCellInfo(Info);
  47. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 开始执行[%s]"), Info);
  48. if (m_pIvrFlow->hangUpSign())
  49. {
  50. m_pIvrFlow->hangUpSign() = false;
  51. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]取消执行, 检测到外线挂机"), Info);
  52. return m_HangUpPos;
  53. }
  54. // 获取要转移的分机号
  55. CString strExt = "";
  56. if (!m_pIvrFlow->findVarValue(m_Exten, strExt))
  57. {
  58. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 要转移的分机号码为空"), Info);
  59. return CELL_OP_ERROR;
  60. }
  61. // 将需传递给坐席的变量拼成:变量名:变量值|变量名:变量值
  62. CString strVarInfo = _T("");
  63. CString strSingleVarInfo = _T("");
  64. CString strValue = _T("");
  65. CString strVarName = _T("");
  66. POSITION pos = m_VarList.GetHeadPosition();
  67. while (pos != NULL)
  68. {
  69. strVarName = m_VarList.GetNext(pos);
  70. if (!strVarName.IsEmpty() && m_pIvrFlow->findVarValue(strVarName, strValue))
  71. {
  72. strSingleVarInfo.Format(_T("%s:%s|"), strVarName, strValue);
  73. strVarInfo += strSingleVarInfo;
  74. }
  75. }
  76. //2019-09-11 颐和随访,增加座席状态为来电振铃的字段
  77. CPduEntity cmdhold(PDU_CMD_AGENT_HOLD);
  78. cmdhold.SetDataInt(0, true);
  79. //cmdhold.SetDataUInt(1, 1017);
  80. cmdhold.SetDataInt(5, m_pIvrFlow->id());
  81. //cmdhold.SetDataUInt(2, 8000);
  82. cmdhold.SetDataULong(3, m_pIvrFlow->assoCallId());
  83. if (!CNetworkIvr::GetInstance().send(cmdhold))
  84. {
  85. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{Cell}: 执行[%s]出错, 向CTI发送消息失败"), Info);
  86. return CELL_OP_SEND_ERROR;
  87. }
  88. //return CELL_OP_WAIT_FOR;
  89. return m_SuccessPos;
  90. }
  91. /*****************************************************************
  92. **【函数名称】 copy
  93. **【函数功能】 拷贝自身
  94. **【参数】
  95. **【返回值】 拷贝副本
  96. ****************************************************************/
  97. CCellBase * CCellHoldOn::copy(void)
  98. {
  99. CCellBase * pCellBase = new CCellHoldOn(*this);
  100. return pCellBase;
  101. }
  102. /*****************************************************************
  103. **【函数名称】 fillData
  104. **【函数功能】 节点解析,填充数据
  105. **【参数】 Provider:数据提供器
  106. **【返回值】 成功true,失败false
  107. ****************************************************************/
  108. bool CCellHoldOn::fillData(IFlowDataProvider& Provider)
  109. {
  110. /*CString Data;
  111. do
  112. {
  113. if (!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  114. {
  115. Data = _T("节点号");
  116. break;
  117. }
  118. else
  119. {
  120. sscanf_s(Data, _T("%d"), &m_Pos);
  121. if (m_Pos < 1)
  122. {
  123. Data = _T("节点号");
  124. break;
  125. }
  126. }
  127. if (!Provider.getData(CELL_ATTRIBUTE_EXTEN, m_Exten))
  128. {
  129. Data = _T("分机号码");
  130. break;
  131. }
  132. if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  133. {
  134. Data = _T("成功跳转节点");
  135. break;
  136. }
  137. else
  138. {
  139. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  140. if (m_SuccessPos < 1)
  141. {
  142. Data = _T("成功跳转节点");
  143. break;
  144. }
  145. }
  146. if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  147. {
  148. Data = _T("失败跳转节点");
  149. break;
  150. }
  151. else
  152. {
  153. sscanf_s(Data, _T("%d"), &m_FailPos);
  154. if (m_FailPos < 1)
  155. {
  156. Data = _T("失败跳转节点");
  157. break;
  158. }
  159. }
  160. if (!Provider.getData(CELL_ATTRIBUTE_HANGUP_POS, Data))
  161. {
  162. Data = _T("挂机跳转节点");
  163. break;
  164. }
  165. else
  166. {
  167. sscanf_s(Data, _T("%d"), &m_HangUpPos);
  168. if (m_HangUpPos < 1)
  169. {
  170. Data = _T("挂机跳转节点");
  171. break;
  172. }
  173. }
  174. Data.Format(_T("%s[@%s='%d']/%s"), XPATH_CELL, CELL_ATTRIBUTE_POS, m_Pos, FLOW_SUB_NODE_BAND_DATA);
  175. if (!Provider.getDataSet(Data, CELL_ATTRIBUTE_VAR, m_VarList))
  176. {
  177. Data = _T("随路数据变量");
  178. break;
  179. }
  180. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  181. return true;
  182. } while (false);
  183. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_TURN_AGENT, Data);
  184. return false;*/
  185. CString Data;
  186. do
  187. {
  188. if (!Provider.getData(CELL_ATTRIBUTE_POS, Data))
  189. {
  190. Data = _T("节点号");
  191. break;
  192. }
  193. else
  194. {
  195. sscanf_s(Data, _T("%d"), &m_Pos);
  196. if (m_Pos < 1)
  197. {
  198. Data = _T("节点号");
  199. break;
  200. }
  201. }
  202. if (!Provider.getData(CELL_ATTRIBUTE_EXTEN, m_Exten))
  203. {
  204. Data = _T("分机号码");
  205. break;
  206. }
  207. /*if (!Provider.getData(CELL_ATTRIBUTE_TIMEOUT, Data))
  208. {
  209. Data = _T("等待时长");
  210. break;
  211. }
  212. else
  213. {
  214. sscanf_s(Data, _T("%d"), &m_Timeout);
  215. if (m_Timeout < 0)
  216. {
  217. Data = _T("等待时长");
  218. break;
  219. }
  220. }*/
  221. if (!Provider.getData(CELL_ATTRIBUTE_SUCCESS_POS, Data))
  222. {
  223. Data = _T("成功跳转节点");
  224. break;
  225. }
  226. else
  227. {
  228. sscanf_s(Data, _T("%d"), &m_SuccessPos);
  229. if (m_SuccessPos < 1)
  230. {
  231. Data = _T("成功跳转节点");
  232. break;
  233. }
  234. }
  235. if (!Provider.getData(CELL_ATTRIBUTE_FAIL_POS, Data))
  236. {
  237. Data = _T("失败跳转节点");
  238. break;
  239. }
  240. else
  241. {
  242. sscanf_s(Data, _T("%d"), &m_FailPos);
  243. if (m_FailPos < 1)
  244. {
  245. Data = _T("失败跳转节点");
  246. break;
  247. }
  248. }
  249. if (!Provider.getData(CELL_ATTRIBUTE_HANGUP_POS, Data))
  250. {
  251. Data = _T("挂机跳转节点");
  252. break;
  253. }
  254. else
  255. {
  256. sscanf_s(Data, _T("%d"), &m_HangUpPos);
  257. if (m_HangUpPos < 1)
  258. {
  259. Data = _T("挂机跳转节点");
  260. break;
  261. }
  262. }
  263. if (!Provider.getData(CELL_ATTRIBUTE_TIMEOUT_POS, Data))
  264. {
  265. Data = _T("超时跳转节点");
  266. break;
  267. }
  268. else
  269. {
  270. sscanf_s(Data, _T("%d"), &m_TimeoutPos);
  271. if (m_TimeoutPos < 0)
  272. {
  273. Data = _T("超时跳转节点");
  274. break;
  275. }
  276. }
  277. if (!Provider.getData(CELL_ATTRIBUTE_TIMEOUT, Data))
  278. {
  279. Data = _T("等待时长");
  280. break;
  281. }
  282. else
  283. {
  284. sscanf_s(Data, _T("%d"), &m_Timeout);
  285. if (m_Timeout < 0)
  286. {
  287. Data = _T("等待时长");
  288. break;
  289. }
  290. }
  291. /*Data.Format(_T("%s[@%s='%d']/%s"), XPATH_CELL, CELL_ATTRIBUTE_POS, m_Pos, FLOW_SUB_NODE_BAND_DATA);
  292. if(!Provider.getDataSet(Data, CELL_ATTRIBUTE_VAR, m_VarList))
  293. {
  294. Data = _T("随路数据变量");
  295. break;
  296. }*/
  297. Provider.getData(CELL_ATTRIBUTE_NOTE, m_Note);
  298. return true;
  299. } while (false);
  300. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{Cell}: 节点[%s]解析失败, '%s'错误"), CELL_NAME_TURN_AGENT, Data);
  301. return false;
  302. }
  303. /*****************************************************************
  304. **【函数名称】 onOpResultReturn
  305. **【函数功能】 处理PDU命令
  306. **【参数】 a_pPduEntity:PDU命令
  307. **【返回值】 下一个节点编号
  308. ****************************************************************/
  309. int CCellHoldOn::onOpResultReturn(CPduEntity *a_pPduEntity)
  310. {
  311. CString Info;
  312. _getCellInfo(Info);
  313. if (a_pPduEntity->GetIsExecReturn() && a_pPduEntity->GetCmdType() == PDU_CMD_IVR_TURN_HOLDON)
  314. {
  315. if (a_pPduEntity->GetDataBool(0))
  316. {
  317. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行成功"), Info);
  318. return m_SuccessPos;
  319. }
  320. else
  321. {
  322. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}: 节点[%s]执行失败"), Info);
  323. return m_FailPos;
  324. }
  325. }
  326. if (a_pPduEntity->GetCmdType() == PDU_CMD_CTI_IVR_HANGUP)
  327. {
  328. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Cell}; 节点[%s]执行结束, 收到挂机消息"), Info);
  329. return m_HangUpPos;
  330. }
  331. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Cell}: 节点[%s]执行异常, 收到异常PDU"), Info);
  332. return CELL_OP_ERROR;
  333. }