| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- #pragma once
- #include <iostream>
- #include "EslGateway.h"
- #include "WebSocketServer.h"
- #include "Log.h"
- #include <vector>
- #include "JdbcHelper.h"
- #include "Agent.h"
- #include "TtsBaidu.h"
- #include "CallStringMaker.h"
- #include <map>
- #include <list>
- #include <mutex>
- #include <shared_mutex>
-
- #include "AutoCall.h"
- #include "AgentDetail.h"
- #include "TokenList.h"
- #include "VideoOffice.h"
- #include "DepttelextOffice.h"
- #include "VideoExtenHdl.h"
- typedef struct MyStruct
- {
- std::mutex mut;
- std::map<std::string, websocketpp::connection_hdl> agents;
- void addAgent(std::string agentId, websocketpp::connection_hdl hdl){
- std::unique_lock<std::mutex>lock(mut);
- agents[agentId] = hdl;
- }
- void delAgent(std::string agentId) {
- std::unique_lock<std::mutex>lock(mut);
- agents.erase(agentId);
- }
- void loopAgent(CWebSocketServer &server,std::string data) {
- std::unique_lock<std::mutex>lock(mut);
- auto it = agents.begin();
- while (it != agents.end())
- {
- if (!it->second.expired())
- server.sendMsg(it->second, data);
- ++it;
- }
- }
- void clear() {
- std::unique_lock<std::mutex>lock(mut);
- agents.clear();
- }
- }MonitorAgent;
- class Session;
- class VirtualChan;
- class ChanTrunk;
- class ChanExten;
- class CFsProxy
- {
- public:
- CFsProxy();
- ~CFsProxy();
- static CFsProxy& GetInstance() { return instance; }
- bool init();
- void release(void);
- void run(void);
- // 事件处理
- void onChanRegist(DEV_RES_TYPE ChanType, uint32_t ChanNo, CHAN_LOGIC_STATE ChanState);
- void onExtenDestroy(uint32_t ExtenNo);
- void onExtenDirectOp(DEV_OP OpType, VirtualChan* pHostChan, PCHAN_EVENT_NOTIFY pNotify);
- void onChanStateUpdate(long OpInstance, VirtualChan* pChan);
- void onChanPoor(Session* pSession, PCHAN_EVENT_NOTIFY pNotify);
- void onCallcenterQueue(const std::string& strQueueName, const std::string&strQueueCount); // 技能组排队数量
- // ESL事件
- void onEslDisconnect(void);
- void onEslExtenReg(uint32_t ExtenNo,string ExtenIp);
- void onEslExtenUnreg(uint32_t ExtenNo);
- void onEslEvtBgJobDone(PBG_JOB_NOTIFY pNotify);
- void onEslEvtChannel(PCHAN_EVENT_NOTIFY pNotify);
- void onEslEvtDtmf(PDTMF_NOTIFY pNotify);
- void onEslEvtHold(PHOLD_NOTIFY pNotify);
- // 功能接口
- bool send2Agent(std::string ExtenNo,std::string Data);
- ChanExten* getExten(uint32_t ExtenNo);
- ChanTrunk* getTrunk(uint32_t TrunkNo);
- void delChan(VirtualChan* pChan);
- ChanTrunk* getFreeTrunk(void);
- VirtualChan* getAssoChanInSession(VirtualChan* pChan);
- VirtualChan* getBusyChan(string ChanId);
- void regBusyChan(VirtualChan* pChan);
- void unregBusyChan(VirtualChan* pChan);
- std::string getAgentByExten(std::string ExtenNo);
- std::string getAgentByExten(std::string ExtenNo, std::string &Groups);
- std::string getExtenByAgent(std::string AgentId);
- Session* getSession(string SessionId) { return __getSession( SessionId); };
- // 语音操作接口
- bool ExtenCall(long JobId, VirtualChan* pChan, std::string CallerNum, std::string CalleeNum);
- bool PredictionCall(long JobId, std::string CallerNum, std::string CalleeNum);
- bool AutoCall(long JobId, std::string CallerNum, std::string CalleeNum,int OpType,long TaskId);
- bool kill(long JobId, VirtualChan* pChan);
- bool kill(long JobId, std::string ChanId);
- bool consult(long JobId, VirtualChan* pChan, std::string DestNum);
- bool insert(long JobId, VirtualChan* pChan, std::string DestSessionId);
- bool intercept(long JobId, VirtualChan* pChan, std::string DestChanId);
- bool listen(long JobId, VirtualChan* pChan, std::string DestChanId);
- bool playAgentNo(VirtualChan* pChan);
- bool playAgentNo(long JobId, VirtualChan* pChan);
- bool meeting(long JobId, std::string CallerNum, std::string DestNum, std::string MeetingId);
- bool muteOn(long JobId, VirtualChan* pChan);
- bool muteOff(long JobId, VirtualChan* pChan);
- bool holdon(long JobId, VirtualChan* pChan);
- bool takeBack(long JobId, VirtualChan* pChan);
- bool record(long JobId, VirtualChan* pChan, std::string RcdFile);
- bool turnIvr(long JobId, VirtualChan* pChan); // 转满意度
- bool transfer(long JobId, VirtualChan* pChan, std::string DestNum);
- bool transfer2Context(long JobId, std::string DestChanId, std::string Exten, std::string Context, bool BothSide = false);
-
- bool setChannelVariable(long JobId, std::string DestChanId, std::string VarName, std::string Content); // 2021-12-2 设置单腿通道变量
- bool ExecteApp(std::string App, std::string Param, std::string ChanId); //执行app 2021-12-09
- bool sendDtmf(long JobId, std::string DestChanId, std::string Content); // 发送按键 2022-01-12
-
- bool getConferenceMemberId(std::string MeetingId, std::string ChanId, std::string &MemberId);
- bool setConferenceExitSound(std::string MeetingId, bool isPlay);
- bool setConferenceIsMute(long JobId, std::string MeetingId, std::string MemberId, bool isMute);
- //bool voiceCall(); // 语音外呼
- // 创建json字符串
- std::string creatJson(std::string type, std::string result);
- std::string creatJson(std::string type, bool result);
- std::string creatJson(std::string type, bool result,std::string desc);
- std::string creatJson(std::string type, std::string result, std::string agentId);
- std::string creatJson(std::string type, std::string result, std::string agentId, std::string extenNo);
- std::string creatJsonIncoming(std::string callid, std::string caller, std::string callee, std::string trunkNumber,int incomintType);
- std::string creatJsonRecord(std::string callid,std::string recordPath);
- // 视频
- std::string creatJson2(std::string type, bool result);
- std::string creatJson2(std::string type, bool result, int extenID);
- std::string creatJson2(std::string type, bool result, int extenID, std::string pwd);
-
- private:
- bool __init();
- uint32_t __transLogicState2CtiState(DEV_RES_TYPE ChanType, CHAN_LOGIC_STATE State);
- void __addExten(uint32_t ExtenNo);
- void __delExten(uint32_t ExtenNo);
- void __freeExten(void);
- void __initTrunkChan(void);
- void __freeTrunkChan(void);
- Session* __getSessionByChanId(const string& ChanId);
- Session* __getSession(string SessionId);
- Session* __getSession(PCHAN_EVENT_NOTIFY pNotify);
- void __delSession(std::string SessionId);
- void __freeSession(void);
- bool __kill(long JobId, string ChanId);
- std::string __getExtenByAgent(std::string agentId);
- // callcenter fs自带座席签入,签出
- bool __login(std::string AgentID,std::string ExtenNo);
- bool __logout(std::string AgentID,std::string AgentExten);
- bool __login(std::string AgentID, std::string ExtenNo,std::list<std::string> Group);
- bool __freeAgent(); // 释放mod_callcenter中签入的坐席
- bool __setState(std::string AgentID, bool isFree); // 置忙,置闲
- bool __setStatePostProcessing(std::string AgentID); //设置话后处理状态 Available (On Demand)
- std::string __num2text(std::string data);
- // websocket 事件
- void __recvMsgFun(websocketpp::connection_hdl hdl, string msg);
- void __closeFun(websocketpp::connection_hdl hdl);
- // 自动外呼任务回调函数
- void __doAutoTask(Task task);
- bool __voicCall(Task &task);
- // 坐席详情 签入,签出,置忙,置闲, 状态改变时计算,
- void __agentDetail();
- void __agentDetail(std::mutex*p_mtx,bool islock=false); // 第一个参数,locak.release()
- void __agentDetailTrunkChange(const std::int32_t& nCount);
- // 坐席组排队数量
- std::string __queryCount(const bool&bIsLock ); // 返回json字符串
- private:
- CEslGateway m_Gateway;
- CWebSocketServer m_Server;
-
- TtsBaidu tts;
- CCallStringMaker m_CallStringMaker;
- std::vector<ChanTrunk*> m_ArrayTrunk; // 中继数组
- std::map<uint32_t, ChanExten*> m_MapChanExt; // 分机表
- std::map<std::string, Session*> m_MapSession; // 会话表
- std::map<std::string,VirtualChan*> m_MapBusyChan; // 忙通道表
- std::map<std::string, Agent*> m_MapAgent; // 分机-坐席
- std::mutex m_AgentLock;
- std::map<std::string, std::string> m_QueryCount; // 排队数量,组-数量
- std::shared_mutex m_mutQueryCount;
- std::list<websocketpp::connection_hdl> m_subWaitCount; // 需要接收排队数量的坐席
-
- MonitorAgent m_MonitAgents; // 坐席监控集合
- ::AutoCall m_AutoCall; // 自动外呼类
- AgentDetailStatis m_AgentDetail; // 坐席详情,在线数量,空闲数量,通话中
- std::map<long,websocketpp::connection_hdl> m_mpAgentDetailHdl; // 保存坐席详情hdl
-
- TokenList m_ToeknList; // token验证
- /*视频相关*/
- CVideoOffice m_VideoOffice; // 市民分机管理
- CDepttelextOffice m_DepttelOffice; // 督办分机状态管理
- CVideoExtenHdl m_VideoExtenHdl; // 保存市民/督办 分机-连接关系
- std::unordered_map<int, std::string> m_ExtPhone;// 分机号-手机号
- //static
- volatile long opInstance = 1l; // 无实际意义
- static CFsProxy instance;
- };
|