linux版本中间件

Agent.cpp 12KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366
  1. #include "Agent.h"
  2. #include "SqlWrite.h"
  3. #include "JdbcHelper.h"
  4. 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)
  5. {
  6. m_TimeLogin = __getCurTime();
  7. ptStartTalk = not_a_date_time; // 通话开始时间
  8. //ptStartFree = not_a_date_time; // 空闲开始时间
  9. ptStartFree = m_TimeLogin; // 登录后默认空闲状态
  10. ptStartRepose = not_a_date_time;// 小休开始时间
  11. ptStartRing = not_a_date_time; // 振铃开始时间
  12. loginID = __FormatTimeV2(m_TimeLogin);
  13. m_LoginTimes = 0;
  14. m_FreeTimes = 0;
  15. m_ReposeTimes = 0;
  16. m_TalkTimes = 0;
  17. m_ReposeNum = 0;
  18. m_AnswerNum = 0;
  19. __login();
  20. }
  21. 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)
  22. {
  23. m_TimeLogin = __getCurTime();
  24. ptStartTalk = not_a_date_time; // 通话开始时间
  25. //ptStartFree = not_a_date_time; // 空闲开始时间
  26. ptStartFree = m_TimeLogin; // 登录后默认空闲状态
  27. ptStartRepose = not_a_date_time;// 小休开始时间
  28. ptStartRing = not_a_date_time; // 振铃开始时间
  29. loginID = __FormatTimeV2(m_TimeLogin);
  30. m_LoginTimes = 0;
  31. m_FreeTimes = 0;
  32. m_ReposeTimes = 0;
  33. m_TalkTimes = 0;
  34. m_ReposeNum = 0;
  35. m_AnswerNum = 0;
  36. m_Groups.clear();
  37. m_Group = a_Group;
  38. boost::split(m_Groups, a_Group, boost::is_any_of("|"));
  39. __login();
  40. }
  41. Agent::~Agent()
  42. {
  43. }
  44. void Agent::removeAgent(std::string HostAgent)
  45. {
  46. m_TimeLogout = __getCurTime();
  47. m_LoginTimes = __subTime(m_TimeLogin, m_TimeLogout);
  48. __logout();
  49. setState(AGENT_STATE_LOGOUT);
  50. Format fmt("insert into rep_agent_detail(AgentId,ExtId,TimeLogin,TimeLogout,LoginTimes,LogoutHost,GroupNo) values(%s,%s,'%s','%s',%lld,'%s','%s')");
  51. fmt %m_AgentID %m_Exten %__FormatTime(m_TimeLogin) % __FormatTime(m_TimeLogout) % m_LoginTimes %HostAgent %m_Group;
  52. SqlWrite::GetInstance()->addSql(fmt.str());
  53. }
  54. bool Agent::setState(AGENT_STATE a_AgentState)
  55. {
  56. m_bVideoLock = false; // 取消视频请求锁定状态,其它状态可以保证该坐席不会被分配
  57. __statistics(a_AgentState);
  58. switch (a_AgentState)
  59. {
  60. case AGENT_STATE_FREE:
  61. {
  62. m_IsRepose = false;
  63. }
  64. break;
  65. case AGENT_STATE_BUSY:
  66. {
  67. m_AnswerNum++;
  68. }
  69. break;
  70. case AGENT_STATE_REPOSE:
  71. {
  72. if (m_IsRepose) {
  73. m_ReposeNum++;
  74. }
  75. m_IsRepose = true;
  76. }
  77. break;
  78. case AGENT_STATE_REQUESTED:
  79. {
  80. if (m_State == AGENT_STATE_REQUESTED)
  81. return false;
  82. }
  83. break;
  84. default:
  85. break;
  86. }
  87. m_State = a_AgentState;
  88. Format fmt("insert into rep_agent_state(agent,exten,cur_time,state,group_no) values('%s','%s','%s',%d,'%s')");
  89. fmt %m_AgentID %m_Exten %__FormatTime(__getCurTime()) % m_State %m_Group;
  90. SqlWrite::GetInstance()->addSql(fmt.str());
  91. return true;
  92. }
  93. std::string Agent::state_s()
  94. {
  95. std::string state;
  96. switch ((int)m_State)
  97. {
  98. case AGENT_STATE_FREE: // 空闲
  99. state = "空闲";
  100. break;
  101. case AGENT_STATE_BUSY: // 通话中
  102. state = "通话中";
  103. break;
  104. case AGENT_STATE_POST_PROCESSING:
  105. state = "话后处理";
  106. break;
  107. case AGENT_STATE_REPOSE: // 小休
  108. state = "小休";
  109. break;
  110. case AGENT_STATE_REQUESTED: // 被请求
  111. state = "振铃中";
  112. break;
  113. }
  114. return state;
  115. }
  116. bool Agent::__login()
  117. {
  118. setState(AGENT_STATE_LOGING);
  119. setState(AGENT_STATE_FREE);
  120. Format fmt("insert into rep_agent(agent,exten,group_no) values('%s','%s','%s')");
  121. fmt %m_AgentID %m_Exten %m_Group;
  122. std::string sql;
  123. sql = fmt.str();
  124. SqlWrite::GetInstance()->addSql(sql);
  125. return true;
  126. /*int n = JdbcHelper::GetInstance()->jdbc_executeUpdate(sql,nullptr, [sql](sql::SQLException &e) {
  127. Format fmt("Sql执行失败,错误信息:[%s],Sql[%s]");
  128. fmt % e.what() % sql;
  129. LOG_ERROR(fmt.str().c_str());
  130. return false;
  131. });
  132. return n > 0 ? true : false;*/
  133. }
  134. bool Agent::__logout()
  135. {
  136. Format fmt("delete from rep_agent where agent = '%s'");
  137. fmt %m_AgentID;
  138. std::string sql;
  139. sql = fmt.str();
  140. SqlWrite::GetInstance()->addSql(sql);
  141. /*JdbcHelper::GetInstance()->jdbc_executeUpdate(sql, [](sql::PreparedStatement* stmt) {
  142. }, [sql](sql::SQLException &e) {
  143. Format fmt("Sql执行失败,错误信息:[%s],Sql[%s]");
  144. fmt % e.what() % sql;
  145. LOG_ERROR(fmt.str().c_str());
  146. return false;
  147. });*/
  148. return true;
  149. }
  150. bool Agent::__statistics(AGENT_STATE a_AgentState)
  151. {
  152. ptime curTime = __getCurTime();
  153. std::string strSQL = "";
  154. if (a_AgentState == AGENT_STATE_LOGING) { // 登录时间不用赋值
  155. Format fmt("insert into rep_agent_state_duration(AgentId, ExtId,GroupNo,LoginId, LoginTime,Talking,Free,Repose,ResposeCount) values('%s','%s','%s',%s,'%s',0,0,0,0)");
  156. fmt %m_AgentID %m_Exten %m_Group %loginID % __FormatTime(m_TimeLogin);
  157. SqlWrite::GetInstance()->addSql(fmt.str());
  158. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s',%s)");
  159. fmt1 %m_AgentID %m_Exten %m_Group %loginID %a_AgentState %__FormatTime(m_TimeLogin) % "null";
  160. strSQL = str(fmt1);
  161. SqlWrite::GetInstance()->addSql(strSQL);
  162. return true;
  163. }
  164. else if (a_AgentState == AGENT_STATE_LOGOUT) { //签出时间不用赋值
  165. int64_t durtime = 0;
  166. std::string filed = "";
  167. curTime = m_TimeLogout;
  168. if (!ptStartTalk.is_not_a_date_time()) {
  169. durtime = __subTime(ptStartTalk, curTime);
  170. filed = str(Format("%1%=%1%+%2%") % "Talking"%durtime);
  171. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  172. fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_BUSY %__FormatTime(ptStartTalk) % __FormatTime(curTime);
  173. strSQL = str(fmt1);
  174. }
  175. else if (!ptStartFree.is_not_a_date_time()) {
  176. durtime = __subTime(ptStartFree, curTime);
  177. filed = str(Format("%1%=%1%+%2%") % "Free"%durtime);
  178. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  179. fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_FREE %__FormatTime(ptStartFree) % __FormatTime(curTime);
  180. strSQL = str(fmt1);
  181. }
  182. else if (!ptStartRepose.is_not_a_date_time()) {
  183. durtime = __subTime(ptStartRepose, curTime);
  184. filed = str(Format("%1%=%1%+%2%") % "Repose"%durtime);
  185. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  186. fmt1 %m_AgentID %m_Exten %m_Group %loginID % AGENT_STATE_REPOSE %__FormatTime(ptStartRepose) % __FormatTime(curTime);
  187. strSQL = str(fmt1);
  188. }
  189. if (durtime != 0 && filed != "") {
  190. Format fmt("update rep_agent_state_duration set LogoutTime='%s',%s where AgentId='%s' and LoginId='%s'");
  191. fmt %__FormatTime(m_TimeLogout) % filed % m_AgentID %loginID;
  192. SqlWrite::GetInstance()->addSql(fmt.str());
  193. SqlWrite::GetInstance()->addSql(strSQL);
  194. }
  195. else {
  196. Format fmt("update rep_agent_state_duration set LogoutTime='%s' where AgentId='%s' and LoginId='%s'");
  197. fmt %__FormatTime(m_TimeLogout) % m_AgentID %loginID;
  198. SqlWrite::GetInstance()->addSql(fmt.str());
  199. }
  200. // 更新签入状态的结束时间
  201. strSQL = str(Format("update rep_agentstate_detail set TimeEnd='%s' where AgentId='%s' and LoginTime='%s' and Type=1 and TimeEnd is null") % __FormatTime(m_TimeLogout) % m_AgentID %loginID);
  202. SqlWrite::GetInstance()->addSql(strSQL);
  203. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  204. fmt1 %m_AgentID %m_Exten %m_Group %loginID %a_AgentState %__FormatTime(m_TimeLogout) % __FormatTime(m_TimeLogout);
  205. SqlWrite::GetInstance()->addSql(fmt1.str());
  206. return true;
  207. }
  208. if (a_AgentState == AGENT_STATE_BUSY && m_State != AGENT_STATE_BUSY) { // 通话开始
  209. ptStartTalk = curTime;
  210. }
  211. if (a_AgentState != AGENT_STATE_BUSY && m_State == AGENT_STATE_BUSY) { // 通话结束
  212. if (ptStartTalk.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
  213. LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_BUSY);
  214. return false;
  215. }
  216. auto durtime = __subTime(ptStartTalk, curTime);
  217. m_TalkTimes += durtime;
  218. Format fmt("update rep_agent_state_duration set Talking=Talking+%d where AgentId='%s' and LoginId='%s'");
  219. fmt %durtime %m_AgentID %loginID;
  220. SqlWrite::GetInstance()->addSql(fmt.str());
  221. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  222. fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_BUSY %__FormatTime(ptStartTalk) % __FormatTime(curTime);
  223. SqlWrite::GetInstance()->addSql(fmt1.str());
  224. ptStartTalk = not_a_date_time;
  225. }
  226. if (a_AgentState == AGENT_STATE_REPOSE && !m_IsRepose) { // 小休开始
  227. ptStartRepose = curTime;
  228. Format fmt("update rep_agent_state_duration set ResposeCount=ResposeCount+%d where AgentId='%s' and LoginId='%s'");
  229. fmt % 1 % m_AgentID %loginID;
  230. SqlWrite::GetInstance()->addSql(fmt.str());
  231. }
  232. if (a_AgentState == AGENT_STATE_FREE && m_IsRepose) { // 小休结束
  233. if (ptStartRepose.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
  234. LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_BUSY);
  235. return false;
  236. }
  237. auto durtime = __subTime(ptStartRepose, curTime);
  238. m_ReposeTimes += durtime;
  239. Format fmt("update rep_agent_state_duration set Repose=Repose+%d where AgentId='%s' and LoginId='%s'");
  240. fmt %durtime %m_AgentID %loginID;
  241. SqlWrite::GetInstance()->addSql(fmt.str());
  242. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  243. fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_REPOSE %__FormatTime(ptStartRepose) % __FormatTime(curTime);
  244. SqlWrite::GetInstance()->addSql(fmt1.str());
  245. ptStartRepose = not_a_date_time;
  246. }
  247. if (a_AgentState == AGENT_STATE_FREE && m_State != AGENT_STATE_FREE) { // 空闲开始
  248. ptStartFree = curTime;
  249. }
  250. if (a_AgentState != AGENT_STATE_FREE && m_State == AGENT_STATE_FREE) { // 空闲结束
  251. if (ptStartFree.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
  252. LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_FREE);
  253. return false;
  254. }
  255. auto durtime = __subTime(ptStartFree, curTime);
  256. m_FreeTimes += durtime;
  257. Format fmt("update rep_agent_state_duration set Free=Free+%d where AgentId='%s' and LoginId='%s'");
  258. fmt %durtime %m_AgentID %loginID;
  259. SqlWrite::GetInstance()->addSql(fmt.str());
  260. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  261. fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_FREE %__FormatTime(ptStartFree) % __FormatTime(curTime);
  262. SqlWrite::GetInstance()->addSql(fmt1.str());
  263. ptStartFree = not_a_date_time;
  264. }
  265. if (a_AgentState == AGENT_STATE_REQUESTED && m_State != AGENT_STATE_REQUESTED) {
  266. ptStartRing = curTime;
  267. }
  268. if (a_AgentState != AGENT_STATE_REQUESTED && m_State == AGENT_STATE_REQUESTED) {
  269. if (ptStartRing.is_not_a_date_time()) { // 状态开始时间无效,不进行计算
  270. LOG_WARN("状态[%d]开始时间无效", AGENT_STATE_REQUESTED);
  271. return false;
  272. }
  273. Format fmt1("insert into rep_agentstate_detail(AgentId,ExtId,GroupNo,LoginTime,Type,TimeStart,TimeEnd) values('%s','%s','%s','%s',%d,'%s','%s')");
  274. fmt1 %m_AgentID %m_Exten %m_Group %loginID %AGENT_STATE_REQUESTED %__FormatTime(ptStartRing) % __FormatTime(curTime);
  275. SqlWrite::GetInstance()->addSql(fmt1.str());
  276. ptStartRing = not_a_date_time;
  277. }
  278. return true;
  279. }
  280. std::string Agent::__FormatTime(ptime time)
  281. {
  282. std::string now = to_iso_extended_string(time);
  283. std::regex reg("T");
  284. return std::regex_replace(now, reg, " ");
  285. }
  286. std::string Agent::__FormatTimeV2(ptime time)
  287. {
  288. std::string now = to_iso_string(time);
  289. std::regex reg("T");
  290. return std::regex_replace(now, reg, "");
  291. }
  292. ptime Agent::__getCurTime()
  293. {
  294. return second_clock::local_time();
  295. }
  296. int64_t Agent::__subTime(ptime before, ptime after)
  297. {
  298. return (after - before).total_seconds();
  299. }
  300. //void Agent::onTimer()
  301. //{
  302. // switch (m_State)
  303. // {
  304. // case AGENT_STATE_FREE:
  305. // m_FreeTimes++;
  306. // break;
  307. // case AGENT_STATE_REPOSE:
  308. // m_ReposeTimes++;
  309. // break;
  310. // case AGENT_STATE_BUSY:
  311. // m_TalkTimes++;
  312. // break;
  313. // default:
  314. // break;
  315. // }
  316. //
  317. //}