| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- #include "Agent.h"
- #include "SqlWrite.h"
- #include "JdbcHelper.h"
- Agent::Agent(std::string a_AgentID, std::string a_ExtID) :m_AgentID(a_AgentID), m_Exten(a_ExtID), m_IsRepose(false), m_State(AGENT_STATE_FREE)
- {
- m_TimeLogin = __getCurTime();
- ptStartTalk = not_a_date_time; // 通话开始时间
- //ptStartFree = not_a_date_time; // 空闲开始时间
- ptStartFree = m_TimeLogin; // 登录后默认空闲状态
- ptStartRepose = not_a_date_time;// 小休开始时间
- ptStartRing = not_a_date_time; // 振铃开始时间
- loginID = __FormatTimeV2(m_TimeLogin);
- m_LoginTimes = 0;
- m_FreeTimes = 0;
- m_ReposeTimes = 0;
- m_TalkTimes = 0;
- m_ReposeNum = 0;
- m_AnswerNum = 0;
- __login();
- }
- Agent::Agent(std::string a_AgentID, std::string a_ExtID, std::string a_Group) :m_AgentID(a_AgentID), m_Exten(a_ExtID), m_IsRepose(false), m_State(AGENT_STATE_FREE)
- {
- m_TimeLogin = __getCurTime();
- ptStartTalk = not_a_date_time; // 通话开始时间
- //ptStartFree = not_a_date_time; // 空闲开始时间
- ptStartFree = m_TimeLogin; // 登录后默认空闲状态
- ptStartRepose = not_a_date_time;// 小休开始时间
- ptStartRing = not_a_date_time; // 振铃开始时间
- loginID = __FormatTimeV2(m_TimeLogin);
- m_LoginTimes = 0;
- m_FreeTimes = 0;
- m_ReposeTimes = 0;
- m_TalkTimes = 0;
- m_ReposeNum = 0;
- m_AnswerNum = 0;
- m_Groups.clear();
- m_Group = a_Group;
- boost::split(m_Groups, a_Group, boost::is_any_of("|"));
- __login();
- }
- Agent::~Agent()
- {
- }
- void Agent::removeAgent(std::string HostAgent)
- {
- m_TimeLogout = __getCurTime();
- m_LoginTimes = __subTime(m_TimeLogin, m_TimeLogout);
- __logout();
- setState(AGENT_STATE_LOGOUT);
- Format fmt("insert into agent_detail(AgentId,ExtId,TimeLogin,TimeLogout,LoginTimes,LogoutHost,GroupNo) values(%s,%s,'%s','%s',%lld,'%s','%s')");
- fmt %m_AgentID %m_Exten %__FormatTime(m_TimeLogin) % __FormatTime(m_TimeLogout) % m_LoginTimes %HostAgent %m_Group;
- SqlWrite::GetInstance()->addSql(fmt.str());
- }
- bool Agent::setState(AGENT_STATE a_AgentState)
- {
- __statistics(a_AgentState);
- switch (a_AgentState)
- {
- case AGENT_STATE_FREE:
- {
- m_IsRepose = false;
- }
- break;
- case AGENT_STATE_BUSY:
- {
- m_AnswerNum++;
- }
- break;
- case AGENT_STATE_REPOSE:
- {
- if (m_IsRepose) {
- m_ReposeNum++;
- }
- m_IsRepose = true;
- }
- break;
- case AGENT_STATE_REQUESTED:
- {
- if (m_State == AGENT_STATE_REQUESTED)
- return false;
- }
- break;
- default:
- break;
- }
-
- m_State = a_AgentState;
- Format fmt("insert into agent_state(agent,exten,cur_time,state,group_no) values('%s','%s','%s',%d,'%s')");
- fmt %m_AgentID %m_Exten %__FormatTime(__getCurTime()) % m_State %m_Group;
- SqlWrite::GetInstance()->addSql(fmt.str());
- return true;
- }
- std::string Agent::state_s()
- {
- std::string state;
- switch ((int)m_State)
- {
- case AGENT_STATE_FREE: // 空闲
- state = "空闲";
- break;
- case AGENT_STATE_BUSY: // 通话中
- state = "通话中";
- break;
- case AGENT_STATE_POST_PROCESSING:
- state = "话后处理";
- break;
- case AGENT_STATE_REPOSE: // 小休
- state = "小休";
- break;
- case AGENT_STATE_REQUESTED: // 被请求
- state = "振铃中";
- break;
- }
- return state;
- }
- bool Agent::__login()
- {
- setState(AGENT_STATE_LOGING);
- setState(AGENT_STATE_FREE);
- Format fmt("insert into agent(agent,exten,group_no) values('%s','%s','%s')");
- fmt %m_AgentID %m_Exten %m_Group;
- std::string sql;
- sql = fmt.str();
- int n = JdbcHelper::GetInstance()->jdbc_executeUpdate(sql, [](sql::PreparedStatement* stmt) {
- }, [sql](sql::SQLException &e) {
- Format fmt("Sql执行失败,错误信息:[%s],Sql[%s]");
- fmt % e.what() % sql;
- LOG_ERROR(fmt.str().c_str());
- return false;
- });
- return n > 0 ? true : false;
- }
- bool Agent::__logout()
- {
- Format fmt("delete from agent where agent = '%s'");
- fmt %m_AgentID;
- std::string sql;
- sql = fmt.str();
- JdbcHelper::GetInstance()->jdbc_executeUpdate(sql, [](sql::PreparedStatement* stmt) {
- }, [sql](sql::SQLException &e) {
- Format fmt("Sql执行失败,错误信息:[%s],Sql[%s]");
- fmt % e.what() % sql;
- LOG_ERROR(fmt.str().c_str());
- return false;
- });
- return true;
- }
- bool Agent::__statistics(AGENT_STATE a_AgentState)
- {
- ptime curTime = __getCurTime();
- std::string strSQL = "";
- if (a_AgentState == AGENT_STATE_LOGING) { // 登录时间不用赋值
- Format fmt("insert into agent_state_duration(AgentId, ExtId,GroupNo,LoginId, LoginTime,Talking,Free,Repose,ResposeCount) values('%s','%s','%s',%s,'%s',0,0,0,0)");
- fmt %m_AgentID %m_Exten %m_Group %loginID % __FormatTime(m_TimeLogin);
- SqlWrite::GetInstance()->addSql(fmt.str());
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s',%s)");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %a_AgentState %__FormatTime(m_TimeLogin) % "null";
- strSQL = str(fmt1);
- SqlWrite::GetInstance()->addSql(strSQL);
- return true;
- }
- else if (a_AgentState == AGENT_STATE_LOGOUT) { //签出时间不用赋值
- int64_t durtime = 0;
- std::string filed = "";
- curTime = m_TimeLogout;
- if (!ptStartTalk.is_not_a_date_time()) {
- durtime = __subTime(ptStartTalk, curTime);
- filed = str(Format("%1%=%1%+%2%") % "Talking"%durtime);
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_BUSY %__FormatTime(ptStartTalk) % __FormatTime(curTime);
- strSQL = str(fmt1);
- }
- else if (!ptStartFree.is_not_a_date_time()) {
- durtime = __subTime(ptStartFree, curTime);
- filed = str(Format("%1%=%1%+%2%") % "Free"%durtime);
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_FREE %__FormatTime(ptStartFree) % __FormatTime(curTime);
- strSQL = str(fmt1);
- }
- else if (!ptStartRepose.is_not_a_date_time()) {
- durtime = __subTime(ptStartRepose, curTime);
- filed = str(Format("%1%=%1%+%2%") % "Repose"%durtime);
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_REPOSE %__FormatTime(ptStartRepose) % __FormatTime(curTime);
- strSQL = str(fmt1);
- }
- if (durtime != 0 && filed != "") {
- Format fmt("update agent_state_duration set LogoutTime='%s',%s where AgentId='%s' and LoginId='%s'");
- fmt %__FormatTime(m_TimeLogout) % filed % m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- SqlWrite::GetInstance()->addSql(strSQL);
- }
- else {
- Format fmt("update agent_state_duration set LogoutTime='%s' where AgentId='%s' and LoginId='%s'");
- fmt %__FormatTime(m_TimeLogout) % m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- }
- // 更新签入状态的结束时间
- strSQL = str(Format("update agentState_Detail set TimeEnd='%s' where AgentId='%s' and LoginTime='%s' and Type=1 and TimeEnd is null") % __FormatTime(m_TimeLogout) % m_AgentID %loginID);
- SqlWrite::GetInstance()->addSql(strSQL);
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %a_AgentState %__FormatTime(m_TimeLogout) % __FormatTime(m_TimeLogout);
- SqlWrite::GetInstance()->addSql(fmt1.str());
- return true;
- }
-
- if (a_AgentState == AGENT_STATE_BUSY && m_State != AGENT_STATE_BUSY) { // 通话开始
- ptStartTalk = curTime;
- }
- if (a_AgentState != AGENT_STATE_BUSY && m_State == AGENT_STATE_BUSY) { // 通话结束
- if (ptStartTalk.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
- LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_BUSY);
- return false;
- }
- auto durtime = __subTime(ptStartTalk, curTime);
- m_TalkTimes += durtime;
- Format fmt("update agent_state_duration set Talking=Talking+%d where AgentId='%s' and LoginId='%s'");
- fmt %durtime %m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_BUSY %__FormatTime(ptStartTalk) % __FormatTime(curTime);
- SqlWrite::GetInstance()->addSql(fmt1.str());
- ptStartTalk = not_a_date_time;
- }
- if (a_AgentState == AGENT_STATE_REPOSE && !m_IsRepose) { // 小休开始
- ptStartRepose = curTime;
- Format fmt("update agent_state_duration set ResposeCount=ResposeCount+%d where AgentId='%s' and LoginId='%s'");
- fmt % 1 % m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- }
- if (a_AgentState == AGENT_STATE_FREE && m_IsRepose) { // 小休结束
- if (ptStartRepose.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
- LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_BUSY);
- return false;
- }
- auto durtime = __subTime(ptStartRepose, curTime);
- m_ReposeTimes += durtime;
- Format fmt("update agent_state_duration set Repose=Repose+%d where AgentId='%s' and LoginId='%s'");
- fmt %durtime %m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_REPOSE %__FormatTime(ptStartRepose) % __FormatTime(curTime);
- SqlWrite::GetInstance()->addSql(fmt1.str());
- ptStartRepose = not_a_date_time;
- }
- if (a_AgentState == AGENT_STATE_FREE && m_State != AGENT_STATE_FREE) { // 空闲开始
- ptStartFree = curTime;
- }
- if (a_AgentState != AGENT_STATE_FREE && m_State == AGENT_STATE_FREE) { // 空闲结束
- if (ptStartFree.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
- LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_FREE);
- return false;
- }
- auto durtime = __subTime(ptStartFree, curTime);
- m_FreeTimes += durtime;
- Format fmt("update agent_state_duration set Free=Free+%d where AgentId='%s' and LoginId='%s'");
- fmt %durtime %m_AgentID %loginID;
- SqlWrite::GetInstance()->addSql(fmt.str());
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_FREE %__FormatTime(ptStartFree) % __FormatTime(curTime);
- SqlWrite::GetInstance()->addSql(fmt1.str());
- ptStartFree = not_a_date_time;
- }
- if (a_AgentState == AGENT_STATE_REQUESTED && m_State != AGENT_STATE_REQUESTED) {
- ptStartRing = curTime;
- }
- if (a_AgentState != AGENT_STATE_REQUESTED && m_State == AGENT_STATE_REQUESTED) {
- if (ptStartRing.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
- LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_REQUESTED);
- return false;
- }
- Format fmt1("insert into agentState_Detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
- fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_REQUESTED %__FormatTime(ptStartRing) % __FormatTime(curTime);
- SqlWrite::GetInstance()->addSql(fmt1.str());
- ptStartRing = not_a_date_time;
- }
- return true;
- }
- std::string Agent::__FormatTime(ptime time)
- {
- std::string now = to_iso_extended_string(time);
- std::regex reg("T");
- return std::regex_replace(now, reg, " ");
- }
- std::string Agent::__FormatTimeV2(ptime time)
- {
- std::string now = to_iso_string(time);
- std::regex reg("T");
- return std::regex_replace(now, reg, "");
- }
- ptime Agent::__getCurTime()
- {
- return second_clock::local_time();
- }
- int64_t Agent::__subTime(ptime before, ptime after)
- {
- return (after - before).total_seconds();
- }
- //void Agent::onTimer()
- //{
- // switch (m_State)
- // {
- // case AGENT_STATE_FREE:
- // m_FreeTimes++;
- // break;
- // case AGENT_STATE_REPOSE:
- // m_ReposeTimes++;
- // break;
- // case AGENT_STATE_BUSY:
- // m_TalkTimes++;
- // break;
- // default:
- // break;
- // }
- //
- //}
|