| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- #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 <mutex>
- #include "AutoCall.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);
- // 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 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 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, std::string result, std::string agentId);
- std::string creatJsonIncoming(std::string callid, std::string caller, std::string callee, std::string trunkNumber,int incomintType);
- 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* __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);
-
- // websocket 事件
- void __recvMsgFun(websocketpp::connection_hdl hdl, string msg);
- void __closeFun(websocketpp::connection_hdl hdl);
- // 自动外呼任务回调函数
- void __doAutoTask(Task& task);
- bool __voicCall(Task &task);
- 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;
- MonitorAgent m_MonitAgents; // 坐席监控集合
- ::AutoCall m_AutoCall; // 自动外呼类
- //static
- volatile long opInstance = 1l; // 无实际意义
- static CFsProxy instance;
- };
|