中间件底层,websocket

ServerDlg.cpp 94KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140
  1. 
  2. // ServerDlg.cpp : implementation file
  3. //
  4. #include "stdafx.h"
  5. #include "Server.h"
  6. #include "ServerDlg.h"
  7. #include "afxdialogex.h"
  8. #include "NetworkClient.h"
  9. HWND hwndd;
  10. // CServerDlg dialog
  11. CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/)
  12. : CDialogEx(CServerDlg::IDD, pParent)
  13. {
  14. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  15. }
  16. CServerDlg::~CServerDlg()
  17. {
  18. // 日志关闭
  19. ILogger::getInstance().close();
  20. }
  21. void CServerDlg::DoDataExchange(CDataExchange* pDX)
  22. {
  23. CDialogEx::DoDataExchange(pDX);
  24. DDX_Control(pDX, IDC_LIST1, m_CtrlList);
  25. }
  26. BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx)
  27. ON_WM_PAINT()
  28. ON_WM_VKEYTOITEM()
  29. ON_WM_QUERYDRAGICON()
  30. ON_WM_CLOSE()
  31. ON_WM_SYSCOMMAND()
  32. ON_WM_SIZE()
  33. ON_COMMAND(ID_MENU_LOG_STOP, &CServerDlg::OnMenuLogStop)
  34. ON_UPDATE_COMMAND_UI(ID_MENU_LOG_STOP, &CServerDlg::OnUpdateMenuLogStop)
  35. ON_COMMAND(ID_MENU_LOG_START, &CServerDlg::OnMenuLogStart)
  36. ON_UPDATE_COMMAND_UI(ID_MENU_LOG_START, &CServerDlg::OnUpdateMenuLogStart)
  37. ON_WM_INITMENUPOPUP()
  38. END_MESSAGE_MAP()
  39. BOOL CServerDlg::OnInitDialog()
  40. {
  41. CDialogEx::OnInitDialog();
  42. // Set the icon for this dialog. The framework does this automatically
  43. // when the application's main window is not a dialog
  44. SetIcon(m_hIcon, TRUE); // Set big icon
  45. SetIcon(m_hIcon, FALSE); // Set small icon
  46. // TODO: Add extra initialization here
  47. // 设置主窗口标记
  48. ::SetProp(m_hWnd, AfxGetApp()->m_pszAppName, (HANDLE)1);
  49. hwndd = this->GetSafeHwnd();
  50. m_IsVideo = false;
  51. ILogger::getInstance().init(&m_CtrlList, LOG_DEV_SERVER, "./Data/Log");
  52. //ILogger::getInstance().filterShow(LOG_CLASS_GENERAL, LOG_LEVEL_ERROR); // 2021-02-04日志过滤
  53. ILogger::getInstance().start();
  54. // 2022-09-06 重启httpserver,清空回复签入坐席
  55. clearOnlineAgentGroupDetail();
  56. CNetworkClient::GetInstance().setAcdRecMsgFun(std::bind((void(CServerDlg::*)(CPduEntity*))&CServerDlg::OnAcdmsgRecmsg,this,std::placeholders::_1));
  57. CNetworkClient::GetInstance().init();
  58. StartServer();
  59. return TRUE; // return TRUE unless you set the focus to a control
  60. }
  61. // If you add a minimize button to your dialog, you will need the code below
  62. // to draw the icon. For MFC applications using the document/view model,
  63. // this is automatically done for you by the framework.
  64. void CServerDlg::OnPaint()
  65. {
  66. if (IsIconic())
  67. {
  68. CPaintDC dc(this); // device context for painting
  69. SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
  70. // Center icon in client rectangle
  71. int cxIcon = GetSystemMetrics(SM_CXICON);
  72. int cyIcon = GetSystemMetrics(SM_CYICON);
  73. CRect rect;
  74. GetClientRect(&rect);
  75. int x = (rect.Width() - cxIcon + 1) / 2;
  76. int y = (rect.Height() - cyIcon + 1) / 2;
  77. // Draw the icon
  78. dc.DrawIcon(x, y, m_hIcon);
  79. }
  80. else
  81. {
  82. CDialogEx::OnPaint();
  83. }
  84. }
  85. // The system calls this function to obtain the cursor to display while the user drags
  86. // the minimized window.
  87. HCURSOR CServerDlg::OnQueryDragIcon()
  88. {
  89. return static_cast<HCURSOR>(m_hIcon);
  90. }
  91. void CServerDlg::StartServer()
  92. {
  93. YamlConfig* cfg = YamlConfig::GetInstance();
  94. CString strTitle;
  95. int port = cfg->GetHttpServerPort();
  96. strTitle.Format("127.0.0.1 : %d", port);
  97. SetWindowText(strTitle);
  98. m_Server.setCallbackRecvMsg(std::bind(&CServerDlg::__recvMsgFun, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3));
  99. m_Server.setCallbackClose(std::bind(&CServerDlg::__closeFun, this, std::placeholders::_1));
  100. if (!m_Server.init(port, cfg->GetWssPort(),cfg->GetWssSSLFilePath(),cfg->GetWssPwd()))
  101. {
  102. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "HttpServer服务初始化失败");
  103. }
  104. else
  105. {
  106. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "HttpServer服务开启");
  107. m_Server.asyncRun();
  108. }
  109. }
  110. WCHAR* ConvertUtf8ToGBK(char* szUtf8)
  111. {
  112. int len = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0);
  113. WCHAR* wszUCD = new WCHAR[len + 1];
  114. memset(wszUCD, 0, len);
  115. MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, wszUCD, len);
  116. return wszUCD;
  117. }
  118. void Wchar_tToString(std::string& szDst, wchar_t *wchar)
  119. {
  120. wchar_t * wText = wchar;
  121. DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, NULL, 0, NULL, FALSE);// WideCharToMultiByte的运用
  122. char *psText; // psText为char*的临时数组,作为赋值给std::string的中间变量
  123. psText = new char[dwNum];
  124. WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, psText, dwNum, NULL, FALSE);// WideCharToMultiByte的再次运用
  125. szDst = psText;// std::string赋值
  126. delete[]psText;// psText的清除
  127. }
  128. char* UnicodeToUtf8(WCHAR* wszUtf8)
  129. {
  130. int len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
  131. char* szUtf8 = new char[len + 1];
  132. memset(szUtf8, 0, len + 1);
  133. WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
  134. return szUtf8;
  135. }
  136. char* CStringTochar(CString strInput)
  137. {
  138. USES_CONVERSION;
  139. //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
  140. char * szStr = (LPSTR)(LPCTSTR)strInput;
  141. char* pszMultiByte = szStr; //strlen(pwsUnicode)=5
  142. int iSize;
  143. wchar_t* pwszUnicode = NULL;
  144. //返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
  145. iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6
  146. pwszUnicode = (wchar_t *)malloc(iSize * sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t))
  147. MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pwszUnicode, iSize);
  148. char* by = NULL;
  149. by = UnicodeToUtf8(pwszUnicode);
  150. if (pwszUnicode != NULL)
  151. {
  152. free(pwszUnicode);
  153. pwszUnicode = NULL;
  154. }
  155. return by;
  156. }
  157. void UnicodeToUtf8(WCHAR* wszUtf8, std::string& strUtf8)
  158. {
  159. int len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);
  160. char* szUtf8 = new char[len + 1];
  161. memset(szUtf8, 0, len + 1);
  162. WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL);
  163. strUtf8 = szUtf8;
  164. delete[]szUtf8;
  165. szUtf8 = NULL;
  166. }
  167. void AnsiToUtf8(std::string& strInput)
  168. {
  169. USES_CONVERSION;
  170. //调用函数,T2A和W2A均支持ATL和MFC中的字符转换
  171. const char* pszMultiByte = strInput.c_str();; //strlen(pwsUnicode)=5
  172. int iSize;
  173. wchar_t* pwszUnicode;
  174. //返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0'
  175. iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6
  176. pwszUnicode = (wchar_t *)malloc(iSize * sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t))
  177. MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pwszUnicode, iSize);
  178. UnicodeToUtf8(pwszUnicode, strInput);
  179. if (pwszUnicode != NULL)
  180. {
  181. free(pwszUnicode);
  182. pwszUnicode = NULL;
  183. }
  184. }
  185. std::string CServerDlg::JsonParser(const string &strInput)
  186. {
  187. Json::Reader reader;
  188. Json::Value root;
  189. string ResultStr;
  190. if (reader.parse(strInput, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素
  191. {
  192. std::string TypeStr = root["Type"].asString(); // 访问节点,upload_id = "UP000000"
  193. //县级12345中间件 by 8/20
  194. if (0 == strcmp(TypeStr.c_str(), "Dropcall"))
  195. {
  196. std::string AgentID = root["AgentID"].asString();
  197. std::string AgentState = root["AgentState"].asString();
  198. std::string State = root["State"].asString();
  199. std::string Type = "Dropcall";
  200. std::string Result = root["Result"].asString();
  201. ResultStr = "Dropcall@" + AgentID + "@" + AgentState + "@" + Result + "@" + State + "@" + Type;
  202. }
  203. if (0 == strcmp(TypeStr.c_str(), "GetAgentDetail"))
  204. {
  205. ResultStr = "GetAgentDetail";
  206. }
  207. if (0 == strcmp(TypeStr.c_str(), "VideoReqExten"))
  208. {
  209. std::string AgentIDStr = root["AgentID"].asString();
  210. std::string AgentExtenStr = root["AgentExten"].asString();
  211. ResultStr = "VideoReqExten@" + AgentIDStr + "@" + AgentExtenStr;
  212. }
  213. if (0 == strcmp(TypeStr.c_str(), "VideoReqIdeAgent"))
  214. {
  215. std::string AgentIDStr = root["AgentID"].asString();
  216. std::string AgentExtenStr = root["AgentExten"].asString();
  217. ResultStr = "VideoReqIdeAgent@" + AgentIDStr + "@" + AgentExtenStr;
  218. }
  219. if (0 == strcmp(TypeStr.c_str(), "VideoReqBindAgent"))
  220. {
  221. std::string AgentIDStr = root["AgentID"].asString();
  222. std::string AgentExtenStr = root["AgentExten"].asString();
  223. ResultStr = "VideoReqBindAgent@" + AgentIDStr + "@" + AgentExtenStr;
  224. }
  225. if (0 == strcmp(TypeStr.c_str(), "VideoDesExten"))
  226. {
  227. std::string AgentIDStr = root["AgentID"].asString();
  228. std::string AgentExtenStr = root["AgentExten"].asString();
  229. ResultStr = "VideoDesExten@" + AgentIDStr + "@" + AgentExtenStr;
  230. }
  231. if (0 == strcmp(TypeStr.c_str(), "Login"))
  232. {
  233. std::string AgentIDStr = root["AgentID"].asString();
  234. std::string AgentExtenStr = root["AgentExten"].asString();
  235. std::string AgentGroupStr = root["AgentGroup"].asString();
  236. std::string AgentTypeStr = root["AgentType"].asString();
  237. ResultStr = "Login@" + AgentIDStr + "@" + AgentExtenStr + "@" + AgentTypeStr + "@" + AgentGroupStr;
  238. }
  239. if (0 == strcmp(TypeStr.c_str(), "Monitor")) // ych 2018.6.4 商丘添加监控命令
  240. {
  241. ResultStr = "Monitor";
  242. }
  243. if (0 == strcmp(TypeStr.c_str(), "SubScribeMonitor")) // ych 2018.6.7 商丘添加监控命令
  244. {
  245. ResultStr = "SubScribeMonitor";
  246. }
  247. if (0 == strcmp(TypeStr.c_str(), "SubScribeMonitorCancel")) // ych 2018.6.7 商丘添加监控命令
  248. {
  249. ResultStr = "SubScribeMonitorCancel";
  250. }
  251. if (0 == strcmp(TypeStr.c_str(), "Logout"))
  252. {
  253. std::string AgentIDStr = root["AgentID"].asString();
  254. std::string AgentExtenStr = root["AgentExten"].asString();
  255. ResultStr = "Logout@" + AgentIDStr + "@" + AgentExtenStr;
  256. }
  257. if (0 == strcmp(TypeStr.c_str(), "SayBusy"))
  258. {
  259. std::string AgentIDStr = root["AgentID"].asString();
  260. std::string AgentExtenStr = root["AgentExten"].asString();
  261. ResultStr = "SayBusy@" + AgentIDStr + "@" + AgentExtenStr;
  262. }
  263. if (0 == strcmp(TypeStr.c_str(), "SayFree"))
  264. {
  265. std::string AgentIDStr = root["AgentID"].asString();
  266. std::string AgentExtenStr = root["AgentExten"].asString();
  267. ResultStr = "SayFree@" + AgentIDStr + "@" + AgentExtenStr;
  268. }
  269. if (0 == strcmp(TypeStr.c_str(), "Reset"))
  270. {
  271. std::string AgentIDStr = root["AgentID"].asString();
  272. std::string AgentExtenStr = root["AgentExten"].asString();
  273. ResultStr = "Reset@" + AgentIDStr + "@" + AgentExtenStr;
  274. }
  275. if (0 == strcmp(TypeStr.c_str(), "MakeCall"))
  276. {
  277. std::string AgentIDStr = root["AgentID"].asString();
  278. std::string AgentExtenStr = root["AgentExten"].asString();
  279. std::string DestinationHeader = root["Header"].asString();
  280. std::string DestinationNumStr = root["DestinationNumber"].asString();
  281. std::string optVisit = root["TaskType"].asString();
  282. std::string optVisitTelID = root["TaskPhoneID"].asString();
  283. std::string optVisitCode = root["TaskID"].asString();
  284. ResultStr = "MakeCall@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationHeader + "@" + DestinationNumStr + "@" + optVisit + "@" + optVisitTelID + "@" + optVisitCode;
  285. }
  286. if (0 == strcmp(TypeStr.c_str(), "AnswerCall"))
  287. {
  288. std::string AgentIDStr = root["AgentID"].asString();
  289. std::string AgentExtenStr = root["AgentExten"].asString();
  290. ResultStr = "AnswerCall@" + AgentIDStr + "@" + AgentExtenStr;
  291. }
  292. if (0 == strcmp(TypeStr.c_str(), "DropCall"))
  293. {
  294. std::string AgentIDStr = root["AgentID"].asString();
  295. std::string AgentExtenStr = root["AgentExten"].asString();
  296. std::string IvrNameStr = root["IvrName"].asString();
  297. std::string IvrPosStr = root["IvrPos"].asString();
  298. ResultStr = "DropCall@" + AgentIDStr + "@" + AgentExtenStr + "@" + IvrNameStr + "@" + IvrPosStr;
  299. }
  300. if (0 == strcmp(TypeStr.c_str(), "Hold"))
  301. {
  302. std::string AgentIDStr = root["AgentID"].asString();
  303. std::string AgentExtenStr = root["AgentExten"].asString();
  304. ResultStr = "Hold@" + AgentIDStr + "@" + AgentExtenStr;
  305. }
  306. if (0 == strcmp(TypeStr.c_str(), "Retrieve"))
  307. {
  308. std::string AgentIDStr = root["AgentID"].asString();
  309. std::string AgentExtenStr = root["AgentExten"].asString();
  310. ResultStr = "Retrieve@" + AgentIDStr + "@" + AgentExtenStr;
  311. }
  312. if (0 == strcmp(TypeStr.c_str(), "Mute"))
  313. {
  314. std::string AgentIDStr = root["AgentID"].asString();
  315. std::string AgentExtenStr = root["AgentExten"].asString();
  316. std::string OpType = root["OpType"].asString();
  317. ResultStr = "Mute@" + AgentIDStr + "@" + AgentExtenStr+"@"+ OpType;
  318. }
  319. if (0 == strcmp(TypeStr.c_str(), "Transfer"))
  320. {
  321. std::string AgentIDStr = root["AgentID"].asString();
  322. std::string AgentExtenStr = root["AgentExten"].asString();
  323. std::string DestinationNumStr = root["DestinationNumber"].asString();
  324. std::string TransferType = root["TransferType"].asString();
  325. ResultStr = "Transfer@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationNumStr + "@" + TransferType;
  326. }
  327. if (0 == strcmp(TypeStr.c_str(), "Meeting"))
  328. {
  329. std::string AgentIDStr = root["AgentID"].asString();
  330. std::string AgentExtenStr = root["AgentExten"].asString();
  331. std::string DestinationNumStr = root["DestinationNumber"].asString();
  332. ResultStr = "Meeting@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationNumStr;
  333. }
  334. if (0 == strcmp(TypeStr.c_str(), "MeetingTakeBack"))
  335. {
  336. std::string AgentIDStr = root["AgentID"].asString();
  337. std::string AgentExtenStr = root["AgentExten"].asString();
  338. ResultStr = "MeetingTakeBack@" + AgentIDStr + "@" + AgentExtenStr;
  339. }
  340. if (0 == strcmp(TypeStr.c_str(), "Listen"))
  341. {
  342. std::string AgentIDStr = root["AgentID"].asString();
  343. std::string AgentExtenStr = root["AgentExten"].asString();
  344. std::string TargetAgentID = root["TargetAgentID"].asString();
  345. ResultStr = "Listen@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  346. }
  347. if (0 == strcmp(TypeStr.c_str(), "Insert"))
  348. {
  349. std::string AgentIDStr = root["AgentID"].asString();
  350. std::string AgentExtenStr = root["AgentExten"].asString();
  351. std::string TargetAgentID = root["TargetAgentID"].asString();
  352. ResultStr = "Insert@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  353. }
  354. if (0 == strcmp(TypeStr.c_str(), "Intercept"))
  355. {
  356. std::string AgentIDStr = root["AgentID"].asString();
  357. std::string AgentExtenStr = root["AgentExten"].asString();
  358. std::string TargetAgentID = root["TargetAgentID"].asString();
  359. ResultStr = "Intercept@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  360. }
  361. if (0 == strcmp(TypeStr.c_str(), "Break"))
  362. {
  363. std::string AgentIDStr = root["AgentID"].asString();
  364. std::string AgentExtenStr = root["AgentExten"].asString();
  365. std::string TargetAgentID = root["TargetAgentID"].asString();
  366. ResultStr = "Break@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  367. }
  368. if (0 == strcmp(TypeStr.c_str(), "ForceAgentLogOut"))
  369. {
  370. std::string AgentIDStr = root["AgentID"].asString();
  371. std::string AgentExtenStr = root["AgentExten"].asString();
  372. std::string TargetAgentID = root["TargetAgentID"].asString();
  373. ResultStr = "ForceAgentLogOut@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  374. }
  375. if (0 == strcmp(TypeStr.c_str(), "ForceAgentState"))
  376. {
  377. std::string AgentIDStr = root["AgentID"].asString();
  378. std::string AgentExtenStr = root["AgentExten"].asString();
  379. std::string TargetAgentID = root["TargetAgentID"].asString();
  380. std::string TargetAgentState = root["TargetAgentState"].asString();
  381. ResultStr = "ForceAgentState@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID + "@" + TargetAgentState;
  382. }
  383. if (0 == strcmp(TypeStr.c_str(), "Instead"))
  384. {
  385. std::string AgentIDStr = root["AgentID"].asString();
  386. std::string AgentExtenStr = root["AgentExten"].asString();
  387. std::string TargetAgentID = root["TargetAgentID"].asString();
  388. ResultStr = "Instead@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID;
  389. }
  390. if (0 == strcmp(TypeStr.c_str(), "SubScribe"))
  391. {
  392. std::string AgentIDStr = root["AgentID"].asString();
  393. std::string AgentExtenStr = root["AgentExten"].asString();
  394. std::string SubType = root["SubType"].asString();
  395. std::string SubParmer = root["SubParmer"].asString();
  396. ResultStr = "SubScribe@" + AgentIDStr + "@" + AgentExtenStr + "@" + SubParmer + "@" + SubType;
  397. }
  398. if (0 == strcmp(TypeStr.c_str(), "SubScribeCancel"))
  399. {
  400. std::string AgentIDStr = root["AgentID"].asString();
  401. std::string AgentExtenStr = root["AgentExten"].asString();
  402. std::string SubType = root["SubType"].asString();
  403. std::string SubParmer = root["SubParmer"].asString();
  404. ResultStr = "SubScribeCancel@" + AgentIDStr + "@" + AgentExtenStr + "@" + SubParmer + "@" + SubType;
  405. }
  406. if (0 == strcmp(TypeStr.c_str(), "GetAgentList"))
  407. {
  408. std::string AgentIDStr = root["AgentID"].asString();
  409. std::string AgentExtenStr = root["AgentExten"].asString();
  410. ResultStr = "GetAgentList@" + AgentIDStr + "@" + AgentExtenStr;
  411. }
  412. if (0 == strcmp(TypeStr.c_str(), "Consult"))
  413. {
  414. std::string AgentIDStr = root["AgentID"].asString();
  415. std::string AgentExtenStr = root["AgentExten"].asString();
  416. std::string CalleeStr = root["Callee"].asString();
  417. std::string CallerStr = root["Caller"].asString();
  418. ResultStr = "Consult@" + AgentIDStr + "@" + AgentExtenStr + "@" + CalleeStr + "@" + CallerStr;
  419. }
  420. if (0 == strcmp(TypeStr.c_str(), "ConfirmTransfer"))
  421. {
  422. std::string AgentIDStr = root["AgentID"].asString();
  423. std::string AgentExtenStr = root["AgentExten"].asString();
  424. std::string EndParmer = root["EndParmer"].asString();
  425. ResultStr = "ConfirmTransfer@" + AgentIDStr + "@" + AgentExtenStr + "@" + EndParmer;
  426. }
  427. if (0 == strcmp(TypeStr.c_str(), "TurnIvr"))
  428. {
  429. std::string AgentIDStr = root["AgentID"].asString();
  430. std::string AgentExtenStr = root["AgentExten"].asString();
  431. std::string IvrName = root["IvrName"].asString();
  432. std::string IvrPos = root["IvrPos"].asString();
  433. ResultStr = "TurnIvr@" + AgentIDStr + "@" + AgentExtenStr + "@" + IvrName + "@" + IvrPos;
  434. }
  435. if (0 == strcmp(TypeStr.c_str(), "SendDtmf"))
  436. {
  437. std::string AgentIDStr = root["AgentID"].asString();
  438. std::string AgentExtenStr = root["AgentExten"].asString();
  439. std::string Dtmf = root["Dtmf"].asString();
  440. ResultStr = "SendDtmf@" + AgentIDStr + "@" + AgentExtenStr + "@" + Dtmf;
  441. }
  442. if (0 == strcmp(TypeStr.c_str(), "Heart"))
  443. {
  444. std::string AgentIDStr = root["AgentID"].asString();
  445. std::string AgentExtenStr = root["AgentExten"].asString();
  446. ResultStr = "Heart@" + AgentIDStr + "@" + AgentExtenStr;
  447. }
  448. // 获取分机状态列表,驻马店专用
  449. if (0 == strcmp(TypeStr.c_str(), "GetExtenList"))
  450. {
  451. std::string AgentIDStr = root["AgentID"].asString();
  452. std::string AgentExtenStr = root["AgentExten"].asString();
  453. ResultStr = "GetExtenList@" + AgentIDStr + "@" + AgentExtenStr ;
  454. }
  455. if (0 == strcmp(TypeStr.c_str(), "TurnMsg"))
  456. {
  457. std::string AgentIDStr = root["AgentID"].asString();
  458. std::string AgentExtenStr = root["AgentExten"].asString();
  459. std::string TagNum = root["TagNum"].asString();
  460. std::string TagData = root["TagData"].asString();
  461. ResultStr = "TurnMsg@" + AgentIDStr + "@" + AgentExtenStr + "@" + TagNum + "@" + TagData;
  462. }
  463. return ResultStr;
  464. }
  465. else
  466. {
  467. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "JSON字符串解析失败: %s", strInput.c_str());
  468. }
  469. return "";
  470. }
  471. void CServerDlg::StringSplit(string s, char splitchar, vector<string>& vec)
  472. {
  473. if (vec.size() > 0)//保证vec是空的
  474. vec.clear();
  475. std::string str;
  476. str = splitchar;
  477. boost::split(vec, s, boost::is_any_of(str));
  478. return; // 使用boost分割库,
  479. int length = s.length();
  480. int start = 0;
  481. for (int i = 0; i < length; i++)
  482. {
  483. if (s[i] == splitchar && i == 0)//第一个就遇到分割符
  484. {
  485. start += 1;
  486. }
  487. else if (s[i] == splitchar)
  488. {
  489. vec.push_back(s.substr(start, i - start));
  490. start = i + 1;
  491. }
  492. else if (i == length - 1)//到达尾部
  493. {
  494. vec.push_back(s.substr(start, i + 1 - start));
  495. }
  496. }
  497. }
  498. char Request_Type[100] = "";
  499. char* CServerDlg::GetType()
  500. {
  501. ZeroMemory(Request_Type, 100);
  502. string str = m_VecAgentAttributeStr.at(0);
  503. memcpy(Request_Type, str.c_str(), str.length());
  504. return Request_Type;
  505. }
  506. int CServerDlg::GetAgentID()
  507. {
  508. if (m_VecAgentAttributeStr.size() < 2)
  509. {
  510. return 0;
  511. }
  512. string str = m_VecAgentAttributeStr.at(1);
  513. int id = atoi(str.c_str());
  514. return id;
  515. }
  516. int CServerDlg::GetAgentExten()
  517. {
  518. if (m_VecAgentAttributeStr.size() < 3)
  519. {
  520. return 0;
  521. }
  522. string str = m_VecAgentAttributeStr.at(2);
  523. int exten = atoi(str.c_str());
  524. return exten;
  525. }
  526. int CServerDlg::GetAgentType()
  527. {
  528. if (m_VecAgentAttributeStr.size() < 4)
  529. {
  530. return 0;
  531. }
  532. string str = m_VecAgentAttributeStr.at(3);
  533. int type = atoi(str.c_str());
  534. return type;
  535. }
  536. char groupch[100] = "";
  537. char* CServerDlg::GetAgentGroup()
  538. {
  539. if (m_VecAgentAttributeStr.size() < 5)
  540. {
  541. return "0";
  542. }
  543. ZeroMemory(groupch, 100);
  544. string str = m_VecAgentAttributeStr.at(4);
  545. memcpy(groupch, str.c_str(), str.length());
  546. return groupch;
  547. }
  548. CString CServerDlg::GetAgentNumber()
  549. {
  550. if (m_VecAgentAttributeStr.size() < 3)
  551. {
  552. return "";
  553. }
  554. string str = m_VecAgentAttributeStr.at(2);
  555. CString sttr = str.c_str();
  556. return sttr;
  557. }
  558. int CServerDlg::GetOpType()
  559. {
  560. if (m_VecAgentAttributeStr.size() < 4)
  561. {
  562. return 0;
  563. }
  564. string str = m_VecAgentAttributeStr.at(3);
  565. int opType = atoi(str.c_str());
  566. return opType;
  567. }
  568. CString CServerDlg::GetNumberHeader()
  569. {
  570. if (m_VecAgentAttributeStr.size() < 4) return "";
  571. string str = m_VecAgentAttributeStr.at(3);
  572. CString sttr = str.c_str();
  573. return sttr;
  574. }
  575. CString CServerDlg::GetVisitStr()
  576. {
  577. if (m_VecAgentAttributeStr.size() < 8) return "";
  578. string strVisit = m_VecAgentAttributeStr.at(5);
  579. string strVisitTel = m_VecAgentAttributeStr.at(6);
  580. string strVisitCode = m_VecAgentAttributeStr.at(7);
  581. string strVisitAll = strVisit + "|" + strVisitTel + "|" + strVisitCode;
  582. return strVisitAll.c_str(); //回访字符串
  583. }
  584. CString CServerDlg::GetMakeCallDestinationNumber()
  585. {
  586. if (m_VecAgentAttributeStr.size() < 4) return "";
  587. string str = m_VecAgentAttributeStr.at(4);
  588. CString sttr = str.c_str();
  589. return sttr;
  590. }
  591. CString CServerDlg::GetTransferOrMeetingDestinationNumber()
  592. {
  593. if (m_VecAgentAttributeStr.size() < 3) return "";
  594. string str = m_VecAgentAttributeStr.at(3);
  595. CString sttr = str.c_str();
  596. return sttr;
  597. }
  598. CString CServerDlg::GetTransferType()
  599. {
  600. if (m_VecAgentAttributeStr.size() < 4) return "";
  601. string str = m_VecAgentAttributeStr.at(4);
  602. CString sttr = str.c_str();
  603. return sttr;
  604. }
  605. int CServerDlg::GetBusyCode()
  606. {
  607. if (m_VecAgentAttributeStr.size() < 3)
  608. {
  609. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetBusyCode");
  610. return 0;
  611. }
  612. string str = m_VecAgentAttributeStr.at(2);
  613. int code = atoi(str.c_str());
  614. return code;
  615. }
  616. int CServerDlg::GetRecivedState()
  617. {
  618. if (m_VecAgentAttributeStr.size() < 3)
  619. {
  620. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetRecivedState");
  621. return 0;
  622. }
  623. string str = m_VecAgentAttributeStr.at(2);
  624. int state = atoi(str.c_str());
  625. return state;
  626. }
  627. int CServerDlg::GetTargetAgentID()
  628. {
  629. if (m_VecAgentAttributeStr.size() < 4)
  630. {
  631. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetTargetAgentID");
  632. return 0;
  633. }
  634. string str = m_VecAgentAttributeStr.at(3);
  635. int id = atoi(str.c_str());
  636. return id;
  637. }
  638. int CServerDlg::GetTargetAgentState()
  639. {
  640. if (m_VecAgentAttributeStr.size() < 5) // 2021-03-05 <4 改为 <5
  641. return 2;
  642. string str = m_VecAgentAttributeStr.at(4);
  643. int id = atoi(str.c_str());
  644. return id;
  645. }
  646. int CServerDlg::GetSubType()
  647. {
  648. if (m_VecAgentAttributeStr.size() < 4)
  649. {
  650. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetSubType");
  651. return 0;
  652. }
  653. string str = m_VecAgentAttributeStr.at(3);
  654. int id = atoi(str.c_str());
  655. return id;
  656. }
  657. int CServerDlg::GetSubParmer()
  658. {
  659. if (m_VecAgentAttributeStr.size() < 5)
  660. {
  661. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetSubParmer");
  662. return 0;
  663. }
  664. string str = m_VecAgentAttributeStr.at(4);
  665. int id = atoi(str.c_str());
  666. return id;
  667. }
  668. CString CServerDlg::GetIvrName()
  669. {
  670. if (m_VecAgentAttributeStr.size() <= 3) return "";
  671. string str = m_VecAgentAttributeStr.at(3);
  672. CString sttr = str.c_str();
  673. return sttr;
  674. }
  675. int CServerDlg::GetIvrPos()
  676. {
  677. if (m_VecAgentAttributeStr.size() <= 4) return -1;
  678. string str = m_VecAgentAttributeStr.at(4);
  679. int pos = atoi(str.c_str());
  680. return pos;
  681. }
  682. CString CServerDlg::GetSendDtmf()
  683. {
  684. if (m_VecAgentAttributeStr.size() <= 3) return "";
  685. string str = m_VecAgentAttributeStr.at(3);
  686. CString sttr = str.c_str();
  687. return sttr;
  688. }
  689. CString CServerDlg::GetTurnTagNum()
  690. {
  691. if (m_VecAgentAttributeStr.size() <= 3) return "";
  692. string str = m_VecAgentAttributeStr.at(3);
  693. CString sttr = str.c_str();
  694. return sttr;
  695. }
  696. CString CServerDlg::GetTurnTagData()
  697. {
  698. if (m_VecAgentAttributeStr.size() <= 4) return "";
  699. string str = m_VecAgentAttributeStr.at(4);
  700. CString sttr = str.c_str();
  701. return sttr;
  702. }
  703. int GetAgentIDInVec(CString AgentInfoStr)
  704. {
  705. int index = AgentInfoStr.Find('|');
  706. CString AgentIDInVecStr = AgentInfoStr.Mid(0, index);
  707. int AgentIDInVec = atoi(AgentIDInVecStr);
  708. return AgentIDInVec;
  709. }
  710. int GetAgentExternInVec(CString AgentInfoStr)
  711. {
  712. int index = AgentInfoStr.Find('|');
  713. int Len = AgentInfoStr.GetLength();
  714. CString StrLeft = AgentInfoStr.Mid(index + 1, Len);
  715. int index2 = StrLeft.Find('|');
  716. CString strExtern = StrLeft.Mid(0, index2);
  717. int AgentExternInVec = atoi(strExtern);
  718. return AgentExternInVec;
  719. }
  720. CString CServerDlg::GetConsultCallee()
  721. {
  722. if (m_VecAgentAttributeStr.size() < 5) return "";
  723. string str = m_VecAgentAttributeStr.at(3);
  724. return str.c_str();
  725. }
  726. CString CServerDlg::GetConsultCaller()
  727. {
  728. if (m_VecAgentAttributeStr.size() < 5) return "";
  729. string str = m_VecAgentAttributeStr.at(4);
  730. return str.c_str();
  731. }
  732. int CServerDlg::GetEndParmer()
  733. {
  734. if (m_VecAgentAttributeStr.size() < 4) return -1;
  735. string str = m_VecAgentAttributeStr.at(3);
  736. int endParmer = atoi(str.c_str());
  737. return endParmer;
  738. }
  739. string CServerDlg::CreateJson(int AgentID, string AgentState)
  740. {
  741. Json::Value root;
  742. Json::FastWriter writer;
  743. Json::Value person;
  744. person["AgentID"] = AgentID;
  745. person["AgentState"] = AgentState;
  746. root.append(person);
  747. string json_file = writer.write(root);
  748. return json_file;
  749. }
  750. string CServerDlg::CreateJson2(string str, bool reslut)
  751. {
  752. Json::Value root;
  753. Json::FastWriter writer;
  754. Json::Value person;
  755. person["Result"] = reslut;
  756. person["Type"] = str;
  757. root.append(person);
  758. string json_file = writer.write(root);
  759. return json_file;
  760. }
  761. string CServerDlg::CreateJson2(string str, int waitCount)
  762. {
  763. Json::Value root;
  764. Json::FastWriter writer;
  765. Json::Value person;
  766. person["WaitCount"] = waitCount;
  767. person["Type"] = str;
  768. root.append(person);
  769. string json_file = writer.write(root);
  770. return json_file;
  771. }
  772. string CServerDlg::CreateJson2(string str, bool b, int extenID)
  773. {
  774. Json::Value root;
  775. Json::FastWriter writer;
  776. Json::Value person;
  777. person["Type"] = str;
  778. person["Result"] = b;
  779. person["AgentExten"] = extenID;
  780. root.append(person);
  781. string json_file = writer.write(root);
  782. return json_file;
  783. }
  784. string CServerDlg::CreateJson2(string str, bool b, int extenID, std::string pwd)
  785. {
  786. Json::Value root;
  787. Json::FastWriter writer;
  788. Json::Value person;
  789. person["Type"] = str;
  790. person["Result"] = b;
  791. person["AgentExten"] = extenID;
  792. person["ExtenPwd"] = pwd;
  793. root.append(person);
  794. string json_file = writer.write(root);
  795. return json_file;
  796. }
  797. string CServerDlg::CreateJson3(string strtype, string str)
  798. {
  799. Json::Value root;
  800. Json::FastWriter writer;
  801. Json::Value person;
  802. person["Type"] = strtype;
  803. person["Result"] = str;
  804. root.append(person);
  805. string json_file = writer.write(root);
  806. return json_file;
  807. }
  808. string CServerDlg::CreateJson15(string strtype, int ErrorCode)
  809. {
  810. Json::Value root;
  811. Json::FastWriter writer;
  812. Json::Value person;
  813. person["Type"] = strtype;
  814. person["Result"] = ErrorCode == 0 ? true : false;
  815. person["ErrorCode"] = ErrorCode;
  816. root.append(person);
  817. string json_file = writer.write(root);
  818. return json_file;
  819. }
  820. //by 8/20 县级12345中间件
  821. string CServerDlg::CreateJson16(string strType, bool b, int AgentID, int AgentState, int LineState, string Type)
  822. {
  823. Json::Value root;
  824. Json::FastWriter writer;
  825. Json::Value person;
  826. person["Type"] = strType;
  827. person["AgentID"] = AgentID;
  828. person["AgentState"] = AgentState;
  829. person["Result"] = b;
  830. person["State"] = LineState;
  831. person["TypeStr"] = Type;
  832. root.append(person);
  833. string json_file = writer.write(root);
  834. return json_file;
  835. }
  836. std::string CServerDlg::CreateJson17(string strType, bool b, string PduString)
  837. {
  838. vector<string> VecStringList;
  839. StringSplit(PduString, '|', VecStringList);
  840. Json::Value root;
  841. Json::FastWriter writer;
  842. Json::Value person;
  843. person["Type"] = strType;
  844. person["Result"] = b;
  845. for (std::size_t i = 0; i < VecStringList.size(); i++)
  846. {
  847. if (i == 0)
  848. person["AgentSpeakCount"] = atoi(VecStringList.at(0).c_str());
  849. else if (i == 1)
  850. person["AgentOnlineCount"] = atoi(VecStringList.at(1).c_str());
  851. else if (i == 2)
  852. person["AgentReposeCount"] = atoi(VecStringList.at(2).c_str());
  853. else if (i == 3)
  854. person["WaiteCallCount"] = atoi(VecStringList.at(3).c_str());
  855. else if (i == 4)
  856. person["AgentFreeCount"] = atoi(VecStringList.at(4).c_str());
  857. else if (i == 5)
  858. person["AgentProcessingCount"] = atoi(VecStringList.at(5).c_str());
  859. else if (i == 6)
  860. person["AgentRingCount"] = atoi(VecStringList.at(6).c_str());
  861. else if (i == 7)
  862. person["AgentCallOutCount"] = atoi(VecStringList.at(7).c_str());
  863. else if (i == 8)
  864. person["TrunkCallInCount"] = atoi(VecStringList.at(8).c_str());
  865. }
  866. root.append(person);
  867. string json_file = writer.write(root);
  868. return json_file;
  869. }
  870. std::string CServerDlg::CreateJson18(std::string strType, bool b, std::string SkillGroupDetail)
  871. {
  872. Json::Value root;
  873. Json::FastWriter writer;
  874. Json::Value person;
  875. person["Type"] = strType;
  876. person["Result"] = b;
  877. std::string str = SkillGroupDetail;
  878. std::vector<std::string> vec;
  879. boost::split(vec, str, boost::is_any_of("#"));
  880. for (std::size_t i = 0; i < vec.size(); ++i)
  881. {
  882. if (vec[i].empty())continue;
  883. std::vector<std::string> kv;
  884. boost::split(kv, vec[i], boost::is_any_of("|"));
  885. if (kv.size() < 2)continue;
  886. Json::Value groupCount;
  887. groupCount["Group"] = kv[0];
  888. groupCount["WaitCount"] = kv[1];
  889. person["data"].append(groupCount);
  890. }
  891. root.append(person);
  892. string json_file = writer.write(root);
  893. return json_file;
  894. }
  895. std::string CServerDlg::DropCallJson(bool b, std::string CallerNum)
  896. {
  897. Json::Value root;
  898. Json::FastWriter writer;
  899. Json::Value person;
  900. person["Type"] = "DropCall";
  901. person["Result"] = b;
  902. person["CallerNum"] = CallerNum;
  903. root.append(person);
  904. string json_file = writer.write(root);
  905. return json_file;
  906. }
  907. std::string CServerDlg::CreateJsonZmdExtStateList(std::string strType, bool b, std::string extStateList)
  908. {
  909. Json::Value root;
  910. Json::FastWriter writer;
  911. Json::Value person;
  912. person["Type"] = strType;
  913. person["Result"] = b;
  914. person["ExtenList"] = extStateList;
  915. root.append(person);
  916. string json_file = writer.write(root);
  917. return json_file;
  918. }
  919. string CServerDlg::CreateJson4(string strType, bool b)
  920. {
  921. Json::Value root;
  922. Json::FastWriter writer;
  923. Json::Value person;
  924. person["Type"] = strType;
  925. person["Result"] = b;
  926. root.append(person);
  927. string json_file = writer.write(root);
  928. return json_file;
  929. }
  930. string CServerDlg::CreateJson5(string strType, bool b, int a)
  931. {
  932. Json::Value root;
  933. Json::FastWriter writer;
  934. Json::Value person;
  935. person["Type"] = strType;
  936. person["Result"] = b;
  937. person["State"] = a;
  938. root.append(person);
  939. string json_file = writer.write(root);
  940. return json_file;
  941. }
  942. string CServerDlg::CreateJson6(string strType, bool b, string str, string calleeStr, long callID, int ActionId)
  943. {
  944. Json::Value root;
  945. Json::FastWriter writer;
  946. Json::Value person;
  947. person["Type"] = strType;
  948. person["Result"] = b;
  949. person["Number"] = str;
  950. person["CalleeNumber"] = calleeStr;
  951. person["CallID"] = callID;
  952. person["ActionID"] = ActionId;
  953. root.append(person);
  954. string json_file = writer.write(root);
  955. return json_file;
  956. }
  957. string CServerDlg::CreateJson6(string strType, bool b, string str, string calleeStr, long callID, int ActionId, string trunkId)
  958. {
  959. Json::Value root;
  960. Json::FastWriter writer;
  961. Json::Value person;
  962. person["Type"] = strType;
  963. person["Result"] = b;
  964. person["Number"] = str;
  965. person["CalleeNumber"] = calleeStr;
  966. person["CallID"] = callID;
  967. person["ActionID"] = ActionId;
  968. person["TrunkNumber"] = trunkId;
  969. root.append(person);
  970. string json_file = writer.write(root);
  971. return json_file;
  972. }
  973. string CServerDlg::CreateJson7(string strType, bool b, int AgentID, int AgentState, int state)
  974. {
  975. Json::Value root;
  976. Json::FastWriter writer;
  977. Json::Value person;
  978. person["Type"] = strType;
  979. person["Result"] = b;
  980. person["AgentID"] = AgentID;
  981. person["AgentState"] = AgentState;
  982. person["State"] = state;
  983. root.append(person);
  984. string json_file = writer.write(root);
  985. return json_file;
  986. }
  987. string CServerDlg::CreateJson7(string strType, bool b, int AgentID, int AgentState, int state, int PeerLineType, string strDirection)
  988. {
  989. Json::Value root;
  990. Json::FastWriter writer;
  991. Json::Value person;
  992. person["Type"] = strType;
  993. person["Result"] = b;
  994. person["AgentID"] = AgentID;
  995. person["AgentState"] = AgentState;
  996. person["State"] = state;
  997. person["CallDirection"] = strDirection;
  998. person["PeerLineType"] = PeerLineType;
  999. root.append(person);
  1000. string json_file = writer.write(root);
  1001. return json_file;
  1002. }
  1003. string CServerDlg::CreateJson8(string strType, bool b, int AgentID, string state)
  1004. {
  1005. Json::Value root;
  1006. Json::FastWriter writer;
  1007. Json::Value person;
  1008. person["Type"] = strType;
  1009. person["Result"] = b;
  1010. person["AgentID"] = AgentID;
  1011. person["State"] = state;
  1012. root.append(person);
  1013. string json_file = writer.write(root);
  1014. return json_file;
  1015. }
  1016. string CServerDlg::CreateJson8(string strType, bool b, int AgentID, int ExtenID, string state, string ExtenState, string Caller, string Callee, string ManageAgentId, string Group)
  1017. {
  1018. Json::Value root;
  1019. Json::FastWriter writer;
  1020. Json::Value person;
  1021. person["Type"] = strType;
  1022. person["Result"] = b;
  1023. person["AgentID"] = AgentID;
  1024. person["State"] = state;
  1025. person["ExtenID"] = ExtenID;
  1026. person["ExtenState"] = ExtenState;
  1027. person["Caller"] = Caller;
  1028. person["Callee"] = Callee;
  1029. person["ManageAgentId"] = ManageAgentId;
  1030. person["Group"] = Group;
  1031. root.append(person);
  1032. string json_file = writer.write(root);
  1033. return json_file;
  1034. }
  1035. string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID)
  1036. {
  1037. Json::Value root;
  1038. Json::FastWriter writer;
  1039. Json::Value person;
  1040. person["Type"] = strType;
  1041. person["Result"] = b;
  1042. person["AgentID"] = AgentID;
  1043. person["CurrID"] = CallID;
  1044. root.append(person);
  1045. string json_file = writer.write(root);
  1046. return json_file;
  1047. }
  1048. string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection)
  1049. {
  1050. Json::Value root;
  1051. Json::FastWriter writer;
  1052. Json::Value person;
  1053. person["Type"] = strType;
  1054. person["Result"] = b;
  1055. person["AgentID"] = AgentID;
  1056. person["CurrID"] = CallID;
  1057. person["CallDirection"] = strDirection;
  1058. root.append(person);
  1059. string json_file = writer.write(root);
  1060. return json_file;
  1061. }
  1062. string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection, int ActionID)
  1063. {
  1064. Json::Value root;
  1065. Json::FastWriter writer;
  1066. Json::Value person;
  1067. person["Type"] = strType;
  1068. person["Result"] = b;
  1069. person["AgentID"] = AgentID;
  1070. person["CurrID"] = CallID;
  1071. person["ActionID"] = ActionID;
  1072. person["CallDirection"] = strDirection;
  1073. root.append(person);
  1074. string json_file = writer.write(root);
  1075. return json_file;
  1076. }
  1077. string CServerDlg::CreateJson10(string strType, bool b, string RecPath, long CallId)
  1078. {
  1079. Json::Value root;
  1080. Json::FastWriter writer;
  1081. Json::Value person;
  1082. person["Type"] = strType;
  1083. person["Result"] = b;
  1084. person["RecPath"] = RecPath;
  1085. person["CallID"] = CallId;
  1086. root.append(person);
  1087. string json_file = writer.write(root);
  1088. return json_file;
  1089. }
  1090. string CServerDlg::CreateJson11(string strType, bool b, string strAgentList)
  1091. {
  1092. Json::Value root;
  1093. Json::FastWriter writer;
  1094. Json::Value Header;
  1095. Json::Value Parent;
  1096. Json::Value Body;
  1097. Header["Type"] = strType;
  1098. Header["Result"] = true;
  1099. vector<string> VecStringList;
  1100. vector<string> VecStringItem;
  1101. StringSplit(strAgentList, '|', VecStringList);
  1102. for (auto i = VecStringList.begin(); i < VecStringList.end(); i++)
  1103. {
  1104. StringSplit(*i, ',', VecStringItem);
  1105. if (VecStringItem.size() >= 4)
  1106. {
  1107. string AgentID = VecStringItem.at(0);
  1108. string AgentExten = VecStringItem.at(1);
  1109. string AgentState = VecStringItem.at(2);
  1110. string AgentGroup = VecStringItem.at(3);
  1111. Body["AgentID"] = AgentID;
  1112. Body["AgentExten"] = AgentExten;
  1113. Body["State"] = AgentState;
  1114. Body["Group"] = AgentGroup;
  1115. Parent.append(Body);
  1116. }
  1117. }
  1118. Header["AgentList"] = Parent;
  1119. root.append(Header);
  1120. string json_file = writer.write(root);
  1121. return json_file;
  1122. }
  1123. string CServerDlg::CreateJson12(string strType, bool b, string PduString)
  1124. {
  1125. vector<string> VecStringList;
  1126. StringSplit(PduString, '|', VecStringList);
  1127. Json::Value root;
  1128. Json::FastWriter writer;
  1129. Json::Value person;
  1130. person["Type"] = strType;
  1131. person["Result"] = b;
  1132. person["AgentSpeakCount"] = atoi(VecStringList.at(0).c_str());
  1133. person["AgentOnlineCount"] = atoi(VecStringList.at(1).c_str());
  1134. person["AgentReposeCount"] = atoi(VecStringList.at(2).c_str());
  1135. person["WaiteCallCount"] = atoi(VecStringList.at(3).c_str());
  1136. root.append(person);
  1137. string json_file = writer.write(root);
  1138. return json_file;
  1139. }
  1140. string CServerDlg::CreateJson13(string strType, bool b, const CLineStateUpdateInfo& LineStateUpdateInfo)
  1141. {
  1142. Json::Value root;
  1143. Json::FastWriter writer;
  1144. Json::Value person;
  1145. std::string strTemp = "";
  1146. CString cstrTemp = "";
  1147. person["Type"] = strType;
  1148. person["Result"] = b;
  1149. person["ExternID"] = LineStateUpdateInfo.ExternID;
  1150. person["Externstate"] = LineStateUpdateInfo.Externstate;
  1151. person["CallIDDD"] = LineStateUpdateInfo.CallIDDD;
  1152. person["AgentIDDDD"] = LineStateUpdateInfo.AgentIDDDD;
  1153. person["caller"] = LineStateUpdateInfo.caller;
  1154. person["callee"] = LineStateUpdateInfo.callee;
  1155. person["AssoData"] = LineStateUpdateInfo.AssoData;
  1156. person["Line"] = LineStateUpdateInfo.Line;
  1157. person["InfoEx"] = LineStateUpdateInfo.InfoEx;
  1158. person["FinalExt"] = LineStateUpdateInfo.FinalExt;
  1159. person["OpType"] = LineStateUpdateInfo.OpType;
  1160. root.append(person);
  1161. string json_file = writer.write(root);
  1162. return json_file;
  1163. }
  1164. string CServerDlg::CreateJson14(string strType, bool b, int AgentID, int ExternID, int AgentState, int ExtenState)
  1165. {
  1166. Json::Value root;
  1167. Json::FastWriter writer;
  1168. Json::Value person;
  1169. person["Type"] = strType;
  1170. person["Result"] = b;
  1171. person["AgentID"] = AgentID;
  1172. person["ExternID"] = ExternID;
  1173. person["AgentState"] = AgentState;
  1174. person["ExternState"] = ExtenState;
  1175. root.append(person);
  1176. string json_file = writer.write(root);
  1177. return json_file;
  1178. }
  1179. bool CServerDlg::IsAvailableConID(int CondId)
  1180. {
  1181. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1182. if (m_agentMap.get<hdl_id>().find(CondId) != m_agentMap.get<hdl_id>().end()) return true;
  1183. return false;
  1184. }
  1185. void CServerDlg::OnAcdmsgRecmsg(CPduEntity * Pduenity)
  1186. {
  1187. //CPduEntity* Pduenity = a_pPduEntity;
  1188. PDU_CMD_TYPE Type = Pduenity->GetCmdType();
  1189. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "OnAcdmsgRecmsg.PDU_TYPE= %d ", Type);
  1190. switch (Type)
  1191. {
  1192. case PDU_CMD_DEV_ONLINE_LIST:
  1193. //if (CNetworkClient::GetInstance().isAcdConnected() && CNetworkClient::GetInstance().isCtiConnected()) {
  1194. // __recovLogin(); // 恢复签入
  1195. //} 2023-11-1 屏蔽,不使用恢复签入
  1196. break;
  1197. case PDU_CMD_LISTEN:
  1198. break;
  1199. case PDU_CMD_AGENT_DETAIL:
  1200. {
  1201. bool bSuccess = Pduenity->GetDataBool(0);
  1202. int ConID = Pduenity->GetDataInt(1);
  1203. string strJsonRet = CreateJson17("GetAgentDetail", bSuccess, Pduenity->GetDataString(2).operator LPCSTR());
  1204. if (ConID > 0)
  1205. {
  1206. std::unique_lock<std::mutex> lock(m_agentDetailConIDLock);
  1207. auto it = m_agentDetailConIDs.find(ConID);
  1208. if (it == m_agentDetailConIDs.end()) break;
  1209. auto conID = it->second;
  1210. lock.unlock();
  1211. if (!SendMessageToClient(strJsonRet, conID))
  1212. m_agentDetailConIDs.erase(it);
  1213. }
  1214. else
  1215. {
  1216. std::unique_lock<std::mutex> lock(m_agentDetailConIDLock);
  1217. auto it = m_agentDetailConIDs.begin();
  1218. while (it!=m_agentDetailConIDs.end())
  1219. {
  1220. if (!SendMessageToClient(strJsonRet, it->second))
  1221. it = m_agentDetailConIDs.erase(it);
  1222. else
  1223. ++it;
  1224. }
  1225. }
  1226. break;
  1227. }
  1228. case PDU_CMD_MONITOR_START: // ych 2018.6.4 商丘监控添加命令
  1229. {
  1230. bool bSuccess = Pduenity->GetDataBool(0);
  1231. int ConID = Pduenity->GetDataInt(1);
  1232. string strJsonRet = CreateJson12("Monitor", bSuccess, Pduenity->GetDataString(2).operator LPCSTR());
  1233. SendMessageToClient(strJsonRet, ConID);
  1234. break;
  1235. }
  1236. case PDU_CMD_SUBSCRIBE_START: // ych 2018.6.4 商丘订阅添加命令
  1237. {
  1238. bool bSuccess = Pduenity->GetDataBool(0);
  1239. int ConID = Pduenity->GetDataInt(1);
  1240. string strAgentList = Pduenity->GetDataString(2).operator LPCSTR();
  1241. vector<string> VecStringList;
  1242. vector<string> VecStringItem;
  1243. StringSplit(strAgentList, '|', VecStringList);
  1244. for (auto i = VecStringList.begin(); i < VecStringList.end(); i++)
  1245. {
  1246. StringSplit(*i, ',', VecStringItem);
  1247. if (VecStringItem.size() < 4)
  1248. continue;
  1249. string AgentID = VecStringItem.at(0);
  1250. string AgentExten = VecStringItem.at(1);
  1251. string AgentState = VecStringItem.at(2);
  1252. string AssoExtState = VecStringItem.at(3);
  1253. string strSendAgent = CreateJson14("AgentStateMonitor", bSuccess, atoi(AgentID.c_str()), atoi(AgentExten.c_str()), atoi(AgentState.c_str()), atoi(AssoExtState.c_str())); // ych 2018.11.27
  1254. SendMessageToClient(strSendAgent, ConID);
  1255. }
  1256. break;
  1257. }
  1258. case PDU_CMD_AGENT_LOGIN: //签入
  1259. {
  1260. bool IsSuccess = Pduenity->GetDataBool(0);
  1261. int ErrorCode = Pduenity->GetDataUInt(6);
  1262. char* StrReturn = TranslateErrorCode(ErrorCode);
  1263. int t_agent_id = Pduenity->GetDataUInt(2);
  1264. ////2022-09-06
  1265. //int recov = Pduenity->GetDataUInt(8);
  1266. //if (recov == 1) { // 如果是恢复签入,不进行回复
  1267. // return;
  1268. //}
  1269. long conID = 0;
  1270. {
  1271. std::unique_lock<std::mutex>lock(m_MapLoginAgentConIDLock);
  1272. auto it = m_MapLoginAgentConID.find(t_agent_id);
  1273. if (it != m_MapLoginAgentConID.end())
  1274. {
  1275. conID = it->second;
  1276. m_MapLoginAgentConID.erase(it);
  1277. }
  1278. else
  1279. {
  1280. break;
  1281. }
  1282. }
  1283. if (IsSuccess)
  1284. {
  1285. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1286. auto it = m_agentMap.get<agent_id>().find(t_agent_id);
  1287. if (it != m_agentMap.get<agent_id>().end())
  1288. {
  1289. int hdlId = conID;
  1290. int old_hdlId = it->HdlID;
  1291. if (hdlId != old_hdlId)
  1292. {
  1293. //logout
  1294. std::string strSend = CreateJson2("Logout", true);
  1295. SendMessageToClient(strSend, old_hdlId);
  1296. }
  1297. m_agentMap.get<agent_id>().erase(it);
  1298. }
  1299. m_agentMap.insert(Agent(t_agent_id, Pduenity->GetDataUInt(1), conID));
  1300. std::string strSend = CreateJson2("Login", true);
  1301. SendMessageToClient(strSend, conID);
  1302. }
  1303. else
  1304. {
  1305. std::string strSend = CreateJson3("Login", StrReturn);
  1306. SendMessageToClient(strSend, conID);
  1307. }
  1308. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "Server->Agent[%d],签入[%s] ", t_agent_id, IsSuccess ? "成功" : "失败");
  1309. break;
  1310. }
  1311. case PDU_CMD_AGENT_LOGOUT: //签出
  1312. {
  1313. int t_agent_id = Pduenity->GetDataUInt(2);
  1314. bool IsSuccess = Pduenity->GetDataBool(0);
  1315. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1316. auto it = m_agentMap.get<agent_id>().find(t_agent_id);
  1317. if (it != m_agentMap.get<agent_id>().end())
  1318. {
  1319. long conID = it->HdlID;
  1320. std::string strSend;
  1321. if (IsSuccess)
  1322. {
  1323. strSend = CreateJson2("Logout", true);
  1324. m_agentMap.get<agent_id>().erase(it);
  1325. }
  1326. else
  1327. {
  1328. strSend = CreateJson2("Logout", false);
  1329. }
  1330. SendMessageToClient(strSend, conID);
  1331. }
  1332. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "Server->Agent[%d],签出[%s] ", t_agent_id, IsSuccess ? "成功" : "失败");
  1333. break;
  1334. }
  1335. case PDU_CMD_AGENT_SETSTATE: //设置座席状态
  1336. {
  1337. bool IsSuccess = Pduenity->GetDataBool(0);
  1338. int AgentState = Pduenity->GetDataUInt(3);
  1339. int t_agent_id = Pduenity->GetDataUInt(2);
  1340. std::string strSend = CreateJson5("SetState", IsSuccess, AgentState);
  1341. SendMessageToClientByAgentId(strSend, t_agent_id);
  1342. break;
  1343. }
  1344. case PDU_CMD_AGENT_RESET: //重置
  1345. {
  1346. int t_agent_id = Pduenity->GetDataUInt(2);
  1347. SendMessageToClientByAgentId("RESET", t_agent_id);
  1348. //SendMessageToClient("RESET",G_ConID);
  1349. break;
  1350. }
  1351. case PDU_CMD_AGENT_MAKECALL: // 外呼 PDU_CMD_CTI_DEV_CALL 设备外呼
  1352. {
  1353. int currentAgentID = Pduenity->GetDataUInt(2);
  1354. #ifndef ANTUMIDDLEWARE
  1355. bool IsSuccess = Pduenity->GetDataBool(0);
  1356. std::string strSend = CreateJson2("MakeCall", IsSuccess);
  1357. #else
  1358. int ErrorCode = Pduenity->GetDataInt(0);
  1359. std::string strSend = CreateJson15("MakeCall", ErrorCode);
  1360. #endif
  1361. SendMessageToClientByAgentId(strSend, currentAgentID);
  1362. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, "{OnMymsgRecmsg},外呼返回错误码=%d", ErrorCode);
  1363. break;
  1364. }
  1365. case PDU_CMD_AGENT_ANSWER: //应答
  1366. {
  1367. bool IsSuccess = Pduenity->GetDataBool(0);
  1368. int t_agent_id = Pduenity->GetDataUInt(2);
  1369. std::string strSend = CreateJson2("Answer", IsSuccess);
  1370. SendMessageToClientByAgentId(strSend, t_agent_id);
  1371. break;
  1372. }
  1373. case PDU_CMD_AGENT_HANGUP: //挂机
  1374. case PDU_CMD_AGENT_TURN_TO_IVR:
  1375. {
  1376. int t_agent_id = Pduenity->GetDataUInt(2);
  1377. bool IsSuccess = Pduenity->GetDataBool(0);
  1378. CString CallerNum = Pduenity->GetDataString(3);
  1379. std::string strSend;
  1380. //strSend = CreateJson2("DropCall", IsSuccess); // 2021-12-31
  1381. if (CallerNum.IsEmpty() || CallerNum == "")
  1382. strSend = DropCallJson(IsSuccess, "");
  1383. else
  1384. strSend = DropCallJson(IsSuccess, CallerNum.GetBuffer(0));
  1385. SendMessageToClientByAgentId(strSend, t_agent_id);
  1386. break;
  1387. }
  1388. case PDU_CMD_AGENT_HOLD: //保持
  1389. {
  1390. int t_agent_id = Pduenity->GetDataUInt(2);
  1391. bool IsSuccess = Pduenity->GetDataBool(0);
  1392. std::string strSend = CreateJson2("Hold", IsSuccess);
  1393. SendMessageToClientByAgentId(strSend, t_agent_id);
  1394. break;
  1395. }
  1396. case PDU_CMD_AGENT_TAKEBACK: //接回
  1397. {
  1398. int t_agent_id = Pduenity->GetDataUInt(2);
  1399. bool IsSuccess = Pduenity->GetDataBool(0);
  1400. std::string strSend = CreateJson2("Retrieve", IsSuccess);
  1401. SendMessageToClientByAgentId(strSend, t_agent_id);
  1402. break;
  1403. }
  1404. case PDU_CMD_AGENT_MUTE: // 静音
  1405. {
  1406. int t_agent_id = Pduenity->GetDataUInt(2);
  1407. bool IsSuccess = Pduenity->GetDataBool(0);
  1408. std::string strSend = CreateJson2("Mute", IsSuccess);
  1409. SendMessageToClientByAgentId(strSend, t_agent_id);
  1410. }
  1411. break;
  1412. case PDU_CMD_AGENT_TRANSTALK: //转移
  1413. {
  1414. int t_agent_id = Pduenity->GetDataUInt(2);
  1415. bool IsSuccess = Pduenity->GetDataBool(0);
  1416. std::string strSend = CreateJson2("Transfer", IsSuccess);
  1417. SendMessageToClientByAgentId(strSend, t_agent_id);
  1418. break;
  1419. }
  1420. case PDU_CMD_AGENT_THREETALK: //Meeting三方通话
  1421. {
  1422. int t_agent_id = Pduenity->GetDataUInt(2);
  1423. bool IsSuccess = Pduenity->GetDataBool(0);
  1424. CString callerNum = Pduenity->GetDataString(4); // 主叫号码/呼入的号码
  1425. CString tagNum = Pduenity->GetDataString(3); // 拉去的第三方号码
  1426. std::string strSend = CreateJson2("Meeting", IsSuccess);
  1427. SendMessageToClientByAgentId(strSend, t_agent_id);
  1428. if (m_IsVideo)
  1429. {
  1430. std::regex pattern("^[0-9]{1,}$");
  1431. if (std::regex_match(callerNum.GetBuffer(0), pattern))
  1432. {
  1433. callerNum.ReleaseBuffer();
  1434. SendMessageToClientByExtenId(strSend, _ttoi(callerNum));
  1435. }
  1436. if (std::regex_match(tagNum.GetBuffer(0), pattern))
  1437. {
  1438. tagNum.ReleaseBuffer();
  1439. SendMessageToClientByExtenId(strSend, _ttoi(tagNum));
  1440. }
  1441. }
  1442. break;
  1443. }
  1444. case PDU_CMD_AGENT_THREETALK_TAKEBACK:
  1445. {
  1446. int t_agent_id = Pduenity->GetDataUInt(2);
  1447. bool IsSuccess = Pduenity->GetDataBool(0);
  1448. std::string strSend = CreateJson2("MeetingTakeBack", IsSuccess);
  1449. SendMessageToClientByAgentId(strSend, t_agent_id);
  1450. break;
  1451. }
  1452. case PDU_CMD_AGENT_MONI_LISTEN: //班长 监听
  1453. {
  1454. int t_agent_id = Pduenity->GetDataUInt(2);
  1455. bool IsSuccess = Pduenity->GetDataBool(0);
  1456. std::string strSend = CreateJson2("Listen", IsSuccess);
  1457. SendMessageToClientByAgentId(strSend, t_agent_id);
  1458. break;
  1459. }
  1460. case PDU_CMD_AGENT_MONI_INSERT: //班长 强插
  1461. {
  1462. int t_agent_id = Pduenity->GetDataUInt(2);
  1463. bool IsSuccess = Pduenity->GetDataBool(0);
  1464. std::string strSend = CreateJson2("Insert", IsSuccess);
  1465. SendMessageToClientByAgentId(strSend, t_agent_id);
  1466. break;
  1467. }
  1468. case PDU_CMD_AGENT_MONI_INTERCEPT: //班长 强截
  1469. {
  1470. int t_agent_id = Pduenity->GetDataUInt(2);
  1471. bool IsSuccess = Pduenity->GetDataBool(0);
  1472. std::string strSend = CreateJson2("Intercept", IsSuccess);
  1473. SendMessageToClientByAgentId(strSend, t_agent_id);
  1474. break;
  1475. }
  1476. case PDU_CMD_AGENT_MONI_CUT: //班长 强拆
  1477. {
  1478. int t_agent_id = Pduenity->GetDataUInt(2);
  1479. bool IsSuccess = Pduenity->GetDataBool(0);
  1480. std::string strSend = CreateJson2("Cut", IsSuccess);
  1481. SendMessageToClientByAgentId(strSend, t_agent_id);
  1482. break;
  1483. }
  1484. case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 强制坐席签出
  1485. {
  1486. int t_agent_id = Pduenity->GetDataUInt(2);
  1487. bool IsSuccess = Pduenity->GetDataBool(0);
  1488. std::string strSend = CreateJson2("ForceLogOut", IsSuccess);
  1489. SendMessageToClientByAgentId(strSend, t_agent_id);
  1490. if (IsSuccess)//通知被控制座席
  1491. {
  1492. std::string t_trg_strSend = CreateJson5("MotorLogOut", IsSuccess, Pduenity->GetDataUInt(5));
  1493. int t_trg_agent_id = Pduenity->GetDataUInt(4);
  1494. SendMessageToClientByAgentId(t_trg_strSend, t_trg_agent_id,true);
  1495. }
  1496. break;
  1497. }
  1498. case PDU_CMD_AGENT_MONI_FORCE_STATE: //班长 强制控制座席状态
  1499. {
  1500. int t_agent_id = Pduenity->GetDataUInt(2);
  1501. bool IsSuccess = Pduenity->GetDataBool(0);
  1502. std::string strSend = CreateJson2("ForceState", IsSuccess);
  1503. SendMessageToClientByAgentId(strSend, t_agent_id);
  1504. if (IsSuccess)//通知被控制座席
  1505. {
  1506. std::string t_trg_strSend = CreateJson5("MotorSetState", IsSuccess, Pduenity->GetDataUInt(5));
  1507. int t_trg_agent_id = Pduenity->GetDataUInt(4);
  1508. SendMessageToClientByAgentId(t_trg_strSend, t_trg_agent_id);
  1509. }
  1510. break;
  1511. }
  1512. case PDU_CMD_AGENT_MONI_REPLACE: //班长 代接
  1513. {
  1514. int t_agent_id = Pduenity->GetDataUInt(2);
  1515. bool IsSuccess = Pduenity->GetDataBool(0);
  1516. std::string strSend = CreateJson2("Replace", IsSuccess);
  1517. SendMessageToClientByAgentId(strSend, t_agent_id);
  1518. break;
  1519. }
  1520. case PDU_CMD_ACD_SUBMIT_DATA: //座席状态发生变化
  1521. {
  1522. std::string State = Pduenity->GetDataString(3);
  1523. int AgentID = Pduenity->GetDataUInt(0);
  1524. int ExtenID = Pduenity->GetDataUInt(1);
  1525. std::string Group = Pduenity->GetDataString(6);
  1526. int t_sub_AgentID = Pduenity->GetDataUInt(5);
  1527. int DataType = Pduenity->GetDataUInt(2);
  1528. std::string state;
  1529. // 2023-03-24 State超过511通过rcf获取
  1530. if (State.length() >= 511) {
  1531. if (getSubmitData(AgentID, DataType, state)) {
  1532. State=state;
  1533. }
  1534. }
  1535. std::string strSend;
  1536. if (DataType == 0) //座席状态
  1537. {
  1538. std::string t_extend_state = "";
  1539. std::string t_agent_state = "";
  1540. std::string t_caller = "";
  1541. std::string t_callee = "";
  1542. std::string t_m_agent = "";
  1543. vector<string> VecStringList;
  1544. StringSplit(State, '|', VecStringList);
  1545. if (VecStringList.size() > 4)
  1546. {
  1547. t_agent_state = VecStringList.at(0);
  1548. t_extend_state = VecStringList.at(1);
  1549. t_caller = VecStringList.at(2);
  1550. t_callee = VecStringList.at(3);
  1551. t_m_agent = VecStringList.at(4);
  1552. strSend = CreateJson8("AgentState", true, AgentID, ExtenID, t_agent_state, t_extend_state, t_caller, t_callee, t_m_agent, Group);
  1553. }
  1554. else
  1555. {
  1556. t_agent_state = State;
  1557. strSend = CreateJson8("AgentState", true, AgentID, t_agent_state);
  1558. }
  1559. }
  1560. else if (DataType == 1) //线路状态
  1561. {
  1562. strSend = CreateJson8("LineState", true, AgentID, State);
  1563. }
  1564. //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, "Server->Agent : 通知座席状态转发至坐席 [%s]", strSend);
  1565. if (t_sub_AgentID == 0) // ych 2018.6.5 依据订阅者ID是否有效决定是否群发
  1566. {
  1567. auto it = m_SubScribed_ConID.begin();
  1568. while (it!= m_SubScribed_ConID.end())
  1569. {
  1570. if (!SendMessageToClient(strSend, it->first))
  1571. it = m_SubScribed_ConID.erase(it);
  1572. else
  1573. ++it;
  1574. }
  1575. }
  1576. else
  1577. {
  1578. bool bOK = false;
  1579. auto it = m_SubScribed_ConID.begin();
  1580. while (it != m_SubScribed_ConID.end())
  1581. {
  1582. if (it->second == t_sub_AgentID)
  1583. {
  1584. if (SendMessageToClient(strSend, it->first))
  1585. {
  1586. bOK = true;
  1587. break;
  1588. }
  1589. }
  1590. ++it;
  1591. }
  1592. if(!bOK)
  1593. SendMessageToClientByAgentId(strSend, t_sub_AgentID);
  1594. }
  1595. break;
  1596. }
  1597. case PDU_CMD_CTI_LINE_STATE: //线路状态
  1598. {
  1599. OnLineStateChange(Pduenity);
  1600. int Exten = Pduenity->GetDataUInt(0);
  1601. int AgentID = Pduenity->GetDataUInt(3);
  1602. int AgentState = Pduenity->GetDataUInt(12);
  1603. int ExtenState = Pduenity->GetDataUInt(1);
  1604. //string m_strDropcall = Pduenity->GetDataString(14);
  1605. //string strSendAgent = CreateJson7("AgentStateAgent", true, AgentID, AgentState, ExtenState);
  1606. //SendMessageToClientByAgentId(strSendAgent, AgentID); // 2021-11-09 屏蔽,
  1607. break;
  1608. }
  1609. case PDU_CMD_ACD_AGENT_STATE:
  1610. {
  1611. int Exten = Pduenity->GetDataUInt(0);
  1612. int AgentID = Pduenity->GetDataUInt(1);
  1613. int AgentState = Pduenity->GetDataUInt(2);
  1614. int ExtenState = Pduenity->GetDataUInt(3);
  1615. string strSendAgent = CreateJson7("AgentStateAgent", true, AgentID, AgentState, ExtenState);
  1616. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1617. strSendAgent = CreateJson14("AgentStateMonitor", true, AgentID, Exten, AgentState, ExtenState); // ych 2018.6.6
  1618. auto it = m_ConIdVec.begin();
  1619. while (it != m_ConIdVec.end())
  1620. {
  1621. if (!SendMessageToClient(strSendAgent, it->second))
  1622. it = m_ConIdVec.erase(it);
  1623. else
  1624. ++it;
  1625. }
  1626. }
  1627. break;
  1628. case PDU_CMD_CTI_RECORD:
  1629. {
  1630. int RecExtern = Pduenity->GetDataUInt(0);
  1631. long CallID = Pduenity->GetDataULong(1);
  1632. CString RecPath = Pduenity->GetDataString(2);
  1633. std::string strSendAgent = CreateJson10("RecordPath", true, RecPath.GetBuffer(0), CallID);
  1634. RecPath.ReleaseBuffer();
  1635. SendMessageToClientByExtenId(strSendAgent, RecExtern);
  1636. break;
  1637. }
  1638. case PDU_CMD_IVR_WAITER_COUNT: // 排队人数
  1639. {
  1640. int count = Pduenity->GetDataUInt(0);
  1641. std::string strSend = CreateJson2("WaitCount", count);
  1642. SendMessageToAllAgentClient(strSend);
  1643. break;
  1644. }
  1645. case PDU_CMD_AGENT_GET_AGENTLIST:
  1646. {
  1647. //??2018.5.23 NotFound
  1648. //CString AgentListStr = Pduenity->GetDataString(2);
  1649. int t_agent_id = Pduenity->GetDataUInt(1);
  1650. std::string agentList;
  1651. CString AgentListStr;
  1652. if (getAgentList(t_agent_id, agentList)) // 2022-01-20 从rcfserver获取,防止坐席太多,造成字符串超过限制
  1653. AgentListStr.Format("%s", agentList.c_str());
  1654. else
  1655. AgentListStr = Pduenity->GetDataString(2);
  1656. std::string strSendAgent = CreateJson11("GetAgentList", true, AgentListStr.GetBuffer(0));
  1657. AgentListStr.ReleaseBuffer();
  1658. SendMessageToClientByAgentId(strSendAgent, t_agent_id);
  1659. break;
  1660. }
  1661. case PDU_CMD_AGENT_CONSULTATION_CALL:
  1662. {
  1663. int t_agent_id = Pduenity->GetDataUInt(2);
  1664. bool IsSuccess = Pduenity->GetDataBool(0);
  1665. std::string strSend = CreateJson2("Consult", IsSuccess);
  1666. SendMessageToClientByAgentId(strSend, t_agent_id);
  1667. break;
  1668. }
  1669. case PDU_CMD_AGENT_CONFIRM_TRANSFER:
  1670. {
  1671. int t_agent_id = Pduenity->GetDataUInt(2);
  1672. bool IsSuccess = Pduenity->GetDataBool(0);
  1673. int EndParmer = Pduenity->GetDataUInt(3);
  1674. std::string strSend = CreateJson5("ConfirmTransfer", IsSuccess, EndParmer);
  1675. SendMessageToClientByAgentId(strSend, t_agent_id);
  1676. break;
  1677. }
  1678. case PDU_CMD_AGENT_VIDEO_REQ_EXTEN: // 请求注册视频分机号
  1679. {
  1680. bool ret = Pduenity->GetDataBool(0);
  1681. uint32_t agentId = Pduenity->GetDataUInt(1);
  1682. uint32_t extenId = Pduenity->GetDataUInt(2);
  1683. CString pwd = Pduenity->GetDataString(3);
  1684. long conID = 0;
  1685. {
  1686. std::unique_lock<std::mutex>lock(m_MapLoginAgentConIDLock);
  1687. auto it = m_MapLoginAgentConID.find(agentId);
  1688. if (it != m_MapLoginAgentConID.end())
  1689. {
  1690. conID = it->second;
  1691. m_MapLoginAgentConID.erase(it);
  1692. }
  1693. else
  1694. {
  1695. break;
  1696. }
  1697. }
  1698. if (ret)
  1699. {
  1700. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1701. auto it = m_agentMap.get<agent_id>().find(agentId);
  1702. if (it != m_agentMap.get<agent_id>().end())
  1703. m_agentMap.get<agent_id>().erase(it);
  1704. Agent agent(agentId, extenId, conID);
  1705. m_agentMap.insert(agent);
  1706. }
  1707. std::string strSend = CreateJson2("VideoReqExten", ret, extenId, pwd.GetBuffer(0));
  1708. pwd.ReleaseBuffer();
  1709. SendMessageToClient(strSend, conID);
  1710. }
  1711. break;
  1712. case PDU_CMD_AGENT_VIDEO_REQ_AGENT: // 请求空闲坐席
  1713. {
  1714. bool ret = Pduenity->GetDataBool(0);
  1715. uint32_t agentId = Pduenity->GetDataUInt(1);
  1716. uint32_t extenId = Pduenity->GetDataUInt(2);
  1717. std::string strSend = CreateJson2("VideoReqIdeAgent", ret, extenId);
  1718. SendMessageToClientByAgentId(strSend, agentId);
  1719. }
  1720. break;
  1721. case PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN: // 释放请求的视频分机号
  1722. {
  1723. uint32_t agentId = Pduenity->GetDataUInt(1);
  1724. std::string strSend = CreateJson2("VideoDesExten", true);
  1725. SendMessageToClientByAgentId(strSend, agentId);
  1726. {
  1727. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1728. auto it = m_agentMap.get<agent_id>().find(agentId);
  1729. if (it != m_agentMap.get<agent_id>().end())
  1730. m_agentMap.get<agent_id>().erase(it);
  1731. }
  1732. }
  1733. break;
  1734. case PDU_CMD_AGENT_SKILL_GROUP_WAIT_COUNT:
  1735. {
  1736. CString sCount = Pduenity->GetDataString(0);
  1737. std::string strSend = CreateJson18("SkillGroupWaitCount", true, sCount.GetBuffer(0));
  1738. SendMessageToAllAgentClient(strSend);
  1739. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "ACD->HttpServer SkillGroupWaitCount[%s] ", sCount);
  1740. }
  1741. break;
  1742. case PDU_CMD_AGENT_SEND_DTMF:
  1743. {
  1744. bool IsSuccess = Pduenity->GetDataBool(0);
  1745. int t_agent_id = Pduenity->GetDataUInt(2);
  1746. std::string strSend = CreateJson2("SendDtmf", IsSuccess);
  1747. SendMessageToClientByAgentId(strSend, t_agent_id);
  1748. }
  1749. break;
  1750. case PDU_CMD_EXTEN_STATE_LIST_ZMD: // 驻马店专用, 获取分机状态
  1751. {
  1752. int t_agent_id = Pduenity->GetDataUInt(1);
  1753. std::string extList;
  1754. bool ret = getZmdExtenStateList(extList);
  1755. std::string strSendAgent = CreateJsonZmdExtStateList("GetExtenList", ret, extList);
  1756. SendMessageToClientByAgentId(strSendAgent, t_agent_id);
  1757. }
  1758. break;
  1759. default:
  1760. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, "OnMymsgRecmsg,UnSupportPduCmd=%d", Type);
  1761. }
  1762. }
  1763. void CServerDlg::OnLineStateChange(CPduEntity* Pduenity)
  1764. {
  1765. CLineStateUpdateInfo LineStateUpdateInfo;
  1766. memset(&LineStateUpdateInfo, 0, sizeof(CLineStateUpdateInfo));
  1767. LineStateUpdateInfo.ExternID = Pduenity->GetDataUInt(0);
  1768. LineStateUpdateInfo.Externstate = Pduenity->GetDataUInt(1);
  1769. LineStateUpdateInfo.CallIDDD = Pduenity->GetDataULong(2);
  1770. LineStateUpdateInfo.ActionID = Pduenity->GetDataInt(11);
  1771. LineStateUpdateInfo.AgentIDDDD = Pduenity->GetDataUInt(3);
  1772. CString strCaller = Pduenity->GetDataString(4);
  1773. CString strCallee = Pduenity->GetDataString(5);
  1774. CString strAssoData = Pduenity->GetDataString(6);
  1775. LineStateUpdateInfo.Line = Pduenity->GetDataUInt(7);
  1776. LineStateUpdateInfo.InfoEx = Pduenity->GetDataUInt(8);
  1777. LineStateUpdateInfo.FinalExt = Pduenity->GetDataUInt(9);
  1778. LineStateUpdateInfo.OpType = Pduenity->GetDataUInt(10);
  1779. LineStateUpdateInfo.Dropcall = Pduenity->GetDataUInt(14);
  1780. //int AgentState = Pduenity->GetDataUInt(12);
  1781. char TempChar[512] = { 0 };
  1782. memcpy(TempChar, strCaller, strCaller.GetLength());
  1783. LineStateUpdateInfo.caller = std::string(TempChar);
  1784. memset(TempChar, 0, 512);
  1785. memcpy(TempChar, strCallee, strCallee.GetLength());
  1786. LineStateUpdateInfo.callee = std::string(TempChar);
  1787. memset(TempChar, 0, 512);
  1788. memcpy(TempChar, strAssoData, strAssoData.GetLength());
  1789. LineStateUpdateInfo.AssoData = std::string(TempChar);
  1790. int LineState = Pduenity->GetDataUInt(1);
  1791. int AgentID = Pduenity->GetDataUInt(3);
  1792. int AgentState = Pduenity->GetDataUInt(12);
  1793. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "座席号=%d, 座席状态=%d, 线路状态=%d, caller=%s, callee=%s",
  1794. AgentID, AgentState, LineStateUpdateInfo.Externstate, LineStateUpdateInfo.caller.c_str(), LineStateUpdateInfo.callee.c_str());
  1795. std::string strSendAgent = "";
  1796. switch (Pduenity->GetDataUInt(1))
  1797. {
  1798. case INNER_STATE_FREE: //挂机
  1799. {
  1800. strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState);
  1801. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, " 线路状态: %s ", strSendAgent.c_str());
  1802. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1803. //strSendAgent = CreateJson16("dropCall", true, AgentID, AgentState, LineState, "dropcall"); // by 8/20
  1804. strSendAgent = DropCallJson(true, ""); // 2021-12-22 代替上面一行,如有问题再更换回去
  1805. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1806. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, " 线路状态: %s ", strSendAgent.c_str());
  1807. strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo); // ych 2018.6.6
  1808. auto it = m_ConIdVec.begin();
  1809. while (it != m_ConIdVec.end())
  1810. {
  1811. SendMessageToClient(strSendAgent, it->second);
  1812. ++it;
  1813. }
  1814. }
  1815. break;
  1816. case INNER_STATE_TALKING: //通话中
  1817. {
  1818. //电话接通后,发送CallID
  1819. unsigned long CallID = Pduenity->GetDataULong(2);
  1820. int PeerLineType = Pduenity->GetDataUInt(7); //0 -> 内线,1 -> 外线
  1821. if (CallID == 0)
  1822. {
  1823. return;
  1824. }
  1825. // 2020-01-13 移动到下面,添加呼入呼出方向字段
  1826. /*strSendAgent = CreateJson9("CallID", true, AgentID, CallID);
  1827. SendMessageToClient(strSendAgent.c_str(), AgentConId);*/
  1828. std::string strDirection;
  1829. CString t_ExternID;
  1830. int t_eid = Pduenity->GetDataUInt(0);
  1831. t_ExternID.Format(_T("%d"), t_eid);
  1832. CString t_Caller = Pduenity->GetDataString(4);
  1833. CString t_Callee = Pduenity->GetDataString(5);
  1834. if (t_ExternID == t_Caller)
  1835. {
  1836. strDirection = "out";
  1837. }
  1838. else
  1839. {
  1840. strDirection = "in";
  1841. }
  1842. // 2020-01-13 移添加呼入呼出方向字段,代替上面发送的callid, 2021-03-22 添加actionid
  1843. strSendAgent = CreateJson9("CallID", true, AgentID, CallID, strDirection, LineStateUpdateInfo.ActionID);
  1844. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1845. strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState, PeerLineType, strDirection);
  1846. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1847. strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo); // ych 2018.6.6
  1848. auto it = m_ConIdVec.begin();
  1849. while (it != m_ConIdVec.end())
  1850. {
  1851. SendMessageToClient(strSendAgent, it->second);
  1852. ++it;
  1853. }
  1854. }
  1855. break;
  1856. case INNER_STATE_ALERTING: //来电振铃
  1857. {
  1858. unsigned long CallID = Pduenity->GetDataULong(2);
  1859. int TargetAgentID = Pduenity->GetDataUInt(3);
  1860. CString outNumber = Pduenity->GetDataString(4);
  1861. CString calleeNumber = Pduenity->GetDataString(5);
  1862. CString trunkNumber = Pduenity->GetDataString(13); // 7.29 中继号
  1863. int ActionID = Pduenity->GetDataInt(11);
  1864. // int ConID;
  1865. // m_MapAgentConID.Lookup(TargetAgentID,ConID);
  1866. // std::string strSend = CreateJson6("Incoming", true, outNumber.GetBuffer(0), calleeNumber.GetBuffer(0), CallID, ActionID);
  1867. std::string strSend = CreateJson6("Incoming", true, outNumber.GetBuffer(0), calleeNumber.GetBuffer(0), CallID, ActionID, trunkNumber.GetBuffer(0));
  1868. outNumber.ReleaseBuffer();
  1869. calleeNumber.ReleaseBuffer();
  1870. trunkNumber.ReleaseBuffer();
  1871. SendMessageToClientByAgentId(strSend, AgentID);
  1872. strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState);
  1873. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1874. strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6
  1875. auto it = m_ConIdVec.begin();
  1876. while (it != m_ConIdVec.end())
  1877. {
  1878. SendMessageToClient(strSendAgent, it->second);
  1879. ++it;
  1880. }
  1881. }
  1882. break;
  1883. case INNER_STATE_RING_BACK: //回铃
  1884. {
  1885. strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState);
  1886. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1887. strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6
  1888. auto it = m_ConIdVec.begin();
  1889. while (it != m_ConIdVec.end())
  1890. {
  1891. SendMessageToClient(strSendAgent, it->second);
  1892. ++it;
  1893. }
  1894. }
  1895. break;
  1896. case INNER_STATE_INIT:
  1897. case INNER_STATE_DIALING:
  1898. case INNER_STATE_PLAY_BUSYTONE:
  1899. case INNER_STATE_REMOVE:
  1900. case INNER_STATE_HELD:
  1901. {
  1902. strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState);
  1903. SendMessageToClientByAgentId(strSendAgent, AgentID);
  1904. strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6
  1905. auto it = m_ConIdVec.begin();
  1906. while (it != m_ConIdVec.end())
  1907. {
  1908. SendMessageToClient(strSendAgent, it->second);
  1909. ++it;
  1910. }
  1911. }
  1912. break;
  1913. default:
  1914. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, "OnLineStateChange.AgentID= %d,AgentState=%d,UnKnownLineState=%d ", AgentID, AgentState, LineState);
  1915. }
  1916. }
  1917. void CServerDlg::SendMessageToClientByAgentId(std::string MsgStr, int AgentId, bool isDelAgent)
  1918. {
  1919. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1920. auto it = m_agentMap.get<agent_id>().find(AgentId);
  1921. if (it == m_agentMap.get<agent_id>().end()) { return; }
  1922. auto conID = it->HdlID;
  1923. bool ret = m_Server.sendMsg(conID, MsgStr);
  1924. if (!ret)
  1925. {
  1926. CString strShow;
  1927. strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", AgentId, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1928. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1929. strShow.ReleaseBuffer();
  1930. m_agentMap.get<agent_id>().erase(it);
  1931. return;
  1932. }
  1933. if (isDelAgent) {
  1934. m_agentMap.get<agent_id>().erase(it);
  1935. }
  1936. CString strShow;
  1937. strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", AgentId, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1938. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1939. strShow.ReleaseBuffer();
  1940. }
  1941. bool CServerDlg::SendMessageToClientByExtenId(std::string MsgStr, int ExtenId)
  1942. {
  1943. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1944. auto it = m_agentMap.get<agent_exten>().find(ExtenId);
  1945. if (it == m_agentMap.get<agent_exten>().end()) { return false; }
  1946. auto conID = it->HdlID;
  1947. bool ret = m_Server.sendMsg(conID, MsgStr);
  1948. if (!ret)
  1949. {
  1950. CString strShow;
  1951. strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1952. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1953. strShow.ReleaseBuffer();
  1954. m_agentMap.get<agent_exten>().erase(it);
  1955. return false;
  1956. }
  1957. CString strShow;
  1958. strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1959. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1960. strShow.ReleaseBuffer();
  1961. return true;
  1962. }
  1963. void CServerDlg::SendMessageToClientByHdlId(std::string MsgStr, int CondId)
  1964. {
  1965. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1966. auto it = m_agentMap.get<hdl_id>().find(CondId);
  1967. if (it == m_agentMap.get<hdl_id>().end()) { return; }
  1968. bool ret = m_Server.sendMsg(CondId, MsgStr);
  1969. if (!ret)
  1970. {
  1971. CString strShow;
  1972. strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1973. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1974. strShow.ReleaseBuffer();
  1975. m_agentMap.get<hdl_id>().erase(it);
  1976. return;
  1977. }
  1978. CString strShow;
  1979. strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容
  1980. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  1981. strShow.ReleaseBuffer();
  1982. }
  1983. void CServerDlg::SendMessageToAllAgentClient(std::string MsgStr)
  1984. {
  1985. std::unique_lock<std::mutex>lock(m_agentMapLock);
  1986. auto it = m_agentMap.begin();
  1987. while (it != m_agentMap.end())
  1988. {
  1989. if (m_Server.sendMsg(it->HdlID, MsgStr))
  1990. ++it;
  1991. else
  1992. it = m_agentMap.erase(it);
  1993. }
  1994. }
  1995. bool CServerDlg::SendMessageToClient(std::string MsgStr, long ConId)
  1996. {
  1997. return m_Server.sendMsg(ConId, MsgStr);
  1998. }
  1999. void CServerDlg::__recvMsgFun(const long conID, const std::string &msg, const std::string &ip)
  2000. {
  2001. int Curr_ConID = conID;
  2002. std::string ch = JsonParser(msg);
  2003. if (ch == "")return;
  2004. StringSplit(ch, '@', m_VecAgentAttributeStr);
  2005. if (m_VecAgentAttributeStr.empty())
  2006. {
  2007. return;
  2008. }
  2009. char* TypeStr = GetType();
  2010. bool t_isAcdConnect = CNetworkClient::GetInstance().isAcdConnected();
  2011. if (0 == strcmp(TypeStr, "Heart")) //心跳
  2012. {
  2013. string strSend = CreateJson4("Heart", true);
  2014. SendMessageToClient(strSend, Curr_ConID);
  2015. if (t_isAcdConnect == false)
  2016. {
  2017. string strSend = CreateJson4("AcdConnectNotify", false);
  2018. SendMessageToClient(strSend, Curr_ConID);
  2019. CString strShow;
  2020. strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d ", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID);
  2021. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  2022. strShow.ReleaseBuffer();
  2023. ; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s", ch.c_str());
  2024. }
  2025. return ;
  2026. }
  2027. if (t_isAcdConnect == false) // 2018.6.11
  2028. {
  2029. string strSend = CreateJson4("AcdConnectNotify", false);
  2030. SendMessageToClient(strSend, Curr_ConID);
  2031. CString strShow;
  2032. strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d ", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID);
  2033. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  2034. strShow.ReleaseBuffer();
  2035. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s", ch.c_str());
  2036. //m_agentDetailConIDs.clear();
  2037. //m_agentMap.clear();
  2038. //m_SubScribed_ConID.clear();
  2039. //m_ConIdVec.clear();
  2040. //m_MapLoginAgentConID.clear();
  2041. return ;
  2042. }
  2043. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "收到消息 %s", msg.c_str());
  2044. if (0 == strcmp(TypeStr, "Monitor")) // ych 2018.6.7
  2045. {
  2046. CString strShow;
  2047. strShow.Format("Agent->Server : 收到【 %s 】命令 ConID =%d", TypeStr, Curr_ConID);
  2048. CPduEntity cmd(PDU_CMD_MONITOR_START);
  2049. cmd.SetDataInt(1, Curr_ConID);
  2050. CNetworkClient::GetInstance().send2ACD(&cmd);
  2051. return ;
  2052. }
  2053. if (0 == strcmp(TypeStr, "SubScribeMonitor")) // ych 2018.6.7
  2054. {
  2055. CPduEntity cmd(PDU_CMD_SUBSCRIBE_START);
  2056. cmd.SetDataInt(1, Curr_ConID);
  2057. CNetworkClient::GetInstance().send2ACD(&cmd);
  2058. // ych 2018.6.6 监控订阅保存连接ID
  2059. m_ConIdVec[Curr_ConID] = Curr_ConID;
  2060. std::string strJson = CreateJson2("SubScribeMonitor", true);
  2061. SendMessageToClient(strJson, Curr_ConID);
  2062. return ;
  2063. }
  2064. if (0 == strcmp(TypeStr, "SubScribeMonitorCancel")) // ych 2018.6.7 取消监控订阅
  2065. {
  2066. std::string strJson = CreateJson2("SubScribeMonitorCancel", true);
  2067. SendMessageToClient(strJson, Curr_ConID);
  2068. auto it = m_ConIdVec.find(Curr_ConID);
  2069. if (it != m_ConIdVec.end())
  2070. m_ConIdVec.erase(it);
  2071. return ;
  2072. }
  2073. CString strShow;
  2074. strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d IP[%s]", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID, ip);
  2075. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0));
  2076. strShow.ReleaseBuffer();
  2077. ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s",ch.c_str());
  2078. if (0 == strcmp(TypeStr, "SubScribe")) // 订阅座席状态
  2079. {
  2080. CPduEntity cmd(PDU_CMD_AGENT_SUBSCRIBE);
  2081. cmd.SetDataUInt(1, GetAgentExten());
  2082. cmd.SetDataUInt(2, GetAgentID());
  2083. cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体
  2084. cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号
  2085. bool result = CNetworkClient::GetInstance().send2ACD(&cmd);
  2086. string strSend = CreateJson4("SubScribe", result);
  2087. SendMessageToClient(strSend, Curr_ConID);
  2088. m_SubScribed_ConID[Curr_ConID] = GetAgentID();
  2089. }
  2090. if (0 == strcmp(TypeStr, "SubScribeCancel")) //取消订阅
  2091. {
  2092. CPduEntity cmd(PDU_CMD_AGENT_CANCEL_SUBSCRIBE);
  2093. cmd.SetDataUInt(1, GetAgentExten());
  2094. cmd.SetDataUInt(2, GetAgentID());
  2095. cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体
  2096. cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号
  2097. bool result = CNetworkClient::GetInstance().send2ACD(&cmd);
  2098. string strSend = CreateJson4("SubScribeCancel", result);
  2099. SendMessageToClient(strSend, Curr_ConID);
  2100. auto it = m_SubScribed_ConID.find(Curr_ConID);
  2101. if (it != m_SubScribed_ConID.end())
  2102. m_SubScribed_ConID.erase(Curr_ConID);
  2103. }
  2104. if (0 == strcmp(TypeStr, "VideoReqExten")) // 请求可以注册的分机号
  2105. {
  2106. m_IsVideo = true;
  2107. CPduEntity cmd(PDU_CMD_AGENT_VIDEO_REQ_EXTEN);
  2108. cmd.SetDataUInt(1, GetAgentID());
  2109. CNetworkClient::GetInstance().send2ACD(&cmd);
  2110. {
  2111. std::unique_lock<std::mutex>lock(m_MapLoginAgentConIDLock);
  2112. m_MapLoginAgentConID[GetAgentID()] = Curr_ConID; // 保存连接标识
  2113. }
  2114. }
  2115. if (0 == strcmp(TypeStr, "VideoReqIdeAgent")) // 请求空闲坐席
  2116. {
  2117. m_IsVideo = true;
  2118. CPduEntity cmd(PDU_CMD_AGENT_VIDEO_REQ_AGENT);
  2119. cmd.SetDataUInt(1, GetAgentID());
  2120. CNetworkClient::GetInstance().send2ACD(&cmd);
  2121. // 2021-10-15 督办专员 VideoReqBindAgent代替保存
  2122. /*{
  2123. std::unique_lock<std::mutex>lock(m_agentMapLock);
  2124. auto it = m_agentMap.get<agent_exten>().find(GetAgentExten());
  2125. if (it != m_agentMap.get<agent_exten>().end())
  2126. {
  2127. m_agentMap.get<agent_exten>().erase(it);
  2128. }
  2129. m_agentMap.insert(Agent(GetAgentID(), GetAgentExten(), conID));
  2130. }*/
  2131. }
  2132. if (0 == strcmp(TypeStr, "VideoDesExten")) // 销毁/回收请求的分机号
  2133. {
  2134. m_IsVideo = true;
  2135. CPduEntity cmd(PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN);
  2136. cmd.SetDataUInt(1, GetAgentID());
  2137. cmd.SetDataUInt(2, GetAgentExten());
  2138. cmd.SetDataString(3, "123456");
  2139. CNetworkClient::GetInstance().send2ACD(&cmd);
  2140. }
  2141. if (0 == strcmp(TypeStr, "VideoReqBindAgent")) {
  2142. m_IsVideo = true;
  2143. std::unique_lock<std::mutex>lock(m_agentMapLock);
  2144. auto it = m_agentMap.get<agent_exten>().find(GetAgentExten());
  2145. if (it != m_agentMap.get<agent_exten>().end())
  2146. {
  2147. m_agentMap.get<agent_exten>().erase(it);
  2148. }
  2149. m_agentMap.insert(Agent(GetAgentID(), GetAgentExten(), conID));
  2150. std::string strSend = CreateJson2(TypeStr, true);
  2151. SendMessageToClient(strSend, Curr_ConID);
  2152. }
  2153. if (0 == strcmp(TypeStr, "GetAgentDetail")) // 获取坐席详情
  2154. {
  2155. CPduEntity cmd(PDU_CMD_AGENT_DETAIL);
  2156. cmd.SetDataInt(1, Curr_ConID);
  2157. CNetworkClient::GetInstance().send2ACD(&cmd);
  2158. std::unique_lock<std::mutex> lock(m_agentDetailConIDLock);
  2159. m_agentDetailConIDs[Curr_ConID] = Curr_ConID;
  2160. }
  2161. if (0 == strcmp(TypeStr, "Login")) //签入
  2162. {
  2163. int t_agent_id = GetAgentID();
  2164. if (t_agent_id == 0) // 2022-01-06 坐席工号不能为0
  2165. {
  2166. std::string strSend = CreateJson3("Login", "坐席工号不能为0");
  2167. SendMessageToClient(strSend, Curr_ConID);
  2168. return;
  2169. }
  2170. if (GetAgentExten() == 0)
  2171. {
  2172. std::string strSend = CreateJson3("Login", "坐席分机号不能为0");
  2173. SendMessageToClient(strSend, Curr_ConID);
  2174. return;
  2175. }
  2176. CPduEntity cmd(PDU_CMD_AGENT_LOGIN);
  2177. cmd.SetDataUInt(1, GetAgentExten());
  2178. cmd.SetDataUInt(2, t_agent_id);
  2179. cmd.SetDataString(3, GetAgentGroup());
  2180. cmd.SetDataUInt(4, GetAgentType());
  2181. //2018.5.17
  2182. {
  2183. std::unique_lock<std::mutex>lock(m_MapLoginAgentConIDLock);
  2184. m_MapLoginAgentConID[t_agent_id] = Curr_ConID;
  2185. }
  2186. CNetworkClient::GetInstance().send2ACD(&cmd);
  2187. }
  2188. if (!IsAvailableConID(Curr_ConID))
  2189. return ;
  2190. if (0 == strcmp(TypeStr, "Logout")) //签出
  2191. {
  2192. CPduEntity cmd(PDU_CMD_AGENT_LOGOUT);
  2193. cmd.SetDataUInt(1, GetAgentExten());
  2194. cmd.SetDataUInt(2, GetAgentID());
  2195. CNetworkClient::GetInstance().send2ACD(&cmd);
  2196. }
  2197. if (0 == strcmp(TypeStr, "SayBusy")) //置忙
  2198. {
  2199. CPduEntity cmd(PDU_CMD_AGENT_SETSTATE);
  2200. cmd.SetDataUInt(1, GetAgentExten());
  2201. cmd.SetDataUInt(2, GetAgentID());
  2202. cmd.SetDataUInt(3, AGENT_STATE_REPOSE);
  2203. CNetworkClient::GetInstance().send2ACD(&cmd);
  2204. }
  2205. if (0 == strcmp(TypeStr, "SayFree")) //置闲
  2206. {
  2207. CPduEntity cmd(PDU_CMD_AGENT_SETSTATE);
  2208. cmd.SetDataUInt(1, GetAgentExten());
  2209. cmd.SetDataUInt(2, GetAgentID());
  2210. cmd.SetDataUInt(3, AGENT_STATE_FREE);
  2211. CNetworkClient::GetInstance().send2ACD(&cmd);
  2212. }
  2213. if (0 == strcmp(TypeStr, "Reset")) //重置
  2214. {
  2215. string strSend = CreateJson2("Reset", false);
  2216. CPduEntity cmd(PDU_CMD_AGENT_RESET);
  2217. cmd.SetDataUInt(1, GetAgentExten());
  2218. cmd.SetDataUInt(2, GetAgentID());
  2219. if (CNetworkClient::GetInstance().send2ACD(&cmd))
  2220. strSend = CreateJson2("Reset", true);
  2221. SendMessageToClient(strSend, Curr_ConID);
  2222. }
  2223. if (0 == strcmp(TypeStr, "MakeCall")) //外呼
  2224. {
  2225. // baiyang 被叫号码由分机号改为正确的被叫号码
  2226. // 有前端的CallId,传回主叫号码,相关的Json解析
  2227. //ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "收到消息MakeCall 坐席:%d,分机:%d,目的号:%s ", GetAgentID(), GetAgentExten(), GetMakeCallDestinationNumber());
  2228. //int Number = GetAgentExten();
  2229. //CString strCallerNumber;
  2230. //strCallerNumber.Format("%d", Number);
  2231. CPduEntity cmd(PDU_CMD_AGENT_MAKECALL);
  2232. cmd.SetDataUInt(1, GetAgentExten());
  2233. cmd.SetDataUInt(2, GetAgentID());
  2234. cmd.SetDataString(4, GetMakeCallDestinationNumber());
  2235. // cmd.SetDataString(5, strCallerNumber);
  2236. cmd.SetDataString(7, GetNumberHeader());
  2237. cmd.SetDataString(8, GetVisitStr());
  2238. CNetworkClient::GetInstance().send2ACD(&cmd);
  2239. }
  2240. if (0 == strcmp(TypeStr, "AnswerCall")) //应答
  2241. {
  2242. CPduEntity cmd(PDU_CMD_AGENT_ANSWER);
  2243. cmd.SetDataUInt(1, GetAgentExten());
  2244. cmd.SetDataUInt(2, GetAgentID());
  2245. CNetworkClient::GetInstance().send2ACD(&cmd);
  2246. }
  2247. if (0 == strcmp(TypeStr, "DropCall")) //挂断
  2248. {
  2249. CPduEntity cmd(PDU_CMD_AGENT_HANGUP);
  2250. cmd.SetDataUInt(1, GetAgentExten());
  2251. cmd.SetDataUInt(2, GetAgentID());
  2252. CNetworkClient::GetInstance().send2ACD(&cmd);
  2253. }
  2254. if (0 == strcmp(TypeStr, "Hold")) //保持
  2255. {
  2256. CPduEntity cmd(PDU_CMD_AGENT_HOLD);
  2257. cmd.SetDataUInt(1, GetAgentExten());
  2258. cmd.SetDataUInt(2, GetAgentID());
  2259. CNetworkClient::GetInstance().send2ACD(&cmd);
  2260. }
  2261. if (0 == strcmp(TypeStr, "Retrieve")) //接回保持
  2262. {
  2263. CPduEntity cmd(PDU_CMD_AGENT_TAKEBACK);
  2264. cmd.SetDataUInt(1, GetAgentExten());
  2265. cmd.SetDataUInt(2, GetAgentID());
  2266. CNetworkClient::GetInstance().send2ACD(&cmd);
  2267. }
  2268. if (0 == strcmp(TypeStr, "Mute")) // 静音操作(0开始静音,1结束静音)
  2269. {
  2270. CPduEntity cmd(PDU_CMD_AGENT_MUTE);
  2271. cmd.SetDataUInt(1, GetAgentExten());
  2272. cmd.SetDataUInt(2, GetAgentID());
  2273. cmd.SetDataUInt(3, GetOpType());
  2274. CNetworkClient::GetInstance().send2ACD(&cmd);
  2275. }
  2276. if (0 == strcmp(TypeStr, "Transfer")) //转移
  2277. {
  2278. CPduEntity cmd(PDU_CMD_AGENT_TRANSTALK);
  2279. cmd.SetDataUInt(1, GetAgentExten());
  2280. cmd.SetDataUInt(2, GetAgentID());
  2281. cmd.SetDataString(3, GetTransferOrMeetingDestinationNumber());
  2282. cmd.SetDataString(4, "");
  2283. cmd.SetDataString(5, GetTransferType()); //添加转移类型,0指定号码转移,1转移技能组
  2284. CNetworkClient::GetInstance().send2ACD(&cmd);
  2285. }
  2286. if (0 == strcmp(TypeStr, "Meeting")) //多方通话
  2287. {
  2288. CPduEntity cmd(PDU_CMD_AGENT_THREETALK);
  2289. cmd.SetDataUInt(1, GetAgentExten());
  2290. cmd.SetDataUInt(2, GetAgentID());
  2291. cmd.SetDataString(3, GetTransferOrMeetingDestinationNumber());
  2292. cmd.SetDataString(4, "");
  2293. CNetworkClient::GetInstance().send2ACD(&cmd);
  2294. }
  2295. if (0 == strcmp(TypeStr, "MeetingTakeBack")) //多方通话接回主叫
  2296. {
  2297. CPduEntity cmd(PDU_CMD_AGENT_THREETALK_TAKEBACK);
  2298. cmd.SetDataUInt(1, GetAgentExten());
  2299. cmd.SetDataUInt(2, GetAgentID());
  2300. CNetworkClient::GetInstance().send2ACD(&cmd);
  2301. }
  2302. if (0 == strcmp(TypeStr, "Listen")) // 监听
  2303. {
  2304. CPduEntity cmd(PDU_CMD_AGENT_MONI_LISTEN);
  2305. cmd.SetDataUInt(1, GetAgentExten());
  2306. cmd.SetDataUInt(2, GetAgentID());
  2307. cmd.SetDataUInt(4, GetTargetAgentID());
  2308. int bb = CNetworkClient::GetInstance().send2ACD(&cmd);
  2309. }
  2310. if (0 == strcmp(TypeStr, "Insert")) // 强插
  2311. {
  2312. CPduEntity cmd(PDU_CMD_AGENT_MONI_INSERT);
  2313. cmd.SetDataUInt(1, GetAgentExten());
  2314. cmd.SetDataUInt(2, GetAgentID());
  2315. cmd.SetDataUInt(4, GetTargetAgentID());
  2316. CNetworkClient::GetInstance().send2ACD(&cmd);
  2317. }
  2318. if (0 == strcmp(TypeStr, "Intercept")) // 强截
  2319. {
  2320. CPduEntity cmd(PDU_CMD_AGENT_MONI_INTERCEPT);
  2321. cmd.SetDataUInt(1, GetAgentExten());
  2322. cmd.SetDataUInt(2, GetAgentID());
  2323. cmd.SetDataUInt(4, GetTargetAgentID());
  2324. CNetworkClient::GetInstance().send2ACD(&cmd);
  2325. }
  2326. if (0 == strcmp(TypeStr, "Break")) // 强拆
  2327. {
  2328. CPduEntity cmd(PDU_CMD_AGENT_MONI_CUT);
  2329. cmd.SetDataUInt(1, GetAgentExten());
  2330. cmd.SetDataUInt(2, GetAgentID());
  2331. cmd.SetDataUInt(4, GetTargetAgentID());
  2332. CNetworkClient::GetInstance().send2ACD(&cmd);
  2333. }
  2334. if (0 == strcmp(TypeStr, "ForceAgentLogOut")) // 强制坐席退出
  2335. {
  2336. CPduEntity cmd(PDU_CMD_AGENT_MONI_FORCE_LOGOUT);
  2337. cmd.SetDataUInt(1, GetAgentExten());
  2338. cmd.SetDataUInt(2, GetAgentID());
  2339. cmd.SetDataUInt(4, GetTargetAgentID());
  2340. CNetworkClient::GetInstance().send2ACD(&cmd);
  2341. }
  2342. if (0 == strcmp(TypeStr, "ForceAgentState")) // 强制更改座席状态
  2343. {
  2344. CPduEntity cmd(PDU_CMD_AGENT_MONI_FORCE_STATE);
  2345. cmd.SetDataUInt(1, GetAgentExten());
  2346. cmd.SetDataUInt(2, GetAgentID());
  2347. cmd.SetDataUInt(4, GetTargetAgentID()); //目标座席工号
  2348. //cmd.SetDataUInt(5, 2); //状态码 2:置闲 5:置忙
  2349. cmd.SetDataUInt(5, GetTargetAgentState());
  2350. CNetworkClient::GetInstance().send2ACD(&cmd);
  2351. }
  2352. if (0 == strcmp(TypeStr, "Instead")) // 代接
  2353. {
  2354. CPduEntity cmd(PDU_CMD_AGENT_MONI_REPLACE);
  2355. cmd.SetDataUInt(1, GetAgentExten());
  2356. cmd.SetDataUInt(2, GetAgentID());
  2357. cmd.SetDataUInt(4, GetTargetAgentID());
  2358. CNetworkClient::GetInstance().send2ACD(&cmd);
  2359. }
  2360. /* 改到判断是否签入之前,不签入也可订阅
  2361. if (0 == strcmp(TypeStr, "SubScribe")) // 订阅座席状态
  2362. {
  2363. CPduEntity cmd(PDU_CMD_AGENT_SUBSCRIBE);
  2364. cmd.SetDataUInt(1, GetAgentExten());
  2365. cmd.SetDataUInt(2, GetAgentID());
  2366. cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体
  2367. cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号
  2368. bool result = CNetworkClient::GetInstance().send2ACD(&cmd);
  2369. string strSend = CreateJson4("SubScribe", result);
  2370. SendMessageToClient(strSend, Curr_ConID);
  2371. m_SubScribed_ConID[Curr_ConID] = Curr_ConID;
  2372. }
  2373. if (0 == strcmp(TypeStr, "SubScribeCancel")) //取消订阅
  2374. {
  2375. CPduEntity cmd(PDU_CMD_AGENT_CANCEL_SUBSCRIBE);
  2376. cmd.SetDataUInt(1, GetAgentExten());
  2377. cmd.SetDataUInt(2, GetAgentID());
  2378. cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体
  2379. cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号
  2380. bool result = CNetworkClient::GetInstance().send2ACD(&cmd);
  2381. string strSend = CreateJson4("SubScribeCancel", result);
  2382. SendMessageToClient(strSend, Curr_ConID);
  2383. auto it = m_SubScribed_ConID.find(Curr_ConID);
  2384. if (it != m_SubScribed_ConID.end())
  2385. m_SubScribed_ConID.erase(Curr_ConID);
  2386. }
  2387. */
  2388. if (0 == strcmp(TypeStr, "GetAgentList"))
  2389. {
  2390. CPduEntity cmd(PDU_CMD_AGENT_GET_AGENTLIST);
  2391. cmd.SetDataUInt(0, GetAgentExten());
  2392. cmd.SetDataUInt(1, GetAgentID());
  2393. CNetworkClient::GetInstance().send2ACD(&cmd);
  2394. }
  2395. if (0 == strcmp(TypeStr, "Consult"))
  2396. {
  2397. CPduEntity cmd(PDU_CMD_AGENT_CONSULTATION_CALL);
  2398. cmd.SetDataUInt(1, GetAgentExten());
  2399. cmd.SetDataUInt(2, GetAgentID());
  2400. cmd.SetDataString(4, GetConsultCallee());
  2401. cmd.SetDataString(5, GetConsultCaller());
  2402. CNetworkClient::GetInstance().send2ACD(&cmd);
  2403. }
  2404. if (0 == strcmp(TypeStr, "ConfirmTransfer"))
  2405. {
  2406. CPduEntity cmd(PDU_CMD_AGENT_CONFIRM_TRANSFER);
  2407. cmd.SetDataUInt(1, GetAgentExten());
  2408. cmd.SetDataUInt(2, GetAgentID());
  2409. cmd.SetDataUInt(3, GetEndParmer());
  2410. CNetworkClient::GetInstance().send2ACD(&cmd);
  2411. }
  2412. if (0 == strcmp(TypeStr, "TurnIvr"))
  2413. {
  2414. CPduEntity cmd(PDU_CMD_AGENT_TURN_TO_IVR);
  2415. cmd.SetDataUInt(1, GetAgentExten());
  2416. cmd.SetDataUInt(5, GetIvrPos());
  2417. cmd.SetDataString(6, GetIvrName());
  2418. cmd.SetDataBool(8, true); // true 回访,不kill通道,false->true
  2419. CNetworkClient::GetInstance().send2ACD(&cmd);
  2420. }
  2421. if (0 == strcmp(TypeStr, "SendDtmf")) //发送按键信息
  2422. {
  2423. CPduEntity cmd(PDU_CMD_AGENT_SEND_DTMF);
  2424. cmd.SetDataUInt(1, GetAgentExten());
  2425. cmd.SetDataUInt(2, GetAgentID());
  2426. cmd.SetDataString(3, GetSendDtmf());
  2427. CNetworkClient::GetInstance().send2ACD(&cmd);
  2428. }
  2429. // 驻马店专用
  2430. if (0 == strcmp(TypeStr, "GetExtenList")) {
  2431. CPduEntity cmd(PDU_CMD_EXTEN_STATE_LIST_ZMD);
  2432. cmd.SetDataUInt(0, GetAgentExten());
  2433. cmd.SetDataUInt(1, GetAgentID());
  2434. CNetworkClient::GetInstance().send2ACD(&cmd);
  2435. }
  2436. // 转发消息,替坐席转发消息给其它已签入坐席/分机
  2437. if (0 == strcmp(TypeStr, "TurnMsg")) {
  2438. CString tagNum = GetTurnTagNum();
  2439. CString tagData = GetTurnTagData();
  2440. bool ret= SendMessageToClientByExtenId(tagData.GetBuffer(0), atoi(tagNum));
  2441. std::string strSend = CreateJson2(TypeStr, ret);
  2442. SendMessageToClient(strSend, conID);
  2443. }
  2444. }
  2445. void CServerDlg::__closeFun(const long conID)
  2446. {
  2447. int DisconIDRec = conID;
  2448. {
  2449. auto it = m_SubScribed_ConID.find(DisconIDRec);
  2450. if (it != m_SubScribed_ConID.end())
  2451. m_SubScribed_ConID.erase(it);
  2452. }
  2453. int KeyAgentID = 0;
  2454. int AgentExtern = 0;
  2455. {
  2456. std::unique_lock<std::mutex>lock(m_agentMapLock);
  2457. auto it = m_agentMap.get<hdl_id>().find(DisconIDRec);
  2458. if (it != m_agentMap.get<hdl_id>().end()) {
  2459. KeyAgentID = it->AgentID;
  2460. AgentExtern = it->ExtenID;
  2461. m_agentMap.get<hdl_id>().erase(it);
  2462. }
  2463. }
  2464. ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "连接断开ConID = %d Agent = %d Exten = %d ", DisconIDRec, KeyAgentID, AgentExtern);
  2465. // 该断开连接标识有绑定坐席发送签出命令
  2466. if (KeyAgentID > 0)
  2467. {
  2468. CPduEntity cmd(PDU_CMD_AGENT_LOGOUT);
  2469. cmd.SetDataUInt(1, AgentExtern);
  2470. cmd.SetDataUInt(2, KeyAgentID);
  2471. cmd.SetDataUInt(3, 3); // 3签出原因是连接断开,正常是默认0(非3)
  2472. CNetworkClient::GetInstance().send2ACD(&cmd);
  2473. // 视频请求分机 连接断开自动释放分机
  2474. if (m_IsVideo)
  2475. {
  2476. CPduEntity cmd(PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN);
  2477. cmd.SetDataUInt(1, KeyAgentID);
  2478. cmd.SetDataUInt(2, AgentExtern);
  2479. CNetworkClient::GetInstance().send2ACD(&cmd);
  2480. }
  2481. }
  2482. {
  2483. std::unique_lock<std::mutex>lock(m_MapLoginAgentConIDLock);
  2484. auto it = m_MapLoginAgentConID.find(DisconIDRec);
  2485. if (it != m_MapLoginAgentConID.end())
  2486. m_MapLoginAgentConID.erase(it);
  2487. }
  2488. {
  2489. // 连接断开删除坐席详情连接标识
  2490. std::unique_lock<std::mutex> lock(m_agentDetailConIDLock);
  2491. auto it = m_agentDetailConIDs.find(DisconIDRec);
  2492. if (it != m_agentDetailConIDs.end())
  2493. {
  2494. m_agentDetailConIDs.erase(it);
  2495. }
  2496. }
  2497. }
  2498. void CServerDlg::__recovLogin()
  2499. {
  2500. std::vector<std::string> groupVecs;
  2501. getOnlineAgentGroupDetail(groupVecs); // 获取断开之前的坐席,
  2502. if (groupVecs.empty())return;
  2503. // 当有需要恢复签入的坐席时,判断acd,cti是否正常,等正常的时候再发送签入
  2504. if (!CNetworkClient::GetInstance().isAcdConnected() || !CNetworkClient::GetInstance().isCtiConnected()) {
  2505. return;
  2506. }
  2507. std::vector<std::string> agentVecs;
  2508. std::vector<std::string> agentDetailVec;
  2509. for (auto groupVec : groupVecs) {
  2510. boost::split(agentVecs, groupVec, boost::is_any_of("#"));
  2511. for (auto agentVec : agentVecs) {
  2512. boost::split(agentDetailVec, agentVec, boost::is_any_of("|"));
  2513. if (agentDetailVec.size() > 3) {
  2514. int t_agent_id = atoi(agentDetailVec[0].c_str()); // 坐席号
  2515. int exten_no = atoi(agentDetailVec[1].c_str()); // 分机号
  2516. const char* group = agentDetailVec[2].c_str(); // 组号
  2517. int agent_type = atoi(agentDetailVec[3].c_str()); // 坐席类型
  2518. CPduEntity cmd(PDU_CMD_AGENT_LOGIN);
  2519. cmd.SetDataUInt(1, exten_no);
  2520. cmd.SetDataUInt(2, t_agent_id);
  2521. cmd.SetDataString(3, group);
  2522. cmd.SetDataUInt(4, agent_type);
  2523. cmd.SetDataUInt(8, 1); // 1恢复签入
  2524. CNetworkClient::GetInstance().send2ACD(&cmd);
  2525. }
  2526. }
  2527. }
  2528. }
  2529. char* CServerDlg::TranslateErrorCode(int ErrorCode)
  2530. {
  2531. char* StrError = "0";
  2532. switch (ErrorCode)
  2533. {
  2534. case ERR_NO_CTI: // CTI未启动
  2535. StrError = "CTI未启动";
  2536. break;
  2537. case ERR_NO_ACD: // ACD未启动
  2538. StrError = "ACD未启动";
  2539. break;
  2540. case ERR_NO_IP: // IP地址错误
  2541. StrError = "IP地址错误";
  2542. break;
  2543. case ERR_NO_EXT: // 分机号不存在
  2544. StrError = "分机号不存在";
  2545. break;
  2546. case ERR_BIND_EXT: // 分机号已绑定
  2547. StrError = "分机号已绑定";
  2548. break;
  2549. case ERR_BIND_AGENT: // 坐席号已绑定
  2550. StrError = "座席号已绑定";
  2551. break;
  2552. case ERR_SAY_BUSY: // ACD不能置该座席为忙
  2553. StrError = "ACD不能置该座席为忙";
  2554. break;
  2555. case ERR_SAY_FREE: // ACD不能置该座席为闲
  2556. StrError = "ACD不能置该座席为闲";
  2557. break;
  2558. case ERR_RESET_AGENT: // CTI重置该座席失败
  2559. StrError = "CTI重置该座席失败";
  2560. break;
  2561. case ERR_MAKE_CALL: // CTI执行外呼失败
  2562. StrError = "CTI执行外呼失败";
  2563. break;
  2564. case ERR_ANSWER_CALL: // CTI执行应答失败
  2565. StrError = "CTI执行应答失败";
  2566. break;
  2567. case ERR_DROP_CALL: // CTI执行挂机失败
  2568. StrError = "CTI 执行挂机失败";
  2569. break;
  2570. case ERR_HOLD: // CTI执行保持失败
  2571. StrError = "CTI执行保持失败";
  2572. break;
  2573. case ERR_UN_HOLD: // CTI执行接回失败
  2574. StrError = "CTI执行接回失败";
  2575. break;
  2576. case ERR_TRANSFER: // CTI执行转移失败
  2577. StrError = "CTI执行转移失败";
  2578. break;
  2579. case ERR_CANCEL_TRANSFER: // CTI执行取消转移失败
  2580. StrError = "CTI执行取消转移失败";
  2581. break;
  2582. case ERR_CANCEL_THREETALK: // CTI执行取消三方失败
  2583. StrError = "CTI执行取消第三方失败";
  2584. break;
  2585. case ERR_CANCEL: // CTI执行取消失败
  2586. StrError = "CTI执行取消失败";
  2587. break;
  2588. case ERR_CONSULTATION_CALL: // CTI执行协商呼叫失败
  2589. StrError = "CTI执行协商呼叫失败";
  2590. break;
  2591. case ERR_CONFIRM_TRANSFER: // CTI执行确认转移失败
  2592. StrError = "CTI 执行确认转移失败";
  2593. break;
  2594. case ERR_THREE_TALK: // CTI执行加三方通话失败
  2595. StrError = "CTI执行加三方通话失败";
  2596. break;
  2597. case ERR_LISTEN_AGENT: // CTI执行监听座席失败
  2598. StrError = "CTI执行监听座席失败";
  2599. break;
  2600. case ERR_INSERT_AGENT: // CTI执行强插座席失败
  2601. StrError = "CTI执行强插座席失败";
  2602. break;
  2603. case ERR_INSTEAD: // CTI执行代接座席失败
  2604. StrError = "CTI执行代接座席失败";
  2605. break;
  2606. case ERR_CUT_AGENT: // CTI执行强拆座席失败
  2607. StrError = "CTI 执行强拆座席失败";
  2608. break;
  2609. case ERR_INTERCEPT_AGENT: // CTI执行强截座席失败
  2610. StrError = "CTI执行强截座席失败";
  2611. break;
  2612. case ERR_FORCE_LOGOUT_AGENT: // 强制签出
  2613. StrError = "强制签出";
  2614. break;
  2615. case ERR_FORCE_CONTROL_AGENT: // CTI执行强制控制座席失败
  2616. StrError = "CTI执行强制控制座席失败";
  2617. break;
  2618. case ERR_TRANSFER_TO_IVR: // CTI执行转移到IVR失败
  2619. StrError = "CTI 执行转移到IVR失败";
  2620. break;
  2621. case ERR_MAKECALL_BY_SELF: // 自己呼自己
  2622. StrError = "呼叫自己";
  2623. break;
  2624. case ERR_TARGET_NUMBER_TOO_LONG:
  2625. StrError = "号码太长"; // 目标号码太长
  2626. break;
  2627. case ERR_IVR_FILE_PATH_TOO_LONG: // ivr文件路径太长
  2628. StrError = "IVR文件路径过长";
  2629. break;
  2630. case ERR_FAX_FILE_PATH_TOO_LONG: // fax文件路径太长
  2631. StrError = "Fax文件路径太长";
  2632. break;
  2633. case ERR_NO_AGENT_EVENT_MANAGER: // 座席事件管理类为NULL
  2634. StrError = "座席事件管理类为NULL";
  2635. break;
  2636. case ERR_NO_AGENT_LOG: // 座席日志类为NULL
  2637. StrError = "座席日志类为NULL";
  2638. break;
  2639. case ERR_PREVIEW_MAKECALL: // CTI平台暂不支持 预览外拨
  2640. StrError = "CTI平台暂不支持 预览外拨";
  2641. break;
  2642. case ERR_BEGIN_MUTE: // 开始静音失败
  2643. StrError = "开始静音失败";
  2644. break;
  2645. case ERR_END_MUTE: // 结束静音失败
  2646. StrError = "结束静音失败";
  2647. break;
  2648. case ERR_STOP_RECORD: // CTI停止录音失败
  2649. StrError = "CTI停止录音失败";
  2650. break;
  2651. case ERR_SEND_FAX: // CTI发送传真失败
  2652. StrError = "CTI发送传真失败";
  2653. break;
  2654. case ERR_RECV_FAX: // CTI接收传真失败
  2655. StrError = " CTI接收传真失败";
  2656. break;
  2657. case ERR_CREATE_TIMER: // 创建定时器失败
  2658. StrError = "创建定时器失败";
  2659. break;
  2660. case ERR_SUB_AGENT: // 订阅坐席失败
  2661. StrError = "订阅坐席失败";
  2662. break;
  2663. case ERR_CANCEL_SUB_AGENT: // 取消订阅坐席失败
  2664. StrError = "取消订阅座席失败";
  2665. break;
  2666. case ERR_DESTNUM_SPACIL: // 包含特殊字符
  2667. StrError = "包含特殊字符串";
  2668. break;
  2669. case ERR_LOGIN_AGIN: // 重复签入
  2670. StrError = "重复签入";
  2671. break;
  2672. case ERR_AUTH_FAILED: // 授权验证失败
  2673. StrError = "授权验证失败";
  2674. break;
  2675. default:
  2676. StrError = "未知错误";
  2677. break;
  2678. }
  2679. return StrError;
  2680. }
  2681. void CServerDlg::OnClose()
  2682. {
  2683. // TODO: 在此添加消息处理程序代码和/或调用默认值
  2684. CNetworkClient::GetInstance().release();
  2685. //ILogger::getInstance().close();
  2686. CDialogEx::OnClose();
  2687. }
  2688. void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam)
  2689. {
  2690. // TODO: 在此添加消息处理程序代码和/或调用默认值
  2691. if (nID == SC_CLOSE)
  2692. {
  2693. if (MessageBox(_T("确定要退出HttpServer系统吗?"), _T("提示"), MB_OKCANCEL) != IDOK)
  2694. return;
  2695. ILogger::getInstance().stop();
  2696. }
  2697. CDialogEx::OnSysCommand(nID, lParam);
  2698. }
  2699. void CServerDlg::OnSize(UINT nType, int cx, int cy)
  2700. {
  2701. CDialogEx::OnSize(nType, cx, cy);
  2702. // TODO: 在此处添加消息处理程序代码
  2703. auto pWnd = GetDlgItem(IDC_LIST1);
  2704. if (pWnd&&nType != 1) {
  2705. CRect rc;
  2706. GetClientRect(&rc);
  2707. pWnd->MoveWindow(rc);
  2708. CRect mRect;
  2709. m_CtrlList.GetClientRect(&mRect);
  2710. int length = mRect.right - mRect.left - 240;
  2711. m_CtrlList.SetColumnWidth(3,length);
  2712. }
  2713. }
  2714. void CServerDlg::OnMenuLogStop()
  2715. {
  2716. // TODO: 在此添加命令处理程序代码
  2717. ILogger::getInstance().stop();
  2718. }
  2719. void CServerDlg::OnUpdateMenuLogStop(CCmdUI *pCmdUI)
  2720. {
  2721. // TODO: 在此添加命令更新用户界面处理程序代码
  2722. if (ILogger::getInstance().isStart())
  2723. pCmdUI->SetCheck(0);
  2724. else
  2725. pCmdUI->SetCheck(1);
  2726. }
  2727. void CServerDlg::OnMenuLogStart()
  2728. {
  2729. // TODO: 在此添加命令处理程序代码
  2730. ILogger::getInstance().start();
  2731. }
  2732. void CServerDlg::OnUpdateMenuLogStart(CCmdUI *pCmdUI)
  2733. {
  2734. // TODO: 在此添加命令更新用户界面处理程序代码
  2735. if (ILogger::getInstance().isStart())
  2736. pCmdUI->SetCheck();
  2737. else
  2738. pCmdUI->SetCheck(0);
  2739. }
  2740. void CServerDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
  2741. {
  2742. CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
  2743. // TODO: 在此处添加消息处理程序代码
  2744. if (!bSysMenu && pPopupMenu)
  2745. {
  2746. CCmdUI cmdUI;
  2747. cmdUI.m_pOther = NULL;
  2748. cmdUI.m_pMenu = pPopupMenu;
  2749. cmdUI.m_pSubMenu = NULL;
  2750. UINT count = pPopupMenu->GetMenuItemCount();
  2751. cmdUI.m_nIndexMax = count;
  2752. for (UINT i = 0; i < count; i++)
  2753. {
  2754. UINT nID = pPopupMenu->GetMenuItemID(i);
  2755. if (-1 == nID || 0 == nID)
  2756. {
  2757. continue;
  2758. }
  2759. cmdUI.m_nID = nID;
  2760. cmdUI.m_nIndex = i;
  2761. cmdUI.DoUpdate(this, FALSE);
  2762. }
  2763. }
  2764. }