华辉中间件项目(代码服务器上没有,用杨成电脑的源代码上传的)

LogicLineExt.cpp 6.9KB

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