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

CdrExtCallIn.cpp 5.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. #include "StdAfx.h"
  2. #include "CdrExtCallIn.h"
  3. #include "SqlWriter.h"
  4. CCdrExtCallIn::CCdrExtCallIn(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_nCallerAgentId = 0;
  10. m_strCallerNum = _T("");
  11. m_nCalleeAgentId = 0;
  12. m_strCalleeNum = _T("");
  13. m_nTimeAlerting = 0;
  14. m_nIsAnswer = 0;
  15. m_nPeriodAlerting = 0;
  16. m_nTimeAnswer = 0;
  17. m_strRecFileName = _T("");
  18. m_nTimeHangUp = 0;
  19. m_nPeriodTalking = 0;
  20. }
  21. CCdrExtCallIn::~CCdrExtCallIn(void)
  22. {
  23. }
  24. /*****************************************************************
  25. **【函数名称】 __verifyData
  26. **【函数功能】 数据校验
  27. **【参数】
  28. **【返回值】
  29. *****************************************************************/
  30. BOOL CCdrExtCallIn::__verifyData()
  31. {
  32. return TRUE;
  33. }
  34. /*****************************************************************
  35. **【函数名称】 OnLineStateChanged
  36. **【函数功能】 线路状态变化响应
  37. **【参数】 nHostLine 主控线路
  38. tEvtState 线路状态变化事件
  39. **【返回值】
  40. *****************************************************************/
  41. void CCdrExtCallIn::__onLineStateChanged( UINT nHostLine, T_EvtStateChanged* tEvtState )
  42. {
  43. // 接收并处理 ExtCallIn表 需要的线路状态
  44. switch (tEvtState->nLineState)
  45. {
  46. case INNER_STATE_TALKING: // 内线通话中
  47. {
  48. if (m_nHostLine == nHostLine && m_nIsAnswer == 0)
  49. {
  50. m_nIsAnswer = 1; // 坐席应答
  51. m_nTimeAnswer = time(NULL); // 应答时间
  52. m_nPeriodAlerting = (UINT)(m_nTimeAnswer - m_nTimeAlerting); // 振铃时长
  53. }
  54. }
  55. break;
  56. case INNER_STATE_FREE: // 内线挂机
  57. {
  58. if (m_nHostLine == nHostLine)
  59. {
  60. m_nTimeHangUp = time(NULL); // 挂机时间
  61. if (m_nIsAnswer == 0) // 未接听挂机
  62. {
  63. m_nPeriodTalking = 0;
  64. m_nPeriodAlerting = (UINT)(m_nTimeHangUp - m_nTimeAlerting);
  65. }
  66. else
  67. {
  68. m_nPeriodTalking = (UINT)(m_nTimeHangUp - m_nTimeAnswer); // 通话时长
  69. }
  70. // 更新数据
  71. toSql();
  72. }
  73. }
  74. break;
  75. default:
  76. break;
  77. } // end switch
  78. }
  79. /*****************************************************************
  80. **【函数名称】 onCallDetail
  81. **【函数功能】 统计事件响应
  82. **【参数】 nEvent 统计事件
  83. nHostLine 主控线路
  84. lpParam 统计信息
  85. **【返回值】
  86. *****************************************************************/
  87. void CCdrExtCallIn::onCallDetail( REP_EVENT nEvent, UINT nHostLine, void* lpParam )
  88. {
  89. // 接收并处理 ExtCallIn表 需要的事件
  90. switch (nEvent)
  91. {
  92. case REP_EVENT_EXT_CALL_IN: // 坐席呼入事件
  93. {
  94. if (nHostLine == m_nHostLine)
  95. {
  96. T_EvtExtCallIn* tEvent = (T_EvtExtCallIn*)lpParam;
  97. m_nCallType = tEvent->nCallType; // 呼入类型
  98. m_nPeerLineType = tEvent->nPeerLineType; // 对端线路类型
  99. m_nCallerAgentId = tEvent->nCallerAgentId; // 主叫坐席工号
  100. m_strCallerNum = tEvent->szCallerNum; // 主叫号码
  101. m_nCalleeAgentId = tEvent->nCalleeAgentId; // 被叫坐席工号
  102. m_strCalleeNum.Format(_T("%d"), nHostLine); // 被叫号码
  103. m_nTimeAlerting = time(NULL); // 来电振铃时间
  104. }
  105. }
  106. break;
  107. case REP_EVENT_REC_BEGIN: // 录音开始事件
  108. {
  109. if (m_nHostLine == nHostLine)
  110. {
  111. T_EvtRecBegin* tEvent = (T_EvtRecBegin*)lpParam;
  112. m_strRecFileName = tEvent->szFileName; // 录音文件路径
  113. }
  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_nIsAnswer == 1) ? (UINT)(m_nTimeHangUp - m_nTimeAnswer) : 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 CCdrExtCallIn::toSql()
  144. {
  145. // 表被关闭,不再更新数据
  146. if (!m_bIsActive) return;
  147. // 数据校验(有关键数据未填写且不适合自动填充时,返回失败)
  148. if (__verifyData())
  149. m_bIsActive = FALSE;
  150. else
  151. return;
  152. // 写入 rep_host 主表
  153. CSqlWriter& Writer = CSqlWriter::GetInstance();
  154. CString strSql = _T("");
  155. strSql.Format(_T("INSERT INTO rep_host (CallID, ActionID, CallTypeOpType, HostLine, CallerNum, CalleeNum, TimeConnected, TimeHangUp)\
  156. VALUES (%lu, %d, %d, %d, '%s', '%s', %s, %s)"),
  157. m_uCallId,
  158. m_nActionId,
  159. REP_EVENT_EXT_CALL_IN,
  160. m_nHostLine,
  161. m_strCallerNum,
  162. m_strCalleeNum,
  163. FormatTime(m_nTimeAnswer),
  164. FormatTime(m_nTimeHangUp)
  165. );
  166. Writer.addSql(strSql); // 在坐席未接听的情况下重复转坐席 actionID累加,相当于多次呼入,所以主表同样插入记录
  167. // 写入 rep_ext_call_in 坐席呼入子表
  168. strSql.Format(_T("INSERT INTO rep_ext_call_in (CallID,ActionID,CallType,PeerLineType,CallerAgentID,CallerNum,CalleeAgentID,\
  169. CalleeNum,TimeAlerting,PeriodAlerting,IsAnswer,TimeAnswer,RecFileName,TimeHangUp,PeriodTalking)\
  170. VALUES (%lu, %d, %d, %d, %d, '%s', %d, '%s', %s, %d, %d, %s, '%s', %s, %d)"),
  171. m_uCallId,
  172. m_nActionId,
  173. m_nCallType,
  174. m_nPeerLineType,
  175. m_nCallerAgentId,
  176. m_strCallerNum,
  177. m_nCalleeAgentId,
  178. m_strCalleeNum,
  179. FormatTime(m_nTimeAlerting),
  180. m_nPeriodAlerting,
  181. m_nIsAnswer,
  182. FormatTime(m_nTimeAnswer),
  183. m_strRecFileName,
  184. FormatTime(m_nTimeHangUp),
  185. m_nPeriodTalking
  186. );
  187. Writer.addSql(strSql);
  188. }