7fb6b255d2
扩展图纸识别结果模型和保存流程,按管线及页码替换识别明细, 避免重复导入造成数据累积;同时自动补充材料编码库数据, 新增材料总览、管段长度总览及 PDF 焊口标记功能,提升识别数据 的查询、复核和后续使用效率。
164 lines
8.8 KiB
C#
164 lines
8.8 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|