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; } } /// /// 开始年月 /// public string StartDate { get => (string)ViewState["StartDate"]; set => ViewState["StartDate"] = value; } /// /// 结束年月 /// 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 projects = new List(); #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 绑定数据 /// /// 绑定数据 /// 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(); 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 dataList = new List(); 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); } /// /// 数据合计 /// /// private void OutputSummaryData(List 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 数据操作 /// /// 分页 /// /// /// protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e) { this.Grid1.PageIndex = e.NewPageIndex; this.BindGrid(); } /// /// 排序 /// /// /// 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 关闭弹出窗 /// /// 关闭弹出窗 /// /// /// protected void Window1_Close(object sender, WindowCloseEventArgs e) { BindGrid(); } #endregion #region 导出按钮 /// 导出按钮 /// /// /// 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(""); sb.Append(""); foreach (List rows in mht.MultiTable) { sb.Append(""); 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("{3}", rowspan != 1 ? " rowspan=\"" + rowspan + "\"" : "", colspan != 1 ? " colspan=\"" + colspan + "\"" : "", colspan != 1 ? " style=\"text-align:center;\"" : "", column.HeaderText); } sb.Append(""); } foreach (GridRow row in grid.Rows) { sb.Append(""); 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("", html); } sb.Append(""); } sb.Append("
{0}
"); return sb.ToString(); } #region 多表头处理 /// /// 多表头处理 /// public class MultiHeaderTable { // 包含 rowspan,colspan 的多表头,方便生成 HTML 的 table 标签 public List> MultiTable = new List>(); // 最终渲染的列数组 public List Columns = new List(); public void ResolveMultiHeaderTable(GridColumnCollection columns) { List row = new List(); 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 row) { foreach (object[] cell in row) { GroupField groupField = cell[2] as GroupField; if (groupField != null && groupField.Columns.Count > 0) { List subrow = new List(); 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 row, int level) { List nextrow = new List(); 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; } } } }