// ServerDlg.cpp : implementation file // #include "stdafx.h" #include "Server.h" #include "ServerDlg.h" #include "afxdialogex.h" #include "NetworkClient.h" HWND hwndd; // CServerDlg dialog CServerDlg::CServerDlg(CWnd* pParent /*=NULL*/) : CDialogEx(CServerDlg::IDD, pParent) { m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } CServerDlg::~CServerDlg() { // 日志关闭 ILogger::getInstance().close(); } void CServerDlg::DoDataExchange(CDataExchange* pDX) { CDialogEx::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST1, m_CtrlList); } BEGIN_MESSAGE_MAP(CServerDlg, CDialogEx) ON_WM_PAINT() ON_WM_VKEYTOITEM() ON_WM_QUERYDRAGICON() ON_WM_CLOSE() ON_WM_SYSCOMMAND() ON_WM_SIZE() ON_COMMAND(ID_MENU_LOG_STOP, &CServerDlg::OnMenuLogStop) ON_UPDATE_COMMAND_UI(ID_MENU_LOG_STOP, &CServerDlg::OnUpdateMenuLogStop) ON_COMMAND(ID_MENU_LOG_START, &CServerDlg::OnMenuLogStart) ON_UPDATE_COMMAND_UI(ID_MENU_LOG_START, &CServerDlg::OnUpdateMenuLogStart) ON_WM_INITMENUPOPUP() END_MESSAGE_MAP() BOOL CServerDlg::OnInitDialog() { CDialogEx::OnInitDialog(); // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here // 设置主窗口标记 ::SetProp(m_hWnd, AfxGetApp()->m_pszAppName, (HANDLE)1); hwndd = this->GetSafeHwnd(); m_IsVideo = false; ILogger::getInstance().init(&m_CtrlList, LOG_DEV_SERVER, "./Data/Log"); //ILogger::getInstance().filterShow(LOG_CLASS_GENERAL, LOG_LEVEL_ERROR); // 2021-02-04日志过滤 ILogger::getInstance().start(); // 2022-09-06 重启httpserver,清空回复签入坐席 clearOnlineAgentGroupDetail(); CNetworkClient::GetInstance().setAcdRecMsgFun(std::bind((void(CServerDlg::*)(CPduEntity*))&CServerDlg::OnAcdmsgRecmsg,this,std::placeholders::_1)); CNetworkClient::GetInstance().init(); StartServer(); return TRUE; // return TRUE unless you set the focus to a control } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CServerDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialogEx::OnPaint(); } } // The system calls this function to obtain the cursor to display while the user drags // the minimized window. HCURSOR CServerDlg::OnQueryDragIcon() { return static_cast(m_hIcon); } void CServerDlg::StartServer() { YamlConfig* cfg = YamlConfig::GetInstance(); CString strTitle; int port = cfg->GetHttpServerPort(); strTitle.Format("127.0.0.1 : %d", port); SetWindowText(strTitle); m_Server.setCallbackRecvMsg(std::bind(&CServerDlg::__recvMsgFun, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); m_Server.setCallbackClose(std::bind(&CServerDlg::__closeFun, this, std::placeholders::_1)); if (!m_Server.init(port, cfg->GetWssPort(),cfg->GetWssSSLFilePath(),cfg->GetWssPwd())) { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "HttpServer服务初始化失败"); } else { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "HttpServer服务开启"); m_Server.asyncRun(); } } WCHAR* ConvertUtf8ToGBK(char* szUtf8) { int len = MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, NULL, 0); WCHAR* wszUCD = new WCHAR[len + 1]; memset(wszUCD, 0, len); MultiByteToWideChar(CP_UTF8, 0, szUtf8, -1, wszUCD, len); return wszUCD; } void Wchar_tToString(std::string& szDst, wchar_t *wchar) { wchar_t * wText = wchar; DWORD dwNum = WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, NULL, 0, NULL, FALSE);// WideCharToMultiByte的运用 char *psText; // psText为char*的临时数组,作为赋值给std::string的中间变量 psText = new char[dwNum]; WideCharToMultiByte(CP_OEMCP, NULL, wText, -1, psText, dwNum, NULL, FALSE);// WideCharToMultiByte的再次运用 szDst = psText;// std::string赋值 delete[]psText;// psText的清除 } char* UnicodeToUtf8(WCHAR* wszUtf8) { int len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); char* szUtf8 = new char[len + 1]; memset(szUtf8, 0, len + 1); WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL); return szUtf8; } char* CStringTochar(CString strInput) { USES_CONVERSION; //调用函数,T2A和W2A均支持ATL和MFC中的字符转换 char * szStr = (LPSTR)(LPCTSTR)strInput; char* pszMultiByte = szStr; //strlen(pwsUnicode)=5 int iSize; wchar_t* pwszUnicode = NULL; //返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0' iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6 pwszUnicode = (wchar_t *)malloc(iSize * sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t)) MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pwszUnicode, iSize); char* by = NULL; by = UnicodeToUtf8(pwszUnicode); if (pwszUnicode != NULL) { free(pwszUnicode); pwszUnicode = NULL; } return by; } void UnicodeToUtf8(WCHAR* wszUtf8, std::string& strUtf8) { int len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL); char* szUtf8 = new char[len + 1]; memset(szUtf8, 0, len + 1); WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL, NULL); strUtf8 = szUtf8; delete[]szUtf8; szUtf8 = NULL; } void AnsiToUtf8(std::string& strInput) { USES_CONVERSION; //调用函数,T2A和W2A均支持ATL和MFC中的字符转换 const char* pszMultiByte = strInput.c_str();; //strlen(pwsUnicode)=5 int iSize; wchar_t* pwszUnicode; //返回接受字符串所需缓冲区的大小,已经包含字符结尾符'\0' iSize = MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, NULL, 0); //iSize =wcslen(pwsUnicode)+1=6 pwszUnicode = (wchar_t *)malloc(iSize * sizeof(wchar_t)); //不需要 pwszUnicode = (wchar_t *)malloc((iSize+1)*sizeof(wchar_t)) MultiByteToWideChar(CP_ACP, 0, pszMultiByte, -1, pwszUnicode, iSize); UnicodeToUtf8(pwszUnicode, strInput); if (pwszUnicode != NULL) { free(pwszUnicode); pwszUnicode = NULL; } } std::string CServerDlg::JsonParser(const string &strInput) { Json::Reader reader; Json::Value root; string ResultStr; if (reader.parse(strInput, root)) // reader将Json字符串解析到root,root将包含Json里所有子元素 { std::string TypeStr = root["Type"].asString(); // 访问节点,upload_id = "UP000000" //县级12345中间件 by 8/20 if (0 == strcmp(TypeStr.c_str(), "Dropcall")) { std::string AgentID = root["AgentID"].asString(); std::string AgentState = root["AgentState"].asString(); std::string State = root["State"].asString(); std::string Type = "Dropcall"; std::string Result = root["Result"].asString(); ResultStr = "Dropcall@" + AgentID + "@" + AgentState + "@" + Result + "@" + State + "@" + Type; } if (0 == strcmp(TypeStr.c_str(), "GetAgentDetail")) { ResultStr = "GetAgentDetail"; } if (0 == strcmp(TypeStr.c_str(), "VideoReqExten")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "VideoReqExten@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "VideoReqIdeAgent")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "VideoReqIdeAgent@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "VideoReqBindAgent")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "VideoReqBindAgent@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "VideoDesExten")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "VideoDesExten@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Login")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string AgentGroupStr = root["AgentGroup"].asString(); std::string AgentTypeStr = root["AgentType"].asString(); ResultStr = "Login@" + AgentIDStr + "@" + AgentExtenStr + "@" + AgentTypeStr + "@" + AgentGroupStr; } if (0 == strcmp(TypeStr.c_str(), "Monitor")) // ych 2018.6.4 商丘添加监控命令 { ResultStr = "Monitor"; } if (0 == strcmp(TypeStr.c_str(), "SubScribeMonitor")) // ych 2018.6.7 商丘添加监控命令 { ResultStr = "SubScribeMonitor"; } if (0 == strcmp(TypeStr.c_str(), "SubScribeMonitorCancel")) // ych 2018.6.7 商丘添加监控命令 { ResultStr = "SubScribeMonitorCancel"; } if (0 == strcmp(TypeStr.c_str(), "Logout")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "Logout@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "SayBusy")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "SayBusy@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "SayFree")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "SayFree@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Reset")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "Reset@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "MakeCall")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string DestinationHeader = root["Header"].asString(); std::string DestinationNumStr = root["DestinationNumber"].asString(); std::string optVisit = root["TaskType"].asString(); std::string optVisitTelID = root["TaskPhoneID"].asString(); std::string optVisitCode = root["TaskID"].asString(); ResultStr = "MakeCall@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationHeader + "@" + DestinationNumStr + "@" + optVisit + "@" + optVisitTelID + "@" + optVisitCode; } if (0 == strcmp(TypeStr.c_str(), "AnswerCall")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "AnswerCall@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "DropCall")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string IvrNameStr = root["IvrName"].asString(); std::string IvrPosStr = root["IvrPos"].asString(); ResultStr = "DropCall@" + AgentIDStr + "@" + AgentExtenStr + "@" + IvrNameStr + "@" + IvrPosStr; } if (0 == strcmp(TypeStr.c_str(), "Hold")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "Hold@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Retrieve")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "Retrieve@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Mute")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string OpType = root["OpType"].asString(); ResultStr = "Mute@" + AgentIDStr + "@" + AgentExtenStr+"@"+ OpType; } if (0 == strcmp(TypeStr.c_str(), "Transfer")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string DestinationNumStr = root["DestinationNumber"].asString(); std::string TransferType = root["TransferType"].asString(); ResultStr = "Transfer@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationNumStr + "@" + TransferType; } if (0 == strcmp(TypeStr.c_str(), "Meeting")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string DestinationNumStr = root["DestinationNumber"].asString(); ResultStr = "Meeting@" + AgentIDStr + "@" + AgentExtenStr + "@" + DestinationNumStr; } if (0 == strcmp(TypeStr.c_str(), "MeetingTakeBack")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "MeetingTakeBack@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Listen")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "Listen@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "Insert")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "Insert@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "Intercept")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "Intercept@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "Break")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "Break@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "ForceAgentLogOut")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "ForceAgentLogOut@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "ForceAgentState")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); std::string TargetAgentState = root["TargetAgentState"].asString(); ResultStr = "ForceAgentState@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID + "@" + TargetAgentState; } if (0 == strcmp(TypeStr.c_str(), "Instead")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TargetAgentID = root["TargetAgentID"].asString(); ResultStr = "Instead@" + AgentIDStr + "@" + AgentExtenStr + "@" + TargetAgentID; } if (0 == strcmp(TypeStr.c_str(), "SubScribe")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string SubType = root["SubType"].asString(); std::string SubParmer = root["SubParmer"].asString(); ResultStr = "SubScribe@" + AgentIDStr + "@" + AgentExtenStr + "@" + SubParmer + "@" + SubType; } if (0 == strcmp(TypeStr.c_str(), "SubScribeCancel")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string SubType = root["SubType"].asString(); std::string SubParmer = root["SubParmer"].asString(); ResultStr = "SubScribeCancel@" + AgentIDStr + "@" + AgentExtenStr + "@" + SubParmer + "@" + SubType; } if (0 == strcmp(TypeStr.c_str(), "GetAgentList")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "GetAgentList@" + AgentIDStr + "@" + AgentExtenStr; } if (0 == strcmp(TypeStr.c_str(), "Consult")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string CalleeStr = root["Callee"].asString(); std::string CallerStr = root["Caller"].asString(); ResultStr = "Consult@" + AgentIDStr + "@" + AgentExtenStr + "@" + CalleeStr + "@" + CallerStr; } if (0 == strcmp(TypeStr.c_str(), "ConfirmTransfer")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string EndParmer = root["EndParmer"].asString(); ResultStr = "ConfirmTransfer@" + AgentIDStr + "@" + AgentExtenStr + "@" + EndParmer; } if (0 == strcmp(TypeStr.c_str(), "TurnIvr")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string IvrName = root["IvrName"].asString(); std::string IvrPos = root["IvrPos"].asString(); ResultStr = "TurnIvr@" + AgentIDStr + "@" + AgentExtenStr + "@" + IvrName + "@" + IvrPos; } if (0 == strcmp(TypeStr.c_str(), "SendDtmf")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string Dtmf = root["Dtmf"].asString(); ResultStr = "SendDtmf@" + AgentIDStr + "@" + AgentExtenStr + "@" + Dtmf; } if (0 == strcmp(TypeStr.c_str(), "Heart")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "Heart@" + AgentIDStr + "@" + AgentExtenStr; } // 获取分机状态列表,驻马店专用 if (0 == strcmp(TypeStr.c_str(), "GetExtenList")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); ResultStr = "GetExtenList@" + AgentIDStr + "@" + AgentExtenStr ; } if (0 == strcmp(TypeStr.c_str(), "TurnMsg")) { std::string AgentIDStr = root["AgentID"].asString(); std::string AgentExtenStr = root["AgentExten"].asString(); std::string TagNum = root["TagNum"].asString(); std::string TagData = root["TagData"].asString(); ResultStr = "TurnMsg@" + AgentIDStr + "@" + AgentExtenStr + "@" + TagNum + "@" + TagData; } return ResultStr; } else { ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "JSON字符串解析失败: %s", strInput.c_str()); } return ""; } void CServerDlg::StringSplit(string s, char splitchar, vector& vec) { if (vec.size() > 0)//保证vec是空的 vec.clear(); std::string str; str = splitchar; boost::split(vec, s, boost::is_any_of(str)); return; // 使用boost分割库, int length = s.length(); int start = 0; for (int i = 0; i < length; i++) { if (s[i] == splitchar && i == 0)//第一个就遇到分割符 { start += 1; } else if (s[i] == splitchar) { vec.push_back(s.substr(start, i - start)); start = i + 1; } else if (i == length - 1)//到达尾部 { vec.push_back(s.substr(start, i + 1 - start)); } } } char Request_Type[100] = ""; char* CServerDlg::GetType() { ZeroMemory(Request_Type, 100); string str = m_VecAgentAttributeStr.at(0); memcpy(Request_Type, str.c_str(), str.length()); return Request_Type; } int CServerDlg::GetAgentID() { if (m_VecAgentAttributeStr.size() < 2) { return 0; } string str = m_VecAgentAttributeStr.at(1); int id = atoi(str.c_str()); return id; } int CServerDlg::GetAgentExten() { if (m_VecAgentAttributeStr.size() < 3) { return 0; } string str = m_VecAgentAttributeStr.at(2); int exten = atoi(str.c_str()); return exten; } int CServerDlg::GetAgentType() { if (m_VecAgentAttributeStr.size() < 4) { return 0; } string str = m_VecAgentAttributeStr.at(3); int type = atoi(str.c_str()); return type; } char groupch[100] = ""; char* CServerDlg::GetAgentGroup() { if (m_VecAgentAttributeStr.size() < 5) { return "0"; } ZeroMemory(groupch, 100); string str = m_VecAgentAttributeStr.at(4); memcpy(groupch, str.c_str(), str.length()); return groupch; } CString CServerDlg::GetAgentNumber() { if (m_VecAgentAttributeStr.size() < 3) { return ""; } string str = m_VecAgentAttributeStr.at(2); CString sttr = str.c_str(); return sttr; } int CServerDlg::GetOpType() { if (m_VecAgentAttributeStr.size() < 4) { return 0; } string str = m_VecAgentAttributeStr.at(3); int opType = atoi(str.c_str()); return opType; } CString CServerDlg::GetNumberHeader() { if (m_VecAgentAttributeStr.size() < 4) return ""; string str = m_VecAgentAttributeStr.at(3); CString sttr = str.c_str(); return sttr; } CString CServerDlg::GetVisitStr() { if (m_VecAgentAttributeStr.size() < 8) return ""; string strVisit = m_VecAgentAttributeStr.at(5); string strVisitTel = m_VecAgentAttributeStr.at(6); string strVisitCode = m_VecAgentAttributeStr.at(7); string strVisitAll = strVisit + "|" + strVisitTel + "|" + strVisitCode; return strVisitAll.c_str(); //回访字符串 } CString CServerDlg::GetMakeCallDestinationNumber() { if (m_VecAgentAttributeStr.size() < 4) return ""; string str = m_VecAgentAttributeStr.at(4); CString sttr = str.c_str(); return sttr; } CString CServerDlg::GetTransferOrMeetingDestinationNumber() { if (m_VecAgentAttributeStr.size() < 3) return ""; string str = m_VecAgentAttributeStr.at(3); CString sttr = str.c_str(); return sttr; } CString CServerDlg::GetTransferType() { if (m_VecAgentAttributeStr.size() < 4) return ""; string str = m_VecAgentAttributeStr.at(4); CString sttr = str.c_str(); return sttr; } int CServerDlg::GetBusyCode() { if (m_VecAgentAttributeStr.size() < 3) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetBusyCode"); return 0; } string str = m_VecAgentAttributeStr.at(2); int code = atoi(str.c_str()); return code; } int CServerDlg::GetRecivedState() { if (m_VecAgentAttributeStr.size() < 3) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetRecivedState"); return 0; } string str = m_VecAgentAttributeStr.at(2); int state = atoi(str.c_str()); return state; } int CServerDlg::GetTargetAgentID() { if (m_VecAgentAttributeStr.size() < 4) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetTargetAgentID"); return 0; } string str = m_VecAgentAttributeStr.at(3); int id = atoi(str.c_str()); return id; } int CServerDlg::GetTargetAgentState() { if (m_VecAgentAttributeStr.size() < 5) // 2021-03-05 <4 改为 <5 return 2; string str = m_VecAgentAttributeStr.at(4); int id = atoi(str.c_str()); return id; } int CServerDlg::GetSubType() { if (m_VecAgentAttributeStr.size() < 4) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetSubType"); return 0; } string str = m_VecAgentAttributeStr.at(3); int id = atoi(str.c_str()); return id; } int CServerDlg::GetSubParmer() { if (m_VecAgentAttributeStr.size() < 5) { ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "属性获取失败[%s] ", "GetSubParmer"); return 0; } string str = m_VecAgentAttributeStr.at(4); int id = atoi(str.c_str()); return id; } CString CServerDlg::GetIvrName() { if (m_VecAgentAttributeStr.size() <= 3) return ""; string str = m_VecAgentAttributeStr.at(3); CString sttr = str.c_str(); return sttr; } int CServerDlg::GetIvrPos() { if (m_VecAgentAttributeStr.size() <= 4) return -1; string str = m_VecAgentAttributeStr.at(4); int pos = atoi(str.c_str()); return pos; } CString CServerDlg::GetSendDtmf() { if (m_VecAgentAttributeStr.size() <= 3) return ""; string str = m_VecAgentAttributeStr.at(3); CString sttr = str.c_str(); return sttr; } CString CServerDlg::GetTurnTagNum() { if (m_VecAgentAttributeStr.size() <= 3) return ""; string str = m_VecAgentAttributeStr.at(3); CString sttr = str.c_str(); return sttr; } CString CServerDlg::GetTurnTagData() { if (m_VecAgentAttributeStr.size() <= 4) return ""; string str = m_VecAgentAttributeStr.at(4); CString sttr = str.c_str(); return sttr; } int GetAgentIDInVec(CString AgentInfoStr) { int index = AgentInfoStr.Find('|'); CString AgentIDInVecStr = AgentInfoStr.Mid(0, index); int AgentIDInVec = atoi(AgentIDInVecStr); return AgentIDInVec; } int GetAgentExternInVec(CString AgentInfoStr) { int index = AgentInfoStr.Find('|'); int Len = AgentInfoStr.GetLength(); CString StrLeft = AgentInfoStr.Mid(index + 1, Len); int index2 = StrLeft.Find('|'); CString strExtern = StrLeft.Mid(0, index2); int AgentExternInVec = atoi(strExtern); return AgentExternInVec; } CString CServerDlg::GetConsultCallee() { if (m_VecAgentAttributeStr.size() < 5) return ""; string str = m_VecAgentAttributeStr.at(3); return str.c_str(); } CString CServerDlg::GetConsultCaller() { if (m_VecAgentAttributeStr.size() < 5) return ""; string str = m_VecAgentAttributeStr.at(4); return str.c_str(); } int CServerDlg::GetEndParmer() { if (m_VecAgentAttributeStr.size() < 4) return -1; string str = m_VecAgentAttributeStr.at(3); int endParmer = atoi(str.c_str()); return endParmer; } string CServerDlg::CreateJson(int AgentID, string AgentState) { Json::Value root; Json::FastWriter writer; Json::Value person; person["AgentID"] = AgentID; person["AgentState"] = AgentState; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson2(string str, bool reslut) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Result"] = reslut; person["Type"] = str; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson2(string str, int waitCount) { Json::Value root; Json::FastWriter writer; Json::Value person; person["WaitCount"] = waitCount; person["Type"] = str; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson2(string str, bool b, int extenID) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = str; person["Result"] = b; person["AgentExten"] = extenID; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson2(string str, bool b, int extenID, std::string pwd) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = str; person["Result"] = b; person["AgentExten"] = extenID; person["ExtenPwd"] = pwd; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson3(string strtype, string str) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strtype; person["Result"] = str; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson15(string strtype, int ErrorCode) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strtype; person["Result"] = ErrorCode == 0 ? true : false; person["ErrorCode"] = ErrorCode; root.append(person); string json_file = writer.write(root); return json_file; } //by 8/20 县级12345中间件 string CServerDlg::CreateJson16(string strType, bool b, int AgentID, int AgentState, int LineState, string Type) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["AgentID"] = AgentID; person["AgentState"] = AgentState; person["Result"] = b; person["State"] = LineState; person["TypeStr"] = Type; root.append(person); string json_file = writer.write(root); return json_file; } std::string CServerDlg::CreateJson17(string strType, bool b, string PduString) { vector VecStringList; StringSplit(PduString, '|', VecStringList); Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; for (std::size_t i = 0; i < VecStringList.size(); i++) { if (i == 0) person["AgentSpeakCount"] = atoi(VecStringList.at(0).c_str()); else if (i == 1) person["AgentOnlineCount"] = atoi(VecStringList.at(1).c_str()); else if (i == 2) person["AgentReposeCount"] = atoi(VecStringList.at(2).c_str()); else if (i == 3) person["WaiteCallCount"] = atoi(VecStringList.at(3).c_str()); else if (i == 4) person["AgentFreeCount"] = atoi(VecStringList.at(4).c_str()); else if (i == 5) person["AgentProcessingCount"] = atoi(VecStringList.at(5).c_str()); else if (i == 6) person["AgentRingCount"] = atoi(VecStringList.at(6).c_str()); else if (i == 7) person["AgentCallOutCount"] = atoi(VecStringList.at(7).c_str()); else if (i == 8) person["TrunkCallInCount"] = atoi(VecStringList.at(8).c_str()); } root.append(person); string json_file = writer.write(root); return json_file; } std::string CServerDlg::CreateJson18(std::string strType, bool b, std::string SkillGroupDetail) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; std::string str = SkillGroupDetail; std::vector vec; boost::split(vec, str, boost::is_any_of("#")); for (std::size_t i = 0; i < vec.size(); ++i) { if (vec[i].empty())continue; std::vector kv; boost::split(kv, vec[i], boost::is_any_of("|")); if (kv.size() < 2)continue; Json::Value groupCount; groupCount["Group"] = kv[0]; groupCount["WaitCount"] = kv[1]; person["data"].append(groupCount); } root.append(person); string json_file = writer.write(root); return json_file; } std::string CServerDlg::DropCallJson(bool b, std::string CallerNum) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = "DropCall"; person["Result"] = b; person["CallerNum"] = CallerNum; root.append(person); string json_file = writer.write(root); return json_file; } std::string CServerDlg::CreateJsonZmdExtStateList(std::string strType, bool b, std::string extStateList) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["ExtenList"] = extStateList; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson4(string strType, bool b) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson5(string strType, bool b, int a) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["State"] = a; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson6(string strType, bool b, string str, string calleeStr, long callID, int ActionId) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["Number"] = str; person["CalleeNumber"] = calleeStr; person["CallID"] = callID; person["ActionID"] = ActionId; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson6(string strType, bool b, string str, string calleeStr, long callID, int ActionId, string trunkId) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["Number"] = str; person["CalleeNumber"] = calleeStr; person["CallID"] = callID; person["ActionID"] = ActionId; person["TrunkNumber"] = trunkId; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson7(string strType, bool b, int AgentID, int AgentState, int state) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["AgentState"] = AgentState; person["State"] = state; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson7(string strType, bool b, int AgentID, int AgentState, int state, int PeerLineType, string strDirection) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["AgentState"] = AgentState; person["State"] = state; person["CallDirection"] = strDirection; person["PeerLineType"] = PeerLineType; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson8(string strType, bool b, int AgentID, string state) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["State"] = state; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson8(string strType, bool b, int AgentID, int ExtenID, string state, string ExtenState, string Caller, string Callee, string ManageAgentId, string Group) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["State"] = state; person["ExtenID"] = ExtenID; person["ExtenState"] = ExtenState; person["Caller"] = Caller; person["Callee"] = Callee; person["ManageAgentId"] = ManageAgentId; person["Group"] = Group; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["CurrID"] = CallID; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["CurrID"] = CallID; person["CallDirection"] = strDirection; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection, int ActionID) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["CurrID"] = CallID; person["ActionID"] = ActionID; person["CallDirection"] = strDirection; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson10(string strType, bool b, string RecPath, long CallId) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["RecPath"] = RecPath; person["CallID"] = CallId; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson11(string strType, bool b, string strAgentList) { Json::Value root; Json::FastWriter writer; Json::Value Header; Json::Value Parent; Json::Value Body; Header["Type"] = strType; Header["Result"] = true; vector VecStringList; vector VecStringItem; StringSplit(strAgentList, '|', VecStringList); for (auto i = VecStringList.begin(); i < VecStringList.end(); i++) { StringSplit(*i, ',', VecStringItem); if (VecStringItem.size() >= 4) { string AgentID = VecStringItem.at(0); string AgentExten = VecStringItem.at(1); string AgentState = VecStringItem.at(2); string AgentGroup = VecStringItem.at(3); Body["AgentID"] = AgentID; Body["AgentExten"] = AgentExten; Body["State"] = AgentState; Body["Group"] = AgentGroup; Parent.append(Body); } } Header["AgentList"] = Parent; root.append(Header); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson12(string strType, bool b, string PduString) { vector VecStringList; StringSplit(PduString, '|', VecStringList); Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentSpeakCount"] = atoi(VecStringList.at(0).c_str()); person["AgentOnlineCount"] = atoi(VecStringList.at(1).c_str()); person["AgentReposeCount"] = atoi(VecStringList.at(2).c_str()); person["WaiteCallCount"] = atoi(VecStringList.at(3).c_str()); root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson13(string strType, bool b, const CLineStateUpdateInfo& LineStateUpdateInfo) { Json::Value root; Json::FastWriter writer; Json::Value person; std::string strTemp = ""; CString cstrTemp = ""; person["Type"] = strType; person["Result"] = b; person["ExternID"] = LineStateUpdateInfo.ExternID; person["Externstate"] = LineStateUpdateInfo.Externstate; person["CallIDDD"] = LineStateUpdateInfo.CallIDDD; person["AgentIDDDD"] = LineStateUpdateInfo.AgentIDDDD; person["caller"] = LineStateUpdateInfo.caller; person["callee"] = LineStateUpdateInfo.callee; person["AssoData"] = LineStateUpdateInfo.AssoData; person["Line"] = LineStateUpdateInfo.Line; person["InfoEx"] = LineStateUpdateInfo.InfoEx; person["FinalExt"] = LineStateUpdateInfo.FinalExt; person["OpType"] = LineStateUpdateInfo.OpType; root.append(person); string json_file = writer.write(root); return json_file; } string CServerDlg::CreateJson14(string strType, bool b, int AgentID, int ExternID, int AgentState, int ExtenState) { Json::Value root; Json::FastWriter writer; Json::Value person; person["Type"] = strType; person["Result"] = b; person["AgentID"] = AgentID; person["ExternID"] = ExternID; person["AgentState"] = AgentState; person["ExternState"] = ExtenState; root.append(person); string json_file = writer.write(root); return json_file; } bool CServerDlg::IsAvailableConID(int CondId) { std::unique_locklock(m_agentMapLock); if (m_agentMap.get().find(CondId) != m_agentMap.get().end()) return true; return false; } void CServerDlg::OnAcdmsgRecmsg(CPduEntity * Pduenity) { //CPduEntity* Pduenity = a_pPduEntity; PDU_CMD_TYPE Type = Pduenity->GetCmdType(); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "OnAcdmsgRecmsg.PDU_TYPE= %d ", Type); switch (Type) { case PDU_CMD_DEV_ONLINE_LIST: //if (CNetworkClient::GetInstance().isAcdConnected() && CNetworkClient::GetInstance().isCtiConnected()) { // __recovLogin(); // 恢复签入 //} 2023-11-1 屏蔽,不使用恢复签入 break; case PDU_CMD_LISTEN: break; case PDU_CMD_AGENT_DETAIL: { bool bSuccess = Pduenity->GetDataBool(0); int ConID = Pduenity->GetDataInt(1); string strJsonRet = CreateJson17("GetAgentDetail", bSuccess, Pduenity->GetDataString(2).operator LPCSTR()); if (ConID > 0) { std::unique_lock lock(m_agentDetailConIDLock); auto it = m_agentDetailConIDs.find(ConID); if (it == m_agentDetailConIDs.end()) break; auto conID = it->second; lock.unlock(); if (!SendMessageToClient(strJsonRet, conID)) m_agentDetailConIDs.erase(it); } else { std::unique_lock lock(m_agentDetailConIDLock); auto it = m_agentDetailConIDs.begin(); while (it!=m_agentDetailConIDs.end()) { if (!SendMessageToClient(strJsonRet, it->second)) it = m_agentDetailConIDs.erase(it); else ++it; } } break; } case PDU_CMD_MONITOR_START: // ych 2018.6.4 商丘监控添加命令 { bool bSuccess = Pduenity->GetDataBool(0); int ConID = Pduenity->GetDataInt(1); string strJsonRet = CreateJson12("Monitor", bSuccess, Pduenity->GetDataString(2).operator LPCSTR()); SendMessageToClient(strJsonRet, ConID); break; } case PDU_CMD_SUBSCRIBE_START: // ych 2018.6.4 商丘订阅添加命令 { bool bSuccess = Pduenity->GetDataBool(0); int ConID = Pduenity->GetDataInt(1); string strAgentList = Pduenity->GetDataString(2).operator LPCSTR(); vector VecStringList; vector VecStringItem; StringSplit(strAgentList, '|', VecStringList); for (auto i = VecStringList.begin(); i < VecStringList.end(); i++) { StringSplit(*i, ',', VecStringItem); if (VecStringItem.size() < 4) continue; string AgentID = VecStringItem.at(0); string AgentExten = VecStringItem.at(1); string AgentState = VecStringItem.at(2); string AssoExtState = VecStringItem.at(3); 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 SendMessageToClient(strSendAgent, ConID); } break; } case PDU_CMD_AGENT_LOGIN: //签入 { bool IsSuccess = Pduenity->GetDataBool(0); int ErrorCode = Pduenity->GetDataUInt(6); char* StrReturn = TranslateErrorCode(ErrorCode); int t_agent_id = Pduenity->GetDataUInt(2); ////2022-09-06 //int recov = Pduenity->GetDataUInt(8); //if (recov == 1) { // 如果是恢复签入,不进行回复 // return; //} long conID = 0; { std::unique_locklock(m_MapLoginAgentConIDLock); auto it = m_MapLoginAgentConID.find(t_agent_id); if (it != m_MapLoginAgentConID.end()) { conID = it->second; m_MapLoginAgentConID.erase(it); } else { break; } } if (IsSuccess) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(t_agent_id); if (it != m_agentMap.get().end()) { int hdlId = conID; int old_hdlId = it->HdlID; if (hdlId != old_hdlId) { //logout std::string strSend = CreateJson2("Logout", true); SendMessageToClient(strSend, old_hdlId); } m_agentMap.get().erase(it); } m_agentMap.insert(Agent(t_agent_id, Pduenity->GetDataUInt(1), conID)); std::string strSend = CreateJson2("Login", true); SendMessageToClient(strSend, conID); } else { std::string strSend = CreateJson3("Login", StrReturn); SendMessageToClient(strSend, conID); } ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "Server->Agent[%d],签入[%s] ", t_agent_id, IsSuccess ? "成功" : "失败"); break; } case PDU_CMD_AGENT_LOGOUT: //签出 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(t_agent_id); if (it != m_agentMap.get().end()) { long conID = it->HdlID; std::string strSend; if (IsSuccess) { strSend = CreateJson2("Logout", true); m_agentMap.get().erase(it); } else { strSend = CreateJson2("Logout", false); } SendMessageToClient(strSend, conID); } ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "Server->Agent[%d],签出[%s] ", t_agent_id, IsSuccess ? "成功" : "失败"); break; } case PDU_CMD_AGENT_SETSTATE: //设置座席状态 { bool IsSuccess = Pduenity->GetDataBool(0); int AgentState = Pduenity->GetDataUInt(3); int t_agent_id = Pduenity->GetDataUInt(2); std::string strSend = CreateJson5("SetState", IsSuccess, AgentState); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_RESET: //重置 { int t_agent_id = Pduenity->GetDataUInt(2); SendMessageToClientByAgentId("RESET", t_agent_id); //SendMessageToClient("RESET",G_ConID); break; } case PDU_CMD_AGENT_MAKECALL: // 外呼 PDU_CMD_CTI_DEV_CALL 设备外呼 { int currentAgentID = Pduenity->GetDataUInt(2); #ifndef ANTUMIDDLEWARE bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("MakeCall", IsSuccess); #else int ErrorCode = Pduenity->GetDataInt(0); std::string strSend = CreateJson15("MakeCall", ErrorCode); #endif SendMessageToClientByAgentId(strSend, currentAgentID); //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, "{OnMymsgRecmsg},外呼返回错误码=%d", ErrorCode); break; } case PDU_CMD_AGENT_ANSWER: //应答 { bool IsSuccess = Pduenity->GetDataBool(0); int t_agent_id = Pduenity->GetDataUInt(2); std::string strSend = CreateJson2("Answer", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_HANGUP: //挂机 case PDU_CMD_AGENT_TURN_TO_IVR: { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); CString CallerNum = Pduenity->GetDataString(3); std::string strSend; //strSend = CreateJson2("DropCall", IsSuccess); // 2021-12-31 if (CallerNum.IsEmpty() || CallerNum == "") strSend = DropCallJson(IsSuccess, ""); else strSend = DropCallJson(IsSuccess, CallerNum.GetBuffer(0)); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_HOLD: //保持 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Hold", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_TAKEBACK: //接回 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Retrieve", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MUTE: // 静音 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Mute", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); } break; case PDU_CMD_AGENT_TRANSTALK: //转移 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Transfer", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_THREETALK: //Meeting三方通话 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); CString callerNum = Pduenity->GetDataString(4); // 主叫号码/呼入的号码 CString tagNum = Pduenity->GetDataString(3); // 拉去的第三方号码 std::string strSend = CreateJson2("Meeting", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); if (m_IsVideo) { std::regex pattern("^[0-9]{1,}$"); if (std::regex_match(callerNum.GetBuffer(0), pattern)) { callerNum.ReleaseBuffer(); SendMessageToClientByExtenId(strSend, _ttoi(callerNum)); } if (std::regex_match(tagNum.GetBuffer(0), pattern)) { tagNum.ReleaseBuffer(); SendMessageToClientByExtenId(strSend, _ttoi(tagNum)); } } break; } case PDU_CMD_AGENT_THREETALK_TAKEBACK: { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("MeetingTakeBack", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MONI_LISTEN: //班长 监听 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Listen", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MONI_INSERT: //班长 强插 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Insert", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MONI_INTERCEPT: //班长 强截 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Intercept", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MONI_CUT: //班长 强拆 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Cut", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_MONI_FORCE_LOGOUT: // 强制坐席签出 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("ForceLogOut", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); if (IsSuccess)//通知被控制座席 { std::string t_trg_strSend = CreateJson5("MotorLogOut", IsSuccess, Pduenity->GetDataUInt(5)); int t_trg_agent_id = Pduenity->GetDataUInt(4); SendMessageToClientByAgentId(t_trg_strSend, t_trg_agent_id,true); } break; } case PDU_CMD_AGENT_MONI_FORCE_STATE: //班长 强制控制座席状态 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("ForceState", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); if (IsSuccess)//通知被控制座席 { std::string t_trg_strSend = CreateJson5("MotorSetState", IsSuccess, Pduenity->GetDataUInt(5)); int t_trg_agent_id = Pduenity->GetDataUInt(4); SendMessageToClientByAgentId(t_trg_strSend, t_trg_agent_id); } break; } case PDU_CMD_AGENT_MONI_REPLACE: //班长 代接 { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Replace", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_ACD_SUBMIT_DATA: //座席状态发生变化 { std::string State = Pduenity->GetDataString(3); int AgentID = Pduenity->GetDataUInt(0); int ExtenID = Pduenity->GetDataUInt(1); std::string Group = Pduenity->GetDataString(6); int t_sub_AgentID = Pduenity->GetDataUInt(5); int DataType = Pduenity->GetDataUInt(2); std::string state; // 2023-03-24 State超过511通过rcf获取 if (State.length() >= 511) { if (getSubmitData(AgentID, DataType, state)) { State=state; } } std::string strSend; if (DataType == 0) //座席状态 { std::string t_extend_state = ""; std::string t_agent_state = ""; std::string t_caller = ""; std::string t_callee = ""; std::string t_m_agent = ""; vector VecStringList; StringSplit(State, '|', VecStringList); if (VecStringList.size() > 4) { t_agent_state = VecStringList.at(0); t_extend_state = VecStringList.at(1); t_caller = VecStringList.at(2); t_callee = VecStringList.at(3); t_m_agent = VecStringList.at(4); strSend = CreateJson8("AgentState", true, AgentID, ExtenID, t_agent_state, t_extend_state, t_caller, t_callee, t_m_agent, Group); } else { t_agent_state = State; strSend = CreateJson8("AgentState", true, AgentID, t_agent_state); } } else if (DataType == 1) //线路状态 { strSend = CreateJson8("LineState", true, AgentID, State); } //ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_NORMAL, "Server->Agent : 通知座席状态转发至坐席 [%s]", strSend); if (t_sub_AgentID == 0) // ych 2018.6.5 依据订阅者ID是否有效决定是否群发 { auto it = m_SubScribed_ConID.begin(); while (it!= m_SubScribed_ConID.end()) { if (!SendMessageToClient(strSend, it->first)) it = m_SubScribed_ConID.erase(it); else ++it; } } else { bool bOK = false; auto it = m_SubScribed_ConID.begin(); while (it != m_SubScribed_ConID.end()) { if (it->second == t_sub_AgentID) { if (SendMessageToClient(strSend, it->first)) { bOK = true; break; } } ++it; } if(!bOK) SendMessageToClientByAgentId(strSend, t_sub_AgentID); } break; } case PDU_CMD_CTI_LINE_STATE: //线路状态 { OnLineStateChange(Pduenity); int Exten = Pduenity->GetDataUInt(0); int AgentID = Pduenity->GetDataUInt(3); int AgentState = Pduenity->GetDataUInt(12); int ExtenState = Pduenity->GetDataUInt(1); //string m_strDropcall = Pduenity->GetDataString(14); //string strSendAgent = CreateJson7("AgentStateAgent", true, AgentID, AgentState, ExtenState); //SendMessageToClientByAgentId(strSendAgent, AgentID); // 2021-11-09 屏蔽, break; } case PDU_CMD_ACD_AGENT_STATE: { int Exten = Pduenity->GetDataUInt(0); int AgentID = Pduenity->GetDataUInt(1); int AgentState = Pduenity->GetDataUInt(2); int ExtenState = Pduenity->GetDataUInt(3); string strSendAgent = CreateJson7("AgentStateAgent", true, AgentID, AgentState, ExtenState); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson14("AgentStateMonitor", true, AgentID, Exten, AgentState, ExtenState); // ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { if (!SendMessageToClient(strSendAgent, it->second)) it = m_ConIdVec.erase(it); else ++it; } } break; case PDU_CMD_CTI_RECORD: { int RecExtern = Pduenity->GetDataUInt(0); long CallID = Pduenity->GetDataULong(1); CString RecPath = Pduenity->GetDataString(2); std::string strSendAgent = CreateJson10("RecordPath", true, RecPath.GetBuffer(0), CallID); RecPath.ReleaseBuffer(); SendMessageToClientByExtenId(strSendAgent, RecExtern); break; } case PDU_CMD_IVR_WAITER_COUNT: // 排队人数 { int count = Pduenity->GetDataUInt(0); std::string strSend = CreateJson2("WaitCount", count); SendMessageToAllAgentClient(strSend); break; } case PDU_CMD_AGENT_GET_AGENTLIST: { //??2018.5.23 NotFound //CString AgentListStr = Pduenity->GetDataString(2); int t_agent_id = Pduenity->GetDataUInt(1); std::string agentList; CString AgentListStr; if (getAgentList(t_agent_id, agentList)) // 2022-01-20 从rcfserver获取,防止坐席太多,造成字符串超过限制 AgentListStr.Format("%s", agentList.c_str()); else AgentListStr = Pduenity->GetDataString(2); std::string strSendAgent = CreateJson11("GetAgentList", true, AgentListStr.GetBuffer(0)); AgentListStr.ReleaseBuffer(); SendMessageToClientByAgentId(strSendAgent, t_agent_id); break; } case PDU_CMD_AGENT_CONSULTATION_CALL: { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); std::string strSend = CreateJson2("Consult", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_CONFIRM_TRANSFER: { int t_agent_id = Pduenity->GetDataUInt(2); bool IsSuccess = Pduenity->GetDataBool(0); int EndParmer = Pduenity->GetDataUInt(3); std::string strSend = CreateJson5("ConfirmTransfer", IsSuccess, EndParmer); SendMessageToClientByAgentId(strSend, t_agent_id); break; } case PDU_CMD_AGENT_VIDEO_REQ_EXTEN: // 请求注册视频分机号 { bool ret = Pduenity->GetDataBool(0); uint32_t agentId = Pduenity->GetDataUInt(1); uint32_t extenId = Pduenity->GetDataUInt(2); CString pwd = Pduenity->GetDataString(3); long conID = 0; { std::unique_locklock(m_MapLoginAgentConIDLock); auto it = m_MapLoginAgentConID.find(agentId); if (it != m_MapLoginAgentConID.end()) { conID = it->second; m_MapLoginAgentConID.erase(it); } else { break; } } if (ret) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(agentId); if (it != m_agentMap.get().end()) m_agentMap.get().erase(it); Agent agent(agentId, extenId, conID); m_agentMap.insert(agent); } std::string strSend = CreateJson2("VideoReqExten", ret, extenId, pwd.GetBuffer(0)); pwd.ReleaseBuffer(); SendMessageToClient(strSend, conID); } break; case PDU_CMD_AGENT_VIDEO_REQ_AGENT: // 请求空闲坐席 { bool ret = Pduenity->GetDataBool(0); uint32_t agentId = Pduenity->GetDataUInt(1); uint32_t extenId = Pduenity->GetDataUInt(2); std::string strSend = CreateJson2("VideoReqIdeAgent", ret, extenId); SendMessageToClientByAgentId(strSend, agentId); } break; case PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN: // 释放请求的视频分机号 { uint32_t agentId = Pduenity->GetDataUInt(1); std::string strSend = CreateJson2("VideoDesExten", true); SendMessageToClientByAgentId(strSend, agentId); { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(agentId); if (it != m_agentMap.get().end()) m_agentMap.get().erase(it); } } break; case PDU_CMD_AGENT_SKILL_GROUP_WAIT_COUNT: { CString sCount = Pduenity->GetDataString(0); std::string strSend = CreateJson18("SkillGroupWaitCount", true, sCount.GetBuffer(0)); SendMessageToAllAgentClient(strSend); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "ACD->HttpServer SkillGroupWaitCount[%s] ", sCount); } break; case PDU_CMD_AGENT_SEND_DTMF: { bool IsSuccess = Pduenity->GetDataBool(0); int t_agent_id = Pduenity->GetDataUInt(2); std::string strSend = CreateJson2("SendDtmf", IsSuccess); SendMessageToClientByAgentId(strSend, t_agent_id); } break; case PDU_CMD_EXTEN_STATE_LIST_ZMD: // 驻马店专用, 获取分机状态 { int t_agent_id = Pduenity->GetDataUInt(1); std::string extList; bool ret = getZmdExtenStateList(extList); std::string strSendAgent = CreateJsonZmdExtStateList("GetExtenList", ret, extList); SendMessageToClientByAgentId(strSendAgent, t_agent_id); } break; default: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, "OnMymsgRecmsg,UnSupportPduCmd=%d", Type); } } void CServerDlg::OnLineStateChange(CPduEntity* Pduenity) { CLineStateUpdateInfo LineStateUpdateInfo; memset(&LineStateUpdateInfo, 0, sizeof(CLineStateUpdateInfo)); LineStateUpdateInfo.ExternID = Pduenity->GetDataUInt(0); LineStateUpdateInfo.Externstate = Pduenity->GetDataUInt(1); LineStateUpdateInfo.CallIDDD = Pduenity->GetDataULong(2); LineStateUpdateInfo.ActionID = Pduenity->GetDataInt(11); LineStateUpdateInfo.AgentIDDDD = Pduenity->GetDataUInt(3); CString strCaller = Pduenity->GetDataString(4); CString strCallee = Pduenity->GetDataString(5); CString strAssoData = Pduenity->GetDataString(6); LineStateUpdateInfo.Line = Pduenity->GetDataUInt(7); LineStateUpdateInfo.InfoEx = Pduenity->GetDataUInt(8); LineStateUpdateInfo.FinalExt = Pduenity->GetDataUInt(9); LineStateUpdateInfo.OpType = Pduenity->GetDataUInt(10); LineStateUpdateInfo.Dropcall = Pduenity->GetDataUInt(14); //int AgentState = Pduenity->GetDataUInt(12); char TempChar[512] = { 0 }; memcpy(TempChar, strCaller, strCaller.GetLength()); LineStateUpdateInfo.caller = std::string(TempChar); memset(TempChar, 0, 512); memcpy(TempChar, strCallee, strCallee.GetLength()); LineStateUpdateInfo.callee = std::string(TempChar); memset(TempChar, 0, 512); memcpy(TempChar, strAssoData, strAssoData.GetLength()); LineStateUpdateInfo.AssoData = std::string(TempChar); int LineState = Pduenity->GetDataUInt(1); int AgentID = Pduenity->GetDataUInt(3); int AgentState = Pduenity->GetDataUInt(12); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "座席号=%d, 座席状态=%d, 线路状态=%d, caller=%s, callee=%s", AgentID, AgentState, LineStateUpdateInfo.Externstate, LineStateUpdateInfo.caller.c_str(), LineStateUpdateInfo.callee.c_str()); std::string strSendAgent = ""; switch (Pduenity->GetDataUInt(1)) { case INNER_STATE_FREE: //挂机 { strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, " 线路状态: %s ", strSendAgent.c_str()); SendMessageToClientByAgentId(strSendAgent, AgentID); //strSendAgent = CreateJson16("dropCall", true, AgentID, AgentState, LineState, "dropcall"); // by 8/20 strSendAgent = DropCallJson(true, ""); // 2021-12-22 代替上面一行,如有问题再更换回去 SendMessageToClientByAgentId(strSendAgent, AgentID); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, " 线路状态: %s ", strSendAgent.c_str()); strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo); // ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { SendMessageToClient(strSendAgent, it->second); ++it; } } break; case INNER_STATE_TALKING: //通话中 { //电话接通后,发送CallID unsigned long CallID = Pduenity->GetDataULong(2); int PeerLineType = Pduenity->GetDataUInt(7); //0 -> 内线,1 -> 外线 if (CallID == 0) { return; } // 2020-01-13 移动到下面,添加呼入呼出方向字段 /*strSendAgent = CreateJson9("CallID", true, AgentID, CallID); SendMessageToClient(strSendAgent.c_str(), AgentConId);*/ std::string strDirection; CString t_ExternID; int t_eid = Pduenity->GetDataUInt(0); t_ExternID.Format(_T("%d"), t_eid); CString t_Caller = Pduenity->GetDataString(4); CString t_Callee = Pduenity->GetDataString(5); if (t_ExternID == t_Caller) { strDirection = "out"; } else { strDirection = "in"; } // 2020-01-13 移添加呼入呼出方向字段,代替上面发送的callid, 2021-03-22 添加actionid strSendAgent = CreateJson9("CallID", true, AgentID, CallID, strDirection, LineStateUpdateInfo.ActionID); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState, PeerLineType, strDirection); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo); // ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { SendMessageToClient(strSendAgent, it->second); ++it; } } break; case INNER_STATE_ALERTING: //来电振铃 { unsigned long CallID = Pduenity->GetDataULong(2); int TargetAgentID = Pduenity->GetDataUInt(3); CString outNumber = Pduenity->GetDataString(4); CString calleeNumber = Pduenity->GetDataString(5); CString trunkNumber = Pduenity->GetDataString(13); // 7.29 中继号 int ActionID = Pduenity->GetDataInt(11); // int ConID; // m_MapAgentConID.Lookup(TargetAgentID,ConID); // std::string strSend = CreateJson6("Incoming", true, outNumber.GetBuffer(0), calleeNumber.GetBuffer(0), CallID, ActionID); std::string strSend = CreateJson6("Incoming", true, outNumber.GetBuffer(0), calleeNumber.GetBuffer(0), CallID, ActionID, trunkNumber.GetBuffer(0)); outNumber.ReleaseBuffer(); calleeNumber.ReleaseBuffer(); trunkNumber.ReleaseBuffer(); SendMessageToClientByAgentId(strSend, AgentID); strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { SendMessageToClient(strSendAgent, it->second); ++it; } } break; case INNER_STATE_RING_BACK: //回铃 { strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { SendMessageToClient(strSendAgent, it->second); ++it; } } break; case INNER_STATE_INIT: case INNER_STATE_DIALING: case INNER_STATE_PLAY_BUSYTONE: case INNER_STATE_REMOVE: case INNER_STATE_HELD: { strSendAgent = CreateJson7("LineStateAgent", true, AgentID, AgentState, LineState); SendMessageToClientByAgentId(strSendAgent, AgentID); strSendAgent = CreateJson13("LineStateMonitor", true, LineStateUpdateInfo);// ych 2018.6.6 auto it = m_ConIdVec.begin(); while (it != m_ConIdVec.end()) { SendMessageToClient(strSendAgent, it->second); ++it; } } break; default: ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_WARNING, "OnLineStateChange.AgentID= %d,AgentState=%d,UnKnownLineState=%d ", AgentID, AgentState, LineState); } } void CServerDlg::SendMessageToClientByAgentId(std::string MsgStr, int AgentId, bool isDelAgent) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(AgentId); if (it == m_agentMap.get().end()) { return; } auto conID = it->HdlID; bool ret = m_Server.sendMsg(conID, MsgStr); if (!ret) { CString strShow; strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", AgentId, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); m_agentMap.get().erase(it); return; } if (isDelAgent) { m_agentMap.get().erase(it); } CString strShow; strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", AgentId, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); } bool CServerDlg::SendMessageToClientByExtenId(std::string MsgStr, int ExtenId) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(ExtenId); if (it == m_agentMap.get().end()) { return false; } auto conID = it->HdlID; bool ret = m_Server.sendMsg(conID, MsgStr); if (!ret) { CString strShow; strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); m_agentMap.get().erase(it); return false; } CString strShow; strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); return true; } void CServerDlg::SendMessageToClientByHdlId(std::string MsgStr, int CondId) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(CondId); if (it == m_agentMap.get().end()) { return; } bool ret = m_Server.sendMsg(CondId, MsgStr); if (!ret) { CString strShow; strShow.Format("Server->Agent : 执行结果转发至坐席 [%d] 失败 ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); m_agentMap.get().erase(it); return; } CString strShow; strShow.Format("Server->Agent : 执行结果已转发至坐席 [%d] ConId = %d ; %s", it->AgentID, it->HdlID, MsgStr.c_str()); // 2020-1-3 打印发送内容 ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); } void CServerDlg::SendMessageToAllAgentClient(std::string MsgStr) { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.begin(); while (it != m_agentMap.end()) { if (m_Server.sendMsg(it->HdlID, MsgStr)) ++it; else it = m_agentMap.erase(it); } } bool CServerDlg::SendMessageToClient(std::string MsgStr, long ConId) { return m_Server.sendMsg(ConId, MsgStr); } void CServerDlg::__recvMsgFun(const long conID, const std::string &msg, const std::string &ip) { int Curr_ConID = conID; std::string ch = JsonParser(msg); if (ch == "")return; StringSplit(ch, '@', m_VecAgentAttributeStr); if (m_VecAgentAttributeStr.empty()) { return; } char* TypeStr = GetType(); bool t_isAcdConnect = CNetworkClient::GetInstance().isAcdConnected(); if (0 == strcmp(TypeStr, "Heart")) //心跳 { string strSend = CreateJson4("Heart", true); SendMessageToClient(strSend, Curr_ConID); if (t_isAcdConnect == false) { string strSend = CreateJson4("AcdConnectNotify", false); SendMessageToClient(strSend, Curr_ConID); CString strShow; strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d ", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); ; ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s", ch.c_str()); } return ; } if (t_isAcdConnect == false) // 2018.6.11 { string strSend = CreateJson4("AcdConnectNotify", false); SendMessageToClient(strSend, Curr_ConID); CString strShow; strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d ", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s", ch.c_str()); //m_agentDetailConIDs.clear(); //m_agentMap.clear(); //m_SubScribed_ConID.clear(); //m_ConIdVec.clear(); //m_MapLoginAgentConID.clear(); return ; } ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "收到消息 %s", msg.c_str()); if (0 == strcmp(TypeStr, "Monitor")) // ych 2018.6.7 { CString strShow; strShow.Format("Agent->Server : 收到【 %s 】命令 ConID =%d", TypeStr, Curr_ConID); CPduEntity cmd(PDU_CMD_MONITOR_START); cmd.SetDataInt(1, Curr_ConID); CNetworkClient::GetInstance().send2ACD(&cmd); return ; } if (0 == strcmp(TypeStr, "SubScribeMonitor")) // ych 2018.6.7 { CPduEntity cmd(PDU_CMD_SUBSCRIBE_START); cmd.SetDataInt(1, Curr_ConID); CNetworkClient::GetInstance().send2ACD(&cmd); // ych 2018.6.6 监控订阅保存连接ID m_ConIdVec[Curr_ConID] = Curr_ConID; std::string strJson = CreateJson2("SubScribeMonitor", true); SendMessageToClient(strJson, Curr_ConID); return ; } if (0 == strcmp(TypeStr, "SubScribeMonitorCancel")) // ych 2018.6.7 取消监控订阅 { std::string strJson = CreateJson2("SubScribeMonitorCancel", true); SendMessageToClient(strJson, Curr_ConID); auto it = m_ConIdVec.find(Curr_ConID); if (it != m_ConIdVec.end()) m_ConIdVec.erase(it); return ; } CString strShow; strShow.Format("Agent->Server : 收到【 %s 】命令 AgentID=%d Exten=%d ConID =%d IP[%s]", TypeStr, GetAgentID(), GetAgentExten(), Curr_ConID, ip); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, strShow.GetBuffer(0)); strShow.ReleaseBuffer(); ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_TRACE, "%s",ch.c_str()); if (0 == strcmp(TypeStr, "SubScribe")) // 订阅座席状态 { CPduEntity cmd(PDU_CMD_AGENT_SUBSCRIBE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体 cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号 bool result = CNetworkClient::GetInstance().send2ACD(&cmd); string strSend = CreateJson4("SubScribe", result); SendMessageToClient(strSend, Curr_ConID); m_SubScribed_ConID[Curr_ConID] = GetAgentID(); } if (0 == strcmp(TypeStr, "SubScribeCancel")) //取消订阅 { CPduEntity cmd(PDU_CMD_AGENT_CANCEL_SUBSCRIBE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体 cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号 bool result = CNetworkClient::GetInstance().send2ACD(&cmd); string strSend = CreateJson4("SubScribeCancel", result); SendMessageToClient(strSend, Curr_ConID); auto it = m_SubScribed_ConID.find(Curr_ConID); if (it != m_SubScribed_ConID.end()) m_SubScribed_ConID.erase(Curr_ConID); } if (0 == strcmp(TypeStr, "VideoReqExten")) // 请求可以注册的分机号 { m_IsVideo = true; CPduEntity cmd(PDU_CMD_AGENT_VIDEO_REQ_EXTEN); cmd.SetDataUInt(1, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); { std::unique_locklock(m_MapLoginAgentConIDLock); m_MapLoginAgentConID[GetAgentID()] = Curr_ConID; // 保存连接标识 } } if (0 == strcmp(TypeStr, "VideoReqIdeAgent")) // 请求空闲坐席 { m_IsVideo = true; CPduEntity cmd(PDU_CMD_AGENT_VIDEO_REQ_AGENT); cmd.SetDataUInt(1, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); // 2021-10-15 督办专员 VideoReqBindAgent代替保存 /*{ std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(GetAgentExten()); if (it != m_agentMap.get().end()) { m_agentMap.get().erase(it); } m_agentMap.insert(Agent(GetAgentID(), GetAgentExten(), conID)); }*/ } if (0 == strcmp(TypeStr, "VideoDesExten")) // 销毁/回收请求的分机号 { m_IsVideo = true; CPduEntity cmd(PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN); cmd.SetDataUInt(1, GetAgentID()); cmd.SetDataUInt(2, GetAgentExten()); cmd.SetDataString(3, "123456"); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "VideoReqBindAgent")) { m_IsVideo = true; std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(GetAgentExten()); if (it != m_agentMap.get().end()) { m_agentMap.get().erase(it); } m_agentMap.insert(Agent(GetAgentID(), GetAgentExten(), conID)); std::string strSend = CreateJson2(TypeStr, true); SendMessageToClient(strSend, Curr_ConID); } if (0 == strcmp(TypeStr, "GetAgentDetail")) // 获取坐席详情 { CPduEntity cmd(PDU_CMD_AGENT_DETAIL); cmd.SetDataInt(1, Curr_ConID); CNetworkClient::GetInstance().send2ACD(&cmd); std::unique_lock lock(m_agentDetailConIDLock); m_agentDetailConIDs[Curr_ConID] = Curr_ConID; } if (0 == strcmp(TypeStr, "Login")) //签入 { int t_agent_id = GetAgentID(); if (t_agent_id == 0) // 2022-01-06 坐席工号不能为0 { std::string strSend = CreateJson3("Login", "坐席工号不能为0"); SendMessageToClient(strSend, Curr_ConID); return; } if (GetAgentExten() == 0) { std::string strSend = CreateJson3("Login", "坐席分机号不能为0"); SendMessageToClient(strSend, Curr_ConID); return; } CPduEntity cmd(PDU_CMD_AGENT_LOGIN); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, t_agent_id); cmd.SetDataString(3, GetAgentGroup()); cmd.SetDataUInt(4, GetAgentType()); //2018.5.17 { std::unique_locklock(m_MapLoginAgentConIDLock); m_MapLoginAgentConID[t_agent_id] = Curr_ConID; } CNetworkClient::GetInstance().send2ACD(&cmd); } if (!IsAvailableConID(Curr_ConID)) return ; if (0 == strcmp(TypeStr, "Logout")) //签出 { CPduEntity cmd(PDU_CMD_AGENT_LOGOUT); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "SayBusy")) //置忙 { CPduEntity cmd(PDU_CMD_AGENT_SETSTATE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(3, AGENT_STATE_REPOSE); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "SayFree")) //置闲 { CPduEntity cmd(PDU_CMD_AGENT_SETSTATE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(3, AGENT_STATE_FREE); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Reset")) //重置 { string strSend = CreateJson2("Reset", false); CPduEntity cmd(PDU_CMD_AGENT_RESET); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); if (CNetworkClient::GetInstance().send2ACD(&cmd)) strSend = CreateJson2("Reset", true); SendMessageToClient(strSend, Curr_ConID); } if (0 == strcmp(TypeStr, "MakeCall")) //外呼 { // baiyang 被叫号码由分机号改为正确的被叫号码 // 有前端的CallId,传回主叫号码,相关的Json解析 //ILogger::getInstance().log(LOG_CLASS_SOCKET, LOG_LEVEL_NORMAL, "收到消息MakeCall 坐席:%d,分机:%d,目的号:%s ", GetAgentID(), GetAgentExten(), GetMakeCallDestinationNumber()); //int Number = GetAgentExten(); //CString strCallerNumber; //strCallerNumber.Format("%d", Number); CPduEntity cmd(PDU_CMD_AGENT_MAKECALL); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataString(4, GetMakeCallDestinationNumber()); // cmd.SetDataString(5, strCallerNumber); cmd.SetDataString(7, GetNumberHeader()); cmd.SetDataString(8, GetVisitStr()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "AnswerCall")) //应答 { CPduEntity cmd(PDU_CMD_AGENT_ANSWER); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "DropCall")) //挂断 { CPduEntity cmd(PDU_CMD_AGENT_HANGUP); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Hold")) //保持 { CPduEntity cmd(PDU_CMD_AGENT_HOLD); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Retrieve")) //接回保持 { CPduEntity cmd(PDU_CMD_AGENT_TAKEBACK); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Mute")) // 静音操作(0开始静音,1结束静音) { CPduEntity cmd(PDU_CMD_AGENT_MUTE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(3, GetOpType()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Transfer")) //转移 { CPduEntity cmd(PDU_CMD_AGENT_TRANSTALK); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataString(3, GetTransferOrMeetingDestinationNumber()); cmd.SetDataString(4, ""); cmd.SetDataString(5, GetTransferType()); //添加转移类型,0指定号码转移,1转移技能组 CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Meeting")) //多方通话 { CPduEntity cmd(PDU_CMD_AGENT_THREETALK); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataString(3, GetTransferOrMeetingDestinationNumber()); cmd.SetDataString(4, ""); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "MeetingTakeBack")) //多方通话接回主叫 { CPduEntity cmd(PDU_CMD_AGENT_THREETALK_TAKEBACK); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Listen")) // 监听 { CPduEntity cmd(PDU_CMD_AGENT_MONI_LISTEN); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); int bb = CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Insert")) // 强插 { CPduEntity cmd(PDU_CMD_AGENT_MONI_INSERT); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Intercept")) // 强截 { CPduEntity cmd(PDU_CMD_AGENT_MONI_INTERCEPT); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Break")) // 强拆 { CPduEntity cmd(PDU_CMD_AGENT_MONI_CUT); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "ForceAgentLogOut")) // 强制坐席退出 { CPduEntity cmd(PDU_CMD_AGENT_MONI_FORCE_LOGOUT); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "ForceAgentState")) // 强制更改座席状态 { CPduEntity cmd(PDU_CMD_AGENT_MONI_FORCE_STATE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); //目标座席工号 //cmd.SetDataUInt(5, 2); //状态码 2:置闲 5:置忙 cmd.SetDataUInt(5, GetTargetAgentState()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Instead")) // 代接 { CPduEntity cmd(PDU_CMD_AGENT_MONI_REPLACE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(4, GetTargetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } /* 改到判断是否签入之前,不签入也可订阅 if (0 == strcmp(TypeStr, "SubScribe")) // 订阅座席状态 { CPduEntity cmd(PDU_CMD_AGENT_SUBSCRIBE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体 cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号 bool result = CNetworkClient::GetInstance().send2ACD(&cmd); string strSend = CreateJson4("SubScribe", result); SendMessageToClient(strSend, Curr_ConID); m_SubScribed_ConID[Curr_ConID] = Curr_ConID; } if (0 == strcmp(TypeStr, "SubScribeCancel")) //取消订阅 { CPduEntity cmd(PDU_CMD_AGENT_CANCEL_SUBSCRIBE); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataInt(3, GetSubType()); // 0坐席状态1分机状态2空闲列表3忙列表4来电列表5通话列表6排队数量7技能媒体 cmd.SetDataUInt(4, GetSubParmer()); //参数 既座席工号 bool result = CNetworkClient::GetInstance().send2ACD(&cmd); string strSend = CreateJson4("SubScribeCancel", result); SendMessageToClient(strSend, Curr_ConID); auto it = m_SubScribed_ConID.find(Curr_ConID); if (it != m_SubScribed_ConID.end()) m_SubScribed_ConID.erase(Curr_ConID); } */ if (0 == strcmp(TypeStr, "GetAgentList")) { CPduEntity cmd(PDU_CMD_AGENT_GET_AGENTLIST); cmd.SetDataUInt(0, GetAgentExten()); cmd.SetDataUInt(1, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "Consult")) { CPduEntity cmd(PDU_CMD_AGENT_CONSULTATION_CALL); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataString(4, GetConsultCallee()); cmd.SetDataString(5, GetConsultCaller()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "ConfirmTransfer")) { CPduEntity cmd(PDU_CMD_AGENT_CONFIRM_TRANSFER); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataUInt(3, GetEndParmer()); CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "TurnIvr")) { CPduEntity cmd(PDU_CMD_AGENT_TURN_TO_IVR); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(5, GetIvrPos()); cmd.SetDataString(6, GetIvrName()); cmd.SetDataBool(8, true); // true 回访,不kill通道,false->true CNetworkClient::GetInstance().send2ACD(&cmd); } if (0 == strcmp(TypeStr, "SendDtmf")) //发送按键信息 { CPduEntity cmd(PDU_CMD_AGENT_SEND_DTMF); cmd.SetDataUInt(1, GetAgentExten()); cmd.SetDataUInt(2, GetAgentID()); cmd.SetDataString(3, GetSendDtmf()); CNetworkClient::GetInstance().send2ACD(&cmd); } // 驻马店专用 if (0 == strcmp(TypeStr, "GetExtenList")) { CPduEntity cmd(PDU_CMD_EXTEN_STATE_LIST_ZMD); cmd.SetDataUInt(0, GetAgentExten()); cmd.SetDataUInt(1, GetAgentID()); CNetworkClient::GetInstance().send2ACD(&cmd); } // 转发消息,替坐席转发消息给其它已签入坐席/分机 if (0 == strcmp(TypeStr, "TurnMsg")) { CString tagNum = GetTurnTagNum(); CString tagData = GetTurnTagData(); bool ret= SendMessageToClientByExtenId(tagData.GetBuffer(0), atoi(tagNum)); std::string strSend = CreateJson2(TypeStr, ret); SendMessageToClient(strSend, conID); } } void CServerDlg::__closeFun(const long conID) { int DisconIDRec = conID; { auto it = m_SubScribed_ConID.find(DisconIDRec); if (it != m_SubScribed_ConID.end()) m_SubScribed_ConID.erase(it); } int KeyAgentID = 0; int AgentExtern = 0; { std::unique_locklock(m_agentMapLock); auto it = m_agentMap.get().find(DisconIDRec); if (it != m_agentMap.get().end()) { KeyAgentID = it->AgentID; AgentExtern = it->ExtenID; m_agentMap.get().erase(it); } } ILogger::getInstance().log(LOG_CLASS_BUSI, LOG_LEVEL_WARNING, "连接断开ConID = %d Agent = %d Exten = %d ", DisconIDRec, KeyAgentID, AgentExtern); // 该断开连接标识有绑定坐席发送签出命令 if (KeyAgentID > 0) { CPduEntity cmd(PDU_CMD_AGENT_LOGOUT); cmd.SetDataUInt(1, AgentExtern); cmd.SetDataUInt(2, KeyAgentID); cmd.SetDataUInt(3, 3); // 3签出原因是连接断开,正常是默认0(非3) CNetworkClient::GetInstance().send2ACD(&cmd); // 视频请求分机 连接断开自动释放分机 if (m_IsVideo) { CPduEntity cmd(PDU_CMD_AGENT_VIDEO_RECOVER_EXTEN); cmd.SetDataUInt(1, KeyAgentID); cmd.SetDataUInt(2, AgentExtern); CNetworkClient::GetInstance().send2ACD(&cmd); } } { std::unique_locklock(m_MapLoginAgentConIDLock); auto it = m_MapLoginAgentConID.find(DisconIDRec); if (it != m_MapLoginAgentConID.end()) m_MapLoginAgentConID.erase(it); } { // 连接断开删除坐席详情连接标识 std::unique_lock lock(m_agentDetailConIDLock); auto it = m_agentDetailConIDs.find(DisconIDRec); if (it != m_agentDetailConIDs.end()) { m_agentDetailConIDs.erase(it); } } } void CServerDlg::__recovLogin() { std::vector groupVecs; getOnlineAgentGroupDetail(groupVecs); // 获取断开之前的坐席, if (groupVecs.empty())return; // 当有需要恢复签入的坐席时,判断acd,cti是否正常,等正常的时候再发送签入 if (!CNetworkClient::GetInstance().isAcdConnected() || !CNetworkClient::GetInstance().isCtiConnected()) { return; } std::vector agentVecs; std::vector agentDetailVec; for (auto groupVec : groupVecs) { boost::split(agentVecs, groupVec, boost::is_any_of("#")); for (auto agentVec : agentVecs) { boost::split(agentDetailVec, agentVec, boost::is_any_of("|")); if (agentDetailVec.size() > 3) { int t_agent_id = atoi(agentDetailVec[0].c_str()); // 坐席号 int exten_no = atoi(agentDetailVec[1].c_str()); // 分机号 const char* group = agentDetailVec[2].c_str(); // 组号 int agent_type = atoi(agentDetailVec[3].c_str()); // 坐席类型 CPduEntity cmd(PDU_CMD_AGENT_LOGIN); cmd.SetDataUInt(1, exten_no); cmd.SetDataUInt(2, t_agent_id); cmd.SetDataString(3, group); cmd.SetDataUInt(4, agent_type); cmd.SetDataUInt(8, 1); // 1恢复签入 CNetworkClient::GetInstance().send2ACD(&cmd); } } } } char* CServerDlg::TranslateErrorCode(int ErrorCode) { char* StrError = "0"; switch (ErrorCode) { case ERR_NO_CTI: // CTI未启动 StrError = "CTI未启动"; break; case ERR_NO_ACD: // ACD未启动 StrError = "ACD未启动"; break; case ERR_NO_IP: // IP地址错误 StrError = "IP地址错误"; break; case ERR_NO_EXT: // 分机号不存在 StrError = "分机号不存在"; break; case ERR_BIND_EXT: // 分机号已绑定 StrError = "分机号已绑定"; break; case ERR_BIND_AGENT: // 坐席号已绑定 StrError = "座席号已绑定"; break; case ERR_SAY_BUSY: // ACD不能置该座席为忙 StrError = "ACD不能置该座席为忙"; break; case ERR_SAY_FREE: // ACD不能置该座席为闲 StrError = "ACD不能置该座席为闲"; break; case ERR_RESET_AGENT: // CTI重置该座席失败 StrError = "CTI重置该座席失败"; break; case ERR_MAKE_CALL: // CTI执行外呼失败 StrError = "CTI执行外呼失败"; break; case ERR_ANSWER_CALL: // CTI执行应答失败 StrError = "CTI执行应答失败"; break; case ERR_DROP_CALL: // CTI执行挂机失败 StrError = "CTI 执行挂机失败"; break; case ERR_HOLD: // CTI执行保持失败 StrError = "CTI执行保持失败"; break; case ERR_UN_HOLD: // CTI执行接回失败 StrError = "CTI执行接回失败"; break; case ERR_TRANSFER: // CTI执行转移失败 StrError = "CTI执行转移失败"; break; case ERR_CANCEL_TRANSFER: // CTI执行取消转移失败 StrError = "CTI执行取消转移失败"; break; case ERR_CANCEL_THREETALK: // CTI执行取消三方失败 StrError = "CTI执行取消第三方失败"; break; case ERR_CANCEL: // CTI执行取消失败 StrError = "CTI执行取消失败"; break; case ERR_CONSULTATION_CALL: // CTI执行协商呼叫失败 StrError = "CTI执行协商呼叫失败"; break; case ERR_CONFIRM_TRANSFER: // CTI执行确认转移失败 StrError = "CTI 执行确认转移失败"; break; case ERR_THREE_TALK: // CTI执行加三方通话失败 StrError = "CTI执行加三方通话失败"; break; case ERR_LISTEN_AGENT: // CTI执行监听座席失败 StrError = "CTI执行监听座席失败"; break; case ERR_INSERT_AGENT: // CTI执行强插座席失败 StrError = "CTI执行强插座席失败"; break; case ERR_INSTEAD: // CTI执行代接座席失败 StrError = "CTI执行代接座席失败"; break; case ERR_CUT_AGENT: // CTI执行强拆座席失败 StrError = "CTI 执行强拆座席失败"; break; case ERR_INTERCEPT_AGENT: // CTI执行强截座席失败 StrError = "CTI执行强截座席失败"; break; case ERR_FORCE_LOGOUT_AGENT: // 强制签出 StrError = "强制签出"; break; case ERR_FORCE_CONTROL_AGENT: // CTI执行强制控制座席失败 StrError = "CTI执行强制控制座席失败"; break; case ERR_TRANSFER_TO_IVR: // CTI执行转移到IVR失败 StrError = "CTI 执行转移到IVR失败"; break; case ERR_MAKECALL_BY_SELF: // 自己呼自己 StrError = "呼叫自己"; break; case ERR_TARGET_NUMBER_TOO_LONG: StrError = "号码太长"; // 目标号码太长 break; case ERR_IVR_FILE_PATH_TOO_LONG: // ivr文件路径太长 StrError = "IVR文件路径过长"; break; case ERR_FAX_FILE_PATH_TOO_LONG: // fax文件路径太长 StrError = "Fax文件路径太长"; break; case ERR_NO_AGENT_EVENT_MANAGER: // 座席事件管理类为NULL StrError = "座席事件管理类为NULL"; break; case ERR_NO_AGENT_LOG: // 座席日志类为NULL StrError = "座席日志类为NULL"; break; case ERR_PREVIEW_MAKECALL: // CTI平台暂不支持 预览外拨 StrError = "CTI平台暂不支持 预览外拨"; break; case ERR_BEGIN_MUTE: // 开始静音失败 StrError = "开始静音失败"; break; case ERR_END_MUTE: // 结束静音失败 StrError = "结束静音失败"; break; case ERR_STOP_RECORD: // CTI停止录音失败 StrError = "CTI停止录音失败"; break; case ERR_SEND_FAX: // CTI发送传真失败 StrError = "CTI发送传真失败"; break; case ERR_RECV_FAX: // CTI接收传真失败 StrError = " CTI接收传真失败"; break; case ERR_CREATE_TIMER: // 创建定时器失败 StrError = "创建定时器失败"; break; case ERR_SUB_AGENT: // 订阅坐席失败 StrError = "订阅坐席失败"; break; case ERR_CANCEL_SUB_AGENT: // 取消订阅坐席失败 StrError = "取消订阅座席失败"; break; case ERR_DESTNUM_SPACIL: // 包含特殊字符 StrError = "包含特殊字符串"; break; case ERR_LOGIN_AGIN: // 重复签入 StrError = "重复签入"; break; case ERR_AUTH_FAILED: // 授权验证失败 StrError = "授权验证失败"; break; default: StrError = "未知错误"; break; } return StrError; } void CServerDlg::OnClose() { // TODO: 在此添加消息处理程序代码和/或调用默认值 CNetworkClient::GetInstance().release(); //ILogger::getInstance().close(); CDialogEx::OnClose(); } void CServerDlg::OnSysCommand(UINT nID, LPARAM lParam) { // TODO: 在此添加消息处理程序代码和/或调用默认值 if (nID == SC_CLOSE) { if (MessageBox(_T("确定要退出HttpServer系统吗?"), _T("提示"), MB_OKCANCEL) != IDOK) return; ILogger::getInstance().stop(); } CDialogEx::OnSysCommand(nID, lParam); } void CServerDlg::OnSize(UINT nType, int cx, int cy) { CDialogEx::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 auto pWnd = GetDlgItem(IDC_LIST1); if (pWnd&&nType != 1) { CRect rc; GetClientRect(&rc); pWnd->MoveWindow(rc); CRect mRect; m_CtrlList.GetClientRect(&mRect); int length = mRect.right - mRect.left - 240; m_CtrlList.SetColumnWidth(3,length); } } void CServerDlg::OnMenuLogStop() { // TODO: 在此添加命令处理程序代码 ILogger::getInstance().stop(); } void CServerDlg::OnUpdateMenuLogStop(CCmdUI *pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 if (ILogger::getInstance().isStart()) pCmdUI->SetCheck(0); else pCmdUI->SetCheck(1); } void CServerDlg::OnMenuLogStart() { // TODO: 在此添加命令处理程序代码 ILogger::getInstance().start(); } void CServerDlg::OnUpdateMenuLogStart(CCmdUI *pCmdUI) { // TODO: 在此添加命令更新用户界面处理程序代码 if (ILogger::getInstance().isStart()) pCmdUI->SetCheck(); else pCmdUI->SetCheck(0); } void CServerDlg::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) { CDialogEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); // TODO: 在此处添加消息处理程序代码 if (!bSysMenu && pPopupMenu) { CCmdUI cmdUI; cmdUI.m_pOther = NULL; cmdUI.m_pMenu = pPopupMenu; cmdUI.m_pSubMenu = NULL; UINT count = pPopupMenu->GetMenuItemCount(); cmdUI.m_nIndexMax = count; for (UINT i = 0; i < count; i++) { UINT nID = pPopupMenu->GetMenuItemID(i); if (-1 == nID || 0 == nID) { continue; } cmdUI.m_nID = nID; cmdUI.m_nIndex = i; cmdUI.DoUpdate(this, FALSE); } } }