Bez popisu

SeatMonitoringController.cs 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407
  1. using CallCenter.Utility;
  2. using CallCenterApi.DB;
  3. using CallCenterApi.Interface.Controllers.Base;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Data;
  7. using System.Linq;
  8. using System.Web;
  9. using System.Web.Mvc;
  10. namespace CallCenterApi.Interface.Controllers.tel
  11. {
  12. //[Authority]
  13. public class SeatMonitoringController : BaseController
  14. {
  15. BLL.T_Sys_UserAccount Userbll = new BLL.T_Sys_UserAccount();
  16. BLL.T_Call_CallRecords callBLL = new BLL.T_Call_CallRecords();
  17. /// <summary>
  18. /// 获取坐席列表
  19. /// </summary>
  20. /// <returns></returns>
  21. public ActionResult GetList()
  22. {
  23. DataTable dt = new DataTable();
  24. dt = Userbll.GetList(" f_seatflag=1", "RIGHT(F_UserName ,1) asc").Tables[0];
  25. if (dt.Rows.Count > 0)
  26. {
  27. return Success("坐席列表加载成功", dt);
  28. }
  29. else
  30. {
  31. return Error("坐席列表加载失败");
  32. }
  33. }
  34. //坐席监控列表
  35. public ActionResult GetAgentList()
  36. {
  37. DataTable dtNew = new DataTable();
  38. #region 编辑表头
  39. DataColumn dc1 = new DataColumn("UserCode", Type.GetType("System.String"));//工号
  40. DataColumn dc2 = new DataColumn("UserName", Type.GetType("System.String"));//姓名
  41. DataColumn dc3 = new DataColumn("ExtNumber", Type.GetType("System.String"));//分机号
  42. DataColumn dc4 = new DataColumn("free", Type.GetType("System.String"));//空闲时长
  43. DataColumn dc5 = new DataColumn("repose", Type.GetType("System.String"));//置忙时长
  44. DataColumn dc6 = new DataColumn("talking", Type.GetType("System.String"));//通话时长
  45. DataColumn dc7 = new DataColumn("postprocess", Type.GetType("System.String"));//话后处理时长
  46. DataColumn dc8 = new DataColumn("reposeconut", Type.GetType("System.String"));//置忙次数
  47. DataColumn dc9 = new DataColumn("logcount", Type.GetType("System.String"));//登录次数
  48. DataColumn dc10 = new DataColumn("logintime", Type.GetType("System.String"));//签入时间
  49. DataColumn dc11 = new DataColumn("logtimes", Type.GetType("System.String"));//当前签入时长
  50. DataColumn dc12 = new DataColumn("callincount", Type.GetType("System.String"));//呼入量
  51. DataColumn dc13 = new DataColumn("calloutcount", Type.GetType("System.String"));//呼出量
  52. dtNew.Columns.Add(dc1);
  53. dtNew.Columns.Add(dc2);
  54. dtNew.Columns.Add(dc3);
  55. dtNew.Columns.Add(dc4);
  56. dtNew.Columns.Add(dc5);
  57. dtNew.Columns.Add(dc6);
  58. dtNew.Columns.Add(dc7);
  59. dtNew.Columns.Add(dc8);
  60. dtNew.Columns.Add(dc9);
  61. dtNew.Columns.Add(dc10);
  62. dtNew.Columns.Add(dc11);
  63. dtNew.Columns.Add(dc12);
  64. dtNew.Columns.Add(dc13);
  65. #endregion
  66. string sql = " select *,DATEDIFF(SECOND,LoginTime,GETDATE())times from rep_agentState_Duration where DATEDIFF(day,logintime,getdate())=0 and LogoutTime is null order by logintime ";
  67. string sql1 = " select AgentID,SUM(free) free,SUM(repose) repose,SUM(talking) talking,SUM(postprocess) postprocess,SUM(reposeconut) reposeconut,COUNT(1) logcount "
  68. + " from rep_agentState_Duration " + " where DATEDIFF(day, logintime, getdate()) = 0 " +
  69. " group by AgentID ";
  70. string sql2 = " select usercode,calltype,count(1) callcount from T_Call_CallRecords where DATEDIFF(day, begintime, getdate()) = 0 group by calltype,usercode ";
  71. DataTable dtagent = DbHelperSQL.Query(sql).Tables[0];
  72. DataTable dtCount = DbHelperSQL.Query(sql1).Tables[0];
  73. DataTable dtCall = DbHelperSQL.Query(sql2).Tables[0];
  74. List<Model.T_Sys_UserAccount> userList = Userbll.GetModelList(" f_seatflag=1 "," f_userid desc ");
  75. for (int i = 0; i < dtagent.Rows.Count; i++)
  76. {
  77. DataRow drNew = dtNew.NewRow();
  78. Model.T_Sys_UserAccount User = userList.Where(u => u.F_UserCode == dtagent.Rows[i]["AgentID"].ToString()).FirstOrDefault();
  79. if (User != null)
  80. drNew["UserName"] = User.F_UserName;
  81. else
  82. drNew["UserName"] = "";
  83. drNew["UserCode"] = dtagent.Rows[i]["AgentID"];
  84. drNew["ExtNumber"] = dtagent.Rows[i]["Exten"];
  85. drNew["logintime"] = Convert.ToDateTime(dtagent.Rows[i]["LoginTime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  86. drNew["logtimes"] = dtagent.Rows[i]["times"];
  87. drNew["free"] = "0";
  88. drNew["repose"] = "0";
  89. drNew["talking"] = "0";
  90. drNew["postprocess"] = "0";
  91. drNew["reposeconut"] = "0";
  92. drNew["logcount"] = "0";
  93. drNew["callincount"] = "0";
  94. drNew["calloutcount"] = "0";
  95. for (int j = 0; j < dtCount.Rows.Count; j++)
  96. {
  97. if (dtCount.Rows[j]["AgentID"].ToString() == dtagent.Rows[i]["AgentID"].ToString())
  98. {
  99. drNew["free"] = dtCount.Rows[j]["free"];
  100. drNew["repose"] = dtCount.Rows[j]["repose"];
  101. drNew["talking"] = dtCount.Rows[j]["talking"];
  102. drNew["postprocess"] = dtCount.Rows[j]["postprocess"];
  103. drNew["reposeconut"] = dtCount.Rows[j]["reposeconut"];
  104. drNew["logcount"] = dtCount.Rows[j]["logcount"];
  105. break;
  106. }
  107. }
  108. for (int z = 0; z < dtCall.Rows.Count; z++)
  109. {
  110. if (dtCall.Rows[z]["usercode"].ToString() == dtagent.Rows[i]["AgentID"].ToString())
  111. {
  112. if (dtCall.Rows[z]["calltype"].ToString() == "0")
  113. drNew["callincount"] = dtCall.Rows[z]["callcount"].ToString();
  114. if (dtCall.Rows[z]["calltype"].ToString() == "1")
  115. drNew["calloutcount"] = dtCall.Rows[z]["callcount"].ToString();
  116. }
  117. }
  118. var drnn = dtNew.Select("UserCode='" + dtagent.Rows[i]["AgentID"] + "'");
  119. if (drnn.Length > 0)
  120. {
  121. foreach (DataRow row in drnn)
  122. {
  123. row["logintime"] = drNew["logintime"];
  124. row["logtimes"] = drNew["logtimes"];
  125. row["free"] = drNew["free"];
  126. row["repose"] = drNew["repose"];
  127. row["talking"] = drNew["talking"];
  128. row["postprocess"] = drNew["postprocess"];
  129. row["reposeconut"] = drNew["reposeconut"];
  130. row["logcount"] = drNew["logcount"];
  131. row["callincount"] = drNew["callincount"];
  132. row["calloutcount"] = drNew["calloutcount"];
  133. }
  134. }
  135. else
  136. dtNew.Rows.Add(drNew);
  137. }
  138. return Success("坐席监控数据获取成功", dtNew);
  139. }
  140. //坐席监控报表
  141. public ActionResult GetReportList(string stime, string etime)
  142. {
  143. DataTable dtNew = new DataTable();
  144. dtNew = GetData(stime, etime);
  145. return Success("坐席监控报表获取", dtNew);
  146. }
  147. //获取数据源
  148. private DataTable GetData(string stime, string endtime)
  149. {
  150. DataTable dtNew = new DataTable();
  151. #region 编辑表头
  152. DataColumn dc0 = new DataColumn("Date", Type.GetType("System.String"));//工号
  153. DataColumn dc1 = new DataColumn("UserCode", Type.GetType("System.String"));//工号
  154. DataColumn dc2 = new DataColumn("UserName", Type.GetType("System.String"));//姓名
  155. DataColumn dc3 = new DataColumn("ExtNumber", Type.GetType("System.String"));//分机号
  156. DataColumn dc4 = new DataColumn("free", Type.GetType("System.String"));//空闲时长
  157. DataColumn dc5 = new DataColumn("repose", Type.GetType("System.String"));//置忙时长
  158. DataColumn dc6 = new DataColumn("talking", Type.GetType("System.String"));//通话时长
  159. DataColumn dc7 = new DataColumn("postprocess", Type.GetType("System.String"));//话后处理时长
  160. DataColumn dc8 = new DataColumn("reposeconut", Type.GetType("System.String"));//置忙次数
  161. DataColumn dc9 = new DataColumn("logcount", Type.GetType("System.String"));//登录次数
  162. DataColumn dc10 = new DataColumn("logintime", Type.GetType("System.String"));//签入时间
  163. DataColumn dc11 = new DataColumn("logouttime", Type.GetType("System.String"));//签出时间
  164. DataColumn dc12 = new DataColumn("logintimes", Type.GetType("System.String"));//签入总时长
  165. DataColumn dc13 = new DataColumn("callincount", Type.GetType("System.String"));//呼入量
  166. DataColumn dc14 = new DataColumn("calloutcount", Type.GetType("System.String"));//呼出量
  167. dtNew.Columns.Add(dc0);
  168. dtNew.Columns.Add(dc1);
  169. dtNew.Columns.Add(dc2);
  170. dtNew.Columns.Add(dc3);
  171. dtNew.Columns.Add(dc4);
  172. dtNew.Columns.Add(dc5);
  173. dtNew.Columns.Add(dc6);
  174. dtNew.Columns.Add(dc7);
  175. dtNew.Columns.Add(dc8);
  176. dtNew.Columns.Add(dc9);
  177. dtNew.Columns.Add(dc10);
  178. dtNew.Columns.Add(dc11);
  179. dtNew.Columns.Add(dc12);
  180. dtNew.Columns.Add(dc13);
  181. dtNew.Columns.Add(dc14);
  182. #endregion
  183. DateTime dts = DateTime.Now, dte = DateTime.Now;
  184. if (stime != null && stime.Trim() != "")
  185. {
  186. dts = DateTime.Parse(stime.Trim());
  187. }
  188. if (endtime != null && endtime.Trim() != "")
  189. {
  190. dte = DateTime.Parse(endtime.Trim());
  191. }
  192. List<Model.T_Sys_UserAccount> userList = Userbll.GetModelList(" f_seatflag=1 ","F_UserCode ");
  193. for (DateTime dt = dts; dt <= dte; dt = dt.AddDays(1))
  194. {
  195. string wh1 = " and DATEDIFF(second ,logintime,'" + dt.ToString("yyyy-MM-dd HH:mm:ss") + "')<=0 and DATEDIFF(day,logintime,'" + dte.ToString("yyyy-MM-dd HH:mm:ss") + "')>=0 ";
  196. string wh2 = " and DATEDIFF(second ,begintime,'" + dts.ToString("yyyy-MM-dd HH:mm:ss") + "')<=0 and DATEDIFF(day,begintime,'" + dte.ToString("yyyy-MM-dd HH:mm:ss") + "')>=0 ";
  197. string sql = " select * from rep_agentState_Duration where LogoutTime is not null " + wh1 + " order by AgentID asc, logintime desc ";
  198. string sql1 = " select AgentID,SUM(free) free,SUM(repose) repose,SUM(talking) talking,SUM(postprocess) postprocess,SUM(reposeconut) reposeconut,COUNT(1) logcount,SUM(DATEDIFF(second,logintime,logouttime)) logtimes "
  199. + " from rep_agentState_Duration where LogoutTime is not null" + wh1 + " group by AgentID order by AgentID ";
  200. string sql2 = " select usercode,calltype,count(1) callcount from T_Call_CallRecords where 1=1 " + wh2 + " group by calltype,usercode ";
  201. //string sql3 = "select AgentID,Exten,MIN(LoginTime) LoginTime,MAX(LogoutTime) LogoutTime from rep_agentState_Duration where LogoutTime is not null " + wh1 + " group by AgentID,Exten ";
  202. string sql3 = "select AgentID,MIN(LoginTime) LoginTime,MAX(LogoutTime) LogoutTime from rep_agentState_Duration where LogoutTime is not null " + wh1 + " group by AgentID ";
  203. string sql4 = " select AgentID,Exten from rep_agentState_Duration a " +
  204. "where LogoutTime is not null " + wh1 +
  205. "and ID = (select MAX(ID) from rep_agentState_Duration b where LogoutTime is not null " + wh1 +
  206. "and a.AgentID = b.AgentID group by AgentID) order by LoginTime desc";
  207. DataTable dtagent = DbHelperSQL.Query(sql3).Tables[0];
  208. DataTable dtExt = DbHelperSQL.Query(sql4).Tables[0];
  209. //DataTable dtagent = DbHelperSQL.Query(sql).Tables[0];
  210. DataTable dtCount = DbHelperSQL.Query(sql1).Tables[0];
  211. DataTable dtCall = DbHelperSQL.Query(sql2).Tables[0];
  212. foreach (Model.T_Sys_UserAccount item in userList)
  213. {
  214. DataRow drNew = dtNew.NewRow();
  215. drNew["Date"] = dt.ToString ("yyyy-MM-dd");
  216. drNew["UserCode"] = item.F_UserCode;
  217. drNew["UserName"] = item.F_UserName;
  218. #region 初始化
  219. drNew["ExtNumber"] = "";
  220. drNew["logintime"] = "";
  221. drNew["logouttime"] = "";
  222. drNew["logintimes"] = DateTimeConvert.parseTimeSeconds(int.Parse("0"), 0);
  223. drNew["free"] = DateTimeConvert.parseTimeSeconds(int.Parse("0"), 0);
  224. drNew["repose"] = DateTimeConvert.parseTimeSeconds(int.Parse("0"), 0);
  225. drNew["talking"] = DateTimeConvert.parseTimeSeconds(int.Parse("0"), 0);
  226. drNew["postprocess"] = DateTimeConvert.parseTimeSeconds(int.Parse("0"), 0);
  227. drNew["reposeconut"] = "0";
  228. drNew["logcount"] = "0";
  229. drNew["callincount"] = "0";
  230. drNew["calloutcount"] = "0";
  231. #endregion
  232. for (int j = 0; j < dtagent.Rows.Count; j++)
  233. {
  234. if (dtagent.Rows[j]["AgentID"].ToString() == item.F_UserCode)
  235. {
  236. //drNew["ExtNumber"] = dtagent.Rows[j]["Exten"];
  237. drNew["logintime"] = Convert.ToDateTime(dtagent.Rows[j]["LoginTime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  238. drNew["logouttime"] = Convert.ToDateTime(dtagent.Rows[j]["LogoutTime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss");
  239. break;
  240. }
  241. }
  242. for (int j = 0; j < dtExt.Rows.Count; j++)
  243. {
  244. if (dtExt.Rows[j]["AgentID"].ToString() == item.F_UserCode)
  245. {
  246. drNew["ExtNumber"] = dtExt.Rows[j]["Exten"];
  247. break;
  248. }
  249. }
  250. for (int j = 0; j < dtCount.Rows.Count; j++)
  251. {
  252. if (dtCount.Rows[j]["AgentID"].ToString() == item.F_UserCode)
  253. {
  254. drNew["free"] = DateTimeConvert.parseTimeSeconds(int.Parse(dtCount.Rows[j]["free"].ToString()), 0);
  255. drNew["repose"] = DateTimeConvert.parseTimeSeconds(int.Parse(dtCount.Rows[j]["repose"].ToString()), 0);
  256. drNew["talking"] = DateTimeConvert.parseTimeSeconds(int.Parse(dtCount.Rows[j]["talking"].ToString()), 0);
  257. drNew["postprocess"] = DateTimeConvert.parseTimeSeconds(int.Parse(dtCount.Rows[j]["postprocess"].ToString()), 0);
  258. drNew["reposeconut"] = dtCount.Rows[j]["reposeconut"];
  259. drNew["logcount"] = dtCount.Rows[j]["logcount"];
  260. drNew["logintimes"] = DateTimeConvert.parseTimeSeconds(int.Parse(dtCount.Rows[j]["logtimes"].ToString()), 0);
  261. break;
  262. }
  263. }
  264. for (int z = 0; z < dtCall.Rows.Count; z++)
  265. {
  266. if (dtCall.Rows[z]["usercode"].ToString() == item.F_UserCode)
  267. {
  268. if (dtCall.Rows[z]["calltype"].ToString() == "0")
  269. drNew["callincount"] = dtCall.Rows[z]["callcount"].ToString();
  270. if (dtCall.Rows[z]["calltype"].ToString() == "1")
  271. drNew["calloutcount"] = dtCall.Rows[z]["callcount"].ToString();
  272. }
  273. }
  274. dtNew.Rows.Add(drNew);
  275. }
  276. }
  277. return dtNew;
  278. }
  279. private string[] getcols()
  280. {
  281. return new string[] { "日期","工号", "姓名", "分机号", "空闲时长", "置忙时长", "通话时长", "话后处理时长", "置忙次数", "登录次数", "签入时间", "签出时间", "签入总时长", "呼入量", "呼出量" };
  282. }
  283. //导出数据
  284. public ActionResult ExptList(string stime, string endtime)
  285. {
  286. NPOIHelper npoi = new NPOIHelper();
  287. DataTable dt = GetData(stime, endtime);
  288. if (npoi.ExportToExcel("坐席考勤报表", dt, getcols()) == "")
  289. {
  290. return Success("导出成功");
  291. }
  292. else
  293. {
  294. return Error("导出失败");
  295. }
  296. }
  297. /// <summary>
  298. /// 坐席考勤详细报表
  299. /// </summary>
  300. /// <param name="stime"></param>
  301. /// <param name="etime"></param>
  302. /// <returns></returns>
  303. public ActionResult GetReportDetailList(int isdc=0)
  304. {
  305. string strusercode = HttpUtility.UrlDecode(RequestString.GetQueryString("usercode"));
  306. string strstarttime = HttpUtility.UrlDecode(RequestString.GetQueryString("stime"));
  307. string strendtime = HttpUtility.UrlDecode(RequestString.GetQueryString("etime"));
  308. string strpageindex = RequestString.GetQueryString("page");
  309. int pageindex = 1;
  310. string strpagesize = RequestString.GetQueryString("pagesize");
  311. int pagesize = 10;
  312. string sqlwhere = "";
  313. if (strusercode.Trim() != "" && strusercode != "undefined")
  314. {
  315. sqlwhere += " and UserCode = '" + strusercode.Trim() + "' ";
  316. }
  317. if (strstarttime.Trim() != "" && strstarttime != "undefined")
  318. {
  319. sqlwhere += " and datediff(day,logintime,'" + strstarttime + "')<=0 ";
  320. }
  321. if (strendtime.Trim() != "" && strendtime != "undefined")
  322. {
  323. sqlwhere += " and datediff(day,logintime,'" + strendtime + "')>=0 ";
  324. }
  325. if (isdc > 0)
  326. {
  327. string[] cols= new string[] { "工号", "姓名", "分机号", "签入时间", "签出时间", "签入总时长", "空闲时长", "置忙时长", "通话时长", "话后处理时长", "置忙次数", "呼入量", "呼出量" };
  328. var dtdc = DbHelperSQL.Query(" select * from V_Tel_SeatWork where 1=1 " + sqlwhere).Tables[0];
  329. dtdc.Columns.Remove("ID");
  330. var msg = new NPOIHelper().ExportToExcel("坐席考勤详细报表", dtdc, cols);
  331. if (msg == "")
  332. {
  333. return Success("导出成功");
  334. }
  335. else
  336. {
  337. return Error("导出失败");
  338. }
  339. }
  340. if (strpageindex.Trim() != "")
  341. {
  342. pageindex = Convert.ToInt32(strpageindex);
  343. }
  344. if (strpagesize.Trim() != "")
  345. {
  346. pagesize = Convert.ToInt32(strpagesize);
  347. }
  348. int recordCount = 0;
  349. var dt = BLL.PagerBLL.GetListPager(
  350. "V_Tel_SeatWork",
  351. "ID",
  352. "*",
  353. sqlwhere,
  354. "ORDER BY UserCode,logintime",
  355. pagesize,
  356. pageindex,
  357. true,
  358. out recordCount);
  359. var obj = new
  360. {
  361. state = "success",
  362. message = "成功",
  363. rows = dt,
  364. total = recordCount
  365. };
  366. return Content(obj.ToJson());
  367. }
  368. }
  369. }