Нет описания

TalkTimeController.cs 17KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395
  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)
  26. {
  27. ActionResult res = NoToken("未知错误,请重新登录");
  28. DataTable dtNew = new DataTable();
  29. dtNew = GetData(stime, endtime);
  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)
  81. {
  82. ActionResult res = NoToken("未知错误,请重新登录");
  83. if (Request.IsAuthenticated)
  84. {
  85. NPOIHelper npoi = new NPOIHelper();
  86. DataTable dt = GetData(stime, endtime);
  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)
  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. DataColumn dc10 = new DataColumn("通话总时长", Type.GetType("System.String"));
  113. DataColumn dc11 = new DataColumn("平均通话总时长", Type.GetType("System.String"));
  114. dtNew.Columns.Add(dc1);
  115. dtNew.Columns.Add(dc2);
  116. dtNew.Columns.Add(dc3);
  117. dtNew.Columns.Add(dc4);
  118. dtNew.Columns.Add(dc5);
  119. dtNew.Columns.Add(dc6);
  120. dtNew.Columns.Add(dc7);
  121. dtNew.Columns.Add(dc8);
  122. dtNew.Columns.Add(dc9);
  123. dtNew.Columns.Add(dc10);
  124. dtNew.Columns.Add(dc11);
  125. #endregion
  126. string[] CallInTime = GetCallRecordIn(stime, endtime, "0","").TrimStart('[').TrimEnd(']').Split(',');
  127. string[] CallInTimes = GetCallRecordTotalTime(stime, endtime, "0").TrimStart('[').TrimEnd(']').Split(',');
  128. string[] CallInWTime = GetCallRecordIn(stime, endtime, "1", "0").TrimStart('[').TrimEnd(']').Split(',');
  129. string[] CallOutTime = GetCallRecordOut(stime, endtime, "1", "").TrimStart('[').TrimEnd(']').Split(',');
  130. string[] CallOutTimes = GetCallRecordTotalTime(stime, endtime, "1").TrimStart('[').TrimEnd(']').Split(',');
  131. string[] CallOutWTime = GetCallRecordOut(stime, endtime, "1", "0").TrimStart('[').TrimEnd(']').Split(',');
  132. string[] CallOutWTimes = GetCallRecordRingTime(stime, endtime).TrimStart('[').TrimEnd(']').Split(',');
  133. string[] CallTime = GetCallRecord(stime, endtime, "", "1").TrimStart('[').TrimEnd(']').Split(',');
  134. string[] CallTotalTime = GetCallRecordTotalTime(stime, endtime, "").TrimStart('[').TrimEnd(']').Split(',');
  135. string[] AgentArr = GetAgent().TrimStart('[').TrimEnd(']').Split(',');
  136. string[] AverageTime = GetCallAverageTime(stime, endtime).TrimStart('[').TrimEnd(']').Split(',');
  137. for (int i = 0; i < AgentArr.Length; i++)
  138. {
  139. DataRow drNew = dtNew.NewRow();
  140. drNew["坐席名称"] = AgentArr[i].Replace('\'', ' ');
  141. drNew["呼入次数"] = CallInTime[i];
  142. drNew["呼入时长"] = CallInTimes[i];
  143. drNew["呼入未接通次数"] = CallInWTime[i];
  144. drNew["呼出次数"] = CallOutTime[i];
  145. drNew["呼出时长"] = CallOutTimes[i];
  146. drNew["呼出未接通次数"] = CallOutWTime[i];
  147. drNew["振铃时长"] = CallOutWTimes[i];
  148. drNew["接通总次数"] = CallTime[i];
  149. drNew["通话总时长"] = CallTotalTime[i];
  150. drNew["平均通话总时长"] = AverageTime[i];
  151. dtNew.Rows.Add(drNew);
  152. }
  153. return dtNew;
  154. }
  155. #region
  156. /// <summary>
  157. /// 获取坐席的呼出次数
  158. /// </summary>
  159. /// <param name="BeginTime">开始时间</param>
  160. /// <param name="EndTime">结束时间</param>
  161. /// <param name="Tag">1表示呼出,0表示呼入</param>
  162. /// <returns></returns>
  163. public string GetCallRecordOut(string BeginTime, string EndTime, string Tag, string state)
  164. {
  165. return GetHighChartData(BeginTime, EndTime, Tag, state);
  166. }
  167. /// <summary>
  168. /// 获取通话总时长
  169. /// </summary>
  170. /// <param name="BeginTime">开始时间</param>
  171. /// <param name="EndTime">结束时间</param>
  172. /// <returns></returns>
  173. public string GetCallRecordTotalTime(string BeginTime, string EndTime, string tag)
  174. {
  175. string result = "[";
  176. string sql = "";
  177. if (BeginTime != null && BeginTime != "")
  178. {
  179. sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  180. }
  181. if (EndTime != null && EndTime != "")
  182. {
  183. sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  184. }
  185. if (tag != "")
  186. {
  187. sql += " and CallType=" + tag;
  188. }
  189. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  190. 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];
  191. foreach (Model.T_Sys_UserAccount item in userAccountList)
  192. {
  193. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserName") == item.F_UserName);
  194. if (drUser != null && drUser[4].ToString() != "")
  195. result += drUser[4].ToString() + ",";
  196. else
  197. result += "0,";
  198. }
  199. result = result.TrimEnd(',');
  200. return result + "]";
  201. }
  202. /// <summary>
  203. /// 获取坐席名称(x轴数据)
  204. /// </summary>
  205. /// <returns></returns>
  206. public string GetAgent()
  207. {
  208. string result = "[";
  209. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  210. foreach (Model.T_Sys_UserAccount item in userAccountList)
  211. {
  212. result += "'" + item.F_UserName + "',";
  213. }
  214. result = result.TrimEnd(',');
  215. return result + "]";
  216. }
  217. /// <summary>
  218. /// 获取通话平均时长
  219. /// </summary>
  220. /// <param name="BeginTime">开始时间</param>
  221. /// <param name="EndTime">结束时间</param>
  222. /// <returns></returns>
  223. public string GetCallAverageTime(string BeginTime, string EndTime)
  224. {
  225. string result = "[";
  226. string[] CallInTime = GetCallRecordIn(BeginTime, EndTime, "0","").TrimStart('[').TrimEnd(']').Split(',');
  227. string[] CallOutTime = GetCallRecordOut(BeginTime, EndTime, "1","").TrimStart('[').TrimEnd(']').Split(',');
  228. string[] CallTotalTime = GetCallRecordTotalTime(BeginTime, EndTime,"").TrimStart('[').TrimEnd(']').Split(',');
  229. for (int i = 0; i < CallInTime.Length; i++)
  230. {
  231. double subt = 0.0;
  232. if (double.Parse(CallInTime[i]) != 0)
  233. {
  234. subt += double.Parse(CallInTime[i]);
  235. }
  236. if (double.Parse(CallOutTime[i]) != 0)
  237. {
  238. subt += double.Parse(CallOutTime[i]);
  239. }
  240. if (subt != 0)
  241. result += (double.Parse(CallTotalTime[i]) / subt).ToString("F2") + ",";
  242. else
  243. result += "0,";
  244. }
  245. result = result.TrimEnd(',');
  246. return result + "]";
  247. }
  248. /// <summary>
  249. /// 获取坐席的呼入次数
  250. /// </summary>
  251. /// <param name="BeginTime">开始时间</param>
  252. /// <param name="EndTime">结束时间</param>
  253. /// <returns></returns>
  254. public string GetCallRecordIn(string BeginTime, string EndTime, string Tag,string state)
  255. {
  256. return GetHighChartData(BeginTime, EndTime, Tag, state);
  257. }
  258. /// <summary>
  259. /// 获取坐席的接通次数
  260. /// </summary>
  261. /// <param name="BeginTime">开始时间</param>
  262. /// <param name="EndTime">结束时间</param>
  263. /// <returns></returns>
  264. public string GetCallRecord(string BeginTime, string EndTime, string Tag, string state)
  265. {
  266. return GetHighChartData(BeginTime, EndTime, Tag, state);
  267. }
  268. /// <summary>
  269. /// 获取呼入呼出数据
  270. /// </summary>
  271. /// <param name="BeginTime">开始时间</param>
  272. /// <param name="EndTime">结束时间</param>
  273. /// <param name="Tag">1表示呼出,0表示呼入</param>
  274. /// <returns></returns>
  275. private string GetHighChartData(string BeginTime, string EndTime, string Tag, string state)
  276. {
  277. string result = "[";
  278. string sql = " 1=1 ";
  279. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  280. if (Tag != "")
  281. {
  282. sql += " and CallType=" + Tag.Trim();
  283. }
  284. if (BeginTime != "")
  285. {
  286. //sql += " and BeginTime>='" + BeginTime + "'";
  287. sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  288. }
  289. if (EndTime != "")
  290. {
  291. //sql += " and BeginTime<='" + EndTime + "'";
  292. sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  293. }
  294. if (state.Trim() != "")
  295. {
  296. sql += " and CallState=" + state.Trim();
  297. }
  298. DataTable dt = DbHelperSQL.Query("SELECT UserId,UserCode,UserName,COUNT(*) AS calloutCount FROM T_Call_CallRecords where " + sql + " GROUP BY UserId,UserCode,UserName").Tables[0];
  299. Dictionary<string, int> myDictionary = new Dictionary<string, int>();
  300. foreach (Model.T_Sys_UserAccount item in userAccountList)
  301. {
  302. if (!myDictionary.ContainsKey(item.F_UserName))
  303. myDictionary.Add(item.F_UserName, 0);
  304. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserName") == item.F_UserName);
  305. if (drUser != null)
  306. {
  307. myDictionary[item.F_UserName] += int.Parse(drUser[3].ToString());
  308. }
  309. }
  310. foreach (var item in myDictionary)
  311. {
  312. result += item.Value + ",";
  313. }
  314. result = result.TrimEnd(',');
  315. return result + "]";
  316. }
  317. /// <summary>
  318. /// 获取振铃时长
  319. /// </summary>
  320. /// <param name="BeginTime"></param>
  321. /// <param name="EndTime"></param>
  322. /// <returns></returns>
  323. public string GetCallRecordRingTime(string BeginTime, string EndTime)
  324. {
  325. string result = "[";
  326. string sql = "";
  327. if (BeginTime != "")
  328. {
  329. //sql += " and BeginTime>='" + BeginTime + "'";
  330. sql += " and DATEDIFF(d,BeginTime,'" + BeginTime + "')<=0";
  331. }
  332. if (EndTime != "")
  333. {
  334. //sql += " and BeginTime<='" + EndTime + "'";
  335. sql += " and DATEDIFF(d,BeginTime,'" + EndTime + "')>=0";
  336. }
  337. sql += " and CallType=1 and CallState=0";
  338. var userAccountList = new BLL.T_Sys_UserAccount().GetModelList(" F_SeatFlag=1");
  339. DataTable dt = DbHelperSQL.Query(" select UserCode,COUNT(1) count,SUM(Ringtimes) as RingTimes from(SELECT UserCode, datediff(second, RingStartTime, EndTime) as Ringtimes FROM T_Call_CallRecords where 1 = 1 " + sql + ") t GROUP BY UserCode").Tables[0];
  340. foreach (Model.T_Sys_UserAccount item in userAccountList)
  341. {
  342. DataRow drUser = dt.AsEnumerable().FirstOrDefault(dr => dr.Field<string>("UserCode") == item.F_UserCode);
  343. if (drUser != null && drUser[2].ToString() != "")
  344. result += drUser[2].ToString() + ",";
  345. else
  346. result += "0,";
  347. }
  348. result = result.TrimEnd(',');
  349. return result + "]";
  350. }
  351. #endregion
  352. }
  353. }