using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using System.Text; namespace HySoft.BaseCallCenter.Web.reportmanage { public partial class ExecutionEfficiency : System.Web.UI.Page { protected string TableTitle = null; protected string TableOne = null; protected string TableTwo = null; protected string TableHtml = null; protected void Page_Load(object sender, EventArgs e) { #region Demo //PrintTable(); //string[] head = { "日期", "工单总量", "工单总用时", "工单平均用时", "指派总用时", "指派平均用时", "接单总用时", "接单平均用时", "处理总用时", "处理平均用时", "回访总用时", "回访平均用时", "结单总用时", "结单平均用时" }; //string[,] body = new string[30, 14]; //for (int i = 0; i < 30; i++) //{ // for (int j = 0; j < 14; j++) // { // if (j == 0) // body[i, j] = "2015/4/" + (i + 1).ToString(); // else body[i, j] = ""; // } //} //string[] sumiteam = { "合计:", "工单总量", "工单总用时", "工单平均用时", "指派总用时", "指派平均用时", "接单总用时", "接单平均用时", "处理总用时", "处理平均用时", "回访总用时", "回访平均用时", "结单总用时", "结单平均用时" }; //TableHtml = createTableTitle("工单流程执行效率") + createTable1(head, body, sumiteam); #endregion OutputTable(); } private void OutputTable() { //查询条件 string starttime = txtStartTime.Text.Trim(); string endtime = txtEndTime.Text.Trim(); string type = hidType.Value.Trim().Replace(';', ','); string level = hidLevel.Value.Trim().Replace(';', ','); if (string.IsNullOrWhiteSpace(starttime)) { starttime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToString("yyyy-MM-dd"); txtStartTime.Text = starttime; } if (string.IsNullOrWhiteSpace(endtime)) { endtime = DateTime.Today.ToString("yyyy-MM-dd"); txtEndTime.Text = endtime; } string tabletitle = "工单流程执行效率"; string[] tablehead = { "日期", "工单总量", "工单总用时(小时)", "工单平均用时(小时)", "指派总用时(小时)", "指派平均用时(小时)", "接单总用时(小时)", "接单平均用时(小时)", "处理总用时(小时)", "处理平均用时(小时)", "回访总用时(小时)", "回访平均用时(小时)", "结单总用时(小时)", "结单平均用时(小时)" }; TableHtml = createTable(tabletitle, tablehead, starttime, endtime, type, level); } private string createTable(string title, string[] head, string starttime, string endtime, string type, string level) { StringBuilder sb = new StringBuilder(); sb.Append(createTableTitle(title)); sb.Append(""); sb.Append(createTableHead(head)); sb.Append(createTableBody(starttime, endtime, type, level)); sb.Append("
"); return sb.ToString(); } private string createTableBody(string starttime, string endtime, string type, string level) { //收集数据 List> body = new List>(); for (DateTime dt = Convert.ToDateTime(starttime); dt <= Convert.ToDateTime(endtime); dt = dt.AddDays(1)) { List bodyiteam = new List(); bodyiteam.Add(dt.ToShortDateString()); string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", 16); if (type != "") sql += " AND F_WORKORDERLEVELID in (" + type + ")"; if (level != "") sql += " AND F_REPAIRLEVEL in (" + level + ")"; sql += " AND F_STARTTIME>='" + dt.ToShortDateString() + " 00:00:00'"; sql += " AND F_STARTTIME<='" + dt.ToShortDateString() + " 23:59:59'"; sql += " AND F_ENDTIME IS NOT NULL AND F_ENDTIME !=''"; DataTable dtable = new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0]; //今天的总工单量 int todaycount = dtable.Rows.Count; bodyiteam.Add(todaycount.ToString()); //今天的工单总用时 double todayalltime = 0.00; TimeSpan tstotal = new TimeSpan(); for (int i = 0; i < dtable.Rows.Count; i++) { DateTime dtstart = new DateTime(); DateTime dtend = new DateTime(); if (DateTime.TryParse(dtable.Rows[i]["F_ENDTIME"].ToString(), out dtend) && DateTime.TryParse(dtable.Rows[i]["F_STARTTIME"].ToString(), out dtstart)) { TimeSpan ts = (TimeSpan)(dtend - dtstart); tstotal += ts; } } todayalltime = tstotal.TotalSeconds; bodyiteam.Add(todayalltime.ToString("0.00")); //今天的平均用时 double todaypercent = 0.00; if (todayalltime > 0) todaypercent = todayalltime / todaycount; bodyiteam.Add(todaypercent.ToString("0.00")); //今天的工单每个状态的总用时 int[] state = new int[] { 4, 6, 7, 8, 9 }; for (int j = 0; j < state.Length; j++) { double l = 0.00; double p = 0.00; for (int i = 0; i < dtable.Rows.Count; i++) { string sqlwhere = string.Format("SELECT SUM([F_ELAPSEDTIME]) FROM [T_Wo_WorkOrderHistory] WHERE [F_WORKORDERSTATEID]='{0}' AND [F_INSTANCEID]='{1}'", state[j], dtable.Rows[i]["F_INSTANCEID"].ToString()); DataTable dtb = DBUtility.DbHelperSQL.Query(sqlwhere).Tables[0]; double m = 0.00; double.TryParse(dtb.Rows[0][0].ToString(), out m); l += m; } if (todaycount > 0) p = l / todaycount; bodyiteam.Add(l.ToString("0.00")); bodyiteam.Add(p.ToString("0.00")); } dtable.Dispose(); for (int item =0;item< bodyiteam.Count;item++) { if (item == 0 || item == 1) continue; else bodyiteam[item] = GetTimeInfo(bodyiteam[item]); } body.Add(bodyiteam); } //打印表格 StringBuilder sb = new StringBuilder(); for (int i = 0; i < body.Count;i++ ) { if (body[i][1] != "0") { sb.Append(""); foreach (var listiteam in body[i]) { sb.Append("" + listiteam + ""); } sb.Append(""); } } //合计数据 List sum = new List(); sum = getSumCountAndAverage(starttime, endtime, 16, type, level); sb.Append(""); for (int j = 0; j < sum.Count; j++) { sb.Append("" + sum[j] + ""); } sb.Append(""); return sb.ToString(); } private List getSumCountAndAverage(string starttime, string endtime, int type, string bxtype, string bxlevel) { List sum = new List(); sum.Add("合计:"); string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", type); if (starttime != "") { sql += " AND F_STARTTIME>='" + starttime + " 00:00:00'"; } if (endtime != "") { sql += " AND F_ENDTIME<='" + endtime + " 23:59:59'"; } if (bxtype != "") sql += " AND F_WORKORDERLEVELID in (" + bxtype + ")"; if (bxlevel != "") sql += " AND F_REPAIRLEVEL in (" + bxlevel + ")"; DataTable dtable = new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0]; //工单总数 int allcount = dtable.Rows.Count; sum.Add(allcount.ToString()); //工单总用时 double alltime = 0.00; TimeSpan tstotal = new TimeSpan(); for (int i = 0; i < dtable.Rows.Count; i++) { DateTime dtstart = new DateTime(); DateTime dtend = new DateTime(); if (DateTime.TryParse(dtable.Rows[i]["F_ENDTIME"].ToString(), out dtend) && DateTime.TryParse(dtable.Rows[i]["F_STARTTIME"].ToString(), out dtstart)) { TimeSpan ts = (TimeSpan)(dtend - dtstart); tstotal += ts; } } alltime = tstotal.TotalSeconds; sum.Add(alltime.ToString("0.00")); //平均用时 double average = 0.00; if (alltime > 0) average = alltime / allcount; sum.Add(average.ToString("0.00")); //工单每个状态的总用时及平均用时 int[] state = new int[] { 4, 6, 7, 8, 9 }; for (int j = 0; j < state.Length; j++) { double l = 0.00; double p = 0.00; for (int i = 0; i < dtable.Rows.Count; i++) { string sqlwhere = string.Format("SELECT SUM([F_ELAPSEDTIME]) FROM [T_Wo_WorkOrderHistory] WHERE [F_WORKORDERSTATEID]='{0}' AND [F_INSTANCEID]='{1}'", state[j], dtable.Rows[i]["F_INSTANCEID"].ToString()); DataTable dtb = DBUtility.DbHelperSQL.Query(sqlwhere).Tables[0]; double m = 0.00; double.TryParse(dtb.Rows[0][0].ToString(), out m); l += m; } if (allcount > 0) p = l / allcount; sum.Add(l.ToString("0.00")); sum.Add(p.ToString("0.00")); } dtable.Dispose(); for (int item = 0; item < sum.Count; item++) { if (item == 0 || item == 1) continue; else sum[item] = GetTimeInfo(sum[item]); } return sum; } private string createTableHead(string[] head) { StringBuilder sb = new StringBuilder(); sb.Append(""); for (int i = 0; i < head.Length; i++) { sb.Append("" + head[i] + ""); } sb.Append(""); return sb.ToString(); } protected void btnConfirm_Click(object sender, EventArgs e) { //PrintTable(); OutputTable(); } private void PrintTable() { string starttime = txtStartTime.Text.Trim(); if (string.IsNullOrWhiteSpace(starttime)) starttime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).ToShortDateString(); string endtime = txtEndTime.Text.Trim(); if (string.IsNullOrWhiteSpace(endtime)) endtime = DateTime.Today.AddDays(-1).ToShortDateString(); int workordercount = getWorkOrderCount(starttime, endtime, 16); double workorderalltime = getWorkOrderAllTime(starttime, endtime, 16); int averagetime = 0; if (workordercount > 0) { averagetime = (int)(workorderalltime / workordercount); } TableTitle = createTableTitle("工单流程执行效率"); string[] Head1 = new string[] { "统计项", "统计结果" }; string[,] Body1 = new string[,] { { "工单总数",workordercount.ToString()}, { "工单总用时",GetTimeInfo(workorderalltime.ToString())}, {"工单平均用时",GetTimeInfo(averagetime.ToString())} }; TableOne = createTable(Head1, Body1); string[] Head2 = new string[] { "", "指派", "接单", "处理", "回访", "结单" }; string[,] Body2 = new string[,] { { "总用时", "", "", "", "", "" }, { "平均用时", "", "", "", "", "" } }; long time4 = getOneStateTime(starttime, endtime, 16, 4); long time6 = getOneStateTime(starttime, endtime, 16, 6); long time7 = getOneStateTime(starttime, endtime, 16, 7); long time8 = getOneStateTime(starttime, endtime, 16, 8); long time9 = getOneStateTime(starttime, endtime, 16, 9); Body2[0, 1] = GetTimeInfo(time4.ToString()); Body2[0, 2] = GetTimeInfo(time6.ToString()); Body2[0, 3] = GetTimeInfo(time7.ToString()); Body2[0, 4] = GetTimeInfo(time8.ToString()); Body2[0, 5] = GetTimeInfo(time9.ToString()); if (workordercount > 0) { Body2[1, 1] = GetTimeInfo((time4 / workordercount).ToString()); Body2[1, 2] = GetTimeInfo((time6 / workordercount).ToString()); Body2[1, 3] = GetTimeInfo((time7 / workordercount).ToString()); Body2[1, 4] = GetTimeInfo((time8 / workordercount).ToString()); Body2[1, 5] = GetTimeInfo((time9 / workordercount).ToString()); } TableTwo = createTable(Head2, Body2); } /// /// 工单总数量 /// /// private int getWorkOrderCount(string starttime, string endtime, int type) { string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", type); if (starttime != "") { sql += " AND F_STARTTIME>='" + starttime + " 00:00:00'"; } if (endtime != "") { sql += " AND F_ENDTIME<='" + endtime + " 23:59:59'"; } return new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0].Rows.Count; } /// /// 工单总用时 /// /// private double getWorkOrderAllTime(string starttime, string endtime, int type) { string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", type); if (starttime != "") { sql += " AND F_STARTTIME>='" + starttime + " 00:00:00'"; } if (endtime != "") { sql += " AND F_ENDTIME<='" + endtime + " 23:59:59'"; } DataTable dtlist = new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0]; TimeSpan tstotal = new TimeSpan(); for (int i = 0; i < dtlist.Rows.Count; i++) { DateTime dtstart = new DateTime(); DateTime dtend = new DateTime(); if (DateTime.TryParse(dtlist.Rows[i]["F_ENDTIME"].ToString(), out dtend) && DateTime.TryParse(dtlist.Rows[i]["F_STARTTIME"].ToString(), out dtstart)) { TimeSpan ts = (TimeSpan)(dtend - dtstart); tstotal += ts; } } return tstotal.TotalSeconds; } /// /// 某种状态的总时间 /// /// /// 工单状态: /// 12 开始 /// 4 待指派 /// 6 待接单 /// 7 待处理 /// 8 待回访 /// 9 待结单 /// 0 结束 /// /// private long getOneStateTime(string starttime, string endtime, int type, int state) { string sql = string.Format("F_WORKORDERSTATEID=0 and F_WORKORDERTYPEID={0}", type); if (starttime != "") { sql += " AND F_STARTTIME>='" + starttime + " 00:00:00'"; } if (endtime != "") { sql += " AND F_ENDTIME<='" + endtime + " 23:59:59'"; } DataTable dtlist = new BLL.T_Wo_WorkOrderBase().GetList(sql).Tables[0]; long l = 0; for (int i = 0; i < dtlist.Rows.Count; i++) { string sqlwhere = string.Format("SELECT SUM([F_ELAPSEDTIME]) FROM [T_Wo_WorkOrderHistory] WHERE [F_WORKORDERSTATEID]='{0}' AND [F_INSTANCEID]='{1}'", state, dtlist.Rows[i]["F_INSTANCEID"].ToString()); DataTable dt = DBUtility.DbHelperSQL.Query(sqlwhere).Tables[0]; long m = 0; long.TryParse(dt.Rows[0][0].ToString(), out m); l += m; } return l; } /// /// 获取不同类型,不同状态的工单数量 /// /// 工单类型:6.咨询 3.投诉 16.报修 /// /// 工单状态: /// 12 开始 /// 4 待指派 /// 6 待接单 /// 7 待处理 /// 8 待回访 /// 9 待结单 /// 0 结束 /// /// 工单数量 private int getWorkOrderStateCount(int type, int state) { string sqlwhere = string.Format("F_WORKORDERTYPEID='{0}' and F_WORKORDERSTATEID='{1}'", type, state); return new BLL.T_Wo_WorkOrderBase().GetList(sqlwhere).Tables[0].Rows.Count; } /// /// 时间转换(将秒转换为易读的时间) /// /// 秒 /// public string GetTimeInfo1(string times) { string res = ""; try { double d = Convert.ToDouble(times); int t = Convert.ToInt32(d); if (t < 60) { res = "" + t + "秒"; } else if (t < 3600) { res = "" + Convert.ToInt32(t / 60).ToString() + "分" + "" + Convert.ToInt32(t % 60).ToString() + "秒"; } else if (t < 86400) { res = "" + Convert.ToInt32(t / 3600).ToString() + "时" + "" + Convert.ToInt32((t % 3600) / 60).ToString() + "分" + "" + Convert.ToInt32((t % 3600) % 60).ToString() + "秒"; } else { res = "" + Convert.ToInt32(t / 86400).ToString() + "天" + "" + Convert.ToInt32((t % 86400) / 3600).ToString() + "时" + "" + Convert.ToInt32(((t % 86400) % 3600) / 60).ToString() + "分" + "" + Convert.ToInt32(((t % 86400) % 3600) % 60).ToString() + "秒"; } } catch { } return res; } /// /// 把秒转化成小时 /// /// 秒 /// public string GetTimeInfo(string times) { string res = ""; try { double d = Convert.ToDouble(times); res = (d / 3600).ToString("0.00"); } catch { } return res; } /// /// 表名称 /// /// 表名 /// protected string createTableTitle(string title) { StringBuilder sb = new StringBuilder(); sb.Append("

" + title + "

"); return sb.ToString(); } /// /// 表头(表列名) /// /// 列名数组 /// protected string createTable(string[] head, string[,] body) { StringBuilder sb = new StringBuilder(); sb.Append(""); sb.Append(""); for (int i = 0; i < head.Length; i++) { sb.Append(""); } sb.Append(""); sb.Append(createTableBody(body)); sb.Append("
" + head[i] + "
"); return sb.ToString(); } private string createTableBody(string[,] body) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < body.GetLength(0); i++) { sb.Append(""); for (int j = 0; j < body.GetLength(1); j++) { sb.Append("" + body[i, j] + ""); } sb.Append(""); } return sb.ToString(); } protected string createTable1(string[] head, string[,] body,string[] sumiteam) { StringBuilder sb = new StringBuilder(); sb.Append(""); sb.Append(""); for (int i = 0; i < head.Length; i++) { sb.Append(""); } sb.Append(""); sb.Append(createTableBody1(body)); sb.Append(""); for (int i = 0; i < sumiteam.Length; i++) { sb.Append(""); } sb.Append("
" + head[i] + "
" + sumiteam[i] + "
"); return sb.ToString(); } private string createTableBody1(string[,] body) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < body.GetLength(0); i++) { sb.Append(""); for (int j = 0; j < body.GetLength(1); j++) { sb.Append("" + body[i, j] + ""); } sb.Append(""); } return sb.ToString(); } protected void btnExport_Click(object sender, EventArgs e) { string fileName = "工单流程执行效率报表" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls"; Response.Clear(); Response.Charset = "GB2312"; Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312"); Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName)); Response.ContentType = "application/ms-excel"; Response.Write(TableHtml); Response.End(); } } }