#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; // } // //}