中航光电的中间件仓库

CdrExtCallIn.cpp 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  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. m_nEventId = REP_EVENT_EXT_CALL_IN;
  21. }
  22. CCdrExtCallIn::~CCdrExtCallIn(void)
  23. {
  24. }
  25. /*****************************************************************
  26. **【函数名称】 __verifyData
  27. **【函数功能】 数据校验
  28. **【参数】
  29. **【返回值】
  30. *****************************************************************/
  31. BOOL CCdrExtCallIn::__verifyData()
  32. {
  33. return TRUE;
  34. }
  35. /*****************************************************************
  36. **【函数名称】 OnLineStateChanged
  37. **【函数功能】 线路状态变化响应
  38. **【参数】 nHostLine 主控线路
  39. tEvtState 线路状态变化事件
  40. **【返回值】
  41. *****************************************************************/
  42. void CCdrExtCallIn::__onLineStateChanged( UINT nHostLine, T_EvtStateChanged* tEvtState )
  43. {
  44. // 接收并处理 ExtCallIn表 需要的线路状态
  45. switch (tEvtState->nLineState)
  46. {
  47. case INNER_STATE_TALKING: // 内线通话中
  48. {
  49. if (m_nHostLine == nHostLine && m_nIsAnswer == 0)
  50. {
  51. m_nIsAnswer = 1; // 坐席应答
  52. m_nTimeAnswer = time(NULL); // 应答时间
  53. m_nPeriodAlerting = (UINT)(m_nTimeAnswer - m_nTimeAlerting); // 振铃时长
  54. }
  55. }
  56. break;
  57. case INNER_STATE_FREE: // 内线挂机
  58. {
  59. if (m_nHostLine == nHostLine)
  60. {
  61. m_nTimeHangUp = time(NULL); // 挂机时间
  62. if (m_nIsAnswer == 0) // 未接听挂机
  63. {
  64. m_nPeriodTalking = 0;
  65. m_nPeriodAlerting = (UINT)(m_nTimeHangUp - m_nTimeAlerting);
  66. }
  67. else
  68. {
  69. m_nPeriodTalking = (UINT)(m_nTimeHangUp - m_nTimeAnswer); // 通话时长
  70. }
  71. // 更新数据
  72. toSql();
  73. }
  74. }
  75. break;
  76. default:
  77. break;
  78. } // end switch
  79. }
  80. /*****************************************************************
  81. **【函数名称】 onCallDetail
  82. **【函数功能】 统计事件响应
  83. **【参数】 nEvent 统计事件
  84. nHostLine 主控线路
  85. lpParam 统计信息
  86. **【返回值】
  87. *****************************************************************/
  88. void CCdrExtCallIn::onCallDetail( REP_EVENT nEvent, UINT nHostLine, void* lpParam )
  89. {
  90. // 接收并处理 ExtCallIn表 需要的事件
  91. switch (nEvent)
  92. {
  93. case REP_EVENT_EXT_CALL_IN: // 坐席呼入事件
  94. {
  95. if (nHostLine == m_nHostLine)
  96. {
  97. T_EvtExtCallIn* tEvent = (T_EvtExtCallIn*)lpParam;
  98. m_nCallType = tEvent->nCallType; // 呼入类型
  99. m_nPeerLineType = tEvent->nPeerLineType; // 对端线路类型
  100. m_nCallerAgentId = tEvent->nCallerAgentId; // 主叫坐席工号
  101. m_strCallerNum = tEvent->szCallerNum; // 主叫号码
  102. m_nCalleeAgentId = tEvent->nCalleeAgentId; // 被叫坐席工号
  103. m_strCalleeNum.Format(_T("%d"), nHostLine); // 被叫号码
  104. m_nTimeAlerting = time(NULL); // 来电振铃时间
  105. }
  106. }
  107. break;
  108. case REP_EVENT_REC_BEGIN: // 录音开始事件
  109. {
  110. if (m_nHostLine == nHostLine)
  111. {
  112. T_EvtRecBegin* tEvent = (T_EvtRecBegin*)lpParam;
  113. m_strRecFileName = tEvent->szFileName; // 录音文件路径
  114. }
  115. }
  116. break;
  117. case REP_EVENT_HANG_UP: // 挂机事件
  118. {
  119. if (m_nHostLine == nHostLine)
  120. {
  121. m_nTimeHangUp = time(NULL); // 坐席挂机时间
  122. m_nPeriodTalking = (m_nIsAnswer == 1) ? (UINT)(m_nTimeHangUp - m_nTimeAnswer) : 0; // 通话时长
  123. // 更新数据
  124. toSql();
  125. }
  126. }
  127. break;
  128. case REP_EVENT_STATE_CHANGED: // 线路变化事件
  129. {
  130. T_EvtStateChanged* tEvtState = (T_EvtStateChanged*)lpParam;
  131. __onLineStateChanged(nHostLine, tEvtState);
  132. }
  133. break;
  134. default:
  135. break;
  136. } // end switch
  137. }
  138. /*****************************************************************
  139. **【函数名称】 toSql
  140. **【函数功能】 更新数据库表数据
  141. **【参数】
  142. **【返回值】
  143. *****************************************************************/
  144. void CCdrExtCallIn::toSql()
  145. {
  146. // 表被关闭,不再更新数据
  147. if (!m_bIsActive) return;
  148. // 数据校验(有关键数据未填写且不适合自动填充时,返回失败)
  149. if (__verifyData())
  150. m_bIsActive = FALSE;
  151. else
  152. return;
  153. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("CCdrExtCallIn m_nActionId=%d m_bIsActive =%d"), m_nActionId,m_bIsActive);
  154. // 写入 rep_host 主表
  155. CSqlWriter& Writer = CSqlWriter::GetInstance();
  156. CString strSql = _T("");
  157. if (DB_Oracle == IOtlConnection::getInstance()->GetDatabaseType()) {
  158. strSql.Format(_T("INSERT INTO REP_HOST (CALLID, ACTIONID, CALLTYPEOPTYPE, HOSTLINE, CALLERNUM, CALLEENUM, TIMECONNECTED, TIMEHANGUP) VALUES (%lu, %d, %d, %d, '%s', '%s', %s, %s)"),
  159. m_uCallId,
  160. m_nActionId,
  161. REP_EVENT_EXT_CALL_IN,
  162. m_nHostLine,
  163. m_strCallerNum,
  164. m_strCalleeNum,
  165. FormatTime(m_nTimeAnswer),
  166. FormatTime(m_nTimeHangUp)
  167. );
  168. }
  169. else {
  170. strSql.Format(_T("INSERT INTO rep_host (CallID, ActionID, CallTypeOpType, HostLine, CallerNum, CalleeNum, TimeConnected, TimeHangUp) VALUES (%lu, %d, %d, %d, '%s', '%s', %s, %s)"),
  171. m_uCallId,
  172. m_nActionId,
  173. REP_EVENT_EXT_CALL_IN,
  174. m_nHostLine,
  175. m_strCallerNum,
  176. m_strCalleeNum,
  177. FormatTime(m_nTimeAnswer),
  178. FormatTime(m_nTimeHangUp)
  179. );
  180. }
  181. Writer.addSql(strSql); // 在坐席未接听的情况下重复转坐席 actionID累加,相当于多次呼入,所以主表同样插入记录
  182. if (DB_Oracle == IOtlConnection::getInstance()->GetDatabaseType()) {
  183. strSql.Format(_T("INSERT INTO REP_EXT_CALL_IN (CALLID,ACTIONID,CALLTYPE,PEERLINETYPE,CALLERAGENTID,CALLERNUM,CALLEEAGENTID, CALLEENUM,TIMEALERTING,PERIODALERTING,ISANSWER,TIMEANSWER,RECFILENAME,TIMEHANGUP,PERIODTALKING) VALUES (%lu, %d, %d, %d, %d, '%s', %d, '%s', %s, %d, %d, %s, '%s', %s, %d)"),
  184. m_uCallId,
  185. m_nActionId,
  186. m_nCallType,
  187. m_nPeerLineType,
  188. m_nCallerAgentId,
  189. m_strCallerNum,
  190. m_nCalleeAgentId,
  191. m_strCalleeNum,
  192. FormatTime(m_nTimeAlerting),
  193. m_nPeriodAlerting,
  194. m_nIsAnswer,
  195. FormatTime(m_nTimeAnswer),
  196. m_strRecFileName,
  197. FormatTime(m_nTimeHangUp),
  198. m_nPeriodTalking
  199. );
  200. }else {
  201. strSql.Format(_T("INSERT INTO rep_ext_call_in (CallID,ActionID,CallType,PeerLineType,CallerAgentID,CallerNum,CalleeAgentID,\
  202. CalleeNum,TimeAlerting,PeriodAlerting,IsAnswer,TimeAnswer,RecFileName,TimeHangUp,PeriodTalking)\
  203. VALUES (%lu, %d, %d, %d, %d, '%s', %d, '%s', %s, %d, %d, %s, '%s', %s, %d)"),
  204. m_uCallId,
  205. m_nActionId,
  206. m_nCallType,
  207. m_nPeerLineType,
  208. m_nCallerAgentId,
  209. m_strCallerNum,
  210. m_nCalleeAgentId,
  211. m_strCalleeNum,
  212. FormatTime(m_nTimeAlerting),
  213. m_nPeriodAlerting,
  214. m_nIsAnswer,
  215. FormatTime(m_nTimeAnswer),
  216. m_strRecFileName,
  217. FormatTime(m_nTimeHangUp),
  218. m_nPeriodTalking
  219. );
  220. }
  221. Writer.addSql(strSql);
  222. }