中间件底层,websocket

ServerDlg.h 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. // ServerDlg.h : header file
  2. //
  3. #pragma once
  4. #include <regex>
  5. #include <vector>
  6. #include <atomic>
  7. #include <set>
  8. #include <mutex>
  9. #include <memory>
  10. #include <boost/multi_index_container.hpp>
  11. #include <boost/multi_index/member.hpp>
  12. #include <boost/multi_index/ordered_index.hpp>
  13. #include <boost/algorithm/string.hpp>
  14. #include <sstream>
  15. #include "WebSocketServer.h"
  16. using namespace boost;
  17. using namespace boost::multi_index;
  18. using namespace std;
  19. struct agent_id {};
  20. struct agent_exten {};
  21. struct hdl_id{};
  22. typedef struct tagAgent {
  23. int AgentID;
  24. int ExtenID;
  25. int HdlID;
  26. tagAgent(int AgentID, int ExtenID, int hdlId = 0) {
  27. this->AgentID = AgentID;
  28. this->ExtenID = ExtenID;
  29. this->HdlID = hdlId;
  30. std::cout << __FUNCTION__ << " " << toString() << std::endl;
  31. }
  32. ~tagAgent() {
  33. std::cout << __FUNCTION__ << " " << toString() << std::endl;
  34. this->AgentID = 0;
  35. this->ExtenID = 0;
  36. this->HdlID = 0;
  37. }
  38. friend std::ostream& operator<<(std::ostream& out, const tagAgent& a) {
  39. char str[100];
  40. snprintf(str,100, "坐席[%d],分机[%d],标识[%d]", a.AgentID , a.ExtenID , a.HdlID);
  41. out << str;
  42. return out;
  43. }
  44. std::string toString() {
  45. char str[100];
  46. snprintf(str,100, "坐席[%d],分机[%d],标识[%d]",AgentID ,ExtenID , HdlID);
  47. return str;
  48. }
  49. }Agent;
  50. typedef multi_index_container<
  51. Agent, indexed_by<
  52. ordered_unique<tag<agent_id>, member<Agent, int, &Agent::AgentID>>,
  53. ordered_unique<tag<agent_exten>, member<Agent, int, &Agent::ExtenID>>,
  54. ordered_unique<tag<hdl_id>, member<Agent, int, &Agent::HdlID>>
  55. >
  56. > AgentMap;
  57. class CLineStateUpdateInfo
  58. {
  59. public:
  60. int ExternID;
  61. int Externstate;
  62. int CallIDDD;
  63. int ActionID;
  64. int AgentIDDDD;
  65. std::string caller;
  66. std::string callee;
  67. std::string AssoData;
  68. int Line;
  69. int InfoEx;
  70. int FinalExt;
  71. int OpType;
  72. std::string Dropcall;
  73. CLineStateUpdateInfo()
  74. {
  75. caller="";
  76. callee="";
  77. AssoData="";
  78. }
  79. };
  80. // CServerDlg dialog
  81. class CServerDlg : public CDialogEx
  82. {
  83. // Construction
  84. public:
  85. CServerDlg(CWnd* pParent = NULL); // standard constructor
  86. ~CServerDlg(); // standard destructor
  87. // Dialog Data
  88. enum { IDD = IDD_SERVER_DIALOG };
  89. protected:
  90. virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
  91. // Implementation
  92. protected:
  93. HICON m_hIcon;
  94. // Generated message map functions
  95. virtual BOOL OnInitDialog();
  96. afx_msg void OnPaint();
  97. afx_msg HCURSOR OnQueryDragIcon();
  98. DECLARE_MESSAGE_MAP()
  99. public:
  100. void StartServer();
  101. //
  102. private:
  103. std::string JsonParser(const string &strInput);
  104. void StringSplit(string s,char splitchar,vector<string>& vec) ;
  105. char* GetType();
  106. int GetAgentID();
  107. char* GetAgentGroup();
  108. int GetAgentType();
  109. int GetAgentExten();
  110. CString GetAgentNumber();
  111. int GetOpType();
  112. CString GetMakeCallDestinationNumber();
  113. CString GetTransferOrMeetingDestinationNumber();
  114. CString GetTransferType();
  115. CString GetNumberHeader();
  116. CString GetVisitStr();
  117. int GetBusyCode();
  118. int GetRecivedState();
  119. int GetTargetAgentID();
  120. int GetTargetAgentState();
  121. int GetSubType();
  122. int GetSubParmer();
  123. CString GetConsultCallee();
  124. CString GetConsultCaller();
  125. int GetEndParmer();
  126. CString GetIvrName();
  127. int GetIvrPos();
  128. CString GetSendDtmf();
  129. CString GetTurnTagNum();
  130. CString GetTurnTagData();
  131. string CreateJson(int AgentID,string AgentState);
  132. string CreateJson2(string str,bool reslut);
  133. string CreateJson2(string str, int waitCount);
  134. string CreateJson2(string str, bool b, int extenID);
  135. string CreateJson2(string str, bool b, int extenID,std::string pwd);
  136. string CreateJson3(string strtype,string str);
  137. string CreateJson4(string strType,bool b);
  138. string CreateJson5(string strType,bool b,int a);
  139. string CreateJson6(string strType,bool b,string str,string calleeStr,long callID,int ActionId);
  140. string CreateJson6(string strType, bool b, string str, string calleeStr, long callID, int ActionId,string trunkId); // 7.29 添加中继号参数
  141. string CreateJson7(string strType,bool b,int AgentID,int AgentState,int LineState); //分机状态
  142. string CreateJson7(string strType, bool b, int AgentID, int AgentState, int LineState, int PeerLineType,string strDirection);//分机状态,增加呼入呼出方向in,out
  143. string CreateJson8(string strType,bool b,int AgentID,string state); //座席状态
  144. string CreateJson8(string strType, bool b, int AgentID, int ExtenID, string state, string ExtenState, string Caller, string Callee, string ManageAgentId, string Group);
  145. string CreateJson9(string strType,bool b,int AgentID,long CallID); //CallID
  146. string CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection); // 2020-01-13 CallID 追加呼入呼出方向
  147. string CreateJson9(string strType, bool b, int AgentID, long CallID, string strDirection,int ActionID); // 2021-03-22 CallID 追加actionid
  148. string CreateJson10(string strType,bool b,string RecPath,long CallId); //录音
  149. string CreateJson11(string strType,bool b,string strAgentList); //坐席列表
  150. string CreateJson12(string strType, bool b, string PduString); // ych 2018.6.4 商丘添加监控命令
  151. string CreateJson13(string strType, bool b, const CLineStateUpdateInfo& LineStateUpdateInfo); // ych 2018.6.7 商丘添加监控命令
  152. string CreateJson14(string strType, bool b, int AgentID, int ExternID, int AgentState, int ExtenState); // ych 2018.6.7 商丘添加监控命令
  153. string CreateJson15(string strtype, int ErrorCode);
  154. string CreateJson16(string strType, bool b, int AgentID, int AgentState, int LineState,string Type); // 县级12345 by 8/20
  155. std::string CreateJson17(string strType, bool b, string PduString); // 坐席详情,签入,通话中,闲,忙,话后处理数量
  156. std::string CreateJson18(std::string strType, bool b, std::string SkillGroupDetail); // 技能组排队详情详情
  157. std::string DropCallJson(bool b, std::string CallerNum);
  158. std::string CreateJsonZmdExtStateList(std::string strType, bool b,std::string extStateList); // 2022-09-01 驻马店专用,分机状态列表
  159. void OnLineStateChange(CPduEntity* Pduenity);
  160. void SendMessageToClientByAgentId(std::string MsgStr, int AgentId, bool isDelAgent = false);
  161. bool SendMessageToClientByExtenId(std::string MsgStr, int ExtenId);
  162. void SendMessageToClientByHdlId(std::string MsgStr, int CondId);
  163. void SendMessageToAllAgentClient(std::string MsgStr);
  164. bool SendMessageToClient(std::string MsgStr, long ConId);
  165. private:
  166. // websocket 事件
  167. void __recvMsgFun(const long conID, const std::string &msg, const std::string &ip);
  168. void __closeFun(const long conID);
  169. void __recovLogin(); // 回复签入 2022-09-07
  170. void OnAcdmsgRecmsg(CPduEntity* Pduenity); // 该方法代替sendmessages调用得到方法
  171. private:
  172. CWebSocketServer m_Server;
  173. vector<string> m_VecAgentAttributeStr;
  174. AgentMap m_agentMap; // 签入坐席集合, AgentID与AgentExtern,连接标识 键值对,
  175. std::mutex m_agentMapLock; // 坐席集合锁
  176. std::unordered_map<int, long> m_MapLoginAgentConID; //签入时临时存放AgentID与ConID键值对
  177. std::mutex m_MapLoginAgentConIDLock; //map锁
  178. std::unordered_map<int, long> m_ConIdVec; // 监控订阅,不需先签入
  179. std::unordered_map<int, long> m_SubScribed_ConID; //已订阅的连接ID Vec; 订阅坐席状态,需先签入
  180. char* TranslateErrorCode(int ErrorCode); //翻译错误码
  181. bool IsAvailableConID(int CondId); //当前连接是否有效
  182. atomic<bool> m_IsVideo;
  183. std::unordered_map<int, long> m_agentDetailConIDs; // 获取坐席详情id集合
  184. std::mutex m_agentDetailConIDLock; // set锁
  185. public:
  186. CListCtrl m_CtrlList;
  187. afx_msg void OnClose();
  188. afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
  189. afx_msg void OnSize(UINT nType, int cx, int cy);
  190. afx_msg void OnMenuLogStop();
  191. afx_msg void OnUpdateMenuLogStop(CCmdUI *pCmdUI);
  192. afx_msg void OnMenuLogStart();
  193. afx_msg void OnUpdateMenuLogStart(CCmdUI *pCmdUI);
  194. afx_msg void OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu);
  195. };