using Aspose.Words.Lists; using BLL; using FineUIPro.Web.DataShow; using Model; using System; using System.ArrayExtensions; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.IO; using System.Linq; using System.Reflection; using System.Web; using System.Web.UI; using WIA; using NPOI.SS.UserModel; using NPOI.SS.Util; using NPOI.XSSF.UserModel; using System.Drawing; using Newtonsoft.Json.Linq; namespace FineUIPro.Web.TestRun.Report { public partial class PreRunSchedule : PageBase { /// /// 点击树状主键 /// public string TreePreRunId { get { return (string)ViewState["TreePreRunId"]; } set { ViewState["TreePreRunId"] = value; } } /// /// 子系统主键 /// public List SubSystemIds { get { return (List)ViewState["SubSystemIds"]; } set { ViewState["SubSystemIds"] = value; } } protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { if (SubSystemIds == null) SubSystemIds = new List(); this.InitTreeMenu();//加载树 } } #region 加载树 /// /// 加载树 /// private void InitTreeMenu() { this.tvControlItem.Nodes.Clear(); TreeNode rootNode = new TreeNode(); rootNode.Text = "系统划分"; rootNode.NodeID = "0"; rootNode.Expanded = true; rootNode.ToolTip = ""; rootNode.EnableClickEvent = true; this.tvControlItem.Nodes.Add(rootNode); var allPreRunLs = Funs.DB.PreRun_SysDevice.Where(p => p.ProjectId == this.CurrUser.LoginProjectId).ToList(); var onePreRunLs = allPreRunLs.Where(p => p.PreRunLevel == 1).OrderBy(x => x.Sort); foreach (var item in onePreRunLs) { TreeNode rootUnitNode = new TreeNode();//定义根节点 rootUnitNode.NodeID = item.PreRunId; rootUnitNode.Text = item.PreRunName; rootUnitNode.ToolTip = item.PreRunName; rootUnitNode.CommandName = ""; rootUnitNode.EnableClickEvent = true; rootUnitNode.EnableExpandEvent = true; rootNode.Nodes.Add(rootUnitNode); rootUnitNode.Expanded = true; var otherPreRunls = allPreRunLs.Where(p => p.PreRunLevel != 1).ToList(); this.BindNodes(rootUnitNode, otherPreRunls, item.PreRunId); } } /// /// 绑定树节点 /// private void BindNodes(TreeNode node, List list, string parentId) { var itemList = list.Where(p => p.ParentId == parentId).OrderBy(x => x.Sort).ToList(); if (itemList.Count > 0) { foreach (var item in itemList) { TreeNode newNode = new TreeNode(); newNode.Text = item.PreRunName; newNode.NodeID = item.PreRunId; newNode.ToolTip = item.PreRunName; newNode.CommandName = ""; newNode.EnableClickEvent = true; node.Nodes.Add(newNode); BindNodes(newNode, list, item.PreRunId); } } } /// /// 数加载 /// protected void tvControlItem_NodeExpand(object sender, TreeNodeEventArgs e) { if (e.Node.Nodes != null) { e.Node.Nodes.Clear(); } var allPreRunLs = Funs.DB.PreRun_SysDevice.Where(p => p.ProjectId == this.CurrUser.LoginProjectId).ToList(); this.BindNodes(e.Node, allPreRunLs, e.NodeID); } /// /// 点击TreeView /// /// /// protected void tvControlItem_NodeCommand(object sender, TreeCommandEventArgs e) { var devices = new List(); this.TreePreRunId = tvControlItem.SelectedNodeID != "0" ? tvControlItem.SelectedNodeID : string.Empty; if (!string.IsNullOrWhiteSpace(this.TreePreRunId)) { var model = Funs.DB.PreRun_SysDevice.FirstOrDefault(x => x.PreRunId == this.TreePreRunId); if (model.PreRunLevel == 4) { this.SubSystemIds = new List() { model.PreRunId }; } else if (model.PreRunLevel == 3) { devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 4 && x.SystemId == model.PreRunId).ToList(); if (devices.Count > 0) { this.SubSystemIds = devices.ConvertAll(x => x.PreRunId); } } else if (model.PreRunLevel == 2) { devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 4 && x.ProcessesId == model.PreRunId).ToList(); if (devices.Count > 0) { this.SubSystemIds = devices.ConvertAll(x => x.PreRunId); } } else if (model.PreRunLevel == 1) { devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 4 && x.InstallationId == model.PreRunId).ToList(); if (devices.Count > 0) { this.SubSystemIds = devices.ConvertAll(x => x.PreRunId); } } } else { devices = Funs.DB.PreRun_SysDevice.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && x.PreRunLevel == 4).ToList(); if (devices.Count > 0) { this.SubSystemIds = devices.ConvertAll(x => x.PreRunId); } } PreRunBrid(); } #endregion #region 数据绑定/导出 /// /// 预试车绑定 /// public void PreRunBrid() { var result = new List(); if (this.SubSystemIds.Count > 0) { result = GetPreRunSchedules(); } GridPreRun.DataSource = result; GridPreRun.DataBind(); JObject summary = new JObject(); summary.Add("WorkPackNum", result.Sum(x => x.WorkPackNum)); summary.Add("WorkPackNoCloseNum", result.Sum(x => x.WorkPackNoCloseNum)); summary.Add("WorkPackCloseNum", result.Sum(x => x.WorkPackCloseNum)); summary.Add("InspectNum", result.Sum(x => x.InspectNum)); summary.Add("InspectNoCloseNum", result.Sum(x => x.InspectNoCloseNum)); summary.Add("InspectCloseNum", result.Sum(x => x.InspectCloseNum)); GridPreRun.SummaryData = summary; } /// /// 导出 /// protected void btnYscExport_Click(object sender, EventArgs e) { string rootPath = Server.MapPath("~/") + Const.ExcelUrl; //导出文件 string filePath = rootPath + DateTime.Now.ToString("yyyyMMddhhmmss") + "\\"; if (!Directory.Exists(filePath)) { Directory.CreateDirectory(filePath); } string ReportFileName = filePath + "预试车进度.xlsx"; var result = GetPreRunSchedules(); if (result.Count > 0) { XSSFWorkbook hssfworkbook = new XSSFWorkbook(); XSSFSheet ws = (XSSFSheet)hssfworkbook.CreateSheet("预试车进度"); #region 列宽 ws.SetColumnWidth(0, (30 * 256)); ws.SetColumnWidth(1, (20 * 256)); ws.SetColumnWidth(2, (20 * 256)); ws.SetColumnWidth(3, (20 * 256)); ws.SetColumnWidth(4, (20 * 256)); ws.SetColumnWidth(5, (20 * 256)); ws.SetColumnWidth(6, (20 * 256)); ws.SetColumnWidth(7, (20 * 256)); ws.SetColumnWidth(8, (20 * 256)); ws.SetColumnWidth(9, (20 * 256)); ws.SetColumnWidth(10, (20 * 256)); #endregion #region 样式 //公共样式 ICellStyle style = SetExcelStyle(hssfworkbook, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, VerticalAlignment.Center, HorizontalAlignment.Center, 10.5, true); //公共样式加粗 ICellStyle styleBold = SetExcelStyle(hssfworkbook, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, BorderStyle.Thin, VerticalAlignment.Center, HorizontalAlignment.Center, 10.5, true, true); #endregion #region 头部 ws = ExcelCreateRowTitle(ws, hssfworkbook, style, 0, 0, 0, 10); //行1 ws.GetRow(0).GetCell(0).CellStyle = styleBold; ws.GetRow(0).GetCell(0).SetCellValue("工作包名称"); ws.GetRow(0).GetCell(1).CellStyle = styleBold; ws.GetRow(0).GetCell(1).SetCellValue("装置名称"); ws.GetRow(0).GetCell(2).CellStyle = styleBold; ws.GetRow(0).GetCell(2).SetCellValue("工序名称"); ws.GetRow(0).GetCell(3).CellStyle = styleBold; ws.GetRow(0).GetCell(3).SetCellValue("系统名称"); ws.GetRow(0).GetCell(4).CellStyle = styleBold; ws.GetRow(0).GetCell(4).SetCellValue("子系统名称"); ws.GetRow(0).GetCell(5).CellStyle = styleBold; ws.GetRow(0).GetCell(5).SetCellValue("工作包数量"); ws.GetRow(0).GetCell(6).CellStyle = styleBold; ws.GetRow(0).GetCell(6).SetCellValue("工作包未关闭数量"); ws.GetRow(0).GetCell(7).CellStyle = styleBold; ws.GetRow(0).GetCell(7).SetCellValue("工作包已关闭数量"); ws.GetRow(0).GetCell(8).CellStyle = styleBold; ws.GetRow(0).GetCell(8).SetCellValue("检查表数量"); ws.GetRow(0).GetCell(9).CellStyle = styleBold; ws.GetRow(0).GetCell(9).SetCellValue("检查表未关闭数量"); ws.GetRow(0).GetCell(10).CellStyle = styleBold; ws.GetRow(0).GetCell(10).SetCellValue("检查表已关闭数量"); #endregion #region 表格 var start = 1; var end = result.Count; ws = ExcelCreateRowTitle(ws, hssfworkbook, style, start, end, 0, 10); //数据 var dataIndex = 1; foreach (var item in result) { ws.GetRow(dataIndex).GetCell(0).SetCellValue(item.WorkPackName); ws.GetRow(dataIndex).GetCell(1).SetCellValue(item.InstallationName); ws.GetRow(dataIndex).GetCell(2).SetCellValue(item.ProcessesName); ws.GetRow(dataIndex).GetCell(3).SetCellValue(item.SystemName); ws.GetRow(dataIndex).GetCell(4).SetCellValue(item.SubsystemName); ws.GetRow(dataIndex).GetCell(5).SetCellValue(item.WorkPackNum); ws.GetRow(dataIndex).GetCell(6).SetCellValue(item.WorkPackNoCloseNum); ws.GetRow(dataIndex).GetCell(7).SetCellValue(item.WorkPackCloseNum); ws.GetRow(dataIndex).GetCell(8).SetCellValue(item.InspectNum); ws.GetRow(dataIndex).GetCell(9).SetCellValue(item.InspectNoCloseNum); ws.GetRow(dataIndex).GetCell(10).SetCellValue(item.InspectCloseNum); dataIndex++; } #endregion #region 尾部 ws = ExcelCreateRowTitle(ws, hssfworkbook, style, end + 1, end + 1, 0, 10); var region = new CellRangeAddress(end + 1, end + 1, 0, 4); ws.AddMergedRegion(region); ws.GetRow(end + 1).GetCell(0).SetCellValue("合计"); ws.GetRow(end + 1).GetCell(5).SetCellValue(result.Count > 0 ? result.Sum(x => x.WorkPackNum).ToString() : "0"); ws.GetRow(end + 1).GetCell(6).SetCellValue(result.Count > 0 ? result.Sum(x => x.WorkPackNoCloseNum).ToString() : "0"); ws.GetRow(end + 1).GetCell(7).SetCellValue(result.Count > 0 ? result.Sum(x => x.WorkPackCloseNum).ToString() : "0"); ws.GetRow(end + 1).GetCell(8).SetCellValue(result.Count > 0 ? result.Sum(x => x.InspectNum).ToString() : "0"); ws.GetRow(end + 1).GetCell(9).SetCellValue(result.Count > 0 ? result.Sum(x => x.InspectNoCloseNum).ToString() : "0"); ws.GetRow(end + 1).GetCell(10).SetCellValue(result.Count > 0 ? result.Sum(x => x.InspectCloseNum).ToString() : "0"); #endregion ws.PrintSetup.Landscape = false; ws.PrintSetup.PaperSize = 9; ws.ForceFormulaRecalculation = true; using (FileStream filess = File.OpenWrite(ReportFileName)) { hssfworkbook.Write(filess); } FileInfo filet = new FileInfo(ReportFileName); Response.Clear(); Response.Charset = "GB2312"; Response.ContentEncoding = System.Text.Encoding.UTF8; // 添加头信息,为"文件下载/另存为"对话框指定默认文件名 Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode("预试车进度.xlsx")); // 添加头信息,指定文件大小,让浏览器能够显示下载进度 Response.AddHeader("Content-Length", filet.Length.ToString()); // 指定返回的是一个不能被客户端读取的流,必须被下载 Response.ContentType = "application/ms-excel"; // 把文件流发送到客户端 Response.WriteFile(filet.FullName); // 停止页面的执行 Response.End(); } } #endregion #region 私有方法 /// /// 创建头部 /// /// private XSSFSheet ExcelCreateRowTitle(XSSFSheet ws, XSSFWorkbook hssfworkbook, ICellStyle style, int sRows, int eRows, int cStart, int cEnd, float height = 21) { for (int i = sRows; i <= eRows; i++) { ws.CreateRow(i); ws.GetRow(i).HeightInPoints = height; for (int j = cStart; j <= cEnd; j++) { ws.GetRow(i).CreateCell(j); ws.GetRow(i).CreateCell(j).CellStyle = style; } } return ws; } /// /// 创建样式 /// /// public static ICellStyle SetExcelStyle(XSSFWorkbook wb, BorderStyle Bottom, BorderStyle Left, BorderStyle Right, BorderStyle Top, VerticalAlignment VerAig, HorizontalAlignment HorAig, double FontSize, bool WrapText = true, bool Bold = false, string FontName = "宋体") { ICellStyle style = wb.CreateCellStyle(); style.BorderBottom = Bottom; style.BorderLeft = Left; style.BorderRight = Right; style.BorderTop = Top; style.VerticalAlignment = VerAig; style.Alignment = HorAig; IFont font = wb.CreateFont(); font.FontHeightInPoints = FontSize; font.IsBold = Bold; font.FontName = FontName; style.SetFont(font); style.WrapText = WrapText; return style; } /// /// 获取预试车统计 /// /// private List GetPreRunSchedules() { string allStr = $"select a.SubSystemId,a.SystemId,b.WorkPackId,b.WorkPackName,b.WorkPackType,(select count(1) from PreRun_SubPropertySelect as gd where gd.SubSystemId = a.SubSystemId) as GdallNum,(select count(1) from PreRun_SubTechnologySelect as sb where sb.SubSystemId = a.SubSystemId) as SballNum,(select count(1) from PreRun_SubInstrumentSelect as sy where sy.SubSystemId = a.SubSystemId) as SyallNum from PreRun_SubSysWorkPackage as a inner join PreRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where a.SubSystemId in ('{string.Join("','", this.SubSystemIds)}') order by a.WorkPackCode asc"; var dt = SQLHelper.GetDataTableRunText(allStr); var list = new List(); string deviceStr = $"select b.PreRunName as InstallationName,c.PreRunName as ProcessesName,d.PreRunName as SystemName,e.PreRunName as SubsystemName from PreRun_SysDevice as a left join PreRun_SysDevice as b on b.PreRunId=ISNULL(a.InstallationId,a.PreRunId) left join PreRun_SysDevice as c on c.PreRunId=a.ProcessesId left join PreRun_SysDevice as d on d.PreRunId=a.SystemId left join PreRun_SysDevice as e on e.PreRunId=a.SubsystemId where a.PreRunId='{this.TreePreRunId}'"; var driveDt = SQLHelper.GetDataTableRunText(deviceStr); string inspectStr = $"select a.WorkPackId,b.WorkPackName,b.Sort,SUM(case ISNULL(a.InspectIsClose, 0) when 1 then 1 else 0 end) as CloseNum,SUM(case ISNULL(a.InspectIsClose, 0) when 0 then 1 else 0 end) as NoCloseNum,COUNT(1) as AllNum from PreRun_SubInspectTerm as a inner join PreRun_WorkPackage as b on a.WorkPackId = b.WorkPackId where 1=1 and a.ProjectId = '{this.CurrUser.LoginProjectId}' and a.SubSystemId in ('{string.Join("','", this.SubSystemIds)}') group by a.WorkPackId,b.WorkPackName,b.Sort order by b.Sort asc"; var inspectDt = SQLHelper.GetDataTableRunText(inspectStr); var inspectlist = DataTableToList(inspectDt); if (dt.Rows.Count > 0) { //获取所有子系统数量 var inspects = Funs.DB.PreRun_SubInspectTerm.Where(x => x.ProjectId == this.CurrUser.LoginProjectId && this.SubSystemIds.Contains(x.SubSystemId)); var querylist = DataTableToList(dt); var queryGroup = querylist.GroupBy(x => new { x.WorkPackId, x.WorkPackName, x.WorkPackType }).Select(p => new { p.Key.WorkPackId, p.Key.WorkPackName, p.Key.WorkPackType, GdallNum = p.Sum(i => i.GdallNum), SballNum = p.Sum(i => i.SballNum), SyallNum = p.Sum(i => i.SyallNum) }); foreach (var itemPack in queryGroup) { var itemQueryList = querylist.Where(x => x.WorkPackId == itemPack.WorkPackId).ToList(); var model = new PreRunScheduleDto(); model.WorkPackId = itemPack.WorkPackId; model.WorkPackName = itemPack.WorkPackName; model.WorkPackType = itemPack.WorkPackType; if (driveDt.Rows.Count > 0) { model.InstallationName = driveDt.Rows[0]["InstallationName"].ToString(); model.ProcessesName = driveDt.Rows[0]["ProcessesName"].ToString(); model.SystemName = driveDt.Rows[0]["SystemName"].ToString(); model.SubsystemName = driveDt.Rows[0]["SubsystemName"].ToString(); } model.GdallNum = itemPack.GdallNum; model.SballNum = itemPack.SballNum; model.SyallNum = itemPack.SyallNum; model.AllGdSbYbNum = (itemPack.GdallNum + itemPack.SballNum + itemPack.SyallNum); model.WorkPackNum = itemQueryList.Count(x => x.WorkPackId == itemPack.WorkPackId); if (inspectlist.Count(a => a.WorkPackId == itemPack.WorkPackId) > 0) { var itemInspect = inspectlist.FirstOrDefault(a => a.WorkPackId == itemPack.WorkPackId); model.InspectNum = itemInspect.AllNum; model.InspectNoCloseNum = itemInspect.NoCloseNum; model.InspectCloseNum = itemInspect.CloseNum; } else { model.WorkPackCloseNum = 0; model.WorkPackNoCloseNum = model.WorkPackNum; model.InspectNum = 0; model.InspectNoCloseNum = 0; model.InspectCloseNum = 0; } model.WorkPackCloseNum = 0; model.WorkPackNoCloseNum = 0; var subsystemids = itemQueryList.ConvertAll(a => a.SubSystemId).Distinct(); foreach (var itemsubid in subsystemids) { if (inspects.Count(x => x.SubSystemId == itemsubid) > 0) { var itemQuerylist = itemQueryList.FirstOrDefault(x => x.SubSystemId == itemsubid && x.WorkPackId == itemPack.WorkPackId); var allNum = itemQuerylist.GdallNum + itemQuerylist.SballNum + itemQuerylist.SyallNum; if (inspects.Count(x => x.SubInspectId == itemsubid && x.InspectIsClose != 1) > 0) { model.WorkPackNoCloseNum += 1; } else { var closeInspect = inspects.Where(x => x.SubInspectId == itemsubid && x.InspectIsClose == 1); var closeNums = closeInspect.Count() > 0 ? closeInspect.Select(x => x.PropertyTechnologyId.Split(',').Count()).Sum(x => x) : 0; if (allNum > closeNums) { model.WorkPackNoCloseNum += 1; } else { model.WorkPackCloseNum += 1; } } } else { model.WorkPackNoCloseNum += 1; } } list.Add(model); } } return list; } /// /// 预试车统计实体 /// public class ScheduleBridDto { /// /// 工作包主键 /// public string PreRunId { get; set; } /// /// 工作包主键 /// public string WorkPackId { get; set; } /// /// 工作包名称 /// public string WorkName { get; set; } /// /// 装置名称 /// public string InstallationName { get; set; } /// /// 工序名称 /// public string ProcessesName { get; set; } /// /// 系统名称 /// public string SystemName { get; set; } /// /// 子系统名称 /// public string SubsystemName { get; set; } /// /// 工作包数量 /// public string AllNum { get; set; } /// /// 未关闭任务单数量 /// public string NoCloseNum { get; set; } /// /// 已关闭任务单数量 /// public string CloseNum { get; set; } } /// /// 预试车统计实体 /// public class PreRunScheduleDto { /// /// 工作包主键 /// public string WorkPackId { get; set; } /// /// 工作包名称 /// public string WorkPackName { get; set; } /// /// 工作包类型 /// public int WorkPackType { get; set; } /// /// 装置名称 /// public string InstallationName { get; set; } /// /// 工序名称 /// public string ProcessesName { get; set; } /// /// 系统名称 /// public string SystemName { get; set; } /// /// 子系统名称 /// public string SubsystemName { get; set; } /// /// 所有管道,设备,仪表索引数量 /// public int AllGdSbYbNum { get; set; } /// /// 工作包所有管道数量 /// public int GdallNum { get; set; } /// /// 工作包所有设备数量 /// public int SballNum { get; set; } /// /// 工作包所有仪表索引数量 /// public int SyallNum { get; set; } /// /// 工作包数量 /// public int WorkPackNum { get; set; } /// /// 工作包未关闭数量 /// public int WorkPackNoCloseNum { get; set; } /// /// 工作包已关闭数量 /// public int WorkPackCloseNum { get; set; } /// /// 检查表数量 /// public int InspectNum { get; set; } /// /// 检查表未关闭数量 /// public int InspectNoCloseNum { get; set; } /// /// 检查表已关闭数量 /// public int InspectCloseNum { get; set; } } /// /// 预试车检查表实体 /// public class WorkPackageInspectDto { /// /// 子系统主键 /// public string SubSystemId { get; set; } /// /// 工作包主键 /// public string WorkPackId { get; set; } /// /// 工作包名称 /// public string WorkPackName { get; set; } /// /// 检查表数量 /// public int AllNum { get; set; } /// /// 未关闭任务单数量 /// public int NoCloseNum { get; set; } /// /// 已关闭任务单数量 /// public int CloseNum { get; set; } } /// /// 子系统工作包和总设备/管道/仪表数量 /// public class QuerySubSysWorkPackage { /// /// 子系统主键 /// public string SubSystemId { get; set; } /// /// 系统主键 /// public string SystemId { get; set; } /// /// 工作包主键 /// public string WorkPackId { get; set; } /// /// 工作包名称 /// public string WorkPackName { get; set; } /// /// 工作包类型 /// public int WorkPackType { get; set; } /// /// 管道总数量 /// public int GdallNum { get; set; } /// /// 设备总数量 /// public int SballNum { get; set; } /// /// 仪表索引总数量 /// public int SyallNum { get; set; } } #endregion #region 转换 /// /// DataTable转换List /// /// public List DataTableToList(DataTable table) { List list = new List(); T t = default(T); PropertyInfo[] propertypes = null; string tempName = string.Empty; foreach (DataRow row in table.Rows) { t = Activator.CreateInstance(); propertypes = t.GetType().GetProperties(); foreach (PropertyInfo pro in propertypes) { tempName = pro.Name; if (table.Columns.Contains(tempName)) { object value = row[tempName]; if (!value.ToString().Equals("")) { pro.SetValue(t, value, null); } } } list.Add(t); } return list.Count == 0 ? new List() : list; } #endregion } }