市长热线演示版

workorderreport.aspx.cs 20KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Text;
  8. using System.Data;
  9. namespace HySoft.BaseCallCenter.Web.reportmanage.callreports
  10. {
  11. public partial class workorderreport : System.Web.UI.Page
  12. {
  13. protected string TableHtml = "";
  14. protected void Page_Load(object sender, EventArgs e)
  15. {
  16. OutputTable();
  17. }
  18. private void OutputTable()
  19. {
  20. //查询条件
  21. string starttime = txtStartTime.Text.Trim();
  22. string endtime = txtEndTime.Text.Trim();
  23. if (string.IsNullOrWhiteSpace(starttime)) { starttime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToString("yyyy-MM-dd"); txtStartTime.Text = starttime; }
  24. if (string.IsNullOrWhiteSpace(endtime)) { endtime = DateTime.Today.ToString("yyyy-MM-dd"); txtEndTime.Text = endtime; }
  25. string tabletitle = "工单处理情况分析";
  26. string[] tablehead = new string[] { "员工", "来电接通数", "总工单数量", "当日结束工单数量", "当日结束工单占比", "非当日结束工单数量", "非当日结束工单占比", "平均当日接单量", "平均当日结束工单量" };
  27. TableHtml = createTable(tabletitle, tablehead, starttime, endtime);
  28. }
  29. private string createTable(string title, string[] head, string starttime, string endtime)
  30. {
  31. StringBuilder sb = new StringBuilder();
  32. //表名称
  33. sb.Append(createTableTitle(title));
  34. //表列名
  35. sb.Append("<table border='0' cellpadding='0' cellspacing='0' width='100%' align='center'>");
  36. sb.Append(createTableHead(head));
  37. //表内容
  38. sb.Append(createTableBody(starttime, endtime));
  39. sb.Append("</table>");
  40. return sb.ToString();
  41. }
  42. /// <summary>
  43. /// 表名称
  44. /// </summary>
  45. /// <param name="title">表名</param>
  46. /// <returns></returns>
  47. protected string createTableTitle(string title)
  48. {
  49. StringBuilder sb = new StringBuilder();
  50. sb.Append("<h1 style='font-size: 18px; font-weight: bold; color: #333333; text-align: center;width: 100%;'><b>" + title + "</b></h1>");
  51. return sb.ToString();
  52. }
  53. /// <summary>
  54. /// 表头(表列名)
  55. /// </summary>
  56. /// <param name="head"></param>
  57. /// <returns></returns>
  58. protected string createTableHead(string[] head)
  59. {
  60. StringBuilder sb = new StringBuilder();
  61. sb.Append("<tr class=\"formtabletitle1\" style=\"height: 25px;background-color: #D5EDFE;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">");
  62. for (int i = 0; i < head.Length; i++)
  63. {
  64. if (i == 0)
  65. sb.Append("<td colspan=\"2\" class=\"formtabletitle1\" style=\"height: 25px;background-color: #D5EDFE;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + head[i] + "</td>");
  66. else sb.Append("<td class=\"formtabletitle1\" style=\"height: 25px;background-color: #D5EDFE;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + head[i] + "</td>");
  67. }
  68. sb.Append("</tr>");
  69. return sb.ToString();
  70. }
  71. private string createTableBody(string starttime, string endtime)
  72. {
  73. //存储数据的数据字典
  74. Dictionary<int, List<string>> body = new Dictionary<int, List<string>>();
  75. Dictionary<int, List<string>> body1 = new Dictionary<int, List<string>>();
  76. Dictionary<int, List<string>> body2 = new Dictionary<int, List<string>>();
  77. Dictionary<int, List<string>> body3 = new Dictionary<int, List<string>>();
  78. //这段时间已经结束的报修工单
  79. string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", 16);//16为报修
  80. if (starttime != "")
  81. {
  82. sql += " AND F_STARTTIME>='" + starttime + " 00:00:00'";
  83. }
  84. if (endtime != "")
  85. {
  86. sql += " AND F_ENDTIME<='" + endtime + " 23:59:59'";
  87. }
  88. //sql += " AND F_STARTTIME IS NOT NULL AND F_ENDTIME IS NOT NULL";
  89. DataTable dtable = new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0];
  90. //这段时间工单总数
  91. int allcount = dtable.Rows.Count;
  92. for (int i = 0; i < allcount; i++)
  93. {
  94. DataTable workorderbase = new BLL.T_Wo_WorkOrderBase().GetList("F_INSTANCEID=" + dtable.Rows[i]["F_INSTANCEID"]).Tables[0];
  95. if (workorderbase.Rows.Count > 0)
  96. {
  97. #region 工程师
  98. //处理这个工单工程师
  99. List<Model.T_Wo_WorkOrderConstructor> constructorlist =
  100. new BLL.T_Wo_WorkOrderConstructor().GetModelList("F_WORKORDERID=" + workorderbase.Rows[0]["F_WORKORDERID"]);
  101. if (constructorlist.Count > 0)
  102. {
  103. foreach (Model.T_Wo_WorkOrderConstructor constructor in constructorlist)
  104. {
  105. if (constructor.F_ISMAIN == 1)
  106. {
  107. int id = Convert.ToInt32(constructor.F_USERID);
  108. Model.T_Sys_UserAccount user = new BLL.T_Sys_UserAccount().GetModel(id);
  109. if (user != null)
  110. {
  111. #region 一线工程师
  112. if (user.F_RoleId == 30)//一线工程师
  113. {
  114. string instanceid = dtable.Rows[i]["F_INSTANCEID"].ToString();
  115. //这个工单是某个部门的工程师处理的就存储起来,如果还有其他工单也是此部门处理的就增加1
  116. if (body2.ContainsKey(user.F_UserId))
  117. {
  118. body2[user.F_UserId][2] = (Convert.ToInt32(body2[user.F_UserId][2]) + 1).ToString();
  119. body2[user.F_UserId][3] = (Convert.ToInt32(body2[user.F_UserId][3]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 1 : 0)).ToString();
  120. body2[user.F_UserId][5] = (Convert.ToInt32(body2[user.F_UserId][5]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 0 : 1)).ToString();
  121. }
  122. else
  123. {
  124. //员工 来电接通数 总工单数量 当日结束工单数量 当日结束工单占比
  125. //非当日结束工单数量 非当日结束工单占比 平均每日接单量 平均每日结束工单量
  126. body2.Add(user.F_UserId, new List<string>() { "一线工程师", "-", "1", IsTodayFinish(workorderbase) ? "1" : "0", "", IsTodayFinish(workorderbase) ? "0" : "1", "", "", "" });
  127. }
  128. }
  129. #endregion
  130. #region 二线工程师
  131. else if (user.F_RoleId == 31)//二线工程师
  132. {
  133. string instanceid = dtable.Rows[i]["F_INSTANCEID"].ToString();
  134. //这个工单是某个部门的工程师处理的就存储起来,如果还有其他工单也是此部门处理的就增加1
  135. if (body3.ContainsKey(user.F_UserId))
  136. {
  137. body3[user.F_UserId][2] = (Convert.ToInt32(body3[user.F_UserId][2]) + 1).ToString();
  138. body3[user.F_UserId][3] = (Convert.ToInt32(body3[user.F_UserId][3]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 1 : 0)).ToString();
  139. body3[user.F_UserId][5] = (Convert.ToInt32(body3[user.F_UserId][5]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 0 : 1)).ToString();
  140. }
  141. else
  142. {
  143. //员工 来电接通数 总工单数量 当日结束工单数量 当日结束工单占比
  144. //非当日结束工单数量 非当日结束工单占比 平均每日接单量 平均每日结束工单量
  145. body3.Add(user.F_UserId, new List<string>() { "二线工程师", "-", "1", IsTodayFinish(workorderbase) ? "1" : "0", "", IsTodayFinish(workorderbase) ? "0" : "1", "", "", "" });
  146. }
  147. }
  148. #endregion
  149. }
  150. }
  151. }
  152. }
  153. #endregion
  154. #region 客服
  155. int createuserid = 0;
  156. int.TryParse(workorderbase.Rows[0]["F_CREATEBY"].ToString(), out createuserid);
  157. Model.T_Sys_UserAccount userinfo = new BLL.T_Sys_UserAccount().GetModel(createuserid);
  158. if (userinfo != null)
  159. {
  160. if (body1.ContainsKey(createuserid))
  161. {
  162. body1[createuserid][2] = (Convert.ToInt32(body1[createuserid][2]) + 1).ToString();
  163. body1[createuserid][3] = (Convert.ToInt32(body1[createuserid][3]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 1 : 0)).ToString();
  164. body1[createuserid][5] = (Convert.ToInt32(body1[createuserid][5]) + Convert.ToInt32(IsTodayFinish(workorderbase) ? 0 : 1)).ToString();
  165. }
  166. else
  167. {
  168. //员工 来电接通数 总工单数量 当日结束工单数量 当日结束工单占比
  169. //非当日结束工单数量 非当日结束工单占比 平均每日接单量 平均每日结束工单量
  170. body1.Add(createuserid, new List<string>() { "客服", CallInCount(createuserid, starttime, endtime), "1", IsTodayFinish(workorderbase) ? "1" : "0", "", IsTodayFinish(workorderbase) ? "0" : "1", "", "", "" });
  171. }
  172. }
  173. #endregion
  174. }
  175. }
  176. AddRange1(body, body2);
  177. AddRange2(body, body3);
  178. AddRange3(body, body1);
  179. TimeSpan ts = DateTime.Parse(endtime) - DateTime.Parse(starttime);
  180. double daycount = ts.TotalDays + 1;
  181. StringBuilder sb = new StringBuilder();
  182. #region 打印表格
  183. bool b1 = false; bool b2 = false; bool b3 = false;
  184. foreach (var key in body.Keys)
  185. {
  186. List<string> Values = body[key];
  187. sb.Append("<tr style=\"text-align: center;\" onmouseover=\"this.style.backgroundColor='#F6F6F6'\" onmouseout=\"this.style.backgroundColor='#ffffff'\">");
  188. //if (Values[0] == "客服" && b1 == false)
  189. //{
  190. // sb.Append("<td rowspan=\"" + (body1.Count + 1) + "\" class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + Values[0] + "</td>");
  191. // b1 = true;
  192. //}
  193. if (Values[0] == "一线工程师" && b2 == false)
  194. {
  195. sb.Append("<td rowspan=\"" + (body2.Count + 1) + "\" class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + Values[0] + "</td>");
  196. b2 = true;
  197. }
  198. if (Values[0] == "二线工程师" && b3 == false)
  199. {
  200. sb.Append("<td rowspan=\"" + (body3.Count + 1) + "\" class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + Values[0] + "</td>");
  201. b3 = true;
  202. }
  203. if (getUserNameAndDeptName(key)[0] == "合计:") sb.Append("<td colspan=\"2\" class=\"formtabletitle1\" style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + getUserNameAndDeptName(key)[0] + "</td>");
  204. else sb.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + getUserNameAndDeptName(key)[0] + "</td>");
  205. for (int i = 0; i < Values.Count(); i++)
  206. {
  207. Values[4] = "0.00%"; if (Values[2] != "0") Values[4] = (Convert.ToInt32(Values[3]) * 100.0 / Convert.ToInt32(Values[2])).ToString("0.00") + "%";
  208. Values[6] = "0.00%"; if (Values[2] != "0") Values[6] = (Convert.ToInt32(Values[5]) * 100.0 / Convert.ToInt32(Values[2])).ToString("0.00") + "%";
  209. Values[7] = "0.00"; if (daycount > 0) Values[7] = (Convert.ToInt32(Values[2]) / daycount).ToString("0.00");
  210. Values[8] = "0.00"; if (daycount > 0) Values[8] = (Convert.ToInt32(Values[3]) / daycount).ToString("0.00");
  211. if (i == 0) continue;
  212. sb.Append("<td class=\"formtabletitle1\"style=\"height: 25px;background-color: #fff;border-left: 1px solid #CCCCCC;border-right: 1px solid #CCCCCC;border-top: 1px solid #CCCCCC;border-bottom: 1px solid #CCCCCC;padding: 3px 3px 3px 3px;text-align:center;\">" + Values[i] + "</td>");
  213. }
  214. sb.Append("</tr>");
  215. }
  216. #endregion
  217. return sb.ToString();
  218. }
  219. /// <summary>
  220. /// 通过UserId得到姓名和部门名
  221. /// </summary>
  222. /// <param name="userid"></param>
  223. /// <returns></returns>
  224. private string[] getUserNameAndDeptName(int userid)
  225. {
  226. var user = new BLL.T_Sys_UserAccount().GetModel(userid);
  227. string[] resarr = new string[2];
  228. if (user != null)
  229. {
  230. resarr[0] = user.F_UserName;
  231. var dept = new BLL.T_Sys_Department().GetModel(user.F_DeptId);
  232. if (dept != null)
  233. {
  234. resarr[1] = dept.F_DeptName;
  235. }
  236. }
  237. else
  238. {
  239. if (userid > -3)
  240. resarr[0] = "小计:";
  241. else resarr[0] = "合计:";
  242. }
  243. return resarr;
  244. }
  245. /// <summary>
  246. /// 某工单是否今天完成
  247. /// </summary>
  248. /// <param name="workorderbase"></param>
  249. /// <returns></returns>
  250. private bool IsTodayFinish(DataTable workorderbase)
  251. {
  252. string starttime = DateTime.Parse(workorderbase.Rows[0]["F_STARTTIME"].ToString()).ToShortDateString();
  253. string endtime = DateTime.Parse(workorderbase.Rows[0]["F_ENDTIME"].ToString()).ToShortDateString();
  254. workorderbase.Dispose();
  255. if (starttime == endtime) return true;
  256. else return false;
  257. }
  258. /// <summary>
  259. /// 某个客服一段时间的接通电话数
  260. /// </summary>
  261. /// <param name="userid"></param>
  262. /// <param name="starttime"></param>
  263. /// <param name="endtime"></param>
  264. /// <returns></returns>
  265. private string CallInCount(int userid, string starttime, string endtime)
  266. {
  267. string sqlwhere = string.Format("UserId={0} AND CallState=1 AND CallType=0 AND EndTime>='{1}' AND EndTime<'{2}'", userid, starttime, endtime);//接通的呼入电话
  268. DataTable dt = new BLL.T_Call_CallRecords().GetList(sqlwhere).Tables[0];
  269. return dt.Rows.Count.ToString();
  270. }
  271. private void AddRange1(Dictionary<int, List<string>> body, Dictionary<int, List<string>> bodytype)
  272. {
  273. var dicSort = from objDic in bodytype orderby int.Parse(objDic.Value[2]) descending select objDic;
  274. List<string> sum = new List<string>() { "一线工程师", "-", "0", "0", "", "0", "", "", "" };
  275. foreach (KeyValuePair<int, List<string>> kvp in dicSort)
  276. {
  277. sum[2] = (int.Parse(sum[2]) + int.Parse(kvp.Value[2])).ToString();
  278. sum[3] = (int.Parse(sum[3]) + int.Parse(kvp.Value[3])).ToString();
  279. sum[5] = (int.Parse(sum[5]) + int.Parse(kvp.Value[5])).ToString();
  280. if (!body.ContainsKey(kvp.Key))
  281. body.Add(kvp.Key, kvp.Value);
  282. }
  283. body.Add(-1, sum);
  284. }
  285. private void AddRange2(Dictionary<int, List<string>> body, Dictionary<int, List<string>> bodytype)
  286. {
  287. var dicSort = from objDic in bodytype orderby int.Parse(objDic.Value[2]) descending select objDic;
  288. List<string> sum = new List<string>() { "二线工程师", "-", "0", "0", "", "0", "", "", "" };
  289. foreach (KeyValuePair<int, List<string>> kvp in dicSort)
  290. {
  291. sum[2] = (int.Parse(sum[2]) + int.Parse(kvp.Value[2])).ToString();
  292. sum[3] = (int.Parse(sum[3]) + int.Parse(kvp.Value[3])).ToString();
  293. sum[5] = (int.Parse(sum[5]) + int.Parse(kvp.Value[5])).ToString();
  294. if (!body.ContainsKey(kvp.Key))
  295. body.Add(kvp.Key, kvp.Value);
  296. }
  297. body.Add(-2, sum);
  298. }
  299. private void AddRange3(Dictionary<int, List<string>> body, Dictionary<int, List<string>> bodytype)
  300. {
  301. var dicSort = from objDic in bodytype orderby int.Parse(objDic.Value[2]) descending select objDic;
  302. List<string> sum = new List<string>() { "客服", "0", "0", "0", "", "0", "", "", "" };
  303. foreach (KeyValuePair<int, List<string>> kvp in dicSort)
  304. {
  305. sum[1] = (int.Parse(sum[1]) + int.Parse(kvp.Value[1])).ToString();
  306. }
  307. sum[2] = (int.Parse(body[-1][2]) + int.Parse(body[-2][2])).ToString();
  308. sum[3] = (int.Parse(body[-1][3]) + int.Parse(body[-2][3])).ToString();
  309. sum[5] = (int.Parse(body[-1][5]) + int.Parse(body[-2][5])).ToString();
  310. body.Add(-3, sum);
  311. }
  312. protected void btnConfirm_Click(object sender, EventArgs e)
  313. {
  314. OutputTable();
  315. }
  316. protected void btnExport_Click(object sender, EventArgs e)
  317. {
  318. string fileName = "来电工单受理分析报表" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
  319. Response.Clear();
  320. Response.Charset = "GB2312";
  321. Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");
  322. Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName));
  323. Response.ContentType = "application/ms-excel";
  324. Response.Write(TableHtml);
  325. }
  326. }
  327. }