void LoginNode::yzDoWork(int LineNo,Channel &channel) { LPTSTR AlreadyLoginPath = ""; LPTSTR VoicePath2 = ""; LPTSTR VoicePath3 = ""; LPTSTR PlayLimitVoice = ""; LPTSTR ErrorVoice = ""; CString strState = ""; CString tmpState = ""; int tempCode; //Store the temporary data if( state == CH_LOGIN && playCount == 0 ) { waitTime = myXml.getWaitTimeOrReplayNumByNodeId(channel.CurrNodeId,_T("WaitTime")); replayNum = myXml.getWaitTimeOrReplayNumByNodeId(channel.CurrNodeId,_T("ReplayNum")); bFlag1 = myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("Input1"),VoicePath1); bFlag2 = myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("HintVoice"),HintVoice1); } switch(channel.nType) { case CHTYPE_USER: if( !OffHookDetect(LineNo) && channel.UsableFlag != TRUE ) { pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); TRACE0("\n|"); switch(state) { case CH_LOGIN: case CH_ISLOGIN: case CH_WAITDIAL1: StopIndexPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_GETDIAL1: case CH_GETDIAL2: case CH_GETPWD: case CH_WAITDIAL3: StopPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_GETDIAL3: case CH_LOGINSUCCESS: case CH_WAITDIAL4: StopIndexPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_GETDIAL4: case CH_ERRORINPUT: StopPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_WAITONHOOK: StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_STOP); ResetLine(LineNo,channel); return; default: break; } } break; case CHTYPE_TRUNK: break; }//end switch switch(state) { case CH_LOGIN: channel.nTimeElapse = 0; strState = _T("播放语音"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); RsetIndexPlayFile(LineNo); if( channel.IsLogin ) { if( playCount == 0 ) { if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("AlreadyLogin1"),AlreadyLoginPath) ) { AddIndexPlayFile(LineNo,AlreadyLoginPath); } } if( bFlag2 ) { AddIndexPlayFile(LineNo,HintVoice1); } StartIndexPlayFile(LineNo); playCount++; state = CH_ISLOGIN; break; } else { if( bFlag1 ) { AddIndexPlayFile(LineNo,VoicePath1); } if( bFlag2 ) { AddIndexPlayFile(LineNo,HintVoice1); } StartIndexPlayFile(LineNo); playCount++; state = CH_WAITDIAL1; break; } break; case CH_WAITDIAL1: strState = _T("等待拨号"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckIndexPlayFile(LineNo) ) { StopIndexPlayFile(LineNo); if( channel.nTimeElapse > waitTime*1000 ) { if( playCount < replayNum ) state = CH_LOGIN; else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("PlayLimit"),PlayLimitVoice); StartPlayFile(LineNo,PlayLimitVoice,0L); state = CH_WAITONHOOK; } } channel.nTimeElapse += 100; } else if( DtmfHit(LineNo) ) { StopIndexPlayFile(LineNo); } if( DtmfHit(LineNo) ) { state = CH_GETDIAL1; channel.nTimeElapse = 0; playCount = 0; } break; case CH_GETDIAL1: strState = _T("接受用户代码"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); tempCode = GetDtmfCode(LineNo); if( tempCode != -1 ) { channel.DTMFCode[0] = GetCodeAscii(tempCode); channel.DTMFCode[1] = NULL; channel.TelLength++; int nextNodeId = 0; if( myXml.findKeyByCode(channel.CurrNodeId,GetCodeAscii(tempCode),nextNodeId) ) { channel.CurrNodeId = nextNodeId; state = CH_LOGIN; InitDtmfBuf(LineNo); channel.TelLength = 0; } else if( GetCodeAscii(tempCode) == '#' ) { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("NoUser"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; channel.TelLength = 0; } else { state = CH_GETDIAL2; } } tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)channel.DTMFCode ) pList1->SetItemText(LineNo,4,channel.DTMFCode); break; case CH_GETDIAL2: strState = _T("接受用户代码"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); tempCode = GetDtmfCode(LineNo); if(tempCode != -1) { if( GetCodeAscii(tempCode) == '#' ) { strcpy(inputCode,channel.DTMFCode); TRACE2("inputCode=%s, dtmfCode=%s ",inputCode,channel.DTMFCode); if( mySql.findUserId((LPCTSTR)inputCode,pConn) ) { state = CH_GETPWD; } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("NoUser"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; channel.TelLength = 0; memset(inputCode,0,100); } } else { channel.DTMFCode[channel.TelLength] = GetCodeAscii(tempCode); channel.DTMFCode[channel.TelLength+1] = NULL; channel.TelLength++; } } tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)channel.DTMFCode ) pList1->SetItemText(LineNo,4,channel.DTMFCode); break; case CH_GETPWD: channel.nTimeElapse = 0; channel.TelLength = 0; strState = _T("播放语音"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("Input2"),VoicePath2) ) { StartPlayFile(LineNo,VoicePath2,0L); } playCount2++; state = CH_WAITDIAL3; break; case CH_WAITDIAL3: strState = _T("等待拨号"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckPlayEnd(LineNo) ) { StopPlayFile(LineNo); if( channel.nTimeElapse > waitTime*1000 ) { if( playCount2 < replayNum ) state = CH_GETPWD; else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("PlayLimit"),PlayLimitVoice); StartPlayFile(LineNo,PlayLimitVoice,0L); state = CH_WAITONHOOK; } } channel.nTimeElapse += 100; } else if( DtmfHit(LineNo) ) { StopPlayFile(LineNo); } if( DtmfHit(LineNo) ) { state = CH_GETDIAL3; channel.nTimeElapse = 0; playCount2 = 0; } break; case CH_GETDIAL3: strState = _T("接受用户密码"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)_T("***") ) pList1->SetItemText(LineNo,4,(LPCTSTR)_T("***")); tempCode = GetDtmfCode(LineNo); if( tempCode != -1 ) { if( GetCodeAscii(tempCode) == '#' ) { strcpy(inputCode2,channel.DTMFCode); if( mySql.checkPassword( (LPCTSTR)inputCode, (LPCTSTR)inputCode2, pConn) ) { BOOL flag = FALSE; for(int i=0;i<channel.TotalLine;i++) { if( i == LineNo ) continue; toChannel = node_cs->getChannel( i ); if ( toChannel->IsLogin && strcmp(inputCode,toChannel->UserId) == 0 ) { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("AlreadyLogin2"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; channel.TelLength = 0; memset(inputCode,0,100); memset(inputCode2,0,100); flag = TRUE; break; } } if( flag ) break; channel.IsLogin = TRUE; strcpy(channel.UserId,inputCode); //更新坐席人员登录时间 CTime tm; CString strTime; tm=CTime::GetCurrentTime(); strTime = tm.Format(_T("%Y-%m-%d %X")); mySql.updateUserRecentLoginTime( (LPCTSTR)inputCode,strTime,pConn ); //更新坐席人员状态界面 int phoneNum = 0; CString str1 = _T(""); CString str2 = _T(""); if( myXml.getPhoneNumByChannelNo(channel.CurrNodeId,phoneNum,LineNo) ) { str1.Format(_T("%d"),phoneNum); str2.Format(_T("%d"),LineNo); int itemCount = pList2->GetItemCount(); for(int i=0; i<itemCount; i++) { if(pList2->GetItemText(i,1) == (LPCTSTR)inputCode) { pList2->SetItemText(i,3,str1); pList2->SetItemText(i,4,str2); pList2->SetItemText(i,5,strTime); strcpy(channel.PhoneNum,(LPTSTR)(LPCTSTR)str1); //存储此通道对应的分机号。 break; } } } //写日志,登录成功。 CString strDetails; strDetails = strTime + CString(_T("座席")) + (LPCTSTR)channel.UserId + CString(_T("登录成功;")); myXml.insertTextToLogItem(channel.strItemId,strDetails,_T("Details"),channel.ctStartTime); state = CH_LOGINSUCCESS; break; } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("WrongPwd"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; channel.TelLength = 0; memset(inputCode,0,100); memset(inputCode2,0,100); break; } } else { channel.DTMFCode[channel.TelLength] = GetCodeAscii(tempCode); channel.DTMFCode[channel.TelLength+1] = NULL; channel.TelLength++; break; } } break; case CH_LOGINSUCCESS: strState = _T("登录成功"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); channel.nTimeElapse = 0; channel.TelLength = 0; RsetIndexPlayFile(LineNo); if( playCount3 == 0) { if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("LoginSuccess"),VoicePath3) ) { AddIndexPlayFile(LineNo,VoicePath3); } } if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("HintVoice"),HintVoice1) ) { AddIndexPlayFile(LineNo,HintVoice1); } StartIndexPlayFile(LineNo); playCount3++; state = CH_WAITDIAL4; break; case CH_WAITDIAL4: strState = _T("等待拨号"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckIndexPlayFile(LineNo) ) { StopIndexPlayFile(LineNo); if( channel.nTimeElapse > waitTime*1000 ) { if( playCount3 < replayNum ) state = CH_LOGINSUCCESS; else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("PlayLimit"),PlayLimitVoice); StartPlayFile(LineNo,PlayLimitVoice,0L); state = CH_WAITONHOOK; } } channel.nTimeElapse += 100; } else if( DtmfHit(LineNo) ) { StopIndexPlayFile(LineNo); } if( DtmfHit(LineNo) ) { state = CH_GETDIAL4; channel.nTimeElapse = 0; } break; case CH_GETDIAL4: strState = _T("接受用户拨号"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); tempCode = GetDtmfCode(LineNo); if( tempCode != -1 ) { channel.DTMFCode[channel.TelLength] = GetCodeAscii(tempCode); channel.DTMFCode[channel.TelLength+1] = NULL; channel.TelLength++; int nextNodeId = 0; if(myXml.findKeyByCode(channel.CurrNodeId,GetCodeAscii(tempCode),nextNodeId)) { playCount3 = 0; channel.CurrNodeId = nextNodeId; state = CH_LOGIN; InitDtmfBuf(LineNo); channel.TelLength = 0; memset(inputCode,0,100); memset(inputCode2,0,100); } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("ErrorVoice"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT1; } } tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)channel.DTMFCode ) pList1->SetItemText(LineNo,4,channel.DTMFCode); break; case CH_ISLOGIN: strState = _T("重复登录"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckIndexPlayFile(LineNo) ) { StopIndexPlayFile(LineNo); if( channel.nTimeElapse > waitTime*1000 ) { if( playCount < replayNum ) state = CH_LOGIN; else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("PlayLimit"),PlayLimitVoice); StartPlayFile(LineNo,PlayLimitVoice,0L); state = CH_WAITONHOOK; } } channel.nTimeElapse += 100; } else if( DtmfHit(LineNo) ) { StopIndexPlayFile(LineNo); } if( DtmfHit(LineNo) ) { channel.nTimeElapse = 0; // playCount = 0; // tempCode = GetDtmfCode(LineNo); if( tempCode != -1 ) { channel.DTMFCode[channel.TelLength] = GetCodeAscii(tempCode); channel.DTMFCode[channel.TelLength+1] = NULL; channel.TelLength++; int nextNodeId = 0; if(myXml.findKeyByCode(channel.CurrNodeId,GetCodeAscii(tempCode),nextNodeId)) { channel.CurrNodeId = nextNodeId; state = CH_LOGIN; InitDtmfBuf(LineNo); channel.TelLength = 0; playCount = 0; } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("ErrorVoice"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; } tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)channel.DTMFCode ) pList1->SetItemText(LineNo,4,channel.DTMFCode); } } break; case CH_ERRORINPUT: strState = _T("错误输入"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckPlayEnd(LineNo) ) { StopPlayFile(LineNo); channel.DTMFCode[0] = NULL; channel.TelLength = 0; state = CH_LOGIN; } else { InitDtmfBuf(LineNo); } break; case CH_ERRORINPUT1: strState = _T("错误输入"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckPlayEnd(LineNo) ) { StopPlayFile(LineNo); channel.DTMFCode[0] = NULL; channel.TelLength = 0; state = CH_LOGINSUCCESS; } else { InitDtmfBuf(LineNo); } break; case CH_WAITONHOOK: strState = _T("等待挂机"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckPlayEnd(LineNo) ) { StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_BUSY1); } break; default: break; }//end switch }
void VOIPWork ( VOIP_STRUCT *pOneVOIP, Acs_Evt_t *pAcsEvt ) { Acs_CallControl_Data *pCallControl = NULL; VoIPCallPrivate_t *voipCallPrivate = NULL; DeviceID_t FreeVocDeviceID; char FileName[256]; char chTmpFilePath[256] = ""; if (pOneVOIP == NULL || pAcsEvt == NULL) return; if ( pAcsEvt->m_s32EventType == XMS_EVT_CLEARCALL ) /*拆线事件*/ { if (cfg_iVoiceCheck == 1) { StopPlayFile(&pOneVOIP->VocDevID); //删除录音文件 GetFilePathName(pOneVOIP, chTmpFilePath); sprintf(FileName, "%s\\DemoRec.%0003d", chTmpFilePath, pOneVOIP->iSeqID); DeleteFile(FileName); } ResetVOIP ( pOneVOIP, pAcsEvt ); Change_State(pOneVOIP, VOIP_FREE); return ; } switch(pOneVOIP->State) { case VOIP_FREE: if ( pAcsEvt->m_s32EventType == XMS_EVT_CALLIN ) /*呼入事件*/ { pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt); ASSERT(pCallControl->m_PrivData.m_u32DataSize == sizeof(VoIPCallPrivate_t)); voipCallPrivate = (VoIPCallPrivate_t *)&(pCallControl->m_PrivData); XMS_ctsAlertCall ( g_acsHandle, &pOneVOIP->deviceID, NULL ); XMS_ctsAnswerCallIn ( g_acsHandle, &pOneVOIP->deviceID, NULL ); pOneVOIP->iProtocol = voipCallPrivate->m_s32Protocol; //Caller Info strncpy(pOneVOIP->CallerAddr, voipCallPrivate->m_s8CallerAddress, sizeof(pOneVOIP->CallerAddr)); strncpy(pOneVOIP->CallerUserID, voipCallPrivate->m_s8CallerUserID, sizeof(pOneVOIP->CallerUserID)); strncpy ( pOneVOIP->CallerNum, pCallControl->m_s8CallingNum, sizeof(pOneVOIP->CallerNum)); pOneVOIP->iCallerPort = (unsigned short)voipCallPrivate->m_s32CallerPort; // //Callee Info strncpy(pOneVOIP->CalleeAddr, voipCallPrivate->m_s8CalleeAddress, sizeof(pOneVOIP->CalleeAddr)); strncpy(pOneVOIP->CalleeUserID, voipCallPrivate->m_s8CalleeUserID, sizeof(pOneVOIP->CalleeUserID)); strncpy ( pOneVOIP->CalleeNum, pCallControl->m_s8CalledNum, sizeof(pOneVOIP->CalleeNum)); pOneVOIP->iCalleePort = (unsigned short)voipCallPrivate->m_s32CalleePort; // DrawMain_CallInfo( pOneVOIP ); Change_State ( pOneVOIP, VOIP_WAIT_ANSWERCALL ); } break; case VOIP_WAIT_ANSWERCALL: if ( pAcsEvt->m_s32EventType == XMS_EVT_ANSWERCALL ) /*应答呼入完成事件*/ { pCallControl = (Acs_CallControl_Data *)FetchEventData(pAcsEvt); if (cfg_iVoiceCheck == 1) { if ( SearchOneFreeVoice ( pOneVOIP, &FreeVocDeviceID ) >= 0 ) { pOneVOIP->u8PlayTag = 16; pOneVOIP->VocDevID = FreeVocDeviceID; M_OneVoice(FreeVocDeviceID).UsedDevID = pOneVOIP->deviceID; DrawMain_VocInfo ( pOneVOIP ); GetFilePathName(pOneVOIP, chTmpFilePath); sprintf(FileName, "%s\\DemoRec.%0003d", chTmpFilePath, pOneVOIP->iSeqID); RecordFile ( pOneVOIP, FileName, 8000L*10, false); Change_State ( pOneVOIP, VOIP_RECORDFILE ); } } else { Change_State ( pOneVOIP, VOIP_WAITHANGUP ); } } break; case VOIP_RECORDFILE: if ( CheckRecordEnd ( pOneVOIP, pAcsEvt) ) /*record完成事件*/ { BindOneFreeVoice(pOneVOIP, pOneVOIP->VocDevID); Change_State ( pOneVOIP, VOIP_WAITBINDOK); } break; case VOIP_WAITBINDOK: if (pAcsEvt->m_s32EventType == XMS_EVT_SETPARAM) { GetFilePathName(pOneVOIP, chTmpFilePath); sprintf(FileName, "%s\\DemoRec.%0003d", chTmpFilePath, pOneVOIP->iSeqID); pOneVOIP->u8PlayTag ++; PlayFile ( &pOneVOIP->VocDevID, FileName, pOneVOIP->u8PlayTag, true ); Change_State (pOneVOIP, VOIP_PLAYRECORD); } break; case VOIP_PLAYRECORD: if ( CheckPlayEnd ( pOneVOIP, pAcsEvt) ) /*play完成事件*/ { // 主动挂机 UnBindOneVoice(pOneVOIP); XMS_ctsClearCall ( g_acsHandle, &pOneVOIP->deviceID, 0, NULL ); Change_State ( pOneVOIP, VOIP_WAITHANGUP ); } break; } }
void ResultNode::yzDoWork(int LineNo,Channel &channel) { LPTSTR PlayLimitVoice=""; LPTSTR ErrorVoice=""; CString strState = ""; CString tmpState = ""; int tempCode; //Store the temporary data if( state == CH_RESULT && playCount == 0 ) { waitTime = myXml.getWaitTimeOrReplayNumByNodeId(channel.CurrNodeId,_T("WaitTime")); replayNum = myXml.getWaitTimeOrReplayNumByNodeId(channel.CurrNodeId,_T("ReplayNum")); bFlag1 = myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("MainVoice"),VoicePath1); bFlag2 = myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("HintVoice"),VoicePath2); } switch(channel.nType) { case CHTYPE_USER: if( !OffHookDetect(LineNo) && channel.UsableFlag != TRUE ) { pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); TRACE0("\n|"); switch(state) { case CH_RESULT: case CH_WAITDIAL: StopIndexPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_GETDIAL: case CH_ERRORINPUT: StopPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_WAITONHOOK: StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_STOP); ResetLine(LineNo,channel); return; default: break; } }//end if break; case CHTYPE_TRUNK: if( Sig_CheckBusy(LineNo) && channel.UsableFlag != TRUE ) { pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); switch(state) { case CH_RESULT: case CH_WAITDIAL: StopIndexPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_GETDIAL: case CH_ERRORINPUT: StopPlayFile(LineNo); ResetLine(LineNo,channel); return; case CH_WAITONHOOK: StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_STOP); ResetLine(LineNo,channel); return; default: break; } break; }//end if }//end switch switch(state) { case CH_RESULT: channel.nTimeElapse = 0; strState = _T("²¥·ÅÓïÒô"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( playCount == 0 ) { RsetIndexPlayFile(LineNo); if( bFlag1 ) { AddIndexPlayFile(LineNo,VoicePath1); } if( bFlag2 ) { AddIndexPlayFile(LineNo,VoicePath2); } StartIndexPlayFile(LineNo); playCount++; state = CH_WAITDIAL; break; } else { RsetIndexPlayFile(LineNo); if( bFlag2 ) { AddIndexPlayFile(LineNo,VoicePath2); StartIndexPlayFile(LineNo); playCount++; state = CH_WAITDIAL; break; } } case CH_WAITDIAL: strState = _T("µÈ´ý²¦ºÅ"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( CheckIndexPlayFile(LineNo) ) { StopIndexPlayFile(LineNo); if( channel.nTimeElapse > waitTime*1000 ) { if( playCount < replayNum ) { state = CH_RESULT; } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("PlayLimit"),PlayLimitVoice); StartPlayFile(LineNo,PlayLimitVoice,0L); state = CH_WAITONHOOK; } } channel.nTimeElapse += 100; } else if( DtmfHit(LineNo) ) { StopIndexPlayFile(LineNo); } if( DtmfHit(LineNo) ) { state = CH_GETDIAL; channel.nTimeElapse = 0; } break; case CH_GETDIAL: strState = _T("½ÓÊÜÓû§²¦ºÅ"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); tempCode = GetDtmfCode(LineNo); if( tempCode != -1 ) { channel.DTMFCode[channel.TelLength] = GetCodeAscii(tempCode); channel.DTMFCode[channel.TelLength+1] = NULL; channel.TelLength++; int nextNodeId = 0; if( myXml.findKeyByCode(channel.CurrNodeId,GetCodeAscii(tempCode),nextNodeId) ) { channel.CurrNodeId = nextNodeId; ////////////////////////////////////////////////// state = CH_RESULT; InitDtmfBuf(LineNo); channel.TelLength = 0; playCount = 0; } else { myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("ErrorVoice"),ErrorVoice); StartPlayFile(LineNo,ErrorVoice,0L); state = CH_ERRORINPUT; } } tmpState = pList1->GetItemText(LineNo,4); if( tmpState != (LPCTSTR)channel.DTMFCode ) pList1->SetItemText(LineNo,4,channel.DTMFCode); break; case CH_ERRORINPUT: strState = _T("´íÎóÊäÈë"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if(CheckPlayEnd(LineNo)) { StopPlayFile(LineNo); channel.DTMFCode[0] = NULL; channel.TelLength = 0; state = CH_RESULT; } else { InitDtmfBuf(LineNo); } break; case CH_WAITONHOOK: strState = _T("µÈ´ý¹Ò»ú"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if(CheckPlayEnd(LineNo)) { if( channel.nType == CHTYPE_TRUNK ) { StopPlayFile(LineNo); ResetLine(LineNo,channel); pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); } else if( channel.nType == CHTYPE_USER ) { StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_BUSY1); } } break; default: break; }//end switch }
void LogoutNode::yzDoWork(int LineNo,Channel &channel) { LPTSTR VoicePath1 = ""; CString strState = ""; CString tmpState = ""; switch(channel.nType) { case CHTYPE_USER: if( !OffHookDetect(LineNo) && channel.UsableFlag != TRUE ) { pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); TRACE0("\n|"); switch(state) { case CH_LOGOUT: case CH_WAITONHOOK: StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_STOP); ResetLine(LineNo,channel); return; default: break; } } break; case CHTYPE_TRUNK: if( Sig_CheckBusy(LineNo) && channel.UsableFlag != TRUE ) { pList1->SetItemText(LineNo,4,_T("")); pList1->SetItemText(LineNo,5,_T("")); switch(state) { case CH_LOGOUT: case CH_WAITONHOOK: StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_STOP); ResetLine(LineNo,channel); return; default: break; } break; } }//end switch switch(state) { case CH_LOGOUT: channel.nTimeElapse = 0; strState = _T("播放语音"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if( channel.IsLogin ) { if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("Logout"),VoicePath1) ) { StartPlayFile(LineNo,VoicePath1,0L); } //更新坐席人员注销时间 CTime tm; CString strTime; tm=CTime::GetCurrentTime(); strTime = tm.Format(_T("%Y-%m-%d %X")); mySql.updateUserRecentLogoutTime( (LPCTSTR)channel.UserId,strTime,pConn ); //更新坐席人员状态界面 int itemCount = pList2->GetItemCount(); for(int i=0; i<itemCount; i++) { if(pList2->GetItemText(i,1) == (LPCTSTR)channel.UserId) { pList2->SetItemText(i,3,_T("")); pList2->SetItemText(i,4,_T("")); pList2->SetItemText(i,6,strTime); break; } } //写日志,注销成功。 CString strDetails; strDetails = strTime + CString(_T("座席")) + (LPCTSTR)channel.UserId + CString(_T("注销成功;")); myXml.insertTextToLogItem(channel.strItemId,strDetails,_T("Details"),channel.ctStartTime); channel.IsLogin = FALSE; channel.UserId[0] = NULL; } else { if( myXml.findVoiceNameByNodeId(channel.CurrNodeId,_T("NotLogin"),VoicePath1) ) { StartPlayFile(LineNo,VoicePath1,0L); } } state = CH_WAITONHOOK; break; case CH_WAITONHOOK: strState = _T("等待挂机"); tmpState = pList1->GetItemText(LineNo,2); if( tmpState != strState ) pList1->SetItemText(LineNo,2,strState); if(CheckPlayEnd(LineNo)) { StopPlayFile(LineNo); StartPlaySignal(LineNo,SIG_BUSY1); } break; default: break; }//end switch }