linux版本中间件

FsProxy.h 8.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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 <list>
  13. #include <mutex>
  14. #include <shared_mutex>
  15. #include "AutoCall.h"
  16. #include "AgentDetail.h"
  17. #include "TokenList.h"
  18. #include "VideoOffice.h"
  19. #include "DepttelextOffice.h"
  20. #include "VideoExtenHdl.h"
  21. typedef struct MyStruct
  22. {
  23. std::mutex mut;
  24. std::map<std::string, websocketpp::connection_hdl> agents;
  25. void addAgent(std::string agentId, websocketpp::connection_hdl hdl){
  26. std::unique_lock<std::mutex>lock(mut);
  27. agents[agentId] = hdl;
  28. }
  29. void delAgent(std::string agentId) {
  30. std::unique_lock<std::mutex>lock(mut);
  31. agents.erase(agentId);
  32. }
  33. void loopAgent(CWebSocketServer &server,std::string data) {
  34. std::unique_lock<std::mutex>lock(mut);
  35. auto it = agents.begin();
  36. while (it != agents.end())
  37. {
  38. if (!it->second.expired())
  39. server.sendMsg(it->second, data);
  40. ++it;
  41. }
  42. }
  43. void clear() {
  44. std::unique_lock<std::mutex>lock(mut);
  45. agents.clear();
  46. }
  47. }MonitorAgent;
  48. class Session;
  49. class VirtualChan;
  50. class ChanTrunk;
  51. class ChanExten;
  52. class CFsProxy
  53. {
  54. public:
  55. CFsProxy();
  56. ~CFsProxy();
  57. static CFsProxy& GetInstance() { return instance; }
  58. bool init();
  59. void release(void);
  60. void run(void);
  61. // 事件处理
  62. void onChanRegist(DEV_RES_TYPE ChanType, uint32_t ChanNo, CHAN_LOGIC_STATE ChanState);
  63. void onExtenDestroy(uint32_t ExtenNo);
  64. void onExtenDirectOp(DEV_OP OpType, VirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify);
  65. void onChanStateUpdate(long OpInstance, VirtualChan* pChan);
  66. void onChanPoor(Session* pSession, PCHAN_EVENT_NOTIFY pNotify);
  67. void onCallcenterQueue(const std::string& strQueueName, const std::string&strQueueCount); // 技能组排队数量
  68. // ESL事件
  69. void onEslDisconnect(void);
  70. void onEslExtenReg(uint32_t ExtenNo,string ExtenIp);
  71. void onEslExtenUnreg(uint32_t ExtenNo);
  72. void onEslEvtBgJobDone(PBG_JOB_NOTIFY pNotify);
  73. void onEslEvtChannel(PCHAN_EVENT_NOTIFY pNotify);
  74. void onEslEvtDtmf(PDTMF_NOTIFY pNotify);
  75. void onEslEvtHold(PHOLD_NOTIFY pNotify);
  76. // 功能接口
  77. bool send2Agent(std::string ExtenNo,std::string Data);
  78. ChanExten* getExten(uint32_t ExtenNo);
  79. ChanTrunk* getTrunk(uint32_t TrunkNo);
  80. void delChan(VirtualChan* pChan);
  81. ChanTrunk* getFreeTrunk(void);
  82. VirtualChan* getAssoChanInSession(VirtualChan* pChan);
  83. VirtualChan* getBusyChan(string ChanId);
  84. void regBusyChan(VirtualChan* pChan);
  85. void unregBusyChan(VirtualChan* pChan);
  86. std::string getAgentByExten(std::string ExtenNo);
  87. std::string getAgentByExten(std::string ExtenNo, std::string &Groups);
  88. std::string getExtenByAgent(std::string AgentId);
  89. Session* getSession(string SessionId) { return __getSession( SessionId); };
  90. // 语音操作接口
  91. bool ExtenCall(long JobId, VirtualChan* pChan, std::string CallerNum, std::string CalleeNum);
  92. bool PredictionCall(long JobId, std::string CallerNum, std::string CalleeNum);
  93. bool AutoCall(long JobId, std::string CallerNum, std::string CalleeNum,int OpType,long TaskId);
  94. bool kill(long JobId, VirtualChan* pChan);
  95. bool kill(long JobId, std::string ChanId);
  96. bool consult(long JobId, VirtualChan* pChan, std::string DestNum);
  97. bool insert(long JobId, VirtualChan* pChan, std::string DestSessionId);
  98. bool intercept(long JobId, VirtualChan* pChan, std::string DestChanId);
  99. bool listen(long JobId, VirtualChan* pChan, std::string DestChanId);
  100. bool playAgentNo(VirtualChan* pChan);
  101. bool playAgentNo(long JobId, VirtualChan* pChan);
  102. bool meeting(long JobId, std::string CallerNum, std::string DestNum, std::string MeetingId);
  103. bool muteOn(long JobId, VirtualChan* pChan);
  104. bool muteOff(long JobId, VirtualChan* pChan);
  105. bool holdon(long JobId, VirtualChan* pChan);
  106. bool takeBack(long JobId, VirtualChan* pChan);
  107. bool record(long JobId, VirtualChan* pChan, std::string RcdFile);
  108. bool turnIvr(long JobId, VirtualChan* pChan); // 转满意度
  109. bool transfer(long JobId, VirtualChan* pChan, std::string DestNum);
  110. bool transfer2Context(long JobId, std::string DestChanId, std::string Exten, std::string Context, bool BothSide = false);
  111. bool setChannelVariable(long JobId, std::string DestChanId, std::string VarName, std::string Content); // 2021-12-2 设置单腿通道变量
  112. bool ExecteApp(std::string App, std::string Param, std::string ChanId); //执行app 2021-12-09
  113. bool sendDtmf(long JobId, std::string DestChanId, std::string Content); // 发送按键 2022-01-12
  114. bool getConferenceMemberId(std::string MeetingId, std::string ChanId, std::string &MemberId);
  115. bool setConferenceExitSound(std::string MeetingId, bool isPlay);
  116. bool setConferenceIsMute(long JobId, std::string MeetingId, std::string MemberId, bool isMute);
  117. //bool voiceCall(); // 语音外呼
  118. // 创建json字符串
  119. std::string creatJson(std::string type, std::string result);
  120. std::string creatJson(std::string type, bool result);
  121. std::string creatJson(std::string type, bool result,std::string desc);
  122. std::string creatJson(std::string type, std::string result, std::string agentId);
  123. std::string creatJson(std::string type, std::string result, std::string agentId, std::string extenNo);
  124. std::string creatJsonIncoming(std::string callid, std::string caller, std::string callee, std::string trunkNumber,int incomintType);
  125. std::string creatJsonRecord(std::string callid,std::string recordPath);
  126. // 视频
  127. std::string creatJson2(std::string type, bool result);
  128. std::string creatJson2(std::string type, bool result, int extenID);
  129. std::string creatJson2(std::string type, bool result, int extenID, std::string pwd);
  130. private:
  131. bool __init();
  132. uint32_t __transLogicState2CtiState(DEV_RES_TYPE ChanType, CHAN_LOGIC_STATE State);
  133. void __addExten(uint32_t ExtenNo);
  134. void __delExten(uint32_t ExtenNo);
  135. void __freeExten(void);
  136. void __initTrunkChan(void);
  137. void __freeTrunkChan(void);
  138. Session* __getSessionByChanId(const string& ChanId);
  139. Session* __getSession(string SessionId);
  140. Session* __getSession(PCHAN_EVENT_NOTIFY pNotify);
  141. void __delSession(std::string SessionId);
  142. void __freeSession(void);
  143. bool __kill(long JobId, string ChanId);
  144. std::string __getExtenByAgent(std::string agentId);
  145. // callcenter fs自带座席签入,签出
  146. bool __login(std::string AgentID,std::string ExtenNo);
  147. bool __logout(std::string AgentID,std::string AgentExten);
  148. bool __login(std::string AgentID, std::string ExtenNo,std::list<std::string> Group);
  149. bool __freeAgent(); // 释放mod_callcenter中签入的坐席
  150. bool __setState(std::string AgentID, bool isFree); // 置忙,置闲
  151. bool __setStatePostProcessing(std::string AgentID); //设置话后处理状态 Available (On Demand)
  152. std::string __num2text(std::string data);
  153. // websocket 事件
  154. void __recvMsgFun(websocketpp::connection_hdl hdl, string msg);
  155. void __closeFun(websocketpp::connection_hdl hdl);
  156. // 自动外呼任务回调函数
  157. void __doAutoTask(Task task);
  158. bool __voicCall(Task &task);
  159. // 坐席详情 签入,签出,置忙,置闲, 状态改变时计算,
  160. void __agentDetail();
  161. void __agentDetail(std::mutex*p_mtx,bool islock=false); // 第一个参数,locak.release()
  162. void __agentDetailTrunkChange(const std::int32_t& nCount);
  163. // 坐席组排队数量
  164. std::string __queryCount(const bool&bIsLock ); // 返回json字符串
  165. private:
  166. CEslGateway m_Gateway;
  167. CWebSocketServer m_Server;
  168. TtsBaidu tts;
  169. CCallStringMaker m_CallStringMaker;
  170. std::vector<ChanTrunk*> m_ArrayTrunk; // 中继数组
  171. std::map<uint32_t, ChanExten*> m_MapChanExt; // 分机表
  172. std::map<std::string, Session*> m_MapSession; // 会话表
  173. std::map<std::string,VirtualChan*> m_MapBusyChan; // 忙通道表
  174. std::map<std::string, Agent*> m_MapAgent; // 分机-坐席
  175. std::mutex m_AgentLock;
  176. std::map<std::string, std::string> m_QueryCount; // 排队数量,组-数量
  177. std::shared_mutex m_mutQueryCount;
  178. std::list<websocketpp::connection_hdl> m_subWaitCount; // 需要接收排队数量的坐席
  179. MonitorAgent m_MonitAgents; // 坐席监控集合
  180. ::AutoCall m_AutoCall; // 自动外呼类
  181. AgentDetailStatis m_AgentDetail; // 坐席详情,在线数量,空闲数量,通话中
  182. std::map<long,websocketpp::connection_hdl> m_mpAgentDetailHdl; // 保存坐席详情hdl
  183. TokenList m_ToeknList; // token验证
  184. /*视频相关*/
  185. CVideoOffice m_VideoOffice; // 市民分机管理
  186. CDepttelextOffice m_DepttelOffice; // 督办分机状态管理
  187. CVideoExtenHdl m_VideoExtenHdl; // 保存市民/督办 分机-连接关系
  188. std::unordered_map<int, std::string> m_ExtPhone;// 分机号-手机号
  189. //static
  190. volatile long opInstance = 1l; // 无实际意义
  191. static CFsProxy instance;
  192. };