feat(hjgl): 完善图纸识别与材料管段信息管理

扩展图纸识别结果模型和保存流程,按管线及页码替换识别明细,
避免重复导入造成数据累积;同时自动补充材料编码库数据,
新增材料总览、管段长度总览及 PDF 焊口标记功能,提升识别数据
的查询、复核和后续使用效率。
This commit is contained in:
2026-07-17 14:36:32 +08:00
parent 040de31eb1
commit 7fb6b255d2
36 changed files with 2313 additions and 354 deletions
@@ -202,6 +202,9 @@
DataField="CoverWelderTeamGroupName" FieldType="String" HeaderTextAlign="Center"
TextAlign="Center" Width="90px">
</f:RenderField>
<f:RenderField HeaderText="是否热处理" ColumnID="IsHotProessStr" DataField="IsHotProessStr"
FieldType="String" HeaderTextAlign="Center" Width="120px">
</f:RenderField>
<f:RenderField HeaderText="热处理报告编号" ColumnID="HotProessReportNo" DataField="HotProessReportNo"
FieldType="String" HeaderTextAlign="Center" Width="120px">
</f:RenderField>
@@ -623,6 +623,7 @@ namespace FineUIPro.Web.HJGL.InfoQuery
var q = (from x in View_HJGL_WeldJoint
select new
{
线 = x.PipelineCode,
= x.WeldJointCode,
= x.IsWeldOK,
= x.UnitName,
@@ -647,6 +648,7 @@ namespace FineUIPro.Web.HJGL.InfoQuery
= x.BackingWelderTeamGroupName,
= x.CoverWelderCode,
= x.CoverWelderTeamGroupName,
= x.IsHotProessStr,
= x.HotProessReportNo,
= x.HotProessResult,
= x.HardReportNo,
@@ -0,0 +1,78 @@
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="MaterialOverview.aspx.cs" Inherits="FineUIPro.Web.HJGL.InfoQuery.MaterialOverview" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>管道材信息总览</title>
<link href="../../res/css/common.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<f:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server" />
<f:Panel ID="Panel1" runat="server" ShowBorder="false" ShowHeader="false" Layout="Region">
<Items>
<f:Panel ID="panelLeftRegion" runat="server" RegionPosition="Left" RegionSplit="true" EnableCollapse="true"
Width="270px" Title="WBS目录" ShowBorder="true" Layout="Fit" ShowHeader="true" AutoScroll="true" BodyPadding="5px"
IconFont="ArrowCircleLeft">
<Items>
<f:Tree ID="tvControlItem" runat="server" ShowHeader="false" Title="装置区域" ShowBorder="false"
EnableCollapse="true" EnableSingleClickExpand="true" AutoLeafIdentification="true"
EnableSingleExpand="true" EnableTextSelection="true" OnNodeCommand="tvControlItem_NodeCommand">
</f:Tree>
</Items>
</f:Panel>
<f:Panel ID="panelCenterRegion" runat="server" RegionPosition="Center" Margin="5px" BodyPadding="5px"
ShowBorder="true" ShowHeader="false" Layout="Fit">
<Toolbars>
<f:Toolbar ID="Toolbar1" Position="Top" runat="server">
<Items>
<f:TextBox ID="txtPipeNo" runat="server" Label="管线号" LabelWidth="70px" Width="260px" EmptyText="输入管线号" />
<f:TextBox ID="txtMaterialCode" runat="server" Label="材料编码" LabelWidth="70px" Width="260px" EmptyText="输入材料编码" />
<f:ToolbarFill ID="ToolbarFill1" runat="server" />
<f:Button ID="btnQuery" runat="server" Text="查询" ToolTip="查询" Icon="SystemSearch" OnClick="btnQuery_Click" />
<f:Button ID="btnOut" runat="server" Text="导出" ToolTip="导出" Icon="FolderUp"
OnClick="btnOut_Click" EnableAjax="false" DisableControlBeforePostBack="false" />
</Items>
</f:Toolbar>
</Toolbars>
<Items>
<f:Grid ID="Grid1" runat="server" ShowBorder="false" ShowHeader="false" DataKeyNames="Id" DataIDField="Id"
EnableColumnLines="true" EnableTextSelection="true" AllowColumnLocking="true" AllowSorting="true"
AllowPaging="true" IsDatabasePaging="true" PageSize="15" OnPageIndexChange="Grid1_PageIndexChange" OnSort="Grid1_Sort">
<Columns>
<f:RowNumberField HeaderText="序号" Width="60px" EnablePagingNumber="true" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="管线号" ColumnID="Pipe_no" DataField="Pipe_no" SortField="Pipe_no" FieldType="String" Width="220px" Locked="true" HeaderTextAlign="Center" />
<f:RenderField HeaderText="管线页码" ColumnID="Pipe_page_no" DataField="Pipe_page_no" SortField="Pipe_page_no" FieldType="Int" Width="90px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="序号" ColumnID="Seq_no" DataField="Seq_no" SortField="Seq_no" FieldType="Int" Width="70px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="材料编码" ColumnID="Code" DataField="Code" SortField="Code" FieldType="String" Width="120px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="图号" ColumnID="Drawing_number" DataField="Drawing_number" SortField="Drawing_number" FieldType="String" Width="160px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="类型" ColumnID="Category" DataField="Category" SortField="Category" FieldType="String" Width="100px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="规格" ColumnID="Spec" DataField="Spec" SortField="Spec" FieldType="String" Width="120px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="数量" ColumnID="Qty" DataField="Qty" SortField="Qty" FieldType="String" Width="80px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="单位" ColumnID="Unit" DataField="Unit" SortField="Unit" FieldType="String" Width="80px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="材质" ColumnID="Material" DataField="Material" SortField="Material" FieldType="String" Width="150px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="描述" ColumnID="Description" DataField="Description" SortField="Description" FieldType="String" Width="300px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="备注" ColumnID="Remark" DataField="Remark" SortField="Remark" FieldType="String" Width="160px" HeaderTextAlign="Center" ExpandUnusedSpace="true" />
</Columns>
<PageItems>
<f:ToolbarSeparator ID="ToolbarSeparator1" runat="server">
</f:ToolbarSeparator>
<f:ToolbarText ID="ToolbarText1" runat="server" Text="每页记录数:">
</f:ToolbarText>
<f:DropDownList runat="server" ID="ddlPageSize" Width="80px" AutoPostBack="true"
OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged">
<f:ListItem Text="10" Value="10" />
<f:ListItem Text="15" Value="15" />
<f:ListItem Text="20" Value="20" />
<f:ListItem Text="25" Value="25" />
<f:ListItem Text="所有行" Value="10000" />
</f:DropDownList>
</PageItems>
</f:Grid>
</Items>
</f:Panel>
</Items>
</f:Panel>
</form>
</body>
</html>
@@ -0,0 +1,163 @@
using BLL;
using MiniExcelLibs;
using Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FineUIPro.Web.HJGL.InfoQuery
{
public partial class MaterialOverview : PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlPageSize.SelectedValue = Grid1.PageSize.ToString();
InitTreeMenu();
}
}
private void InitTreeMenu()
{
tvControlItem.Nodes.Clear();
TreeNode civilNode = new TreeNode { NodeID = "1", Text = "建筑工程", Selectable = false };
TreeNode installNode = new TreeNode { NodeID = "2", Text = "安装工程", Selectable = false, Expanded = true };
tvControlItem.Nodes.Add(civilNode);
tvControlItem.Nodes.Add(installNode);
string projectId = CurrUser.LoginProjectId;
// 识别结果未保存项目和WBS字段,按管线号关联项目管线后才能实现项目隔离和WBS筛选。
var recordCounts = (from material in Funs.DB.HJGL_DrawingRecognition_Material
join pipeline in Funs.DB.HJGL_Pipeline on material.Pipe_no equals pipeline.PipelineCode
where pipeline.ProjectId == projectId && pipeline.UnitWorkId != null
group material by pipeline.UnitWorkId into groupItem
select new { UnitWorkId = groupItem.Key, Count = groupItem.Count() }).ToDictionary(x => x.UnitWorkId, x => x.Count);
var unitWorks = (from unitWork in Funs.DB.WBS_UnitWork
where unitWork.ProjectId == projectId && unitWork.SuperUnitWork == null && unitWork.UnitId != null && unitWork.ProjectType != null
orderby unitWork.UnitWorkCode
select unitWork).ToList();
var unitIds = unitWorks.Where(x => x.UnitId != null).Select(x => x.UnitId).Distinct().ToList();
var unitNames = (from unit in Funs.DB.Base_Unit where unitIds.Contains(unit.UnitId) select unit).ToDictionary(x => x.UnitId, x => x.UnitName);
foreach (var unitWork in unitWorks)
{
int count = recordCounts.ContainsKey(unitWork.UnitWorkId) ? recordCounts[unitWork.UnitWorkId] : 0;
TreeNode node = new TreeNode();
node.NodeID = unitWork.UnitWorkId;
node.Text = unitWork.UnitWorkName + "【" + count + "】材料";
node.ToolTip = "施工单位:" + (unitNames.ContainsKey(unitWork.UnitId) ? unitNames[unitWork.UnitId] : "");
node.EnableClickEvent = true;
(unitWork.ProjectType == "1" ? civilNode : installNode).Nodes.Add(node);
}
}
protected void tvControlItem_NodeCommand(object sender, TreeCommandEventArgs e)
{
Grid1.PageIndex = 0;
BindGrid();
}
private void BindGrid()
{
string unitWorkId = tvControlItem.SelectedNodeID;
if (string.IsNullOrEmpty(unitWorkId))
{
Grid1.RecordCount = 0;
Grid1.DataSource = new List<HJGL_DrawingRecognition_Material>();
Grid1.DataBind();
return;
}
var query = ApplySort(GetCurrentQuery(unitWorkId));
Grid1.RecordCount = query.Count();
Grid1.DataSource = query.Skip(Grid1.PageIndex * Grid1.PageSize).Take(Grid1.PageSize).ToList();
Grid1.DataBind();
}
/// <summary>
/// 汇总当前WBS节点和页面筛选条件,保证列表与导出数据完全一致。
/// </summary>
private IQueryable<HJGL_DrawingRecognition_Material> GetCurrentQuery(string unitWorkId)
{
string pipeNo = txtPipeNo.Text.Trim();
string materialCode = txtMaterialCode.Text.Trim();
var query = from material in Funs.DB.HJGL_DrawingRecognition_Material
join pipeline in Funs.DB.HJGL_Pipeline on material.Pipe_no equals pipeline.PipelineCode
where pipeline.ProjectId == CurrUser.LoginProjectId && pipeline.UnitWorkId == unitWorkId
select material;
if (!string.IsNullOrEmpty(pipeNo)) query = query.Where(x => x.Pipe_no.Contains(pipeNo));
if (!string.IsNullOrEmpty(materialCode)) query = query.Where(x => x.Code.Contains(materialCode));
return query;
}
private IQueryable<HJGL_DrawingRecognition_Material> ApplySort(IQueryable<HJGL_DrawingRecognition_Material> query)
{
bool descending = Grid1.SortDirection == "DESC";
switch (Grid1.SortField)
{
case "Pipe_page_no": return descending ? query.OrderByDescending(x => x.Pipe_page_no) : query.OrderBy(x => x.Pipe_page_no);
case "Seq_no": return descending ? query.OrderByDescending(x => x.Seq_no) : query.OrderBy(x => x.Seq_no);
case "Code": return descending ? query.OrderByDescending(x => x.Code) : query.OrderBy(x => x.Code);
case "Drawing_number": return descending ? query.OrderByDescending(x => x.Drawing_number) : query.OrderBy(x => x.Drawing_number);
case "Category": return descending ? query.OrderByDescending(x => x.Category) : query.OrderBy(x => x.Category);
case "Spec": return descending ? query.OrderByDescending(x => x.Spec) : query.OrderBy(x => x.Spec);
case "Qty": return descending ? query.OrderByDescending(x => x.Qty) : query.OrderBy(x => x.Qty);
case "Unit": return descending ? query.OrderByDescending(x => x.Unit) : query.OrderBy(x => x.Unit);
case "Material": return descending ? query.OrderByDescending(x => x.Material) : query.OrderBy(x => x.Material);
case "Description": return descending ? query.OrderByDescending(x => x.Description) : query.OrderBy(x => x.Description);
case "Remark": return descending ? query.OrderByDescending(x => x.Remark) : query.OrderBy(x => x.Remark);
default: return descending ? query.OrderByDescending(x => x.Pipe_no) : query.OrderBy(x => x.Pipe_no);
}
}
protected void btnQuery_Click(object sender, EventArgs e) { Grid1.PageIndex = 0; BindGrid(); }
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e) { Grid1.PageIndex = e.NewPageIndex; BindGrid(); }
protected void Grid1_Sort(object sender, GridSortEventArgs e) { Grid1.SortField = e.SortField; Grid1.SortDirection = e.SortDirection; BindGrid(); }
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) { Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue); Grid1.PageIndex = 0; BindGrid(); }
protected void btnOut_Click(object sender, EventArgs e)
{
string unitWorkId = tvControlItem.SelectedNodeID;
if (string.IsNullOrEmpty(unitWorkId))
{
ShowNotify("请先选择WBS目录", MessageBoxIcon.Warning);
return;
}
// 导出所有满足当前筛选条件的记录,不受列表分页大小限制。
var data = ApplySort(GetCurrentQuery(unitWorkId)).Select(x => new
{
线 = x.Pipe_no,
线 = x.Pipe_page_no,
= x.Seq_no,
= x.Code,
= x.Drawing_number,
= x.Category,
= x.Spec,
= x.Qty,
= x.Unit,
= x.Material,
= x.Description,
= x.Remark
}).ToList();
string path = Path.Combine(Funs.RootPath, "File", "Excel", "Temp", "MaterialOverview" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx");
MiniExcel.SaveAs(path, data);
DownloadExcel(path, "管道材料信息总览.xlsx");
}
private void DownloadExcel(string path, string fileName)
{
FileInfo info = new FileInfo(path);
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", info.Length.ToString());
System.Web.HttpContext.Current.Response.TransmitFile(path, 0, info.Length);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.Close();
File.Delete(path);
}
}
}
@@ -0,0 +1,161 @@
//------------------------------------------------------------------------------
// <自动生成>
// 此代码由工具生成。
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </自动生成>
//------------------------------------------------------------------------------
namespace FineUIPro.Web.HJGL.InfoQuery
{
public partial class MaterialOverview
{
/// <summary>
/// form1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
/// <summary>
/// PageManager1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.PageManager PageManager1;
/// <summary>
/// Panel1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel Panel1;
/// <summary>
/// panelLeftRegion 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel panelLeftRegion;
/// <summary>
/// tvControlItem 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Tree tvControlItem;
/// <summary>
/// panelCenterRegion 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel panelCenterRegion;
/// <summary>
/// Toolbar1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Toolbar Toolbar1;
/// <summary>
/// txtPipeNo 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.TextBox txtPipeNo;
/// <summary>
/// txtMaterialCode 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.TextBox txtMaterialCode;
/// <summary>
/// ToolbarFill1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarFill ToolbarFill1;
/// <summary>
/// btnQuery 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Button btnQuery;
/// <summary>
/// btnOut 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Button btnOut;
/// <summary>
/// Grid1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Grid Grid1;
/// <summary>
/// ToolbarSeparator1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarSeparator ToolbarSeparator1;
/// <summary>
/// ToolbarText1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarText ToolbarText1;
/// <summary>
/// ddlPageSize 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.DropDownList ddlPageSize;
}
}
@@ -0,0 +1,72 @@
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="PipeLengthOverview.aspx.cs" Inherits="FineUIPro.Web.HJGL.InfoQuery.PipeLengthOverview" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>管长信息总览</title>
<link href="../../res/css/common.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form id="form1" runat="server">
<f:PageManager ID="PageManager1" AutoSizePanelID="Panel1" runat="server" />
<f:Panel ID="Panel1" runat="server" ShowBorder="false" ShowHeader="false" Layout="Region">
<Items>
<f:Panel ID="panelLeftRegion" runat="server" RegionPosition="Left" RegionSplit="true" EnableCollapse="true"
Width="270px" Title="WBS目录" ShowBorder="true" Layout="Fit" ShowHeader="true" AutoScroll="true" BodyPadding="5px"
IconFont="ArrowCircleLeft">
<Items>
<f:Tree ID="tvControlItem" runat="server" ShowHeader="false" Title="装置区域" ShowBorder="false"
EnableCollapse="true" EnableSingleClickExpand="true" AutoLeafIdentification="true"
EnableSingleExpand="true" EnableTextSelection="true" OnNodeCommand="tvControlItem_NodeCommand">
</f:Tree>
</Items>
</f:Panel>
<f:Panel ID="panelCenterRegion" runat="server" RegionPosition="Center" Margin="5px" BodyPadding="5px"
ShowBorder="true" ShowHeader="false" Layout="Fit">
<Toolbars>
<f:Toolbar ID="Toolbar1" Position="Top" runat="server">
<Items>
<f:TextBox ID="txtPipeNo" runat="server" Label="管线号" LabelWidth="70px" Width="260px" EmptyText="输入管线号" />
<f:TextBox ID="txtDn" runat="server" Label="公称直径" LabelWidth="70px" Width="220px" EmptyText="输入DN" />
<f:ToolbarFill ID="ToolbarFill1" runat="server" />
<f:Button ID="btnQuery" runat="server" Text="查询" ToolTip="查询" Icon="SystemSearch" OnClick="btnQuery_Click" />
<f:Button ID="btnOut" runat="server" Text="导出" ToolTip="导出" Icon="FolderUp"
OnClick="btnOut_Click" EnableAjax="false" DisableControlBeforePostBack="false" />
</Items>
</f:Toolbar>
</Toolbars>
<Items>
<f:Grid ID="Grid1" runat="server" ShowBorder="false" ShowHeader="false" DataKeyNames="Id" DataIDField="Id"
EnableColumnLines="true" EnableTextSelection="true" AllowColumnLocking="true" AllowSorting="true"
AllowPaging="true" IsDatabasePaging="true" PageSize="15" OnPageIndexChange="Grid1_PageIndexChange" OnSort="Grid1_Sort">
<Columns>
<f:RowNumberField HeaderText="序号" Width="60px" EnablePagingNumber="true" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="管线号" ColumnID="Pipe_no" DataField="Pipe_no" SortField="Pipe_no" FieldType="String" Width="260px" Locked="true" HeaderTextAlign="Center" />
<f:RenderField HeaderText="管线页码" ColumnID="Pipe_page_no" DataField="Pipe_page_no" SortField="Pipe_page_no" FieldType="Int" Width="90px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="分组序号" ColumnID="Group_index" DataField="Group_index" SortField="Group_index" FieldType="Int" Width="90px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="位置编号" ColumnID="Pos_no" DataField="Pos_no" SortField="Pos_no" FieldType="String" Width="150px" HeaderTextAlign="Center" />
<f:RenderField HeaderText="长度(mm)" ColumnID="Length_mm" DataField="Length_mm" SortField="Length_mm" FieldType="String" Width="140px" HeaderTextAlign="Center" TextAlign="Center" />
<f:RenderField HeaderText="公称直径(DN)" ColumnID="Dn" DataField="Dn" SortField="Dn" FieldType="String" Width="140px" HeaderTextAlign="Center" TextAlign="Center" ExpandUnusedSpace="true" />
</Columns>
<PageItems>
<f:ToolbarSeparator ID="ToolbarSeparator1" runat="server">
</f:ToolbarSeparator>
<f:ToolbarText ID="ToolbarText1" runat="server" Text="每页记录数:">
</f:ToolbarText>
<f:DropDownList runat="server" ID="ddlPageSize" Width="80px" AutoPostBack="true"
OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged">
<f:ListItem Text="10" Value="10" />
<f:ListItem Text="15" Value="15" />
<f:ListItem Text="20" Value="20" />
<f:ListItem Text="25" Value="25" />
<f:ListItem Text="所有行" Value="10000" />
</f:DropDownList>
</PageItems>
</f:Grid>
</Items>
</f:Panel>
</Items>
</f:Panel>
</form>
</body>
</html>
@@ -0,0 +1,151 @@
using BLL;
using MiniExcelLibs;
using Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace FineUIPro.Web.HJGL.InfoQuery
{
public partial class PipeLengthOverview : PageBase
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
ddlPageSize.SelectedValue = Grid1.PageSize.ToString();
InitTreeMenu();
}
}
private void InitTreeMenu()
{
tvControlItem.Nodes.Clear();
TreeNode civilNode = new TreeNode { NodeID = "1", Text = "建筑工程", Selectable = false };
TreeNode installNode = new TreeNode { NodeID = "2", Text = "安装工程", Selectable = false, Expanded = true };
tvControlItem.Nodes.Add(civilNode);
tvControlItem.Nodes.Add(installNode);
string projectId = CurrUser.LoginProjectId;
// 管长识别表无项目归属,必须通过管线号关联项目管线,防止跨项目展示同名管线的识别结果。
var recordCounts = (from pipeLength in Funs.DB.HJGL_DrawingRecognition_PipeLengths
join pipeline in Funs.DB.HJGL_Pipeline on pipeLength.Pipe_no equals pipeline.PipelineCode
where pipeline.ProjectId == projectId && pipeline.UnitWorkId != null
group pipeLength by pipeline.UnitWorkId into groupItem
select new { UnitWorkId = groupItem.Key, Count = groupItem.Count() }).ToDictionary(x => x.UnitWorkId, x => x.Count);
var unitWorks = (from unitWork in Funs.DB.WBS_UnitWork
where unitWork.ProjectId == projectId && unitWork.SuperUnitWork == null && unitWork.UnitId != null && unitWork.ProjectType != null
orderby unitWork.UnitWorkCode
select unitWork).ToList();
var unitIds = unitWorks.Where(x => x.UnitId != null).Select(x => x.UnitId).Distinct().ToList();
var unitNames = (from unit in Funs.DB.Base_Unit where unitIds.Contains(unit.UnitId) select unit).ToDictionary(x => x.UnitId, x => x.UnitName);
foreach (var unitWork in unitWorks)
{
int count = recordCounts.ContainsKey(unitWork.UnitWorkId) ? recordCounts[unitWork.UnitWorkId] : 0;
TreeNode node = new TreeNode();
node.NodeID = unitWork.UnitWorkId;
node.Text = unitWork.UnitWorkName + "【" + count + "】管段";
node.ToolTip = "施工单位:" + (unitNames.ContainsKey(unitWork.UnitId) ? unitNames[unitWork.UnitId] : "");
node.EnableClickEvent = true;
(unitWork.ProjectType == "1" ? civilNode : installNode).Nodes.Add(node);
}
}
protected void tvControlItem_NodeCommand(object sender, TreeCommandEventArgs e)
{
Grid1.PageIndex = 0;
BindGrid();
}
private void BindGrid()
{
string unitWorkId = tvControlItem.SelectedNodeID;
if (string.IsNullOrEmpty(unitWorkId))
{
Grid1.RecordCount = 0;
Grid1.DataSource = new List<HJGL_DrawingRecognition_PipeLengths>();
Grid1.DataBind();
return;
}
var query = ApplySort(GetCurrentQuery(unitWorkId));
Grid1.RecordCount = query.Count();
Grid1.DataSource = query.Skip(Grid1.PageIndex * Grid1.PageSize).Take(Grid1.PageSize).ToList();
Grid1.DataBind();
}
/// <summary>
/// 汇总当前WBS节点和页面筛选条件,保证列表与导出数据完全一致。
/// </summary>
private IQueryable<HJGL_DrawingRecognition_PipeLengths> GetCurrentQuery(string unitWorkId)
{
string pipeNo = txtPipeNo.Text.Trim();
string dn = txtDn.Text.Trim();
var query = from pipeLength in Funs.DB.HJGL_DrawingRecognition_PipeLengths
join pipeline in Funs.DB.HJGL_Pipeline on pipeLength.Pipe_no equals pipeline.PipelineCode
where pipeline.ProjectId == CurrUser.LoginProjectId && pipeline.UnitWorkId == unitWorkId
select pipeLength;
if (!string.IsNullOrEmpty(pipeNo)) query = query.Where(x => x.Pipe_no.Contains(pipeNo));
if (!string.IsNullOrEmpty(dn)) query = query.Where(x => x.Dn.Contains(dn));
return query;
}
private IQueryable<HJGL_DrawingRecognition_PipeLengths> ApplySort(IQueryable<HJGL_DrawingRecognition_PipeLengths> query)
{
bool descending = Grid1.SortDirection == "DESC";
switch (Grid1.SortField)
{
case "Pipe_page_no": return descending ? query.OrderByDescending(x => x.Pipe_page_no) : query.OrderBy(x => x.Pipe_page_no);
case "Group_index": return descending ? query.OrderByDescending(x => x.Group_index) : query.OrderBy(x => x.Group_index);
case "Pos_no": return descending ? query.OrderByDescending(x => x.Pos_no) : query.OrderBy(x => x.Pos_no);
case "Length_mm": return descending ? query.OrderByDescending(x => x.Length_mm) : query.OrderBy(x => x.Length_mm);
case "Dn": return descending ? query.OrderByDescending(x => x.Dn) : query.OrderBy(x => x.Dn);
default: return descending ? query.OrderByDescending(x => x.Pipe_no) : query.OrderBy(x => x.Pipe_no);
}
}
protected void btnQuery_Click(object sender, EventArgs e) { Grid1.PageIndex = 0; BindGrid(); }
protected void Grid1_PageIndexChange(object sender, GridPageEventArgs e) { Grid1.PageIndex = e.NewPageIndex; BindGrid(); }
protected void Grid1_Sort(object sender, GridSortEventArgs e) { Grid1.SortField = e.SortField; Grid1.SortDirection = e.SortDirection; BindGrid(); }
protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e) { Grid1.PageSize = Convert.ToInt32(ddlPageSize.SelectedValue); Grid1.PageIndex = 0; BindGrid(); }
protected void btnOut_Click(object sender, EventArgs e)
{
string unitWorkId = tvControlItem.SelectedNodeID;
if (string.IsNullOrEmpty(unitWorkId))
{
ShowNotify("请先选择WBS目录", MessageBoxIcon.Warning);
return;
}
// 导出所有满足当前筛选条件的记录,不受列表分页大小限制。
var data = ApplySort(GetCurrentQuery(unitWorkId)).Select(x => new
{
线 = x.Pipe_no,
线 = x.Pipe_page_no,
= x.Group_index,
= x.Pos_no,
= x.Length_mm,
DN = x.Dn
}).ToList();
string path = Path.Combine(Funs.RootPath, "File", "Excel", "Temp", "PipeLengthOverview" + DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss") + ".xlsx");
MiniExcel.SaveAs(path, data);
DownloadExcel(path, "管长信息总览.xlsx");
}
private void DownloadExcel(string path, string fileName)
{
FileInfo info = new FileInfo(path);
System.Web.HttpContext.Current.Response.Clear();
System.Web.HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + System.Web.HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
System.Web.HttpContext.Current.Response.AddHeader("Content-Length", info.Length.ToString());
System.Web.HttpContext.Current.Response.TransmitFile(path, 0, info.Length);
System.Web.HttpContext.Current.Response.Flush();
System.Web.HttpContext.Current.Response.Close();
File.Delete(path);
}
}
}
@@ -0,0 +1,161 @@
//------------------------------------------------------------------------------
// <自动生成>
// 此代码由工具生成。
//
// 对此文件的更改可能导致不正确的行为,如果
// 重新生成代码,则所做更改将丢失。
// </自动生成>
//------------------------------------------------------------------------------
namespace FineUIPro.Web.HJGL.InfoQuery
{
public partial class PipeLengthOverview
{
/// <summary>
/// form1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::System.Web.UI.HtmlControls.HtmlForm form1;
/// <summary>
/// PageManager1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.PageManager PageManager1;
/// <summary>
/// Panel1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel Panel1;
/// <summary>
/// panelLeftRegion 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel panelLeftRegion;
/// <summary>
/// tvControlItem 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Tree tvControlItem;
/// <summary>
/// panelCenterRegion 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Panel panelCenterRegion;
/// <summary>
/// Toolbar1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Toolbar Toolbar1;
/// <summary>
/// txtPipeNo 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.TextBox txtPipeNo;
/// <summary>
/// txtDn 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.TextBox txtDn;
/// <summary>
/// ToolbarFill1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarFill ToolbarFill1;
/// <summary>
/// btnQuery 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Button btnQuery;
/// <summary>
/// btnOut 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Button btnOut;
/// <summary>
/// Grid1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.Grid Grid1;
/// <summary>
/// ToolbarSeparator1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarSeparator ToolbarSeparator1;
/// <summary>
/// ToolbarText1 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.ToolbarText ToolbarText1;
/// <summary>
/// ddlPageSize 控件。
/// </summary>
/// <remarks>
/// 自动生成的字段。
/// 若要进行修改,请将字段声明从设计器文件移到代码隐藏文件。
/// </remarks>
protected global::FineUIPro.DropDownList ddlPageSize;
}
}