升龙物业 老版本 ocx IPO, 加密狗 转值班电话

CdrExtCallOut.cpp 5.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include "StdAfx.h"
  2. #include "CdrExtCallOut.h"
  3. #include "SqlWriter.h"
  4. CCdrExtCallOut::CCdrExtCallOut(ULONG uCallId, UINT nActionId, UINT nHostLine) : m_uCallId(uCallId), m_nActionId(nActionId), m_nHostLine(nHostLine)
  5. {
  6. m_bIsActive = TRUE;
  7. m_nCallType = 0;
  8. m_nPeerLineType = 0;
  9. m_strCallerNum = _T("");
  10. m_nCallerAgentId = 0;
  11. m_strCalleeNum = _T("");
  12. m_nCalleeAgentId = 0;
  13. m_nTimeRingBack = 0;
  14. m_nIsCallOutSucceed = 0;
  15. m_nTimeConnected = 0;
  16. m_nFinalAgentId = 0;
  17. m_strFinalAgentNum = _T("");
  18. m_strRecFileName = _T("");
  19. m_nTimeHangUp = 0;
  20. m_nPeriodTalking = 0;
  21. }
  22. CCdrExtCallOut::~CCdrExtCallOut(void)
  23. {
  24. }
  25. /*****************************************************************
  26. **【函数名称】 __verifyData
  27. **【函数功能】 数据校验
  28. **【参数】
  29. **【返回值】
  30. *****************************************************************/
  31. BOOL CCdrExtCallOut::__verifyData()
  32. {
  33. return TRUE;
  34. }
  35. /*****************************************************************
  36. **【函数名称】 __onLineStateChanged
  37. **【函数功能】 线路状态变化响应
  38. **【参数】 nHostLine 主控线路
  39. tEvtState 线路状态变化事件
  40. **【返回值】
  41. *****************************************************************/
  42. void CCdrExtCallOut::__onLineStateChanged( UINT nHostLine, T_EvtStateChanged* tEvtState )
  43. {
  44. // 接收并处理 ExtCallOut表 需要的线路状态
  45. switch (tEvtState->nLineState)
  46. {
  47. case INNER_STATE_TALKING: // 内线通话中
  48. {
  49. // 接听坐席不一定是被叫,可能被代接,以主叫为标志区分
  50. // 接听成功后可能有转移操作
  51. if(m_nHostLine == nHostLine)
  52. {
  53. if(m_nIsCallOutSucceed == 0)
  54. {
  55. m_nIsCallOutSucceed = 1; // 呼出成功
  56. m_nTimeConnected = time(NULL); // 接通时间
  57. }
  58. }
  59. else
  60. {
  61. if (m_nFinalAgentId == 0 && m_nPeerLineType == DEV_RES_TYPE_EXT)
  62. {
  63. m_nFinalAgentId = tEvtState->nAgentId; // 接听坐席工号
  64. m_strFinalAgentNum.Format(_T("%d"), nHostLine); // 接听坐席分机号
  65. }
  66. }
  67. }
  68. break;
  69. case INNER_STATE_FREE: // 内线挂机
  70. {
  71. if (m_nHostLine == nHostLine)
  72. {
  73. m_nTimeHangUp = time(NULL); // 挂机时间
  74. m_nPeriodTalking = (m_nIsCallOutSucceed == 1) ? (UINT)(m_nTimeHangUp - m_nTimeConnected) : 0; // 通话时长
  75. // 更新数据
  76. toSql();
  77. }
  78. }
  79. break;
  80. default:
  81. break;
  82. } // end switch
  83. }
  84. /*****************************************************************
  85. **【函数名称】 onCallDetail
  86. **【函数功能】 统计事件响应
  87. **【参数】 nEvent 统计事件
  88. nHostLine 主控线路
  89. lpParam 统计信息
  90. **【返回值】
  91. *****************************************************************/
  92. void CCdrExtCallOut::onCallDetail( REP_EVENT nEvent, UINT nHostLine, void* lpParam )
  93. {
  94. // 接收并处理 ExtCallOut表 需要的事件
  95. switch (nEvent)
  96. {
  97. case REP_EVENT_EXT_CALL_OUT: // 坐席呼出事件
  98. {
  99. T_EvtExtCallOut* tEvent = (T_EvtExtCallOut*)lpParam;
  100. m_nCallType = tEvent->nCallType; // 呼出方式
  101. m_nPeerLineType = tEvent->nPeerLineType; // 被叫线路类型
  102. m_nCallerAgentId = tEvent->nCallerAgentId; // 主叫坐席工号
  103. m_strCallerNum.Format(_T("%d"), nHostLine); // 主叫号码
  104. m_nCalleeAgentId = tEvent->nCalleeAgentId; // 被叫坐席工号
  105. m_strCalleeNum = tEvent->szCalleeNum; // 被叫号码
  106. m_nTimeRingBack = time(NULL); // 呼出振铃时间
  107. }
  108. break;
  109. case REP_EVENT_REC_BEGIN: // 录音开始事件
  110. {
  111. T_EvtRecBegin* tEvent = (T_EvtRecBegin*)lpParam;
  112. if (m_nHostLine == nHostLine)
  113. m_strRecFileName = tEvent->szFileName; // 录音文件路径
  114. }
  115. break;
  116. case REP_EVENT_HANG_UP: // 挂机事件
  117. {
  118. if (m_nHostLine == nHostLine)
  119. {
  120. m_nTimeHangUp = time(NULL); // 坐席挂机时间
  121. m_nPeriodTalking = (m_nIsCallOutSucceed == 1) ? (UINT)(m_nTimeHangUp - m_nTimeConnected) : 0; // 通话时长
  122. // 更新数据
  123. toSql();
  124. }
  125. }
  126. break;
  127. case REP_EVENT_STATE_CHANGED: // 线路变化事件
  128. {
  129. T_EvtStateChanged* tEvtState = (T_EvtStateChanged*)lpParam;
  130. __onLineStateChanged(nHostLine, tEvtState);
  131. }
  132. break;
  133. default:
  134. break;
  135. } // end switch
  136. }
  137. /*****************************************************************
  138. **【函数名称】 toSql
  139. **【函数功能】 更新数据库表数据
  140. **【参数】
  141. **【返回值】
  142. *****************************************************************/
  143. void CCdrExtCallOut::toSql()
  144. {
  145. // 表被关闭,不再更新数据
  146. if (!m_bIsActive)
  147. return;
  148. // 数据校验(有关键数据未填写且不适合自动填充时,返回失败)
  149. if (__verifyData())
  150. m_bIsActive = FALSE;
  151. else
  152. return;
  153. // 写入 rep_host 主表
  154. CSqlWriter& Writer = CSqlWriter::GetInstance();
  155. CString strSql = _T("");
  156. strSql.Format(_T("INSERT INTO rep_host (CallID, ActionID, CallTypeOpType, HostLine, CallerNum, CalleeNum, TimeConnected, TimeHangUp)\
  157. VALUES (%lu, %d, %d, %d, '%s', '%s', %s, %s)"),
  158. m_uCallId,
  159. m_nActionId,
  160. REP_EVENT_EXT_CALL_OUT,
  161. m_nHostLine,
  162. m_strCallerNum,
  163. m_strCalleeNum,
  164. FormatTime(m_nTimeConnected),
  165. FormatTime(m_nTimeHangUp)
  166. );
  167. Writer.addSql(strSql);
  168. // 写入 rep_ext_call_out 坐席呼出子表
  169. strSql.Format(_T("INSERT INTO rep_ext_call_out (CallID,ActionID,CallType,PeerLineType,CallerAgentID,CallerNum,CalleeAgentID,CalleeNum,\
  170. TimeRingBack,IsCallOutSucceed,TimeConnected,FinalAgentId,FinalAgentNum,RecFileName,TimeHangUp,PeriodTalking)\
  171. VALUES (%lu, %d, %d, %d, %d, '%s', %d, '%s', %s, %d, %s, %d, '%s', '%s', %s, %d)"),
  172. m_uCallId,
  173. m_nActionId,
  174. m_nCallType,
  175. m_nPeerLineType,
  176. m_nCallerAgentId,
  177. m_strCallerNum,
  178. m_nCalleeAgentId,
  179. m_strCalleeNum,
  180. FormatTime(m_nTimeRingBack),
  181. m_nIsCallOutSucceed,
  182. FormatTime(m_nTimeConnected),
  183. m_nFinalAgentId,
  184. m_strFinalAgentNum,
  185. m_strRecFileName,
  186. FormatTime(m_nTimeHangUp),
  187. m_nPeriodTalking
  188. );
  189. Writer.addSql(strSql);
  190. }