/* 转移队列/窗口 */ void CCallThread::OnExChange(CallerCmd& callerCmd) { SLZData data; if(m_logicVariables.ExchangeQue) { BOOL flag = FALSE; CString queID = callerCmd.GetCarriedData();//获取转移的队列 if(queID.IsEmpty())return; CQueueInfo queinfo; for(int i=0;i<m_map_que.GetCount();i++) { if(m_map_que[i].GetQueManNum()==queID)//找到QUEID { flag = TRUE; queinfo = m_map_que[i]; break; } } //获取对应窗口正在呼叫的数据 if(flag) { if(m_rCalledQueData.GetCalledQueData(callerCmd.GetWindowId(),data)) { data.SetIsOpenEva(FALSE);data.SetIsFinshEva(FALSE); m_rCalledQueData.DeleteCalledQueData(data);//删除正在呼叫队列的数据 data.SetBussinessType(queinfo.GetQueID()); //设置队列名称 data.SetBussName(GetQueNumFromID(queinfo.GetQueID())); data.SetWindowId(0);//不设置指定窗口,返回初始状态 m_rInlineQueData.AddHeadData(data);//添加到排队队列最前 callerCmd.SetSuccess(TRUE); } } } if(m_logicVariables.ExchangeWindow)//转移窗口 { CString winID = callerCmd.GetCarriedData();//获取转移的窗口 if(winID.IsEmpty())return; CCommonConvert convert; int i_winID = -1; convert.CStringToint(i_winID,winID); SLZWindow Window; BOOL flag = m_rInlineQueData.m_rWindowTable.QueryWindowBySerialID(i_winID,Window); if(flag)//找到了窗口 { if(m_rCalledQueData.GetCalledQueData(callerCmd.GetWindowId(),data)) { if(JudgeWindowHaveQue(Window.GetWindowId()))//判断窗口ID下是否有可处理队列 { data.SetIsOpenEva(FALSE);data.SetIsFinshEva(FALSE); m_rCalledQueData.DeleteCalledQueData(data);//删除正在呼叫队列的数据 data.SetWindowId(Window.GetWindowId()); m_rInlineQueData.AddHeadData(data);//添加到排队队列最前 callerCmd.SetSuccess(TRUE); } else { callerCmd.SetSuccess(FALSE); } } } ///////////////////////////////////// } /////////////////////////////////// }
void CCallThread::DoEvaMsg(const MSG& msg) { SLZEvaData* pEvaData = (SLZEvaData*)msg.wParam; SLZWindow Window; BOOL flag = m_rInlineQueData.m_rWindowTable.QueryWindowByEvaId(pEvaData->GetEvaluatorId(),Window); if(flag) { SLZData data; //找出正在呼叫的那条数据 if(m_rCalledQueData.GetCalledQueData(Window.GetWindowId(),data)) { data.SetEvaluateLevel(pEvaData->GetEvaLevel()); data.SetIsFinshEva(TRUE); CTime curTime = CTime::GetCurrentTime(); data.SetFinishTime(curTime); if(m_rCalledQueData.DeleteCalledQueData(data))//删除正在呼叫的那条数据 { m_rFinshQueData.Add(data);//加入完成队列 } } else//不呼叫只评价 { data.SetEvaluateLevel(pEvaData->GetEvaLevel()); data.SetIsFinshEva(TRUE); CTime curTime = CTime::GetCurrentTime(); data.SetFinishTime(curTime); data.SetWindowId(Window.GetWindowId()); data.SetWindowShowId(Window.GetShowWndId()); CString staffID = m_map_login[Window.GetWindowId()]; data.SetStaffId(staffID); CString bussinessType; /* 处理业务ID */ SLZWindow window; m_rInlineQueData.m_rWindowTable.QueryWindowById(data.GetWindowId(),window); CStringArray arrayQueID; window.GetArrayQueId(arrayQueID); if(!arrayQueID.IsEmpty()) { bussinessType = arrayQueID[0]; } else { CMap<int,int,CQueueInfo,CQueueInfo&>::CPair* pCurEva; int count = m_map_que.GetCount(); for(int i=0;i<count;i++) { pCurEva = m_map_que.PLookup(i); bussinessType = pCurEva->value.GetQueID(); break; } } //////////////////////////////// data.SetBussinessType(bussinessType); data.SetOrganId(theApp.m_logicVariables.strOrganID); data.SetOrganName(theApp.m_logicVariables.strOrganNmae); // data.SetQueSerialID(_T("1")); data.SetQueueNumber(_T("0")); data.SetCallTime(curTime); data.SetTakingNumTime(curTime); m_rFinshQueData.Add(data);//加入完成队列 } } if(pEvaData)//释放资源 delete pEvaData; }
void CCallThread::OnCall(CallerCmd& callerCmd) { SLZData callingData;//正在呼叫的data if(m_rCalledQueData.GetCalledQueData(callerCmd.GetWindowId(),callingData))//有一条数据在正在呼叫队列没有处理完(包括评价) { if(callingData.GetIsOpenEva()==TRUE && callingData.GetIsFinshEva()==FALSE) //打开了评价但还没有评价,流程没完等待用户评价,如15秒后没有评价自动发送未评价消息 { return;//评价没有结束不能呼叫 } else if(!callingData.GetIsFinshEva())//没有开启评价 { m_rCalledQueData.DeleteCalledQueData(callingData);//删除正在呼叫的那条数据 ///加入完成队列 CTime curTime = CTime::GetCurrentTime(); callingData.SetFinishTime(curTime);//设置完成时间 m_rFinshQueData.Add(callingData);//添加到完成队列 } } ///////////////////////呼叫 //首先判断该窗口下有没有等候的人,如果有呼叫等候队列的那条数据 //没有从排队队列中取出新的数据 SLZData data; if(m_rWaitQueData.IsHaveWaitQueData(callerCmd.GetWindowId())) { if(m_rWaitQueData.GetWaitQueData(callerCmd.GetWindowId(),data)) { cyclock.lock();//崔,我加的 //加入正在呼叫队列 m_rCalledQueData.Add(data); cyclock.unlock();//崔,我加的 } } else { ///得到排队队列的下一个数据 if(!theApp.IsLocal())//客户机 { /////如果是客户机呼叫则需要向服务端发送一条请求删除队列中的一条客户机数据 CComplSocketClient client; CStringArray queSerialIDArray,queManNumArray; CString callStaffID,queManNum; BOOL bIsUsePower = FALSE; m_rInlineQueData.GetWindowCanDoQue(callerCmd.GetWindowId(),queSerialIDArray,callStaffID,&bIsUsePower); for(int i=0;i<queSerialIDArray.GetCount();i++) { theApp.m_Controller.GetManQueNumByQueSerialID(queSerialIDArray.GetAt(i),queManNum); queManNumArray.Add(queManNum); } string sendMsg,recvMsg; int actRecvSize = 0; CDealInterMsg::ProduceSendCallMsg(queManNumArray,sendMsg,theApp.m_logicVariables.strOrganID,bIsUsePower); if(client.SendData(INTERPORT,theApp.m_logicVariables.strInterIP, sendMsg,sendMsg.size(),recvMsg,actRecvSize) && actRecvSize) { BOOL isSucced; CDealInterMsg::AnaRetCallMsg(recvMsg,&isSucced,&data); if(isSucced) { data.SetCallTime(CTime::GetCurrentTime()); data.SetStaffId(callStaffID); data.SetWindowId(callerCmd.GetWindowId()); CString queSerialID; theApp.m_Controller.GetQueSerialIDByManQueNum(queSerialID,data.GetQueSerialID()); data.SetBussinessType(queSerialID); } else { return; } } } else { m_rInlineQueData.GetInlineQueData(callerCmd.GetWindowId(),data); } } if(!data.GetBussinessType().IsEmpty()) { cyclock.lock();//崔,我加的 m_rCalledQueData.Add(data);//添加到正在呼叫队列 cyclock.unlock();//崔,我加的 //界面剩余人数更新 //theApp.m_pView->ShowWaitNum(data.GetBussinessType(),m_rInlineQueData.GetBussCount(data.GetBussinessType())); ShowViewWaitNum(data.GetBussinessType(),data,callerCmd); //playsound,显示 theApp.m_Controller.m_pPlaySound->DataPlay(data); //发短信 if (!data.GetPhoneNum().IsEmpty()) { m_pShortMsg->ClearSendBox(); m_pShortMsg->SendMsg(data.GetPhoneNum(),data.GetSendMsg()); } } if(theApp.IsLocal()) ///重新写file,保存没处理(呼叫)的数据 theApp.m_Controller.WriteInlineDataToFile(); }