void CInlineQueData::GetCandoQueHaveData(CStringArray& queIDArray,const CStringArray& canDoQueIDArray,UINT uWndID) { int count = canDoQueIDArray.GetCount(); for(int i = 0; i < count; i++) { CString candoQueID = canDoQueIDArray[i]; POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data; POSITION posLast = pos; data = m_lstInlineQue.GetNext(pos); if(data.GetWindowId()==0)//如果没设置指定窗口 { if(candoQueID.Compare(data.GetBussinessType()) == 0) { queIDArray.Add(candoQueID); break; } } else//设置了指定窗口 { if(uWndID == data.GetWindowId()) { queIDArray.Add(data.GetBussinessType()); break; } } } } }
CString CProducePacket::ProduceSendPacket(const SLZData& data,int leftNum,SendDataType dataType,CString cardNum/* =_T */,CardType cardType/*cardNotDefine*/) { CString packet = _T("<?xml version=\"1.0\" encoding=\"UTF-8\"?><dataPacket version=\"1.0\"><headCode>hallQue</headCode>"); packet.AppendFormat(_T("<dataType>%d</dataType>"),dataType); packet.AppendFormat(_T("<orgName>%s</orgName>"),data.GetOrganName()); packet.AppendFormat(_T("<orgID>%s</orgID>"),data.GetOrganId()); packet.AppendFormat(_T("<cardType>%d</cardType>"),cardType); packet.AppendFormat(_T("<cardNum>%s</cardNum>"),cardNum); packet.AppendFormat(_T("<queID>%s</queID>"),data.GetBussinessType()); packet.AppendFormat(_T("<queNum>%s</queNum>"),data.GetQueueNumber()); CString wStrtakeNumTime = ExChangeTime(data.GetTakingNumTime()); packet.AppendFormat(_T("<enterTime>%s</enterTime>"),wStrtakeNumTime); CString wStrCallTime = ExChangeTime(data.GetCallTime()); packet.AppendFormat(_T("<callTime>%s</callTime>"),wStrCallTime); packet.AppendFormat(_T("<workerID>%s</workerID>"),data.GetStaffId()); packet.AppendFormat(_T("<windowNum>%d</windowNum>"),data.GetWindowId()); CString wStrFinishTime = ExChangeTime(data.GetFinishTime()); packet.AppendFormat(_T("<scoreTime>%s</scoreTime>"),wStrFinishTime); packet.AppendFormat(_T("<scoreLev>%d</scoreLev>"),data.GetEvaluateLevel()); // int len = CCommonConvert::CStringToChar(packet,NULL); // char* strPacket = new char[len+1]; // memset(strPacket,0,len+1); // CCommonConvert::CStringToChar(packet,strPacket); // std::string stdStrPacket(strPacket); // return stdStrPacket; return packet; }
BOOL CInlineQueData::GetFirstTakeNumData(SLZData& data,const CStringArray& arrStrQueId) { BOOL flag = FALSE; BOOL canDo = FALSE; POSITION pos = m_lstInlineQue.GetHeadPosition(); SLZData tempdata; while(pos) { tempdata = m_lstInlineQue.GetNext(pos); for(int i=0;i<arrStrQueId.GetCount();i++) { if(arrStrQueId[i].Compare(tempdata.GetBussinessType()) == 0) { canDo = TRUE; break; } } if(canDo) { if(!flag) { data = tempdata; flag = TRUE; } else { data = data.GetTakingNumTime() < tempdata.GetTakingNumTime() ? data : tempdata; } } } return flag; }
int CInlineQueData::GetMaxQueNum(const CString queID) { m_mtInlineQue.Lock(); int maxNum = 0; POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data = m_lstInlineQue.GetNext(pos); if(data.GetBussinessType() == queID) { int queNum = data.GetIntQueNum(); maxNum = maxNum > queNum ? maxNum : queNum; } } // CString num; // if(!maxNum.IsEmpty()) // { // for(int i=0;i<maxNum.GetLength();i++) // { // WCHAR w = maxNum.GetAt(i); // if(w>'0'&&w<'9') // { // num+=w; // } // } // } m_mtInlineQue.Unlock(); // int iNum = 0; // CCommonConvert convert; // convert.CStringToint(iNum,num); return maxNum; }
void CInlineQueData::GetAllBussCount(const CString& strBussid,UINT* pWaitNum) { m_mtInlineQue.Lock(); UINT iCount = 0; POSITION pos = m_lstInlineQue.GetHeadPosition(); SLZData data; for(; pos; ) { data = m_lstInlineQue.GetNext(pos); CString queID = data.GetBussinessType(); if(queID == strBussid) { //返回队列总人数 iCount++; } } m_mtInlineQue.Unlock(); *pWaitNum = iCount; }
void CCallThread::OnDiscard(CallerCmd& callerCmd) { //过号 SLZData data; UINT uWindID = callerCmd.GetWindowId(); if(m_rCalledQueData.GetCalledQueData(uWindID,data)) { //加入到过号队列 m_rDiscardQueData.Add(data); m_rCalledQueData.DeleteCalledQueData(data); //返回,写剩余人数 // CString carriedData = data.GetQueueNumber() + _T(" ") + GetQueInlineCount(data.GetBussinessType()); CString carriedData = data.GetQueueNumber() + _T(" ") + GetCandoQueInlineCount(callerCmd.GetWindowId()); callerCmd.SetCarriedData(carriedData); //界面剩余人数更新 if(theApp.m_pView) { // theApp.m_pView->ShowWaitNum(data.GetBussinessType(),m_rInlineQueData.GetBussCount(data.GetBussinessType())); ShowViewWaitNum(data.GetBussinessType(),data,callerCmd); } //playsound,display // theApp.m_Controller.m_pPlaySound->DataPlay(data); } }
UINT CInlineQueData::GetBussCount(const CString& strBussId) { m_mtInlineQue.Lock(); UINT iCount = 0; POSITION pos = m_lstInlineQue.GetHeadPosition(); SLZData data; for(; pos; ) { data = m_lstInlineQue.GetNext(pos); CString queID = data.GetBussinessType(); if(queID == strBussId) { //只返回本机的人数 // if(data.GetIsClientData() && theApp.m_logicVariables.IsOpenInterNum) // { // if(theApp.m_logicVariables.strInterIP[0] == '\0')//主机 // continue; // } iCount++; } } m_mtInlineQue.Unlock(); return iCount; }
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(); }
BOOL CInlineQueData::DeleteInlineClientData(BOOL bIsUsePower,const CStringArray& queIDArray,const CString& organId,SLZData* pData) { m_mtInlineQue.Lock(); BOOL flag = FALSE; if(bIsUsePower) { if(queIDArray.GetCount() < 1) { return FALSE; } int count = queIDArray.GetCount(); for(int i = 0; i < count; i++) { POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data; POSITION posLast = pos; data = m_lstInlineQue.GetNext(pos); if(data.GetWindowId()==0)//如果没设置指定窗口 { if(queIDArray[i].Compare(data.GetBussinessType()) == 0) { flag = TRUE; *pData = data; m_lstInlineQue.RemoveAt(posLast); break; } } } if(flag) { break; } } } else { /* /////////////////////////////////////////首先找到可处理队列中哪几个队列有数据 CStringArray haveDataArray; GetCandoQueHaveData(haveDataArray,queIDArray); if(haveDataArray.GetCount() == 0) { return FALSE; } /////////////////////////////////////////随机取数 int count = haveDataArray.GetCount(); time_t t; srand((unsigned) time(&t)); int nRand = rand() % count; CString strQueID = haveDataArray[nRand]; POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data; POSITION posLast = pos; data = m_lstInlineQue.GetNext(pos); if(data.GetWindowId()==0)//如果没设置指定窗口 { if(strQueID.Compare(data.GetBussinessType()) == 0) { *pData = data; m_lstInlineQue.RemoveAt(posLast); flag = TRUE; break; } } } */ flag = GetFirstTakeNumData(*pData,queIDArray); if(flag) flag = RemoveFirstTakeNumData(*pData); } m_mtInlineQue.Unlock(); return flag; }
/* 获取排队 队列首个数据 */ BOOL CInlineQueData::GetInlineQueData(const UINT iWinId, SLZData& rdata) { if(m_lstInlineQue.GetCount() < 1) { return FALSE; } CStringArray arrStrQueId;//可处理队列以及优先级 SLZWindow Window; BOOL flag = m_rWindowTable.QueryWindowById(iWinId,Window); if(!flag)return FALSE; BOOL bIsUserPower = Window.GetIsUsePower();//是否使用优先级 Window.GetArrayQueId(arrStrQueId);//获取可处理队列及优先级 CString staffID = theApp.m_Controller.m_mapLoginList[Window.GetWindowId()];//获取登录STAFFID if(staffID.IsEmpty())return FALSE; if(arrStrQueId.GetCount() < 1) { return FALSE; } /////////////////////// BOOL bFind = FALSE; m_mtInlineQue.Lock(); if(bIsUserPower)//使用优先级 { int count = arrStrQueId.GetCount(); for(int i = 0; i < count; i++) { POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data; POSITION posLast = pos; data = m_lstInlineQue.GetNext(pos); if(data.GetWindowId()==0)//如果没设置指定窗口 { if(arrStrQueId[i].Compare(data.GetBussinessType()) == 0) { bFind = TRUE; rdata = data; m_lstInlineQue.RemoveAt(posLast); break; } } else//设置了指定窗口优先呼叫 { if(iWinId == data.GetWindowId()) { rdata = data; m_lstInlineQue.RemoveAt(posLast); bFind = TRUE; break; } } } if(bFind) { break; } } } else//不使用优先级 { /* /////////////////////////////////////////首先找到可处理队列中哪几个队列有数据 CStringArray haveDataArray; GetCandoQueHaveData(haveDataArray,arrStrQueId,iWinId); if(haveDataArray.GetCount() == 0) { return FALSE; } /////////////////////////////////////////随机取数 int count = haveDataArray.GetCount(); time_t t; srand((unsigned) time(&t)); int nRand = rand() % count; CString strQueID = haveDataArray[nRand]; POSITION pos = m_lstInlineQue.GetHeadPosition(); while(pos) { SLZData data; POSITION posLast = pos; data = m_lstInlineQue.GetNext(pos); if(data.GetWindowId()==0)//如果没设置指定窗口 { if(strQueID.Compare(data.GetBussinessType()) == 0) { rdata = data; m_lstInlineQue.RemoveAt(posLast); bFind = TRUE; break; } } else//指定了窗口 { if(iWinId == data.GetWindowId()) { rdata = data; m_lstInlineQue.RemoveAt(posLast); bFind = TRUE; break; } } } */ bFind = GetFirstTakeNumData(rdata,arrStrQueId); if(bFind) bFind = RemoveFirstTakeNumData(rdata); } CTime currTime = CTime::GetCurrentTime(); rdata.SetCallTime(currTime);//设置呼叫时间 rdata.SetStaffId(staffID);//设置员工ID,哪个员工呼叫 rdata.SetWindowId(iWinId);//设置哪个窗口呼叫 rdata.SetWindowShowId(Window.GetShowWndId());//设置窗口编号 m_mtInlineQue.Unlock(); return bFind; }