Нет описания

TalkTimeController.cs 19KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  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(dpt).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(string dpt)
  206. {
  207. string sqluser = "";
  208. if (dpt != null && dpt.Trim() != "")
  209. {
  210. sqluser += $" and F_DeptId = {dpt} ";
  211. }
  212. string result = "[";
  213. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList($" F_SeatFlag=1 {sqluser}");
  214. foreach (Model.T_Sys_UserAccount item in userAccountList)
  215. {
  216. result += "'" + item.F_UserName + "',";
  217. }
  218. result = result.TrimEnd(',');
  219. return result + "]";
  220. }
  221. /// <summary>
  222. /// 获取通话平均时长
  223. /// </summary>
  224. /// <param name="BeginTime">开始时间</param>
  225. /// <param name="EndTime">结束时间</param>
  226. /// <returns></returns>
  227. public string GetCallAverageTime(string BeginTime, string EndTime, string dpt)
  228. {
  229. string result = "[";
  230. string[] CallInTime = GetCallRecordIn(BeginTime, EndTime, "0", dpt).TrimStart('[').TrimEnd(']').Split(',');
  231. string[] CallOutTime = GetCallRecordOut(BeginTime, EndTime, "1", "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  232. string[] CallTotalTime = GetCallRecordTotalTime(BeginTime, EndTime, "", dpt).TrimStart('[').TrimEnd(']').Split(',');
  233. for (int i = 0; i < CallInTime.Length; i++)
  234. {
  235. double subt = 0.0;
  236. if (double.Parse(CallInTime[i]) != 0)
  237. {
  238. subt += double.Parse(CallInTime[i]);
  239. }
  240. if (double.Parse(CallOutTime[i]) != 0)
  241. {
  242. subt += double.Parse(CallOutTime[i]);
  243. }
  244. if (subt != 0)
  245. result += (double.Parse(CallTotalTime[i]) / subt).ToString("F2") + ",";
  246. else
  247. result += "0,";
  248. }
  249. result = result.TrimEnd(',');
  250. return result + "]";
  251. }
  252. /// <summary>
  253. /// 获取坐席的呼入次数
  254. /// </summary>
  255. /// <param name="BeginTime">开始时间</param>
  256. /// <param name="EndTime">结束时间</param>
  257. /// <returns></returns>
  258. public string GetCallRecordIn(string BeginTime, string EndTime, string Tag, string dpt)
  259. {
  260. return GetHighChartData(BeginTime, EndTime, Tag, "", dpt);
  261. }
  262. /// <summary>
  263. /// 获取呼入呼出数据
  264. /// </summary>
  265. /// <param name="BeginTime">开始时间</param>
  266. /// <param name="EndTime">结束时间</param>
  267. /// <param name="Tag">1表示呼出,0表示呼入</param>
  268. /// <returns></returns>
  269. private string GetHighChartData(string BeginTime, string EndTime, string Tag, string state, string dpt)
  270. {
  271. string result = "[";
  272. string sql = " and CallType=" + Tag; // 呼入
  273. string sqluser = ""; // 呼入
  274. if (!string.IsNullOrEmpty(BeginTime))
  275. {
  276. sql += " and BeginTime>='" + BeginTime + " 00:00:00'";
  277. //sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  278. }
  279. if (!string.IsNullOrEmpty(EndTime))
  280. {
  281. sql += " and BeginTime<='" + EndTime + " 23:59:59'";
  282. //sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  283. }
  284. if (state.Trim() != "")
  285. {
  286. sql += " and CallState=" + state.Trim();
  287. }
  288. if (dpt != null && dpt.Trim() != "")
  289. {
  290. sqluser += $" and F_DeptId = {dpt} ";
  291. sql += $" AND UserCode IN (SELECT F_UserCode FROM dbo.T_Sys_UserAccount WHERE F_DeptId = {dpt} AND f_seatFlag=1 and F_WorkNumber!='') ";
  292. }
  293. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList($" F_SeatFlag=1 {sqluser}");
  294. //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];
  295. //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";
  296. //20180509 通话时长统计不对 machenyang
  297. //20180509 通话时长呼入次数 与 坐席工作报表 呼入电话数 数值不统一 修改(原因是一个是根据工号查询,一个是工号姓名【由于可能工号不变,会修改姓名】) lihai
  298. //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";
  299. var recordstr = " select records.UserCode,COUNT(*) from T_Call_CallRecords records where 1=1 " + sql + " and UserCode is not null group by records.UserCode";
  300. DataTable dt = DbHelperSQL.Query(recordstr).Tables[0];
  301. Dictionary<string, int> myDictionary = new Dictionary<string, int>();
  302. foreach (Model.T_Sys_UserAccount item in userAccountList)
  303. {
  304. if (!myDictionary.ContainsKey(item.F_UserCode))
  305. myDictionary.Add(item.F_UserCode, 0);
  306. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserCode") == item.F_UserCode);
  307. if (drUser != null)
  308. {
  309. myDictionary[item.F_UserCode] += int.Parse(drUser[1].ToString());
  310. //myDictionary[item.F_UserCode] += int.Parse(drUser[3].ToString());
  311. }
  312. }
  313. foreach (var item in myDictionary)
  314. {
  315. result += item.Value + ",";
  316. }
  317. result = result.TrimEnd(',');
  318. return result + "]";
  319. }
  320. /// <summary>
  321. /// 获取振铃时长
  322. /// </summary>
  323. /// <param name="BeginTime"></param>
  324. /// <param name="EndTime"></param>
  325. /// <returns></returns>
  326. public string GetCallRecordRingTime(string BeginTime, string EndTime, string dpt)
  327. {
  328. string result = "[";
  329. string sql = "";
  330. if (!string.IsNullOrEmpty(BeginTime))
  331. {
  332. sql += " and BeginTime>='" + BeginTime + "'";
  333. //sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  334. }
  335. if (!string.IsNullOrEmpty(EndTime))
  336. {
  337. sql += " and BeginTime<='" + EndTime + "'";
  338. //sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  339. }
  340. if (dpt != null && dpt.Trim() != "")
  341. {
  342. sql += $" AND UserCode IN (SELECT F_UserCode FROM dbo.T_Sys_UserAccount WHERE F_DeptId = {dpt} AND f_seatFlag=1 and F_WorkNumber!='') ";
  343. }
  344. //只统计呼入振铃时长
  345. sql += " and CallType=0 ";
  346. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  347. 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];
  348. foreach (Model.T_Sys_UserAccount item in userAccountList)
  349. {
  350. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserCode") == item.F_UserCode);
  351. if (drUser != null && drUser[2].ToString() != "")
  352. result += drUser[2].ToString() + ",";
  353. else
  354. result += "0,";
  355. }
  356. result = result.TrimEnd(',');
  357. return result + "]";
  358. }
  359. #endregion
  360. }
  361. }