linux版本中间件

FsProxy.h 5.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. #pragma once
  2. #include <iostream>
  3. #include "EslGateway.h"
  4. #include "WebSocketServer.h"
  5. #include "Log.h"
  6. #include <vector>
  7. #include "JdbcHelper.h"
  8. #include "Agent.h"
  9. #include "TtsBaidu.h"
  10. #include "CallStringMaker.h"
  11. #include <map>
  12. #include <mutex>
  13. #include "AutoCall.h"
  14. typedef struct MyStruct
  15. {
  16. std::mutex mut;
  17. std::map<std::string, websocketpp::connection_hdl> agents;
  18. void addAgent(std::string agentId, websocketpp::connection_hdl hdl){
  19. std::unique_lock<std::mutex>lock(mut);
  20. agents[agentId] = hdl;
  21. }
  22. void delAgent(std::string agentId) {
  23. std::unique_lock<std::mutex>lock(mut);
  24. agents.erase(agentId);
  25. }
  26. void loopAgent(CWebSocketServer &server,std::string data) {
  27. std::unique_lock<std::mutex>lock(mut);
  28. auto it = agents.begin();
  29. while (it != agents.end())
  30. {
  31. if (!it->second.expired())
  32. server.sendMsg(it->second, data);
  33. ++it;
  34. }
  35. }
  36. void clear() {
  37. std::unique_lock<std::mutex>lock(mut);
  38. agents.clear();
  39. }
  40. }MonitorAgent;
  41. class Session;
  42. class VirtualChan;
  43. class ChanTrunk;
  44. class ChanExten;
  45. class CFsProxy
  46. {
  47. public:
  48. CFsProxy();
  49. ~CFsProxy();
  50. static CFsProxy& GetInstance() { return instance; }
  51. bool init();
  52. void release(void);
  53. void run(void);
  54. // 事件处理
  55. void onChanRegist(DEV_RES_TYPE ChanType, uint32_t ChanNo, CHAN_LOGIC_STATE ChanState);
  56. void onExtenDestroy(uint32_t ExtenNo);
  57. void onExtenDirectOp(DEV_OP OpType, VirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify);
  58. void onChanStateUpdate(long OpInstance, VirtualChan* pChan);
  59. void onChanPoor(Session* pSession, PCHAN_EVENT_NOTIFY pNotify);
  60. // ESL事件
  61. void onEslDisconnect(void);
  62. void onEslExtenReg(uint32_t ExtenNo,string ExtenIp);
  63. void onEslExtenUnreg(uint32_t ExtenNo);
  64. void onEslEvtBgJobDone(PBG_JOB_NOTIFY pNotify);
  65. void onEslEvtChannel(PCHAN_EVENT_NOTIFY pNotify);
  66. void onEslEvtDtmf(PDTMF_NOTIFY pNotify);
  67. void onEslEvtHold(PHOLD_NOTIFY pNotify);
  68. // 功能接口
  69. bool send2Agent(std::string ExtenNo,std::string Data);
  70. ChanExten* getExten(uint32_t ExtenNo);
  71. ChanTrunk* getTrunk(uint32_t TrunkNo);
  72. void delChan(VirtualChan* pChan);
  73. ChanTrunk* getFreeTrunk(void);
  74. VirtualChan* getAssoChanInSession(VirtualChan* pChan);
  75. VirtualChan* getBusyChan(string ChanId);
  76. void regBusyChan(VirtualChan* pChan);
  77. void unregBusyChan(VirtualChan* pChan);
  78. std::string getAgentByExten(std::string ExtenNo);
  79. std::string getAgentByExten(std::string ExtenNo, std::string &Groups);
  80. std::string getExtenByAgent(std::string AgentId);
  81. Session* getSession(string SessionId) { return __getSession( SessionId); };
  82. // 语音操作接口
  83. bool ExtenCall(long JobId, VirtualChan* pChan, std::string CallerNum, std::string CalleeNum);
  84. bool PredictionCall(long JobId, std::string CallerNum, std::string CalleeNum);
  85. bool AutoCall(long JobId, std::string CallerNum, std::string CalleeNum,int OpType,long TaskId);
  86. bool kill(long JobId, VirtualChan* pChan);
  87. bool consult(long JobId, VirtualChan* pChan, std::string DestNum);
  88. bool insert(long JobId, VirtualChan* pChan, std::string DestSessionId);
  89. bool intercept(long JobId, VirtualChan* pChan, std::string DestChanId);
  90. bool listen(long JobId, VirtualChan* pChan, std::string DestChanId);
  91. bool playAgentNo(VirtualChan* pChan);
  92. bool playAgentNo(long JobId, VirtualChan* pChan);
  93. bool meeting(long JobId, std::string CallerNum, std::string DestNum, std::string MeetingId);
  94. bool muteOn(long JobId, VirtualChan* pChan);
  95. bool muteOff(long JobId, VirtualChan* pChan);
  96. bool holdon(long JobId, VirtualChan* pChan);
  97. bool takeBack(long JobId, VirtualChan* pChan);
  98. bool record(long JobId, VirtualChan* pChan, std::string RcdFile);
  99. bool turnIvr(long JobId, VirtualChan* pChan); // 转满意度
  100. bool transfer(long JobId, VirtualChan* pChan, std::string DestNum);
  101. bool transfer2Context(long JobId, std::string DestChanId, std::string Exten, std::string Context, bool BothSide = false);
  102. //bool voiceCall(); // 语音外呼
  103. // 创建json字符串
  104. std::string creatJson(std::string type, std::string result);
  105. std::string creatJson(std::string type, bool result);
  106. std::string creatJson(std::string type, std::string result, std::string agentId);
  107. std::string creatJsonIncoming(std::string callid, std::string caller, std::string callee, std::string trunkNumber,int incomintType);
  108. private:
  109. bool __init();
  110. uint32_t __transLogicState2CtiState(DEV_RES_TYPE ChanType, CHAN_LOGIC_STATE State);
  111. void __addExten(uint32_t ExtenNo);
  112. void __delExten(uint32_t ExtenNo);
  113. void __freeExten(void);
  114. void __initTrunkChan(void);
  115. void __freeTrunkChan(void);
  116. Session* __getSession(string SessionId);
  117. Session* __getSession(PCHAN_EVENT_NOTIFY pNotify);
  118. void __delSession(std::string SessionId);
  119. void __freeSession(void);
  120. bool __kill(long JobId, string ChanId);
  121. std::string __getExtenByAgent(std::string agentId);
  122. // callcenter fs自带座席签入,签出
  123. bool __login(std::string AgentID,std::string ExtenNo);
  124. bool __logout(std::string AgentID,std::string AgentExten);
  125. bool __login(std::string AgentID, std::string ExtenNo,std::list<std::string> Group);
  126. bool __freeAgent(); // 释放mod_callcenter中签入的坐席
  127. bool __setState(std::string AgentID, bool isFree);
  128. // websocket 事件
  129. void __recvMsgFun(websocketpp::connection_hdl hdl, string msg);
  130. void __closeFun(websocketpp::connection_hdl hdl);
  131. // 自动外呼任务回调函数
  132. void __doAutoTask(Task& task);
  133. bool __voicCall(Task &task);
  134. private:
  135. CEslGateway m_Gateway;
  136. CWebSocketServer m_Server;
  137. TtsBaidu tts;
  138. CCallStringMaker m_CallStringMaker;
  139. std::vector<ChanTrunk*> m_ArrayTrunk; // 中继数组
  140. std::map<uint32_t, ChanExten*> m_MapChanExt; // 分机表
  141. std::map<std::string, Session*> m_MapSession; // 会话表
  142. std::map<std::string,VirtualChan*> m_MapBusyChan; // 忙通道表
  143. std::map<std::string, Agent*> m_MapAgent; // 分机-坐席
  144. std::mutex m_AgentLock;
  145. MonitorAgent m_MonitAgents; // 坐席监控集合
  146. ::AutoCall m_AutoCall; // 自动外呼类
  147. //static
  148. volatile long opInstance = 1l; // 无实际意义
  149. static CFsProxy instance;
  150. };