SGGL_JT/SUBQHSE/FineUIPro.Web/HSSE/HiddenInspection/CheckStatisticsAnalysisProj...

576 lines
19 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using BLL;
using Model;
using Newtonsoft.Json.Linq;
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
namespace FineUIPro.Web.HSSE.HiddenInspection
{
public partial class HSSECheckStatisticsAnalysisProject : PageBase
{
public DataTable ChartTable
{
get { return (DataTable)ViewState["ChartTable"]; }
set { ViewState["ChartTable"] = value; }
}
/// <summary>
/// 开始年月
/// </summary>
public string StartDate
{
get => (string)ViewState["StartDate"];
set => ViewState["StartDate"] = value;
}
/// <summary>
/// 结束年月
/// </summary>
public string EndDate
{
get => (string)ViewState["EndDate"];
set => ViewState["EndDate"] = value;
}
public string UnitId
{
get => (string)ViewState["UnitId"];
set => ViewState["UnitId"] = value;
}
public bool ShowHsse
{
get => (bool)ViewState["ShowHsse"];
set => ViewState["ShowHsse"] = value;
}
public bool ShowEnvironment
{
get => (bool)ViewState["ShowEnvironment"];
set => ViewState["ShowEnvironment"] = value;
}
public bool ShowCqms
{
get => (bool)ViewState["ShowCqms"];
set => ViewState["ShowCqms"] = value;
}
public List<string> projects = new List<string>();
#region Page_Init
// 注意动态创建的代码需要放置于Page_Init不是Page_Load这样每次构造页面时都会执行
protected void Page_Init(object sender, EventArgs e)
{
string ProblemTypes = Request.Params["Types"];
ShowHsse = ProblemTypes.Contains("1");
ShowCqms = ProblemTypes.Contains("2");
ShowEnvironment = ProblemTypes.Contains("3");
InitGrid();
}
private void InitGrid()
{
StartDate = Request.Params["StartDate"];
EndDate = Request.Params["EndDate"];
UnitId = Request.Params["UnitId"];
string ProjectStr = Request.Params["ProjectStr"];
if (!string.IsNullOrWhiteSpace(ProjectStr))
{
var projectlst = ProjectStr.Split(',');
foreach (var un in projectlst)
{
if (!string.IsNullOrWhiteSpace(un))
{
projects.Add(un);
}
}
}
}
#endregion
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.drpChartType.DataTextField = "ConstText";
this.drpChartType.DataValueField = "ConstValue";
this.drpChartType.DataSource = BLL.ConstValue.drpConstItemList(ConstValue.Group_ChartType);
this.drpChartType.DataBind();
// 绑定表格
this.BindGrid();
AnalyseData();
}
}
#region
/// <summary>
/// 绑定数据
/// </summary>
private void BindGrid()
{
ChartTable = new DataTable();
ChartTable.Columns.Add("项目");
ChartTable.Columns.Add("待整改数");
ChartTable.Columns.Add("已关闭数");
DateTime start = DateTime.Parse(StartDate);
DateTime end = DateTime.Parse(EndDate);
var sublist = (from x in Funs.DB.Base_Project
where (x.ProjectState == null || x.ProjectState == BLL.Const.ProjectState_1) &&
(x.IsDelete == null || x.IsDelete == false) && x.UnitId == UnitId
orderby x.ProjectCode descending
select x).ToList();
var allHazardList = new List<TempHazardModel>();
if (ShowHsse)
{
allHazardList = (from x in Funs.DB.View_Hazard_HazardRegister
where x.CheckTime.HasValue && x.CheckTime.Value >= start && x.CheckTime.Value <= end
select new TempHazardModel
{
ProjectId = x.ProjectId,
ProjectName = x.ProjectName,
States = x.States,
CheckTime = x.CheckTime
}).ToList();
}
if (ShowCqms)
{
allHazardList = (from x in Funs.DB.Check_CheckControl
join p in Funs.DB.Base_Project on x.ProjectId equals p.ProjectId into pt
from p in pt
join y in Funs.DB.Check_CheckControl on x.CheckControlCode equals y.CheckControlCode into yt
from y in yt
where x.CheckDate.HasValue && x.CheckDate.Value >= start && x.CheckDate.Value <= end
select new TempHazardModel
{
ProjectId = x.ProjectId,
ProjectName = p.ProjectName,
States = y.State,
CheckTime = x.CheckDate
}).ToList();
}
if (projects.Count > 0)
{
allHazardList = allHazardList.Where(x => projects.Contains(x.ProjectId)).ToList();
}
List<AnalysisData> dataList = new List<AnalysisData>();
foreach (var item in sublist) //项目分组
{
if (projects.Count > 0 && !(projects.Where(x => x == item.ProjectId).Any()))
{
continue;
}
AnalysisData analysisData = new AnalysisData();
var projectHazardList = from x in allHazardList
where x.ProjectId == item.ProjectId
select x; //当前项目所有隐患
int closeList = 0;
if (ShowHsse)
{
closeList = projectHazardList.Where(x => x.States == "3").Count(); //已闭环
}
if (ShowCqms)
{
closeList = projectHazardList.Where(x => x.States == "7").Count(); //已闭环
}
analysisData.ProjectId = item.ProjectId;
analysisData.ProjectName = !string.IsNullOrEmpty(item.ShortName) ? item.ShortName : item.ProjectName;
analysisData.HJNum = projectHazardList.Count();
analysisData.CloseNum = closeList;
analysisData.UNCloseNum = projectHazardList.Count() - closeList;
if (projectHazardList.Count() > 0)
{
double rate = closeList / (double)projectHazardList.Count() * 100;
analysisData.ProjectRate = rate.ToString("F2") + "%"; // 保留两位小数
}
else
{
// 处理分母为零的情况,例如设置一个默认值或抛出异常
analysisData.ProjectRate = "0.00%"; // 或者其他适当的默认值
}
dataList.Add(analysisData);
//chart图表
DataRow chartTableRow = ChartTable.NewRow();
chartTableRow["项目"] = !string.IsNullOrEmpty(item.ShortName) ? item.ShortName : item.ProjectName;
chartTableRow["待整改数"] = projectHazardList.Count() - closeList;
chartTableRow["已关闭数"] = closeList;
ChartTable.Rows.Add(chartTableRow);
}
Grid1.RecordCount = dataList.Count;
Grid1.DataSource = dataList;
Grid1.DataBind();
// 数据合计
OutputSummaryData(dataList);
}
/// <summary>
/// 数据合计
/// </summary>
/// <param name="source"></param>
private void OutputSummaryData(List<AnalysisData> source)
{
JObject summary = new JObject();
summary.Add("ProjectName", "合计");
int UNCloseNumAll = 0;
int CloseNumAll = 0;
int HJNumAll = 0;
foreach (var analysisData in source)
{
UNCloseNumAll += Convert.ToInt32(analysisData.UNCloseNum);
CloseNumAll += Convert.ToInt32(analysisData.CloseNum);
HJNumAll += Convert.ToInt32(analysisData.HJNum);
}
summary.Add("UNCloseNum", UNCloseNumAll);
summary.Add("CloseNum", CloseNumAll);
summary.Add("HJNum", HJNumAll);
Grid1.SummaryData = summary;
}
#endregion
#region GV
/// <summary>
/// 分页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e)
{
this.Grid1.PageIndex = e.NewPageIndex;
this.BindGrid();
}
/// <summary>
/// 排序
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Grid1_Sort(object sender, GridSortEventArgs e)
{
this.Grid1.SortDirection = e.SortDirection;
this.Grid1.SortField = e.SortField;
this.BindGrid();
}
#endregion
#region
protected void btnQuery_OnClick(object sender, EventArgs e)
{
BindGrid();
}
#endregion
#region
/// <summary>
/// 关闭弹出窗
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Window1_Close(object sender, WindowCloseEventArgs e)
{
BindGrid();
}
#endregion
#region
/// 导出按钮
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnOut_Click(object sender, EventArgs e)
{
Response.ClearContent();
string filename = Funs.GetNewFileName();
Response.AddHeader("content-disposition",
"attachment; filename=" +
System.Web.HttpUtility.UrlEncode("安全巡检统计分析表" + filename, System.Text.Encoding.UTF8) + ".xls");
Response.ContentType = "application/excel";
Response.ContentEncoding = System.Text.Encoding.UTF8;
this.Grid1.PageSize = 500;
this.BindGrid();
Response.Write(GetGridTableHtml(Grid1));
Response.End();
}
private string GetGridTableHtml(Grid grid)
{
StringBuilder sb = new StringBuilder();
MultiHeaderTable mht = new MultiHeaderTable();
mht.ResolveMultiHeaderTable(Grid1.Columns);
sb.Append("<meta http-equiv=\"Content-Type\" content=\"application/vnd.ms-excel;charset=utf-8\"/>");
sb.Append("<table cellspacing=\"0\" rules=\"all\" border=\"1\" style=\"border-collapse:collapse;\">");
foreach (List<object[]> rows in mht.MultiTable)
{
sb.Append("<tr>");
foreach (object[] cell in rows)
{
int rowspan = Convert.ToInt32(cell[0]);
int colspan = Convert.ToInt32(cell[1]);
GridColumn column = cell[2] as GridColumn;
sb.AppendFormat("<th{0}{1}{2}>{3}</th>",
rowspan != 1 ? " rowspan=\"" + rowspan + "\"" : "",
colspan != 1 ? " colspan=\"" + colspan + "\"" : "",
colspan != 1 ? " style=\"text-align:center;\"" : "",
column.HeaderText);
}
sb.Append("</tr>");
}
foreach (GridRow row in grid.Rows)
{
sb.Append("<tr>");
foreach (GridColumn column in mht.Columns)
{
string html = row.Values[column.ColumnIndex].ToString();
if (column.ColumnID == "tfNumber")
{
html = (row.FindControl("lblNumber") as System.Web.UI.WebControls.Label).Text;
}
else if (column.ColumnID == "tfGender")
{
html = (row.FindControl("labGender") as System.Web.UI.WebControls.Label).Text;
}
sb.AppendFormat("<td>{0}</td>", html);
}
sb.Append("</tr>");
}
sb.Append("</table>");
return sb.ToString();
}
#region
/// <summary>
/// 多表头处理
/// </summary>
public class MultiHeaderTable
{
// 包含 rowspancolspan 的多表头,方便生成 HTML 的 table 标签
public List<List<object[]>> MultiTable = new List<List<object[]>>();
// 最终渲染的列数组
public List<GridColumn> Columns = new List<GridColumn>();
public void ResolveMultiHeaderTable(GridColumnCollection columns)
{
List<object[]> row = new List<object[]>();
foreach (GridColumn column in columns)
{
object[] cell = new object[4];
cell[0] = 1; // rowspan
cell[1] = 1; // colspan
cell[2] = column;
cell[3] = null;
row.Add(cell);
}
ResolveMultiTable(row, 0);
ResolveColumns(row);
}
private void ResolveColumns(List<object[]> row)
{
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
List<object[]> subrow = new List<object[]>();
foreach (GridColumn column in groupField.Columns)
{
subrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
ResolveColumns(subrow);
}
else
{
Columns.Add(cell[2] as GridColumn);
}
}
}
private void ResolveMultiTable(List<object[]> row, int level)
{
List<object[]> nextrow = new List<object[]>();
foreach (object[] cell in row)
{
GroupField groupField = cell[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
// 如果当前列包含子列,则更改当前列的 colspan以及增加父列向上递归的colspan
cell[1] = Convert.ToInt32(groupField.Columns.Count);
PlusColspan(level - 1, cell[3] as GridColumn, groupField.Columns.Count - 1);
foreach (GridColumn column in groupField.Columns)
{
nextrow.Add(new object[]
{
1,
1,
column,
groupField
});
}
}
}
MultiTable.Add(row);
// 如果当前下一行,则增加上一行(向上递归)中没有子列的列的 rowspan
if (nextrow.Count > 0)
{
PlusRowspan(level);
ResolveMultiTable(nextrow, level + 1);
}
}
private void PlusRowspan(int level)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GroupField groupField = cells[2] as GroupField;
if (groupField != null && groupField.Columns.Count > 0)
{
}
else
{
cells[0] = Convert.ToInt32(cells[0]) + 1;
}
}
PlusRowspan(level - 1);
}
private void PlusColspan(int level, GridColumn parent, int plusCount)
{
if (level < 0)
{
return;
}
foreach (object[] cells in MultiTable[level])
{
GridColumn column = cells[2] as GridColumn;
if (column == parent)
{
cells[1] = Convert.ToInt32(cells[1]) + plusCount;
PlusColspan(level - 1, cells[3] as GridColumn, plusCount);
}
}
}
}
#endregion
#endregion
protected void drpChartType_SelectedIndexChanged(object sender, EventArgs e)
{
AnalyseData();
}
private void AnalyseData()
{
DataView dv = new DataView(ChartTable);
var tb = dv.ToTable();
DataTable newTable = new DataTable();
foreach (DataColumn column in tb.Columns)
{
newTable.Columns.Add(column.ColumnName, column.DataType);
}
// 将数据从原始表复制到新的DataTable中
foreach (DataRow row in tb.Rows)
{
DataRow newRow = newTable.NewRow();
foreach (DataColumn column in newTable.Columns)
{
newRow[column.ColumnName] = row[column.ColumnName];
}
newTable.Rows.Add(newRow);
}
this.ChartHiddenDangerProject.CreateChart1(BLL.ChartControlService.GetDataSourceChart(newTable, "安全巡检统计分析",
this.drpChartType.SelectedValue, 1150, 450, false));
}
public class AnalysisData
{
public string ProjectId { get; set; }
public string ProjectName { get; set; }
public int UNCloseNum { get; set; }
public int CloseNum { get; set; }
public int HJNum { get; set; }
public string ProjectRate { get; set; }
}
public class TempHazardModel
{
public string ProjectId { get; set; }
public string ProjectName { get; set; }
public string States { get; set; }
public DateTime? CheckTime { get; set; }
}
}
}