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

CTaskIvrHoldOn.cpp 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "stdafx.h"
  2. #include "CTaskIvrHoldOn.h"
  3. #include "LineHolder.h"
  4. #include "LogicLine.h"
  5. #include "SessionHolder.h"
  6. #include "CallSession.h"
  7. #include "CtiCore.h"
  8. #include "NetworkCti.h"
  9. CTaskIvrHoldOn::CTaskIvrHoldOn(CPduEntity &PduEntity) : CTask(PduEntity)
  10. {
  11. }
  12. CTaskIvrHoldOn::~CTaskIvrHoldOn(void)
  13. {
  14. }
  15. BOOL CTaskIvrHoldOn::DoTask()
  16. {
  17. // 校验
  18. if (!Verify()) return FALSE;
  19. // 设置当前操作类型
  20. m_pCurrLine->opType() = PDU_CMD_IVR_TURN_HOLDON;
  21. // 保存随路数据
  22. CCallSession* pSession = CSessionHolder::GetInstance().findSession(m_pCurrLine->callId());
  23. if (pSession != NULL)
  24. pSession->data() = m_CurrCmd.GetDataString(5);
  25. // 向底层设备发送转人工命令
  26. LineOpParam pLineOpParam;
  27. memset(&pLineOpParam, 0, sizeof(pLineOpParam));
  28. lstrcpy(pLineOpParam.szParam1, m_pCurrLine->callerNum());
  29. sprintf_s(pLineOpParam.szParam2, PHONE_NUM_LEN, "%u", m_CurrCmd.GetDataUInt(4));
  30. pLineOpParam.nParam2 = DEV_RES_TYPE_TRUNK;
  31. //呼叫之前执行会话处理 将CallID赋值给LogiclineExt //tj
  32. _PrcoCallNode(m_pCurrLine->lineId(), m_CurrCmd.GetDataUInt(4));
  33. //2019-09-11 颐和随访 转的是内线分机资源
  34. //2019-09-11 颐和随访项目
  35. CPduEntity cmdTurnAgent(PDU_CMD_IVR_TURN_HOLDON);
  36. // by 在转分机的时候使用中继通道,让ivr执行播放保持音,再呼叫分机
  37. bool b = CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_HOLD, m_pCurrLine->lineId(), &pLineOpParam);
  38. if (b == TRUE)
  39. {
  40. return b;
  41. }
  42. else
  43. {
  44. CPduEntity cmdholdon(PDU_CMD_IVR_TURN_HOLDON);
  45. cmdholdon.SetDataInt(0, false);
  46. CNetworkCti::GetInstance().send2IVR(cmdholdon);
  47. return FALSE;
  48. }
  49. }
  50. BOOL CTaskIvrHoldOn::Verify()
  51. {
  52. // 底层的呼叫转移命令的实现
  53. CString Info = "412";
  54. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{CTaskIvrHoldOn}: 执行到CTaskIvrHoldOn[%s]"), Info);
  55. // 线路绑定校验
  56. if (!_bindLogicLine(m_CurrCmd.GetDataUInt(3)))
  57. return FALSE;
  58. // 座席线路是否存在
  59. CLogicLine* pExtn = CLineHolder::GetInstance().getLogicLine(m_CurrCmd.GetDataUInt(4));
  60. if (pExtn == NULL)
  61. {
  62. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行IVR转座席任务校验时失败:请求的座席分机[%d]不存在"),
  63. m_pCurrLine->lineId(),
  64. m_CurrCmd.GetDataUInt(4));
  65. return FALSE;
  66. }
  67. // 座席线路是否空闲
  68. if (pExtn->status() != INNER_STATE_FREE)
  69. {
  70. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{Task}: 线路[%d]执行IVR转座席任务校验时失败:请求的座席分机[%d]非空闲"),
  71. m_pCurrLine->lineId(),
  72. pExtn->lineId());
  73. return FALSE;
  74. } // end if
  75. return TRUE;
  76. }
  77. BOOL CTaskIvrHoldOn::OnDevOpResult(EventOpResult &EvtInfo)
  78. {
  79. // 命令返回
  80. _ProcCmdReturn(EvtInfo.bIsSucceed, true);
  81. return TRUE;
  82. }
  83. void CTaskIvrHoldOn::OnDevOpProcess(EventOpProcess & EvtInfo)
  84. {
  85. // 获取对端线路
  86. CLogicLine *pAssoLine = CLineHolder::GetInstance().getLogicLine(EvtInfo.nAssoLine);
  87. if (pAssoLine == NULL) return;
  88. }