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("| " + head[i] + " | ");
}
sb.Append("
");
sb.Append(createTableBody(body));
sb.Append("
");
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("| " + head[i] + " | ");
}
sb.Append("
");
sb.Append(createTableBody1(body));
sb.Append("");
for (int i = 0; i < sumiteam.Length; i++)
{
sb.Append("| " + sumiteam[i] + " | ");
}
sb.Append("
");
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();
}
}
}