baiwenju před 1 rokem
rodič
revize
c13de98230
21 změnil soubory, kde provedl 232 přidání a 87 odebrání
  1. 1 1
      CTI/CTI.cpp
  2. 2 2
      CTI/CTI.vcxproj
  3. 62 72
      CTI/TaskMgr.cpp
  4. binární
      FirstStep/FirstStep.aps
  5. 5 0
      IVR/DingDing.yml
  6. 28 4
      IVR/NetworkIvr.cpp
  7. 10 0
      IVR/RcfConfig.yml
  8. 44 0
      IVR/log/2022-10-11/IVR_1.txt
  9. 8 0
      Middleware.sln
  10. 6 4
      Public/GlobalDef/SqlWriter.cpp
  11. binární
      Release/ACD.exe
  12. binární
      Release/ACD.pdb
  13. binární
      Release/CTI.exe
  14. binární
      Release/CTI.pdb
  15. binární
      Release/FsLink.dll
  16. binární
      Release/FsLink.pdb
  17. binární
      Release/IVR.exe
  18. binární
      Release/IVR.pdb
  19. binární
      Release/Logger.dll
  20. 12 4
      Release/PDUFormat.ini
  21. 54 0
      Release/sql脚本.txt

+ 1 - 1
CTI/CTI.cpp

@@ -52,7 +52,7 @@ BOOL CCTIApp::InitInstance()
52 52
 #ifndef _DEBUG
53 53
 	SetErrorMode(SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
54 54
 #endif
55
-
55
+	
56 56
 	// 禁止多个实例的同时运行
57 57
 	HANDLE hMutexOneInstance = ::CreateMutex(NULL, TRUE, _T(AfxGetAppName()));
58 58
 	if (::GetLastError() == ERROR_ALREADY_EXISTS)

+ 2 - 2
CTI/CTI.vcxproj

@@ -81,9 +81,9 @@
81 81
       <FunctionLevelLinking>true</FunctionLevelLinking>
82 82
       <IntrinsicFunctions>true</IntrinsicFunctions>
83 83
       <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
84
-      <AdditionalIncludeDirectories>../3rd/hybase/;../Public/GlobalDef/;../Public/DingDing;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
84
+      <AdditionalIncludeDirectories>../3rd/hybase/;../Public/GlobalDef/;../Public/DingDing;../Public/dump;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
85 85
       <LanguageStandard>stdcpp14</LanguageStandard>
86
-      <SDLCheck>true</SDLCheck>
86
+      <SDLCheck>false</SDLCheck>
87 87
     </ClCompile>
88 88
     <Link>
89 89
       <SubSystem>Windows</SubSystem>

+ 62 - 72
CTI/TaskMgr.cpp

@@ -21,10 +21,10 @@ CTaskMgr::~CTaskMgr(void)
21 21
 /*****************************************************************
22 22
 **【函数名称】	__addTask
23 23
 **【函数功能】	 添加Task
24
-**【参数】		
24
+**【参数】
25 25
 **【返回值】
26 26
 ****************************************************************/
27
-void CTaskMgr::__addTask( CTask* pTask )
27
+void CTaskMgr::__addTask(CTask* pTask)
28 28
 {
29 29
 	m_TaskLock.Lock();
30 30
 	m_TaskTable.SetAt(reinterpret_cast<LONG>(pTask), pTask);
@@ -35,21 +35,21 @@ void CTaskMgr::__addTask( CTask* pTask )
35 35
 **【函数名称】	__onAgentLogin
36 36
 **【函数功能】	坐席签入处理
37 37
 **【参数】		消息实体
38
-**【返回值】	
38
+**【返回值】
39 39
 ****************************************************************/
40
-void CTaskMgr::__onAgentLogin( CPduEntity &PduEntity )
40
+void CTaskMgr::__onAgentLogin(CPduEntity &PduEntity)
41 41
 {
42 42
 	// 显示日志
43 43
 	ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("Agent->CTI, CMD = [坐席签入], \
44 44
 													  Exten = %d, Agent = %d"),
45
-													  PduEntity.GetDataUInt(1),
46
-													  PduEntity.GetDataUInt(2));
45
+		PduEntity.GetDataUInt(1),
46
+		PduEntity.GetDataUInt(2));
47 47
 
48 48
 	// 设置内线分机的当前坐席工号
49 49
 	CLogicLine* pLine = CLineHolder::GetInstance().getLogicLine(PduEntity.GetDataUInt(1));
50
-	if(pLine == NULL) 
50
+	if (pLine == NULL)
51 51
 		ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, _T("{TaskMgr}: 坐席[%d]签入绑定分机失败: 无法获取目标分机[%d]"), PduEntity.GetDataUInt(2),
52
-									PduEntity.GetDataUInt(1));
52
+			PduEntity.GetDataUInt(1));
53 53
 	else
54 54
 		pLine->setAgentNum(PduEntity.GetDataUInt(2), PduEntity.GetDataString(3));
55 55
 }
@@ -58,35 +58,35 @@ void CTaskMgr::__onAgentLogin( CPduEntity &PduEntity )
58 58
 **【函数名称】	__onAgentLogout
59 59
 **【函数功能】	坐席签出处理
60 60
 **【参数】		消息实体
61
-**【返回值】	
61
+**【返回值】
62 62
 ****************************************************************/
63
-void CTaskMgr::__onAgentLogout( CPduEntity &PduEntity )
63
+void CTaskMgr::__onAgentLogout(CPduEntity &PduEntity)
64 64
 {
65 65
 	// 显示日志
66
-	ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("Agent->CTI, CMD = [坐席签出], Exten = %d, Agent = %d"), 
67
-													  PduEntity.GetDataUInt(1),
68
-													  PduEntity.GetDataUInt(2));
66
+	ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("Agent->CTI, CMD = [坐席签出], Exten = %d, Agent = %d"),
67
+		PduEntity.GetDataUInt(1),
68
+		PduEntity.GetDataUInt(2));
69 69
 
70 70
 	// 设置内线分机的当前坐席工号
71 71
 	CLogicLine* pLine = CLineHolder::GetInstance().getLogicLine(PduEntity.GetDataUInt(1));
72
-	if(pLine != NULL) 
73
-		pLine->setAgentNum(0,"");
72
+	if (pLine != NULL)
73
+		pLine->setAgentNum(0, "");
74 74
 }
75 75
 
76 76
 /*****************************************************************
77 77
 **【函数名称】	__onAgentReset
78 78
 **【函数功能】	重置处理
79 79
 **【参数】		消息实体
80
-**【返回值】	
80
+**【返回值】
81 81
 ****************************************************************/
82
-void CTaskMgr::__onAgentReset( CPduEntity &PduEntity )
82
+void CTaskMgr::__onAgentReset(CPduEntity &PduEntity)
83 83
 {
84 84
 	// 显示日志
85 85
 	ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, _T("Agent->CTI, CMD = [坐席重置], Exten = %d"), PduEntity.GetDataUInt(1));
86 86
 
87 87
 	// 获取线路类指针
88 88
 	CLogicLine* pLine = CLineHolder::GetInstance().getLogicLine(PduEntity.GetDataUInt(1));
89
-	if(pLine == NULL) 
89
+	if (pLine == NULL)
90 90
 		return;
91 91
 
92 92
 	// 删除关联任务
@@ -100,14 +100,14 @@ void CTaskMgr::__onAgentReset( CPduEntity &PduEntity )
100 100
 **【函数名称】	__onTaskFailed
101 101
 **【函数功能】	处理Task执行失败
102 102
 **【参数】		消息实体
103
-**【返回值】	
103
+**【返回值】
104 104
 ****************************************************************/
105
-void CTaskMgr::__onTaskFailed( CTask* pTask, CPduEntity &PduEntity )
105
+void CTaskMgr::__onTaskFailed(CTask* pTask, CPduEntity &PduEntity)
106 106
 {
107 107
 	// 显示日志
108 108
 	CString DevType;
109 109
 	UINT HostLine;
110
-	if(PduEntity.GetLocalDevType() == PDU_DEV_TYPE_ACD)
110
+	if (PduEntity.GetLocalDevType() == PDU_DEV_TYPE_ACD)
111 111
 	{
112 112
 		DevType = _T("ACD");
113 113
 		HostLine = PduEntity.GetDataUInt(1);
@@ -133,14 +133,14 @@ void CTaskMgr::__onTaskFailed( CTask* pTask, CPduEntity &PduEntity )
133 133
 **【函数功能】	处理设备操作进展
134 134
 **【参数】		EvtType 消息事件类型
135 135
 				lpContent 消息内容
136
-**【返回值】		
136
+**【返回值】
137 137
 ****************************************************************/
138
-void CTaskMgr::__procDevOpProcess( UINT EvtType, const PARAM lpContent )
138
+void CTaskMgr::__procDevOpProcess(UINT EvtType, const PARAM lpContent)
139 139
 {
140 140
 	EventOpProcess &EvtInfo = *(EventOpProcess*)lpContent;
141 141
 	// 查找到Task并处理
142 142
 	CTask* pTask = findTask(EvtInfo.nInstance);
143
-	if(pTask != NULL)		
143
+	if (pTask != NULL)
144 144
 		pTask->OnDevOpProcess(EvtInfo);
145 145
 }
146 146
 
@@ -149,9 +149,9 @@ void CTaskMgr::__procDevOpProcess( UINT EvtType, const PARAM lpContent )
149 149
 **【函数功能】	设备操作结果返回
150 150
 **【参数】		EvtType 消息事件类型
151 151
 				lpContent 消息内容
152
-**【返回值】	
152
+**【返回值】
153 153
 ****************************************************************/
154
-void CTaskMgr::__procDevOpResult( UINT EvtType, const PARAM lpContent )
154
+void CTaskMgr::__procDevOpResult(UINT EvtType, const PARAM lpContent)
155 155
 {
156 156
 	__try
157 157
 	{
@@ -177,15 +177,15 @@ void CTaskMgr::__procDevOpResult( UINT EvtType, const PARAM lpContent )
177 177
 **【函数功能】	设备主动操作
178 178
 **【参数】		EvtType 消息事件类型
179 179
 				lpContent 消息内容
180
-**【返回值】		
180
+**【返回值】
181 181
 ****************************************************************/
182
-void CTaskMgr::__procDevOperator( UINT EvtType, const PARAM lpContent )
182
+void CTaskMgr::__procDevOperator(UINT EvtType, const PARAM lpContent)
183 183
 {
184 184
 	CTask *pTask = NULL;
185 185
 	// 事件内容解析
186 186
 	EventDevOperation &EvtInfo = *(EventDevOperation*)lpContent;
187
-	
188
-	switch(EvtInfo.nOpType)
187
+
188
+	switch (EvtInfo.nOpType)
189 189
 	{
190 190
 	case DEV_OP_CALL_IN:				// 外线来电
191 191
 		pTask = new(std::nothrow) CTaskDevCallIn(EvtInfo);
@@ -199,24 +199,24 @@ void CTaskMgr::__procDevOperator( UINT EvtType, const PARAM lpContent )
199 199
 		break;
200 200
 	}
201 201
 
202
-	if(pTask == NULL) 
202
+	if (pTask == NULL)
203 203
 		return;
204 204
 
205 205
 	// 保存Task
206 206
 	__addTask(pTask);
207 207
 
208 208
 	// 返回Fals代表执行失败,移除Task
209
-	if(!pTask->DoTask()) 
210
-		removeTask((long)pTask);	
209
+	if (!pTask->DoTask())
210
+		removeTask((long)pTask);
211 211
 }
212 212
 
213 213
 /*****************************************************************
214 214
 **【函数名称】	init
215 215
 **【函数功能】	模块初始化
216
-**【参数】		
217
-**【返回值】	
216
+**【参数】
217
+**【返回值】
218 218
 ****************************************************************/
219
-void CTaskMgr::init( void )
219
+void CTaskMgr::init(void)
220 220
 {
221 221
 	// 注册底层设备消息和设备操作结果
222 222
 	CMsgCenter& MC = CMsgCenter::GetInstance();
@@ -237,24 +237,24 @@ void CTaskMgr::uninit(void)
237 237
 /*****************************************************************
238 238
 **【函数名称】	removeTask
239 239
 **【函数功能】	删除Task
240
-**【参数】		
241
-**【返回值】	
240
+**【参数】
241
+**【返回值】
242 242
 ****************************************************************/
243
-void CTaskMgr::removeTask( long TaskId )
243
+void CTaskMgr::removeTask(long TaskId)
244 244
 {
245
-	if(TaskId == TASK_ID_INVALID)
245
+	if (TaskId == TASK_ID_INVALID)
246 246
 		return;
247 247
 
248 248
 	m_TaskLock.Lock();
249 249
 
250 250
 	CTask* pTask = NULL;
251
-	if(m_TaskTable.Lookup(TaskId, pTask))
251
+	if (m_TaskTable.Lookup(TaskId, pTask))
252 252
 	{
253 253
 		m_TaskTable.RemoveKey(TaskId);
254 254
 		// 删除Task	
255 255
 		ASSERT(pTask != NULL);
256 256
 		delete pTask;
257
-		pTask=NULL;
257
+		pTask = NULL;
258 258
 	}
259 259
 
260 260
 	POSITION pos = m_TaskTable.GetStartPosition();
@@ -264,7 +264,7 @@ void CTaskMgr::removeTask( long TaskId )
264 264
 		if (pTask == NULL || pTask->IsExpire()) {
265 265
 			m_TaskTable.RemoveKey(strKey);
266 266
 			if (pTask != NULL) {
267
-				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{TaskMgr}: 失效Task[%s]TaskId[%ld]LineId[%d]时间[%ld]删除"),pTask->Name(), reinterpret_cast<LONG>(pTask),pTask->GetAssoLineId(),pTask->TaskTime());
267
+				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{TaskMgr}: 失效Task[%s]TaskId[%ld]LineId[%d]时间[%ld]删除"), pTask->Name(), reinterpret_cast<LONG>(pTask), pTask->GetAssoLineId(), pTask->TaskTime());
268 268
 				delete pTask;
269 269
 				pTask = NULL;
270 270
 			}
@@ -281,12 +281,12 @@ void CTaskMgr::removeTask( long TaskId )
281 281
 /*****************************************************************
282 282
 **【函数名称】	findTask
283 283
 **【函数功能】	查找Task
284
-**【参数】		
284
+**【参数】
285 285
 **【返回值】
286 286
 ****************************************************************/
287
-CTask* CTaskMgr::findTask( long TaskId )
287
+CTask* CTaskMgr::findTask(long TaskId)
288 288
 {
289
-	if(TaskId == TASK_ID_INVALID)
289
+	if (TaskId == TASK_ID_INVALID)
290 290
 		return NULL;
291 291
 
292 292
 	CTask* pTask = NULL;
@@ -302,14 +302,14 @@ CTask* CTaskMgr::findTask( long TaskId )
302 302
 **【函数名称】	onPduMessage
303 303
 **【函数功能】	Pdu命令处理接口
304 304
 **【参数】		PduEntity: 消息实体
305
-**【返回值】	
305
+**【返回值】
306 306
 ***************************************************************/
307
-void CTaskMgr::onPduMessage( CPduEntity &PduEntity )
307
+void CTaskMgr::onPduMessage(CPduEntity &PduEntity)
308 308
 {
309 309
 	// 根据命令类型创建Task
310 310
 	CTask *pTask = NULL;
311 311
 	PDU_CMD_TYPE nCmdType = PduEntity.GetCmdType();
312
-	switch(nCmdType)
312
+	switch (nCmdType)
313 313
 	{
314 314
 	case PDU_CMD_AGENT_LOGIN:			// 坐席签入
315 315
 		__onAgentLogin(PduEntity);
@@ -344,7 +344,7 @@ void CTaskMgr::onPduMessage( CPduEntity &PduEntity )
344 344
 		break;
345 345
 
346 346
 	case PDU_CMD_AGENT_TAKEBACK:		// 坐席接回
347
-		pTask = new(std::nothrow) CTaskAgentTakeBack(PduEntity);	
347
+		pTask = new(std::nothrow) CTaskAgentTakeBack(PduEntity);
348 348
 		break;
349 349
 
350 350
 	case PDU_CMD_AGENT_TRANSTALK:		// 坐席转移
@@ -435,17 +435,14 @@ void CTaskMgr::onPduMessage( CPduEntity &PduEntity )
435 435
 		break;
436 436
 	}
437 437
 
438
-	if(pTask == NULL) return;
438
+	if (pTask == NULL) return;
439 439
 
440 440
 	// 保存Task
441 441
 	__addTask(pTask);
442 442
 
443 443
 	// 返回Fase代表操作失败,移除该Task
444
-	if(!pTask->DoTask()) 
444
+	if (!pTask->DoTask())
445 445
 		__onTaskFailed(pTask, PduEntity);
446
-	else
447
-		ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, _T("{CTaskMgr}:DoTask[%s]TaskId[%ld]LineId[%d]时间[%ld]"), pTask->Name(), reinterpret_cast<LONG>(pTask), pTask->GetAssoLineId(), pTask->TaskTime());
448
-
449 446
 }
450 447
 
451 448
 /*****************************************************************
@@ -455,21 +452,21 @@ void CTaskMgr::onPduMessage( CPduEntity &PduEntity )
455 452
 				PduEntity:消息实体
456 453
 **【返回值】
457 454
 ***************************************************************/
458
-void CTaskMgr::onTaskPduMsg( UINT LineId, CPduEntity &PduEntity )
455
+void CTaskMgr::onTaskPduMsg(UINT LineId, CPduEntity &PduEntity)
459 456
 {
460 457
 	CLogicLine* pLine = CLineHolder::GetInstance().getLogicLine(LineId);
461 458
 	ASSERT(pLine != NULL);
462
-	if(pLine == NULL)
459
+	if (pLine == NULL)
463 460
 	{
464 461
 		ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, _T("{TaskMgr}: Task处理PDU命令失败, 无法定位关联线路[%d]"), LineId);
465 462
 		return;
466 463
 	}
467 464
 
468 465
 	CTask* pTask = findTask(pLine->taskIdBinded());
469
-	if(pTask == NULL)
466
+	if (pTask == NULL)
470 467
 	{
471 468
 		pLine->taskIdBinded() = TASK_ID_INVALID;
472
-		if(PduEntity.GetCmdType() == PDU_CMD_AGENT_CONFIRM_TRANSFER)
469
+		if (PduEntity.GetCmdType() == PDU_CMD_AGENT_CONFIRM_TRANSFER)
473 470
 		{
474 471
 			// 返回命令
475 472
 			PduEntity.SetToExecReturn();
@@ -480,8 +477,8 @@ void CTaskMgr::onTaskPduMsg( UINT LineId, CPduEntity &PduEntity )
480 477
 	else
481 478
 	{
482 479
 		// task处理Pdu命令返回成功,删除task
483
-		if(pTask->OnCmdOperation(PduEntity))
484
-			removeTask((long)pTask); 
480
+		if (pTask->OnCmdOperation(PduEntity))
481
+			removeTask((long)pTask);
485 482
 	}
486 483
 }
487 484
 
@@ -490,13 +487,13 @@ void CTaskMgr::onTaskPduMsg( UINT LineId, CPduEntity &PduEntity )
490 487
 **【函数功能】	消息事件处理函数
491 488
 **【参数】		EvtType 消息事件类型
492 489
 				lpContent 消息内容
493
-**【返回值】	
490
+**【返回值】
494 491
 ****************************************************************/
495
-void CTaskMgr::onMessage( UINT MsgType, const PARAM lpContent )
492
+void CTaskMgr::onMessage(UINT MsgType, const PARAM lpContent)
496 493
 {
497
-	if(lpContent == NULL) return;
494
+	if (lpContent == NULL) return;
498 495
 
499
-	switch(MsgType)
496
+	switch (MsgType)
500 497
 	{
501 498
 	case DEV_EVENT_LINE_OP_PROCESS:		// 设备操作进展
502 499
 		__procDevOpProcess(MsgType, lpContent);
@@ -513,10 +510,3 @@ void CTaskMgr::onMessage( UINT MsgType, const PARAM lpContent )
513 510
 }
514 511
 
515 512
 
516
-
517
-
518
-
519
-
520
-
521
-
522
-

binární
FirstStep/FirstStep.aps


+ 5 - 0
IVR/DingDing.yml

@@ -0,0 +1,5 @@
1
+IsPush: false
2
+PushUrl: https://oapi.dingtalk.com/robot/send?access_token=d4efe5b71f2e92a11ff89bb8ad704319e2d874ef5e590e8a78247405542bf637
3
+ProjectName: "[127.0.0.1-UNKNOW]"
4
+HeartTimeOut: 2
5
+DelayTime: 0

+ 28 - 4
IVR/NetworkIvr.cpp

@@ -30,7 +30,7 @@ BOOL CNetworkIvr::init( void )
30 30
 #else
31 31
 	CPduDataFormat::getInstance()->Load("./PDUFormat.ini");
32 32
 #endif
33
-
33
+	/*
34 34
 	// 注册事件响应接口
35 35
 	IPduLink* pPduLink = CInterfaceWindow::getLinkInstance();
36 36
 	IPduComm* pPduComm = CInterfaceWindow::getCommInstance();
@@ -45,7 +45,25 @@ BOOL CNetworkIvr::init( void )
45 45
 		ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Network}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常"), CtiIp, CtiPort);
46 46
 		return FALSE;
47 47
 	} // end if
48
+	*/
49
+	// 注册事件响应接口 2022-10-26 改用IOCP,保持和CTI,ACD一样
50
+	CInterfaceWindow::getIocpLinkInstance()->RegistPduLinkProc(this, TRUE);
51
+	CInterfaceWindow::getIocpCommInstance()->RegistPduCommProc(this, TRUE);
52
+	CString CtiIp = CConfig::ctiIp();
53
+	int CtiPort = CConfig::ctiPort();
54
+	// 创建 SERVER
55
+	int ListenPort = 8841;
56
+	if (!CInterfaceWindow::getIocpLinkInstance()->CreatePduServer(ListenPort, PDU_DEV_TYPE_IVR, 0))
57
+	{
58
+		ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Network}: 连接CTI服务器[%s:%d]失败, 请检查端口[%d]是否被占用"), CtiIp, CtiPort, ListenPort);
59
+		return false;
60
+	}
48 61
 
62
+	if (!CInterfaceWindow::getIocpLinkInstance()->CreatePduClient(CtiIp, CtiPort, PDU_DEV_TYPE_IVR, 0, PDU_DEV_TYPE_CTI, 0, true))
63
+	{
64
+		ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_ERROR, _T("{Network}: 连接CTI服务器[%s:%d]失败, 请检查网络配置是否正常"), CtiIp, CtiPort);
65
+		return false;
66
+	} // end if
49 67
 	return TRUE;
50 68
 }
51 69
 
@@ -66,17 +84,23 @@ void CNetworkIvr::release( void )
66 84
 **【参数】		设备类型,命令内容
67 85
 **【返回值】	
68 86
 ****************************************************************/
69
-BOOL CNetworkIvr::send( CPduEntity& a_PduEntity )
87
+BOOL CNetworkIvr::send(CPduEntity& a_PduEntity)
70 88
 {
71
-	if(!m_IsCtiConnected) 
89
+	if (!m_IsCtiConnected)
72 90
 		return false;
73
-
91
+	/*
74 92
 	// 判断是返回消息还是主动给CTI的消息
75 93
 	IPduComm* pComm = CInterfaceWindow::getCommInstance();
76 94
 	if(a_PduEntity.GetIsExecReturn())
77 95
 		return pComm->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId());
78 96
 
79 97
 	return pComm->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID);
98
+	*/
99
+	// 判断是返回消息还是主动给CTI的消息 2022-10-26 改用iocp,保持和CTI,ACD一样
100
+	auto pComm = CInterfaceWindow::getIocpCommInstance();
101
+	if (a_PduEntity.GetIsExecReturn())
102
+		pComm->Send(&a_PduEntity, a_PduEntity.GetLocalDevType(), a_PduEntity.GetLocalDevId());
103
+	return pComm->Send(&a_PduEntity, PDU_DEV_TYPE_CTI, m_CtiDevID);
80 104
 }
81 105
 
82 106
 /*****************************************************************

+ 10 - 0
IVR/RcfConfig.yml

@@ -0,0 +1,10 @@
1
+Rcf:
2
+  IP: 127.0.0.1
3
+  PORT: 5001
4
+Redis:
5
+  IP: 127.0.0.1
6
+  PORT: 6379
7
+Http:
8
+  PORT: 8000
9
+Https:
10
+  PORT: 8443

+ 44 - 0
IVR/log/2022-10-11/IVR_1.txt

@@ -0,0 +1,44 @@
1
+2022-10-11 17:33:55.714960 | 2022-10-11 17:33:55.714960 [信息] CPduSocket::OnReceive(266)接收[CTI]数据长度[28]
2
+2022-10-11 17:33:55.714960 | 2022-10-11 17:33:55.714960 [信息] CPduSocket::OnReceive(268)待处理[CTI]数据长度[28]
3
+2022-10-11 17:33:55.714960 | 2022-10-11 17:33:55.714960 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[0]
4
+2022-10-11 17:33:55.714960 | 2022-10-11 17:33:55.714960 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
5
+2022-10-11 17:34:20.569541 | 2022-10-11 17:34:20.568538 [信息] CPduSocket::OnReceive(266)接收[CTI]数据长度[28]
6
+2022-10-11 17:34:20.569541 | 2022-10-11 17:34:20.569541 [信息] CPduSocket::OnReceive(268)待处理[CTI]数据长度[28]
7
+2022-10-11 17:34:20.569541 | 2022-10-11 17:34:20.569541 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[0]
8
+2022-10-11 17:34:20.570505 | 2022-10-11 17:34:20.569541 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
9
+2022-10-11 17:44:12.614197 | 2022-10-11 17:43:58.904851 [信息] CPduSocket::OnReceive(266)接收[CTI]数据长度[106]
10
+2022-10-11 17:44:31.375037 | 2022-10-11 17:44:02.508216 [信息] CPduSocket::OnReceive(268)待处理[CTI]数据长度[106]
11
+2022-10-11 17:46:08.476424 | 2022-10-11 17:44:31.375037 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[78]
12
+2022-10-11 17:47:00.848399 | 2022-10-11 17:46:39.239175 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
13
+2022-10-11 17:47:02.116011 | 2022-10-11 17:47:00.848399 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[52]
14
+2022-10-11 17:47:09.010577 | 2022-10-11 17:47:02.111024 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
15
+2022-10-11 17:47:57.494948 | 2022-10-11 17:47:57.489961 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[26]
16
+2022-10-11 17:47:59.532500 | 2022-10-11 17:47:59.529508 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
17
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:54.134662 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[0]
18
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:54.134662 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
19
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(266)接收[CTI]数据长度[312]
20
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(268)待处理[CTI]数据长度[312]
21
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[286]
22
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
23
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[260]
24
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
25
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[234]
26
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
27
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[208]
28
+2022-10-11 17:49:56.263970 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
29
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[182]
30
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
31
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[156]
32
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
33
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[130]
34
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
35
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[104]
36
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
37
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[78]
38
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
39
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[52]
40
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
41
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.263970 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[26]
42
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.264967 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据
43
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.264967 [信息] CPduSocket::OnReceive(298)准备提交[CTI]数据[0]
44
+2022-10-11 17:49:56.264967 | 2022-10-11 17:49:56.264967 [信息] CPduSocket::OnReceive(300)已处理[CTI]提交数据

+ 8 - 0
Middleware.sln

@@ -23,6 +23,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FsLink", "FsLink\FsLink.vcx
23 23
 EndProject
24 24
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DBCtrl", "DBCtrl\DBCtrl.vcxproj", "{BBC31C4F-52DF-43EC-93AC-BE95DBA71180}"
25 25
 EndProject
26
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NetLib", "NetLib\NetLib.vcxproj", "{2393D53B-07E9-4D90-9B10-0707E065C2D6}"
27
+EndProject
26 28
 Global
27 29
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
28 30
 		Debug|Win32 = Debug|Win32
@@ -91,6 +93,12 @@ Global
91 93
 		{BBC31C4F-52DF-43EC-93AC-BE95DBA71180}.Release|Win32.ActiveCfg = Release|Win32
92 94
 		{BBC31C4F-52DF-43EC-93AC-BE95DBA71180}.Release|Win32.Build.0 = Release|Win32
93 95
 		{BBC31C4F-52DF-43EC-93AC-BE95DBA71180}.Release|x64.ActiveCfg = Release|Win32
96
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Debug|Win32.ActiveCfg = Debug|Win32
97
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Debug|Win32.Build.0 = Debug|Win32
98
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Debug|x64.ActiveCfg = Debug|Win32
99
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Release|Win32.ActiveCfg = Release|Win32
100
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Release|Win32.Build.0 = Release|Win32
101
+		{2393D53B-07E9-4D90-9B10-0707E065C2D6}.Release|x64.ActiveCfg = Release|Win32
94 102
 	EndGlobalSection
95 103
 	GlobalSection(SolutionProperties) = preSolution
96 104
 		HideSolutionNode = FALSE

+ 6 - 4
Public/GlobalDef/SqlWriter.cpp

@@ -65,19 +65,21 @@ UINT CSqlWriter::__writeThreadFun( LPVOID pParam )
65 65
 			{
66 66
 				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息写入数据库失败,统计内容:%s"), Sql);
67 67
 				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计写入数据库失败原因:%s"), pDbControl->GetLastError());
68
-			   
68
+				bool isSuccess = false;
69 69
 				for (int i = 0; i < 5; ++i)
70 70
 				{
71 71
 					Sleep(1000 * 2);
72 72
 					if (pDbControl->ExecCommand(Sql))
73 73
 					{
74
+						isSuccess = true;
74 75
 						ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息再次写入数据库成功,统计内容:%s"), Sql);
75 76
 						break;
76 77
 					}
77 78
 				}
78
-				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息再次写入数据库失败,统计内容:%s"), Sql);
79
-				ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计再次写入数据库失败原因:%s"), pDbControl->GetLastError());
80
-
79
+				if (!isSuccess) {
80
+					ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计信息再次写入数据库失败,统计内容:%s"), Sql);
81
+					ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_ERROR, _T("{SQL}: 统计再次写入数据库失败原因:%s"), pDbControl->GetLastError());
82
+				}
81 83
 			}
82 84
 
83 85
 		} // end while

binární
Release/ACD.exe


binární
Release/ACD.pdb


binární
Release/CTI.exe


binární
Release/CTI.pdb


binární
Release/FsLink.dll


binární
Release/FsLink.pdb


binární
Release/IVR.exe


binární
Release/IVR.pdb


binární
Release/Logger.dll


+ 12 - 4
Release/PDUFormat.ini

@@ -18,7 +18,7 @@
18 18
 
19 19
 ;综合信息
20 20
 [Head]
21
-TotalCount = 65					// 命令总数
21
+TotalCount = 66					// 命令总数
22 22
 
23 23
 ;注册[PDU_CMD_REG]
24 24
 [PDU_CMD_FORMAT_000]
@@ -36,7 +36,7 @@ DataCount = 0;
36 36
 ;坐席签入[PDU_CMD_AGENT_LOGIN]
37 37
 [PDU_CMD_FORMAT_002]
38 38
 CmdType = 101
39
-DataCount = 8
39
+DataCount = 9
40 40
 DATA[0] = 4|0|操作是否成功|1
41 41
 DATA[1] = 1|0|坐席分机ID|0
42 42
 DATA[2] = 1|0|坐席工号|0
@@ -45,6 +45,7 @@ DATA[4] = 1|0|
45 45
 DATA[5] = 1|0|话后处理时长|0
46 46
 DATA[6] = 1|0|签入失败原因|1
47 47
 DATA[7] = 1|0|坐席媒体编码|1
48
+DATA[8] = 1|0|是否恢复签入|0
48 49
 
49 50
 ;坐席签出[PDU_CMD_AGENT_LOGOUT]
50 51
 [PDU_CMD_FORMAT_003]
@@ -381,14 +382,13 @@ DATA[1] = 1|0|占
381 382
 ;CTI通知IVR外线来电[PDU_CMD_CTI_IVR_CALLIN]
382 383
 [PDU_CMD_FORMAT_036]
383 384
 CmdType = 306
384
-DataCount = 7
385
+DataCount = 6
385 386
 DATA[0] = 4|0|IVR处理来电结果|1
386 387
 DATA[1] = 0|0|流程ID|1
387 388
 DATA[2] = 3|0|CallID|0
388 389
 DATA[3] = 5|64|主叫号码|0
389 390
 DATA[4] = 5|64|被叫号码|0
390 391
 DATA[5] = 1|0|外线ID|0
391
-DATA[6] = 5|64|fsUUID|0
392 392
 
393 393
 ;CTI通知IVR转IVR[PDU_CMD_CTI_IVR_TURNIVR]
394 394
 [PDU_CMD_FORMAT_037]
@@ -686,3 +686,11 @@ DATA[0] = 4|0|
686 686
 DATA[1] = 1|0|坐席分机ID|0
687 687
 DATA[2] = 1|0|坐席工号|0
688 688
 DATA[3] = 5|256|按键内容|0
689
+
690
+;请求分机状态列表,驻马店专用[PDU_CMD_EXTEN_STATE_LIST_ZMD]
691
+[PDU_CMD_FORMAT_065]
692
+CmdType = 146
693
+DataCount = 2
694
+DATA[0] = 1|0|坐席分机ID|0
695
+DATA[1] = 1|0|坐席工号|0
696
+

+ 54 - 0
Release/sql脚本.txt

@@ -0,0 +1,54 @@
1
+--判断字段不存在则添加
2
+if not exists(select * from sys.columns where name='GroupId' and [object_id]=object_id(N'rep_ext_call_in')) 
3
+alter table rep_ext_call_in add GroupId varchar(64) null
4
+
5
+if not exists(select * from sys.columns where name='GroupId' and [object_id]=object_id(N'rep_ext_call_out')) 
6
+alter table rep_ext_call_out add GroupId varchar(64) null
7
+
8
+if not exists(select * from sys.columns where name='GroupId' and [object_id]=object_id(N'rep_agent_state')) 
9
+alter table rep_agent_state add GroupId varchar(64) null
10
+
11
+if not exists(select * from sys.columns where name='ExtId' and [object_id]=object_id(N'rep_agent_state')) 
12
+alter table rep_agent_state add ExtId int null
13
+
14
+--新增表
15
+if not exists (select * from sysobjects where id = object_id('rep_service') 
16
+and OBJECTPROPERTY(id, 'IsUserTable') = 1) begin
17
+create table  rep_service(
18
+   Checkin int,
19
+   Conversation int 
20
+)end
21
+
22
+if not exists (select * from sysobjects where id = object_id('rep_wait_count') 
23
+and OBJECTPROPERTY(id, 'IsUserTable') = 1) begin
24
+create table  rep_wait_count
25
+(
26
+   id int,
27
+   Count int,
28
+   UpdateTime datetime ,
29
+   primary key (id)
30
+)
31
+end
32
+
33
+if not exists (select * from sysobjects where id = object_id('rep_hangup') 
34
+and OBJECTPROPERTY(id, 'IsUserTable') = 1) begin
35
+create table  rep_hangup
36
+(
37
+   CallID bigint,
38
+   HangUpType int,
39
+   primary key (CallID)
40
+)
41
+end
42
+
43
+if not exists (select * from sysobjects where id = object_id('rep_freeswitch') 
44
+and OBJECTPROPERTY(id, 'IsUserTable') = 1) begin
45
+create table  rep_freeswitch
46
+(
47
+   Id int IDENTITY (1, 1) NOT NULL,
48
+   UUId varchar(50),
49
+   CallID bigint,
50
+   CreateTime datetime,
51
+   HupTime datetime,
52
+   primary key (Id)
53
+)
54
+end