diff --git a/DataBase/版本日志/SGGLDB_V2026-08-21-lpf(管道预制汇总菜单脚本).sql b/DataBase/版本日志/SGGLDB_V2026-08-21-lpf(管道预制汇总菜单脚本).sql
new file mode 100644
index 00000000..97997838
--- /dev/null
+++ b/DataBase/版本日志/SGGLDB_V2026-08-21-lpf(管道预制汇总菜单脚本).sql
@@ -0,0 +1,81 @@
+/*
+ 焊接数据分析:管道预制汇总菜单
+ 可重复执行,已有菜单时同步修正名称、地址、父级和排序。
+*/
+DECLARE @MenuId NVARCHAR(50) = N'9A28D681-0C91-49B8-9A63-DA3FEEA25BC2';
+DECLARE @SuperMenuId NVARCHAR(50) = N'F3B157B7-9BEE-4150-80CB-087828F1C51D';
+
+IF NOT EXISTS (SELECT 1 FROM dbo.Sys_Menu WHERE MenuId = @SuperMenuId)
+BEGIN
+ RAISERROR(N'未找到父菜单“焊接数据分析”,请先执行焊接管理菜单初始化脚本。', 16, 1);
+ RETURN;
+END;
+
+IF EXISTS (SELECT 1 FROM dbo.Sys_Menu WHERE MenuId = @MenuId)
+BEGIN
+ UPDATE dbo.Sys_Menu
+ SET MenuName = N'管道预制汇总',
+ Icon = NULL,
+ Url = N'HJGL/WeldingReport/PipePrefabricationSummary.aspx',
+ SortIndex = 85,
+ SuperMenu = @SuperMenuId,
+ MenuType = N'Menu_HJGL',
+ IsOffice = 0,
+ IsEnd = 1,
+ IsUsed = 1
+ WHERE MenuId = @MenuId;
+END
+ELSE
+BEGIN
+ INSERT INTO dbo.Sys_Menu
+ (
+ MenuId,
+ MenuName,
+ Icon,
+ Url,
+ SortIndex,
+ SuperMenu,
+ MenuType,
+ IsOffice,
+ IsEnd,
+ IsUsed
+ )
+ VALUES
+ (
+ @MenuId,
+ N'管道预制汇总',
+ NULL,
+ N'HJGL/WeldingReport/PipePrefabricationSummary.aspx',
+ 85,
+ @SuperMenuId,
+ N'Menu_HJGL',
+ 0,
+ 1,
+ 1
+ );
+END;
+
+IF NOT EXISTS
+(
+ SELECT 1
+ FROM dbo.Sys_ButtonToMenu
+ WHERE MenuId = @MenuId
+ AND ButtonName = N'查看'
+)
+BEGIN
+ INSERT INTO dbo.Sys_ButtonToMenu
+ (
+ ButtonToMenuId,
+ MenuId,
+ ButtonName,
+ SortIndex
+ )
+ VALUES
+ (
+ N'40D01F4E-D38C-4480-ABF3-5FE45C0E8650',
+ @MenuId,
+ N'查看',
+ 1
+ );
+END;
+GO
diff --git a/SGGL/BLL/BLL.csproj b/SGGL/BLL/BLL.csproj
index e3604353..d1747f31 100644
--- a/SGGL/BLL/BLL.csproj
+++ b/SGGL/BLL/BLL.csproj
@@ -461,6 +461,7 @@
+
diff --git a/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs b/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs
index 160fcfb8..e7f36855 100644
--- a/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs
+++ b/SGGL/BLL/HJGL/WeldingManage/WeldingDailyService.cs
@@ -1355,6 +1355,178 @@ namespace BLL
return list;
}
+
+ ///
+ /// 获取焊接日志导出数据;传日报ID时导出单份日报,否则按单位工程和月份导出。
+ ///
+ /// 项目ID
+ /// 单位工程ID
+ /// 焊接日报ID
+ /// 月份,格式为yyyy-MM
+ /// 仅包含俄文表头和业务数据的焊接日志
+ public static DataTable GetWeldingLogExportData(string projectId, string unitWorkId,
+ string weldingDailyId, string month)
+ {
+ if (string.IsNullOrWhiteSpace(projectId)
+ || (string.IsNullOrWhiteSpace(unitWorkId) && string.IsNullOrWhiteSpace(weldingDailyId)))
+ {
+ return new DataTable();
+ }
+
+ DateTime monthStart = DateTime.MinValue;
+ if (string.IsNullOrWhiteSpace(weldingDailyId)
+ && !DateTime.TryParse(month + "-01", out monthStart))
+ {
+ return new DataTable();
+ }
+
+ string condition;
+ var parameters = new List
+ {
+ new SqlParameter("@ProjectId", projectId)
+ };
+ if (!string.IsNullOrWhiteSpace(weldingDailyId))
+ {
+ condition = "jot.WeldingDailyId = @WeldingDailyId";
+ parameters.Add(new SqlParameter("@WeldingDailyId", weldingDailyId));
+ }
+ else
+ {
+ condition = @"jot.UnitWorkId = @UnitWorkId
+ AND jot.WeldingDateD >= @MonthStart
+ AND jot.WeldingDateD < @NextMonth";
+ parameters.Add(new SqlParameter("@UnitWorkId", unitWorkId));
+ parameters.Add(new SqlParameter("@MonthStart", monthStart.Date));
+ parameters.Add(new SqlParameter("@NextMonth", monthStart.Date.AddMonths(1)));
+ }
+
+ // 俄文日志列横跨焊口、日报、外观、热处理、硬度和无损检测,统一在服务层完成映射,页面仅负责下载。
+ string sql = @"
+SELECT ROW_NUMBER() OVER (ORDER BY jot.WeldingDateD, jot.PipelineCode, jot.WeldJointCode) AS C01,
+ CONCAT(jot.PipelineCode, '/', jot.WeldJointCode,
+ CASE WHEN ISNULL(jot.WeldTypeCode, '') = '' THEN '' ELSE ', ' + jot.WeldTypeCode END) AS C02,
+ CASE WHEN welder.BackingDisplay = welder.CoverDisplay THEN welder.BackingDisplay
+ WHEN welder.BackingDisplay = '' THEN welder.CoverDisplay
+ WHEN welder.CoverDisplay = '' THEN welder.BackingDisplay
+ ELSE welder.BackingDisplay + CHAR(10) + welder.CoverDisplay END AS C03,
+ REPLACE(ISNULL(jot.MaterialCode, ''), '/', ' / ') AS C04,
+ REPLACE(REPLACE(
+ COALESCE(NULLIF(jot.Specification, ''),
+ CONCAT(CONVERT(varchar(30), jot.Dia), N'×', CONVERT(varchar(30), jot.Thickness))),
+ N'Φ', ''), '*', N'×') AS C05,
+ CONVERT(varchar(10), jot.WeldingDateD, 104) AS C06,
+ ISNULL(jot.WeldingMethodCode, '') AS C07,
+ CONCAT(
+ CASE WHEN ISNULL(jot.WeldingWireCode, '') = '' THEN ''
+ ELSE jot.WeldingWireCode + CASE WHEN ISNULL(wire.Standard, '') = '' THEN '' ELSE ' (' + wire.Standard + ')' END END,
+ CASE WHEN ISNULL(jot.WeldingWireCode, '') = '' OR ISNULL(jot.WeldingRodCode, '') = '' THEN '' ELSE CHAR(10) END,
+ CASE WHEN ISNULL(jot.WeldingRodCode, '') = '' THEN ''
+ ELSE jot.WeldingRodCode + CASE WHEN ISNULL(rod.Standard, '') = '' THEN '' ELSE ' (' + rod.Standard + ')' END END) AS C08,
+ CASE WHEN appearance.PreheatTemperature IS NULL AND appearance.InterpassTemperature IS NULL
+ THEN CASE WHEN ISNULL(jot.PreTemperature, '') = '' THEN '' ELSE jot.PreTemperature + N' °C' END
+ WHEN appearance.InterpassTemperature IS NULL
+ THEN CONCAT(CONVERT(varchar(30), appearance.PreheatTemperature), N' °C')
+ WHEN appearance.PreheatTemperature IS NULL
+ THEN CONCAT(CONVERT(varchar(30), appearance.InterpassTemperature), N' °C')
+ ELSE CONCAT(CONVERT(varchar(30), appearance.PreheatTemperature), ' / ',
+ CONVERT(varchar(30), appearance.InterpassTemperature), N' °C') END AS C09,
+ N'' AS C10,
+ N'' AS C11,
+ N'' AS C12,
+ ISNULL(hotProcess.RecordChartNo, '') AS C13,
+ CONCAT(
+ CASE WHEN hardness.HardNessValue1 IS NULL THEN '' ELSE CONVERT(varchar(20), hardness.HardNessValue1) END,
+ CASE WHEN hardness.HardNessValue2 IS NULL THEN '' ELSE '/' + CONVERT(varchar(20), hardness.HardNessValue2) END,
+ CASE WHEN hardness.HardNessValue3 IS NULL THEN '' ELSE '/' + CONVERT(varchar(20), hardness.HardNessValue3) END,
+ CASE WHEN ISNULL(hardness.HardReportNo, '') = '' THEN '' ELSE ', ' + RTRIM(hardness.HardReportNo) END,
+ CASE WHEN hardness.ReportDate IS NULL THEN '' ELSE ', ' + CONVERT(varchar(10), hardness.ReportDate, 104) END) AS C14,
+ CASE WHEN appearance.IsQualified = 1 THEN N'Годен'
+ WHEN appearance.IsQualified = 0 THEN N'Не годен'
+ ELSE N'' END AS C15,
+ ISNULL(ndt.ResultText, '') AS C16,
+ N'' AS C17
+FROM dbo.View_HJGL_WeldJoint AS jot
+LEFT JOIN dbo.Base_Consumables AS wire ON wire.ConsumablesId = jot.WeldingWire
+LEFT JOIN dbo.Base_Consumables AS rod ON rod.ConsumablesId = jot.WeldingRod
+OUTER APPLY
+(
+ SELECT CONCAT(ISNULL(jot.BackingWelderName, ''),
+ CASE WHEN ISNULL(jot.BackingWelderCode, '') = '' THEN '' ELSE ' (' + jot.BackingWelderCode + ')' END) AS BackingDisplay,
+ CONCAT(ISNULL(jot.CoverWelderName, ''),
+ CASE WHEN ISNULL(jot.CoverWelderCode, '') = '' THEN '' ELSE ' (' + jot.CoverWelderCode + ')' END) AS CoverDisplay
+) AS welder
+OUTER APPLY
+(
+ SELECT TOP 1 checkItem.IsQualified, checkItem.PreheatTemperature, checkItem.InterpassTemperature
+ FROM dbo.HJGL_WeldAppearanceCheck AS checkItem
+ WHERE checkItem.WeldJointId = jot.WeldJointId
+ ORDER BY checkItem.CheckTime DESC, checkItem.CreateTime DESC, checkItem.AppearanceCheckId DESC
+) AS appearance
+OUTER APPLY
+(
+ SELECT TOP 1 report.RecordChartNo
+ FROM dbo.HJGL_HotProess_TrustItem AS trustItem
+ LEFT JOIN dbo.HJGL_HotProess_Report AS report
+ ON report.HotProessTrustItemId = trustItem.HotProessTrustItemId
+ WHERE trustItem.WeldJointId = jot.WeldJointId
+ ORDER BY report.ProessDate DESC, report.HotProessReportId DESC
+) AS hotProcess
+OUTER APPLY
+(
+ SELECT TOP 1 report.HardReportNo, report.HardNessValue1, report.HardNessValue2,
+ report.HardNessValue3, hardTrust.ReportDate
+ FROM dbo.HJGL_Hard_TrustItem AS hardItem
+ LEFT JOIN dbo.HJGL_Hard_Report AS report ON report.HardTrustItemID = hardItem.HardTrustItemID
+ LEFT JOIN dbo.HJGL_Hard_Trust AS hardTrust ON hardTrust.HardTrustID = hardItem.HardTrustID
+ WHERE hardItem.WeldJointId = jot.WeldJointId
+ ORDER BY hardTrust.ReportDate DESC, report.SortIndex, report.HardReportId DESC
+) AS hardness
+OUTER APPLY
+(
+ SELECT STUFF((
+ SELECT CHAR(10) + CONCAT(ISNULL(detectionType.DetectionTypeCode, ''),
+ CASE ndeItem.CheckResult WHEN '1' THEN N': Годен' WHEN '2' THEN N': Не годен' ELSE '' END,
+ CASE WHEN ISNULL(ndeItem.NDEReportNo, nde.NDECode) IS NULL THEN ''
+ ELSE ', ' + ISNULL(ndeItem.NDEReportNo, nde.NDECode) END,
+ CASE WHEN ndeItem.ReportDate IS NULL THEN '' ELSE ', ' + CONVERT(varchar(10), ndeItem.ReportDate, 104) END)
+ FROM dbo.HJGL_Batch_BatchTrustItem AS trustItem
+ INNER JOIN dbo.HJGL_Batch_NDEItem AS ndeItem ON ndeItem.TrustBatchItemId = trustItem.TrustBatchItemId
+ LEFT JOIN dbo.HJGL_Batch_NDE AS nde ON nde.NDEID = ndeItem.NDEID
+ LEFT JOIN dbo.Base_DetectionType AS detectionType ON detectionType.DetectionTypeId = ndeItem.DetectionTypeId
+ WHERE trustItem.WeldJointId = jot.WeldJointId
+ ORDER BY ndeItem.ReportDate, ndeItem.NDEItemID
+ FOR XML PATH(''), TYPE).value('.', 'nvarchar(max)'), 1, 1, '') AS ResultText
+) AS ndt
+WHERE jot.ProjectId = @ProjectId AND " + condition;
+
+ DataTable table = SQLHelper.GetDataTableRunText(sql, parameters.ToArray());
+ string[] headers =
+ {
+ "№\r\nп/п",
+ "Обозначение сварного соединения по исполнительному чертежу, тип сварного соединения ГОСТ 16037",
+ "Ф.И.О.\r\nсварщика,\r\nличное\r\nклеймо",
+ "Марка стали (композиция марок\r\nсталей), НД, №№ сертификатов",
+ "Наружный диаметр элемента трубопровода и толщина стенки Dн×S, мм",
+ "Дата сварки, температурные условия в рабочей зоне,°С",
+ "Способ\r\nсварки",
+ "Сварочные материалы (марка электрода, сварочной проволоки, защитный газ, флюс), НД, №№ сертификатов",
+ "Режим\r\nпредварительного и\r\nсопутствующего\r\nподогрева",
+ "Отметка о контроле\r\nкорня\r\nшва",
+ "Стилоскопирование металла шва,\r\n№ заключения, дата",
+ "Ф.И.О. оператора- термиста, личное клеймо",
+ "№ диаграммы по журналу термообработки сварных соединений",
+ "Твердость металла шва, № заключения, дата",
+ "Отметка о годности сварного соединения по внешнему осмотру и измерениям",
+ "Способ и результаты неразрушающего контроля сварного соединения, № заключения, дата",
+ "Результаты измерения ферритной фазы в металле шва, № заключения, дата"
+ };
+ for (int i = 0; i < headers.Length; i++)
+ {
+ table.Columns[i].ColumnName = headers[i];
+ }
+ return table;
+ }
+
public static Dictionary GetFileOutValueById(string WeldingDailyId)
{
var value = new Dictionary();
diff --git a/SGGL/BLL/HJGL/WeldingReport/PipePrefabricationSummaryService.cs b/SGGL/BLL/HJGL/WeldingReport/PipePrefabricationSummaryService.cs
new file mode 100644
index 00000000..6a2afcb8
--- /dev/null
+++ b/SGGL/BLL/HJGL/WeldingReport/PipePrefabricationSummaryService.cs
@@ -0,0 +1,203 @@
+using System;
+using System.Collections.Generic;
+using System.Data;
+using System.Data.SqlClient;
+using System.Linq;
+
+namespace BLL
+{
+ ///
+ /// 管道预制汇总服务。
+ ///
+ public static class PipePrefabricationSummaryService
+ {
+ ///
+ /// 按单位、单位工程汇总管道预制达因。
+ ///
+ public static List GetSummary(
+ string projectId,
+ IEnumerable unitWorkIds,
+ DateTime startDate,
+ DateTime endDate,
+ DateTime reportDate)
+ {
+ if (string.IsNullOrWhiteSpace(projectId))
+ {
+ throw new ArgumentException("项目不能为空。", "projectId");
+ }
+
+ if (startDate.Date > endDate.Date)
+ {
+ throw new ArgumentException("开始日期不能晚于结束日期。");
+ }
+
+ var selectedUnitWorkIds = (unitWorkIds ?? Enumerable.Empty())
+ .Where(x => !string.IsNullOrWhiteSpace(x) && x != Const._Null)
+ .Distinct()
+ .ToList();
+ var parameters = new List
+ {
+ new SqlParameter("@ProjectId", projectId),
+ new SqlParameter("@StartDate", startDate.Date),
+ // 结束日期按整日包含,SQL 使用小于次日零点规避时间精度问题。
+ new SqlParameter("@EndDateExclusive", endDate.Date.AddDays(1)),
+ // 报表日期 D 的昨日数据取 D-1,当日零点作为昨日区间的结束边界。
+ new SqlParameter("@DailyStartDate", reportDate.Date.AddDays(-1)),
+ new SqlParameter("@ReportDate", reportDate.Date)
+ };
+
+ string unitWorkFilter = string.Empty;
+ if (selectedUnitWorkIds.Count > 0)
+ {
+ var parameterNames = new List();
+ for (int index = 0; index < selectedUnitWorkIds.Count; index++)
+ {
+ string parameterName = "@UnitWorkId" + index;
+ parameterNames.Add(parameterName);
+ parameters.Add(new SqlParameter(parameterName, selectedUnitWorkIds[index]));
+ }
+
+ unitWorkFilter = " AND unitWork.UnitWorkId IN (" + string.Join(",", parameterNames) + ")";
+ }
+
+ string sql = @"
+SELECT
+ ISNULL(unitWork.UnitWorkName, '') AS UnitWorkName,
+ ISNULL(unitInfo.UnitCode, '') AS ConstructionUnitCode,
+ ISNULL(unitWork.UnitWorkCode, '') AS UnitWorkCode,
+ CAST(SUM(ISNULL(joint.Size, 0)) AS DECIMAL(19, 2)) AS TotalDrawingQuantity,
+ CAST(SUM(ISNULL(joint.Size, 0)) AS DECIMAL(19, 2)) AS IsoDrawingQuantity,
+ CAST(SUM(CASE WHEN joint.JointAttribute = N'预制口' THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS WorkFrontQuantity,
+ CAST(SUM(CASE
+ WHEN joint.JointAttribute = N'预制口'
+ AND daily.WeldingDate < @EndDateExclusive
+ THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS CompletedQuantity,
+ CAST(SUM(CASE
+ WHEN joint.JointAttribute = N'预制口'
+ AND daily.WeldingDate >= @StartDate
+ AND daily.WeldingDate < @EndDateExclusive
+ THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS WeeklyQuantity,
+ CAST(SUM(CASE
+ WHEN joint.JointAttribute = N'预制口'
+ AND daily.WeldingDate >= @DailyStartDate
+ AND daily.WeldingDate < @ReportDate
+ THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS DailyQuantity,
+ CAST(SUM(CASE
+ WHEN joint.JointAttribute = N'预制口'
+ AND daily.WeldingDate < @DailyStartDate
+ THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS PreviousDayCumulativeQuantity,
+ CAST(SUM(CASE
+ WHEN joint.JointAttribute = N'预制口'
+ AND daily.WeldingDate < @StartDate
+ THEN ISNULL(joint.Size, 0) ELSE 0 END) AS DECIMAL(19, 2)) AS LastWeekCumulativeQuantity
+FROM HJGL_WeldJoint joint
+INNER JOIN HJGL_Pipeline pipeline ON pipeline.PipelineId = joint.PipelineId
+INNER JOIN WBS_UnitWork unitWork ON unitWork.UnitWorkId = pipeline.UnitWorkId
+LEFT JOIN Base_Unit unitInfo ON unitInfo.UnitId = unitWork.UnitId
+LEFT JOIN HJGL_WeldingDaily daily ON daily.WeldingDailyId = joint.WeldingDailyId
+WHERE pipeline.ProjectId = @ProjectId
+ AND pipeline.PipeArea = '1'" + unitWorkFilter + @"
+GROUP BY unitWork.UnitWorkName, unitInfo.UnitCode, unitWork.UnitWorkCode
+ORDER BY unitWork.UnitWorkName, unitWork.UnitWorkCode";
+
+ DataTable table = SQLHelper.GetDataTableRunText(sql, parameters.ToArray());
+ return table.AsEnumerable().Select((row, index) =>
+ {
+ string unitCode;
+ string blockCode;
+ ParseUnitAndBlock(
+ Convert.ToString(row["UnitWorkName"]),
+ Convert.ToString(row["ConstructionUnitCode"]),
+ Convert.ToString(row["UnitWorkCode"]),
+ out unitCode,
+ out blockCode);
+
+ return new PipePrefabricationSummaryItem
+ {
+ RowKey = (index + 1).ToString(),
+ UnitCode = unitCode,
+ UnitWorkCode = blockCode,
+ // 当前模型没有独立的计划图纸达因字段,图纸总量按工厂预制管线设计焊口总达因统计。
+ TotalDrawingQuantity = GetDecimal(row, "TotalDrawingQuantity"),
+ IsoDrawingQuantity = GetDecimal(row, "IsoDrawingQuantity"),
+ WorkFrontQuantity = GetDecimal(row, "WorkFrontQuantity"),
+ CompletedQuantity = GetDecimal(row, "CompletedQuantity"),
+ DailyQuantity = GetDecimal(row, "DailyQuantity"),
+ PreviousDayCumulativeQuantity = GetDecimal(row, "PreviousDayCumulativeQuantity"),
+ WeeklyQuantity = GetDecimal(row, "WeeklyQuantity"),
+ LastWeekCumulativeQuantity = GetDecimal(row, "LastWeekCumulativeQuantity"),
+ Note = string.Empty
+ };
+ }).ToList();
+ }
+
+ private static void ParseUnitAndBlock(
+ string unitWorkName,
+ string fallbackUnitCode,
+ string fallbackBlockCode,
+ out string unitCode,
+ out string blockCode)
+ {
+ // 本项目单位工程名称按“Unit.Block”维护,报表需拆分成两个业务列。
+ string[] segments = (unitWorkName ?? string.Empty).Split(new[] { '.' }, 2);
+ if (segments.Length == 2
+ && !string.IsNullOrWhiteSpace(segments[0])
+ && !string.IsNullOrWhiteSpace(segments[1]))
+ {
+ unitCode = segments[0].Trim();
+ blockCode = segments[1].Trim();
+ return;
+ }
+
+ unitCode = fallbackUnitCode ?? string.Empty;
+ blockCode = fallbackBlockCode ?? string.Empty;
+ }
+
+ private static decimal GetDecimal(DataRow row, string columnName)
+ {
+ return row.IsNull(columnName) ? 0M : Convert.ToDecimal(row[columnName]);
+ }
+ }
+
+ ///
+ /// 管道预制汇总行。
+ ///
+ public class PipePrefabricationSummaryItem
+ {
+ public string RowKey { get; set; }
+ public string UnitCode { get; set; }
+ public string UnitWorkCode { get; set; }
+ public decimal TotalDrawingQuantity { get; set; }
+ public decimal IsoDrawingQuantity { get; set; }
+ public decimal WorkFrontQuantity { get; set; }
+ public decimal CompletedQuantity { get; set; }
+ public decimal DailyQuantity { get; set; }
+ public decimal PreviousDayCumulativeQuantity { get; set; }
+ public decimal WeeklyQuantity { get; set; }
+ public decimal LastWeekCumulativeQuantity { get; set; }
+ public string Note { get; set; }
+
+ public string TotalDrawingQuantityDisplay { get { return FormatQuantity(TotalDrawingQuantity); } }
+ public string IsoDrawingQuantityDisplay { get { return FormatQuantity(IsoDrawingQuantity); } }
+ public string WorkFrontQuantityDisplay { get { return FormatQuantity(WorkFrontQuantity); } }
+ public string CompletedQuantityDisplay { get { return FormatQuantity(CompletedQuantity); } }
+ public string DailyQuantityDisplay { get { return FormatQuantity(DailyQuantity); } }
+ public string PreviousDayCumulativeQuantityDisplay { get { return FormatQuantity(PreviousDayCumulativeQuantity); } }
+ public string WeeklyQuantityDisplay { get { return FormatQuantity(WeeklyQuantity); } }
+ public string LastWeekCumulativeQuantityDisplay { get { return FormatQuantity(LastWeekCumulativeQuantity); } }
+ public string QuantityCompleteRateDisplay
+ {
+ get
+ {
+ return TotalDrawingQuantity <= 0M
+ ? "0.00%"
+ : (CompletedQuantity * 100M / TotalDrawingQuantity).ToString("0.00") + "%";
+ }
+ }
+
+ public static string FormatQuantity(decimal quantity)
+ {
+ return quantity.ToString("#,##0.##");
+ }
+ }
+}
diff --git a/SGGL/FineUIPro.Web/File/Excel/DataOut/管道预制汇总模板.xlsx b/SGGL/FineUIPro.Web/File/Excel/DataOut/管道预制汇总模板.xlsx
new file mode 100644
index 00000000..6b509701
Binary files /dev/null and b/SGGL/FineUIPro.Web/File/Excel/DataOut/管道预制汇总模板.xlsx differ
diff --git a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj
index 383227f4..7788a3ae 100644
--- a/SGGL/FineUIPro.Web/FineUIPro.Web.csproj
+++ b/SGGL/FineUIPro.Web/FineUIPro.Web.csproj
@@ -368,6 +368,7 @@
+
@@ -1733,6 +1734,7 @@
+
@@ -8279,7 +8281,7 @@
InPlanMaster.aspx
- Component
+ ASPXCodeBehind
InPlanMaster.aspx
@@ -11689,6 +11691,13 @@
NDTWeeklyReport.aspx
+
+ PipePrefabricationSummary.aspx
+ ASPXCodeBehind
+
+
+ PipePrefabricationSummary.aspx
+
PipePrefabricationRateStatistics.aspx
ASPXCodeBehind
diff --git a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx
index 7888c75b..dac41554 100644
--- a/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx
+++ b/SGGL/FineUIPro.Web/HJGL/WeldingManage/WeldReport.aspx
@@ -389,6 +389,9 @@
+