linux版本中间件

Agent.cpp 12KB

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