This commit is contained in:
李超 2025-12-23 20:38:29 +08:00
commit 03ec229091
7 changed files with 334 additions and 109 deletions

1
.gitignore vendored
View File

@ -34,3 +34,4 @@ SGGL/.svn
/SGGL/BLLTests
/SGGL/FineUIPro.Web/ErrLog.txt
/SGGL/CLAUDE.md
/SGGL/.claude/settings.local.json

View File

@ -34,3 +34,39 @@ CREATE TABLE [dbo].[Project_Devices](
GO
Alter TABLE [dbo].[Person_Persons]
add [YunMouState] [nvarchar](50) NULL
GO
CREATE TABLE [dbo].[Kqgl_DateManage](
[Id] [nvarchar](50) NOT NULL,
[ProjectId] [nvarchar](50) NULL,
[AmStartTime1] [time](7) NULL,
[AmStartTime2] [time](7) NULL,
[AmEndTime1] [time](7) NULL,
[AmEndTime2] [time](7) NULL,
[PmStartTime1] [time](7) NULL,
[PmStartTime2] [time](7) NULL,
[PmEndTime1] [time](7) NULL,
[PmEndTime2] [time](7) NULL,
[LateTime] [int] NULL,
[LeaveTime] [int] NULL,
[EquipmentCode] [nvarchar](500) NULL,
CONSTRAINT [PK_Kqgl_DateManage] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'允许迟到' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Kqgl_DateManage', @level2type=N'COLUMN',@level2name=N'LateTime'
GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'允许早退' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Kqgl_DateManage', @level2type=N'COLUMN',@level2name=N'LeaveTime'
GO

View File

@ -1,19 +0,0 @@
{
"permissions": {
"allow": [
"Bash(dotnet build:*)",
"Bash(dir:*)",
"Read(//c/Users/lipengfei/Desktop/**)",
"Bash(powershell:*)",
"Bash(csc:*)",
"Bash(IndependentExcelFiller.exe)",
"Bash(python:*)",
"Bash(cat:*)",
"Bash(pip install:*)",
"Bash(msbuild:*)",
"Bash(\"C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\MSBuild\\Current\\Bin\\MSBuild.exe\":*)"
],
"deny": [],
"ask": []
}
}

View File

@ -472,7 +472,9 @@ namespace BLL
join n in db.Base_Project on x.ProjectId equals n.ProjectId
join m in db.Person_Persons on x.ReceiveMan equals m.PersonId into tt
from t in tt.DefaultIfEmpty()
select new { x, n, t };
join train in db.HJGL_TrainNumberManage on x.TrainNumberId equals train.Id into trains
from train in trains.DefaultIfEmpty()
select new { x, n, t , train };
if (filter != null)
{
@ -510,7 +512,7 @@ namespace BLL
}
if (!string.IsNullOrEmpty(filter.ReceiveMan))
{
baseQuery = baseQuery.Where(z => z.x.ReceiveMan == filter.ReceiveMan || (z.t != null && z.t.PersonName.Contains(filter.ReceiveMan)));
baseQuery = baseQuery.Where(z => z.train.ContactName == filter.ReceiveMan || (z.train != null && z.train.ContactName.Contains(filter.ReceiveMan)));
}
if (!string.IsNullOrEmpty(filter.ReceiveDate))
{
@ -524,7 +526,7 @@ namespace BLL
}
if (!string.IsNullOrEmpty(filter.TrainNumberId))
{
baseQuery = baseQuery.Where(z => z.x.TrainNumber != null && z.x.TrainNumber.Contains(filter.TrainNumberId));
baseQuery = baseQuery.Where(z => z.train.Id != null && z.train.Id.Contains(filter.TrainNumberId));
}
}
@ -540,9 +542,9 @@ namespace BLL
ContactPhone = z.x.ContactPhone,
StackingPosition = z.x.StackingPosition,
State = z.x.State,
ReceiveMan = z.t.PersonName,
ReceiveMan = z.train.ContactName,
ReceiveDate = string.Format("{0:g}", z.x.ReceiveDate),
TrainNumber = z.x.TrainNumber,
TrainNumber = z.train.TrainNumber,
}).Distinct();
totalCount = q.Count();

View File

@ -593,16 +593,17 @@ namespace BLL
var q = iosList[0];
var isoNos = string.Join(",", iosList.Select(x => x.PipelineCode).ToArray());
var isoIds = string.Join("','", iosList.Select(x => x.PipelineId).ToArray());
var pipelineIdList = iosList.Select(x => x.PipelineId).ToList(); // 修复创建实际的ID列表
//获取打底和盖面的焊工单位名称
var CoverWelderUnitName = (from x in Funs.DB.HJGL_WeldJoint
join y in Funs.DB.SitePerson_Person on x.CoverWelderId equals y.PersonId
join z in Funs.DB.Base_Unit on y.UnitId equals z.UnitId
where isoIds.Contains(x.PipelineId)
where pipelineIdList.Contains(x.PipelineId) // 修复:使用实际的列表
select z.UnitName ).Distinct().ToList();
var BackingWelderUnitName = (from x in Funs.DB.HJGL_WeldJoint
join y in Funs.DB.SitePerson_Person on x.BackingWelderId equals y.PersonId
join z in Funs.DB.Base_Unit on y.UnitId equals z.UnitId
where isoIds.Contains(x.PipelineId)
where pipelineIdList.Contains(x.PipelineId) // 修复:使用实际的列表
select z.UnitName).Distinct().ToList();
CoverWelderUnitName.AddRange(BackingWelderUnitName);
Dictionary<string, string> keyValuePairs = new Dictionary<string, string>();

View File

@ -16862,7 +16862,7 @@
</COMReference>
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v17.0\WebApplications\Microsoft.WebApplication.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v15.0\WebApplications\Microsoft.WebApplication.targets" />
<ProjectExtensions>
<VisualStudio>
<FlavorProperties GUID="{349c5851-65df-11da-9384-00065b846f21}">

View File

@ -30,6 +30,7 @@ namespace FineUIPro.Web.common
#region --
/// <summary>
/// 加载树
/// 优化版本:解决 N+1 查询问题,一次性获取所有管线统计数据
/// </summary>
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<Model.WBS_UnitWork> unitWork1 = null;
List<Model.WBS_UnitWork> 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
/// <summary>
/// 数据绑定
/// 数据绑定 - 项目进度统计
/// 优化版本:使用 CTE 和 JOIN 替代嵌套子查询,提高性能
/// </summary>
private void BindGrid1()
{
@ -133,25 +131,87 @@ namespace FineUIPro.Web.common
List<SqlParameter> listStr = new List<SqlParameter>();
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();
}
}
/// <summary>
/// 数据绑定
/// 数据绑定 - 单位工程进度统计
/// 优化版本:使用 CTE 替代复杂嵌套子查询,提高性能
/// </summary>
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<SqlParameter> listStr = new List<SqlParameter>();
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();
}
}
}
/// <summary>
/// 数据绑定
/// 数据绑定 - 施工单位进度统计
/// 优化版本:使用 CTE 和 JOIN 替代嵌套子查询
/// </summary>
private void BindGrid3()
{
@ -246,23 +401,72 @@ select '现场施工焊口' as PipeArea,UnitWorkId,TotalDin,TodayFinishSize,Fini
List<SqlParameter> listStr = new List<SqlParameter>();
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()));