feat: 增加设计任务工时报表

This commit is contained in:
2026-07-15 18:19:25 +08:00
parent 4f42c3a030
commit 9d08fb1d1a
3 changed files with 334 additions and 50 deletions

View File

@@ -0,0 +1,135 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时报表_任务工时_查询]
@开始日期 nvarchar(30) = N'',
@结束日期 nvarchar(30) = N'',
@操作人 nvarchar(100) = N'',
@项目号 nvarchar(100) = N'',
@物料编码 nvarchar(100) = N'',
@类别 nvarchar(100) = N'',
@DID int = NULL
AS
BEGIN
SET NOCOUNT ON;
DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始日期, N''));
DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束日期, N''));
;WITH base AS
(
SELECT
r.[RID],
r.[DID],
ISNULL(r.[操作人], N'') AS [操作人],
t.[项目号],
t.[物料编码],
t.[物料名称],
t.[图号],
t.[类别],
t.[任务描述],
r.[开始时间],
r.[结束时间],
ISNULL(r.[工时秒数], 0) AS [工时秒数],
r.[已校验],
r.[进度说明],
r.[备注]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
WHERE
r.[开始时间] IS NOT NULL
AND r.[结束时间] IS NOT NULL
AND (@开始 IS NULL OR r.[开始时间] >= @开始)
AND (@结束 IS NULL OR r.[开始时间] < DATEADD(day, 1, @结束))
AND (ISNULL(@操作人, N'') = N'' OR r.[操作人] LIKE N'%' + @操作人 + N'%')
AND (ISNULL(@项目号, N'') = N'' OR t.[项目号] LIKE N'%' + @项目号 + N'%')
AND (ISNULL(@物料编码, N'') = N'' OR t.[物料编码] LIKE N'%' + @物料编码 + N'%')
AND (ISNULL(@类别, N'') = N'' OR t.[类别] LIKE N'%' + @类别 + N'%')
AND (@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
),
result AS
(
SELECT
1 AS [Level],
N't-' + CAST([DID] AS nvarchar(20)) AS [id],
CAST(N'' AS nvarchar(120)) AS [parentId],
CAST(N'' AS nvarchar(100)) AS [操作人],
CAST(N'' AS nvarchar(20)) AS [工作日期],
CAST(NULL AS int) AS [RID],
[DID],
ISNULL(MAX([项目号]), N'') AS [项目号],
ISNULL(MAX([物料编码]), N'') AS [物料编码],
ISNULL(MAX([物料名称]), N'') AS [物料名称],
ISNULL(MAX([图号]), N'') AS [图号],
ISNULL(MAX([类别]), N'') AS [类别],
ISNULL(MAX([任务描述]), N'') AS [任务描述],
CONVERT(varchar(19), MIN([开始时间]), 120) AS [开始时间],
CONVERT(varchar(19), MAX([结束时间]), 120) AS [结束时间],
COUNT(1) AS [报工次数],
CAST(SUM([工时秒数]) / 3600.0 AS decimal(18, 2)) AS [工时小时],
CASE
WHEN SUM(CONVERT(int, [已校验])) = COUNT(1) THEN N'已校验'
WHEN SUM(CONVERT(int, [已校验])) = 0 THEN N'未校验'
ELSE N'部分校验'
END AS [校验状态],
ISNULL(STRING_AGG(
CASE WHEN NULLIF(LTRIM(RTRIM([进度说明])), N'') IS NOT NULL
THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), [结束时间], 120) + NCHAR(13) + NCHAR(10) + [进度说明]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY [开始时间], [RID]), N'') AS [进度说明],
ISNULL(STRING_AGG(
CASE WHEN NULLIF(LTRIM(RTRIM([备注])), N'') IS NOT NULL
THEN CONVERT(nvarchar(max), [备注]) END,
NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY [开始时间], [RID]), N'') AS [备注]
FROM base
GROUP BY [DID]
UNION ALL
SELECT
2 AS [Level],
N't-' + CAST([DID] AS nvarchar(20)) + N'-o-' + [操作人] AS [id],
N't-' + CAST([DID] AS nvarchar(20)) AS [parentId],
[操作人],
CAST(N'' AS nvarchar(20)) AS [工作日期],
CAST(NULL AS int) AS [RID],
[DID],
CAST(N'' AS nvarchar(100)) AS [项目号],
CAST(N'' AS nvarchar(100)) AS [物料编码],
CAST(N'' AS nvarchar(200)) AS [物料名称],
CAST(N'' AS nvarchar(100)) AS [图号],
CAST(N'' AS nvarchar(100)) AS [类别],
CAST(N'' AS nvarchar(500)) AS [任务描述],
CONVERT(varchar(19), MIN([开始时间]), 120) AS [开始时间],
CONVERT(varchar(19), MAX([结束时间]), 120) AS [结束时间],
COUNT(1) AS [报工次数],
CAST(SUM([工时秒数]) / 3600.0 AS decimal(18, 2)) AS [工时小时],
CASE
WHEN SUM(CONVERT(int, [已校验])) = COUNT(1) THEN N'已校验'
WHEN SUM(CONVERT(int, [已校验])) = 0 THEN N'未校验'
ELSE N'部分校验'
END AS [校验状态],
ISNULL(STRING_AGG(
CASE WHEN NULLIF(LTRIM(RTRIM([进度说明])), N'') IS NOT NULL
THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), [结束时间], 120) + NCHAR(13) + NCHAR(10) + [进度说明]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY [开始时间], [RID]), N'') AS [进度说明],
ISNULL(STRING_AGG(
CASE WHEN NULLIF(LTRIM(RTRIM([备注])), N'') IS NOT NULL
THEN CONVERT(nvarchar(max), [备注]) END,
NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY [开始时间], [RID]), N'') AS [备注]
FROM base
GROUP BY [DID], [操作人]
)
SELECT *
FROM result
ORDER BY [DID] DESC, [Level], [操作人];
END
GO