MiddleWares_YiHe 郑州颐和医院随访系统中间件

TaskIvrFax.cpp 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include "stdafx.h"
  2. #include "TaskIvrFax.h"
  3. #include "LineHolder.h"
  4. #include "LogicLine.h"
  5. #include "StatisticsMgr.h"
  6. #include "CtiCore.h"
  7. #include "SqlWriter.h"
  8. CTaskIvrFax::CTaskIvrFax(CPduEntity &PduEntity) : CTask(PduEntity)
  9. {
  10. m_bIsSendFax = FALSE;
  11. }
  12. CTaskIvrFax::~CTaskIvrFax(void)
  13. {
  14. }
  15. /*****************************************************************
  16. **【函数名称】 DoTask
  17. **【函数功能】 Task处理
  18. **【参数】
  19. **【返回值】 void
  20. ****************************************************************/
  21. BOOL CTaskIvrFax::DoTask()
  22. {
  23. // 显示日志
  24. ShowLog();
  25. // 校验
  26. if(!Verify()) return FALSE;
  27. m_pCurrLine->opType() = PDU_CMD_IVR_FAX; // 设置传真任务类型
  28. // 统计开始收发传真 REP_EVENT_FAX_BEGIN
  29. T_EvtFaxBegin repInfoFax;
  30. memset(&repInfoFax, 0, sizeof(repInfoFax));
  31. repInfoFax.nIsAuto = 1; // 是否自动收发(0:否 1:是)
  32. repInfoFax.nRcvOrSend = m_CurrCmd.GetDataUInt(4); // 收/发(0:收 1:发)
  33. repInfoFax.nCallerAgentId = m_pCurrLine->getAgentNum(); // 主叫坐席工号
  34. lstrcpy(repInfoFax.szCallerNum, m_pCurrLine->callerNum()); // 主叫号码
  35. lstrcpy(repInfoFax.szCalleeNum, m_pCurrLine->calleeNum()); // 被叫号码
  36. lstrcpy(repInfoFax.szFileName, m_CurrCmd.GetDataString(5)); // 传真文件名
  37. CStatisticsMgr::GetInstance().onCallDetail(m_pCurrLine->callId(), REP_EVENT_FAX_BEGIN, m_pCurrLine->lineId(), &repInfoFax);
  38. // 先向底层设备发送转IVR传真转移命令,这是因为考虑到使用Diva等传真卡的情况,
  39. // 因为使用这种传真卡时需要先将通话转移到其上,才能收发传真
  40. LineOpParam LineOpParam;
  41. memset(&LineOpParam, 0, sizeof(LineOpParam));
  42. LineOpParam.nParam1 = 1; // 0 普通转IVR 1 转传真
  43. return CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_IVRFAX_TRANSFER, m_pCurrLine->lineId(), &LineOpParam);
  44. }
  45. /*****************************************************************
  46. **【函数名称】 Verify
  47. **【函数功能】 校验
  48. **【参数】
  49. **【返回值】 BOOL
  50. ****************************************************************/
  51. BOOL CTaskIvrFax::Verify()
  52. {
  53. // 线路绑定校验
  54. if(!_bindLogicLine(m_CurrCmd.GetDataUInt(3)))
  55. return FALSE;
  56. return TRUE;
  57. }
  58. /*****************************************************************
  59. **【函数名称】 ShowLog
  60. **【函数功能】 显示日志
  61. **【参数】
  62. **【返回值】 void
  63. ****************************************************************/
  64. void CTaskIvrFax::ShowLog()
  65. {
  66. // 显示日志
  67. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("IVR->CTI, CMD = [IVR传真], \
  68. IVR = %d, Line = %d, FaxType(0发 1收) = %d, FaxFile = %s"),
  69. m_CurrCmd.GetDataInt(1),
  70. m_CurrCmd.GetDataUInt(3),
  71. m_CurrCmd.GetDataUInt(4),
  72. m_CurrCmd.GetDataString(5));
  73. }
  74. /*****************************************************************
  75. **【函数名称】 OnDevOpResult
  76. **【函数功能】 底层线路操作结果
  77. **【参数】
  78. **【返回值】 void
  79. ****************************************************************/
  80. BOOL CTaskIvrFax::OnDevOpResult(EventOpResult &EvtInfo)
  81. {
  82. // 转Ivr命令返回成功
  83. if(!m_bIsSendFax && EvtInfo.bIsSucceed)
  84. {
  85. m_bIsSendFax = TRUE;
  86. // 向底层设备发送传真命令
  87. LineOpParam pLineOpParam;
  88. memset(&pLineOpParam,0,sizeof(pLineOpParam));
  89. pLineOpParam.nParam1 = m_CurrCmd.GetDataUInt(4); // 0发 1发
  90. lstrcpy(pLineOpParam.szParam3, m_CurrCmd.GetDataString(5)); // 传真文件名
  91. // 填充转移的传真线路号码,节省检索时间
  92. lstrcpy(pLineOpParam.szParam2, EvtInfo.szData);
  93. CCtiCore::GetInstance().getDevLink().exec((long)this, LINE_OP_FAX, m_pCurrLine->lineId(), &pLineOpParam);
  94. return FALSE; // 不销毁Task
  95. }
  96. else
  97. {
  98. // 命令返回
  99. _ProcCmdReturn(EvtInfo.bIsSucceed);
  100. // 统计开始收发传真 REP_EVENT_FAX_BEGIN
  101. T_EvtFaxEnd repInfoFax;
  102. memset(&repInfoFax, 0, sizeof(repInfoFax));
  103. repInfoFax.nIsSucceed = EvtInfo.bIsSucceed; // 成功与否
  104. CStatisticsMgr::GetInstance().onCallDetail(m_pCurrLine->callId(), REP_EVENT_FAX_END, m_pCurrLine->lineId(), &repInfoFax);
  105. //处理IPO设备发送传真结果记录不正确问题
  106. int nSendFax = m_CurrCmd.GetDataUInt(4);
  107. if (nSendFax == 0 && m_pCurrLine->callId() <= 0 && EvtInfo.bIsSucceed)
  108. {
  109. CString strSQL;
  110. strSQL.Format(_T("update rep_fax set IsSucceed=1, PeriodFax = datediff(s,TimeFaxBegin,%s) where CallID=%lu"), FormatTime(time(0)), m_TaskCallId);
  111. CSqlWriter::GetInstance().addSql(strSQL);
  112. }
  113. return TRUE;
  114. }
  115. }