diff --git a/SGGL/.claude/settings.local.json b/SGGL/.claude/settings.local.json
index c4bae7e3..45798113 100644
--- a/SGGL/.claude/settings.local.json
+++ b/SGGL/.claude/settings.local.json
@@ -11,7 +11,8 @@
"Bash(cat:*)",
"Bash(pip install:*)",
"Bash(msbuild:*)",
- "Bash(\"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\MSBuild.exe\":*)"
+ "Bash(\"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\MSBuild.exe\":*)",
+ "Bash(\"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\MSBuild.exe\" \"D:\\数据\\诺必达\\赛鼎\\SGGL_SeDin_New\\SGGL\\FineUIPro.Web\\FineUIPro.Web.csproj\" /t:Build /p:Configuration=Release /nologo /v:minimal)"
],
"deny": [],
"ask": []
diff --git a/SGGL/FineUIPro.Web/common/mainMenu_HJGL3.aspx.cs b/SGGL/FineUIPro.Web/common/mainMenu_HJGL3.aspx.cs
index 8e5cfd25..f5ee4fe7 100644
--- a/SGGL/FineUIPro.Web/common/mainMenu_HJGL3.aspx.cs
+++ b/SGGL/FineUIPro.Web/common/mainMenu_HJGL3.aspx.cs
@@ -30,6 +30,7 @@ namespace FineUIPro.Web.common
#region 加载树装置-单位-工作区
///
/// 加载树
+ /// 优化版本:解决 N+1 查询问题,一次性获取所有管线统计数据
///
private void InitTreeMenu()
{
@@ -49,6 +50,13 @@ namespace FineUIPro.Web.common
rootNode2.Expanded = true;
this.tvControlItem.Nodes.Add(rootNode2);
+ // 优化:一次性获取所有管线统计数据,避免 N+1 查询
+ var pipelineCountByUnitWork = (from x in Funs.DB.HJGL_Pipeline
+ where x.ProjectId == this.CurrUser.LoginProjectId
+ group x by x.UnitWorkId into g
+ select new { UnitWorkId = g.Key, Count = g.Count() })
+ .ToDictionary(x => x.UnitWorkId, x => x.Count);
+
var pUnits = (from x in Funs.DB.Project_ProjectUnit where x.ProjectId == this.CurrUser.LoginProjectId select x).ToList();
// 获取当前用户所在单位
var currUnit = pUnits.FirstOrDefault(x => x.UnitId == this.CurrUser.UnitId);
@@ -61,27 +69,15 @@ namespace FineUIPro.Web.common
List unitWork1 = null;
List unitWork2 = null;
- //// 当前为施工单位,只能操作本单位的数据
- //if (currUnit != null && currUnit.UnitType == Const.ProjectUnitType_2)
- //{
- // unitWork1 = (from x in unitWorkList
- // where x.UnitId == this.CurrUser.UnitId && x.ProjectType == "1"
- // select x).ToList();
- // unitWork2 = (from x in unitWorkList
- // where x.UnitId == this.CurrUser.UnitId && x.ProjectType == "2"
- // select x).ToList();
- //}
- //else
- //{
unitWork1 = (from x in unitWorkList where x.ProjectType == "1" select x).ToList();
unitWork2 = (from x in unitWorkList where x.ProjectType == "2" select x).ToList();
- //}
if (unitWork1.Count() > 0)
{
foreach (var q in unitWork1)
{
- int a = (from x in Funs.DB.HJGL_Pipeline where x.ProjectId == this.CurrUser.LoginProjectId && x.UnitWorkId == q.UnitWorkId select x).Count();
+ // 优化:从内存字典中获取管线数量,避免数据库查询
+ int a = pipelineCountByUnitWork.ContainsKey(q.UnitWorkId) ? pipelineCountByUnitWork[q.UnitWorkId] : 0;
var unitNamesUnitIds = BLL.UnitService.getUnitNamesUnitIds(q.UnitId);
TreeNode tn1 = new TreeNode();
tn1.NodeID = q.UnitWorkId;
@@ -95,7 +91,8 @@ namespace FineUIPro.Web.common
{
foreach (var q in unitWork2)
{
- int a = (from x in Funs.DB.HJGL_Pipeline where x.ProjectId == this.CurrUser.LoginProjectId && x.UnitWorkId == q.UnitWorkId select x).Count();
+ // 优化:从内存字典中获取管线数量,避免数据库查询
+ int a = pipelineCountByUnitWork.ContainsKey(q.UnitWorkId) ? pipelineCountByUnitWork[q.UnitWorkId] : 0;
var unitNamesUnitIds = BLL.UnitService.getUnitNamesUnitIds(q.UnitId);
TreeNode tn2 = new TreeNode();
tn2.NodeID = q.UnitWorkId;
@@ -125,7 +122,8 @@ namespace FineUIPro.Web.common
#region 数据绑定
///
- /// 数据绑定
+ /// 数据绑定 - 项目进度统计
+ /// 优化版本:使用 CTE 和 JOIN 替代嵌套子查询,提高性能
///
private void BindGrid1()
{
@@ -133,25 +131,87 @@ namespace FineUIPro.Web.common
List listStr = new List();
if (this.rbType.SelectedValue == "1")
{
- strSql = @"select ProjectId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.ProjectId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint WHERE ProjectId=b.ProjectId) AS DECIMAL(12,3)) AS TotalDin,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE jot.ProjectId=b.ProjectId AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate=@WeldingDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE jot.ProjectId=b.ProjectId AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingDate) AS DECIMAL(12,3)) AS FinishSize
- from Base_Project b) v where ProjectId=@ProjectId ";
+ // 优化:使用 CTE 和 LEFT JOIN 替代嵌套子查询
+ strSql = @"
+WITH AllWeldJoints AS (
+ -- 所有焊口总量
+ SELECT ProjectId, SUM(ISNULL(Size, 0)) AS TotalDin
+ FROM dbo.HJGL_WeldJoint
+ WHERE ProjectId = @ProjectId
+ GROUP BY ProjectId
+),
+TodayWelding AS (
+ -- 当日焊接记录(返回 WeldingDailyId)
+ SELECT wd.WeldingDailyId
+ FROM dbo.HJGL_WeldingDaily wd
+ WHERE wd.ProjectId = @ProjectId AND wd.WeldingDate = @WeldingDate
+),
+TodayWeldJoints AS (
+ -- 当日完成焊口
+ SELECT jot.ProjectId, SUM(ISNULL(jot.Size, 0)) AS TodayFinishSize
+ FROM dbo.HJGL_WeldJoint jot
+ INNER JOIN TodayWelding tw ON jot.WeldingDailyId = tw.WeldingDailyId
+ WHERE jot.ProjectId = @ProjectId AND jot.WeldingDailyId IS NOT NULL
+ GROUP BY jot.ProjectId
+),
+CumulativeWeldJoints AS (
+ -- 累计完成焊口
+ SELECT jot.ProjectId, SUM(ISNULL(jot.Size, 0)) AS FinishSize
+ FROM dbo.HJGL_WeldJoint jot
+ INNER JOIN dbo.HJGL_WeldingDaily wd ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE jot.ProjectId = @ProjectId AND jot.WeldingDailyId IS NOT NULL AND wd.WeldingDate <= @WeldingDate
+ GROUP BY jot.ProjectId
+)
+SELECT b.ProjectId,
+ ISNULL(aw.TotalDin, 0) AS TotalDin,
+ ISNULL(tw.TodayFinishSize, 0) AS TodayFinishSize,
+ ISNULL(cw.FinishSize, 0) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(aw.TotalDin, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(cw.FinishSize, 0) / (1.0 * aw.TotalDin) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Base_Project b
+LEFT JOIN AllWeldJoints aw ON b.ProjectId = aw.ProjectId
+LEFT JOIN TodayWeldJoints tw ON b.ProjectId = tw.ProjectId
+LEFT JOIN CumulativeWeldJoints cw ON b.ProjectId = cw.ProjectId
+WHERE b.ProjectId = @ProjectId";
listStr.Add(new SqlParameter("@ProjectId", (CurrUser != null) ? CurrUser.LoginProjectId : ""));
listStr.Add(new SqlParameter("@WeldingDate", this.txtWeldingDate.Text.Trim()));
}
else
{
- strSql = @"select ProjectId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.ProjectId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint WHERE ProjectId=b.ProjectId) AS DECIMAL(12,3)) AS TotalDin,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE jot.ProjectId=b.ProjectId AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate>=@WeldingStartDate and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE jot.ProjectId=b.ProjectId AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS FinishSize
- from Base_Project b) v where ProjectId=@ProjectId ";
+ // 优化:使用 CTE 和 LEFT JOIN 替代嵌套子查询(时间段模式)
+ strSql = @"
+WITH AllWeldJoints AS (
+ SELECT ProjectId, SUM(ISNULL(Size, 0)) AS TotalDin
+ FROM dbo.HJGL_WeldJoint
+ WHERE ProjectId = @ProjectId
+ GROUP BY ProjectId
+),
+PeriodWeldJoints AS (
+ SELECT jot.ProjectId, SUM(ISNULL(jot.Size, 0)) AS TodayFinishSize
+ FROM dbo.HJGL_WeldJoint jot
+ INNER JOIN dbo.HJGL_WeldingDaily wd ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE jot.ProjectId = @ProjectId AND jot.WeldingDailyId IS NOT NULL
+ AND wd.WeldingDate >= @WeldingStartDate AND wd.WeldingDate <= @WeldingEndDate
+ GROUP BY jot.ProjectId
+),
+CumulativeWeldJoints AS (
+ SELECT jot.ProjectId, SUM(ISNULL(jot.Size, 0)) AS FinishSize
+ FROM dbo.HJGL_WeldJoint jot
+ INNER JOIN dbo.HJGL_WeldingDaily wd ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE jot.ProjectId = @ProjectId AND jot.WeldingDailyId IS NOT NULL AND wd.WeldingDate <= @WeldingEndDate
+ GROUP BY jot.ProjectId
+)
+SELECT b.ProjectId,
+ ISNULL(aw.TotalDin, 0) AS TotalDin,
+ ISNULL(pw.TodayFinishSize, 0) AS TodayFinishSize,
+ ISNULL(cw.FinishSize, 0) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(aw.TotalDin, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(cw.FinishSize, 0) / (1.0 * aw.TotalDin) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Base_Project b
+LEFT JOIN AllWeldJoints aw ON b.ProjectId = aw.ProjectId
+LEFT JOIN PeriodWeldJoints pw ON b.ProjectId = pw.ProjectId
+LEFT JOIN CumulativeWeldJoints cw ON b.ProjectId = cw.ProjectId
+WHERE b.ProjectId = @ProjectId";
listStr.Add(new SqlParameter("@ProjectId", (CurrUser != null) ? CurrUser.LoginProjectId : ""));
listStr.Add(new SqlParameter("@WeldingStartDate", this.txtWeldingStartDate.Text.Trim()));
listStr.Add(new SqlParameter("@WeldingEndDate", this.txtWeldingEndDate.Text.Trim()));
@@ -163,14 +223,18 @@ CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left
var table = GetPagedDataTable(Grid1, tb);
Grid1.DataSource = table;
Grid1.DataBind();
- decimal totalDin = Funs.GetNewDecimalOrZero(this.Grid1.Rows[0].Values[0].ToString());
- decimal finishSize = Funs.GetNewDecimalOrZero(this.Grid1.Rows[0].Values[2].ToString());
- decimal notCompleteDin = totalDin - finishSize;
- this.lbNotCompleteDinTotal.Text = notCompleteDin.ToString();
+ if (Grid1.Rows.Count > 0)
+ {
+ decimal totalDin = Funs.GetNewDecimalOrZero(this.Grid1.Rows[0].Values[0].ToString());
+ decimal finishSize = Funs.GetNewDecimalOrZero(this.Grid1.Rows[0].Values[2].ToString());
+ decimal notCompleteDin = totalDin - finishSize;
+ this.lbNotCompleteDinTotal.Text = notCompleteDin.ToString();
+ }
}
///
- /// 数据绑定
+ /// 数据绑定 - 单位工程进度统计
+ /// 优化版本:使用 CTE 替代复杂嵌套子查询,提高性能
///
private void BindGrid2(string unitWorkId)
{
@@ -178,41 +242,128 @@ CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left
List listStr = new List();
if (this.rbType.SelectedValue == "1")
{
- strSql = @"select '工厂预制焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.UnitWorkId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口') AS DECIMAL(12,3)) AS TotalDin,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate=@WeldingDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingDate) AS DECIMAL(12,3)) AS FinishSize
- from WBS_UnitWork b) v where UnitWorkId=@UnitWorkId
-union
-select '现场施工焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.UnitWorkId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2')+(SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口') AS DECIMAL(12,3)) AS TotalDin,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate=@WeldingDate)+(SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate=@WeldingDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingDate)+(SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingDate) AS DECIMAL(12,3)) AS FinishSize
- from WBS_UnitWork b) v where UnitWorkId=@UnitWorkId";
+ // 优化:使用 CTE 和条件聚合替代 UNION 和嵌套子查询
+ strSql = @"
+WITH UnitWorkData AS (
+ -- 获取单位工程的管线数据
+ SELECT p.PipelineId, p.PipeArea, p.UnitWorkId
+ FROM dbo.HJGL_Pipeline p
+ WHERE p.UnitWorkId = @UnitWorkId
+),
+JointData AS (
+ -- 获取焊口数据并分类
+ SELECT
+ j.WeldJointId,
+ j.Size,
+ j.WeldingDailyId,
+ j.JointAttribute,
+ p.PipeArea,
+ p.UnitWorkId
+ FROM dbo.HJGL_WeldJoint j
+ INNER JOIN UnitWorkData p ON j.PipelineId = p.PipelineId
+),
+WeldingInfo AS (
+ -- 焊接日期信息
+ SELECT wd.WeldingDailyId, wd.WeldingDate
+ FROM dbo.HJGL_WeldingDaily wd
+ WHERE wd.WeldingDate = @WeldingDate
+),
+Stats AS (
+ SELECT
+ ud.UnitWorkId,
+ -- 工厂预制总量
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryTotal,
+ -- 现场施工总量 (PipeArea='2' 或 PipeArea='1' 且为安装口)
+ SUM(CASE WHEN ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口') THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteTotal,
+ -- 工厂预制当日完成
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryToday,
+ -- 现场施工当日完成
+ SUM(CASE WHEN (ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口')) AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteToday,
+ -- 工厂预制累计完成
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' AND jd.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryCumulative,
+ -- 现场施工累计完成
+ SUM(CASE WHEN (ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口')) AND jd.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteCumulative
+ FROM UnitWorkData ud
+ LEFT JOIN JointData jd ON ud.PipelineId = jd.PipelineId
+ LEFT JOIN WeldingInfo wi ON jd.WeldingDailyId = wi.WeldingDailyId
+ GROUP BY ud.UnitWorkId
+)
+SELECT '工厂预制焊口' AS PipeArea, UnitWorkId,
+ CAST(ISNULL(FactoryTotal, 0) AS DECIMAL(12, 3)) AS TotalDin,
+ CAST(ISNULL(FactoryToday, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(FactoryCumulative, 0) AS DECIMAL(12, 3)) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(FactoryTotal, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(FactoryCumulative, 0) / (1.0 * FactoryTotal) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Stats
+WHERE UnitWorkId = @UnitWorkId
+UNION ALL
+SELECT '现场施工焊口' AS PipeArea, UnitWorkId,
+ CAST(ISNULL(SiteTotal, 0) AS DECIMAL(12, 3)) AS TotalDin,
+ CAST(ISNULL(SiteToday, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(SiteCumulative, 0) AS DECIMAL(12, 3)) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(SiteTotal, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(SiteCumulative, 0) / (1.0 * SiteTotal) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Stats
+WHERE UnitWorkId = @UnitWorkId";
listStr.Add(new SqlParameter("@UnitWorkId", unitWorkId));
listStr.Add(new SqlParameter("@WeldingDate", this.txtWeldingDate.Text.Trim()));
}
else
{
- strSql = @"select '工厂预制焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.UnitWorkId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口') AS DECIMAL(12,3)) AS TotalDin,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate>=@WeldingStartDate and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='预制口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS FinishSize
- from WBS_UnitWork b) v where UnitWorkId=@UnitWorkId
-union
-select '现场施工焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,FinishSize,CONVERT(NVARCHAR(10),(CAST((CASE ISNULL(TotalDin,0) WHEN 0 THEN 0
- ELSE 100.0 * ISNULL(FinishSize,0)/(1.0 * TotalDin) END) AS DECIMAL(8,2))))+'%'
- AS Rate from
- (select b.UnitWorkId,CAST((SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2')+(SELECT ISNULL(SUM(ISNULL(Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口') AS DECIMAL(12,3)) AS TotalDin,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate>=@WeldingStartDate and d.WeldingDate<=@WeldingEndDate)+(SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate>=@WeldingStartDate and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS TodayFinishSize,
- CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='2' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingEndDate)+(SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_Pipeline pipeline on jot.PipelineId=pipeline.PipelineId left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE pipeline.UnitWorkId=b.UnitWorkId and PipeArea='1' and jot.JointAttribute='安装口' AND jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS FinishSize
- from WBS_UnitWork b) v where UnitWorkId=@UnitWorkId";
+ // 优化:使用 CTE 和条件聚合(时间段模式)
+ strSql = @"
+WITH UnitWorkData AS (
+ SELECT p.PipelineId, p.PipeArea, p.UnitWorkId
+ FROM dbo.HJGL_Pipeline p
+ WHERE p.UnitWorkId = @UnitWorkId
+),
+JointData AS (
+ SELECT
+ j.WeldJointId,
+ j.Size,
+ j.WeldingDailyId,
+ j.JointAttribute,
+ p.PipeArea,
+ p.UnitWorkId
+ FROM dbo.HJGL_WeldJoint j
+ INNER JOIN UnitWorkData p ON j.PipelineId = p.PipelineId
+),
+WeldingInfo AS (
+ SELECT wd.WeldingDailyId, wd.WeldingDate
+ FROM dbo.HJGL_WeldingDaily wd
+ WHERE wd.WeldingDate >= @WeldingStartDate AND wd.WeldingDate <= @WeldingEndDate
+),
+Stats AS (
+ SELECT
+ ud.UnitWorkId,
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryTotal,
+ SUM(CASE WHEN ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口') THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteTotal,
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryToday,
+ SUM(CASE WHEN (ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口')) AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDailyId IS NOT NULL THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteToday,
+ SUM(CASE WHEN ud.PipeArea = '1' AND jd.JointAttribute = '预制口' AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDate <= @WeldingEndDate THEN ISNULL(jd.Size, 0) ELSE 0 END) AS FactoryCumulative,
+ SUM(CASE WHEN (ud.PipeArea = '2' OR (ud.PipeArea = '1' AND jd.JointAttribute = '安装口')) AND jd.WeldingDailyId IS NOT NULL AND wi.WeldingDate <= @WeldingEndDate THEN ISNULL(jd.Size, 0) ELSE 0 END) AS SiteCumulative
+ FROM UnitWorkData ud
+ LEFT JOIN JointData jd ON ud.PipelineId = jd.PipelineId
+ LEFT JOIN WeldingInfo wi ON jd.WeldingDailyId = wi.WeldingDailyId
+ GROUP BY ud.UnitWorkId
+)
+SELECT '工厂预制焊口' AS PipeArea, UnitWorkId,
+ CAST(ISNULL(FactoryTotal, 0) AS DECIMAL(12, 3)) AS TotalDin,
+ CAST(ISNULL(FactoryToday, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(FactoryCumulative, 0) AS DECIMAL(12, 3)) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(FactoryTotal, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(FactoryCumulative, 0) / (1.0 * FactoryTotal) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Stats
+WHERE UnitWorkId = @UnitWorkId
+UNION ALL
+SELECT '现场施工焊口' AS PipeArea, UnitWorkId,
+ CAST(ISNULL(SiteTotal, 0) AS DECIMAL(12, 3)) AS TotalDin,
+ CAST(ISNULL(SiteToday, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(SiteCumulative, 0) AS DECIMAL(12, 3)) AS FinishSize,
+ CONVERT(NVARCHAR(10), CAST(CASE ISNULL(SiteTotal, 0) WHEN 0 THEN 0
+ ELSE 100.0 * ISNULL(SiteCumulative, 0) / (1.0 * SiteTotal) END AS DECIMAL(8, 2))) + '%' AS Rate
+FROM Stats
+WHERE UnitWorkId = @UnitWorkId";
listStr.Add(new SqlParameter("@UnitWorkId", unitWorkId));
listStr.Add(new SqlParameter("@WeldingStartDate", this.txtWeldingStartDate.Text.Trim()));
listStr.Add(new SqlParameter("@WeldingEndDate", this.txtWeldingEndDate.Text.Trim()));
@@ -230,15 +381,19 @@ select '现场施工焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,Fini
decimal finishSize1 = Funs.GetNewDecimalOrZero(this.Grid2.Rows[0].Values[3].ToString());
decimal notCompleteDin1 = totalDin1 - finishSize1;
this.lbNotCompleteDin1.Text = notCompleteDin1.ToString();
- decimal totalDin2 = Funs.GetNewDecimalOrZero(this.Grid2.Rows[1].Values[1].ToString());
- decimal finishSize2 = Funs.GetNewDecimalOrZero(this.Grid2.Rows[1].Values[3].ToString());
- decimal notCompleteDin2 = totalDin2 - finishSize2;
- this.lbNotCompleteDin2.Text = notCompleteDin2.ToString();
+ if (Grid2.Rows.Count > 1)
+ {
+ decimal totalDin2 = Funs.GetNewDecimalOrZero(this.Grid2.Rows[1].Values[1].ToString());
+ decimal finishSize2 = Funs.GetNewDecimalOrZero(this.Grid2.Rows[1].Values[3].ToString());
+ decimal notCompleteDin2 = totalDin2 - finishSize2;
+ this.lbNotCompleteDin2.Text = notCompleteDin2.ToString();
+ }
}
}
///
- /// 数据绑定
+ /// 数据绑定 - 施工单位进度统计
+ /// 优化版本:使用 CTE 和 JOIN 替代嵌套子查询
///
private void BindGrid3()
{
@@ -246,23 +401,72 @@ select '现场施工焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,Fini
List listStr = new List();
if (this.rbType.SelectedValue == "1")
{
- strSql = @"select distinct UnitName,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE d.ProjectId=@ProjectId and d.UnitId=b.UnitId and jot.WeldingDailyId IS NOT NULL and d.WeldingDate=@WeldingDate) AS DECIMAL(12,3)) AS TodayFinishSize,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE d.ProjectId=@ProjectId and d.UnitId=b.UnitId and jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingDate) AS DECIMAL(12,3)) AS FinishSize
- from HJGL_WeldingDaily b
- left join Base_Unit u on b.UnitId=u.UnitId
- where b.ProjectId=@ProjectId ";
+ // 优化:使用 CTE 和聚合替代嵌套子查询
+ strSql = @"
+WITH UnitWeldingDaily AS (
+ -- 获取项目的所有焊接日报记录
+ SELECT DISTINCT wd.UnitId, u.UnitName
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN Base_Unit u ON wd.UnitId = u.UnitId
+ WHERE wd.ProjectId = @ProjectId
+),
+TodayStats AS (
+ -- 当日完成统计
+ SELECT wd.UnitId, SUM(ISNULL(jot.Size, 0)) AS TodayFinishSize
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN dbo.HJGL_WeldJoint jot ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE wd.ProjectId = @ProjectId AND wd.WeldingDate = @WeldingDate AND jot.WeldingDailyId IS NOT NULL
+ GROUP BY wd.UnitId
+),
+CumulativeStats AS (
+ -- 累计完成统计
+ SELECT wd.UnitId, SUM(ISNULL(jot.Size, 0)) AS FinishSize
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN dbo.HJGL_WeldJoint jot ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE wd.ProjectId = @ProjectId AND wd.WeldingDate <= @WeldingDate AND jot.WeldingDailyId IS NOT NULL
+ GROUP BY wd.UnitId
+)
+SELECT uwd.UnitName,
+ CAST(ISNULL(ts.TodayFinishSize, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(cs.FinishSize, 0) AS DECIMAL(12, 3)) AS FinishSize
+FROM UnitWeldingDaily uwd
+LEFT JOIN TodayStats ts ON uwd.UnitId = ts.UnitId
+LEFT JOIN CumulativeStats cs ON uwd.UnitId = cs.UnitId";
listStr.Add(new SqlParameter("@ProjectId", (CurrUser != null) ? CurrUser.LoginProjectId : ""));
listStr.Add(new SqlParameter("@WeldingDate", this.txtWeldingDate.Text.Trim()));
}
else
{
- strSql = @"select distinct UnitName,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE d.ProjectId=@ProjectId and d.UnitId=b.UnitId and jot.WeldingDailyId IS NOT NULL and d.WeldingDate>=@WeldingStartDate and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS TodayFinishSize,
-CAST((SELECT ISNULL(SUM(ISNULL(jot.Size,0)),0) FROM dbo.HJGL_WeldJoint jot left join dbo.HJGL_WeldingDaily d on d.WeldingDailyId=jot.WeldingDailyId WHERE d.ProjectId=@ProjectId and d.UnitId=b.UnitId and jot.WeldingDailyId IS NOT NULL and d.WeldingDate<=@WeldingEndDate) AS DECIMAL(12,3)) AS FinishSize
- from HJGL_WeldingDaily b
- left join Base_Unit u on b.UnitId=u.UnitId
- where b.ProjectId=@ProjectId ";
+ // 优化:使用 CTE 和聚合(时间段模式)
+ strSql = @"
+WITH UnitWeldingDaily AS (
+ SELECT DISTINCT wd.UnitId, u.UnitName
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN Base_Unit u ON wd.UnitId = u.UnitId
+ WHERE wd.ProjectId = @ProjectId
+),
+PeriodStats AS (
+ -- 时间段完成统计
+ SELECT wd.UnitId, SUM(ISNULL(jot.Size, 0)) AS TodayFinishSize
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN dbo.HJGL_WeldJoint jot ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE wd.ProjectId = @ProjectId AND wd.WeldingDate >= @WeldingStartDate AND wd.WeldingDate <= @WeldingEndDate AND jot.WeldingDailyId IS NOT NULL
+ GROUP BY wd.UnitId
+),
+CumulativeStats AS (
+ -- 累计完成统计
+ SELECT wd.UnitId, SUM(ISNULL(jot.Size, 0)) AS FinishSize
+ FROM dbo.HJGL_WeldingDaily wd
+ INNER JOIN dbo.HJGL_WeldJoint jot ON jot.WeldingDailyId = wd.WeldingDailyId
+ WHERE wd.ProjectId = @ProjectId AND wd.WeldingDate <= @WeldingEndDate AND jot.WeldingDailyId IS NOT NULL
+ GROUP BY wd.UnitId
+)
+SELECT uwd.UnitName,
+ CAST(ISNULL(ps.TodayFinishSize, 0) AS DECIMAL(12, 3)) AS TodayFinishSize,
+ CAST(ISNULL(cs.FinishSize, 0) AS DECIMAL(12, 3)) AS FinishSize
+FROM UnitWeldingDaily uwd
+LEFT JOIN PeriodStats ps ON uwd.UnitId = ps.UnitId
+LEFT JOIN CumulativeStats cs ON uwd.UnitId = cs.UnitId";
listStr.Add(new SqlParameter("@ProjectId", (CurrUser != null) ? CurrUser.LoginProjectId : ""));
listStr.Add(new SqlParameter("@WeldingStartDate", this.txtWeldingStartDate.Text.Trim()));
listStr.Add(new SqlParameter("@WeldingEndDate", this.txtWeldingEndDate.Text.Trim()));