商丘数字城管中间件 - 测试用

LogicLineExt.cpp 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. #include "StdAfx.h"
  2. #include "LogicLineExt.h"
  3. #include "CallSession.h"
  4. #include "SessionHolder.h"
  5. #include "StatisticsMgr.h"
  6. #include "NetworkCti.h"
  7. #include "CtiCore.h"
  8. CLogicLineExt::CLogicLineExt(UINT ResId) : CLogicLine(ResId), m_AgentId(0), m_FinalExt(0), m_AssoLineType(0), m_HoldRecordFile(_T(""))
  9. {
  10. m_LineStatus = INNER_STATE_FREE;
  11. }
  12. CLogicLineExt::~CLogicLineExt(void)
  13. {
  14. }
  15. /*****************************************************************
  16. **【函数名称】 __telephoneNumBelongsTo
  17. **【函数功能】 获取归属地信息
  18. **【参数】 Number: 来电号码
  19. BelongsTo:输出参数,归属地
  20. **【返回值】
  21. ****************************************************************/
  22. void CLogicLineExt::__telephoneNumBelongsTo( const CString& Number, CString& BelongsTo )
  23. {
  24. // 去掉出局号码进行查询归属地
  25. // Number= Number.Right(Number.GetLength()-1); //屏蔽出局号,该行代码在测试环境中使用
  26. CString SqlFunc = _T("charindex"); // MS SQL SERVER 字符串匹配函数
  27. if(DB_MySQL == IOtlConnection::getInstance()->GetDatabaseType())
  28. SqlFunc = _T("locate"); // MYSQL 字符串匹配函数
  29. CString SQL;
  30. SQL.Format("select * from conf_phone where %s(rtrim(number),'%s') in (1,2)", SqlFunc, Number);
  31. IOtlRecordset* pRD = IOtlConnection::getInstance()->QueryRecords(SQL);
  32. if (NULL == pRD ) //判断空值
  33. return;
  34. if (pRD->IsEOF())
  35. {
  36. IOtlRecordset::DestroyInstance(pRD); // 释放记录集
  37. return;
  38. }
  39. CString Province = _T("");
  40. CString City = _T("");
  41. CString Type = _T("");
  42. while(!pRD->IsEOF())
  43. {
  44. pRD->MoveNextRow();
  45. Province = pRD->GetValueStr(_T("Province"));
  46. City = pRD->GetValueStr(_T("City"));
  47. Type = pRD->GetValueStr(_T("Type"));
  48. }
  49. IOtlRecordset::DestroyInstance(pRD); // 释放记录集
  50. BelongsTo = Province.Trim() + _T("-") + City.Trim() + _T("-") + Type.Trim();
  51. }
  52. /*****************************************************************
  53. **【函数名称】 resetLine
  54. **【函数功能】 线路重置
  55. **【参数】
  56. **【返回值】
  57. ****************************************************************/
  58. void CLogicLineExt::resetLine()
  59. {
  60. // 清除线路信息
  61. m_FinalExt = 0;
  62. m_AssoLineType = 0;
  63. m_HoldRecordFile = "";
  64. CLogicLine::resetLine();
  65. }
  66. /*****************************************************************
  67. **【函数名称】 pushLineData2ACD
  68. **【函数功能】 将线路数据发送给ACD
  69. **【参数】
  70. **【返回值】
  71. ****************************************************************/
  72. void CLogicLineExt::pushLineData2ACD()
  73. {
  74. // 通过会话获取线路信息
  75. CString Data = _T("");
  76. CCallSession* pSession = CSessionHolder::GetInstance().findSession(m_CallId);
  77. if(pSession != NULL)
  78. {
  79. // 获取随路数据
  80. Data = pSession->data();
  81. // 获取对端线路类型
  82. CLogicLine* pAssoLine = pSession->getAssoLine(this);
  83. if(pAssoLine != NULL)
  84. {
  85. m_AssoLineType = pAssoLine->type();
  86. //2018.5.19分机外线判定
  87. if (m_AssoLineType == DEV_RES_TYPE_VOIP) {
  88. m_AssoLineType = pAssoLine->typeExtTrunk();
  89. }
  90. }
  91. // ych
  92. if (m_LineStatus == INNER_STATE_FREE)
  93. {
  94. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Line}: 当前会话[%d]线路数:%d"), m_CallId,pSession->lineCount());
  95. if (pSession->lineCount() == 2 && m_AssoLineType == DEV_RES_TYPE_TRUNK) // 对端线路是外线
  96. {
  97. CCtiCore::GetInstance().getDevLink().exec((long)-1, LINE_OP_HANG_UP, pAssoLine->lineId(), NULL);
  98. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{Line}: 座席分机挂机,挂断关联中继线路"));
  99. }
  100. }
  101. }
  102. // 发送线路状态变化信息到ACD
  103. CPduEntity Cmd(PDU_CMD_CTI_LINE_STATE);
  104. Cmd.SetDataUInt(0, m_LineId);
  105. Cmd.SetDataUInt(1, m_LineStatus);
  106. Cmd.SetDataULong(2, (m_CallId == 0 ? m_HoldCallId : m_CallId));
  107. Cmd.SetDataUInt(3, m_AgentId);
  108. Cmd.SetDataString(4, m_CallerNum);
  109. Cmd.SetDataString(5, m_CalleeNum);
  110. Cmd.SetDataString(6, Data);
  111. Cmd.SetDataUInt(7, m_AssoLineType);
  112. //if (m_LineStatus == INNER_STATE_ALERTING) //分机振铃事件才送归属地
  113. //{
  114. // CString NumberBelongsTo = _T("");
  115. // __telephoneNumBelongsTo(m_CallerNum, NumberBelongsTo);
  116. // ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("{Line}: 坐席线路来电振铃,来电归属地:%s"), NumberBelongsTo);
  117. // Cmd.SetDataString(8, NumberBelongsTo);
  118. //}
  119. Cmd.SetDataUInt(9, m_FinalExt);
  120. Cmd.SetDataUInt(10,m_CurrentOpType); // 传入当前线路操作类型
  121. Cmd.SetDataInt(11,m_ActionID);
  122. CNetworkCti::GetInstance().send2ACD(Cmd);
  123. }
  124. /*****************************************************************
  125. **【函数名称】 pushRecord2ACD
  126. **【函数功能】 将录音数据发送给ACD
  127. **【参数】
  128. **【返回值】
  129. ****************************************************************/
  130. void CLogicLineExt::pushRecord2ACD()
  131. {
  132. // 向ACD发送录音文件名
  133. CPduEntity Pdu(PDU_CMD_CTI_RECORD);
  134. Pdu.SetDataUInt(0, m_LineId);
  135. Pdu.SetDataULong(1, m_CallId);
  136. Pdu.SetDataString(2, m_RecordFile);
  137. CNetworkCti::GetInstance().send2ACD(Pdu);
  138. // 显示日志
  139. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("CTI->AGENT, PDU = [线路录音信息], Exten = %d, Agent = %d, RecordFile = %s"),
  140. m_LineId, m_AgentId, m_RecordFile);
  141. }
  142. /*****************************************************************
  143. **【函数名称】 onLineStatusUpdated
  144. **【函数功能】 处理线路状态变化
  145. **【参数】 EvtInfo: 线路资源状态
  146. **【返回值】
  147. ****************************************************************/
  148. void CLogicLineExt::onLineStatusUpdated( const EventResStatus &EvtInfo )
  149. {
  150. if(m_LineStatus == EvtInfo.nState)
  151. return;
  152. // 保持处理
  153. if(m_HoldCallId == 0 && (EvtInfo.nState & HELD_STATE_MASK) == INNER_STATE_HELD)
  154. {
  155. m_HoldCallId = m_CallId;
  156. m_CallId = 0;
  157. m_HoldRecordFile = m_RecordFile;
  158. }
  159. // 接回处理
  160. if(m_HoldCallId != 0 && (EvtInfo.nState & HELD_STATE_MASK) != INNER_STATE_HELD)
  161. {
  162. m_CallId = m_HoldCallId;
  163. m_HoldCallId = 0;
  164. m_RecordFile = m_HoldRecordFile;
  165. }
  166. // 保存线路信息
  167. m_LineStatus = EvtInfo.nState;
  168. m_CallerNum = EvtInfo.szCallerNum;
  169. m_CalleeNum = EvtInfo.szCalleeNum;
  170. ILogger::getInstance().log(LOG_CLASS_DEV, LOG_LEVEL_NORMAL, _T("{LogicLineExt}: 线路状态, LineId = %lu,State=%d,CallId=%lu,Caller=%s,Callee=%s"), m_LineId, m_LineStatus, m_CallId, m_CallerNum, m_CalleeNum);
  171. // 统计线路状态变化
  172. _reportLineStatus();
  173. //获取内线呼入类型
  174. m_FinalExt = CStatisticsMgr::GetInstance().getFinalExt(m_CallId);
  175. // 发送线路状态变化信息到ACD(只有分机线路)
  176. pushLineData2ACD();
  177. // 通知会话状态变化,保持会话(m_nHoldCallId)不再通知
  178. CSessionHolder::GetInstance().onLineStatusUpdated(this);
  179. }