No Description

TalkTimeController.cs 18KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390
  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.report
  11. {
  12. // [Authority]
  13. public class TalkTimeController : BaseController
  14. {
  15. //通话时长统计
  16. //获取表头
  17. public ActionResult GetColumnList()
  18. {
  19. ActionResult res = NoToken("未知错误,请重新登录");
  20. String[] str = { "坐席名称", "呼入次数", "呼入时长", "呼出次数", "呼出时长", "呼出未接通次数", "振铃时长", "通话总时长", "平均通话时长" };
  21. res = Success("获取通话时长统计表头成功", str);
  22. return res;
  23. }
  24. //获取数据
  25. public ActionResult GetDataList(string stime, string endtime, string dpt)
  26. {
  27. ActionResult res = NoToken("未知错误,请重新登录");
  28. DataTable dtNew = new DataTable();
  29. dtNew = GetData(stime, endtime, dpt);
  30. #region
  31. //DataTable dtNew = new DataTable();
  32. //#region 编辑表头
  33. //DataColumn dc1 = new DataColumn("坐席名称", Type.GetType("System.String"));
  34. //DataColumn dc2 = new DataColumn("呼入次数", Type.GetType("System.String"));
  35. //DataColumn dc3 = new DataColumn("呼入时长", Type.GetType("System.String"));
  36. //DataColumn dc4 = new DataColumn("呼出次数", Type.GetType("System.String"));
  37. //DataColumn dc5 = new DataColumn("呼出时长", Type.GetType("System.String"));
  38. //DataColumn dc6 = new DataColumn("呼出未接通次数", Type.GetType("System.String"));
  39. //DataColumn dc7 = new DataColumn("振铃时长", Type.GetType("System.String"));
  40. //DataColumn dc8 = new DataColumn("通话总时长", Type.GetType("System.String"));
  41. //DataColumn dc9 = new DataColumn("平均通话总时长", Type.GetType("System.String"));
  42. //dtNew.Columns.Add(dc1);
  43. //dtNew.Columns.Add(dc2);
  44. //dtNew.Columns.Add(dc3);
  45. //dtNew.Columns.Add(dc4);
  46. //dtNew.Columns.Add(dc5);
  47. //dtNew.Columns.Add(dc6);
  48. //dtNew.Columns.Add(dc7);
  49. //dtNew.Columns.Add(dc8);
  50. //dtNew.Columns.Add(dc9);
  51. //#endregion
  52. //string[] CallInTime = GetCallRecordIn(stime, endtime, "0").TrimStart('[').TrimEnd(']').Split(',');
  53. //string[] CallInTimes = GetCallRecordTotalTime(stime, endtime, "0").TrimStart('[').TrimEnd(']').Split(',');
  54. //string[] CallOutTime = GetCallRecordOut(stime, endtime, "1","").TrimStart('[').TrimEnd(']').Split(',');
  55. //string[] CallOutTimes = GetCallRecordTotalTime(stime, endtime, "1").TrimStart('[').TrimEnd(']').Split(',');
  56. //string[] CallOutWTime = GetCallRecordOut(stime, endtime, "1", "0").TrimStart('[').TrimEnd(']').Split(',');
  57. //string[] CallOutWTimes = GetCallRecordRingTime(stime, endtime).TrimStart('[').TrimEnd(']').Split(',');
  58. //string[] CallTotalTime = GetCallRecordTotalTime(stime, endtime, "").TrimStart('[').TrimEnd(']').Split(',');
  59. //string[] AgentArr = GetAgent().TrimStart('[').TrimEnd(']').Split(',');
  60. //string[] AverageTime = GetCallAverageTime(stime, endtime).TrimStart('[').TrimEnd(']').Split(',');
  61. //for (int i = 0; i < AgentArr.Length; i++)
  62. //{
  63. // DataRow drNew = dtNew.NewRow();
  64. // drNew["坐席名称"] = AgentArr[i].Replace('\'', ' ');
  65. // drNew["呼入次数"] = CallInTime[i];
  66. // drNew["呼入时长"] = CallInTimes[i];
  67. // drNew["呼出次数"] = CallOutTime[i];
  68. // drNew["呼出时长"] = CallOutTimes[i];
  69. // drNew["呼出未接通次数"] = CallOutWTime[i];
  70. // drNew["振铃时长"] = CallOutWTimes[i];
  71. // drNew["通话总时长"] = CallTotalTime[i];
  72. // drNew["平均通话总时长"] = AverageTime[i];
  73. // dtNew.Rows.Add(drNew);
  74. //}
  75. #endregion
  76. res = Success("获取通话时长数据成功", dtNew);
  77. return res;
  78. }
  79. //导出数据
  80. public ActionResult ExptList(string stime, string endtime, string dpt)
  81. {
  82. ActionResult res = NoToken("未知错误,请重新登录");
  83. if (Request.IsAuthenticated)
  84. {
  85. NPOIHelper npoi = new NPOIHelper();
  86. DataTable dt = GetData(stime, endtime, dpt);
  87. if (npoi.ExportToExcel("通话时长数据", dt) == "")
  88. {
  89. return Success("导出成功");
  90. }
  91. else
  92. {
  93. return Error("导出失败");
  94. }
  95. }
  96. return res;
  97. }
  98. //获取数据源
  99. private DataTable GetData(string stime, string endtime, string dpt)
  100. {
  101. DataTable dtNew = new DataTable();
  102. #region 编辑表头
  103. DataColumn dc1 = new DataColumn("坐席名称", Type.GetType("System.String"));
  104. DataColumn dc2 = new DataColumn("呼入次数", Type.GetType("System.String"));
  105. DataColumn dc3 = new DataColumn("呼入时长", Type.GetType("System.String"));
  106. DataColumn dc4 = new DataColumn("呼出次数", Type.GetType("System.String"));
  107. DataColumn dc5 = new DataColumn("呼出时长", Type.GetType("System.String"));
  108. DataColumn dc6 = new DataColumn("呼出未接通次数", Type.GetType("System.String"));
  109. DataColumn dc7 = new DataColumn("振铃时长", Type.GetType("System.String"));
  110. DataColumn dc8 = new DataColumn("通话总时长", Type.GetType("System.String"));
  111. DataColumn dc9 = new DataColumn("平均通话总时长", Type.GetType("System.String"));
  112. dtNew.Columns.Add(dc1);
  113. dtNew.Columns.Add(dc2);
  114. dtNew.Columns.Add(dc3);
  115. dtNew.Columns.Add(dc4);
  116. dtNew.Columns.Add(dc5);
  117. dtNew.Columns.Add(dc6);
  118. dtNew.Columns.Add(dc7);
  119. dtNew.Columns.Add(dc8);
  120. dtNew.Columns.Add(dc9);
  121. #endregion
  122. string[] CallInTime = GetCallRecordIn(stime, endtime, "0", dpt).TrimStart('[').TrimEnd(']').Split(',');
  123. string[] CallInTimes = GetCallRecordTotalTime(stime, endtime, "0", dpt).TrimStart('[').TrimEnd(']').Split(',');
  124. string[] CallOutTime = GetCallRecordOut(stime, endtime, "1", "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  125. string[] CallOutTimes = GetCallRecordTotalTime(stime, endtime, "1", dpt).TrimStart('[').TrimEnd(']').Split(',');
  126. string[] CallOutWTime = GetCallRecordOut(stime, endtime, "1", "0", dpt).TrimStart('[').TrimEnd(']').Split(',');
  127. string[] CallOutWTimes = GetCallRecordRingTime(stime, endtime, dpt).TrimStart('[').TrimEnd(']').Split(',');
  128. string[] CallTotalTime = GetCallRecordTotalTime(stime, endtime, "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  129. string[] AgentArr = GetAgent().TrimStart('[').TrimEnd(']').Split(',');
  130. string[] AverageTime = GetCallAverageTime(stime, endtime, dpt).TrimStart('[').TrimEnd(']').Split(',');
  131. for (int i = 0; i < AgentArr.Length; i++)
  132. {
  133. DataRow drNew = dtNew.NewRow();
  134. drNew["坐席名称"] = AgentArr[i].Replace('\'', ' ');
  135. drNew["呼入次数"] = CallInTime[i];
  136. drNew["呼入时长"] = CallInTimes[i];
  137. drNew["呼出次数"] = CallOutTime[i];
  138. drNew["呼出时长"] = CallOutTimes[i];
  139. drNew["呼出未接通次数"] = CallOutWTime[i];
  140. drNew["振铃时长"] = CallOutWTimes[i];
  141. drNew["通话总时长"] = CallTotalTime[i];
  142. drNew["平均通话总时长"] = AverageTime[i];
  143. dtNew.Rows.Add(drNew);
  144. }
  145. return dtNew;
  146. }
  147. #region
  148. /// <summary>
  149. /// 获取坐席的呼出次数
  150. /// </summary>
  151. /// <param name="BeginTime">开始时间</param>
  152. /// <param name="EndTime">结束时间</param>
  153. /// <param name="Tag">1表示呼出,0表示呼入</param>
  154. /// <returns></returns>
  155. public string GetCallRecordOut(string BeginTime, string EndTime, string Tag, string state, string dpt)
  156. {
  157. return GetHighChartData(BeginTime, EndTime, Tag, state, dpt);
  158. }
  159. /// <summary>
  160. /// 获取通话总时长
  161. /// </summary>
  162. /// <param name="BeginTime">开始时间</param>
  163. /// <param name="EndTime">结束时间</param>
  164. /// <returns></returns>
  165. public string GetCallRecordTotalTime(string BeginTime, string EndTime, string tag, string dpt)
  166. {
  167. string result = "[";
  168. string sql = "";
  169. if (BeginTime != null && BeginTime != "")
  170. {
  171. sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  172. }
  173. if (EndTime != null && EndTime != "")
  174. {
  175. sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  176. }
  177. if (dpt != null && dpt.Trim() != "")
  178. {
  179. sql += $" AND UserCode IN (SELECT F_UserCode FROM dbo.T_Sys_UserAccount WHERE F_DeptId = {dpt} AND f_seatFlag=1 and F_WorkNumber!='') ";
  180. }
  181. if (tag != "")
  182. {
  183. sql += " and CallType=" + tag;
  184. }
  185. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  186. //DataTable dt = DbHelperSQL.Query("SELECT UserId,UserCode,UserName,COUNT(*) AS calloutCount,SUM(TalkLongTime) AS TalkSummaryTime FROM T_Call_CallRecords where 1=1 " + sql + " GROUP BY UserId,UserCode,UserName").Tables[0];
  187. //DataTable dt = DbHelperSQL.Query("SELECT UserId,UserCode,UserName,COUNT(*) AS calloutCount FROM T_Call_CallRecords where 1=1 " + sql + " GROUP BY UserId,UserCode,UserName").Tables[0];
  188. var recordstr = " select users.F_UserId,users.F_UserCode,users.F_UserName,COUNT(*) AS calloutCount,SUM(TalkLongTime) AS TalkSummaryTime from T_Sys_UserAccount users left join T_Call_CallRecords records on users.F_UserCode = records.UserCode and 1=1 " + sql + " GROUP BY users.F_UserId,users.F_UserCode,users.F_UserName";
  189. DataTable dt = DbHelperSQL.Query(recordstr).Tables[0];
  190. foreach (Model.T_Sys_UserAccount item in userAccountList)
  191. {
  192. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("F_UserCode") == item.F_UserCode);
  193. if (drUser != null && drUser[4].ToString() != "")
  194. result += drUser[4].ToString() + ",";
  195. else
  196. result += "0,";
  197. }
  198. result = result.TrimEnd(',');
  199. return result + "]";
  200. }
  201. /// <summary>
  202. /// 获取坐席名称(x轴数据)
  203. /// </summary>
  204. /// <returns></returns>
  205. public string GetAgent()
  206. {
  207. string result = "[";
  208. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  209. foreach (Model.T_Sys_UserAccount item in userAccountList)
  210. {
  211. result += "'" + item.F_UserName + "',";
  212. }
  213. result = result.TrimEnd(',');
  214. return result + "]";
  215. }
  216. /// <summary>
  217. /// 获取通话平均时长
  218. /// </summary>
  219. /// <param name="BeginTime">开始时间</param>
  220. /// <param name="EndTime">结束时间</param>
  221. /// <returns></returns>
  222. public string GetCallAverageTime(string BeginTime, string EndTime, string dpt)
  223. {
  224. string result = "[";
  225. string[] CallInTime = GetCallRecordIn(BeginTime, EndTime, "0", dpt).TrimStart('[').TrimEnd(']').Split(',');
  226. string[] CallOutTime = GetCallRecordOut(BeginTime, EndTime, "1", "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  227. string[] CallTotalTime = GetCallRecordTotalTime(BeginTime, EndTime, "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  228. for (int i = 0; i < CallInTime.Length; i++)
  229. {
  230. double subt = 0.0;
  231. if (double.Parse(CallInTime[i]) != 0)
  232. {
  233. subt += double.Parse(CallInTime[i]);
  234. }
  235. if (double.Parse(CallOutTime[i]) != 0)
  236. {
  237. subt += double.Parse(CallOutTime[i]);
  238. }
  239. if (subt != 0)
  240. result += (double.Parse(CallTotalTime[i]) / subt).ToString("F2") + ",";
  241. else
  242. result += "0,";
  243. }
  244. result = result.TrimEnd(',');
  245. return result + "]";
  246. }
  247. /// <summary>
  248. /// 获取坐席的呼入次数
  249. /// </summary>
  250. /// <param name="BeginTime">开始时间</param>
  251. /// <param name="EndTime">结束时间</param>
  252. /// <returns></returns>
  253. public string GetCallRecordIn(string BeginTime, string EndTime, string Tag, string dpt)
  254. {
  255. return GetHighChartData(BeginTime, EndTime, Tag, "", dpt);
  256. }
  257. /// <summary>
  258. /// 获取呼入呼出数据
  259. /// </summary>
  260. /// <param name="BeginTime">开始时间</param>
  261. /// <param name="EndTime">结束时间</param>
  262. /// <param name="Tag">1表示呼出,0表示呼入</param>
  263. /// <returns></returns>
  264. private string GetHighChartData(string BeginTime, string EndTime, string Tag, string state, string dpt)
  265. {
  266. string result = "[";
  267. string sql = " and CallType=" + Tag; // 呼入
  268. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  269. if (!string.IsNullOrEmpty(BeginTime))
  270. {
  271. sql += " and BeginTime>='" + BeginTime + " 00:00:00'";
  272. //sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  273. }
  274. if (!string.IsNullOrEmpty(EndTime))
  275. {
  276. sql += " and BeginTime<='" + EndTime + " 23:59:59'";
  277. //sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  278. }
  279. if (state.Trim() != "")
  280. {
  281. sql += " and CallState=" + state.Trim();
  282. }
  283. if (dpt != null && dpt.Trim() != "")
  284. {
  285. sql += $" AND UserCode IN (SELECT F_UserCode FROM dbo.T_Sys_UserAccount WHERE F_DeptId = {dpt} AND f_seatFlag=1 and F_WorkNumber!='') ";
  286. }
  287. //DataTable dt = DbHelperSQL.Query("SELECT UserId,UserCode,UserName,COUNT(*) AS calloutCount FROM T_Call_CallRecords where 1=1 " + sql + " GROUP BY UserId,UserCode,UserName").Tables[0];
  288. //var recordstr = " select users.F_UserId,users.F_UserCode,users.F_UserName,COUNT(*) AS calloutCount from T_Sys_UserAccount users right join T_Call_CallRecords records on users.F_UserCode = records.UserCode and 1=1 " + sql + " GROUP BY users.F_UserId,users.F_UserCode,users.F_UserName";
  289. //20180509 通话时长统计不对 machenyang
  290. var recordstr = " select records.UserCode,records.UserId,records.UserName,COUNT(*) from T_Call_CallRecords records where 1=1 " + sql + " and UserCode is not null group by records.UserCode,records.UserId,records.UserName";
  291. DataTable dt = DbHelperSQL.Query(recordstr).Tables[0];
  292. Dictionary<string, int> myDictionary = new Dictionary<string, int>();
  293. foreach (Model.T_Sys_UserAccount item in userAccountList)
  294. {
  295. if (!myDictionary.ContainsKey(item.F_UserCode))
  296. myDictionary.Add(item.F_UserCode, 0);
  297. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserCode") == item.F_UserCode);
  298. if (drUser != null)
  299. {
  300. myDictionary[item.F_UserCode] += int.Parse(drUser[3].ToString());
  301. }
  302. }
  303. foreach (var item in myDictionary)
  304. {
  305. result += item.Value + ",";
  306. }
  307. result = result.TrimEnd(',');
  308. return result + "]";
  309. }
  310. /// <summary>
  311. /// 获取振铃时长
  312. /// </summary>
  313. /// <param name="BeginTime"></param>
  314. /// <param name="EndTime"></param>
  315. /// <returns></returns>
  316. public string GetCallRecordRingTime(string BeginTime, string EndTime, string dpt)
  317. {
  318. string result = "[";
  319. string sql = "";
  320. if (!string.IsNullOrEmpty(BeginTime))
  321. {
  322. sql += " and BeginTime>='" + BeginTime + "'";
  323. //sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  324. }
  325. if (!string.IsNullOrEmpty(EndTime))
  326. {
  327. sql += " and BeginTime<='" + EndTime + "'";
  328. //sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  329. }
  330. if (dpt != null && dpt.Trim() != "")
  331. {
  332. sql += $" AND UserCode IN (SELECT F_UserCode FROM dbo.T_Sys_UserAccount WHERE F_DeptId = {dpt} AND f_seatFlag=1 and F_WorkNumber!='') ";
  333. }
  334. //只统计呼入振铃时长
  335. sql += " and CallType=0 ";
  336. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  337. DataTable dt = DbHelperSQL.Query(" select UserCode,COUNT(1) count,SUM(Ringtimes) as RingTimes from(SELECT UserCode, datediff(second, RingStartTime, RingEndTime) as Ringtimes FROM T_Call_CallRecords where 1 = 1 " + sql + ") t GROUP BY UserCode").Tables[0];
  338. foreach (Model.T_Sys_UserAccount item in userAccountList)
  339. {
  340. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserCode") == item.F_UserCode);
  341. if (drUser != null && drUser[2].ToString() != "")
  342. result += drUser[2].ToString() + ",";
  343. else
  344. result += "0,";
  345. }
  346. result = result.TrimEnd(',');
  347. return result + "]";
  348. }
  349. #endregion
  350. }
  351. }