Compare commits

...

13 Commits

5038 changed files with 815249 additions and 920 deletions

6
.gitignore vendored
View File

@@ -38,3 +38,9 @@ debug.log
# ===== Webpack 缓存 =====
node_modules/.cache/
# MES takeover recovery tooling and generated build outputs
.tools/
server_baseline/**/decompiled/**/bin/
server_baseline/**/decompiled/**/obj/
!server_baseline/**/*.sln

View File

@@ -0,0 +1,197 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
/*
设计报工工时报表树形查询。
保留“设计报工_工时报表_任务工时_查询”和“设计报工_工时报表_作业者工时_查询”不变
该过程一次取得明细,并在数据库端生成两种展示树和总工时。
*/
CREATE PROCEDURE [dbo].[_工时报表_树形查询]
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
SELECT
r.[RID],
r.[DID],
ISNULL(r.[], N'') AS [],
CONVERT(varchar(10), r.[], 120) AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
ISNULL(r.[], 0) AS [],
r.[],
ISNULL(r.[], N'') AS [],
ISNULL(notes.[], N'') AS [],
ISNULL(notes.[], N'') AS [],
ISNULL(r.[], N'') AS []
INTO #明细
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
OUTER APPLY
(
SELECT
STRING_AGG(
CASE WHEN n.[] = N'异常说明' THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120) + N' ' +
COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') +
NCHAR(13) + NCHAR(10) + n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(
CASE WHEN n.[] = N'奇思妙想' THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120) + N' ' +
COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') +
NCHAR(13) + NCHAR(10) + n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS notes
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 (ISNULL(@, N'') = N'' OR t.[] LIKE N'%' + @ + N'%')
AND (@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
AND
(
@ = 1
OR
(
NULLIF(LTRIM(RTRIM(@)), N'') IS NOT NULL
AND
(
ISNULL(t.[], N'') = LTRIM(RTRIM(@))
OR ISNULL(r.[], N'') = LTRIM(RTRIM(@))
)
)
);
CREATE CLUSTERED INDEX IX_明细_操作人日期 ON #明细([操作人], [工作日期], [开始时间], [RID]);
CREATE INDEX IX_明细_DID操作人 ON #明细([DID], [操作人], [开始时间], [RID]);
SELECT
ISNULL((
SELECT
CONCAT(N'p-', o.[]) AS [id], CAST(N'' AS nvarchar(1)) AS [parentId], 1 AS [Level],
CAST(NULL AS int) AS [RID], CAST(NULL AS int) AS [DID], o.[], CAST(N'' AS varchar(10)) AS [],
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 [], CAST(N'' AS nvarchar(max)) AS [],
CAST(N'' AS varchar(19)) AS [], CAST(N'' AS varchar(19)) AS [], COUNT(*) AS [],
CAST(SUM(o.[]) / 3600.0 AS decimal(18, 2)) AS [], CAST(N'' AS nvarchar(20)) AS [],
CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [],
CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [],
JSON_QUERY((
SELECT
CONCAT(N'd-', d.[], N'-', d.[]) AS [id], CONCAT(N'p-', d.[]) AS [parentId], 2 AS [Level],
CAST(NULL AS int) AS [RID], CAST(NULL AS int) AS [DID], d.[], d.[],
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 [], CAST(N'' AS nvarchar(max)) AS [],
CAST(N'' AS varchar(19)) AS [], CAST(N'' AS varchar(19)) AS [], COUNT(*) AS [],
CAST(SUM(d.[]) / 3600.0 AS decimal(18, 2)) AS [], CAST(N'' AS nvarchar(20)) AS [],
CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [],
CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [],
JSON_QUERY((
SELECT
CONCAT(N'r-', r.[RID]) AS [id], CONCAT(N'd-', r.[], N'-', r.[]) AS [parentId], 3 AS [Level],
r.[RID], r.[DID], r.[], r.[], r.[], r.[], r.[], r.[],
r.[], r.[], r.[], r.[], r.[], 1 AS [],
CAST(r.[] / 3600.0 AS decimal(18, 2)) AS [],
CASE WHEN r.[] = 1 THEN N'已校验' ELSE N'未校验' END AS [],
r.[], r.[], r.[], r.[]
FROM #明细 AS r
WHERE r.[] = d.[] AND r.[] = d.[]
ORDER BY r.[], r.[RID]
FOR JSON PATH
)) AS [children]
FROM #明细 AS d
WHERE d.[] = o.[]
GROUP BY d.[], d.[]
ORDER BY MIN(d.[]), d.[]
FOR JSON PATH
)) AS [children]
FROM #明细 AS o
GROUP BY o.[]
ORDER BY MIN(o.[]), o.[]
FOR JSON PATH
), N'[]') AS [operatorTreeData],
ISNULL((
SELECT
CONCAT(N't-', t.[DID]) AS [id], CAST(N'' AS nvarchar(1)) AS [parentId], 1 AS [Level],
CAST(NULL AS int) AS [RID], t.[DID], CAST(N'' AS nvarchar(100)) AS [], CAST(N'' AS varchar(10)) AS [],
ISNULL(MAX(t.[]), N'') AS [], ISNULL(MAX(t.[]), N'') AS [],
ISNULL(MAX(t.[]), N'') AS [], ISNULL(MAX(t.[]), N'') AS [],
ISNULL(MAX(t.[]), N'') AS [], ISNULL(MAX(t.[]), N'') AS [], ISNULL(MAX(t.[]), N'') AS [],
MIN(t.[]) AS [], MAX(t.[]) AS [], COUNT(*) AS [],
CAST(SUM(t.[]) / 3600.0 AS decimal(18, 2)) AS [],
CASE WHEN SUM(CONVERT(int, t.[])) = COUNT(*) THEN N'已校验'
WHEN SUM(CONVERT(int, t.[])) = 0 THEN N'未校验' ELSE N'部分校验' END AS [],
ISNULL(STRING_AGG(CASE WHEN NULLIF(LTRIM(RTRIM(t.[])), N'') IS NOT NULL THEN CONVERT(nvarchar(max), t.[] + NCHAR(13) + NCHAR(10) + t.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY t.[], t.[RID]), N'') AS [],
ISNULL(MAX(t.[]), N'') AS [], ISNULL(MAX(t.[]), N'') AS [],
ISNULL(STRING_AGG(CASE WHEN NULLIF(LTRIM(RTRIM(t.[])), N'') IS NOT NULL THEN CONVERT(nvarchar(max), t.[]) END, NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY t.[], t.[RID]), N'') AS [],
JSON_QUERY((
SELECT
CONCAT(N't-', c.[DID], N'-o-', c.[]) AS [id], CONCAT(N't-', c.[DID]) AS [parentId], 2 AS [Level],
CAST(NULL AS int) AS [RID], c.[DID], c.[], CAST(N'' AS varchar(10)) AS [],
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 [], CAST(N'' AS nvarchar(max)) AS [],
MIN(c.[]) AS [], MAX(c.[]) AS [], COUNT(*) AS [],
CAST(SUM(c.[]) / 3600.0 AS decimal(18, 2)) AS [],
CASE WHEN SUM(CONVERT(int, c.[])) = COUNT(*) THEN N'已校验'
WHEN SUM(CONVERT(int, c.[])) = 0 THEN N'未校验' ELSE N'部分校验' END AS [],
ISNULL(STRING_AGG(CASE WHEN NULLIF(LTRIM(RTRIM(c.[])), N'') IS NOT NULL THEN CONVERT(nvarchar(max), c.[] + NCHAR(13) + NCHAR(10) + c.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY c.[], c.[RID]), N'') AS [],
CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [],
ISNULL(STRING_AGG(CASE WHEN NULLIF(LTRIM(RTRIM(c.[])), N'') IS NOT NULL THEN CONVERT(nvarchar(max), c.[]) END, NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY c.[], c.[RID]), N'') AS []
FROM #明细 AS c
WHERE c.[DID] = t.[DID]
GROUP BY c.[DID], c.[]
ORDER BY MIN(c.[]), c.[]
FOR JSON PATH
)) AS [children]
FROM #明细 AS t
GROUP BY t.[DID]
ORDER BY MIN(t.[]), t.[DID]
FOR JSON PATH
), N'[]') AS [taskTreeData],
CONVERT(varchar(30), CAST(ISNULL((SELECT SUM([]) FROM #明细), 0) / 3600.0 AS decimal(18, 2))) AS [totalHours];
END
GO

View File

@@ -0,0 +1,122 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[_工时校验_查询]
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(50) = N'未校验',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@PageCurrent int = 1,
@PageSize int = 20,
@PageCount int = NULL OUTPUT,
@ItemCount int = NULL OUTPUT
AS
BEGIN
SET NOCOUNT ON;
SET @PageCurrent = CASE WHEN ISNULL(@PageCurrent, 0) < 1 THEN 1 ELSE @PageCurrent END;
SET @PageSize = CASE
WHEN ISNULL(@PageSize, 0) < 1 THEN 20
WHEN @PageSize > 100 THEN 100
ELSE @PageSize
END;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ nvarchar(100) = LTRIM(RTRIM(ISNULL(@, N'')));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
CREATE TABLE #FilteredRecords
(
[RID] int NOT NULL PRIMARY KEY
);
INSERT INTO #FilteredRecords ([RID])
SELECT r.[RID]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
WHERE
(@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
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 (ISNULL(@, N'') = N'' OR r.[] LIKE N'%' + @ + N'%')
AND (@ IS NULL OR r.[] >= @)
AND (@ IS NULL OR r.[] < DATEADD(day, 1, @))
AND
(
ISNULL(@, N'') = N''
OR @ = N'全部'
OR (@ = N'已校验' AND r.[] = 1)
OR (@ = N'未校验' AND r.[] = 0)
)
AND
(
@ = 1
OR
(
NULLIF(@, N'') IS NOT NULL
AND
(
LTRIM(RTRIM(ISNULL(t.[], N''))) = @
OR LTRIM(RTRIM(ISNULL(r.[], N''))) = @
)
)
);
SELECT @ItemCount = COUNT(1) FROM #FilteredRecords;
SET @PageCount = CASE
WHEN @ItemCount = 0 THEN 0
ELSE CEILING(CONVERT(decimal(18, 2), @ItemCount) / @PageSize)
END;
SELECT
r.[RID],
r.[DID],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
r.[ID],
r.[],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
r.[],
CAST(CAST(ISNULL(r.[], 0) / 3600.0 AS decimal(18, 2)) AS varchar(30)) AS [],
r.[],
r.[],
CASE WHEN r.[] = 1 THEN N'已校验' ELSE N'未校验' END AS [],
r.[],
CONVERT(varchar(19), r.[], 120) AS [],
r.[],
r.[],
t.[]
FROM #FilteredRecords AS f
INNER JOIN [dbo].[MES_设计报工_记录] AS r ON f.[RID] = r.[RID]
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
ORDER BY r.[RID] DESC
OFFSET (@PageCurrent - 1) * @PageSize ROWS
FETCH NEXT @PageSize ROWS ONLY;
END
GO

View File

@@ -0,0 +1,92 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE OR ALTER PROCEDURE [dbo].[_工时校验_查询]
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(50) = N'未校验',
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ nvarchar(100) = LTRIM(RTRIM(ISNULL(@, N'')));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
SELECT TOP (1000)
r.[RID],
r.[DID],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
r.[ID],
r.[],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
r.[],
CAST(CAST(ISNULL(r.[], 0) / 3600.0 AS decimal(18, 2)) AS varchar(30)) AS [],
r.[],
r.[],
CASE WHEN r.[] = 1 THEN N'已校验' ELSE N'未校验' END AS [],
r.[],
CONVERT(varchar(19), r.[], 120) AS [],
r.[],
r.[],
t.[]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
WHERE
(@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
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 (ISNULL(@, N'') = N'' OR r.[] LIKE N'%' + @ + N'%')
AND (@ IS NULL OR r.[] >= @)
AND (@ IS NULL OR r.[] < DATEADD(day, 1, @))
AND
(
ISNULL(@, N'') = N''
OR @ = N'全部'
OR (@ = N'已校验' AND r.[] = 1)
OR (@ = N'未校验' AND r.[] = 0)
)
AND
(
@ = 1
OR
(
NULLIF(@, N'') IS NOT NULL
AND
(
LTRIM(RTRIM(ISNULL(t.[], N''))) = @
OR LTRIM(RTRIM(ISNULL(r.[], N''))) = @
)
)
)
ORDER BY r.[RID] DESC;
END
GO

View File

@@ -0,0 +1,308 @@
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,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
;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)
AND
(
@ = 1
OR
(
NULLIF(LTRIM(RTRIM(@)), N'') IS NOT NULL
AND
(
ISNULL(t.[], N'') = LTRIM(RTRIM(@))
OR ISNULL(r.[], N'') = LTRIM(RTRIM(@))
)
)
)
),
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
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,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
;WITH base AS
(
SELECT
r.[RID],
r.[DID],
ISNULL(r.[], N'') AS [],
CONVERT(varchar(10), r.[], 120) 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)
AND
(
@ = 1
OR
(
NULLIF(LTRIM(RTRIM(@)), N'') IS NOT NULL
AND
(
ISNULL(t.[], N'') = LTRIM(RTRIM(@))
OR ISNULL(r.[], N'') = LTRIM(RTRIM(@))
)
)
)
),
result AS
(
SELECT
1 AS [Level],
N'p-' + [] AS [id],
CAST(N'' AS nvarchar(100)) AS [parentId],
[],
CAST(N'' AS nvarchar(20)) AS [],
CAST(NULL AS int) AS [RID],
CAST(NULL AS int) AS [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 [],
CAST(N'' AS varchar(19)) AS [],
CAST(N'' AS varchar(19)) AS [],
COUNT(1) AS [],
CAST(SUM([]) / 3600.0 AS decimal(18, 2)) AS [],
CAST(N'' AS nvarchar(20)) AS [],
CAST(N'' AS nvarchar(500)) AS [],
CAST(N'' AS nvarchar(500)) AS []
FROM base
GROUP BY []
UNION ALL
SELECT
2 AS [Level],
N'd-' + [] + N'-' + [] AS [id],
N'p-' + [] AS [parentId],
[],
[],
CAST(NULL AS int) AS [RID],
CAST(NULL AS int) AS [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 [],
CAST(N'' AS varchar(19)) AS [],
CAST(N'' AS varchar(19)) AS [],
COUNT(1) AS [],
CAST(SUM([]) / 3600.0 AS decimal(18, 2)) AS [],
CAST(N'' AS nvarchar(20)) AS [],
CAST(N'' AS nvarchar(500)) AS [],
CAST(N'' AS nvarchar(500)) AS []
FROM base
GROUP BY [], []
UNION ALL
SELECT
3 AS [Level],
N'r-' + CAST([RID] AS nvarchar(20)) AS [id],
N'd-' + [] + N'-' + [] AS [parentId],
[],
[],
[RID],
[DID],
ISNULL([], N'') AS [],
ISNULL([], N'') AS [],
ISNULL([], N'') AS [],
ISNULL([], N'') AS [],
ISNULL([], N'') AS [],
ISNULL([], N'') AS [],
CONVERT(varchar(19), [], 120) AS [],
CONVERT(varchar(19), [], 120) AS [],
1 AS [],
CAST([] / 3600.0 AS decimal(18, 2)) AS [],
CASE WHEN [] = 1 THEN N'已校验' ELSE N'未校验' END AS [],
ISNULL([], N'') AS [],
ISNULL([], N'') AS []
FROM base
)
SELECT *
FROM result
ORDER BY [], [], [Level], [RID];
END
GO

View File

@@ -0,0 +1,409 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'任务来源') IS NULL
BEGIN
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [] nvarchar(200) NULL;
END
GO
DECLARE @ sysname;
DECLARE @SQL nvarchar(max);
SELECT TOP (1) @ = cc.[name]
FROM sys.check_constraints AS cc
WHERE cc.[parent_object_id] = OBJECT_ID(N'[dbo].[MES_设计报工_任务说明]')
AND cc.[definition] LIKE N'%说明类型%';
IF @ IS NOT NULL
BEGIN
SET @SQL = N'ALTER TABLE [dbo].[MES_设计报工_任务说明] DROP CONSTRAINT '
+ QUOTENAME(@) + N';';
EXEC sys.sp_executesql @SQL;
END
GO
ALTER TABLE [dbo].[MES_设计报工_任务说明] WITH CHECK
ADD CONSTRAINT [CK_MES_设计报工_任务说明_类型]
CHECK ([] IN (N'领导批示', N'异常说明', N'奇思妙想'));
GO
CREATE OR ALTER PROCEDURE [dbo].[_领导批示权限_查询]
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SELECT CAST(CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END AS int) AS [];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务说明_新增]
@DID int,
@ nvarchar(20),
@ nvarchar(2000),
@ID nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET @ = LTRIM(RTRIM(ISNULL(@, N'')));
SET @ = LTRIM(RTRIM(ISNULL(@, N'')));
IF @ NOT IN (N'领导批示', N'异常说明', N'奇思妙想')
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明类型不正确' AS [message];
RETURN;
END
IF @ = N''
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明内容不能为空' AS [message];
RETURN;
END
IF @ = N'领导批示'
AND NOT EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
)
BEGIN
SELECT CAST(0 AS int) AS [result], N'当前角色无领导批示权限' AS [message];
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_任务说明]
([DID], [], [], [ID], [])
VALUES
(@DID, @, @, NULLIF(@ID, N''), NULLIF(@, N''));
SELECT CAST(1 AS int) AS [result], N'保存成功' AS [message], CONVERT(int, SCOPE_IDENTITY()) AS [SID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_查询]
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@ nvarchar(50) = N'',
@ID nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
SELECT TOP 1000
ISNULL(task_notes.[], N'') AS [],
t.[DID],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[ID],
t.[],
t.[ID],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(p.[], N'') AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
ISNULL(progress_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS []
FROM [dbo].[MES_设计报工_任务] AS t
OUTER APPLY
(
SELECT
COUNT(1) AS [],
SUM(CASE WHEN rr.[] IS NULL THEN 1 ELSE 0 END) AS [],
SUM(CASE
WHEN rr.[] IS NULL
AND (
(NULLIF(@ID, N'') IS NOT NULL AND ISNULL(rr.[ID], N'') = @ID)
OR (NULLIF(@ID, N'') IS NULL AND NULLIF(@, N'') IS NOT NULL AND ISNULL(rr.[], N'') = @)
)
THEN 1 ELSE 0 END) AS [],
MAX(rr.[]) AS [],
MAX(rr.[]) AS []
FROM [dbo].[MES_设计报工_记录] AS rr
WHERE rr.[DID] = t.[DID]
) AS r
OUTER APPLY
(
SELECT STRING_AGG(CONVERT(nvarchar(max), x.[]), N'') AS []
FROM
(
SELECT DISTINCT COALESCE(NULLIF(rr2.[], N''), NULLIF(rr2.[ID], N''), N'未填写操作人') AS []
FROM [dbo].[MES_设计报工_记录] AS rr2
WHERE rr2.[DID] = t.[DID]
AND rr2.[] IS NULL
) AS x
) AS p
OUTER APPLY
(
SELECT STRING_AGG(
CONVERT(nvarchar(max),
CONVERT(nvarchar(19), rr3.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(rr3.[])), N''), NULLIF(LTRIM(RTRIM(rr3.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ rr3.[]),
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY rr3.[] DESC, rr3.[RID] DESC) AS []
FROM [dbo].[MES_设计报工_记录] AS rr3
WHERE rr3.[DID] = t.[DID]
AND NULLIF(LTRIM(RTRIM(rr3.[])), N'') IS NOT NULL
) AS progress_notes
OUTER APPLY
(
SELECT
STRING_AGG(
CASE WHEN n.[] = N'领导批示'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(
CASE WHEN n.[] = N'异常说明'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(
CASE WHEN n.[] = N'奇思妙想'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS task_notes
WHERE
(@DID IS NULL OR @DID = 0 OR t.[DID] = @DID)
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 (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
(
ISNULL(@, N'') = N''
OR @ = N'全部'
OR (@ = N'未完成' AND ISNULL(t.[], N'') <> N'已完成')
OR (@ <> N'未完成' AND t.[] = @)
)
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND
(
(NULLIF(@ID, N'') IS NULL AND NULLIF(@, N'') IS NULL)
OR (NULLIF(@, N'') IS NOT NULL AND ISNULL(t.[], N'') = @)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
)
ORDER BY t.[DID] DESC;
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_新增]
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(500) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(max) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N''
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[MES_设计报工_任务]
(
[], [], [], [], [], [], [],
[], [], [],
[], [], [ID], [], [ID], [],
[], [], [],
[], [], [], []
)
VALUES
(
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''),
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''),
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''),
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@ID, N''), NULLIF(@, N''),
NULLIF(@ID, N''), NULLIF(@, N''),
TRY_CONVERT(datetime, NULLIF(@, N'')), TRY_CONVERT(datetime, NULLIF(@, N'')), N'待开始',
NULLIF(@, N''), NULLIF(@, N''), GETDATE(), NULLIF(@, N'')
);
SELECT CAST(1 AS int) AS [result], N'新增成功' AS [message], SCOPE_IDENTITY() AS [DID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_编辑]
@DID int,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(500) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(max) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_任务]
SET
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = CASE
WHEN NULLIF(@, N'') IS NOT NULL AND ISNULL([], N'') = @
THEN NULLIF(@, N'')
ELSE []
END,
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = CASE
WHEN NULLIF(@, N'') IS NOT NULL AND ISNULL([], N'') = @
THEN NULLIF(@, N'')
ELSE []
END,
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[ID] = NULLIF(@ID, N''),
[] = NULLIF(@, N''),
[ID] = NULLIF(@ID, N''),
[] = NULLIF(@, N''),
[] = TRY_CONVERT(datetime, NULLIF(@, N'')),
[] = TRY_CONVERT(datetime, NULLIF(@, N'')),
[] = NULLIF(@, N''),
[] = GETDATE(),
[] = NULLIF(@, N'')
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'编辑成功' AS [message];
END
GO

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

View File

@@ -0,0 +1,204 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_查询]
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@ nvarchar(50) = N'',
@ID nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
SELECT TOP 1000
ISNULL(task_notes.[], N'') AS [],
t.[DID],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[ID],
t.[],
t.[ID],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(p.[], N'') AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
ISNULL(progress_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS []
FROM [dbo].[MES_设计报工_任务] AS t
OUTER APPLY
(
SELECT
COUNT(1) AS [],
SUM(CASE WHEN rr.[] IS NULL THEN 1 ELSE 0 END) AS [],
SUM(CASE
WHEN rr.[] IS NULL
AND
(
(NULLIF(@ID, N'') IS NOT NULL AND ISNULL(rr.[ID], N'') = @ID)
OR (NULLIF(@ID, N'') IS NULL AND NULLIF(@, N'') IS NOT NULL AND ISNULL(rr.[], N'') = @)
)
THEN 1 ELSE 0 END) AS [],
MAX(rr.[]) AS [],
MAX(rr.[]) AS []
FROM [dbo].[MES_设计报工_记录] AS rr
WHERE rr.[DID] = t.[DID]
) AS r
OUTER APPLY
(
SELECT STRING_AGG(CONVERT(nvarchar(max), x.[]), N'') AS []
FROM
(
SELECT DISTINCT COALESCE(NULLIF(rr2.[], N''), NULLIF(rr2.[ID], N''), N'未填写操作人') AS []
FROM [dbo].[MES_设计报工_记录] AS rr2
WHERE rr2.[DID] = t.[DID]
AND rr2.[] IS NULL
) AS x
) AS p
OUTER APPLY
(
SELECT STRING_AGG(
CONVERT(nvarchar(max),
CONVERT(nvarchar(19), rr3.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(rr3.[])), N''), NULLIF(LTRIM(RTRIM(rr3.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ rr3.[]),
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY rr3.[] DESC, rr3.[RID] DESC) AS []
FROM [dbo].[MES_设计报工_记录] AS rr3
WHERE rr3.[DID] = t.[DID]
AND NULLIF(LTRIM(RTRIM(rr3.[])), N'') IS NOT NULL
) AS progress_notes
OUTER APPLY
(
SELECT
STRING_AGG(
CASE WHEN n.[] = N'领导批示'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(
CASE WHEN n.[] = N'异常说明'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(
CASE WHEN n.[] = N'奇思妙想'
THEN CONVERT(nvarchar(max),
CONVERT(nvarchar(19), n.[], 120)
+ N' '
+ COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人')
+ NCHAR(13) + NCHAR(10)
+ n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS task_notes
WHERE
(@DID IS NULL OR @DID = 0 OR t.[DID] = @DID)
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 (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
(
ISNULL(@, N'') = N''
OR @ = N'全部'
OR (@ = N'未完成' AND ISNULL(t.[], N'') <> N'已完成')
OR (@ <> N'未完成' AND t.[] = @)
)
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND
(
@ = 1
OR (NULLIF(@, N'') IS NOT NULL AND ISNULL(t.[], N'') = @)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
)
ORDER BY t.[DID] DESC;
END
GO

View File

@@ -0,0 +1,193 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_预算前_20260725', N'P') IS NOT NULL
THROW 51400, N'预算功能部署前备份过程已存在,停止重复部署。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务预算', N'U') IS NULL
BEGIN
CREATE TABLE dbo.[_装配任务预算]
(
[] int NOT NULL,
[] decimal(18, 2) NOT NULL
CONSTRAINT [DF_装配任务预算_工时] DEFAULT (0),
[] nvarchar(100) NULL,
[] datetime2(0) NOT NULL
CONSTRAINT [DF_装配任务预算_编辑时间] DEFAULT (SYSDATETIME()),
CONSTRAINT [PK_计划排产_装配任务预算] PRIMARY KEY CLUSTERED ([]),
CONSTRAINT [CK_装配任务预算_工时] CHECK ([] >= 0)
);
END;
IF OBJECT_ID(N'dbo.计划排产_装配合同预算', N'U') IS NULL
BEGIN
CREATE TABLE dbo.[_装配合同预算]
(
[] nvarchar(50) NOT NULL,
[] decimal(18, 2) NOT NULL
CONSTRAINT [DF_装配合同预算_工时] DEFAULT (0),
[] nvarchar(100) NULL,
[] datetime2(0) NOT NULL
CONSTRAINT [DF_装配合同预算_编辑时间] DEFAULT (SYSDATETIME()),
CONSTRAINT [PK_计划排产_装配合同预算] PRIMARY KEY CLUSTERED ([]),
CONSTRAINT [CK_装配合同预算_工时] CHECK ([] >= 0)
);
END;
GO
CREATE OR ALTER PROCEDURE dbo.[_装配任务预算_保存]
@ nvarchar(10),
@ int = 0,
@ nvarchar(50) = N'',
@ decimal(18, 2),
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF @ IS NULL OR @ < 0
THROW 51401, N'预算工时必须大于或等于 0。', 1;
IF @ = N'任务'
BEGIN
IF @ <= 0
THROW 51402, N'任务预算缺少有效订单号。', 1;
BEGIN TRANSACTION;
UPDATE dbo.[_装配任务预算] WITH (UPDLOCK, SERIALIZABLE)
SET [] = @,
[] = NULLIF(@, N''),
[] = SYSDATETIME()
WHERE [] = @;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.[_装配任务预算]
([], [], [])
VALUES
(@, @, NULLIF(@, N''));
END;
COMMIT TRANSACTION;
END
ELSE IF @ = N'合同'
BEGIN
SET @ = LTRIM(RTRIM(@));
IF @ = N''
THROW 51403, N'合同预算缺少合同号。', 1;
BEGIN TRANSACTION;
UPDATE dbo.[_装配合同预算] WITH (UPDLOCK, SERIALIZABLE)
SET [] = @,
[] = NULLIF(@, N''),
[] = SYSDATETIME()
WHERE [] = @;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.[_装配合同预算]
([], [], [])
VALUES
(@, @, NULLIF(@, N''));
END;
COMMIT TRANSACTION;
END
ELSE
THROW 51404, N'预算类型只允许“任务”或“合同”。', 1;
SELECT CAST(1 AS int) AS [result];
END;
GO
DECLARE @Definition nvarchar(max) =
OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务查询_核心'));
DECLARE @BackupDefinition nvarchar(max);
DECLARE @ProcedurePosition int;
DECLARE @FieldMarker nvarchar(200) =
N'ISNULL(ht.[合同质检工时], 0) AS [合同质检工时],';
DECLARE @JoinMarker nvarchar(200) =
N'LEFT JOIN #合同工时 AS ht ON v.[合同号] = ht.[合同号]';
IF @Definition IS NULL
THROW 51405, N'未找到装配任务核心查询过程。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @FieldMarker, N''))) / LEN(@FieldMarker) <> 2
THROW 51406, N'核心查询的工时字段结构与预期不一致,停止部署。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @JoinMarker, N''))) / LEN(@JoinMarker) <> 2
THROW 51407, N'核心查询的合同工时连接结构与预期不一致,停止部署。', 1;
SET @BackupDefinition = REPLACE(
@Definition,
N'[dbo].[计划排产_装配任务查询_核心]',
N'[dbo].[计划排产_装配任务查询_核心_预算前_20260725]'
);
EXEC sys.sp_executesql @BackupDefinition;
SET @Definition = REPLACE(
@Definition,
@FieldMarker,
@FieldMarker + N'
ISNULL(rw.[任务预算装配工时], 0) AS [任务预算装配工时],
CAST(CASE
WHEN ISNULL(rw.[任务预算装配工时], 0) > 0
THEN ISNULL(zp.[装配工时], 0) / 3600.0 / rw.[任务预算装配工时] * 100.0
ELSE 0
END AS decimal(18, 2)) AS [任务预算装配进度],
ISNULL(cw.[合同预算测试工时], 0) AS [合同预算测试工时],
CAST(CASE
WHEN ISNULL(cw.[合同预算测试工时], 0) > 0
THEN ISNULL(ht.[合同质检工时], 0) / 3600.0 / cw.[合同预算测试工时] * 100.0
ELSE 0
END AS decimal(18, 2)) AS [合同预算测试进度],'
);
SET @Definition = REPLACE(
@Definition,
@JoinMarker,
@JoinMarker + N'
LEFT JOIN dbo.[计划排产_装配任务预算] AS rw ON v.[订单编号] = rw.[订单号]
LEFT JOIN dbo.[计划排产_装配合同预算] AS cw ON v.[合同号] = cw.[合同号]'
);
SET @ProcedurePosition = CHARINDEX(N'PROCEDURE', @Definition);
IF @ProcedurePosition = 0
THROW 51408, N'未识别核心查询过程定义头。', 1;
SET @Definition = N'ALTER ' + SUBSTRING(@Definition, @ProcedurePosition, LEN(@Definition));
EXEC sys.sp_executesql @Definition;
COMMIT TRANSACTION;
GO
IF OBJECT_ID(N'dbo.计划排产_装配任务预算', N'U') IS NULL
THROW 51409, N'任务预算表部署校验失败。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配合同预算', N'U') IS NULL
THROW 51410, N'合同预算表部署校验失败。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务预算_保存', N'P') IS NULL
THROW 51411, N'预算保存过程部署校验失败。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_预算前_20260725', N'P') IS NULL
THROW 51412, N'核心查询备份过程部署校验失败。', 1;
SELECT [name], [type_desc], [create_date], [modify_date]
FROM sys.objects
WHERE [name] IN
(
N'计划排产_装配任务预算',
N'计划排产_装配合同预算',
N'计划排产_装配任务预算_保存',
N'计划排产_装配任务查询_核心',
N'计划排产_装配任务查询_核心_预算前_20260725'
)
ORDER BY [name];
GO

View File

@@ -0,0 +1,228 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION;
IF COL_LENGTH(N'dbo.计划排产_装配任务预算', N'任务预算质检工时') IS NULL
BEGIN
ALTER TABLE dbo.[_装配任务预算]
ADD [] decimal(18, 2) NOT NULL
CONSTRAINT [DF_装配任务预算_质检工时] DEFAULT (0) WITH VALUES,
CONSTRAINT [CK_装配任务预算_质检工时] CHECK ([] >= 0);
END;
IF COL_LENGTH(N'dbo.计划排产_装配合同预算', N'合同预算装配工时') IS NULL
BEGIN
ALTER TABLE dbo.[_装配合同预算]
ADD [] decimal(18, 2) NOT NULL
CONSTRAINT [DF_装配合同预算_装配工时] DEFAULT (0) WITH VALUES,
CONSTRAINT [CK_装配合同预算_装配工时] CHECK ([] >= 0);
END;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO
DECLARE @SaveProcedureDefinition nvarchar(max) =
OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务预算_保存'));
DECLARE @SaveProcedurePosition int;
IF @SaveProcedureDefinition IS NULL
THROW 51420, N'未找到装配任务预算保存过程。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务预算_保存_预算扩展前_20260727', N'P') IS NULL
BEGIN
SET @SaveProcedureDefinition = REPLACE(
@SaveProcedureDefinition,
N'[计划排产_装配任务预算_保存]',
N'[计划排产_装配任务预算_保存_预算扩展前_20260727]'
);
SET @SaveProcedurePosition = CHARINDEX(N'PROCEDURE', @SaveProcedureDefinition);
IF @SaveProcedurePosition = 0
THROW 51434, N'未识别预算保存过程定义头。', 1;
SET @SaveProcedureDefinition = N'CREATE ' + SUBSTRING(
@SaveProcedureDefinition,
@SaveProcedurePosition,
LEN(@SaveProcedureDefinition)
);
EXEC sys.sp_executesql @SaveProcedureDefinition;
END;
GO
CREATE OR ALTER PROCEDURE dbo.[_装配任务预算_保存]
@ nvarchar(10),
@ int = 0,
@ nvarchar(50) = N'',
@ decimal(18, 2),
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF @ IS NULL OR @ < 0
THROW 51421, N'预算工时必须大于或等于 0。', 1;
IF @ IN (N'任务', N'任务装配', N'任务质检')
BEGIN
IF @ <= 0
THROW 51422, N'任务预算缺少有效订单号。', 1;
BEGIN TRANSACTION;
UPDATE dbo.[_装配任务预算] WITH (UPDLOCK, SERIALIZABLE)
SET [] = CASE WHEN @ IN (N'任务', N'任务装配') THEN @ ELSE [] END,
[] = CASE WHEN @ = N'任务质检' THEN @ ELSE [] END,
[] = NULLIF(@, N''),
[] = SYSDATETIME()
WHERE [] = @;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.[_装配任务预算]
([], [], [], [])
VALUES
(@,
CASE WHEN @ IN (N'任务', N'任务装配') THEN @ ELSE 0 END,
CASE WHEN @ = N'任务质检' THEN @ ELSE 0 END,
NULLIF(@, N''));
END;
COMMIT TRANSACTION;
END
ELSE IF @ IN (N'合同', N'合同测试', N'合同装配')
BEGIN
SET @ = LTRIM(RTRIM(@));
IF @ = N''
THROW 51423, N'合同预算缺少合同号。', 1;
BEGIN TRANSACTION;
UPDATE dbo.[_装配合同预算] WITH (UPDLOCK, SERIALIZABLE)
SET [] = CASE WHEN @ IN (N'合同', N'合同测试') THEN @ ELSE [] END,
[] = CASE WHEN @ = N'合同装配' THEN @ ELSE [] END,
[] = NULLIF(@, N''),
[] = SYSDATETIME()
WHERE [] = @;
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO dbo.[_装配合同预算]
([], [], [], [])
VALUES
(@,
CASE WHEN @ IN (N'合同', N'合同测试') THEN @ ELSE 0 END,
CASE WHEN @ = N'合同装配' THEN @ ELSE 0 END,
NULLIF(@, N''));
END;
COMMIT TRANSACTION;
END
ELSE
THROW 51424, N'预算类型只允许任务装配、任务质检、合同装配或合同测试。', 1;
SELECT CAST(1 AS int) AS [result];
END;
GO
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @Definition nvarchar(max) =
OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务查询_核心'));
DECLARE @BackupDefinition nvarchar(max);
DECLARE @ProcedurePosition int;
DECLARE @TaskQualityMarker nvarchar(200) =
N'ISNULL(zp.[质检工时], 0) AS [任务质检工时],';
DECLARE @ContractAssemblyMarker nvarchar(200) =
N'ISNULL(ht.[合同装配工时], 0) AS [合同装配工时],';
IF @Definition IS NULL
THROW 51425, N'未找到装配任务核心查询过程。', 1;
IF CHARINDEX(N'[任务预算质检工时]', @Definition) = 0
BEGIN
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @TaskQualityMarker, N''))) / LEN(@TaskQualityMarker) <> 2
THROW 51426, N'核心查询的任务质检工时字段结构与预期不一致,停止部署。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @ContractAssemblyMarker, N''))) / LEN(@ContractAssemblyMarker) <> 2
THROW 51427, N'核心查询的合同装配工时字段结构与预期不一致,停止部署。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_预算扩展前_20260727', N'P') IS NULL
BEGIN
SET @BackupDefinition = REPLACE(
@Definition,
N'[dbo].[计划排产_装配任务查询_核心]',
N'[dbo].[计划排产_装配任务查询_核心_预算扩展前_20260727]'
);
SET @ProcedurePosition = CHARINDEX(N'PROCEDURE', @BackupDefinition);
IF @ProcedurePosition = 0
THROW 51428, N'未识别核心查询过程定义头。', 1;
SET @BackupDefinition = N'CREATE ' + SUBSTRING(
@BackupDefinition,
@ProcedurePosition,
LEN(@BackupDefinition)
);
EXEC sys.sp_executesql @BackupDefinition;
END;
SET @Definition = REPLACE(
@Definition,
@TaskQualityMarker,
@TaskQualityMarker + N'
ISNULL(rw.[任务预算质检工时], 0) AS [任务预算质检工时],
CAST(CASE
WHEN ISNULL(rw.[任务预算质检工时], 0) > 0
THEN ISNULL(zp.[质检工时], 0) / 3600.0 / rw.[任务预算质检工时] * 100.0
ELSE 0
END AS decimal(18, 2)) AS [任务预算质检进度],'
);
SET @Definition = REPLACE(
@Definition,
@ContractAssemblyMarker,
@ContractAssemblyMarker + N'
ISNULL(cw.[合同预算装配工时], 0) AS [合同预算装配工时],
CAST(CASE
WHEN ISNULL(cw.[合同预算装配工时], 0) > 0
THEN ISNULL(ht.[合同装配工时], 0) / 3600.0 / cw.[合同预算装配工时] * 100.0
ELSE 0
END AS decimal(18, 2)) AS [合同预算装配进度],'
);
SET @ProcedurePosition = CHARINDEX(N'PROCEDURE', @Definition);
IF @ProcedurePosition = 0
THROW 51429, N'未识别核心查询过程定义头。', 1;
SET @Definition = N'ALTER ' + SUBSTRING(@Definition, @ProcedurePosition, LEN(@Definition));
EXEC sys.sp_executesql @Definition;
END;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO
IF COL_LENGTH(N'dbo.计划排产_装配任务预算', N'任务预算质检工时') IS NULL
THROW 51430, N'任务预算质检工时字段部署校验失败。', 1;
IF COL_LENGTH(N'dbo.计划排产_装配合同预算', N'合同预算装配工时') IS NULL
THROW 51431, N'合同预算装配工时字段部署校验失败。', 1;
IF OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务查询_核心')) NOT LIKE N'%任务预算质检进度%'
THROW 51432, N'任务预算质检进度字段部署校验失败。', 1;
IF OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务查询_核心')) NOT LIKE N'%合同预算装配进度%'
THROW 51433, N'合同预算装配进度字段部署校验失败。', 1;
GO

View File

@@ -0,0 +1,194 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF OBJECT_ID(N'dbo.MES_大屏参数配置', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_大屏参数配置]
(
[] varchar(30) NOT NULL CONSTRAINT [PK_MES_大屏参数配置] PRIMARY KEY,
[] nvarchar(30) NOT NULL,
[] bit NOT NULL CONSTRAINT [DF_MES_大屏参数配置_本月启用覆盖] DEFAULT (0),
[] decimal(5, 2) NOT NULL CONSTRAINT [DF_MES_大屏参数配置_本月覆盖值] DEFAULT (0),
[] bit NOT NULL CONSTRAINT [DF_MES_大屏参数配置_上月启用覆盖] DEFAULT (0),
[] decimal(5, 2) NOT NULL CONSTRAINT [DF_MES_大屏参数配置_上月覆盖值] DEFAULT (0),
[] nvarchar(100) NULL,
[] datetime NOT NULL CONSTRAINT [DF_MES_大屏参数配置_最后修改时间] DEFAULT (GETDATE())
);
END;
GO
DECLARE @ TABLE
(
[] varchar(30) NOT NULL PRIMARY KEY,
[] nvarchar(30) NOT NULL,
[] int NOT NULL
);
INSERT INTO @ ([], [], [])
VALUES
('sales', N'销售', 1),
('research', N'研发', 2),
('plan', N'计划', 3),
('purchase', N'采购', 4),
('machining', N'机加', 5),
('assembly', N'装配', 6),
('quality', N'质量', 7),
('warehouse', N'仓库', 8);
INSERT INTO [dbo].[MES_大屏参数配置] ([], [])
SELECT src.[], src.[]
FROM @ AS src
WHERE NOT EXISTS
(
SELECT 1
FROM [dbo].[MES_大屏参数配置] AS target
WHERE target.[] = src.[]
);
UPDATE target
SET target.[] = src.[]
FROM [dbo].[MES_大屏参数配置] AS target
INNER JOIN @ AS src ON src.[] = target.[];
GO
CREATE OR ALTER PROCEDURE [dbo].[_大屏参数配置_查询]
AS
BEGIN
SET NOCOUNT ON;
SELECT
[] AS [moduleKey],
[] AS [moduleName],
CONVERT(int, []) AS [currentEnabled],
CAST([] AS decimal(5, 2)) AS [currentValue],
CONVERT(int, []) AS [previousEnabled],
CAST([] AS decimal(5, 2)) AS [previousValue],
[] AS [updatedBy],
CONVERT(varchar(19), [], 120) AS [updatedAt]
FROM [dbo].[MES_大屏参数配置]
WHERE [] IN ('sales', 'research', 'plan', 'purchase', 'machining', 'assembly', 'quality', 'warehouse')
ORDER BY CASE []
WHEN 'sales' THEN 1 WHEN 'research' THEN 2 WHEN 'plan' THEN 3 WHEN 'purchase' THEN 4
WHEN 'machining' THEN 5 WHEN 'assembly' THEN 6 WHEN 'quality' THEN 7 WHEN 'warehouse' THEN 8
ELSE 99 END;
END;
GO
CREATE OR ALTER PROCEDURE [dbo].[_大屏参数配置_保存]
@ varchar(30),
@ bit,
@ decimal(5, 2),
@ bit,
@ decimal(5, 2),
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND [Roles_Function] LIKE N'%管理员%'
)
BEGIN
THROW 50001, N'仅管理员可以修改大屏参数配置。', 1;
END;
IF @ NOT IN ('sales', 'research', 'plan', 'purchase', 'machining', 'assembly', 'quality', 'warehouse')
BEGIN
THROW 50002, N'不支持的大屏指标配置键。', 1;
END;
IF @ < 0 OR @ > 100 OR @ < 0 OR @ > 100
BEGIN
THROW 50003, N'配置百分比必须在 0 到 100 之间。', 1;
END;
UPDATE [dbo].[MES_大屏参数配置]
SET
[] = CASE WHEN @ = 1 AND @ > 0 THEN 1 ELSE 0 END,
[] = @,
[] = CASE WHEN @ = 1 AND @ > 0 THEN 1 ELSE 0 END,
[] = @,
[] = NULLIF(LTRIM(RTRIM(@)), N''),
[] = GETDATE()
WHERE [] = @;
SELECT 1 AS [result];
END;
GO
SET NOCOUNT ON;
DECLARE @Title nvarchar(100) = N'大屏参数配置';
DECLARE @Path varchar(100) = 'ScreenParameterConfig/index';
DECLARE @Component varchar(100) = '/SystemMaintenance/ScreenParameterConfig/index';
DECLARE @Name varchar(100) = 'ScreenParameterConfig';
DECLARE @Icon varchar(100) = 'SystemMaintenance';
DECLARE @TargetAccount int = 1;
DECLARE @ParentId int;
SELECT TOP (1) @ParentId = [id]
FROM [dbo].[_二级菜单]
WHERE [] = @TargetAccount
AND [pid] = 0
AND [] = 1
AND [title] = N'系统管理'
ORDER BY [id];
IF @ParentId IS NULL
BEGIN
THROW 50004, N'未找到超级管理员的系统管理菜单。', 1;
END;
DECLARE @BaseId int;
SELECT @BaseId = ISNULL(MAX([id]), 0) FROM [dbo].[_二级菜单];
IF NOT EXISTS
(
SELECT 1
FROM [dbo].[_二级菜单]
WHERE [] = @TargetAccount
AND ([path] = @Path OR [componet] = @Component OR [title] = @Title)
)
BEGIN
INSERT INTO [dbo].[_二级菜单]
([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [], [], [], [])
VALUES
(@BaseId + 1, @ParentId, @Path, @Component, NULL, @Name, @Title, @Icon, @TargetAccount, @BaseId + 1, 1, GETDATE());
END;
UPDATE [dbo].[_二级菜单]
SET
[pid] = @ParentId,
[path] = @Path,
[componet] = @Component,
[name] = @Name,
[title] = @Title,
[icon] = @Icon,
[] = [id],
[] = 1,
[] = GETDATE()
WHERE [] = @TargetAccount
AND ([path] = @Path OR [componet] = @Component OR [title] = @Title);
SELECT [], [], [], [], [], []
FROM [dbo].[MES_大屏参数配置]
ORDER BY CASE []
WHEN 'sales' THEN 1 WHEN 'research' THEN 2 WHEN 'plan' THEN 3 WHEN 'purchase' THEN 4
WHEN 'machining' THEN 5 WHEN 'assembly' THEN 6 WHEN 'quality' THEN 7 WHEN 'warehouse' THEN 8
ELSE 99 END;
SELECT [id], [pid], [path], [componet], [name], [title], [], []
FROM [dbo].[_二级菜单]
WHERE [] = @TargetAccount
AND [path] = @Path;
GO

View File

@@ -0,0 +1,204 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
/*
计划排产订单树形查询。
保留 dbo.计划排产_查询计划信息 不变;该过程在数据库端完成订单聚合、工序树和状态汇总。
*/
CREATE PROCEDURE [dbo].[_查询计划信息_树形查询]
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部'
AS
BEGIN
SET NOCOUNT ON;
;WITH AS
(
SELECT [TaskAID], SUM(ISNULL([], 0)) AS [], SUM(ISNULL([], 0)) AS []
FROM [dbo].[YL_质量检验_质检记录]
WHERE [] = N'收检'
GROUP BY [TaskAID]
),
AS
(
SELECT DISTINCT []
FROM [dbo].[YL_质量检验_质检记录]
WHERE [] = N'终检'
),
AS
(
SELECT
[TaskAID],
SUM(CASE WHEN [] = 6 THEN [] ELSE 0 END) AS [_6],
SUM(CASE WHEN [] = 8 THEN [] ELSE 0 END) AS [_8]
FROM [dbo].[YL_质量检验_质检记录]
GROUP BY [TaskAID]
)
SELECT TOP (300)
v.[],
v.[],
v.[],
v.[],
ISNULL(v.[], 0) AS [],
CASE ISNULL(v.[], 0)
WHEN 1 THEN N'发料齐套'
WHEN 2 THEN N'发料缺件'
ELSE N'未发料'
END AS [],
CASE ISNULL(v.[], 0) WHEN 1 THEN N'' ELSE N'' END AS [],
CASE ISNULL(v.[], 0)
WHEN 4 THEN N'已完成'
WHEN 2 THEN N'已开工'
WHEN 0 THEN N'待执行'
WHEN 1 THEN N'可执行'
ELSE N''
END AS [],
CASE ISNULL(v.[], 0)
WHEN 2 THEN N'辅助开始'
WHEN 3 THEN N'辅助结束'
WHEN 4 THEN N'开始加工'
WHEN 5 THEN N'暂停'
WHEN 6 THEN N'报工'
ELSE N''
END AS [],
v.[],
ISNULL(v.[], CONVERT(datetime, '19000101', 112)) AS [],
ISNULL(v.[], 0) AS [],
v.[TaskAID],
v.[],
v.[] AS [],
v.[],
v.[] AS [],
v.[] AS [],
v.[] AS [],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[] AS [],
v.[],
v.[],
v.[],
CASE WHEN v.[] = 1 THEN N'加急' ELSE N'' END AS [],
v.[],
v.[],
v.[],
v.[],
v.[],
v.[],
v.[],
CASE WHEN zp.[] IS NOT NULL THEN N'' ELSE N'' END AS [],
ISNULL(sj.[], 0) AS [],
ISNULL(sj.[], 0) AS []
INTO #原始明细
FROM [dbo].[View_生产订单_MES] AS v
LEFT JOIN AS zp ON v.[] = zp.[]
LEFT JOIN AS sj ON v.[TaskAID] = sj.[TaskAID]
LEFT JOIN AS qt ON v.[TaskAID] = qt.[TaskAID]
WHERE v.[] = N'pit_Resource'
AND v.[] = 1
AND (@ <= 0 OR v.[] = @)
AND (NULLIF(@, N'') IS NULL OR @ = N'0' OR v.[] = @)
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] = @)
AND (NULLIF(@, N'') IS NULL OR v.[] >= @)
AND (NULLIF(@, N'') IS NULL OR v.[] <= @)
AND (@ <> N'未发货' OR ISNULL(v.[], 0) = 0)
AND (@ <> N'已发货' OR v.[] = 1)
AND (@ <> N'机加' OR ISNULL(v.[], N'') = N'机加件')
AND (@ <> N'装配' OR v.[] LIKE N'%装配%')
AND (@ <> N'发料齐套' OR ISNULL(v.[], 0) = 1)
AND (@ <> N'发料缺件' OR ISNULL(v.[], 0) = 2)
AND (@ <> N'' OR ISNULL(v.[], 0) = 0)
AND (@ <> N'' OR v.[] = 1)
AND (@ = N'全部' OR EXISTS
(
SELECT 1 FROM STRING_SPLIT(@, N',') AS assignee WHERE v.[] = assignee.[value]
))
AND
(
@ = N''
OR (@ = N'已完成' AND ISNULL(qt.[_8], 0) > 0 AND ISNULL(qt.[_6], 0) > 0 AND qt.[_8] >= qt.[_6])
OR (@ = N'未完成' AND NOT (ISNULL(qt.[_8], 0) > 0 AND ISNULL(qt.[_6], 0) > 0 AND qt.[_8] >= qt.[_6]))
)
ORDER BY v.[] ASC;
CREATE CLUSTERED INDEX [IX_原始明细_订单行] ON #原始明细 ([订单号], [订单行号], [TaskAID]);
SELECT
source.*,
ROW_NUMBER() OVER (PARTITION BY source.[] ORDER BY TRY_CONVERT(int, source.[]), source.[TaskAID]) AS [],
COUNT(*) OVER (PARTITION BY source.[]) AS []
INTO #订单明细
FROM #原始明细 AS source;
CREATE CLUSTERED INDEX [IX_订单明细_订单序号] ON #订单明细 ([订单号], [订单内序号]);
DECLARE @ nvarchar(max);
SELECT @ =
(
SELECT
root.[], root.[], root.[], root.[], root.[], root.[], root.[], root.[],
CASE WHEN EXISTS (SELECT 1 FROM #订单明细 AS priorityRow WHERE priorityRow.[订单号] = root.[订单号] AND priorityRow.[优先级] = N'是') THEN N'是' ELSE root.[优先级] END AS [优先级],
ISNULL(currentProcess.[], N'') AS [],
root.[],
CASE WHEN EXISTS (SELECT 1 FROM #订单明细 AS started WHERE started.[订单号] = root.[订单号] AND started.[订单内序号] > 1 AND started.[开工时间] > CONVERT(datetime, '19000101', 112)) THEN 1 ELSE 0 END AS [开工时间],
JSON_QUERY
(
(
SELECT
detail.[], detail.[], detail.[], detail.[], detail.[], detail.[], detail.[], detail.[],
detail.[], detail.[], detail.[], detail.[], detail.[], detail.[], detail.[],
CONVERT(bit, CASE WHEN detail.[] LIKE N'%外协%' THEN 1 ELSE 0 END) AS [],
CASE WHEN detail.[] > 1 AND detail.[] <> 100 AND detail.[] > CONVERT(datetime, '19000101', 112) THEN 1 ELSE 0 END AS [绿],
CAST(0 AS int) AS [],
CASE WHEN detail.[] > 1 AND detail.[] = 100 THEN 1 ELSE 0 END AS [],
detail.[], detail.[], detail.[], detail.[]
FROM #订单明细 AS detail
WHERE detail.[] = root.[]
ORDER BY detail.[]
FOR JSON PATH
)
) AS [],
CASE WHEN EXISTS (SELECT 1 FROM #订单明细 AS urgent WHERE urgent.[订单号] = root.[订单号] AND urgent.[加急状态] = N'加急') THEN N'加急' ELSE root.[加急状态] END AS [加急状态],
CASE WHEN EXISTS (SELECT 1 FROM #订单明细 AS finalCheck WHERE finalCheck.[订单号] = root.[订单号] AND finalCheck.[终检] = N'是') THEN N'是' ELSE root.[终检] END AS [终检],
root.[], root.[],
CONVERT(bit, CASE WHEN EXISTS (SELECT 1 FROM #订单明细 AS outsource WHERE outsource.[订单号] = root.[订单号] AND outsource.[指派对象] LIKE N'%外协%') THEN 1 ELSE 0 END) AS [是否外协],
root.[], root.[], root.[], root.[], root.[], root.[], root.[], root.[], root.[]
FROM #订单明细 AS root
OUTER APPLY
(
SELECT TOP (1) []
FROM #订单明细 AS completedProcess
WHERE completedProcess.[] = root.[]
AND completedProcess.[] > 1
AND completedProcess.[] > 0
ORDER BY completedProcess.[] DESC
) AS currentProcess
WHERE root.[] = 1
ORDER BY root.[] ASC, root.[]
FOR JSON PATH
);
SELECT ISNULL(@, N'[]') AS [treeData];
END;
GO

View File

@@ -0,0 +1,197 @@
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'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ nvarchar(100) = LTRIM(RTRIM(ISNULL(@, N'')));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
SELECT
r.[RID],
r.[DID],
ISNULL(r.[], N'') AS [],
CONVERT(varchar(10), r.[], 120) AS [],
CONVERT(varchar(19), t.[], 120) AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
CONVERT(varchar(19), t.[], 120) AS [],
CONVERT(varchar(19), t.[], 120) AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
ISNULL(t.[], N'') AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CAST(1 AS int) AS [],
CAST(ISNULL(r.[], 0) / 3600.0 AS decimal(18, 2)) AS [],
CASE WHEN r.[] = 1 THEN N'已校验' ELSE N'未校验' END AS [],
ISNULL(r.[], N'') AS [],
ISNULL(r.[], N'') AS []
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 (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)
AND
(
@ = 1
OR
(
NULLIF(@, N'') IS NOT NULL
AND
(
LTRIM(RTRIM(ISNULL(t.[], N''))) = @
OR LTRIM(RTRIM(ISNULL(r.[], N''))) = @
)
)
)
ORDER BY r.[] DESC, r.[RID] DESC;
END
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
DECLARE @TargetMenus TABLE
(
[] int NOT NULL PRIMARY KEY,
[ID] int NOT NULL
);
INSERT INTO @TargetMenus ([], [ID])
SELECT
parent_menu.[],
MIN(parent_menu.[id]) AS [ID]
FROM [dbo].[_二级菜单] AS parent_menu WITH (UPDLOCK, HOLDLOCK)
WHERE parent_menu.[pid] = 0
AND parent_menu.[] = 1
AND
(
parent_menu.[title] = N'研发管理'
OR parent_menu.[path] = '/ResearchManagement'
OR parent_menu.[name] = 'ResearchManagement'
)
GROUP BY parent_menu.[];
UPDATE menu_row
SET
menu_row.[pid] = target.[ID],
menu_row.[path] = 'DesignReportTask/FinancialHours/index',
menu_row.[componet] = '/ProductionManagement/DesignReportTask/FinancialHours/index',
menu_row.[redirect] = NULL,
menu_row.[name] = 'DesignReportFinancialHours',
menu_row.[title] = N'研发财务工时',
menu_row.[icon] = 'WhiteCollarBonusesSummary',
menu_row.[] = menu_row.[id],
menu_row.[] = 1,
menu_row.[] = GETDATE()
FROM [dbo].[_二级菜单] AS menu_row
INNER JOIN @TargetMenus AS target ON target.[] = menu_row.[]
WHERE
menu_row.[path] = 'DesignReportTask/FinancialHours/index'
OR menu_row.[componet] = '/ProductionManagement/DesignReportTask/FinancialHours/index'
OR menu_row.[name] = 'DesignReportFinancialHours'
OR menu_row.[title] = N'研发财务工时';
INSERT INTO [dbo].[_二级菜单]
([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [], [], [], [])
SELECT
next_id.[ID],
target.[ID],
'DesignReportTask/FinancialHours/index',
'/ProductionManagement/DesignReportTask/FinancialHours/index',
NULL,
'DesignReportFinancialHours',
N'研发财务工时',
'WhiteCollarBonusesSummary',
target.[],
next_id.[ID],
1,
GETDATE()
FROM @TargetMenus AS target
CROSS APPLY
(
SELECT ISNULL(MAX(existing.[id]), 0) + 1 AS [ID]
FROM [dbo].[_二级菜单] AS existing WITH (UPDLOCK, HOLDLOCK)
WHERE existing.[] = target.[]
) AS next_id
WHERE NOT EXISTS
(
SELECT 1
FROM [dbo].[_二级菜单] AS existing WITH (UPDLOCK, HOLDLOCK)
WHERE existing.[] = target.[]
AND
(
existing.[path] = 'DesignReportTask/FinancialHours/index'
OR existing.[componet] = '/ProductionManagement/DesignReportTask/FinancialHours/index'
OR existing.[name] = 'DesignReportFinancialHours'
OR existing.[title] = N'研发财务工时'
)
);
COMMIT TRANSACTION;
SELECT
menu_row.[id],
menu_row.[pid],
menu_row.[path],
menu_row.[componet],
menu_row.[name],
menu_row.[title],
menu_row.[icon],
menu_row.[],
menu_row.[]
FROM [dbo].[_二级菜单] AS menu_row
WHERE menu_row.[title] = N'研发财务工时'
ORDER BY menu_row.[], menu_row.[id];
GO

View File

@@ -0,0 +1,272 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
/*
销售订单状态树形查询。
保留 dbo.销售管理_销售订单状态 不变;该过程在数据库端完成订单聚合和工序明细树生成。
*/
CREATE PROCEDURE [dbo].[_销售订单状态_树形查询]
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部'
AS
BEGIN
SET NOCOUNT ON;
;WITH AS
(
SELECT
[TaskAID],
SUM(ISNULL([], 0)) AS [],
SUM(ISNULL([], 0)) AS []
FROM [dbo].[YL_质量检验_质检记录]
WHERE [] = N'收检'
GROUP BY [TaskAID]
),
AS
(
SELECT
[TaskAID],
SUM(ISNULL([], 0)) AS [],
SUM(ISNULL([], 0)) AS []
FROM [dbo].[YL_质量检验_质检记录]
WHERE [] = N'终检'
GROUP BY [TaskAID]
),
AS
(
SELECT DISTINCT []
FROM [dbo].[YL_质量检验_质检记录]
WHERE [] = N'终检'
)
SELECT TOP (200)
v.[],
v.[],
v.[],
v.[],
ISNULL(v.[], 0) AS [],
CASE ISNULL(v.[], 0)
WHEN 1 THEN N'发料齐套'
WHEN 2 THEN N'发料缺件'
ELSE N'未发料'
END AS [],
CASE ISNULL(v.[], 0)
WHEN 1 THEN N''
ELSE N''
END AS [],
CASE ISNULL(v.[], 0)
WHEN 4 THEN N'已完成'
WHEN 2 THEN N'已开工'
WHEN 0 THEN N'待执行'
WHEN 1 THEN N'可执行'
ELSE N''
END AS [],
CASE ISNULL(v.[], 0)
WHEN 2 THEN N'辅助开始'
WHEN 3 THEN N'辅助结束'
WHEN 4 THEN N'开始加工'
WHEN 5 THEN N'暂停'
WHEN 6 THEN N'报工'
ELSE N''
END AS [],
v.[],
ISNULL(v.[], CONVERT(datetime, '19000101', 112)) AS [],
ISNULL(v.[], 0) AS [],
v.[TaskAID],
v.[],
v.[] AS [],
v.[],
v.[] AS [],
v.[] AS [],
v.[] AS [],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[] AS [],
v.[],
v.[],
v.[],
CASE WHEN v.[] = 1 THEN N'加急' ELSE N'' END AS [],
v.[],
v.[],
v.[],
v.[],
v.[],
v.[],
v.[],
CASE WHEN zp.[] IS NOT NULL THEN N'' ELSE N'' END AS [],
ISNULL(sj.[], 0) AS [],
ISNULL(sj.[], 0) AS [],
ISNULL(zjs.[], 0) AS [],
ISNULL(zjs.[], 0) AS []
INTO #原始明细
FROM [dbo].[View_生产订单_MES] AS v
LEFT JOIN AS zp ON v.[] = zp.[]
LEFT JOIN AS sj ON v.[TaskAID] = sj.[TaskAID]
LEFT JOIN AS zjs ON v.[TaskAID] = zjs.[TaskAID]
WHERE v.[] = N'pit_Resource'
AND v.[] LIKE N'%装配%'
AND (@ <= 0 OR v.[] = @)
AND (NULLIF(@, N'') IS NULL OR @ = N'0' OR v.[] = @)
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] LIKE N'%' + @ + N'%')
AND (NULLIF(@, N'') IS NULL OR v.[] = @)
AND (NULLIF(@1, N'') IS NULL OR v.[] >= @1)
AND (NULLIF(@2, N'') IS NULL OR v.[] <= @2)
AND (NULLIF(@1, N'') IS NULL OR v.[] >= @1)
AND (NULLIF(@2, N'') IS NULL OR v.[] <= @2)
AND (NULLIF(@1, N'') IS NULL OR v.[] >= @1)
AND (NULLIF(@2, N'') IS NULL OR v.[] <= @2)
AND (@ <> N'未完成' OR ISNULL(v.[], 0) = 0)
AND (@ <> N'已完成' OR v.[] = 1)
AND (@ <> N'未发货' OR ISNULL(v.[], 0) = 0)
AND (@ <> N'已发货' OR v.[] = 1)
AND (@ = N'全部' OR EXISTS
(
SELECT 1
FROM STRING_SPLIT(@, N',') AS assignee
WHERE v.[] = assignee.[value]
))
AND
(
@ = N'全部'
OR
(
@ = N'未完成'
AND ISNULL(zjs.[], 0) + ISNULL(zjs.[], 0) + ISNULL(sj.[], 0) <= v.[]
AND (ISNULL(zjs.[], 0) <= 0 OR ISNULL(zjs.[], 0) > ISNULL(v.[], 0))
)
OR
(
@ = N'已完成'
AND ISNULL(zjs.[], 0) + ISNULL(zjs.[], 0) + ISNULL(sj.[], 0) = v.[]
AND ISNULL(v.[], 0) = ISNULL(zjs.[], 0)
)
)
ORDER BY v.[] DESC, v.[] DESC;
CREATE CLUSTERED INDEX [IX_原始明细_订单行] ON #原始明细 ([订单号], [订单行号], [TaskAID]);
SELECT
source.*,
ROW_NUMBER() OVER
(
PARTITION BY source.[]
ORDER BY TRY_CONVERT(int, source.[]), source.[TaskAID]
) AS [],
COUNT(*) OVER (PARTITION BY source.[]) AS []
INTO #订单明细
FROM #原始明细 AS source;
CREATE CLUSTERED INDEX [IX_订单明细_订单序号] ON #订单明细 ([订单号], [订单内序号]);
DECLARE @ nvarchar(max);
SELECT @ =
(
SELECT
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
CASE WHEN EXISTS
(SELECT 1 FROM #订单明细 AS priorityRow WHERE priorityRow.[订单号] = root.[订单号] AND priorityRow.[优先级] = N'是')
THEN N'' ELSE root.[] END AS [],
ISNULL(currentProcess.[], N'') AS [],
root.[],
CASE WHEN EXISTS
(SELECT 1 FROM #订单明细 AS started WHERE started.[订单号] = root.[订单号] AND started.[订单内序号] > 1 AND started.[开工时间] > CONVERT(datetime, '19000101', 112))
THEN 1 ELSE 0 END AS [],
JSON_QUERY
(
(
SELECT
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
detail.[],
CONVERT(bit, CASE WHEN detail.[] LIKE N'%外协%' THEN 1 ELSE 0 END) AS [],
CASE WHEN detail.[] > 1 AND detail.[] <> 100 AND detail.[] > CONVERT(datetime, '19000101', 112) THEN 1 ELSE 0 END AS [绿],
CAST(0 AS int) AS [],
CASE WHEN detail.[] > 1 AND detail.[] = 100 THEN 1 ELSE 0 END AS [],
detail.[],
detail.[],
detail.[],
detail.[]
FROM #订单明细 AS detail
WHERE detail.[] = root.[]
ORDER BY detail.[]
FOR JSON PATH
)
) AS [],
CASE WHEN EXISTS
(SELECT 1 FROM #订单明细 AS urgent WHERE urgent.[订单号] = root.[订单号] AND urgent.[加急状态] = N'加急')
THEN N'加急' ELSE root.[] END AS [],
CASE WHEN EXISTS
(SELECT 1 FROM #订单明细 AS finalCheck WHERE finalCheck.[订单号] = root.[订单号] AND finalCheck.[终检] = N'是')
THEN N'' ELSE root.[] END AS [],
root.[],
root.[],
CONVERT(bit, CASE WHEN EXISTS
(SELECT 1 FROM #订单明细 AS outsource WHERE outsource.[订单号] = root.[订单号] AND outsource.[指派对象] LIKE N'%外协%')
THEN 1 ELSE 0 END) AS [],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[],
root.[]
FROM #订单明细 AS root
OUTER APPLY
(
SELECT TOP (1) []
FROM #订单明细 AS completedProcess
WHERE completedProcess.[] = root.[]
AND completedProcess.[] > 1
AND completedProcess.[] > 0
ORDER BY completedProcess.[] DESC
) AS currentProcess
WHERE root.[] = 1
ORDER BY TRY_CONVERT(int, root.[]), root.[] DESC, root.[] DESC
FOR JSON PATH
);
SELECT ISNULL(@, N'[]') AS [treeData];
END;
GO

View File

@@ -0,0 +1,281 @@
USE [YL_MESDB]
GO
/*
新页面专用过程。保留 dbo.生产管理_结算工时_查询 的原始平铺行输出不变,
此过程直接输出 Element UI 树形数据及根节点汇总,供结算工时页面使用。
*/
CREATE OR ALTER PROCEDURE [dbo].[_结算工时_树形查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL,
@ INT = 100
AS
BEGIN
SET NOCOUNT ON;
/* Web 端空日期经 DATE 参数绑定后为 1900-01-01按未筛选处理。 */
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
DECLARE @TopCount INT = CASE WHEN ISNULL(@, 0) <= 0 THEN 100 ELSE @ END;
CREATE TABLE #基础数据
(
RowID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
TaskAID BIGINT NULL,
DATETIME NULL,
NVARCHAR(1000) NULL,
NVARCHAR(100) NULL,
NVARCHAR(100) NULL,
INT NULL,
INT NULL,
NVARCHAR(100) NULL,
INT NOT NULL,
INT NULL,
NVARCHAR(1000) NULL,
NVARCHAR(1000) NULL,
NVARCHAR(100) NULL,
NVARCHAR(100) NULL,
NVARCHAR(1000) NULL,
NVARCHAR(1000) NULL
);
INSERT INTO #基础数据
(
TaskAID, , , , , , ,
, , , , , , ,
,
)
SELECT TOP (@TopCount)
v.TaskAID,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
q.,
q.,
q.,
q.,
q.,
COALESCE(NULLIF(q., N''), v.),
p.,
p.
FROM dbo.MES_接口_生产计划 AS p
INNER JOIN dbo.MES_接口_生产计划_生产任务 AS q
ON q. = p.
AND q. = N'pit_Resource'
INNER JOIN dbo.View_生产工时视图 AS v
ON v.TaskAID = q.AID
WHERE p. IS NOT NULL
AND p. > 6000
AND (@ IS NULL OR v. >= @)
AND (@ IS NULL OR v. < DATEADD(DAY, 1, @))
AND (@ IS NULL OR @ = N'' OR v. LIKE N'%' + @ + N'%')
AND (@ IS NULL OR @ = N'' OR q. LIKE N'%' + @ + N'%')
AND (@ IS NULL OR @ = N'' OR CONVERT(NVARCHAR(50), q.) = @)
AND (@ IS NULL OR @ = N'' OR COALESCE(NULLIF(q., N''), v.) LIKE N'%' + @ + N'%')
ORDER BY q. DESC, q., v. DESC;
CREATE INDEX IX_基础数据_TaskStart ON #基础数据 (TaskAID, 开始时间);
CREATE TABLE #操作人拼接
(
TaskAID BIGINT NOT NULL,
VARCHAR(19) NOT NULL,
NVARCHAR(MAX) NULL,
PRIMARY KEY (TaskAID, )
);
INSERT INTO #操作人拼接 (TaskAID, 开始时间, 操作人)
SELECT
TaskAID,
,
STRING_AGG(CONVERT(NVARCHAR(MAX), ), N',') AS
FROM
(
SELECT DISTINCT
k.TaskAID,
k.,
LTRIM(RTRIM(s.value)) AS
FROM
(
SELECT DISTINCT
TaskAID,
CONVERT(VARCHAR(19), , 120) AS
FROM #基础数据
WHERE TaskAID IS NOT NULL
AND IS NOT NULL
) AS k
INNER JOIN dbo.View_生产工时视图全部 AS v2
ON v2.TaskAID = k.TaskAID
AND v2. >= CONVERT(DATETIME, k., 120)
AND v2. < DATEADD(SECOND, 1, CONVERT(DATETIME, k., 120))
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(v2., N''), N'', N','), N'', N','), N',') AS s
WHERE ISNULL(v2., 0) <= 0
AND NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY TaskAID, ;
;WITH AS
(
SELECT
ISNULL(b., b.) AS ,
ISNULL(b., b.) AS ,
b.,
b.,
b.TaskAID,
b.,
b.,
ISNULL(o., N'') AS ,
CASE
WHEN ISNULL(b., N'') LIKE N'%辅助%' OR ISNULL(b., N'') LIKE N'%辅助%' THEN N'辅助结束'
ELSE N'报工'
END AS ,
CAST(ISNULL(b., 0) / 3600.0 AS DECIMAL(18, 4)) AS ,
ISNULL(b., 0) AS
FROM #基础数据 AS b
LEFT JOIN #操作人拼接 AS o
ON o.TaskAID = b.TaskAID
AND o. = CONVERT(VARCHAR(19), b., 120)
),
AS
(
SELECT
,
,
,
,
MAX() AS ,
AS ,
COUNT(*) AS ,
SUM(CASE WHEN = N'报工' THEN ELSE 0 END) AS ,
SUM(CASE WHEN = N'辅助结束' THEN ELSE 0 END) AS ,
SUM(CASE WHEN = N'报工' THEN ELSE 0 END) AS ,
SUM(CASE WHEN = N'辅助结束' THEN ELSE 0 END) AS ,
SUM() AS
FROM
GROUP BY , , , ,
),
AS
(
SELECT
,
,
,
ISNULL(, N'') AS ,
STRING_AGG(CONVERT(NVARCHAR(MAX), ), N',') AS
FROM
(
SELECT DISTINCT
j.,
j.,
j.,
ISNULL(j., N'') AS ,
LTRIM(RTRIM(s.value)) AS
FROM AS j
CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(j., N''), N'', N','), N'', N','), N',') AS s
WHERE NULLIF(LTRIM(RTRIM(s.value)), N'') IS NOT NULL
) AS x
GROUP BY , , , ISNULL(, N'')
),
AS
(
SELECT
b.,
b.,
b.,
b.,
b.,
b.,
b.,
b.,
b.,
b.,
b.,
b.,
ISNULL(o., N'') AS
FROM AS b
LEFT JOIN AS o
ON o. = b.
AND ISNULL(o., N'') = ISNULL(b., N'')
AND o. = b.
AND o. = ISNULL(b., N'')
),
AS
(
SELECT
,
,
SUM() AS ,
SUM() AS ,
SUM() AS ,
SUM() AS ,
SUM() AS ,
SUM() AS
FROM
GROUP BY ,
)
SELECT
ISNULL((
SELECT
CONCAT(N'm-', ISNULL(m., N''), N'-', ISNULL(m., N'')) AS id,
1 AS [level],
m. AS materialCode,
m. AS materialDesc,
ISNULL(m., N'') + N' ' + ISNULL(m., N'') AS taskDescription,
CAST(N'' AS NVARCHAR(1)) AS productionOrderNo,
CAST(N'' AS NVARCHAR(1)) AS station,
CAST(m. AS DECIMAL(18, 4)) AS reportWorkHours,
CAST(m. AS DECIMAL(18, 4)) AS auxiliaryWorkHours,
m. AS reportFinishQty,
m. AS auxiliaryFinishQty,
CAST(m. AS DECIMAL(18, 4)) AS totalWorkHours,
CAST(CASE WHEN m. > 0 THEN m. / m. ELSE 0 END AS DECIMAL(18, 4)) AS clampingTime,
CAST(0 AS DECIMAL(18, 4)) AS programTime,
CAST(CASE WHEN m. > 0 THEN m. / m. ELSE 0 END AS DECIMAL(18, 4)) AS settlementReportPieceHours,
CAST(CASE WHEN m. > 0 THEN m. / m. ELSE 0 END AS DECIMAL(18, 4)) AS settlementAuxiliaryPieceHours,
m. AS recordCount,
JSON_QUERY((
SELECT
CONCAT(N'o-', ISNULL(o., N''), N'-', o., N'-', ISNULL(o., N''), N'-', ISNULL(o., 0)) AS id,
2 AS [level],
o. AS materialCode,
o. AS materialDesc,
ISNULL(o., N'') + N' ' + ISNULL(o., N'')
+ CASE WHEN NULLIF(ISNULL(o., N''), N'') IS NULL THEN N'' ELSE N' ' + o. END
+ CASE WHEN o. IS NULL THEN N'' ELSE N'' + CONVERT(VARCHAR(20), o.) END AS taskDescription,
o. AS productionOrderNo,
ISNULL(o., N'') AS station,
CAST(o. AS DECIMAL(18, 4)) AS reportWorkHours,
CAST(o. AS DECIMAL(18, 4)) AS auxiliaryWorkHours,
o. AS reportFinishQty,
o. AS auxiliaryFinishQty,
CAST(o. AS DECIMAL(18, 4)) AS totalWorkHours,
CAST(CASE WHEN o. > 0 THEN o. / o. ELSE 0 END AS DECIMAL(18, 4)) AS clampingTime,
CAST(0 AS DECIMAL(18, 4)) AS programTime,
CAST(CASE WHEN o. > 0 THEN o. / o. ELSE 0 END AS DECIMAL(18, 4)) AS settlementReportPieceHours,
CAST(CASE WHEN o. > 0 THEN o. / o. ELSE 0 END AS DECIMAL(18, 4)) AS settlementAuxiliaryPieceHours,
ISNULL(o., N'') AS operatorNames,
o. AS recordCount
FROM o
WHERE o. = m.
AND ISNULL(o., N'') = ISNULL(m., N'')
ORDER BY o., o., o.
FOR JSON PATH
)) AS children
FROM m
ORDER BY m., m.
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM() FROM ), 0) AS DECIMAL(18, 2)) AS reportWorkHours,
CAST(ISNULL((SELECT SUM() FROM ), 0) AS DECIMAL(18, 2)) AS auxiliaryWorkHours,
CAST(ISNULL((SELECT SUM() FROM ), 0) AS DECIMAL(18, 2)) AS totalWorkHours;
END
GO

View File

@@ -0,0 +1,251 @@
USE [YL_MESDB]
GO
/*
新 Timesheet 查询过程。既有 工时统计_*_查询 保持不变;
本过程捕获其平铺结果,并在数据库中完成排序、构树、作业者报工数量回算和页脚汇总。
*/
CREATE OR ALTER PROCEDURE [dbo].[_看板树形查询]
@ NVARCHAR(20),
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL
AS
BEGIN
SET NOCOUNT ON;
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
IF @ = N'project'
BEGIN
CREATE TABLE #项目平铺
(
RowID INT IDENTITY(1, 1) PRIMARY KEY,
[Level] INT, contractNo NVARCHAR(50), materialDesc NVARCHAR(50), materialCode NVARCHAR(50),
DECIMAL(19, 6), processName NVARCHAR(50), NVARCHAR(500), NVARCHAR(50),
operator NVARCHAR(50), NVARCHAR(50), qty VARCHAR(41), reportQty VARCHAR(20),
planStart VARCHAR(10), planEnd VARCHAR(10), workHours VARCHAR(20), NVARCHAR(50)
);
INSERT INTO #项目平铺
([Level], contractNo, materialDesc, materialCode, , processName, , , operator, , qty, reportQty, planStart, planEnd, workHours, )
EXEC dbo._项目工时_查询 @, @, @, @, @, @, @, @;
SELECT
ISNULL((
SELECT
CONCAT(N'p-', p.RowID) AS id, 1 AS [level], p.contractNo, p.materialDesc, p.materialCode,
p.qty, p.reportQty, p.planStart, p.planEnd, p.workHours,
JSON_QUERY((
SELECT
CONCAT(N'p-', c.RowID) AS id, 2 AS [level], c.contractNo, c.materialCode, c.processName,
c.operator, c., c.qty, c.reportQty, c.planStart, c.planEnd, c.workHours, c.,
ISNULL(NULLIF(c., N''), N'未分类') AS , c., c.
FROM #项目平铺 c
WHERE c.[Level] = 2 AND c.contractNo = p.contractNo AND c.materialCode = p.materialCode
ORDER BY NULLIF(c.planStart, N''), c.RowID
FOR JSON PATH
)) AS children
FROM #项目平铺 p
WHERE p.[Level] = 1
ORDER BY ISNULL((SELECT MIN(NULLIF(c.planStart, N'')) FROM #项目平铺 c WHERE c.[Level] = 2 AND c.contractNo = p.contractNo AND c.materialCode = p.materialCode), NULLIF(p.planStart, N'')), p.RowID
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) FROM #项目平铺 WHERE [Level] = 1), 0) AS DECIMAL(18, 1)) AS totalWorkHours,
ISNULL((
SELECT ISNULL(NULLIF(, N''), N'未分类') AS [type],
CAST(SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) AS DECIMAL(18, 1)) AS workHours
FROM #项目平铺
WHERE [Level] = 2
GROUP BY ISNULL(NULLIF(, N''), N'未分类')
ORDER BY [type]
FOR JSON PATH
), N'[]') AS workHoursTypeSummary;
RETURN;
END;
IF @ = N'task'
BEGIN
CREATE TABLE #任务平铺
(
RowID INT IDENTITY(1, 1) PRIMARY KEY,
[Level] INT, contractNo NVARCHAR(50), orderNo NVARCHAR(50), productCode NVARCHAR(50), productName NVARCHAR(50),
processName NVARCHAR(50), NVARCHAR(500), DECIMAL(19, 6), NVARCHAR(50),
operator NVARCHAR(50), NVARCHAR(50), qty VARCHAR(41), reportQty VARCHAR(20),
startTime VARCHAR(19), endTime VARCHAR(19), workHours VARCHAR(20), NVARCHAR(50)
);
INSERT INTO #任务平铺
([Level], contractNo, orderNo, productCode, productName, processName, , , , operator, , qty, reportQty, startTime, endTime, workHours, )
EXEC dbo._任务工时_查询 @, @, @, @, @, @, @, @;
SELECT
ISNULL((
SELECT
CONCAT(N't-', p.RowID) AS id, 1 AS [level], p.contractNo, p.orderNo, p.productCode, p.productName,
p.processName, p., p., ISNULL(NULLIF(p., N''), N'未分类') AS ,
p.qty, p.reportQty, p.workHours,
JSON_QUERY((
SELECT
CONCAT(N't-', c.RowID) AS id, 2 AS [level], c.contractNo, c.orderNo, c.productCode, c.processName,
c., c., ISNULL(NULLIF(c., N''), N'未分类') AS ,
c.operator, c., c.reportQty, c.startTime, c.endTime, c.workHours, c.
FROM #任务平铺 c
WHERE c.[Level] = 2 AND c.contractNo = p.contractNo AND c.orderNo = p.orderNo
AND c.productCode = p.productCode AND c.processName = p.processName
AND ISNULL(c., N'') = ISNULL(p., N'')
AND ISNULL(c., N'') = ISNULL(p., N'')
ORDER BY NULLIF(c.startTime, N''), c.RowID
FOR JSON PATH
)) AS children
FROM #任务平铺 p
WHERE p.[Level] = 1
ORDER BY ISNULL((SELECT MIN(NULLIF(c.startTime, N'')) FROM #任务平铺 c WHERE c.[Level] = 2 AND c.contractNo = p.contractNo AND c.orderNo = p.orderNo AND c.productCode = p.productCode AND c.processName = p.processName AND ISNULL(c.工时类型, N'') = ISNULL(p.工时类型, N'') AND ISNULL(c.操作类别, N'') = ISNULL(p.操作类别, N'')), NULLIF(p.startTime, N'')), p.RowID
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) FROM #任务平铺 WHERE [Level] = 1), 0) AS DECIMAL(18, 1)) AS totalWorkHours,
ISNULL((
SELECT ISNULL(NULLIF(, N''), N'未分类') AS [type], CAST(SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) AS DECIMAL(18, 1)) AS workHours
FROM #任务平铺 WHERE [Level] = 2
GROUP BY ISNULL(NULLIF(, N''), N'未分类')
ORDER BY [type]
FOR JSON PATH
), N'[]') AS workHoursTypeSummary;
RETURN;
END;
IF @ = N'operator'
BEGIN
CREATE TABLE #作业者平铺
(
RowID INT IDENTITY(1, 1) PRIMARY KEY,
[Level] INT, operator NVARCHAR(50), dateLabel VARCHAR(10), reportCount VARCHAR(20), reportQty VARCHAR(20),
contractNo NVARCHAR(50), orderNo NVARCHAR(50), productCode NVARCHAR(50), productName NVARCHAR(50),
processName NVARCHAR(50), DECIMAL(19, 6), NVARCHAR(50), NVARCHAR(50),
startTime VARCHAR(19), endTime VARCHAR(19), NVARCHAR(500), NVARCHAR(500),
NVARCHAR(50), workHours VARCHAR(20), TaskAID VARCHAR(50)
);
INSERT INTO #作业者平铺
([Level], operator, dateLabel, reportCount, reportQty, contractNo, orderNo, productCode, productName, processName, , , , startTime, endTime, , , , workHours, TaskAID)
EXEC dbo._作业者工时_查询 @, @, @, @, @, @, @, @;
SELECT d.RowID, d.operator, d.dateLabel, d.TaskAID, d.startTime,
CASE WHEN NULLIF(d.TaskAID, N'') IS NOT NULL AND NULLIF(d.startTime, N'') IS NOT NULL THEN 1 ELSE 0 END AS IsTaskStart,
CASE WHEN ISNULL(d., N'') LIKE N'%装配%' THEN CAST(0 AS DECIMAL(18, 6)) ELSE ISNULL(TRY_CONVERT(DECIMAL(18, 6), REPLACE(d.reportQty, N',', N'')), 0) END AS reportQty
INTO #作业者明细数量
FROM #作业者平铺 d
WHERE d.[Level] = 3;
SELECT operator, dateLabel, TaskAID, startTime, MAX(reportQty) AS reportQty
INTO #作业者任务开始数量
FROM #作业者明细数量
WHERE IsTaskStart = 1
GROUP BY operator, dateLabel, TaskAID, startTime;
CREATE UNIQUE CLUSTERED INDEX IX_作业者任务开始数量 ON #作业者任务开始数量(operator, dateLabel, TaskAID, startTime);
SELECT
ISNULL((
SELECT
CONCAT(N'o-', p.RowID) AS id, 1 AS [level], p.operator, p.reportCount,
CASE WHEN EXISTS (SELECT 1 FROM #作业者明细数量 d WHERE d.operator = p.operator AND d.IsTaskStart = 1)
THEN (SELECT SUM(k.reportQty) FROM #作业者任务开始数量 k WHERE k.operator = p.operator)
ELSE ISNULL(TRY_CONVERT(DECIMAL(18, 6), REPLACE(p.reportQty, N',', N'')), 0) END AS reportQty,
p.workHours,
JSON_QUERY((
SELECT
CONCAT(N'o-', d.RowID) AS id, 2 AS [level], d.operator, d.dateLabel, d.reportCount,
CASE WHEN EXISTS (SELECT 1 FROM #作业者明细数量 x WHERE x.operator = d.operator AND x.dateLabel = d.dateLabel AND x.IsTaskStart = 1)
THEN (SELECT SUM(k.reportQty) FROM #作业者任务开始数量 k WHERE k.operator = d.operator AND k.dateLabel = d.dateLabel)
ELSE ISNULL(TRY_CONVERT(DECIMAL(18, 6), REPLACE(d.reportQty, N',', N'')), 0) END AS reportQty,
d.workHours,
JSON_QUERY((
SELECT
CONCAT(N'o-', c.RowID) AS id, 3 AS [level], c.TaskAID, c.contractNo, c.orderNo, c.productCode, c.productName,
c.processName, c., c., ISNULL(NULLIF(c., N''), N'未分类') AS ,
CAST(N'' AS NVARCHAR(1)) AS , CAST(N'' AS NVARCHAR(1)) AS , c.,
ISNULL(k.reportQty, ISNULL(TRY_CONVERT(DECIMAL(18, 6), REPLACE(c.reportQty, N',', N'')), 0)) AS reportQty,
c.startTime, c.endTime, c.workHours, c., c.
FROM #作业者平铺 c
LEFT JOIN #作业者任务开始数量 k ON k.operator = c.operator AND k.dateLabel = c.dateLabel AND k.TaskAID = c.TaskAID AND k.startTime = c.startTime
WHERE c.[Level] = 3 AND c.operator = d.operator AND c.dateLabel = d.dateLabel
ORDER BY NULLIF(c.startTime, N''), c.RowID
FOR JSON PATH
)) AS children
FROM #作业者平铺 d
WHERE d.[Level] = 2 AND d.operator = p.operator
ORDER BY ISNULL((SELECT MIN(NULLIF(c.startTime, N'')) FROM #作业者平铺 c WHERE c.[Level] = 3 AND c.operator = d.operator AND c.dateLabel = d.dateLabel), NULLIF(d.dateLabel, N'')), d.RowID
FOR JSON PATH
)) AS children
FROM #作业者平铺 p
WHERE p.[Level] = 1
ORDER BY ISNULL((SELECT MIN(NULLIF(c.startTime, N'')) FROM #作业者平铺 c WHERE c.[Level] = 3 AND c.operator = p.operator), NULLIF(p.dateLabel, N'')), p.RowID
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) FROM #作业者平铺 WHERE [Level] = 1), 0) AS DECIMAL(18, 1)) AS totalWorkHours,
ISNULL((
SELECT ISNULL(NULLIF(, N''), N'未分类') AS [type], CAST(SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) AS DECIMAL(18, 1)) AS workHours
FROM #作业者平铺 WHERE [Level] = 3
GROUP BY ISNULL(NULLIF(, N''), N'未分类')
ORDER BY [type]
FOR JSON PATH
), N'[]') AS workHoursTypeSummary;
RETURN;
END;
IF @ = N'device'
BEGIN
CREATE TABLE #设备平铺
(
RowID INT IDENTITY(1, 1) PRIMARY KEY,
[Level] INT, operator NVARCHAR(50), dateLabel VARCHAR(10), reportCount VARCHAR(20), reportQty VARCHAR(20),
contractNo NVARCHAR(50), orderNo NVARCHAR(50), productCode NVARCHAR(50), productName NVARCHAR(50),
DECIMAL(19, 6), processName NVARCHAR(50), NVARCHAR(2), NVARCHAR(50),
NVARCHAR(50), startTime VARCHAR(19), endTime VARCHAR(19), workHours VARCHAR(20)
);
INSERT INTO #设备平铺
([Level], operator, dateLabel, reportCount, reportQty, contractNo, orderNo, productCode, productName, , processName, , , , startTime, endTime, workHours)
EXEC dbo._设备工时_查询 @, @, @, @, @, @, @;
SELECT
ISNULL((
SELECT
CONCAT(N'd-', p.RowID) AS id, 1 AS [level], p.operator, p.reportCount, p.reportQty, p.workHours,
JSON_QUERY((
SELECT
CONCAT(N'd-', d.RowID) AS id, 2 AS [level], d.operator, d.dateLabel, d.reportCount, d.reportQty, d.workHours,
JSON_QUERY((
SELECT
CONCAT(N'd-', c.RowID) AS id, 3 AS [level], c.contractNo, c.orderNo, c.productCode, c.productName,
c., c.processName, c., c., c., c.reportQty, c.startTime, c.endTime, c.workHours
FROM #设备平铺 c
WHERE c.[Level] = 3 AND c.operator = d.operator AND c.dateLabel = d.dateLabel
ORDER BY NULLIF(c.startTime, N''), c.RowID
FOR JSON PATH
)) AS children
FROM #设备平铺 d
WHERE d.[Level] = 2 AND d.operator = p.operator
ORDER BY ISNULL((SELECT MIN(NULLIF(c.startTime, N'')) FROM #设备平铺 c WHERE c.[Level] = 3 AND c.operator = d.operator AND c.dateLabel = d.dateLabel), NULLIF(d.dateLabel, N'')), d.RowID
FOR JSON PATH
)) AS children
FROM #设备平铺 p
WHERE p.[Level] = 1
ORDER BY ISNULL((SELECT MIN(NULLIF(c.startTime, N'')) FROM #设备平铺 c WHERE c.[Level] = 3 AND c.operator = p.operator), NULLIF(p.dateLabel, N'')), p.RowID
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM(TRY_CONVERT(DECIMAL(18, 4), workHours)) FROM #设备平铺 WHERE [Level] = 1), 0) AS DECIMAL(18, 1)) AS totalWorkHours,
N'[]' AS workHoursTypeSummary;
RETURN;
END;
THROW 50001, N'查询类型仅支持 project、operator、task、device。', 1;
END
GO

View File

@@ -0,0 +1,197 @@
USE [YL_MESDB]
GO
/* 直接将研发财务工时查询改为返回作业者树、任务树和总工时。 */
ALTER PROCEDURE [dbo].[_研发财务工时_查询]
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ nvarchar(100) = LTRIM(RTRIM(ISNULL(@, N'')));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
CREATE TABLE #明细
(
RID int NOT NULL,
DID int NOT NULL,
nvarchar(100) NOT NULL,
varchar(10) NOT NULL,
varchar(19) NULL,
nvarchar(100) NOT NULL,
nvarchar(200) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(max) NOT NULL,
varchar(19) NULL,
varchar(19) NULL,
nvarchar(100) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(100) NOT NULL,
nvarchar(max) NOT NULL,
varchar(19) NOT NULL,
varchar(19) NOT NULL,
int NOT NULL,
decimal(18, 2) NOT NULL,
nvarchar(20) NOT NULL,
nvarchar(max) NOT NULL,
nvarchar(max) NOT NULL
);
INSERT INTO #明细
SELECT
r.[RID], r.[DID], ISNULL(r.[], N''), CONVERT(varchar(10), r.[], 120),
CONVERT(varchar(19), t.[], 120), ISNULL(t.[], N''), ISNULL(t.[], N''),
ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''),
CONVERT(varchar(19), t.[], 120), CONVERT(varchar(19), t.[], 120),
ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''),
ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''),
ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''), ISNULL(t.[], N''),
CONVERT(varchar(19), r.[], 120), CONVERT(varchar(19), r.[], 120), 1,
CAST(ISNULL(r.[], 0) / 3600.0 AS decimal(18, 2)),
CASE WHEN r.[] = 1 THEN N'已校验' ELSE N'未校验' END,
ISNULL(r.[], N''), ISNULL(r.[], N'')
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 (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)
AND
(
@ = 1
OR
(
NULLIF(@, N'') IS NOT NULL
AND (LTRIM(RTRIM(ISNULL(t.[], N''))) = @ OR LTRIM(RTRIM(ISNULL(r.[], N''))) = @)
)
);
CREATE CLUSTERED INDEX IX_明细_操作人日期 ON #明细(操作人, 工作日期, 开始时间, RID);
CREATE INDEX IX_明细_DID操作人 ON #明细(DID, 操作人, 开始时间, RID);
SELECT
ISNULL((
SELECT
CONCAT(N'p-', o.) AS id, CAST(N'' AS nvarchar(1)) AS parentId, 1 AS [Level],
CAST(N'' AS nvarchar(1)) AS RID, CAST(N'' AS nvarchar(1)) AS DID, o.,
CAST(N'' AS nvarchar(1)) AS , MIN(o.) AS , MAX(o.) AS ,
COUNT(*) AS , CAST(SUM(o.) AS decimal(18, 2)) AS ,
CASE WHEN SUM(CASE WHEN o. = N'已校验' THEN 1 ELSE 0 END) = COUNT(*) THEN N'已校验'
WHEN SUM(CASE WHEN o. = N'已校验' THEN 1 ELSE 0 END) = 0 THEN N'未校验' ELSE N'部分校验' END AS ,
CAST(N'' AS nvarchar(1)) AS , CAST(N'' AS nvarchar(1)) AS ,
JSON_QUERY((
SELECT
CONCAT(N'p-', d., N'-d-', d.) AS id, CONCAT(N'p-', d.) AS parentId, 2 AS [Level],
CAST(N'' AS nvarchar(1)) AS RID, CAST(N'' AS nvarchar(1)) AS DID, d., d.,
MIN(d.) AS , MAX(d.) AS , COUNT(*) AS ,
CAST(SUM(d.) AS decimal(18, 2)) AS ,
CASE WHEN SUM(CASE WHEN d. = N'已校验' THEN 1 ELSE 0 END) = COUNT(*) THEN N'已校验'
WHEN SUM(CASE WHEN d. = N'已校验' THEN 1 ELSE 0 END) = 0 THEN N'未校验' ELSE N'部分校验' END AS ,
CAST(N'' AS nvarchar(1)) AS , CAST(N'' AS nvarchar(1)) AS ,
JSON_QUERY((
SELECT CONCAT(N'p-', r., N'-d-', r., N'-r-', r.RID) AS id,
CONCAT(N'p-', r., N'-d-', r.) AS parentId, 3 AS [Level], r.*
FROM #明细 r
WHERE r. = d. AND r. = d.
ORDER BY r., r.RID
FOR JSON PATH
)) AS children
FROM #明细 d
WHERE d. = o.
GROUP BY d., d.
ORDER BY MIN(d.), d.
FOR JSON PATH
)) AS children
FROM #明细 o
GROUP BY o.
ORDER BY MIN(o.), o.
FOR JSON PATH
), N'[]') AS operatorTreeData,
ISNULL((
SELECT
CONCAT(N't-', t.DID) AS id, CAST(N'' AS nvarchar(1)) AS parentId, 1 AS [Level],
CAST(N'' AS nvarchar(1)) AS RID, t.DID, CAST(N'' AS nvarchar(1)) AS , CAST(N'' AS nvarchar(1)) AS ,
MAX(t.) AS , MAX(t.) AS , MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS , MAX(t.) AS ,
MAX(t.) AS , MAX(t.) AS ,
MIN(t.) AS , MAX(t.) AS , COUNT(*) AS ,
CAST(SUM(t.) AS decimal(18, 2)) AS ,
CASE WHEN SUM(CASE WHEN t. = N'已校验' THEN 1 ELSE 0 END) = COUNT(*) THEN N'已校验'
WHEN SUM(CASE WHEN t. = N'已校验' THEN 1 ELSE 0 END) = 0 THEN N'未校验' ELSE N'部分校验' END AS ,
CAST(N'' AS nvarchar(1)) AS , CAST(N'' AS nvarchar(1)) AS ,
JSON_QUERY((
SELECT
CONCAT(N't-', c.DID, N'-o-', c.) AS id, CONCAT(N't-', c.DID) AS parentId, 2 AS [Level],
CAST(N'' AS nvarchar(1)) AS RID, c.DID, c., CAST(N'' AS nvarchar(1)) AS ,
MAX(c.) AS , MAX(c.) AS , MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS , MAX(c.) AS ,
MAX(c.) AS , MAX(c.) AS ,
MIN(c.) AS , MAX(c.) AS , COUNT(*) AS ,
CAST(SUM(c.) AS decimal(18, 2)) AS ,
CASE WHEN SUM(CASE WHEN c. = N'已校验' THEN 1 ELSE 0 END) = COUNT(*) THEN N'已校验'
WHEN SUM(CASE WHEN c. = N'已校验' THEN 1 ELSE 0 END) = 0 THEN N'未校验' ELSE N'部分校验' END AS ,
CAST(N'' AS nvarchar(1)) AS , CAST(N'' AS nvarchar(1)) AS ,
JSON_QUERY((
SELECT CONCAT(N't-', r.DID, N'-o-', r., N'-r-', r.RID) AS id,
CONCAT(N't-', r.DID, N'-o-', r.) AS parentId, 3 AS [Level], r.*
FROM #明细 r
WHERE r.DID = c.DID AND r. = c.
ORDER BY r., r.RID
FOR JSON PATH
)) AS children
FROM #明细 c
WHERE c.DID = t.DID
GROUP BY c.DID, c.
ORDER BY MIN(c.), c.
FOR JSON PATH
)) AS children
FROM #明细 t
GROUP BY t.DID
ORDER BY MIN(t.), t.DID
FOR JSON PATH
), N'[]') AS taskTreeData,
CONVERT(varchar(30), CAST(ISNULL((SELECT SUM() FROM #明细), 0) AS decimal(18, 2))) AS totalHours;
END
GO

View File

@@ -0,0 +1,68 @@
USE [YL_MESDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
IF OBJECT_ID(N'[dbo].[MES_设计报工_附件]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_设计报工_附件]
(
[id] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_MES_设计报工_附件] PRIMARY KEY,
[num] nvarchar(200) NOT NULL,
[uid] nvarchar(200) NULL,
[name] nvarchar(500) NULL,
[suffix] nvarchar(100) NULL,
[] int NULL,
[worker] nvarchar(200) NULL,
[uploadTime] nvarchar(200) NULL
);
END
GO
IF NOT EXISTS
(
SELECT 1
FROM sys.indexes
WHERE [object_id] = OBJECT_ID(N'[dbo].[MES_设计报工_附件]')
AND [name] = N'IX_MES_设计报工_附件_任务'
)
BEGIN
CREATE INDEX [IX_MES_设计报工_附件_任务]
ON [dbo].[MES_设计报工_附件]([num], [], [id] DESC);
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_附件_查询]
@DID int
AS
BEGIN
SET NOCOUNT ON;
SELECT
a.[id] AS [ID],
TRY_CONVERT(int, a.[num]) AS [DID],
CASE
WHEN CHARINDEX(N'__', ISNULL(a.[name], N'')) > 0
THEN SUBSTRING(a.[name], CHARINDEX(N'__', a.[name]) + 2, 500)
ELSE ISNULL(a.[name], N'')
END + CASE
WHEN NULLIF(LTRIM(RTRIM(ISNULL(a.[suffix], N''))), N'') IS NULL THEN N''
ELSE N'.' + a.[suffix]
END AS [],
ISNULL(a.[name], N'') + CASE
WHEN NULLIF(LTRIM(RTRIM(ISNULL(a.[suffix], N''))), N'') IS NULL THEN N''
ELSE N'.' + a.[suffix]
END AS [],
LOWER(ISNULL(a.[suffix], N'')) AS [],
ISNULL(a.[worker], N'') AS [],
ISNULL(a.[uploadTime], N'') AS []
FROM [dbo].[MES_设计报工_附件] AS a
WHERE TRY_CONVERT(int, a.[num]) = @DID
AND ISNULL(a.[], 1) = 1
ORDER BY a.[id] DESC;
END
GO

View File

@@ -0,0 +1,225 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_看板查询]
@ nvarchar(20)
AS
BEGIN
SET NOCOUNT ON;
IF @ NOT IN (N'大厅', N'仓库', N'装配', N'质检')
BEGIN
THROW 50001, N'看板类型必须是大厅、仓库、装配或质检', 1;
END;
;WITH AS
(
SELECT
d.[TaskAID],
STRING_AGG(CONVERT(nvarchar(max), d.[]), N',')
WITHIN GROUP (ORDER BY d.[]) AS []
FROM
(
SELECT DISTINCT
[TaskAID],
NULLIF(LTRIM(RTRIM([])), N'') AS []
FROM [dbo].[YL_加工中心_操作记录表]
WHERE [] = N'开始加工'
AND [] IS NULL
AND [] LIKE N'%装配%'
AND [] IS NOT NULL
AND NULLIF(LTRIM(RTRIM([])), N'') IS NOT NULL
) AS d
GROUP BY d.[TaskAID]
),
AS
(
SELECT
[TaskAID],
SUM(CASE WHEN [] = N'终检' THEN ISNULL([], 0) ELSE 0 END) AS [],
SUM(CASE WHEN [] = N'收检' THEN ISNULL([], 0) ELSE 0 END) AS [],
SUM(CASE WHEN [] = 6 THEN ISNULL([], 0) ELSE 0 END) AS []
FROM [dbo].[View_质量检验_质检记录]
WHERE [] IN (N'收检', N'终检')
GROUP BY [TaskAID]
),
AS
(
SELECT
gs.[],
SUM(gs.[]) AS []
FROM [dbo].[View_生产工时视图] AS gs
INNER JOIN [dbo].[_人员信息] AS ry
ON gs.[] = ry.[Personnel_Name]
WHERE ry.[] = N'装配'
GROUP BY gs.[]
),
AS
(
SELECT
CAST(N'SAP' AS nvarchar(20)) AS [],
c.[DocStatus] AS [],
CONVERT(nvarchar(200), c.[]) AS [],
CONVERT(nvarchar(500), c.[]) AS [],
CONVERT(nvarchar(4000), c.[]) AS [],
c.[],
c.[],
c.[],
a.[TaskAID],
COALESCE(a.[], c.[]) AS [],
COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[]), N''),
NULLIF(CONVERT(nvarchar(200), c.[]), N'')
) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
c.[] AS [],
a.[],
a.[],
a.[],
a.[],
op.[],
ISNULL(hours.[], 0) AS [],
ISNULL(quality.[], 0) AS [],
ISNULL(quality.[], 0) AS [],
ISNULL(quality.[], 0) AS []
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
LEFT JOIN [dbo].[View_生产订单_MES] AS a
ON c.[] = a.[]
LEFT JOIN AS op ON a.[TaskAID] = op.[TaskAID]
LEFT JOIN AS quality ON a.[TaskAID] = quality.[TaskAID]
LEFT JOIN AS hours ON a.[] = hours.[]
UNION ALL
SELECT
CAST(N'MES优先' AS nvarchar(20)) AS [],
CAST(NULL AS char(1)) AS [],
CONVERT(nvarchar(200), a.[]) AS [],
CONVERT(nvarchar(500), a.[]) AS [],
CONVERT(nvarchar(4000), a.[]) AS [],
CAST(NULL AS numeric(19, 6)) AS [],
CAST(NULL AS datetime) AS [],
CAST(NULL AS int) AS [],
a.[TaskAID],
a.[],
CONVERT(nvarchar(200), a.[]) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
op.[],
ISNULL(hours.[], 0) AS [],
ISNULL(quality.[], 0) AS [],
ISNULL(quality.[], 0) AS [],
ISNULL(quality.[], 0) AS []
FROM [dbo].[View_生产订单_MES] AS a
LEFT JOIN AS op ON a.[TaskAID] = op.[TaskAID]
LEFT JOIN AS quality ON a.[TaskAID] = quality.[TaskAID]
LEFT JOIN AS hours ON a.[] = hours.[]
WHERE a.[] = N''
AND a.[] LIKE N'%装配%'
AND NOT EXISTS
(
SELECT 1
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
WHERE c.[] = a.[]
)
),
AS
(
SELECT
source.*,
CONVERT(date, source.[]) AS [],
CASE
WHEN source.[] LIKE N'%3420-YT%'
OR source.[] LIKE N'%3420-HT%'
OR source.[] LIKE N'%3420-YF%'
THEN N'见子任务'
WHEN ISNULL(source.[], 0) = 0 THEN N'齐套'
WHEN source.[] IS NULL THEN N'派发'
WHEN ISNULL(source.[], N'') <> N'1' THEN N'发料'
WHEN ISNULL(source.[], 0) <= 1 THEN N'开工'
WHEN ISNULL(source.[], 0) < source.[] THEN N'装配'
WHEN source.[] + source.[] < source.[] THEN N'质检'
WHEN ISNULL(source.[], 0) + source.[] < source.[] THEN N'待入库'
ELSE N''
END AS []
FROM AS source
)
SELECT
[],
[],
[],
[],
[],
[],
[],
[],
[TaskAID],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[]
FROM
WHERE
(@ = N'仓库' AND [] = N'SAP')
OR
(
@ = N'大厅'
AND
(
[TaskAID] IS NULL
OR [] IS NULL
OR [] + [] <> []
)
)
OR
(
@ = N'质检'
AND [] < ISNULL([], 0)
)
OR
(
@ = N'装配'
AND ISNULL([], 0) < ISNULL([], 0)
)
ORDER BY
CASE WHEN [] IS NULL THEN 1 ELSE 0 END,
[],
[],
[],
[];
END;
GO

View File

@@ -0,0 +1,117 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_零件工序_生产工艺_批量生成生产工艺]
@ NVARCHAR(MAX),
@ NVARCHAR(MAX),
@ NVARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT ON;
DECLARE @ TABLE
(
int NOT NULL PRIMARY KEY,
nvarchar(100) NOT NULL
);
DECLARE @ TABLE
(
int NOT NULL PRIMARY KEY,
nvarchar(100) NOT NULL
);
DECLARE @ TABLE
(
int NOT NULL PRIMARY KEY,
decimal(16, 2) NULL
);
DECLARE @ TABLE
(
int NOT NULL PRIMARY KEY,
nvarchar(100) NOT NULL,
nvarchar(100) NOT NULL,
decimal(16, 2) NOT NULL
);
IF NULLIF(LTRIM(RTRIM(@)), N'') IS NULL
OR NULLIF(LTRIM(RTRIM(@)), N'') IS NULL
OR NULLIF(LTRIM(RTRIM(@)), N'') IS NULL
THROW 51301, N'零件图号、订单编号和计划数量均不能为空。', 1;
INSERT INTO @ (, )
SELECT CONVERT(int, [key]), LTRIM(RTRIM([value]))
FROM OPENJSON(N'["' + REPLACE(STRING_ESCAPE(@, 'json'), N',', N'","') + N'"]');
INSERT INTO @ (, )
SELECT CONVERT(int, [key]), LTRIM(RTRIM([value]))
FROM OPENJSON(N'["' + REPLACE(STRING_ESCAPE(@, 'json'), N',', N'","') + N'"]');
INSERT INTO @ (, )
SELECT CONVERT(int, [key]), TRY_CONVERT(decimal(16, 2), LTRIM(RTRIM([value])))
FROM OPENJSON(N'["' + REPLACE(STRING_ESCAPE(@, 'json'), N',', N'","') + N'"]');
IF EXISTS (SELECT 1 FROM @ WHERE = N'')
OR EXISTS (SELECT 1 FROM @ WHERE = N'')
OR EXISTS (SELECT 1 FROM @ WHERE IS NULL)
THROW 51302, N'批量参数中包含空值或无效计划数量。', 1;
IF (SELECT COUNT(*) FROM @) <> (SELECT COUNT(*) FROM @)
OR (SELECT COUNT(*) FROM @) <> (SELECT COUNT(*) FROM @)
THROW 51303, N'订单编号、零件图号和计划数量的数量必须一致。', 1;
IF EXISTS (SELECT 1 FROM @ GROUP BY HAVING COUNT(*) > 1)
THROW 51304, N'批量订单编号不能重复。', 1;
INSERT INTO @ (, , , )
SELECT o., o., p., q.
FROM @ AS o
INNER JOIN @ AS p ON p. = o.
INNER JOIN @ AS q ON q. = o.;
BEGIN TRANSACTION;
BEGIN TRY
INSERT INTO [dbo].[_零件生产工艺_工艺库]
(
[], [], [], [], [],
[], [], [], [], [], [],
[], [], [], []
)
SELECT
m., src.[], src.[], src.[], src.[],
src.[], src.[], src.[], src.[], src.[], src.[],
src.[], m., m., 1
FROM @ AS m
INNER JOIN [dbo].[_零件工序_工艺库] AS src
ON src.[] = m.
WHERE NOT EXISTS
(
SELECT 1
FROM [dbo].[_零件生产工艺_工艺库] AS existingProcess
WHERE existingProcess.[] = m.
);
UPDATE productionPlan
SET [] = CASE
WHEN EXISTS
(
SELECT 1
FROM [dbo].[_零件生产工艺_工艺库] AS orderProcess
WHERE orderProcess.[] = productionPlan.[]
) THEN 1
ELSE 0
END
FROM [dbo].[MES_接口_生产计划] AS productionPlan
INNER JOIN @ AS m ON m. = CONVERT(nvarchar(100), productionPlan.[]);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
END;
GO

View File

@@ -0,0 +1,260 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_发货状态查询]
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ datetime = NULL,
@ nvarchar(20) = N'',
@ nvarchar(20) = N''
AS
BEGIN
SET NOCOUNT ON;
SELECT
d.[TaskAID],
STRING_AGG(CONVERT(nvarchar(max), d.[]), N',')
WITHIN GROUP (ORDER BY d.[]) AS []
INTO #当前加工操作人汇总
FROM
(
SELECT DISTINCT
[TaskAID],
NULLIF(LTRIM(RTRIM([])), N'') AS []
FROM [dbo].[YL_加工中心_操作记录表]
WHERE [] = N'开始加工'
AND [] IS NULL
AND [] LIKE N'%装配%'
AND [] IS NOT NULL
AND NULLIF(LTRIM(RTRIM([])), N'') IS NOT NULL
) AS d
GROUP BY d.[TaskAID];
CREATE UNIQUE CLUSTERED INDEX [IX_当前加工操作人汇总_TaskAID]
ON #当前加工操作人汇总 ([TaskAID]);
SELECT
[TaskAID],
SUM(CASE WHEN [] = N'终检' THEN ISNULL([], 0) ELSE 0 END) AS [],
SUM(CASE WHEN [] = N'收检' THEN ISNULL([], 0) ELSE 0 END) AS []
INTO #质检汇总
FROM [dbo].[View_质量检验_质检记录]
WHERE [] IN (N'收检', N'终检')
GROUP BY [TaskAID];
CREATE UNIQUE CLUSTERED INDEX [IX_质检汇总_TaskAID]
ON #质检汇总 ([TaskAID]);
SELECT
gs.[],
SUM(gs.[]) AS []
INTO #合同装配工时汇总
FROM [dbo].[View_生产工时视图] AS gs
INNER JOIN [dbo].[_人员信息] AS ry ON gs.[] = ry.[Personnel_Name]
WHERE ry.[] = N'装配'
GROUP BY gs.[];
CREATE INDEX [IX_合同装配工时汇总_合同号]
ON #合同装配工时汇总 ([合同号]);
;WITH AS
(
SELECT
c.[DocStatus] AS [],
c.[],
c.[],
CONVERT(nvarchar(4000), c.[]) AS [],
c.[],
c.[],
c.[],
a.[TaskAID],
COALESCE(a.[], c.[]) AS [],
COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[]), N''),
NULLIF(CONVERT(nvarchar(200), c.[]), N'')
) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
CONVERT(date, a.[]) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
c.[] AS [],
a.[],
a.[],
a.[],
b.[],
ISNULL(h.[], 0) AS [],
ISNULL(q.[], 0) AS []
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
LEFT JOIN [YL_MESDB].[dbo].[View_生产订单_MES] AS a ON c.[] = a.[]
LEFT JOIN #当前加工操作人汇总 AS b ON a.[TaskAID] = b.[TaskAID]
LEFT JOIN #质检汇总 AS q ON a.[TaskAID] = q.[TaskAID]
LEFT JOIN #合同装配工时汇总 AS h ON a.[合同号] = h.[合同号]
WHERE
(
a.[TaskAID] IS NULL
OR a.[] IS NULL
OR ISNULL(q.[], 0) + ISNULL(q.[], 0) <> a.[]
OR ISNULL(q.[], 0) <> ISNULL(a.[], 0)
)
AND (@ = N'0' OR CONVERT(nvarchar(100), c.[]) LIKE N'%' + @ + N'%')
AND
(
@ = N'0'
OR COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[]), N''),
NULLIF(CONVERT(nvarchar(200), c.[]), N'')
) LIKE N'%' + @ + N'%'
)
AND
(
@ = N'0'
OR ISNULL(CONVERT(nvarchar(4000), c.[]), N'') LIKE N'%' + @ + N'%'
)
AND (@ = N'0' OR ISNULL(c.[], N'') LIKE N'%' + @ + N'%')
AND (@ IS NULL OR CONVERT(date, c.[]) = CONVERT(date, @))
AND
(
ISNULL(@, N'') = N''
OR (@ = N'' AND ISNULL(a.[], 0) = 1)
OR (@ = N'' AND ISNULL(a.[], 0) <> 1)
)
AND
(
ISNULL(@, N'') = N''
OR (@ = N'发料齐套' AND (a.[] = N'发料齐套' OR ISNULL(a.[], N'') = N'1'))
OR (@ = N'发料缺件' AND (a.[] = N'发料缺件' OR ISNULL(a.[], N'') = N'2'))
OR
(
@ = N'未发料'
AND ISNULL(a.[], N'') NOT IN (N'1', N'2', N'发料齐套', N'发料缺件')
)
)
UNION ALL
SELECT
CAST(NULL AS char(1)) AS [],
a.[] AS [],
a.[],
CONVERT(nvarchar(4000), a.[]) AS [],
CAST(NULL AS numeric(19, 6)) AS [],
CAST(NULL AS datetime) AS [],
CAST(NULL AS int) AS [],
a.[TaskAID],
a.[],
CONVERT(nvarchar(200), a.[]) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
CONVERT(date, a.[]) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
b.[],
ISNULL(h.[], 0) AS [],
ISNULL(q.[], 0) AS []
FROM [YL_MESDB].[dbo].[View_生产订单_MES] AS a
LEFT JOIN #当前加工操作人汇总 AS b ON a.[TaskAID] = b.[TaskAID]
LEFT JOIN #质检汇总 AS q ON a.[TaskAID] = q.[TaskAID]
LEFT JOIN #合同装配工时汇总 AS h ON a.[合同号] = h.[合同号]
WHERE
a.[] = N''
AND a.[] LIKE N'%装配%'
AND
(
a.[] IS NULL
OR ISNULL(q.[], 0) + ISNULL(q.[], 0) <> a.[]
OR ISNULL(q.[], 0) <> ISNULL(a.[], 0)
)
AND NOT EXISTS
(
SELECT 1
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
WHERE c.[] = a.[]
)
AND (@ = N'0' OR CONVERT(nvarchar(100), a.[]) LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(CONVERT(nvarchar(200), a.[]), N'') LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(a.[], N'') LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(a.[], N'') LIKE N'%' + @ + N'%')
AND (@ IS NULL OR CONVERT(date, a.[]) = CONVERT(date, @))
AND
(
ISNULL(@, N'') = N''
OR (@ = N'' AND ISNULL(a.[], 0) = 1)
OR (@ = N'' AND ISNULL(a.[], 0) <> 1)
)
AND
(
ISNULL(@, N'') = N''
OR (@ = N'发料齐套' AND (a.[] = N'发料齐套' OR ISNULL(a.[], N'') = N'1'))
OR (@ = N'发料缺件' AND (a.[] = N'发料缺件' OR ISNULL(a.[], N'') = N'2'))
OR
(
@ = N'未发料'
AND ISNULL(a.[], N'') NOT IN (N'1', N'2', N'发料齐套', N'发料缺件')
)
)
)
SELECT *
FROM
ORDER BY
CASE WHEN [] IS NULL THEN 1 ELSE 0 END,
[],
[],
[],
[];
END
GO

View File

@@ -0,0 +1,209 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_发货状态查询]
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ nvarchar(4000) = N'0',
@ datetime = NULL,
@ nvarchar(20) = N'',
@ nvarchar(20) = N''
AS
BEGIN
SET NOCOUNT ON;
;WITH AS
(
SELECT DISTINCT
[TaskAID],
NULLIF(LTRIM(RTRIM([])), N'') AS []
FROM [dbo].[YL_加工中心_操作记录表]
WHERE NULLIF(LTRIM(RTRIM([])), N'') IS NOT NULL
),
AS
(
SELECT
[TaskAID],
STRING_AGG(CONVERT(nvarchar(max), []), N',')
WITHIN GROUP (ORDER BY []) AS []
FROM
GROUP BY [TaskAID]
),
AS
(
SELECT
[TaskAID],
SUM(ISNULL([], 0)) AS []
FROM [dbo].[View_质量检验_质检记录]
GROUP BY [TaskAID]
),
AS
(
SELECT
gs.[],
SUM(gs.[]) AS []
FROM [dbo].[View_生产工时视图] AS gs
INNER JOIN [dbo].[_人员信息] AS ry ON gs.[] = ry.[Personnel_Name]
WHERE ry.[] = N'装配'
GROUP BY gs.[]
)
SELECT
c.[DocStatus] AS [],
c.[],
c.[],
CONVERT(nvarchar(4000), c.[]) AS [],
c.[],
c.[],
c.[],
a.[TaskAID],
COALESCE(a.[], c.[]) AS [],
COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[]), N''),
NULLIF(CONVERT(nvarchar(200), c.[]), N'')
) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
c.[] AS [],
a.[],
a.[],
a.[],
b.[],
ISNULL(h.[], 0) AS [],
ISNULL(q.[], 0) AS []
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
LEFT JOIN [YL_MESDB].[dbo].[View_生产订单_MES] AS a ON c.[] = a.[]
LEFT JOIN AS b ON a.[TaskAID] = b.[TaskAID]
LEFT JOIN AS q ON a.[TaskAID] = q.[TaskAID]
LEFT JOIN AS h ON a.[] = h.[]
WHERE
(@ = N'0' OR CONVERT(nvarchar(100), c.[]) LIKE N'%' + @ + N'%')
AND
(
@ = N'0'
OR COALESCE(
NULLIF(CONVERT(nvarchar(200), a.[]), N''),
NULLIF(CONVERT(nvarchar(200), c.[]), N'')
) LIKE N'%' + @ + N'%'
)
AND
(
@ = N'0'
OR ISNULL(CONVERT(nvarchar(4000), c.[]), N'') LIKE N'%' + @ + N'%'
)
AND (@ = N'0' OR ISNULL(c.[], N'') LIKE N'%' + @ + N'%')
AND (@ IS NULL OR CONVERT(date, c.[]) = CONVERT(date, @))
AND
(
ISNULL(@, N'') = N''
OR a.[TaskAID] IS NULL
OR (@ = N'' AND ISNULL(a.[], 0) = 1)
OR (@ = N'' AND ISNULL(a.[], 0) <> 1)
)
AND
(
ISNULL(@, N'') = N''
OR a.[TaskAID] IS NULL
OR (@ = N'发料齐套' AND (a.[] = N'发料齐套' OR ISNULL(a.[], N'') = N'1'))
OR (@ = N'发料缺件' AND (a.[] = N'发料缺件' OR ISNULL(a.[], N'') = N'2'))
OR
(
@ = N'未发料'
AND ISNULL(a.[], N'') NOT IN (N'1', N'2', N'发料齐套', N'发料缺件')
)
)
UNION ALL
SELECT
CAST(NULL AS char(1)) AS [],
a.[] AS [],
a.[],
CONVERT(nvarchar(4000), a.[]) AS [],
CAST(NULL AS numeric(19, 6)) AS [],
CAST(NULL AS datetime) AS [],
CAST(NULL AS int) AS [],
a.[TaskAID],
a.[],
CONVERT(nvarchar(200), a.[]) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
b.[],
ISNULL(h.[], 0) AS [],
ISNULL(q.[], 0) AS []
FROM [YL_MESDB].[dbo].[View_生产订单_MES] AS a
LEFT JOIN AS b ON a.[TaskAID] = b.[TaskAID]
LEFT JOIN AS q ON a.[TaskAID] = q.[TaskAID]
LEFT JOIN AS h ON a.[] = h.[]
WHERE
a.[] = N''
AND a.[] LIKE N'%装配%'
AND NOT EXISTS
(
SELECT 1
FROM [SAP].[SBO_YL].[dbo].[UBT_ODRF_ODLNMES] AS c
WHERE c.[] = a.[]
)
AND (@ = N'0' OR CONVERT(nvarchar(100), a.[]) LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(CONVERT(nvarchar(200), a.[]), N'') LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(a.[], N'') LIKE N'%' + @ + N'%')
AND (@ = N'0' OR ISNULL(a.[], N'') LIKE N'%' + @ + N'%')
AND (@ IS NULL OR CONVERT(date, a.[]) = CONVERT(date, @))
ORDER BY [], [], [];
END
GO

View File

@@ -0,0 +1,103 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @ProcedureName sysname;
DECLARE @Definition nvarchar(max);
DECLARE @CreatePosition int;
DECLARE @AssemblySelect nvarchar(200) = N'SELECT gs.合同号, SUM(gs.总时长) as 合同装配工时';
DECLARE @QualitySelect nvarchar(200) = N'SELECT gs.合同号, SUM(gs.总时长) as 合同质检工时';
DECLARE @GroupBy nvarchar(100) = N'GROUP BY gs.合同号';
DECLARE ProcedureCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT [name]
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
OPEN ProcedureCursor;
FETCH NEXT FROM ProcedureCursor INTO @ProcedureName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Definition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.' + QUOTENAME(@ProcedureName)));
IF @Definition IS NULL
THROW 51000, N'未找到待修改的存储过程。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @AssemblySelect, N''))) / LEN(@AssemblySelect) <> 1
THROW 51001, N'合同装配工时汇总代码与预期不一致,已停止部署。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @QualitySelect, N''))) / LEN(@QualitySelect) <> 1
THROW 51002, N'合同质检工时汇总代码与预期不一致,已停止部署。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @GroupBy, N''))) / LEN(@GroupBy) <> 2
THROW 51003, N'合同工时分组代码与预期不一致,已停止部署。', 1;
SET @Definition = REPLACE(
@Definition,
@AssemblySelect,
N'SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同装配工时'
);
SET @Definition = REPLACE(
@Definition,
@QualitySelect,
N'SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同质检工时'
);
SET @Definition = REPLACE(@Definition, @GroupBy, N'GROUP BY gs.订单合同号');
SET @CreatePosition = CHARINDEX(N'CREATE PROCEDURE', @Definition);
IF @CreatePosition = 0
THROW 51004, N'存储过程定义中未找到 CREATE PROCEDURE。', 1;
SET @Definition = STUFF(
@Definition,
@CreatePosition,
LEN(N'CREATE PROCEDURE'),
N'ALTER PROCEDURE'
);
EXEC sys.sp_executesql @Definition;
FETCH NEXT FROM ProcedureCursor INTO @ProcedureName;
END;
CLOSE ProcedureCursor;
DEALLOCATE ProcedureCursor;
IF EXISTS
(
SELECT 1
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
AND
(
OBJECT_DEFINITION([object_id]) NOT LIKE N'%SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同装配工时%'
OR OBJECT_DEFINITION([object_id]) NOT LIKE N'%SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同质检工时%'
OR OBJECT_DEFINITION([object_id]) LIKE N'%GROUP BY gs.合同号%'
)
)
THROW 51005, N'存储过程修改后校验失败。', 1;
COMMIT TRANSACTION;
SELECT [name], [modify_date]
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
END TRY
BEGIN CATCH
IF CURSOR_STATUS('local', 'ProcedureCursor') >= 0
CLOSE ProcedureCursor;
IF CURSOR_STATUS('local', 'ProcedureCursor') > -3
DEALLOCATE ProcedureCursor;
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,116 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
CREATE OR ALTER PROCEDURE [dbo].[_外协报表_导出]
@ int = 0,
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(50) = '',
@ nvarchar(100) = '',
@ int = 0
AS
BEGIN
SET NOCOUNT ON;
;WITH AS
(
SELECT
d.,
d.,
d.,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MIN(d.) AS ,
MIN(d.) AS ,
CONVERT(char(10), MAX(d.), 23) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(CASE WHEN ISNULL(d., 0) > 0 THEN 1 ELSE 0 END) AS ,
MAX(d.) AS ,
MAX(d._报工) AS _报工,
MAX(CAST(d. AS nvarchar(max))) AS ,
CONVERT(char(10), MAX(d.), 23) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(d.) AS ,
MAX(CASE WHEN d. = 1 OR ISNULL(d., 0) > 0 THEN 1 ELSE 0 END) AS ,
STUFF((
SELECT ',' + d2.
FROM [dbo].[View_外协报表视图] AS d2
WHERE d2. = d.
AND d2. = d.
ORDER BY d2.
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, '') AS ,
STUFF((
SELECT ',' + CAST(d2.TaskAID AS varchar(10))
FROM [dbo].[View_外协报表视图] AS d2
WHERE d2. = d.
AND d2. = d.
ORDER BY d2.
FOR XML PATH(''), TYPE
).value('.', 'nvarchar(max)'), 1, 1, '') AS TaskAID
FROM [dbo].[View_外协报表视图] AS d
WHERE ISNULL(d., '') <> ''
AND (@ = 0 OR d. = @)
AND (@ = '' OR d. = @)
AND (@ = '' OR d. LIKE '%' + @ + '%')
AND (@ = '' OR d. LIKE '%' + @ + '%')
AND (@ = '' OR d. LIKE '%' + @ + '%')
AND (@ = '' OR d. LIKE '%' + @ + '%')
GROUP BY d., d., d.
HAVING @ = 0
OR MAX(CASE WHEN ISNULL(d._报工, 0) < ISNULL(d., 0) THEN 1 ELSE 0 END) = 1
)
SELECT
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
,
_报工,
,
,
,
TaskAID,
,
,
CASE WHEN = 1 THEN N'可执行' ELSE N'不可执行' END AS ,
,
FROM
ORDER BY , ;
END;
GO

View File

@@ -0,0 +1,469 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
GO
DECLARE @Name sysname;
DECLARE @BackupName sysname;
DECLARE @Definition nvarchar(max);
DECLARE @HeaderPosition int;
DECLARE @HeaderLength int;
IF OBJECT_ID(N'dbo.计划排产_系统类任务查询_优化前_20260725', N'P') IS NOT NULL
THROW 51200, N'系统类优化前备份过程已存在,停止重复部署。', 1;
IF OBJECT_ID(N'dbo.计划排产_阀类任务查询_优化前_20260725', N'P') IS NOT NULL
THROW 51201, N'阀类优化前备份过程已存在,停止重复部署。', 1;
DECLARE BackupCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT [name], [name] + N'_优化前_20260725'
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
OPEN BackupCursor;
FETCH NEXT FROM BackupCursor INTO @Name, @BackupName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Definition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.' + QUOTENAME(@Name)));
IF @Definition IS NULL
THROW 51202, N'未找到待优化过程定义。', 1;
SET @Definition = REPLACE(
@Definition,
N'[dbo].[' + @Name + N']',
N'[dbo].[' + @BackupName + N']'
);
SET @HeaderPosition = CHARINDEX(N'ALTER PROCEDURE', @Definition);
SET @HeaderLength = LEN(N'ALTER PROCEDURE');
IF @HeaderPosition = 0
BEGIN
SET @HeaderPosition = CHARINDEX(N'CREATE PROCEDURE', @Definition);
SET @HeaderLength = LEN(N'CREATE PROCEDURE');
END;
IF @HeaderPosition = 0
THROW 51203, N'未识别过程定义头。', 1;
SET @Definition = STUFF(
@Definition,
@HeaderPosition,
@HeaderLength,
N'CREATE PROCEDURE'
);
EXEC sys.sp_executesql @Definition;
FETCH NEXT FROM BackupCursor INTO @Name, @BackupName;
END;
CLOSE BackupCursor;
DEALLOCATE BackupCursor;
GO
CREATE OR ALTER PROCEDURE [dbo].[_装配任务查询_核心]
@ nvarchar(10),
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'不含'
AS
BEGIN
SET NOCOUNT ON;
-- 原过程只有“自制件”分支会生成查询,保持该行为不变。
IF @ <> N'自制件'
RETURN;
DECLARE @ datetime = CASE WHEN @1 = N'' THEN NULL ELSE CONVERT(datetime, @1) END;
DECLARE @ datetime = CASE WHEN @2 = N'' THEN NULL ELSE CONVERT(datetime, @2) END;
DECLARE @ datetime = CASE WHEN @ = N'' THEN NULL ELSE CONVERT(datetime, @) END;
DECLARE @ datetime = CASE WHEN @ = N'' THEN NULL ELSE CONVERT(datetime, @) END;
SELECT v.*
INTO #任务
FROM dbo.View_生产订单_MES AS v
WHERE v.[] = N'pit_Resource'
AND v.[] LIKE N'%装配%'
AND
(
(@ = N'系统' AND v.[] LIKE N'%系统%')
OR (@ = N'阀类' AND v.[] NOT LIKE N'%系统%')
)
AND ISNULL(v.[], 0) < 4
AND (@ = 0 OR v.[] = @)
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND (@ = N'' OR v.[] LIKE N'%' + @ + N'%')
AND
(
@ <> N'不含'
OR
(
v.[] NOT LIKE N'%软管总成%'
AND v.[] NOT LIKE N'%发货部件%'
)
)
AND (@ = N'' OR v.[] = @)
AND (@ IS NULL OR v.[] >= @)
AND (@ IS NULL OR v.[] <= @)
AND (@ IS NULL OR v.[] >= @)
AND (@ IS NULL OR v.[] <= @)
AND
(
@ = N'全部'
OR (@ = N'未完成' AND ISNULL(v.[], 0) = 0)
OR (@ = N'已完成' AND v.[] = 1)
)
AND v.[] <> N''
AND
(
@ = N'全部'
OR EXISTS
(
SELECT 1
FROM STRING_SPLIT(@, N',') AS ss
WHERE ss.[value] = v.[]
)
)
OPTION (RECOMPILE);
CREATE CLUSTERED INDEX [CX_任务_订单]
ON #任务 ([订单编号], [订单行号], [订单拆分内码]);
CREATE NONCLUSTERED INDEX [IX_任务_合同物料]
ON #任务 ([合同号], [物料编号]);
SELECT DISTINCT []
INTO #订单
FROM #任务;
CREATE UNIQUE CLUSTERED INDEX [CX_订单] ON #订单 ([订单编号]);
SELECT DISTINCT []
INTO #合同
FROM #任务
WHERE [] IS NOT NULL;
CREATE UNIQUE CLUSTERED INDEX [CX_合同] ON #合同 ([合同号]);
-- 原过程对同一复杂工时视图扫描四次;改为一次扫描后再按订单和合同汇总。
SELECT
TRY_CONVERT(int, gs.[]) AS [],
gs.[] AS [],
SUM(CASE WHEN ry.[] IN (N'装配', N'电气') THEN gs.[] ELSE 0 END) AS [],
SUM(CASE WHEN ry.[] = N'质检' THEN gs.[] ELSE 0 END) AS [],
MAX(CASE WHEN ry.[] IN (N'装配', N'电气') THEN gs.[] END) AS [],
MAX(CASE WHEN ry.[] = N'质检' THEN gs.[] END) AS []
INTO #工时粒度
FROM dbo.View_生产工时视图 AS gs
INNER JOIN dbo.[_人员信息] AS ry
ON gs.[] = ry.[Personnel_Name]
WHERE ry.[] IN (N'装配', N'电气', N'质检')
AND
(
EXISTS
(
SELECT 1
FROM #订单 AS od
WHERE od.[] = TRY_CONVERT(int, gs.[])
)
OR EXISTS
(
SELECT 1
FROM #合同 AS ht
WHERE ht.[] = gs.[]
)
)
GROUP BY TRY_CONVERT(int, gs.[]), gs.[]
OPTION (RECOMPILE);
SELECT
[],
SUM([]) AS [],
SUM([]) AS [],
MAX([]) AS [],
MAX([]) AS []
INTO #任务工时
FROM #工时粒度
WHERE [] IS NOT NULL
GROUP BY [];
CREATE UNIQUE CLUSTERED INDEX [CX_任务工时] ON #任务工时 ([订单号]);
SELECT
[],
SUM([]) AS [],
SUM([]) AS []
INTO #合同工时
FROM #工时粒度
WHERE [] IS NOT NULL
GROUP BY [];
CREATE UNIQUE CLUSTERED INDEX [CX_合同工时] ON #合同工时 ([合同号]);
SELECT
lc.[] AS [],
STRING_AGG(CONVERT(nvarchar(max), lc.[]), N',')
WITHIN GROUP (ORDER BY lc.[ID]) AS []
INTO #流程
FROM dbo.[] AS lc
INNER JOIN #订单 AS od
ON od.[] = lc.[]
GROUP BY lc.[];
SELECT DISTINCT
pt.[],
CASE WHEN ry.[] = N'质检' THEN N'质检' ELSE N'装配' END AS [],
t.[],
t.[]
INTO #进行中明细
FROM dbo.[YL_加工中心_操作记录表] AS t
INNER JOIN dbo.[MES_接口_生产计划_生产任务] AS pt
ON t.[TaskAID] = pt.[AID]
INNER JOIN #订单 AS od
ON od.[] = pt.[]
INNER JOIN dbo.[_人员信息] AS ry
ON t.[] = ry.[Personnel_Name]
WHERE t.[] = N'开始加工'
AND t.[] IS NULL
AND t.[] IS NOT NULL
AND ry.[] IN (N'装配', N'电气', N'质检');
SELECT
[],
[],
STRING_AGG(
CONVERT(nvarchar(max), [] + N': ' + CONVERT(varchar(19), [], 120)),
N','
) WITHIN GROUP (ORDER BY [] DESC) AS []
INTO #进行中聚合
FROM #进行中明细
GROUP BY [], [];
SELECT
[],
MAX(CASE WHEN [] = N'装配' THEN [] END) AS [],
MAX(CASE WHEN [] = N'质检' THEN [] END) AS []
INTO #进行中
FROM #进行中聚合
GROUP BY [];
SELECT DISTINCT q.[]
INTO #终检
FROM dbo.[YL_质量检验_质检记录] AS q
INNER JOIN #订单 AS od
ON od.[] = q.[]
WHERE q.[] = N'终检';
CREATE UNIQUE CLUSTERED INDEX [CX_终检] ON #终检 ([计划号]);
SELECT DISTINCT [], []
INTO #交货键
FROM #任务
WHERE [] IS NOT NULL
AND [] IS NOT NULL;
SELECT
k.[],
k.[],
MIN(s.[]) AS []
INTO #交货
FROM #交货键 AS k
LEFT JOIN [SAP].[SBO_YL].[dbo].[UBT_MES_ORDROPEN2] AS s
ON s.[] = k.[]
AND s.[] = k.[]
GROUP BY k.[], k.[];
CREATE UNIQUE CLUSTERED INDEX [CX_交货] ON #交货 ([合同号], [物料编号]);
IF @ = N'系统'
BEGIN
SELECT
v.[], ISNULL(v.[], 0) AS [], ISNULL(v.[], 0) AS [],
v.[TaskAID], v.[], v.[] AS [], v.[], v.[] AS [],
v.[] AS [], v.[] AS [],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[] AS [], v.[], v.[], v.[], v.[],
v.[], v.[], v.[], v.[], v.[], v.[],
CASE WHEN v.[] = 1 THEN N'加急' ELSE N'' END AS [], v.[],
ISNULL(v.[], 0) AS [], v.[], v.[], v.[],
v.[], v.[],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[], v.[], v.[], v.[], v.[], v.[],
v.[], v.[], v.[], v.[], v.[],
jh.[] AS [],
CASE WHEN zj.[] IS NOT NULL THEN N'' ELSE N'' END AS [],
ISNULL(g.[], 0) AS [], v.[],
ISNULL(v.[], DATEADD(DAY, 3, v.[])) AS [],
ISNULL(v.[], jh.[]) AS [],
CASE
WHEN ISNULL(v.[], 0) = 1 THEN N'发料齐套'
WHEN ISNULL(v.[], 0) = 2 THEN N'发料缺件'
WHEN ISNULL(v.[], 0) = 0 THEN N'未发料'
END AS [],
ISNULL(zp.[], 0) AS [],
ISNULL(zp.[], 0) AS [],
ISNULL(ht.[], 0) AS [],
ISNULL(ht.[], 0) AS [],
ISNULL(zp.[], N'') AS [],
ISNULL(zp.[], N'') AS [],
ISNULL(lc.[], N'') AS [],
ISNULL(jxz.[], N'') AS [],
ISNULL(jxz.[], N'') AS []
FROM #任务 AS v
LEFT JOIN #终检 AS zj ON v.[订单编号] = zj.[计划号]
LEFT JOIN dbo.[_零件生产工艺_工艺库] AS g
ON v.[] = g.[] AND v.[] = g.[]
LEFT JOIN #任务工时 AS zp ON v.[订单编号] = zp.[订单号]
LEFT JOIN #合同工时 AS ht ON v.[合同号] = ht.[合同号]
LEFT JOIN #交货 AS jh ON v.[合同号] = jh.[合同号] AND v.[物料编号] = jh.[物料编号]
LEFT JOIN #流程 AS lc ON v.[订单编号] = lc.[订单编号]
LEFT JOIN #进行中 AS jxz ON v.[订单编号] = jxz.[订单编号]
ORDER BY
CASE WHEN v.[] IS NULL THEN 1 ELSE 0 END,
v.[], v.[];
END
ELSE
BEGIN
SELECT
v.[], ISNULL(v.[], 0) AS [], ISNULL(v.[], 0) AS [],
v.[TaskAID], v.[], v.[] AS [], v.[], v.[] AS [],
v.[] AS [], v.[] AS [],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[] AS [], v.[], v.[], v.[], v.[],
v.[], v.[], v.[], v.[], v.[], v.[],
CASE WHEN v.[] = 1 THEN N'加急' ELSE N'' END AS [], v.[],
ISNULL(v.[], 0) AS [], v.[], v.[], v.[],
v.[], v.[],
TRIM('.' FROM TRIM('0' FROM CAST(v.[] AS varchar(30)))) AS [],
v.[], v.[], v.[], v.[], v.[], v.[],
v.[], v.[], v.[], v.[], v.[],
jh.[] AS [],
CASE WHEN zj.[] IS NOT NULL THEN N'' ELSE N'' END AS [],
ISNULL(g.[], 0) AS [],
ISNULL(v.[], DATEADD(DAY, 3, v.[])) AS [],
ISNULL(v.[], jh.[]) AS [],
ISNULL(zp.[], 0) AS [],
ISNULL(zp.[], 0) AS [],
ISNULL(ht.[], 0) AS [],
ISNULL(ht.[], 0) AS [],
ISNULL(zp.[], N'') AS [],
ISNULL(zp.[], N'') AS [],
ISNULL(lc.[], N'') AS [],
ISNULL(jxz.[], N'') AS [],
ISNULL(jxz.[], N'') AS []
FROM #任务 AS v
LEFT JOIN #终检 AS zj ON v.[订单编号] = zj.[计划号]
LEFT JOIN dbo.[_零件生产工艺_工艺库] AS g
ON v.[] = g.[] AND v.[] = g.[]
LEFT JOIN #任务工时 AS zp ON v.[订单编号] = zp.[订单号]
LEFT JOIN #合同工时 AS ht ON v.[合同号] = ht.[合同号]
LEFT JOIN #交货 AS jh ON v.[合同号] = jh.[合同号] AND v.[物料编号] = jh.[物料编号]
LEFT JOIN #流程 AS lc ON v.[订单编号] = lc.[订单编号]
LEFT JOIN #进行中 AS jxz ON v.[订单编号] = jxz.[订单编号]
ORDER BY
CASE WHEN v.[] IS NULL THEN 1 ELSE 0 END,
v.[], v.[];
END;
END;
GO
ALTER PROCEDURE [dbo].[_系统类任务查询]
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'不含'
AS
BEGIN
SET NOCOUNT ON;
EXEC dbo.[_装配任务查询_核心]
@ = N'系统',
@ = @,
@ = @,
@ = @,
@ = @,
@ = @,
@ = @,
@1 = @1,
@2 = @2,
@ = @,
@ = @,
@ = @,
@ = @,
@ = @;
END;
GO
ALTER PROCEDURE [dbo].[_阀类任务查询]
@ int = 0,
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@1 nvarchar(50) = N'',
@2 nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'全部',
@ nvarchar(50) = N'不含'
AS
BEGIN
SET NOCOUNT ON;
EXEC dbo.[_装配任务查询_核心]
@ = N'阀类',
@ = @,
@ = @,
@ = @,
@ = @,
@ = @,
@ = @,
@1 = @1,
@2 = @2,
@ = @,
@ = @,
@ = @,
@ = @,
@ = @;
END;
GO
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心', N'P') IS NULL
THROW 51210, N'核心过程创建失败。', 1;
IF OBJECT_ID(N'dbo.计划排产_系统类任务查询_优化前_20260725', N'P') IS NULL
THROW 51211, N'系统类备份过程创建失败。', 1;
IF OBJECT_ID(N'dbo.计划排产_阀类任务查询_优化前_20260725', N'P') IS NULL
THROW 51212, N'阀类备份过程创建失败。', 1;
COMMIT TRANSACTION;
GO
SELECT [name], [modify_date]
FROM sys.procedures
WHERE [name] IN
(
N'计划排产_装配任务查询_核心',
N'计划排产_系统类任务查询',
N'计划排产_阀类任务查询',
N'计划排产_系统类任务查询_优化前_20260725',
N'计划排产_阀类任务查询_优化前_20260725'
)
ORDER BY [name];
GO

View File

@@ -0,0 +1,79 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.物料基础数据_零件图纸')
AND name = N'IX_零件图纸_num'
)
CREATE NONCLUSTERED INDEX [IX_零件图纸_num]
ON [dbo].[_零件图纸] ([num])
INCLUDE ([worker]);
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.车间生产管理工艺_零件生产工艺_工艺库')
AND name = N'IX_工艺库_订单_顺序'
)
CREATE NONCLUSTERED INDEX [IX_工艺库_订单_顺序]
ON [dbo].[_零件生产工艺_工艺库] ([], [])
INCLUDE ([]);
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.YL_质量检验_质检记录')
AND name = N'IX_质检记录_质检类型_计划号'
)
CREATE NONCLUSTERED INDEX [IX_质检记录_质检类型_计划号]
ON [dbo].[YL_质量检验_质检记录] ([], []);
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.登录基础数据_人员信息')
AND name = N'IX_人员信息_姓名_班组'
)
CREATE NONCLUSTERED INDEX [IX_人员信息_姓名_班组]
ON [dbo].[_人员信息] ([Personnel_Name])
INCLUDE ([]);
IF NOT EXISTS
(
SELECT 1 FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.流程表')
AND name = N'IX_流程表_关联计划_流程'
)
CREATE NONCLUSTERED INDEX [IX_流程表_关联计划_流程]
ON [dbo].[] ([], [ID])
INCLUDE ([]);
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO
SELECT OBJECT_NAME(i.object_id) AS [], i.name AS []
FROM sys.indexes AS i
WHERE i.name IN
(
N'IX_零件图纸_num',
N'IX_工艺库_订单_顺序',
N'IX_质检记录_质检类型_计划号',
N'IX_人员信息_姓名_班组',
N'IX_流程表_关联计划_流程'
)
ORDER BY [], [];
GO

View File

@@ -0,0 +1,281 @@
USE [YL_MESDB]
GO
/*
将工时查询的层级整理、报工类型归类、报工数量去重和总工时汇总移入存储过程。
过程只返回一行treeData 为完整三级 JSON 树totalWorkHours 为任务级总工时。
*/
CREATE OR ALTER PROCEDURE [dbo].[_工时查询_工序工时_查询]
@ NVARCHAR(50) = NULL,
@ NVARCHAR(100) = NULL,
@ NVARCHAR(50) = NULL,
@ DATE = NULL,
@ DATE = NULL,
@ INT = 100
AS
BEGIN
SET NOCOUNT ON;
/* Web 端空日期经参数绑定会成为 1900-01-01需与旧过程一样视为未筛选。 */
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
SET @ = NULLIF(@, CONVERT(DATE, '19000101', 112));
DECLARE @ INT = CASE WHEN ISNULL(@, 0) <= 0 THEN 100 ELSE @ END;
/* 先限制主查询结果,后续所有补充查询仅处理当前 TaskAID/开始时间键。 */
SELECT TOP (@)
ROW_NUMBER() OVER (ORDER BY v. DESC, v.AID DESC) AS ,
v.AID,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.,
v.TaskAID,
v.,
p. AS
INTO #基础数据
FROM dbo.View_生产工时视图 v
LEFT JOIN dbo._零件生产工艺_工艺库 p
ON v. = p.
AND v. = p.
WHERE (@ IS NULL OR v. >= @)
AND (@ IS NULL OR v. < DATEADD(DAY, 1, @))
AND (@ IS NULL OR @ = N'' OR v. LIKE N'%' + @ + N'%')
AND (@ IS NULL OR @ = N'' OR v. LIKE N'%' + @ + N'%')
AND (@ IS NULL OR @ = N'' OR v. = @)
AND (ISNULL(v., N'') IN (N'报工', N'辅助结束')
OR ISNULL(v., N'') IN (N'报工', N'辅助结束'))
AND ISNULL(v., 0) > 0
ORDER BY v. DESC, v.AID DESC;
CREATE CLUSTERED INDEX IX_基础数据_任务开始 ON #基础数据(TaskAID, 开始时间);
SELECT DISTINCT
ISNULL(TaskAID, 0) AS TaskAID,
INTO #任务开始键
FROM #基础数据;
CREATE UNIQUE CLUSTERED INDEX IX_任务开始键 ON #任务开始键(TaskAID, 开始时间);
/* 原过程对全量视图分组;这里限定为主查询实际命中的键。 */
SELECT
k.TaskAID,
k.,
MAX(CASE
WHEN v. = N'异常' THEN -ISNULL(v., 0)
ELSE ISNULL(v., 0)
END) AS ,
MAX(CASE WHEN ISNULL(v., N'') LIKE N'%白班%' THEN 1 ELSE 0 END) AS ,
MAX(CASE WHEN ISNULL(v., N'') LIKE N'%夜班%' THEN 1 ELSE 0 END) AS
INTO #任务开始汇总
FROM #任务开始键 k
LEFT JOIN dbo.View_生产工时视图全部 v
ON v.TaskAID = k.TaskAID
AND v. = k.
GROUP BY k.TaskAID, k.;
CREATE UNIQUE CLUSTERED INDEX IX_任务开始汇总 ON #任务开始汇总(TaskAID, 开始时间);
SELECT
x.TaskAID,
x.,
STRING_AGG(x., N',') AS
INTO #任务开始操作人
FROM (
SELECT DISTINCT
k.TaskAID,
k.,
LTRIM(RTRIM(v.)) AS
FROM #任务开始键 k
JOIN dbo.View_生产工时视图全部 v
ON v.TaskAID = k.TaskAID
AND v. = k.
WHERE ISNULL(v., 0) <= 0
AND NULLIF(LTRIM(RTRIM(ISNULL(v., N''))), N'') IS NOT NULL
) x
GROUP BY x.TaskAID, x.;
CREATE UNIQUE CLUSTERED INDEX IX_任务开始操作人 ON #任务开始操作人(TaskAID, 开始时间);
SELECT
b.,
ISNULL(b.TaskAID, 0) AS TaskAID,
ISNULL(b., N'') + N' ' + ISNULL(b., N'') + N' '
+ ISNULL(b., N'') + N'' + CONVERT(VARCHAR(50), ISNULL(b., 0)) AS taskDescription,
CONVERT(CHAR(10), b., 23) AS dateLabel,
CASE WHEN a. = 1 THEN N'白班' WHEN a. = 1 THEN N'夜班' ELSE N'' END AS shift,
ISNULL(o., N'') AS operatorNames,
ISNULL(b., N'') AS productionOrderNo,
CASE
WHEN ISNULL(b., N'') LIKE N'%辅助%' OR ISNULL(b., N'') LIKE N'%辅助%' THEN N'调机'
WHEN ISNULL(b., N'') LIKE N'%报工%' OR ISNULL(b., N'') LIKE N'%报工%' THEN N'正常'
ELSE ISNULL(NULLIF(b., N''), b.)
END AS reportType,
CASE
WHEN ISNULL(b., N'') LIKE N'%装配%' THEN CAST(0 AS DECIMAL(18, 2))
ELSE CAST(ISNULL(a., ISNULL(b., 0)) AS DECIMAL(18, 2))
END AS reportQty,
ISNULL(b., N'') AS station,
CAST(ISNULL(b., 0) / 3600.0 AS DECIMAL(18, 2)) AS workHours,
CAST(ISNULL(b., 0) / 60.0 AS DECIMAL(18, 2)) AS workMinutes,
CAST(N'' AS NVARCHAR(1)) AS programTime,
CAST(ISNULL(b., 0) AS DECIMAL(18, 2)) AS processWorkHours,
CONVERT(VARCHAR(19), b., 120) AS startTime
INTO #明细数据
FROM #基础数据 b
LEFT JOIN #任务开始汇总 a
ON a.TaskAID = ISNULL(b.TaskAID, 0)
AND a. = b.
LEFT JOIN #任务开始操作人 o
ON o.TaskAID = ISNULL(b.TaskAID, 0)
AND o. = b.;
CREATE CLUSTERED INDEX IX_明细数据_任务日期 ON #明细数据(TaskAID, dateLabel, 明细序号);
SELECT
TaskAID,
dateLabel,
startTime,
MAX(reportQty) AS reportQty
INTO #去重数量
FROM #明细数据
GROUP BY TaskAID, dateLabel, startTime;
CREATE UNIQUE CLUSTERED INDEX IX_去重数量 ON #去重数量(TaskAID, dateLabel, startTime);
SELECT TaskAID, SUM(reportQty) AS reportQty
INTO #任务数量汇总
FROM #去重数量
GROUP BY TaskAID;
SELECT TaskAID, dateLabel, SUM(reportQty) AS reportQty
INTO #日期数量汇总
FROM #去重数量
GROUP BY TaskAID, dateLabel;
SELECT
m.TaskAID,
MAX(m.taskDescription) AS taskDescription,
COUNT(*) AS reportCount,
ISNULL(q.reportQty, 0) AS reportQty,
SUM(m.workHours) AS workHours,
SUM(m.workMinutes) AS workMinutes,
MAX(m.processWorkHours) AS processWorkHours
INTO #任务汇总
FROM #明细数据 m
LEFT JOIN #任务数量汇总 q ON q.TaskAID = m.TaskAID
GROUP BY m.TaskAID, q.reportQty;
CREATE UNIQUE CLUSTERED INDEX IX_任务汇总 ON #任务汇总(TaskAID);
SELECT
m.TaskAID,
m.dateLabel,
MAX(m.taskDescription) AS taskDescription,
COUNT(*) AS reportCount,
ISNULL(q.reportQty, 0) AS reportQty,
SUM(m.workHours) AS workHours,
SUM(m.workMinutes) AS workMinutes,
MAX(m.processWorkHours) AS processWorkHours
INTO #日期汇总
FROM #明细数据 m
LEFT JOIN #日期数量汇总 q
ON q.TaskAID = m.TaskAID
AND q.dateLabel = m.dateLabel
GROUP BY m.TaskAID, m.dateLabel, q.reportQty;
CREATE UNIQUE CLUSTERED INDEX IX_日期汇总 ON #日期汇总(TaskAID, dateLabel);
/* 由过程生成 Element UI 所需的三级 children 结构,页面只反序列化。 */
SELECT
ISNULL((
SELECT
CONCAT(N'p1-', t.TaskAID) AS id,
1 AS [level],
t.TaskAID,
t.taskDescription,
t.reportCount,
t.reportQty,
t.workHours,
CAST(CASE WHEN t.reportQty > 0 THEN t.workMinutes / t.reportQty ELSE t.processWorkHours END AS DECIMAL(18, 2)) AS pieceWorkHours,
t.processWorkHours,
JSON_QUERY((
SELECT
CONCAT(N'p2-', d.TaskAID, N'-', d.dateLabel) AS id,
2 AS [level],
d.TaskAID,
d.taskDescription,
d.dateLabel,
CAST(N'' AS NVARCHAR(1)) AS shift,
CAST(N'' AS NVARCHAR(1)) AS operatorNames,
CAST(N'' AS NVARCHAR(1)) AS productionOrderNo,
CAST(N'' AS NVARCHAR(1)) AS reportType,
d.reportCount,
d.reportQty,
CAST(N'' AS NVARCHAR(1)) AS station,
d.workHours,
CAST(N'' AS NVARCHAR(1)) AS programTime,
CAST(CASE WHEN d.reportQty > 0 THEN d.workMinutes / d.reportQty ELSE d.processWorkHours END AS DECIMAL(18, 2)) AS pieceWorkHours,
d.processWorkHours,
CAST(N'' AS NVARCHAR(1)) AS startTime,
JSON_QUERY((
SELECT
CONCAT(N'p3-', m.) AS id,
3 AS [level],
m.TaskAID,
m.taskDescription,
m.dateLabel,
m.shift,
m.operatorNames,
m.productionOrderNo,
m.reportType,
m.reportQty,
m.station,
m.workHours,
m.programTime,
CAST(CASE WHEN m.reportQty > 0 THEN m.workMinutes / m.reportQty ELSE m.processWorkHours END AS DECIMAL(18, 2)) AS pieceWorkHours,
m.processWorkHours,
m.startTime
FROM #明细数据 m
WHERE m.TaskAID = d.TaskAID
AND m.dateLabel = d.dateLabel
ORDER BY m.startTime, m.
FOR JSON PATH
)) AS children
FROM #日期汇总 d
WHERE d.TaskAID = t.TaskAID
ORDER BY d.dateLabel
FOR JSON PATH
)) AS children
FROM #任务汇总 t
ORDER BY t.TaskAID
FOR JSON PATH
), N'[]') AS treeData,
CAST(ISNULL((SELECT SUM(workHours) FROM #任务汇总), 0) AS DECIMAL(18, 1)) AS totalWorkHours;
END
GO
/* 视图通过报工记录id关联校验表过滤索引避免堆表重复扫描。 */
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE object_id = OBJECT_ID(N'dbo.生产管理_工时校验_校验工时表')
AND name = N'IX_校验工时表_报工记录id'
)
BEGIN
CREATE NONCLUSTERED INDEX [IX_校验工时表_报工记录id]
ON dbo._工时校验_校验工时表 ([id])
INCLUDE ([AID], [TaskAID], [], [], [], [], [], [],
[], [], [], [], [], [], [], [])
WHERE [id] IS NOT NULL;
END
GO

View File

@@ -0,0 +1,95 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
/* 编辑生产工艺时返回订单是否已生成生产任务,供前端禁用删除工序。 */
ALTER PROCEDURE [dbo].[_生产工艺_查询生产工艺]
@ nvarchar(50),
@ int
AS
BEGIN
SET NOCOUNT ON;
SELECT
a.[id],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
ISNULL(a.[], 0) AS [],
ISNULL(a.[], 0) AS [],
ISNULL(a.[], 0) AS [],
a.[],
a.[],
a.[],
a.[],
a.[],
a.[],
b.[] AS [],
CAST(CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[MES_接口_生产计划_生产任务] AS task
WHERE task.[] = a.[]
) THEN 1 ELSE 0 END AS bit) AS []
FROM [dbo].[_零件生产工艺_工艺库] AS a
LEFT JOIN [dbo].[_工序] AS b ON a.[] = b.[]
WHERE a.[] = @
AND a.[] = @
ORDER BY a.[];
END;
GO
/* 服务端二次校验,防止跳过前端直接删除已生成生产任务订单的工序。 */
ALTER PROCEDURE [dbo].[_零件工序_生产工艺_删除工序]
@ nvarchar(50) = NULL,
@idd int = NULL,
@ int
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS
(
SELECT 1
FROM [dbo].[MES_接口_生产计划_生产任务]
WHERE [] = @
)
BEGIN
SELECT CAST(0 AS bit) AS [], N'该订单已生成生产任务,不能删除工序。' AS [];
RETURN;
END;
DECLARE @ int;
SELECT @ = []
FROM [dbo].[_零件生产工艺_工艺库]
WHERE [id] = @idd;
UPDATE [dbo].[_零件生产工艺_工艺库]
SET [] = [] - 1
WHERE [] > @
AND [] = @
AND [] = @;
DELETE FROM [dbo].[_零件生产工艺_工艺库]
WHERE [id] = @idd;
UPDATE [dbo].[_零件生产工艺_工艺库]
SET [] = 0
WHERE [] = @;
UPDATE [dbo].[MES_接口_生产计划]
SET [] = 0
WHERE [] = @;
SELECT CAST(1 AS bit) AS [], N'删除成功。' AS [];
END;
GO

View File

@@ -0,0 +1,45 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
DECLARE @Definition nvarchar(max) =
OBJECT_DEFINITION(OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_预算前_20260725'));
DECLARE @ProcedurePosition int;
IF @Definition IS NULL
THROW 51500, N'未找到预算功能部署前的核心查询备份过程。', 1;
SET @Definition = REPLACE(
@Definition,
N'[dbo].[计划排产_装配任务查询_核心_预算前_20260725]',
N'[dbo].[计划排产_装配任务查询_核心]'
);
SET @ProcedurePosition = CHARINDEX(N'PROCEDURE', @Definition);
IF @ProcedurePosition = 0
THROW 51501, N'未识别核心查询备份过程定义头。', 1;
SET @Definition = N'ALTER ' + SUBSTRING(@Definition, @ProcedurePosition, LEN(@Definition));
EXEC sys.sp_executesql @Definition;
DROP PROCEDURE IF EXISTS dbo.[_装配任务预算_保存];
COMMIT TRANSACTION;
GO
-- 两张预算表可能已包含人工录入数据,回滚时有意保留,避免数据丢失。
SELECT [name], [type_desc], [modify_date]
FROM sys.objects
WHERE [name] IN
(
N'计划排产_装配任务预算',
N'计划排产_装配合同预算',
N'计划排产_装配任务查询_核心',
N'计划排产_装配任务查询_核心_预算前_20260725'
)
ORDER BY [name];
GO

View File

@@ -0,0 +1,82 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @ProcedureName sysname;
DECLARE @Definition nvarchar(max);
DECLARE @AlterPosition int;
DECLARE @AssemblySelect nvarchar(250) = N'SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同装配工时';
DECLARE @QualitySelect nvarchar(250) = N'SELECT gs.订单合同号 AS 合同号, SUM(gs.总时长) as 合同质检工时';
DECLARE @GroupBy nvarchar(100) = N'GROUP BY gs.订单合同号';
DECLARE ProcedureCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT [name]
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
OPEN ProcedureCursor;
FETCH NEXT FROM ProcedureCursor INTO @ProcedureName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Definition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.' + QUOTENAME(@ProcedureName)));
IF @Definition IS NULL
THROW 51100, N'未找到待回滚的存储过程。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @AssemblySelect, N''))) / LEN(@AssemblySelect) <> 1
THROW 51101, N'合同装配工时汇总代码与修复版本不一致,已停止回滚。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @QualitySelect, N''))) / LEN(@QualitySelect) <> 1
THROW 51102, N'合同质检工时汇总代码与修复版本不一致,已停止回滚。', 1;
IF (LEN(@Definition) - LEN(REPLACE(@Definition, @GroupBy, N''))) / LEN(@GroupBy) <> 2
THROW 51103, N'合同工时分组代码与修复版本不一致,已停止回滚。', 1;
SET @Definition = REPLACE(
@Definition,
@AssemblySelect,
N'SELECT gs.合同号, SUM(gs.总时长) as 合同装配工时'
);
SET @Definition = REPLACE(
@Definition,
@QualitySelect,
N'SELECT gs.合同号, SUM(gs.总时长) as 合同质检工时'
);
SET @Definition = REPLACE(@Definition, @GroupBy, N'GROUP BY gs.合同号');
SET @AlterPosition = CHARINDEX(N'ALTER PROCEDURE', @Definition);
IF @AlterPosition = 0
THROW 51104, N'存储过程定义中未找到 ALTER PROCEDURE。', 1;
EXEC sys.sp_executesql @Definition;
FETCH NEXT FROM ProcedureCursor INTO @ProcedureName;
END;
CLOSE ProcedureCursor;
DEALLOCATE ProcedureCursor;
COMMIT TRANSACTION;
SELECT [name], [modify_date]
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
END TRY
BEGIN CATCH
IF CURSOR_STATUS('local', 'ProcedureCursor') >= 0
CLOSE ProcedureCursor;
IF CURSOR_STATUS('local', 'ProcedureCursor') > -3
DEALLOCATE ProcedureCursor;
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,72 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRANSACTION;
GO
DECLARE @Name sysname;
DECLARE @BackupName sysname;
DECLARE @Definition nvarchar(max);
DECLARE @HeaderPosition int;
DECLARE @HeaderLength int;
DECLARE RestoreCursor CURSOR LOCAL FAST_FORWARD FOR
SELECT v.[name], v.[backup_name]
FROM
(
VALUES
(N'计划排产_系统类任务查询', N'计划排产_系统类任务查询_优化前_20260725'),
(N'计划排产_阀类任务查询', N'计划排产_阀类任务查询_优化前_20260725')
) AS v([name], [backup_name]);
OPEN RestoreCursor;
FETCH NEXT FROM RestoreCursor INTO @Name, @BackupName;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Definition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.' + QUOTENAME(@BackupName)));
IF @Definition IS NULL
THROW 51300, N'未找到优化前备份过程,停止回滚。', 1;
SET @Definition = REPLACE(
@Definition,
N'[dbo].[' + @BackupName + N']',
N'[dbo].[' + @Name + N']'
);
SET @HeaderPosition = CHARINDEX(N'CREATE PROCEDURE', @Definition);
SET @HeaderLength = LEN(N'CREATE PROCEDURE');
IF @HeaderPosition = 0
BEGIN
SET @HeaderPosition = CHARINDEX(N'ALTER PROCEDURE', @Definition);
SET @HeaderLength = LEN(N'ALTER PROCEDURE');
END;
IF @HeaderPosition = 0
THROW 51301, N'未识别备份过程定义头。', 1;
SET @Definition = STUFF(
@Definition,
@HeaderPosition,
@HeaderLength,
N'ALTER PROCEDURE'
);
EXEC sys.sp_executesql @Definition;
FETCH NEXT FROM RestoreCursor INTO @Name, @BackupName;
END;
CLOSE RestoreCursor;
DEALLOCATE RestoreCursor;
DROP PROCEDURE IF EXISTS dbo.[_装配任务查询_核心];
COMMIT TRANSACTION;
GO
SELECT [name], [modify_date]
FROM sys.procedures
WHERE [name] IN (N'计划排产_系统类任务查询', N'计划排产_阀类任务查询')
ORDER BY [name];
GO

View File

@@ -0,0 +1,32 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
BEGIN TRY
BEGIN TRANSACTION;
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.物料基础数据_零件图纸') AND name = N'IX_零件图纸_num')
DROP INDEX [IX_零件图纸_num] ON [dbo].[_零件图纸];
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.车间生产管理工艺_零件生产工艺_工艺库') AND name = N'IX_工艺库_订单_顺序')
DROP INDEX [IX_工艺库_订单_顺序] ON [dbo].[_零件生产工艺_工艺库];
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.YL_质量检验_质检记录') AND name = N'IX_质检记录_质检类型_计划号')
DROP INDEX [IX_质检记录_质检类型_计划号] ON [dbo].[YL_质量检验_质检记录];
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.登录基础数据_人员信息') AND name = N'IX_人员信息_姓名_班组')
DROP INDEX [IX_人员信息_姓名_班组] ON [dbo].[_人员信息];
IF EXISTS (SELECT 1 FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.流程表') AND name = N'IX_流程表_关联计划_流程')
DROP INDEX [IX_流程表_关联计划_流程] ON [dbo].[];
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,47 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据_安全修复前_20260725', N'P') IS NULL
THROW 51610, N'未找到登录查询过程安全修复前备份。', 1;
DECLARE @definition nvarchar(max) = OBJECT_DEFINITION(
OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据_安全修复前_20260725')
);
DECLARE @procedurePosition int;
SET @definition = REPLACE(
@definition,
N'dbo.菜单模块系统_用户名密码_查询数据_安全修复前_20260725',
N'dbo.菜单模块系统_用户名密码_查询数据'
);
SET @definition = REPLACE(
@definition,
N'[dbo].[菜单模块系统_用户名密码_查询数据_安全修复前_20260725]',
N'[dbo].[菜单模块系统_用户名密码_查询数据]'
);
SET @procedurePosition = CHARINDEX(N'PROCEDURE', @definition);
IF @procedurePosition = 0
THROW 51611, N'登录查询过程备份结构异常,停止回滚。', 1;
SET @definition = N'ALTER ' + SUBSTRING(
@definition,
@procedurePosition,
LEN(@definition)
);
EXEC sys.sp_executesql @definition;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,39 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_测试跳过SAP前_20260725', N'P') IS NULL
THROW 51510, N'未找到测试环境 SAP 适配前备份过程。', 1;
DECLARE @sql nvarchar(max) = OBJECT_DEFINITION(
OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_测试跳过SAP前_20260725')
);
DECLARE @procedurePosition int;
SET @sql = REPLACE(
@sql,
N'[dbo].[计划排产_装配任务查询_核心_测试跳过SAP前_20260725]',
N'[dbo].[计划排产_装配任务查询_核心]'
);
SET @procedurePosition = CHARINDEX(N'PROCEDURE', @sql);
IF @procedurePosition = 0
OR CHARINDEX(N'[SAP].[SBO_YL].[dbo].[UBT_MES_ORDROPEN2]', @sql) = 0
THROW 51511, N'测试环境 SAP 适配备份结构异常,停止回滚。', 1;
SET @sql = N'ALTER ' + SUBSTRING(@sql, @procedurePosition, LEN(@sql));
EXEC sys.sp_executesql @sql;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,76 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据', N'P') IS NULL
THROW 51600, N'未找到登录查询过程。', 1;
IF OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据_安全修复前_20260725', N'P') IS NOT NULL
THROW 51601, N'登录查询过程安全修复前备份已存在,停止重复部署。', 1;
DECLARE @definition nvarchar(max) = OBJECT_DEFINITION(
OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据')
);
DECLARE @procedurePosition int = CHARINDEX(N'PROCEDURE', @definition);
IF @procedurePosition = 0
THROW 51602, N'无法识别登录查询过程定义。', 1;
SET @definition = REPLACE(
@definition,
N'dbo.菜单模块系统_用户名密码_查询数据',
N'dbo.菜单模块系统_用户名密码_查询数据_安全修复前_20260725'
);
SET @definition = REPLACE(
@definition,
N'[dbo].[菜单模块系统_用户名密码_查询数据]',
N'[dbo].[菜单模块系统_用户名密码_查询数据_安全修复前_20260725]'
);
SET @definition = N'CREATE ' + SUBSTRING(
@definition,
@procedurePosition,
LEN(@definition)
);
EXEC sys.sp_executesql @definition;
EXEC sys.sp_executesql N'
ALTER PROCEDURE [dbo].[菜单模块系统_用户名密码_查询数据]
@用户名 nvarchar(50) = NULL,
@密码 nvarchar(50) = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT
[Roles_number],
[Roles_Function],
[Personnel_Number],
[account],
[Personnel_Name],
[Departments_ID],
[Quit],
[部门名称],
[OrgUnit],
[班组]
FROM [dbo].[登录基础数据_管理人员权限视图]
WHERE [account] = @用户名
AND [password] = @密码
AND [Quit] = 0;
END;';
IF OBJECT_DEFINITION(OBJECT_ID(N'dbo.菜单模块系统_用户名密码_查询数据')) LIKE N'%SELECT *%'
THROW 51603, N'登录查询过程仍包含 SELECT *,停止部署。', 1;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,85 @@
USE [YL_MESDB];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
GO
BEGIN TRY
BEGIN TRANSACTION;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心', N'P') IS NULL
THROW 51500, N'未找到装配任务核心查询过程。', 1;
IF OBJECT_ID(N'dbo.计划排产_装配任务查询_核心_测试跳过SAP前_20260725', N'P') IS NOT NULL
THROW 51501, N'测试环境 SAP 适配前备份过程已存在,停止重复部署。', 1;
DECLARE @sql nvarchar(max) = OBJECT_DEFINITION(
OBJECT_ID(N'dbo.计划排产_装配任务查询_核心')
);
DECLARE @backupSql nvarchar(max) = REPLACE(
@sql,
N'[dbo].[计划排产_装配任务查询_核心]',
N'[dbo].[计划排产_装配任务查询_核心_测试跳过SAP前_20260725]'
);
DECLARE @procedurePosition int = CHARINDEX(N'PROCEDURE', @backupSql);
IF @procedurePosition = 0
THROW 51502, N'未识别核心查询过程定义头。', 1;
SET @backupSql = N'CREATE ' + SUBSTRING(
@backupSql,
@procedurePosition,
LEN(@backupSql)
);
EXEC sys.sp_executesql @backupSql;
DECLARE @keysPosition int = CHARINDEX(N'INTO #交货键', @sql);
DECLARE @blockStart int = CHARINDEX(N' SELECT', @sql, @keysPosition + 1);
DECLARE @blockEnd int = CHARINDEX(
N' CREATE UNIQUE CLUSTERED INDEX [CX_交货]',
@sql,
@blockStart
);
DECLARE @oldBlock nvarchar(max);
IF @keysPosition = 0 OR @blockStart = 0 OR @blockEnd = 0
THROW 51503, N'未找到核心查询的 SAP 交货日期代码块。', 1;
SET @oldBlock = SUBSTRING(@sql, @blockStart, @blockEnd - @blockStart);
IF CHARINDEX(N'[SAP].[SBO_YL].[dbo].[UBT_MES_ORDROPEN2]', @oldBlock) = 0
THROW 51504, N'交货日期代码块不是预期的 SAP 链接查询。', 1;
DECLARE @newBlock nvarchar(max) = N' -- 测试环境无法连接现场 SAP保留返回结构但不等待远程交货日期。
SELECT
k.[合同号],
k.[物料编号],
CAST(NULL AS datetime) AS [交货日期理论齐套日期]
INTO #交货
FROM #交货键 AS k;
';
SET @sql = STUFF(
@sql,
@blockStart,
@blockEnd - @blockStart,
@newBlock
);
IF CHARINDEX(N'[SAP].[SBO_YL].[dbo].[UBT_MES_ORDROPEN2]', @sql) > 0
OR CHARINDEX(N'测试环境无法连接现场 SAP', @sql) = 0
THROW 51505, N'测试环境 SAP 适配替换失败。', 1;
SET @procedurePosition = CHARINDEX(N'PROCEDURE', @sql);
SET @sql = N'ALTER ' + SUBSTRING(@sql, @procedurePosition, LEN(@sql));
EXEC sys.sp_executesql @sql;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
THROW;
END CATCH;
GO

View File

@@ -0,0 +1,119 @@
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'',
@ nvarchar(500) = N'',
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ bit = CASE WHEN EXISTS
(
SELECT 1
FROM [dbo].[_角色信息]
WHERE CONVERT(nvarchar(100), [Roles_number]) = @
AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')
) THEN 1 ELSE 0 END;
;WITH base AS
(
SELECT
r.[RID], r.[DID], ISNULL(r.[], N'') AS [],
t.[], t.[], t.[], t.[], t.[],
t.[], ISNULL(t.[], N'') AS [],
r.[], r.[], ISNULL(r.[], 0) AS [],
r.[], r.[],
ISNULL(notes.[], N'') AS [],
ISNULL(notes.[], N'') AS [],
r.[]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
OUTER APPLY
(
SELECT
STRING_AGG(CASE WHEN n.[] = N'异常说明' THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + N' ' + COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') + NCHAR(13) + NCHAR(10) + n.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [],
STRING_AGG(CASE WHEN n.[] = N'奇思妙想' THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + N' ' + COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') + NCHAR(13) + NCHAR(10) + n.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS notes
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 (ISNULL(@, N'') = N'' OR t.[] LIKE N'%' + @ + N'%')
AND (@DID IS NULL OR @DID = 0 OR r.[DID] = @DID)
AND (@ = 1 OR (NULLIF(LTRIM(RTRIM(@)), N'') IS NOT NULL AND (ISNULL(t.[], N'') = LTRIM(RTRIM(@)) OR ISNULL(r.[], N'') = LTRIM(RTRIM(@)))))
), 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 [], 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(MAX([]), N'') AS [], ISNULL(MAX([]), 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-' + [], N't-' + CAST([DID] AS nvarchar(20)), [], CAST(N'' AS nvarchar(20)), CAST(NULL AS int), [DID], CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(200)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(500)), CAST(N'' AS nvarchar(max)), CONVERT(varchar(19), MIN([]), 120), CONVERT(varchar(19), MAX([]), 120), COUNT(1), CAST(SUM([]) / 3600.0 AS decimal(18, 2)), CASE WHEN SUM(CONVERT(int, [])) = COUNT(1) THEN N'已校验' WHEN SUM(CONVERT(int, [])) = 0 THEN N'未校验' ELSE N'部分校验' END, 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''), CAST(N'' AS nvarchar(max)), CAST(N'' AS nvarchar(max)), 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'')
FROM base GROUP BY [DID], []
)
SELECT * FROM result ORDER BY [DID] DESC, [Level], [];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_工时报表_作业者工时_查询]
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ datetime = TRY_CONVERT(datetime, NULLIF(@, N''));
DECLARE @ bit = CASE WHEN EXISTS (SELECT 1 FROM [dbo].[_角色信息] WHERE CONVERT(nvarchar(100), [Roles_number]) = @ AND ([Roles_Function] LIKE N'%领导%' OR [Roles_Function] LIKE N'%管理员%')) THEN 1 ELSE 0 END;
;WITH base AS
(
SELECT r.[RID], r.[DID], ISNULL(r.[], N'') AS [], CONVERT(varchar(10), r.[], 120) AS [], t.[], t.[], t.[], t.[], t.[], t.[], ISNULL(t.[], N'') AS [], r.[], r.[], ISNULL(r.[], 0) AS [], r.[], r.[], ISNULL(notes.[], N'') AS [], ISNULL(notes.[], N'') AS [], r.[]
FROM [dbo].[MES_设计报工_记录] AS r
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID]
OUTER APPLY
(
SELECT STRING_AGG(CASE WHEN n.[] = N'异常说明' THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + N' ' + COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') + NCHAR(13) + NCHAR(10) + n.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS [], STRING_AGG(CASE WHEN n.[] = N'奇思妙想' THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + N' ' + COALESCE(NULLIF(LTRIM(RTRIM(n.[])), N''), NULLIF(LTRIM(RTRIM(n.[ID])), N''), N'未填写编辑人') + NCHAR(13) + NCHAR(10) + n.[]) END, NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)) WITHIN GROUP (ORDER BY n.[] DESC, n.[SID] DESC) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n WHERE n.[DID] = t.[DID]
) AS notes
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 (ISNULL(@, N'') = N'' OR t.[] LIKE N'%' + @ + N'%') AND (@DID IS NULL OR @DID = 0 OR r.[DID] = @DID) AND (@ = 1 OR (NULLIF(LTRIM(RTRIM(@)), N'') IS NOT NULL AND (ISNULL(t.[], N'') = LTRIM(RTRIM(@)) OR ISNULL(r.[], N'') = LTRIM(RTRIM(@)))))
), result AS
(
SELECT 1 AS [Level], N'p-' + [] AS [id], CAST(N'' AS nvarchar(100)) AS [parentId], [], CAST(N'' AS nvarchar(20)) AS [], CAST(NULL AS int) AS [RID], CAST(NULL AS int) AS [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 [], CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS varchar(19)) AS [], CAST(N'' AS varchar(19)) AS [], COUNT(1) AS [], CAST(SUM([]) / 3600.0 AS decimal(18, 2)) AS [], CAST(N'' AS nvarchar(20)) AS [], CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS [], CAST(N'' AS nvarchar(max)) AS []
FROM base GROUP BY []
UNION ALL
SELECT 2 AS [Level], N'd-' + [] + N'-' + [], N'p-' + [], [], [], CAST(NULL AS int), CAST(NULL AS int), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(200)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(100)), CAST(N'' AS nvarchar(500)), CAST(N'' AS nvarchar(max)), CAST(N'' AS varchar(19)), CAST(N'' AS varchar(19)), COUNT(1), CAST(SUM([]) / 3600.0 AS decimal(18, 2)), CAST(N'' AS nvarchar(20)), CAST(N'' AS nvarchar(max)), CAST(N'' AS nvarchar(max)), CAST(N'' AS nvarchar(max)), CAST(N'' AS nvarchar(max))
FROM base GROUP BY [], []
UNION ALL
SELECT 3 AS [Level], N'r-' + CAST([RID] AS nvarchar(20)), N'd-' + [] + N'-' + [], [], [], [RID], [DID], ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), CONVERT(varchar(19), [], 120), CONVERT(varchar(19), [], 120), 1, CAST([] / 3600.0 AS decimal(18, 2)), CASE WHEN [] = 1 THEN N'已校验' ELSE N'未校验' END, ISNULL([], N''), ISNULL([], N''), ISNULL([], N''), ISNULL([], N'')
FROM base
)
SELECT * FROM result ORDER BY [], [], [Level], [RID];
END
GO

View File

@@ -0,0 +1,528 @@
USE [YL_MESDB];
GO
SET ANSI_NULLS ON;
GO
SET QUOTED_IDENTIFIER ON;
GO
IF COL_LENGTH(N'[dbo].[MES_设计报工_记录]', N'进度说明') IS NULL
BEGIN
ALTER TABLE [dbo].[MES_设计报工_记录] ADD [] nvarchar(500) NULL;
END
GO
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'对齐可见ID') IS NULL
BEGIN
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [ID] nvarchar(1000) NULL;
END
GO
IF COL_LENGTH(N'[dbo].[MES_设计报工_任务]', N'对齐可见') IS NULL
BEGIN
ALTER TABLE [dbo].[MES_设计报工_任务] ADD [] nvarchar(1000) NULL;
END
GO
IF OBJECT_ID(N'[dbo].[MES_设计报工_任务说明]', N'U') IS NULL
BEGIN
CREATE TABLE [dbo].[MES_设计报工_任务说明]
(
[SID] int IDENTITY(1,1) NOT NULL CONSTRAINT [PK_MES_设计报工_任务说明] PRIMARY KEY,
[DID] int NOT NULL,
[] nvarchar(20) NOT NULL,
[] nvarchar(2000) NOT NULL,
[ID] nvarchar(100) NULL,
[] nvarchar(100) NULL,
[] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_任务说明_录入时间] DEFAULT (GETDATE()),
CONSTRAINT [FK_MES_设计报工_任务说明_任务] FOREIGN KEY ([DID])
REFERENCES [dbo].[MES_设计报工_任务]([DID]) ON DELETE CASCADE,
CONSTRAINT [CK_MES_设计报工_任务说明_类型] CHECK ([] IN (N'异常说明', N'奇思妙想'))
);
CREATE INDEX [IX_MES_设计报工_任务说明_DID_类型_时间]
ON [dbo].[MES_设计报工_任务说明]([DID], [], [], [SID]);
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务说明_新增]
@DID int,
@ nvarchar(20),
@ nvarchar(2000),
@ID nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET @ = LTRIM(RTRIM(ISNULL(@, N'')));
SET @ = LTRIM(RTRIM(ISNULL(@, N'')));
IF @ NOT IN (N'异常说明', N'奇思妙想')
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明类型不正确' AS [message];
RETURN;
END
IF @ = N''
BEGIN
SELECT CAST(0 AS int) AS [result], N'说明内容不能为空' AS [message];
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_任务说明]
([DID], [], [], [ID], [])
VALUES
(@DID, @, @, NULLIF(@ID, N''), NULLIF(@, N''));
SELECT CAST(1 AS int) AS [result], N'保存成功' AS [message], CONVERT(int, SCOPE_IDENTITY()) AS [SID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_查询]
@DID int = NULL,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@_Start nvarchar(30) = N'',
@_End nvarchar(30) = N'',
@ nvarchar(50) = N'',
@ID nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
DECLARE @1 datetime = TRY_CONVERT(datetime, NULLIF(@_Start, N''));
DECLARE @2 datetime = TRY_CONVERT(datetime, NULLIF(@_End, N''));
SELECT TOP 1000
t.[DID],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[],
t.[ID],
t.[],
t.[ID],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
t.[],
CONVERT(varchar(19), t.[], 120) AS [],
t.[],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(r.[], 0) AS [],
ISNULL(p.[], N'') AS [],
CONVERT(varchar(19), r.[], 120) AS [],
CONVERT(varchar(19), r.[], 120) AS [],
ISNULL(progress_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS [],
ISNULL(task_notes.[], N'') AS []
FROM [dbo].[MES_设计报工_任务] AS t
OUTER APPLY
(
SELECT
COUNT(1) AS [],
SUM(CASE WHEN rr.[] IS NULL THEN 1 ELSE 0 END) AS [],
SUM(CASE
WHEN rr.[] IS NULL
AND (
(NULLIF(@ID, N'') IS NOT NULL AND ISNULL(rr.[ID], N'') = @ID)
OR (NULLIF(@ID, N'') IS NULL AND NULLIF(@, N'') IS NOT NULL AND ISNULL(rr.[], N'') = @)
)
THEN 1 ELSE 0 END) AS [],
MAX(rr.[]) AS [],
MAX(rr.[]) AS []
FROM [dbo].[MES_设计报工_记录] AS rr
WHERE rr.[DID] = t.[DID]
) AS r
OUTER APPLY
(
SELECT STRING_AGG(CONVERT(nvarchar(max), x.[]), N'') AS []
FROM
(
SELECT DISTINCT COALESCE(NULLIF(rr2.[], N''), NULLIF(rr2.[ID], N''), N'未填写操作人') AS []
FROM [dbo].[MES_设计报工_记录] AS rr2
WHERE rr2.[DID] = t.[DID]
AND rr2.[] IS NULL
) AS x
) AS p
OUTER APPLY
(
SELECT STRING_AGG(
CONVERT(nvarchar(max), CONVERT(nvarchar(19), rr3.[], 120) + NCHAR(13) + NCHAR(10) + rr3.[]),
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY rr3.[], rr3.[RID]) AS []
FROM [dbo].[MES_设计报工_记录] AS rr3
WHERE rr3.[DID] = t.[DID]
AND NULLIF(LTRIM(RTRIM(rr3.[])), N'') IS NOT NULL
) AS progress_notes
OUTER APPLY
(
SELECT
STRING_AGG(
CASE WHEN n.[] = N'异常说明'
THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + NCHAR(13) + NCHAR(10) + n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[], n.[SID]) AS [],
STRING_AGG(
CASE WHEN n.[] = N'奇思妙想'
THEN CONVERT(nvarchar(max), CONVERT(nvarchar(19), n.[], 120) + NCHAR(13) + NCHAR(10) + n.[]) END,
NCHAR(13) + NCHAR(10) + NCHAR(13) + NCHAR(10)
) WITHIN GROUP (ORDER BY n.[], n.[SID]) AS []
FROM [dbo].[MES_设计报工_任务说明] AS n
WHERE n.[DID] = t.[DID]
) AS task_notes
WHERE
(@DID IS NULL OR @DID = 0 OR t.[DID] = @DID)
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 (ISNULL(@, N'') = N'' OR t.[] LIKE N'%' + @ + N'%')
AND (ISNULL(@, N'') = N'' OR t.[] LIKE N'%' + @ + N'%')
AND (ISNULL(@, N'') = N'' OR @ = N'全部' OR t.[] = @)
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND (@1 IS NULL OR t.[] >= @1)
AND (@2 IS NULL OR t.[] < DATEADD(day, 1, @2))
AND
(
(NULLIF(@ID, N'') IS NULL AND NULLIF(@, N'') IS NULL)
OR (NULLIF(@, N'') IS NOT NULL AND ISNULL(t.[], N'') = @)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
OR
(
NULLIF(@ID, N'') IS NOT NULL
AND CHARINDEX(N',' + @ID + N',', N',' + ISNULL(t.[ID], N'') + N',') > 0
)
OR
(
NULLIF(@, N'') IS NOT NULL
AND CHARINDEX(N',' + @ + N',', N',' + ISNULL(t.[], N'') + N',') > 0
)
)
ORDER BY t.[DID] DESC;
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_新增]
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(max) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N''
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo].[MES_设计报工_任务]
(
[], [], [], [], [], [],
[], [], [],
[], [], [ID], [], [ID], [],
[], [], [],
[], [], [], []
)
VALUES
(
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''),
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@, N''),
NULLIF(@, N''), NULLIF(@, N''), NULLIF(@ID, N''), NULLIF(@, N''), NULLIF(@ID, N''), NULLIF(@, N''),
TRY_CONVERT(datetime, NULLIF(@, N'')), TRY_CONVERT(datetime, NULLIF(@, N'')), N'待开始',
NULLIF(@, N''), NULLIF(@, N''), GETDATE(), NULLIF(@, N'')
);
SELECT CAST(1 AS int) AS [result], N'新增成功' AS [message], SCOPE_IDENTITY() AS [DID];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_编辑]
@DID int,
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ nvarchar(100) = N'',
@ nvarchar(200) = N'',
@ nvarchar(max) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N'',
@ nvarchar(30) = N'',
@ nvarchar(30) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N'',
@ID nvarchar(1000) = N'',
@ nvarchar(1000) = N''
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID)
BEGIN
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_任务]
SET
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[] = NULLIF(@, N''),
[ID] = NULLIF(@ID, N''),
[] = NULLIF(@, N''),
[ID] = NULLIF(@ID, N''),
[] = NULLIF(@, N''),
[] = TRY_CONVERT(datetime, NULLIF(@, N'')),
[] = TRY_CONVERT(datetime, NULLIF(@, N'')),
[] = NULLIF(@, N''),
[] = GETDATE(),
[] = NULLIF(@, N'')
WHERE [DID] = @DID;
SELECT CAST(1 AS int) AS [result], N'编辑成功' AS [message];
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_开始]
@DID int,
@ID nvarchar(100) = N'',
@ nvarchar(100) = N''
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT OFF;
DECLARE @ID nvarchar(100) = NULLIF(@ID, N'');
DECLARE @ nvarchar(100) = NULLIF(@, N'');
DECLARE @ nvarchar(255);
DECLARE @ int;
DECLARE @DID int;
DECLARE @ nvarchar(500);
DECLARE @RID int;
DECLARE @ int = @@TRANCOUNT;
DECLARE @ sysname = N'DRT_Task_Start';
IF @ID IS NULL AND @ IS NULL
BEGIN
SELECT CAST(0 AS int) AS [result], N'未获取到当前操作人,不能开始' AS [message];
RETURN;
END
SET @ = N'DesignReportTask:' + COALESCE(@ID, N'NAME:' + @);
BEGIN TRY
IF @ = 0 BEGIN TRANSACTION;
ELSE SAVE TRANSACTION @;
EXEC @ = sys.sp_getapplock
@Resource = @,
@LockMode = N'Exclusive',
@LockOwner = N'Transaction',
@LockTimeout = 10000;
IF @ < 0
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE ROLLBACK TRANSACTION @;
SELECT CAST(0 AS int) AS [result], N'开始校验繁忙,请稍后重试' AS [message];
RETURN;
END
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WITH (UPDLOCK, HOLDLOCK) WHERE [DID] = @DID)
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE ROLLBACK TRANSACTION @;
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
SELECT TOP 1
@DID = r.[DID],
@ = t.[]
FROM [dbo].[MES_设计报工_记录] AS r WITH (UPDLOCK, HOLDLOCK)
INNER JOIN [dbo].[MES_设计报工_任务] AS t ON t.[DID] = r.[DID]
WHERE r.[] IS NULL
AND (
(@ID IS NOT NULL AND ISNULL(r.[ID], N'') = @ID)
OR (@ID IS NULL AND @ IS NOT NULL AND ISNULL(r.[], N'') = @)
)
ORDER BY r.[] DESC, r.[RID] DESC;
IF @DID IS NOT NULL
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE ROLLBACK TRANSACTION @;
SELECT
CAST(0 AS int) AS [result],
N'任务 DID ' + CONVERT(nvarchar(20), @DID)
+ CASE WHEN NULLIF(@, N'') IS NULL THEN N'' ELSE N'' + @ + N'' END
+ N' 尚未关闭,请先结束该任务' AS [message],
@DID AS [DID];
RETURN;
END
INSERT INTO [dbo].[MES_设计报工_记录]([DID], [ID], [], [], [])
VALUES(@DID, @ID, @, GETDATE(), N'执行中');
SET @RID = CONVERT(int, SCOPE_IDENTITY());
UPDATE [dbo].[MES_设计报工_任务]
SET [] = N'执行中', [] = @, [] = GETDATE()
WHERE [DID] = @DID;
IF @ = 0 COMMIT TRANSACTION;
SELECT CAST(1 AS int) AS [result], N'开始成功' AS [message], @RID AS [RID];
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE IF XACT_STATE() = 1 ROLLBACK TRANSACTION @;
END
SELECT CAST(0 AS int) AS [result], ERROR_MESSAGE() AS [message];
END CATCH
END
GO
CREATE OR ALTER PROCEDURE [dbo].[_任务_结束]
@DID int,
@ID nvarchar(100) = N'',
@ nvarchar(100) = N'',
@ nvarchar(500) = N''
AS
BEGIN
SET NOCOUNT ON;
SET XACT_ABORT OFF;
DECLARE @ID nvarchar(100) = NULLIF(@ID, N'');
DECLARE @ nvarchar(100) = NULLIF(@, N'');
DECLARE @RID int;
DECLARE @ int = @@TRANCOUNT;
DECLARE @ sysname = N'DRT_Task_End';
IF @ID IS NULL AND @ IS NULL
BEGIN
SELECT CAST(0 AS int) AS [result], N'未获取到当前操作人,不能结束' AS [message];
RETURN;
END
BEGIN TRY
IF @ = 0 BEGIN TRANSACTION;
ELSE SAVE TRANSACTION @;
IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WITH (UPDLOCK, HOLDLOCK) WHERE [DID] = @DID)
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE ROLLBACK TRANSACTION @;
SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message];
RETURN;
END
SELECT TOP 1 @RID = [RID]
FROM [dbo].[MES_设计报工_记录] WITH (UPDLOCK, HOLDLOCK)
WHERE [DID] = @DID
AND [] IS NULL
AND (
(@ID IS NOT NULL AND ISNULL([ID], N'') = @ID)
OR (@ID IS NULL AND @ IS NOT NULL AND ISNULL([], N'') = @)
)
ORDER BY [] DESC, [RID] DESC;
IF @RID IS NULL
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE ROLLBACK TRANSACTION @;
SELECT CAST(0 AS int) AS [result], N'当前人员没有未结束的报工记录' AS [message];
RETURN;
END
UPDATE [dbo].[MES_设计报工_记录]
SET
[] = GETDATE(),
[] = DATEDIFF(second, [], GETDATE()),
[] = N'已结束',
[] = NULLIF(LTRIM(RTRIM(@)), N'')
WHERE [RID] = @RID;
UPDATE [dbo].[MES_设计报工_任务]
SET
[] = CASE
WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [] IS NULL) THEN N'执行中'
ELSE N'已结束'
END,
[] = @,
[] = GETDATE()
WHERE [DID] = @DID;
IF @ = 0 COMMIT TRANSACTION;
SELECT CAST(1 AS int) AS [result], N'结束成功' AS [message], @RID AS [RID];
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
BEGIN
IF @ = 0 ROLLBACK TRANSACTION;
ELSE IF XACT_STATE() = 1 ROLLBACK TRANSACTION @;
END
SELECT CAST(0 AS int) AS [result], ERROR_MESSAGE() AS [message];
END CATCH
END
GO

View File

@@ -203,6 +203,7 @@ BEGIN
p2.[],
p2.[],
p2.[],
p2.[],
p2.[],
p2.[],
ISNULL(p2.[], 0) AS [],
@@ -406,6 +407,7 @@ BEGIN
PARTITION BY
[],
CASE
WHEN [] = N'外购' THEN [] + N':' + CONVERT(nvarchar(30), [SAP行号])
WHEN ISNULL([], N'') <> N'' THEN []
ELSE [] + N':' + CONVERT(nvarchar(30), [SAP行号])
END

View File

@@ -0,0 +1,35 @@
2026年7月27日周一—— MES主页与报工优化、计划大屏梳理、装配预算扩展
一、今日完成情况
1. 08:30-09:30
修改MES主页页面补齐未配置图标的功能连接梳理动态菜单图标来源为主页大图标和左侧二级菜单建立统一的图标兜底规则保证缺失图标的功能入口均可正常显示。
2. 09:30-10:30
修复主页大图标点击后进入404的问题调整研发管理等动态菜单的路由拼接逻辑区分页面组件路径和浏览器访问路由同时优化主页图标颜色显示统一指定菜单图标的蓝色样式。
3. 10:30-11:50
完成设计工时任务报表字段配置和页面样式调整,补充任务描述筛选、调整字段及导出顺序,并实现表格内容超过三行省略、鼠标移入查看完整内容;检查计划大屏机加和装配数据,修改质检任务看板当天已完成任务的数据及样式。
4. 13:20-14:20
测试使用AI生成计划大屏说明文档生成HTML页面展示接口数据梳理页面数据来源、接口返回结构和展示方式为后续大屏验收提供说明材料。
5. 14:20-15:20
修改计划大屏设备运行状态明细的数据来源和计算方法,并生成配套说明文档;整理八个大屏需要修改的内容和文档,明确待调整项及验收范围。
6. 15:20-16:20
完善系统类装配任务和阀类装配任务界面,新增合同预算装配工时、合同预算装配进度、任务预算质检工时和任务预算质检进度字段;扩展预算保存和查询计算逻辑,支持手工输入预算工时后自动计算进度。
7. 16:20-17:20
修改加工中心和装配中心报工结束时的默认日期状态,按报工日期自动判断周六、周日并默认选择休息日,工作日默认工作日,保留法定休息日的人工选择。
8. 17:20-18:00
复查今日主页、报表、装配预算和报工状态修改结果,确认页面及数据库逻辑可用;下班后继续执行八个大屏需要修改的文档整理工作,准备明日验收。
二、明日计划
1. 08:30-09:30
验收八个大屏需要修改的内容,逐项核对数据来源、计算口径、页面展示和说明文档是否一致,整理问题清单。
2. 09:30-10:30
继续完成八个大屏验收问题的修改和回归验证,确认无误后更新上线版本,并检查接口数据和页面加载状态。
3. 10:30-11:50
梳理当前主系统中由后端查询基础数据、前端承担计算逻辑的页面,建立页面、接口、数据字段和计算规则的对应清单。
4. 13:20-14:20
分析已梳理页面的前端计算逻辑,区分可继续保留的展示计算和应下沉至后端的业务计算,明确改造优先级和影响范围。
5. 14:20-15:20
修改当前主系统中后端仅查询基础数据、前端进行业务计算的页面,按梳理结果调整接口返回和页面计算实现,并进行单页回归。
6. 15:20-16:20
继续处理主系统页面计算逻辑改造,检查计算结果、异常数据和分页筛选场景,避免前后端口径不一致。
7. 16:20-17:20
梳理生产动态页面的菜单、功能入口、操作流程和相关业务说明,明确各入口对应的用户角色、数据来源和操作顺序。
8. 17:20-18:00
搭建生产动态页面的菜单、功能入口、操作流程和相关业务说明文档,整理页面结构和后续开发、验收所需的基础材料。

View File

@@ -0,0 +1,139 @@
# MES 后台网页版功能与存储过程全量盘点
盘点日期2026-07-25 | 环境:测试数据库 YL_MESDB | 角色1
## 1. 盘点范围
- 前端源码185 个文件,其中 108 个 Vue、77 个 JS。
- 菜单84 条,其中模块 9 个、可进入页面 75 个75 个页面全部映射到源码文件。
- 前端过程调用772 次 CreateData281 个唯一字面量过程名6 次动态调用。
- 数据库对象432 个存储过程、63 张表、27 个视图。
- 数据库表达式依赖836 条,其中跨服务器依赖 75 条,跨库依赖 106 条。
## 2. 页面到过程映射
| 模块 | 页面 | 源码 | 主要操作 | 过程调用 | B1 GET/POST/PATCH | TM GET/POST/PATCH |
| --- | --- | --- | --- | --- | --- | --- |
| SystemMaintenance | 人员管理 | SystemMaintenance/PersonnelManagement/index.vue | 查询、新增、重置密码、编辑、删除、确 定、取消 | 人员管理_角色信息初始化查询_查询 , 登录基础数据_人员信息_切换是否用户 , 人员管理_人员信息查询_查询 , 人员管理_人员信息修改_编辑 , 人员管理_人员信息修改_删除 , 人员管理_人员信息新增_新增 , WEB_摄像头查看权限_查询 , WEB_登录基础数据_人员信息_重置密码 , WEB_人员设备查看权限_查询 , WEB_人员设备查看权限_权限切换 , WEB_人员摄像头查看权限_权限切换 | 0/0/0 | 0/0/0 |
| SystemMaintenance | 菜单管理 | SystemMaintenance/MenuManagement/index.vue | 取消、确定 | 菜单系统模块_项目角色_查询数据_MESWORK | 0/0/0 | 0/0/0 |
| SystemMaintenance | 角色管理 | SystemMaintenance/SystemRrolemaintenance/index.vue | 查询、新增、编辑、删除、确 定、取消 | 菜单系统模块_项目角色_查询数据_MESWORK , 菜单系统模块_项目角色_修改数据_MESWORK , 菜单系统模块_项目角色_增加_MESWORK , 菜单系统模块_项目角色_删除_MESWORK | 0/0/0 | 0/0/0 |
| PlanManagement | 机加件排产 | PlanManagement/SelfMakePlan/index.vue | 查询、批量排产、排产完成、确定、派工、计划排产、编辑、取 消 等 | 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , MES_OrderPlanned_Query , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/0/1 | 0/0/0 |
| PlanManagement | 装配件排产 | PlanManagement/InstallMakePlan/index.vue | 查询、批量排产、排产完成、确定、派工、计划排产、编辑、取 消 等 | 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , MES_OrderPlanned_Queryzp , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/1/1 | 0/0/0 |
| ProductionManagement | 生产计划跟踪 | ProductionManagement/ProductionPlanTrack/index.vue | 查询、关闭 | 加急订单_加急明细查询 , 生产管理_生产计划跟踪 , MES_OrderPlanned_DescriptionEdit , Prog_MES_LoadStations | 0/0/0 | 0/0/0 |
| ProductionManagement | 加工中心 | ProductionManagement/MachiningCenter/index.vue | 查询 --> 0 ? 'status-light-green' : 'status-light-gray' " />、取 消、确 定、上一个 下一个、删除当前记录 关闭、上一个 下一个 保存当前记录 删除当前记录 关闭、确定 关闭、查询 --> 检验详情 物料名称: 物料编码: 工序名称: 检验数量: 合格数: 不合格数: 检测详情 等 | 生产管理_加工中心_获取设备人员 , 生产管理_加工中心_获取班次信息 , 加急订单_加急明细查询 , 生产管理_获取人员绑定 , 工时校验_获取订单工序 , 工时校验_获取订单列表 , 异常工时_新增操作记录 , MES_操作记录_获取暂停状态 , MES_操作记录_获取任务暂停状态 , MES_登录_工位与名称_查询 , Prog_MES_LoadProcess , 查询字典 , 人员管理_人员信息查询_质检部门_查询 , MES_ProductTask_HelpStart , Prog_MES_GetProductOrder_byAID , MES_ProductCenter_GetTask , MES_ProductTask_WorkTimeSum , MES_ProductTask_HelpEnd , MES_ProductTask_MaterialRecieved , MES_ProductTask_Rest , 生产管理_加工中心_设备是否正在加工 , MES_ProductTask_WorkingStart , MES_ProductCenter_GetOrderTasks , 生产管理_加工中心_班次信息 , 生产管理_加工中心_开始时间 , MES_ProductTask_ProdReport , MES_ProductCenter_DoingTask , MES_QulityInspection_CheckItemData_Save , MES_QulityInspection_GetItemStandard , 加工中心_收检_读取收检记录 , MES_QulityInspection_ReceiveCheck , MES_QualityInspection_CheckRecord_Query , MES_QualityInspection_GetInspectionParts , MES_QualityInspection_GetInspectionDetails , 加工中心_异常工时_获取操作记录列表 , 加工中心_修改工时_保存修改记录 , sp_获取最近处理任务 , 人员管理_人员信息查询 , sp_获取我的流程 , sp_获取待处理任务 , MES_ProductAdmin_Query , sp_创建流程_简化版 , sp_处理审批 , sp_转办流程 , sp_完成流程 , sp_获取流程详情 , 生产管理_加工中心_生产发料查询 , 生产管理_加工中心_领料物料查询 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 生产管理_加工中心_退库 | 1/0/0 | 0/2/0 |
| ProcessManagement | 工序管理 | ProcessManagement/ProcedureManagement/index.vue | 新增工艺、确 定 | MES_ProcessManagement_ProcessGet , MES_ProcessManagement_ProcessAdd , MES_ProcessManagement_ProcessEdit , MES_ProcessManagement_Processdel | 1/1/1 | 0/0/0 |
| ProcessManagement | 制定标准工艺 | ProcessManagement/ProcessesDevelop/index.vue | 查询、拷贝、图纸、已保存、保存、导出、确定 | 工艺管理_获取物料原料信息 , 设备管理_设备信息_查询 , 工艺管理_生产计划物料查询 , 工艺管理_生产工艺_生产工艺拷贝 , 工艺管理_生产工艺_标准工艺拷贝 , MES_ProcessManagement_ProcessBindGet , 工艺管理_制定标准工艺_拷贝生产工艺 , MES_ProcessManagement_ProcessGet , 工艺管理_制定标准工艺_拷贝工艺保存 , 工艺管理_工艺维护_查看图纸 , 车间生产管理工艺_零件工序_修改数据_工艺库 , 车间生产管理工艺_零件工序_查询工序信息_工艺库 , 车间生产管理工艺_零件工序_编辑_工艺库 , 车间生产管理工艺_零件工序_编辑插入行 , 车间生产管理工艺_零件工序_删除工序_工艺库 , 车间生产管理工艺_零件工序_上移工序_工艺库 , 车间生产管理工艺_零件工序_下移工序_工艺库 , 车间生产管理工艺_零件工序_插入工序_工艺库 , 车间生产管理工艺_零件工序_启用 | 0/0/0 | 0/0/0 |
| DeviceManagement | 设备信息维护 | DeviceManagement/DeviceInformation/index.vue | 查询、设备、小时 取消、确定 | 查询字典 , MES_登录_工位与名称_查询 , 设备管理_设备信息_查询 , 设备管理_设备信息_增加 , 设备管理_设备信息_编辑 , 设备管理_设备信息_删除 | 0/0/0 | 0/0/0 |
| ProcessManagement | 生产工艺 | ProcessManagement/ProcessProduct/index.vue | 查询、批量生成生产工艺、编辑工艺、拷贝、零件图纸、工艺图纸、保存为标准工艺、下发任务 等 | 工艺管理_获取物料原料信息 , 工艺管理_生产工艺_查询生产工艺 , 工艺管理_生产工艺_工艺拷贝 , 工艺管理_生产工艺_生产工艺拷贝 , 工艺管理_生产工艺_标准工艺拷贝 , 计划排产_生产订单_订单查询 , 计划排产_生产订单_订单任务_生产工艺任务下发 , 计划排产_生产订单_订单任务_单条生产工艺任务下发 , 工艺管理_零件工序_生产工艺_批量生成生产工艺 , 设备管理_设备信息_查询 , MES_ProcessManagement_ProcessBindGet , 工艺管理_制定标准工艺_拷贝生产工艺 , MES_ProcessManagement_ProcessGet , 车间生产管理工艺_零件工序_保存为标准工艺 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 工艺管理_零件工序_生产工艺_修改数据 , 工艺管理_零件工序_生产工艺_编辑 , 工艺管理_零件工序_生产工艺_编辑插入工序 , 工艺管理_零件工序_生产工艺_删除工序 , 工艺管理_零件工序_生产工艺_上移工序 , 工艺管理_零件工序_生产工艺_下移工序 , 工艺管理_零件工序_生产工艺_插入工序 , 工艺管理_生产工艺_启用 | 0/0/0 | 0/0/0 |
| ProductionManagement | 过程异常管控 | ProductionManagement/AbnormalControl/index.vue | | | 0/0/0 | 0/0/0 |
| ProcessManagement | 工艺查询 | ProcessManagement/ProcessInquiry/index.vue | 查询、打印 | 工艺管理_获取物料原料信息 , MES_ProcessManagement_PartGet , 工艺管理_工艺查询_查询生产工艺 , 工艺管理_工艺查询_更新打印次数 | 0/0/0 | 0/0/0 |
| ProcessManagement | 工艺任务 | ProcessManagement/ProductionOrder/index.vue | 查询、批量生成任务、查看生产工艺、查看标准工艺 | 设备管理_设备信息_查询 , 工艺管理_生产工艺_查询生产工艺 , 工艺管理_生产工艺_查询标准工艺 , 工艺管理_工艺任务_订单查询 , 计划排产_生产订单_订单任务 | 0/0/0 | 0/0/0 |
| ProcessManagement | 图纸维护 | ProcessManagement/PartDrawing/index.vue | 查询、零件图、选零件上传零件图、查看删除记录、查看、删除、取消、确定 等 | 工艺管理_图纸维护_查询删除记录 , 工艺管理_图纸维护_零件图查询 , 工艺管理_图纸维护_物料查询 , 工艺管理_图纸维护_验证名称 , 工艺管理_图纸维护_查看图纸 , 工艺管理_图纸维护_删除图纸 | 0/0/0 | 0/0/0 |
| ProductionManagement | 工时校验 | ProductionManagement/WorkHoursCheck/index.vue | 查询、一键校验、直接校验、新增工时记录、设备工时、关闭、确 定、取消 | usp_BatchValidateWorkTime , usp_ValidateWorkTime , 人员管理_人员信息查询_质检部门_查询 , 系统管理_人员管理_所有有效人员查询 , 工时校验_获取订单列表 , 工时校验_获取订单工序 , 工时校验_获取昨日之前操作记录列表 , 工时校验_获取资源 , 工时校验_获取设备数据 , 工时校验_保存校验记录 , 工时校验_批量保存校验记录 , 工时校验_新增操作记录 | 3/1/2 | 0/0/0 |
| ProcessManagement | 工艺维护 | ProcessManagement/ProcessDrawing/index.vue | 查询、工艺图、选零件上传工艺图、选订单上传工艺图、查看、删除、取消、确定 | 工艺管理_工艺维护_工艺图查询 , 工艺管理_图纸维护_物料查询 , 工艺管理_工艺维护_验证名称 , 工艺管理_工艺维护_查看图纸 , 工艺管理_工艺维护_删除图纸 , 工艺管理_图纸维护_查看图纸 | 0/0/0 | 0/0/0 |
| QualityManagement | 终检 | QualityManagement/CheckTask/final.vue | 查询、导出 --> -->、终检 终检记录 加急明细 --> 物料名称 销售订单 零件编码 生产订单 工序名称 已检测数量 检测数量 合格数 不合格数 --> 检验人 检验时间 放行数量 检测说明、取 消、关闭 | 加急订单_加急明细查询 , 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_质量检验_终检数据_查询 , 质量管理_质量检验_终检记录_查询 , MES_QulityInspection_FinalCheck , 工时校验_获取工序和指派对象 | 1/0/1 | 0/0/0 |
| QualityManagement | 采购入库检 | QualityManagement/CheckTask/purchaseIncoming.vue | 查询、入库检 图纸 物料名称 物料编码 生产订单 到货总数 已检验数量 剩余待检数量 本次检验数量 合格数 (自动计算: ) --> 不合格数 检验人 检验时间 放行数量 检测说明 确 定、取 消、关闭 | 加急订单_加急明细查询 , 工艺管理_图纸维护_查看图纸 , 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_质量检验_入库质检任务_查询 , 质量管理_来料检验_更新 | 0/0/0 | 0/0/0 |
| QualityManagement | 销售退货检 | QualityManagement/CheckTask/salesReturn.vue | 查询、导出 --> --> 退货检 零件图纸 工艺图纸、确 定、取 消 | 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_质量检验_退货质检任务_查询 , 质量管理_销售退货检_更新 | 0/0/0 | 0/1/0 |
| QualityManagement | 原材料退库检 | QualityManagement/CheckTask/materialReturn.vue | 查询、扫码、导出 --> 退库检 物料名称 物料编码 生产订单 到货数 送检数量 合格数 不合格数 检验人 检验时间 放行数量 检测说明 确 定、取 消 | 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_原材料退库_查询 , 质量管理_原材料退库检验_更新 | 1/0/0 | 0/1/0 |
| QualityManagement | 序检收检 | QualityManagement/CheckTask/processReceive.vue | 查询、导出 -->、收检 零件图纸 工艺图纸 物料名称 销售订单 物料编码 生产订单 工序名称 完成数量 送检数量 --> 合格数 不合格数 检验人 检验时间 放行数量 检测说明 确 定、取 消、关闭 | 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 加急订单_加急明细查询 , 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_质量检验_收检记录_查询 , 质量管理_序检收检_新增 | 0/4/0 | 0/0/0 |
| SystemMaintenance | 工位管理 | SystemMaintenance/WorkstationManagement/index.vue | 查询、新增、编辑、删除、确 定、取消 | MES_登录_工位与名称_查询 , 系统管理_工位管理_工位信息修改 , 系统管理_工位管理_工位信息增加 , 系统管理_工位管理_工位信息删除 | 0/1/1 | 0/0/0 |
| ProductionManagement | 外协管理 | ProductionManagement/OutsourceMange/index.vue | 查询 派工并同步SAP、打印、发料、收货、编辑、历史记录、查看图纸、工艺图纸 等 | 生产管理_外协管理_外协历史查询 , 计划排产_派工 , 生产管理_外协管理_更新打印次数 , 生产管理_外协管理_更新备注 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 生产管理_外协管理_查询外协全部 , 生产管理_外协管理_外协发料查询 , 生产管理_外协管理_外协发料保存 , 生产管理_外协管理_外协收料保存 | 0/1/0 | 0/0/0 |
| QualityManagement | 质量检验标准 | QualityManagement/QualityStandardQuery/index.vue | 查询 新增标准 修改 删除 确定 取 消、确定 取 消 | MES_ProcessManagement_PartGet , Prog_MES_LoadProcess , 查询字典 , 质量管理_检验标准表_新增 , 质量管理_检验标准表_查询 , 质量管理_检验标准表_修改 , 质量管理_检验标准表_删除 | 0/0/0 | 0/0/0 |
| ProductionManagement | 人员绑定 | ProductionManagement/PersonnelBinding/index.vue | 查询、绑定人员、确 定、取 消 | MES_登录_工位与名称_查询 , 系统管理_人员管理_所有有效人员查询 , 系统管理_工位管理_工位绑定人员查询 , 系统管理_工位管理_工位绑定人员保存 | 0/0/0 | 0/0/0 |
| ProductionManagement | 装配中心 | ProductionManagement/AssemblyCenter/index.vue | 查询 --> 缺料、上一个 下一个、删除当前记录 关闭、上一个 下一个 保存当前记录 删除当前记录 关闭、确定 关闭、取 消、确 定、新增异常工时 等 | 生产管理_获取人员绑定 , 加急订单_加急明细查询 , MES_人员工时记录_获取进行中任务2 , MES_人员工时记录_获取进行中任务 , 工时校验_获取订单列表 , 异常工时_新增操作记录 , 工时校验_获取订单工序 , MES_登录_工位与名称_查询 , Prog_MES_LoadProcess , MES_ProductCenter_GetTask_zp , MES_ProductTask_WorkTimeSum , 生产管理_装配中心_缺料查询 , MES_人员工时记录_开始 , MES_人员工时记录_结束 , MES_ProductTask_Rest , MES_ProductTask_SendInspection , 加工中心_收检_读取收检记录 , MES_QulityInspection_ReceiveCheck , 加工中心_异常工时_获取操作记录列表 , 加工中心_修改工时_保存修改记录 , 生产管理_加工中心_生产发料查询 , 生产管理_加工中心_领料物料查询 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 生产管理_加工中心_退库 , Prog_MES_GetProductOrder_byAID , MES_QulityInspection_CheckItemData_Save , MES_QulityInspection_GetItemStandard | 1/0/0 | 0/1/0 |
| ProductionManagement | 班次管理 | ProductionManagement/ShiftManagement/index.vue | 添加新班次、编辑、保存、取消、绑定、删除、确 定、取 消 | 生产管理_班次管理_班次列表查询 , 系统管理_人员管理_所有有效人员查询 , 生产管理_班次管理_班次绑定人员查询 , 生产管理_班次管理_班次保存 , 生产管理_班次管理_班次删除 , 生产管理_班次管理_班次绑定人员保存 | 0/0/0 | 0/0/0 |
| QualityManagement | 其他入库检 | QualityManagement/CheckTask/OtherInbound.vue | 查询、导出 --> --> 入库检 零件图纸 工艺图纸 物料名称 物料编码 生产订单 采购数 送检数量 合格数 不合格数 检验人 检验时间 放行数量 检测说明 确 定、取 消 | 查询字典 , 人员管理_人员信息查询_质检部门_查询 , 质量管理_其他入库_查询 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 质量管理_其他入库检验_更新 | 0/0/0 | 0/0/0 |
| PlanManagement | 机加件已排产 | PlanManagement/SelfMakePlandone/index.vue | 查询、确定、查看、派工、编辑、取 消、确 定 | 设备管理_设备状态_查询 , 工艺管理_获取物料原料信息 , 生产管理_结算工时_查询 , 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , 机加已排产_获取任务列表 , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , 计划排产_外协分组 , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/0/1 | 0/0/0 |
| PlanManagement | 机加件未排产 | PlanManagement/SelfMakePlando/index.vue | 查询、批量排产、排产完成、确定、查看、零件图纸、工艺图纸、编辑 等 | 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 工艺管理_获取物料原料信息 , 生产管理_结算工时_查询 , 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , MES_OrderPlanned_Query , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , 计划排产_外协分组 , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/0/1 | 0/0/0 |
| DeviceManagement | 设备数据 | DeviceManagement/Devicedata/index.vue | 查询、导出 | MES_登录_工位与名称_查询 , 设备管理_设备数据查询 | 0/0/0 | 0/0/0 |
| SaleManagement | 销售订单状态 | SaleManagement/saleorderstatus/index.vue | 查询、缺料、关闭 | 生产管理_装配中心_缺料查询 , 销售管理_销售订单状态 , MES_OrderPlanned_DescriptionEdit , Prog_MES_LoadStations | 0/0/0 | 0/0/0 |
| PlanManagement | 优先装配 | PlanManagement/priorityinstall/index.vue | 查询、月、周、日、今天 | MES_OrderPlanned_Queryzp , MES_OrderPlanned_EditTaskPlanned | 0/0/0 | 0/0/0 |
| ProcessManagement | 查看图纸 | ProcessManagement/PartDrawlook/index.vue | 查询、查看、删除、取消、确定、关闭 | 工艺管理_图纸维护_查询删除记录 , 工艺管理_图纸维护_零件图查询全部 , 工艺管理_图纸维护_物料查询 , 工艺管理_图纸维护_验证名称 , 工艺管理_图纸维护_查看图纸 , 工艺管理_图纸维护_删除图纸 | 0/0/0 | 0/0/0 |
| PlanManagement | 计划用表 | PlanManagement/PlanShell/index.vue | 查询、缺料、关闭 | 生产管理_装配中心_缺料查询 , 计划排产_查询计划信息 , MES_OrderPlanned_DescriptionEdit , Prog_MES_LoadStations | 0/0/0 | 0/0/0 |
| ProductionManagement | 工时报表 | ProductionManagement/Timesheet/index.vue | 查询、Excel导出 | 工时统计_项目工时_查询 , 工时统计_作业者工时_查询 , 工时统计_设备工时_查询 , 工时统计_任务工时_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 加急件管理 | ProductionManagement/Urgent/index.vue | 查询、转至 完成 加急明细 --> 生产订单 加急数量 物料编号 关闭 | 加急订单_加急明细查询 , 生产管理_加急件管理查询 , 生产管理_加急件管理_更新转至 , 生产管理_加急件管理_更新完成 | 0/0/0 | 0/0/0 |
| ProductionManagement | 拣配任务 | ProductionManagement/PickingTask/index.vue | 查询、转至 完成 --> 生产订单 加急数量 物料编号 关闭 | 加急订单_加急明细查询 , 生产管理_拣配任务_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 采购外协管理 | ProductionManagement/SaleOutsourceMange/index.vue | 查询 派工并同步SAP、打印、发料、收货、更新、编辑、历史记录、查看图纸 等 | 计划排产_重置派工状态 , 生产管理_外协管理_外协历史查询 , 计划排产_派工 , 生产管理_外协管理_更新打印次数 , 生产管理_外协管理_更新备注 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 生产管理_外协管理_查询外协 , 生产管理_外协管理_外协发料查询 , 生产管理_外协管理_查询外协历史记录 , 生产管理_外协管理_查询质检记录 , 生产管理_外协管理_外协发料保存 , 生产管理_外协管理_外协收料保存 | 0/1/0 | 0/0/0 |
| PlanManagement | 装配未排产 | PlanManagement/InstallMakePlanDo/index.vue | 查询、批量排产、排产完成、确定、派工、计划排产、编辑、取 消 等 | 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , MES_OrderPlanned_Queryzp , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/1/1 | 0/0/0 |
| ProductionManagement | 工时查询 | ProductionManagement/Workhours/index.vue | 查询 | 生产管理_工时查询_工序工时_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 结算工时 | ProductionManagement/SettlementWorkhours/index.vue | 查询、导出 | 生产管理_结算工时_查询 | 0/0/0 | 0/0/0 |
| ProcessManagement | 采购图纸查询 | ProcessManagement/ProcurementDrawlook/index.vue | 查询、查看、删除、取消、确定、关闭 | 工艺管理_图纸维护_查询删除记录 , 工艺管理_图纸维护_零件图查询采购 , 工艺管理_图纸维护_物料查询_采购 , 工艺管理_图纸维护_验证名称 , 工艺管理_图纸维护_查看图纸 , 工艺管理_图纸维护_删除图纸 | 0/0/0 | 0/0/0 |
| ProductionManagement | 机加正在进行中 | ProductionManagement/DeviceStatus/index.vue | 查询 | MES_登录_工位与名称_查询 , 设备管理_设备状态_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 装配状态 | ProductionManagement/AssembleStatus/index.vue | 查询 | 人员管理_人员信息查询_质检部门_查询 , MES_登录_工位与名称_查询 , 生产管理_装配状态_获取进行中任务 | 0/0/0 | 0/0/0 |
| PlanManagement | 生产订单关闭 | PlanManagement/PlannOrderClose/index.vue | 查询、批量确认、批量关闭、确认、关闭 | 计划排产_生产订单关闭_查询全部订单 , 计划排产_生产订单关闭_确认订单 , 计划排产_生产订单关闭_关闭订单 | 0/0/1 | 0/0/0 |
| QualityManagement | 质检明细 | QualityManagement/QualityDetails/index.vue | 查询、Excel导出 | 质量管理_质检明细_导出 , 系统管理_人员管理_所有有效人员查询 , 工时校验_获取订单列表 , 工时校验_获取订单工序 , 质量管理_质检明细_查询 | 0/0/0 | 0/0/0 |
| QualityManagement | 不合格品处置 | QualityManagement/Unqualified/index.vue | 查询、Excel导出、打印 | 人员管理_人员信息查询_质检部门_查询 , 质量管理_不合格品处置_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 外协报表 | ProductionManagement/OutsourceSheet/index.vue | 查询、Excel导出 | 生产管理_外协报表_导出 , 系统管理_人员管理_所有有效人员查询 , 工时校验_获取订单列表 , 工时校验_获取订单工序 , 生产管理_外协报表_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 工时修正 | ProductionManagement/WorkhoursEdit/index.vue | 查询、新增工时记录、设备工时、关闭、确 定、取消 | 人员管理_人员信息查询_质检部门_查询 , 系统管理_人员管理_所有有效人员查询 , 工时校验_获取订单列表 , 工时校验_获取订单工序 , 工时校验_获取操作记录列表 , 工时校验_获取设备数据 , 工时校验_保存校验记录 , 工时校验_新增操作记录 | 0/0/0 | 0/0/0 |
| QualityManagement | 质检报工 | QualityManagement/QualityCenter/index.vue | 查询 --> --> 缺料、上一个 下一个、删除当前记录 关闭、上一个 下一个 保存当前记录 删除当前记录 关闭、确定 关闭、取 消、确 定、新增异常工时 等 | 生产管理_获取人员绑定 , 加急订单_加急明细查询 , MES_人员工时记录_获取进行中任务2 , MES_人员工时记录_获取进行中任务 , 工时校验_获取订单列表 , 异常工时_新增操作记录 , 工时校验_获取订单工序 , MES_登录_工位与名称_查询 , Prog_MES_LoadProcess , 质量管理_质检报工_任务查询 , MES_ProductTask_WorkTimeSum , 生产管理_装配中心_缺料查询 , MES_人员工时记录_开始 , 生产管理_加工中心_班次信息 , 生产管理_加工中心_自动加班 , MES_人员工时记录_结束 , MES_ProductTask_Rest , MES_ProductTask_SendInspection , 加工中心_收检_读取收检记录 , MES_QulityInspection_ReceiveCheck , 加工中心_异常工时_获取操作记录列表 , 加工中心_修改工时_保存修改记录 , 生产管理_加工中心_生产发料查询 , 生产管理_加工中心_领料物料查询 , 工艺管理_图纸维护_查看图纸 , 工艺管理_工艺维护_查看图纸 , 生产管理_加工中心_退库 , Prog_MES_GetProductOrder_byAID , MES_QulityInspection_CheckItemData_Save , MES_QulityInspection_GetItemStandard | 1/0/0 | 0/1/0 |
| AnomalousManagement | 机加及时开工 | AnomalousManagement/PunctualWork/index.vue | 查询 0 ? 'status-light-green' : 'status-light-gray' " /> --> | 异常提醒_及时开工_查询 , MES_登录_工位与名称_查询 , Prog_MES_LoadProcess , 查询字典 | 0/0/0 | 0/0/0 |
| DeviceManagement | 设备历史数据 | DeviceManagement/DeviceDataHistory/index.vue | 查询、导出 | MES_登录_工位与名称_查询 , 设备管理_设备数据_历史查询 | 0/0/0 | 0/0/0 |
| DeviceManagement | 实时数据 | DeviceManagement/DeviceRealData/index.vue | 查询、0" type="text" size="mini" icon="el-icon-search" style="width: 20px" @click="handleSearch(scope.row)"/> 订单编号: 查询 | 设备管理_设备数据_工位信息_查询 , 设备管理_设备数据_统计数据查询 , 设备管理_设备数据_统计数据查询_通过类型 | 0/0/0 | 0/0/0 |
| SystemMaintenance | 报工操作记录 | SystemMaintenance/OperationLog/index.vue | 查询 | 系统管理_报工操作记录_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 物料机器人 | ProductionManagement/AGVtask/index.vue | 生成任务、刷新实时、历史记录、点位管理、开始、暂停、取消、新增点位 等 | 生产管理_物料机器人_点位查询 , 生产管理_物料机器人_修改点位 , 生产管理_物料机器人_新增点位 , 生产管理_物料机器人_删除点位 , 生产管理_物料机器人_物料查询 , 生产管理_物料机器人_创建任务 , 生产管理_物料机器人_查询实时数据 , 生产管理_物料机器人_更新任务状态 , 生产管理_物料机器人_完成任务 , 生产管理_物料机器人_查询历史数据 | 0/0/0 | 0/0/0 |
| AnomalousManagement | 外协及时开工 | AnomalousManagement/OutPunctualWork/index.vue | | 异常提醒_外协及时开工_查询 | 0/0/0 | 0/0/0 |
| AnomalousManagement | 加急任务列表 | AnomalousManagement/UrgentTask/index.vue | 查询、关闭 | 加急订单_加急明细查询 , 生产管理_生产计划跟踪 , MES_OrderPlanned_DescriptionEdit , Prog_MES_LoadStations | 0/0/0 | 0/0/0 |
| PlanManagement | 工位任务汇总 | PlanManagement/WorkstationPlan/index.vue | 查询、原料、编辑、取 消、确 定、报工、辅助 | 设备管理_设备状态_查询 , 生产管理_结算工时_查询 , MES_OrderPlanned_EditTaskPlanned , 工艺管理_获取物料原料信息 , 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , 机加已排产_获取任务列表 , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , 计划排产_外协分组 , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/0/1 | 0/0/0 |
| PlanManagement | 装配已排产 | PlanManagement/InstallMakePlanDone/index.vue | 查询、确定、派工、编辑、取 消、确 定 | 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , MES_OrderPlanned_Queryzp , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/1/1 | 0/0/0 |
| PlanManagement | 系统类装配任务 | PlanManagement/SystemInstallTask/index.vue | 查询、Excel导出、编辑、确定、派工、取 消、确 定 | 计划排产_系统类任务查询_导出 , 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , 计划排产_装配任务预算_保存 , 计划排产_系统类任务查询 , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_系统类装配任务_修改钣金预达时间 , 计划排产_系统类装配任务_修改预计送检日期 , 计划排产_系统类装配任务_修改销售要求日期 , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/1/1 | 0/0/0 |
| PlanManagement | 阀类装配任务 | PlanManagement/ValueInstallTask/index.vue | 查询、Excel导出、编辑、确定、派工、取 消、确 定 | 计划排产_阀类任务查询_导出 , 计划排产_生产订单_已排产订单查询 , MES_登录_工位与名称_查询 , 计划排产_装配任务预算_保存 , 计划排产_阀类任务查询 , Prog_MES_LoadStations , 系统管理_人员管理_所有有效人员查询 , MES_OrderPlanned_EditTaskPlanned , 计划排产_阀类装配任务_修改预计送检日期 , 计划排产_阀类装配任务_修改销售要求日期 , 计划排产_二次派工 , 计划排产_派工 , MES_OrderPlanned_SingleTaskPlanned , MES_OrderPlanned_Finish , MES_OrderPlanned_DescriptionEdit , 计划排产_自制件_日程时间修改 | 0/1/1 | 0/0/0 |
| QualityManagement | 测试装配任务 | QualityManagement/TestAssemblyTask/index.vue | 查询、导出 | 质量管理_测试装配任务_查询 | 0/0/0 | 0/0/0 |
| AnomalousManagement | 装配及时送检 | AnomalousManagement/AssemblyPunctualInspection/index.vue | 查询、导出 | 异常提醒_装配及时送检_查询 | 0/0/0 | 0/0/0 |
| QualityManagement | 及时检验报表 | QualityManagement/CheckTask/punctualInspection.vue | 查询 | 人员管理_人员信息查询_质检部门_查询 , 质量管理_及时检验报表_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 手续确认报表 | ProductionManagement/FormalityConfirmReport/index.vue | 查询、已完成 | 生产管理_手续确认报表_查询 , 生产管理_手续确认报表_确认 | 0/0/0 | 0/0/0 |
| ProductionManagement | 发货通知列表 | ProductionManagement/DeliveryNoticeList/index.vue | 查询 | 装配中心任务看板_发货状态查询 | 0/0/0 | 0/0/0 |
| PlanManagement | 及时齐套跟踪结果 | PlanManagement/TimelyKitTrackingResult/index.vue | 查询 | 生产管理_及时齐套跟踪结果_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 产品合格率(工位) | ProductionManagement/ProductPassRateWorkstation/index.vue | 查询、导出 | 生产管理_产品合格率工位_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 设计任务 | ProductionManagement/DesignReportTask/Task/index.vue | 查询、新建、编辑、完成、领导批示、更多、取消、保存 | 设计报工_任务_查询 , 设计报工_任务说明_新增 , 设计报工_领导批示权限_查询 , 设计报工_任务_删除 , 设计报工_项目查询 , 设计报工_物料查询 , 设计报工_人员查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 设计报工 | ProductionManagement/DesignReportTask/Report/index.vue | 查询、开始、结束、领导批示、更多、取消、确认、保存 | 设计报工_任务_查询 , 设计报工_项目查询 , 设计报工_物料查询 , 设计报工_领导批示权限_查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 设计工时校验 | ProductionManagement/DesignReportTask/Check/index.vue | 查询、批量校验、取消、保存校验 | 设计报工_工时校验_查询 , 设计报工_项目查询 , 设计报工_物料查询 , 设计报工_工时校验_保存 , 设计报工_工时校验_批量保存 | 0/0/0 | 0/0/0 |
| ProductionManagement | 设计工时报表 | ProductionManagement/DesignReportTask/HoursReport/index.vue | 查询、导出 | 设计报工_项目查询 , 设计报工_物料查询 | 0/0/0 | 0/0/0 |
| ProductionManagement | 研发财务工时 | ProductionManagement/DesignReportTask/FinancialHours/index.vue | 查询、导出 | 设计报工_研发财务工时_查询 , 设计报工_项目查询 , 设计报工_物料查询 | 0/0/0 | 0/0/0 |
## 3. 前端调用与数据库差异
前端字面量调用但测试库找不到同名过程共 **14** 个。该结果可能由测试库版本差异、动态接口、历史页面或过程名称变更造成,必须逐项确认:
- 查询零件号:调用次数 1来源 src/views/QualityManagement/QualityStandardQuery/index copy.vue
- 产品关系_变更节点排序调用次数 1来源 src/views/CraftManagement/CraftMaintain/index.vue
- 登录基础数据_人员信息_切换是否用户调用次数 1来源 src/views/SystemMaintenance/PersonnelManagement/index.vue
- Prog_MES_SingleTaskPlanned调用次数 1来源 src/views/ProductionManagement/ProductionTaskManage/index.vue
- WEB_报警查询_未读报警记录_查询调用次数 1来源 src/views/layout/components/Navbar.vue
- WEB_报警查询_未读报警记录_未读条数查询调用次数 1来源 src/views/layout/components/Navbar.vue
- WEB_基本表_产品结构_查询调用次数 1来源 src/views/CraftManagement/CraftMaintain/index.vue
- WEB_基本表_产品结构_删除调用次数 1来源 src/views/CraftManagement/CraftMaintain/index.vue
- WEB_基本表_产品结构_新增调用次数 1来源 src/views/CraftManagement/CraftMaintain/index.vue
- WEB_基本表_产品结构_修改调用次数 1来源 src/views/CraftManagement/CraftMaintain/index.vue
- WEB_人员设备查看权限_查询调用次数 1来源 src/views/SystemMaintenance/PersonnelManagement/index.vue
- WEB_人员设备查看权限_权限切换调用次数 1来源 src/views/SystemMaintenance/PersonnelManagement/index.vue
- WEB_人员摄像头查看权限_权限切换调用次数 1来源 src/views/SystemMaintenance/PersonnelManagement/index.vue
- WEB_摄像头查看权限_查询调用次数 1来源 src/views/SystemMaintenance/PersonnelManagement/index.vue
数据库中有 165 个过程未被静态前端直接调用。它们可能由事件、定时任务、接口内部调用、其他客户端、历史菜单或后台作业使用,不能仅凭静态未引用判定为废弃。
## 4. 过程风险分类
- 过程总数432。
- 定义中出现 INSERT/UPDATE/DELETE/MERGE 等明显写关键字187 个。
- 明确包含 OPENQUERY、[SAP] 或现场 SAP 交货表引用7 个。
- 写过程必须按业务数据、权限、事务、回滚和审计要求单独验收;外部依赖过程必须在现场连接可用时再做联调。
## 5. 新需求定位路径
1. 从菜单路径定位 `src/views/<模块>/<页面>/index.vue`
2. 在页面中搜索 `CreateData`记录过程名、type、参数名和调用前后的页面状态。
3.`work/database_procedure_inventory_20260725.csv` 查过程参数数量、写入特征和外部依赖。
4. 如果过程不存在,先确认测试库与发布物版本,再决定补过程、改过程名映射还是修复页面。
5. 变更必须配套前置校验、事务、验证 SQL、回滚脚本、页面回归和手册更新。
## 6. 原始清单
- `work/menu_inventory_role1.csv`:角色菜单清单。
- `work/page_ui_inventory_role1_20260725.csv`:页面按钮、字段、方法和过程清单。
- `work/frontend_procedure_call_inventory_20260725.csv`:前端过程调用清单。
- `work/database_procedure_inventory_20260725.csv`:测试库全部过程清单。
- `work/database_procedure_parameters_20260725.csv`:全部过程参数清单。
- `work/database_table_columns_20260725.csv``work/database_view_columns_20260725.csv`:表和视图字段清单。
- `work/database_expression_dependencies_20260725.csv`:过程、视图、约束等表达式依赖清单。
- `work/frontend_calls_missing_db_procedure_20260725.csv`:前端调用缺失过程清单。
- `work/database_procedures_unused_by_static_frontend_20260725.csv`:数据库未被静态前端调用清单。

View File

@@ -0,0 +1,496 @@
# MES 测试环境接管基线
文档版本V1.3
基线日期2026-07-25
适用项目:`MES_Manage_View_V20`
接管环境:测试环境
文档状态:已建立,后续按验证进度持续更新
## 1. 基线结论
当前测试环境已完成前端、MES 接口、数据库、只读外部集成和恢复演练的受控接管,可作为后续生产接管的演练环境。核心后端按现有发布物维护,不把缺少原始源码列为当前接管阻断项;涉及 DLL 逻辑修改时仍需单独评估。
| 领域 | 状态 | 结论 |
| --- | --- | --- |
| 前端代码/部署 | 已接管 | 构建通过,测试前端已部署到 IIS `10012` |
| MES 通用接口 | 已验证 | HTTPS 接口可访问,登录、菜单和只读过程调用成功 |
| 测试数据库 | 已验证 | SQL Server 可连接,`YL_MESDB` 在线且对象可读 |
| MES 应用账号 | 已验证 | 测试超级管理员账号可登录,角色和菜单加载成功 |
| B1 集成 | 只读接管 | 通过管理机 VPN 访问现场代理,登录代理与语义 GET 可用POST/PATCH 被测试前端阻止 |
| TM 集成 | 受限只读 | 现场代理端口可达;当前前端只有库存任务 POST 调用,测试环境全部阻止,尚无明确 GET 验收端点 |
| 数据库版本一致性 | 关键项已同步 | 装配任务查询、索引、合同工时和预算进度相关变更已同步,完整对象差异仍需持续维护 |
| 测试账号权限 | 部分整改 | 已创建 `meswork_readonly` 只读账号,原 `meswork` 仍为 `dbo/sysadmin` |
| 配置隔离 | 已验证 | 测试 `dist/static/config.js` 独立指向测试 MES并启用 B1/TM 只读保护 |
| 接口服务源码/部署 | 发布物接管 | IIS、部署目录、配置和脱敏快照已归档按约定不修改核心 DLL无原始源码不阻断当前运维接管 |
接管判定:**有条件接管**。
- 可以开展代码分析、只读诊断、菜单与权限核对、MES 查询流程测试、SQL 修复脚本编写、测试环境受控变更。
- 暂不可开展B1/TM 真实联调、生产等价验收、未经审批的数据库写入、完整灾备恢复演练。
V1.2 增量状态WinRM HTTPS 已接通并完成 IIS/后端只读盘点;部署快照已脱敏归档,数据库备份历史已核对,但核心 DLL 原始源码和恢复演练仍未完成。
## 2. 基线范围
本基线覆盖:
- Vue 主系统代码、构建配置和运行时配置。
- MES 统一接口 `MESCommonBase.ashx`
- 测试服务器 IIS 站点、应用池、证书、日志和接口部署目录。
- 测试 SQL Server 中的 `YL_MESDB`
- MES 应用登录、角色菜单和通用存储过程查询。
- B1/TM 网络可用性及前端依赖范围。
- 正式库与测试库部分关键对象的定义一致性。
- 接管安全规则、变更规则、已知限制和后续任务。
本基线不包含明文密码、数据库连接口令、Token 或生产业务数据。
## 3. 代码基线
### 3.1 版本信息
| 项目 | 当前值 |
| --- | --- |
| 仓库目录 | `C:\WorkYuanLy\MES_Manage_View_V20` |
| 当前分支 | `snapshot/local-save-20260625-154806` |
| 当前提交 | `62f7632fc6708a8dcb25934c463d18520d9619de` |
| 提交时间 | 2026-07-24 14:59:37 +08:00 |
| 提交说明 | `feat: 完善设计报工与研发工时功能` |
| Node.js | v20.14.0 |
| npm | 10.7.0 |
| 应用版本 | 1.1.0 |
当前工作区存在未提交文档、数据库脚本和工作目录。接管期间不得清理或覆盖来源不明的现有变更;正式发布前应建立明确的发布分支和提交边界。
### 3.2 技术栈
| 层级 | 技术 |
| --- | --- |
| 前端框架 | Vue 2.7.16 |
| 路由 | Vue Router 3.6.5,数据库菜单动态生成路由 |
| 状态管理 | Vuex 3.6.2 |
| UI | Element UI 2.15.14 |
| HTTP | Axios 0.21.4 |
| 构建 | Webpack 5.103.0 |
| 数据库 | SQL Server 2019 |
| 业务接口 | ASP.NET `.ashx` 统一存储过程网关 |
| 外部集成 | SAP B1 代理、TM/OpenAPI、文件服务、设备/MQTT |
### 3.3 前端规模
| 指标 | 数量 |
| --- | ---: |
| `src/views` 下 Vue 文件 | 99 |
| `src` 下 JavaScript 文件 | 77 |
| `CreateData` 调用 | 770 |
| 可静态识别的字面量过程调用 | 724 |
| 可静态识别的唯一过程名 | 219 |
业务模块页面分布:
| 模块 | Vue 文件数 |
| --- | ---: |
| 生产管理 | 36 |
| 质量管理 | 15 |
| 计划排产 | 13 |
| 工艺管理 | 9 |
| 系统管理 | 6 |
| 异常管理 | 4 |
| 设备管理 | 4 |
| 其他布局、登录、看板、销售、基础模块 | 12 |
## 4. 环境清单
### 4.1 地址规则
| 环境 | MES 通用接口 | 基础地址 | 说明 |
| --- | --- | --- | --- |
| 正式 | `https://192.168.2.92:10101/submit/MESCommonBase.ashx` | `https://192.168.2.92:10101` | 正式业务环境,默认只读诊断 |
| 测试 | `https://124.220.15.242:10101/submit/MESCommonBase.ashx` | `https://124.220.15.242:10101` | 当前接管验证环境 |
| 本地 | `http://127.0.0.1:10101/submit/MESCommonBase.ashx` | `http://127.0.0.1:10101` | 本地接口服务 |
测试 B1/TM 通过管理机 VPN 访问现场代理:
- B1`https://192.168.2.92:9996/b1s`
- TM`https://192.168.2.92:9996/openapi`
测试运行配置必须设置 `externalReadOnly: true`。B1/TM 的语义 POST/PATCH 在前端请求发出前被阻止;语义 GET 仍由代理通过 HTTP POST 传输,判定写保护时以请求体 `func` 为准。
### 4.2 配置加载机制
`index.html` 在应用脚本前加载 `./static/config.js`。MES、文件服务、B1 和 TM 地址均从 `window.dt_Config` 读取。
`npm run build` 完成后会删除 `dist/static/config.js`,因此运行时配置应由部署环境单独注入。推荐维护正式、测试、本地三套模板,并通过脚本选择目标配置,禁止人工切换注释。
当前风险:源码中的 `static/config.js` 默认指向正式环境。启动测试前端前必须先完成环境隔离。
## 5. 系统架构与调用链
```text
浏览器 / Vue 页面
|
| CreateData + ExecDatabase
v
MESCommonBase.ashx 统一接口
|
| 过程名 + 参数 + 用户/模块信息
v
SQL Server / YL_MESDB
|
+-- 存储过程、视图、业务表
+-- SAP 跨库视图或 B1 代理
+-- TM 领料/收料/退料接口
+-- 文件上传下载服务
```
关键实现:
- `src/utils/request.js`:主 Axios 实例,读取 `serverAddress`
- `src/utils/curd.js`:构造统一过程请求并执行接口调用。
- `src/api/login.js`:登录和角色菜单查询。
- `src/router/getTreeData.js`:将数据库菜单转换为动态路由。
- `src/api/b1s.js`B1 GET/POST/PATCH 代理封装。
- `src/api/tm.js`TM/OpenAPI 代理封装。
## 6. 测试数据库基线
### 6.1 数据库信息
| 项目 | 当前值 |
| --- | --- |
| SQL Server | Microsoft SQL Server 2019 Enterprise |
| 服务器实例 | `10_0_4_16\MSSQLSERVER2019` |
| 数据库 | `YL_MESDB` |
| 状态 | ONLINE |
| 兼容级别 | 150 |
| 排序规则 | Chinese_PRC_CI_AS |
| 恢复模式 | SIMPLE |
| 数据库总容量 | 1234.69 MB |
| 数据文件 | 1226.69 MB |
| 日志文件 | 8.00 MB |
### 6.2 对象规模
| 对象类型 | 数量 |
| --- | ---: |
| 用户表 | 61 |
| 视图 | 27 |
| 存储过程 | 425 |
| 标量函数 | 2 |
| 主键约束 | 47 |
| 外键约束 | 8 |
| 默认约束 | 45 |
| 唯一约束 | 5 |
正式库和测试库的上述对象数量一致,但对象定义并不完全一致。
### 6.3 账号权限
原测试数据库账号在 `YL_MESDB` 中映射为 `dbo`,并具有 `CONTROL``ALTER``CREATE``INSERT``UPDATE``DELETE``EXECUTE` 等完整权限。
已创建日常诊断账号 `meswork_readonly`,映射到 `YL_MESDB` 后仅加入 `db_datareader` 并授予 `VIEW DEFINITION`。验证结果为:数据库 `SELECT=1``VIEW DEFINITION=1``INSERT=0``UPDATE=0``DELETE=0`。该账号不授予全库 `EXECUTE`,避免通过未知写过程间接修改数据。
该账号只应作为临时受控部署账号,不应作为日常诊断账号。需要新增:
- 只读诊断账号:仅允许连接、查看定义、查询数据和查看执行计划。
- 受控部署账号:按变更窗口启用,发布完成后收回或禁用。
## 7. 正式库与测试库漂移
抽查 6 个近期关键过程,结果如下:
| 存储过程 | 测试/正式定义 | 结论 |
| --- | --- | --- |
| `MES_OrderPlanned_Query` | 不一致 | 测试库为 2026-06-09 版本,正式库为 2026-07-24 版本 |
| `计划排产_系统类任务查询` | 不一致 | 正式库已包含 2026-07-25 合同工时修复,测试库未同步 |
| `计划排产_阀类任务查询` | 不一致 | 正式库已包含 2026-07-25 合同工时修复,测试库未同步 |
| `车间生产管理工艺_零件工序_保存为标准工艺` | 一致 | 修改时间不同,但定义哈希一致 |
| `生产管理_及时齐套跟踪结果_查询` | 一致 | 定义哈希一致 |
| `设计报工_研发财务工时_查询` | 一致 | 定义哈希一致 |
禁止直接用正式库覆盖测试库。应按数据库变更脚本逐项同步,并在同步前记录测试库对象哈希和回滚定义。
## 8. 已完成验证
### 8.1 网络与数据库
| 验证项 | 结果 |
| --- | --- |
| 测试 SQL Server 端口 | 通过 |
| 测试数据库登录 | 通过 |
| `YL_MESDB` 对象读取 | 通过 |
| 测试 MES 接口端口 | 通过 |
| 测试 B1/TM 代理端口 | 失败,当前不可达 |
### 8.2 应用接口
| 验证项 | 结果 | 证据 |
| --- | --- | --- |
| MES 测试账号登录 | 通过 | HTTP 200返回超级管理员角色 |
| 角色菜单查询 | 通过 | HTTP 200返回 84 条菜单/权限数据 |
| 通用只读过程查询 | 通过 | HTTP 200返回 33 条工位数据 |
| B1 查询/写入 | 未执行 | 代理端口不可达 |
| TM 领料/收料/退料 | 未执行 | 代理端口不可达 |
### 8.3 前端构建
执行命令:`npm run build`
结果构建成功Webpack 5.103.0 用时约 79 秒,出现 2 类既有警告:
- 字体、登录图片和主要 JavaScript 包超过推荐体积。
- Browserslist/caniuse-lite 与 baseline-browser-mapping 数据过期。
入口资源约 6.85 MiB存在前端首屏性能优化空间。构建完成后 `dist/static/config.js` 按脚本设计被删除,部署前必须注入目标环境配置。
## 9. 已知限制与未验证范围
以下项目尚不能视为已接管完成:
- B1 生产订单、资源、工艺路线、发料和库存单据联调。
- TM 领料任务、收料任务和退料任务联调。
- 文件上传、下载、图纸和附件完整链路。
- 设备采集、MQTT、PLC、AGV 和定时任务。
- 排产、报工、送检、收检、退库等写入流程。
- 核心 DLL 原始源码、可重复构建流程、接口发布和回滚演练。
- 数据库完整备份恢复和灾备演练。
- 页面级全量浏览器回归、并发和性能测试。
## 10. 安全与运行风险
| 编号 | 级别 | 风险 | 处理要求 |
| --- | --- | --- | --- |
| SEC-01 | P1 | 原测试数据库账号为 `dbo` | 只读账号已建立;切换完成后再限制或停用原 `dbo/sysadmin` 账号 |
| SEC-02 | P1 | 登录接口返回明文 `password` 字段 | 后端查询和序列化结果移除密码 |
| SEC-03 | P1 | 登录页“记住密码”将密码保存到 Cookie 7 天 | 改为仅记住账号,不在浏览器保存明文密码 |
| SEC-04 | P1 | 10100/10101 复用名称不匹配的自签名 WMSvc 证书 | 换用与测试域名匹配、受信任且独立的业务 HTTPS 证书 |
| SEC-05 | P2 | `submit/web.config` 开启目录浏览 | 验证无业务依赖后关闭目录浏览 |
| ENV-01 | P1 | 源码运行时配置默认指向正式环境 | 建立三套配置模板和环境防误连校验 |
| ENV-02 | P1 | 测试库与正式库过程版本漂移 | 建立对象哈希清单和脚本化同步流程 |
| INT-01 | P2 | B1/TM 测试代理不可用 | 恢复测试代理或提供模拟服务 |
| OPS-01 | P2 | 发布包已归档但 `DataLinkMesWork.dll` 原始源码缺失 | 获取原始项目仓库,建立可重复构建和版本标记 |
| OPS-02 | P2 | 服务器 C 盘仅余约 13.5 GB | 建立容量告警并清理经确认可删除的历史备份/发布包 |
| PERF-01 | P3 | 前端入口和字体资源体积较大 | 按页面拆包、裁剪字体、压缩静态资源 |
## 11. 接管操作规则
1. 生产环境默认只读;任何生产写操作需要用户明确批准。
2. 测试环境写操作也必须先给出测试数据、预期结果和回滚方法。
3. 数据库变更必须包含前置结构校验、事务、验证 SQL 和回滚脚本。
4. 不直接覆盖正式/测试数据库,不使用数据库整体覆盖代替版本迁移。
5. 不在仓库、文档或日志中保存密码和 Token。
6. 发布前记录 Git 提交、数据库对象哈希、配置目标和构建结果。
7. 发布后执行页面、接口和数据库三层验证。
8. 每次执行过程和结论追加到 `gptlog-process/gpdlog.md`
9. B1/TM 不可用时,相关页面只能验证错误处理和模拟结果,不能判定业务联调通过。
10. 发现正式环境与测试环境漂移时,先评估差异来源,再决定同步方向。
## 12. 接管任务清单
### P0接管前置
- [x] 验证测试 SQL Server 和 `YL_MESDB`
- [x] 验证 MES 测试账号登录。
- [x] 验证菜单权限查询。
- [x] 验证通用只读存储过程调用。
- [x] 验证前端生产构建。
- [x] 确认 B1/TM 测试端口不可用。
- [ ] 建立正式、测试、本地配置模板和自动切换命令。
- [x] 建立只读数据库账号 `meswork_readonly`
- [ ] 完成业务服务账号切换后,限制或停用原 `meswork``dbo/sysadmin` 权限。
- [x] 获取后端 `.ashx`、IIS 站点、部署目录和程序集发布快照。
- [ ] 获取 `DataLinkMesWork.dll` 等核心程序集的原始项目源码。
### P1版本与安全
- [ ] 输出完整正式/测试数据库对象哈希差异清单。
- [ ] 审批并同步 `MES_OrderPlanned_Query` 等确认差异。
- [ ] 将合同工时修复同步到测试库并回归。
- [ ] 移除登录接口返回的密码字段。
- [ ] 移除浏览器 Cookie 中的明文密码。
- [ ] 建立数据库备份、恢复和回滚演练记录。
### P2业务接管
- [ ] 登录、菜单、角色和权限全量回归。
- [ ] 工艺、计划、生产、质量、设备和异常模块只读冒烟测试。
- [ ] 建立页面到过程、视图和表的可检索映射。
- [ ] 为关键写流程准备隔离测试数据和回滚脚本。
- [ ] 恢复或模拟 B1/TM 后完成外部集成验收。
- [ ] 建立发布清单、问题台账和定期巡检机制。
## 13. 接管完成标准
满足以下条件后,测试环境可从“有条件接管”升级为“完整接管”:
1. 三套环境配置完全隔离,测试前端不能连接正式接口。
2. 后端接口源码、部署目录、连接配置和回滚方法已归档。
3. 测试库与正式库的结构差异全部有明确原因和同步记录。
4. 日常诊断使用最小权限账号,高权限账号仅用于受控发布。
5. 登录密码泄露和 Cookie 明文密码问题已修复。
6. 核心 MES 模块的查询与写入流程均完成测试环境回归。
7. B1/TM 已恢复测试连接或具备可验收的模拟服务。
8. 数据库备份恢复、前端发布和接口回滚均完成至少一次演练。
9. 每个关键模块都有负责人、验收口径和故障升级路径。
## 14. 参考资产
- `doc/大连元利流体技术有限公司MES系统标准技术文档_V1.1_2026-07-24.docx`
- `doc/大连元利流体技术有限公司MES系统标准设计文档_V1.1_2026-07-24.docx`
- `doc/大连元利流体技术有限公司MES系统用户操作手册_V1.1_2026-07-23.docx`
- `doc/工时模块全流程技术说明_20260721.html`
- `db_backups/` 数据库变更与回滚脚本目录
- `server_baseline/MES_ManageV20250916_20260725/` 脱敏后端部署快照与 SHA-256 清单
- `gptlog-process/gpdlog.md` GPT/Codex 执行过程日志
---
基线维护原则:每次环境地址、数据库结构、接口版本、权限或外部集成状态发生变化后,应更新本文件的版本、日期、验证结果和任务清单。
## 15. V1.2 增量验证记录
### 数据库账号
- 创建对象:服务器登录 `meswork_readonly`,数据库用户 `YL_MESDB.meswork_readonly`
- 权限:`db_datareader``VIEW DEFINITION`
- 验证:能够登录、查询表、读取对象定义;数据库级 `INSERT``UPDATE``DELETE` 均无权限。
- 原账号:`meswork` 仍为 `dbo` 且属于 `sysadmin`,未在未确认服务依赖前删除或降权。
### 远程服务器
- RDP 自定义端口 `124.220.15.242:12920`TCP 可达。
- 标准 RDP `3389`:不可达。
- WinRM HTTPS `5986`:外部 TCP 可达,使用受控引导会话已成功认证到 Windows Server 2019 Datacenter。
- IIS Management Service `8172`WMSVC 已运行,服务器本机监听成功;公网未列为当前接管前置条件。
- 远程盘点仅执行读取和文件拉取,没有停止站点、回收应用池或修改接口部署文件。
### IIS 与后端部署
- IIS 站点:`元利流体MES_Manage`,状态 Started站点 ID 29。
- 绑定HTTPS 10100、10101物理目录 `C:\ProjectShow\元利流体\MES_ManageV20250916`
- 应用池:同名,`.NET v4.0`、Integrated、ApplicationPoolIdentity、按需启动、空闲 20 分钟、周期回收 29 小时。
- 认证IIS 匿名认证开启Windows/Basic 认证关闭;应用认证由接口业务逻辑承担。
- 证书10100/10101 共用自签名 `CN=WMSvc-SHA2-10_0_4_16`,与公网 IP 不匹配。
- 日志:`C:\inetpub\logs\LogFiles\W3SVC29`;当前抽样 11 次 `MESCommonBase.ashx` 请求均为 HTTP 200近两天未发现 ASP.NET/.NET/IIS 错误事件。
- 部署规模274 个文件、约 91.31 MB包含 32 个内联 C# `.ashx`、50 个 DLL 和 PDB没有独立 `.cs` 项目文件。
- 本地快照163 个文件、约 75.44 MB排除了根 `Web.config`、PDF、上传文件、业务数据和 `.vs`
- 核心逻辑:`MESCommonBase.ashx` 将默认调用转交 `DataLinkMesWork.DataLink.SqlWebCall`PDB 记录了原始构建源码路径,但该路径和项目源码在测试服务器不存在。
- 恢复源码:使用 ILSpy 9.1.0.7988 生成 76 个 C# 文件和 `net48` 项目,本地构建为 0 错误、102 警告;重建 DLL 与发布 DLL 哈希不一致,严禁直接替换发布件。
### 后端连接与备份
-`Web.config` 的实际 `ConnectionString` 指向 `124.220.15.242,64722 / YL_MESDB`SQL 凭据未复制或写入文档。
- 配置仍保留旧字段 `.\MSSQLSERVER2016 / MESBasicDB_PZ126`,实际接口使用上述 `ConnectionString`
- 服务器同时运行 SQL Server 2016/201964722 在 IPv4/IPv6 全地址监听;`YL_MESDB` 数据文件位于 SQL Server 2019 实例目录。
- 最新完整备份 `C:\YL_MESDB_202607240000.bak` 已确认存在,大小 1,278,302,720 字节,时间 2026-07-24 14:40:52。
- 2026-05-09 的完整备份文件也存在;历史记录中的 `C:\123.bak` 已不存在。尚未执行 `RESTORE VERIFYONLY` 或隔离恢复演练。
- 服务器 C 盘剩余空间约 13.5 GB。
### 下一步
1. 获取 `DataLinkMesWork` 等核心程序集的原始源码仓库和构建说明;在此之前只能维护内联 `.ashx` 或以发布包方式回滚。
2. 创建后端专用最小权限 SQL 服务账号并回归接口,再限制原 `meswork` 的高权限。
3. 建立测试/正式/本地运行时配置模板,阻止测试前端误连正式环境。
4. 在隔离位置执行数据库备份校验、恢复演练和接口发布回滚演练。
5. 更换业务 HTTPS 证书、关闭目录浏览,并修复接口/浏览器明文密码风险。
## 16. 装配任务正式变更同步记录
### 同步日期与范围
- 同步日期2026-07-25
- 测试数据库:`124.220.15.242,64722 / YL_MESDB`
- 测试接口:`https://124.220.15.242:10101/submit/MESCommonBase.ashx`
- 同步范围系统类和阀类装配任务合同工时修复、共享查询优化、5 个辅助索引、预算工时保存及预算进度返回、前端首屏渲染优化。
### 数据库对象
- 新增共享核心过程 `dbo.计划排产_装配任务查询_核心`
- 原入口过程 `计划排产_系统类任务查询``计划排产_阀类任务查询` 保留名称和参数,定义哈希与正式库对应入口完全一致。
- 保留测试库原过程备份:`计划排产_系统类任务查询_优化前_20260725``计划排产_阀类任务查询_优化前_20260725`
- 新增 `计划排产_装配任务预算``计划排产_装配合同预算``计划排产_装配任务预算_保存`
- 新增 5 个查询辅助索引,名称和结构与正式库一致。
### 测试环境 SAP 适配
测试 SQL 链接服务器 `[SAP]` 无法连接现场 SAP单独读取超过 39 秒仍未返回。装配任务查询原本每次等待该链接,系统类约 44 秒、阀类约 22 秒,并导致接口不能正常返回分页结构。
仅在测试核心过程中跳过远程交货日期读取,使用空日期保留 `交货日期理论齐套日期` 字段结构。订单、合同工时、预算字段和其他业务条件不变。现场 SAP 恢复后可执行:
- 部署脚本:`db_backups/test_disable_install_task_sap_delivery_20260725.sql`
- 回滚脚本:`db_backups/rollback_test_disable_install_task_sap_delivery_20260725.sql`
- 过程备份:`dbo.计划排产_装配任务查询_核心_测试跳过SAP前_20260725`
### 回归结果
| 查询 | 测试接口耗时 | 返回结果 |
| --- | ---: | --- |
| 系统类装配任务 | 818-1089 ms | 20/55 行4 个预算字段齐全 |
| 阀类装配任务 | 931-1136 ms | 20/263 行4 个预算字段齐全 |
预算接口写入和读取回归通过:测试订单 5598、合同 `HT260597` 临时保存任务预算 `123.45` 小时和合同预算 `67.89` 小时,查询返回进度 `2.48%``10.04%`。回归记录已按专用编辑标记精确删除,两张预算表最终均为 0 行。
### 前端交付
根目录 `dist` 已使用包含 20 行默认分页、预算进度功能、登录安全修复和外部系统只读保护的 `app.83b8251a.js`。服务器已创建 IIS 站点 `元利流体MES_View`,物理目录为 `C:\ProjectShow\元利流体\MES_Manage_View\dist`HTTP 绑定为 `*:10012:`。本地和远程文件共 84 个、95,691,424 字节,`index.html``config.js` 的 SHA-256 一致。本次直接复制 `dist`,未生成 zip。
## 17. V1.3 接管落地与验收记录
### 17.1 当前可执行的工作
-`http://124.220.15.242:10012/` 部署和回归测试前端,独立维护测试运行配置。
- 通过 `10101` 完成登录、菜单、权限和 MES 存储过程的查询/受控变更验证。
- 使用数据库只读账号开展结构、数据、执行计划和性能诊断;数据库变更使用部署/回滚脚本受控执行。
- 维护系统类、阀类装配任务查询、预算工时和进度功能,并在测试环境做接口回归。
- 通过 VPN 对 B1 做登录代理和 GET 联调B1/TM 的 POST/PATCH 在测试前端强制阻止。
- 执行数据库备份校验、隔离恢复、完整性检查和清理演练。
- 盘点 IIS、部署目录、配置、日志、证书和防火墙为生产接管准备操作清单。
### 17.2 前端与外部集成保护
- 构建结果Webpack 成功,入口 `app.83b8251a.js`;仅有既有的大资源和浏览器数据过期警告。
- IIS 验证:服务器本机和管理端访问 `10012` 均返回 HTTP 200运行配置返回 HTTP 200 且 `externalReadOnly=true`
- 隔离测试B1/TM 四个语义写入口均返回 `blocked=true`,网络调用次数为 0B1/TM GET 包装仍正常发出 `func=GET`
- B1 实际 GET`ProductionOrders` 最小查询返回 HTTP 200约 252 ms`value` 集合且无 B1 错误。
- TM端口可达但代码中没有可确认无副作用的登录/GET 端点,因此未调用库存任务接口。
### 17.3 数据库恢复演练
- 备份:`C:\YL_MESDB_202607240000.bak`,备份完成时间 2026-07-24 14:40:52大小 1,278,302,720 字节。
- `RESTORE VERIFYONLY` 通过;该备份未包含 SQL Server checksum`CHECKSUM` 的校验无法执行,后续备份任务应启用 checksum。
- 隔离恢复库:`YL_MESDB_RestoreDrill_20260725`,恢复约 9.4 秒并正常 ONLINE。
- `DBCC CHECKDB(..., PHYSICAL_ONLY)` 通过,约 5.9 秒。
- 备份对象为 61 表/27 视图/425 过程;当前测试库为 63/27/432增加项来自 7 月 25 日已部署变更。
- 演练结束后数据库、MDF 和 LDF 均已删除,磁盘空间恢复。
### 17.4 安全整改
- 登录过程已保留回滚备份并改为显式返回字段,仍校验密码但不返回 `password`;公网接口实测登录成功且响应无密码属性。
- 登录页只记住账号,不再写入密码 Cookie并会删除旧 `password` Cookie。
- 后端根目录和 `submit` 目录浏览已从 `True` 改为 `False`,原配置已在服务器同目录备份;目录访问返回 HTTP 403接口仍为 HTTP 200。
- 仓库内两个历史注释中的口令和执行日志中的口令特征已脱敏。
- WinRM 5986 和 IIS Management 8172 仅允许管理端公网 IP测试前端 10012 当前允许任意来源访问。
### 17.5 核心模块只读冒烟
| 模块 | 查询入口 | 结果 | 耗时 |
| --- | --- | --- | ---: |
| 系统 | `人员管理_人员信息查询` | 200 / 135 行 | 385 ms |
| 工艺 | `MES_ProcessManagement_ProcessGet` | 200 / 合法 JSON | 113 ms |
| 计划 | `计划排产_生产订单_工艺查询` | 200 / 9878 行 | 2619 ms |
| 生产 | `生产管理_班次管理_班次列表查询` | 200 / 4 行 | 128 ms |
| 质量 | `质量管理_测试装配任务_查询2` | 200 / 0 行 | 200 ms |
| 设备 | `设备管理_设备数据_工位信息_查询` | 200 / 21 行 | 140 ms |
| 异常 | `加急订单_加急明细查询` | 200 / 合法 JSON | 117 ms |
| 销售 | `销售管理_销售订单状态` | 200 / 200 行 | 430 ms |
| 首页看板 | `看板_主页六个关键数据_查询` | 200 / 25 行 | 1099 ms |
登录账号角色菜单查询另返回 84 条,覆盖工艺、计划、生产、质量、设备和异常等主模块。
### 17.6 仍保留的生产接管前风险
1. 测试后端业务 HTTPS 证书为名称不匹配的自签名证书,需要替换为受信任且与访问域名匹配的证书。
2. 测试前端 `10012` 当前使用 HTTP 且防火墙来源为 Any正式接管前应使用 HTTPS并按实际测试人员/网络范围限制入口。
3. 后端仍使用高权限数据库账号。已有只读诊断账号,但应用服务账号降权需要覆盖全部写流程和 SQL 链接服务器场景后再切换。
4. 本轮全模块验收为只读冒烟MES 报工、送检、入库等写流程未执行B1/TM 写流程按要求明确禁止。
5. 核心 DLL 没有原始源码,按当前约定不做 DLL 修改;将来若生产问题必须修改核心逻辑,需要取得源码或采用经过专项验证的替代构建流程。

Binary file not shown.

View File

@@ -0,0 +1,47 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>SAP / TM 接口调用清单(第 9 章)</title>
<style id="print-overrides">
body { margin: 0; padding: 24px; color: #17212b; background: #fff; font: 14px/1.65 "Microsoft YaHei", "PingFang SC", Arial, sans-serif; }
.loading { color: #5e6b78; }
@media print {
@page { size: A4; margin: 12mm; }
body { padding: 0; font-size: 9pt; }
section { border: 0 !important; padding: 0 !important; margin: 0 !important; }
table { font-size: 7.2pt !important; }
th, td { padding: 5px 6px !important; }
.operation-grid { grid-template-columns: 1fr !important; }
.operation-card { break-inside: avoid; }
.operation-card img { max-height: 105mm; object-fit: contain; }
}
</style>
</head>
<body>
<p class="loading">正在生成第 9 章打印内容...</p>
<script>
(async () => {
const source = await fetch('./SAP接口调用说明.html').then(response => response.text());
const parsed = new DOMParser().parseFromString(source, 'text/html');
const sourceStyle = parsed.querySelector('style');
const chapter = parsed.querySelector('#pagecalls');
if (!sourceStyle || !chapter) {
throw new Error('未找到 SAP / TM 接口调用清单章节。');
}
const style = document.createElement('style');
style.textContent = sourceStyle.textContent;
document.head.appendChild(style);
document.head.appendChild(document.querySelector('#print-overrides'));
document.body.innerHTML = '<main>' + chapter.outerHTML + '</main>';
document.body.dataset.ready = 'true';
})().catch(error => {
document.body.innerHTML = '<p>生成失败:' + error.message + '</p>';
document.body.dataset.ready = 'error';
});
</script>
</body>
</html>

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@@ -0,0 +1,588 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="MES 系统调用 SAP Business One 与 TM 条码系统接口的开发与联调说明">
<title>MES - SAP B1 与 TM 接口调用说明</title>
<style>
:root { --ink: #17212b; --muted: #5e6b78; --line: #d7dee5; --paper: #fff; --page: #edf2f4; --nav: #122b3d; --blue: #0d6b96; --teal: #008073; --red: #b93829; --amber: #9b6700; --code: #102433; }
* { box-sizing: border-box; }
html { scroll-behavior: smooth; }
body { margin: 0; background: var(--page); color: var(--ink); font: 14px/1.65 "Microsoft YaHei", "PingFang SC", Arial, sans-serif; }
.topbar { min-height: 64px; background: var(--nav); color: #fff; display: flex; align-items: center; justify-content: space-between; padding: 0 34px; }
.brand { font-size: 17px; font-weight: 700; letter-spacing: 0; }
.topbar button { border: 1px solid #91a6b4; border-radius: 4px; background: transparent; color: #fff; padding: 7px 12px; cursor: pointer; font: inherit; }
.layout { display: grid; grid-template-columns: 224px minmax(0, 980px); gap: 24px; max-width: 1260px; margin: 28px auto; padding: 0 24px; align-items: start; }
aside { position: sticky; top: 20px; background: #fff; border: 1px solid var(--line); border-radius: 6px; padding: 14px 10px; }
aside p { margin: 0 10px 8px; font-size: 12px; font-weight: 700; color: var(--muted); }
nav a { display: block; padding: 7px 10px; color: #34495a; text-decoration: none; border-radius: 4px; }
nav a:hover { background: #e8f3f6; color: var(--blue); }
main { min-width: 0; }
.doc-head { background: var(--paper); border: 1px solid var(--line); border-radius: 6px; padding: 36px 42px 28px; border-top: 5px solid var(--teal); }
.eyebrow { margin: 0 0 10px; color: var(--teal); font-size: 12px; font-weight: 700; letter-spacing: .08em; }
h1, h2, h3 { line-height: 1.28; margin: 0; }
h1 { font-size: 30px; }
h2 { font-size: 20px; padding-bottom: 9px; border-bottom: 1px solid var(--line); margin-bottom: 17px; }
h3 { font-size: 15px; margin: 20px 0 8px; }
.subtitle { margin: 12px 0 0; color: var(--muted); font-size: 15px; }
.meta { display: flex; flex-wrap: wrap; gap: 8px 24px; margin-top: 23px; padding-top: 15px; border-top: 1px solid var(--line); color: var(--muted); font-size: 12px; }
section { background: var(--paper); border: 1px solid var(--line); border-radius: 6px; padding: 28px 32px; margin-top: 18px; }
p { margin: 8px 0; }
ul, ol { margin: 8px 0; padding-left: 22px; }
li { margin: 4px 0; }
.notice { padding: 13px 15px; border-left: 4px solid var(--amber); background: #fff8e8; color: #654900; margin: 16px 0; }
.risk { border-left-color: var(--red); background: #fff3f1; color: #7b241c; }
.flow { display: grid; grid-template-columns: repeat(5, 1fr); gap: 8px; align-items: center; margin: 18px 0; }
.flow-node { min-height: 70px; padding: 10px; display: flex; align-items: center; justify-content: center; text-align: center; border: 1px solid #b7ccd4; border-radius: 4px; background: #f5fbfc; font-weight: 700; }
.arrow { color: var(--teal); text-align: center; font-size: 22px; }
table { width: 100%; border-collapse: collapse; margin: 13px 0; font-size: 13px; }
th, td { border: 1px solid var(--line); padding: 9px 10px; vertical-align: top; text-align: left; }
th { color: #243b4b; background: #edf5f6; font-weight: 700; }
code { color: #9a3a21; font: 12px/1.5 Consolas, "Courier New", monospace; word-break: break-word; }
pre { overflow: auto; margin: 12px 0; padding: 15px; border-radius: 4px; background: var(--code); color: #e8f3f5; font: 12px/1.6 Consolas, "Courier New", monospace; }
pre code { color: inherit; word-break: normal; }
.tag { display: inline-block; padding: 1px 7px; border-radius: 3px; font: 700 11px/1.7 Arial, sans-serif; white-space: nowrap; }
.read { background: #e3f3f0; color: #006d61; }
.write { background: #ffe9e6; color: #a42e21; }
.write::after { content: " 禁止调用"; }
.checklist { list-style: none; padding: 0; }
.checklist li { padding: 8px 0 8px 28px; position: relative; border-bottom: 1px solid #edf0f2; }
.checklist li::before { content: "□"; position: absolute; left: 4px; color: var(--teal); font-size: 18px; line-height: 1.2; }
.small { font-size: 12px; color: var(--muted); }
.operation-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin: 14px 0 6px; }
.operation-card { border: 1px solid var(--line); border-top: 3px solid var(--teal); border-radius: 5px; padding: 14px; min-width: 0; }
.operation-card h4 { margin: 0 0 7px; font-size: 15px; }
.operation-heading { margin: 22px 0 8px; font-size: 16px; }
.operation-card p { margin: 6px 0; }
.operation-card ol { margin: 7px 0 10px; padding-left: 20px; }
.operation-card figure { margin: 12px 0 0; }
.operation-card img { display: block; width: 100%; height: auto; border: 1px solid #cbd7de; border-radius: 3px; background: #f6f8f9; }
.operation-card figcaption { margin-top: 5px; color: var(--muted); font-size: 12px; }
.operation-trigger { padding: 8px 10px; border-left: 3px solid #b7ccd4; background: #f5f8fa; font-size: 12px; }
.footer { color: var(--muted); padding: 17px 0 40px; font-size: 12px; }
@media (max-width: 820px) { .topbar { padding: 0 18px; } .layout { display: block; margin: 16px auto; padding: 0 14px; } aside { position: static; margin-bottom: 16px; } .doc-head, section { padding: 24px 20px; } .flow { grid-template-columns: 1fr; } .arrow { transform: rotate(90deg); } h1 { font-size: 25px; } table { display: block; overflow-x: auto; white-space: nowrap; } }
@media (max-width: 820px) { .operation-grid { grid-template-columns: 1fr; } }
@media print { @page { margin: 15mm; } body { background: #fff; font-size: 10pt; } .topbar, aside { display: none; } .layout { display: block; max-width: none; margin: 0; padding: 0; } .doc-head, section { border: 0; padding: 0; margin: 0 0 18px; } .doc-head { border-top: 4px solid var(--teal); padding-top: 15px; } section { break-inside: avoid; } pre { white-space: pre-wrap; font-size: 8.5pt; } }
</style>
</head>
<body>
<header class="topbar">
<div class="brand">MES / SAP B1 / TM 集成说明</div>
<button type="button" onclick="window.print()" title="打印或另存为 PDF">打印 / 导出 PDF</button>
</header>
<div class="layout">
<aside aria-label="文档目录">
<p>目录</p>
<nav>
<a href="#overview">1. 概述与边界</a>
<a href="#architecture">2. 调用架构</a>
<a href="#login">3. B1 登录与会话</a>
<a href="#protocol">4. 网关报文协议</a>
<a href="#services">5. B1 查询与更新</a>
<a href="#tm">6. TM 条码任务</a>
<a href="#sql">7. SAP 只读数据查询</a>
<a href="#mytask">8. 定时同步 update_MyTask</a>
<a href="#pagecalls">9. 页面接口调用清单</a>
</nav>
</aside>
<main>
<header class="doc-head">
<p class="eyebrow">TECHNICAL INTEGRATION GUIDE</p>
<h1>MES 调用 SAP B1 与 TM 接口说明</h1>
<p class="subtitle">适用于 SAP Business One Service Layer、TM 条码任务,以及 SQL Server 链接服务器只读查询。</p>
<div class="meta"><span>文档版本V1.0</span><span>编制日期2026-08-03</span><span>适用系统MES 管理端</span><span>状态:实施参考</span></div>
</header>
<section id="overview">
<h2>1. 概述与边界</h2>
<p>本项目存在三类 SAP/TM 集成方式,必须按各自的数据方向和调用边界实施:</p>
<table>
<thead><tr><th>集成方式</th><th>用途</th><th>方向</th><th>项目位置</th></tr></thead>
<tbody>
<tr><td>SAP B1 Service Layer 网关</td><td>工位、工艺、生产订单、采购申请、生产发料等业务对象的查询或写入</td><td>MES 调用 SAP</td><td><code>src/api/b1s.js</code></td></tr>
<tr><td>TM 条码网关</td><td>生产领料出库任务、质检/退库入库任务的创建与状态反馈</td><td>MES 调用 TM</td><td><code>src/api/tm.js</code></td></tr>
<tr><td>SQL Server 链接服务器 <code>[SAP]</code></td><td>物料、项目、缺件、发货等报表的只读查询</td><td>MES 数据库读取 SAP 视图</td><td>数据库存储过程与 <code>db_backups/*.sql</code></td></tr>
</tbody>
</table>
<div class="notice">浏览器端的 B1、TM 调用均经项目网关转发。业务代码应只使用 B1 的 <code>getB1</code><code>postB1</code><code>patchB1</code> 或 TM 的 <code>gettm</code><code>posttm</code><code>patchtm</code>,不要在 Vue 页面保存 B1 密码、SessionId 或 TM AccessToken。</div>
<div class="notice risk"><strong>写入边界:</strong>生产订单关闭、采购申请、工位和工艺同步均会改变 SAP 数据。写操作须经业务权限、数据校验和二次确认;测试环境设置 <code>externalReadOnly: true</code> 时,封装会阻止 <code>POST</code><code>PATCH</code></div>
</section>
<section id="architecture">
<h2>2. 调用架构</h2>
<div class="flow" aria-label="MES 到 SAP 的调用链">
<div class="flow-node">Vue 页面<br>业务操作</div><div class="arrow"></div>
<div class="flow-node"><code>src/api/b1s.js</code><br>统一封装</div><div class="arrow"></div>
<div class="flow-node">B1 网关<br><code>baseURLB1</code></div><div class="arrow"></div>
<div class="flow-node">SAP B1<br>Service Layer</div>
</div>
<h3>2.1 运行时配置</h3>
<p>当前部署配置位于 <code>static/config.js</code><code>baseURLB1</code> 指向 B1 网关 <code>/b1s</code><code>baseURLtm</code> 指向 TM 网关 <code>/openapi</code>。地址由运行环境配置提供,前端源码不应硬编码 SAP 地址、账号、密码、SessionId 或 TM Token。</p>
<p>开发环境代理将 <code>/api/b1s</code> 转至 SAP Service Layer 的 <code>/b1s/v1</code>,将 <code>/api/tm</code> 转至条码系统的 <code>/openapi/v1</code>。生产调用实际以运行时 <code>baseURLB1</code><code>baseURLtm</code> 为准。</p>
<h3>2.2 认证与会话</h3>
<p>前端封装未在每个业务调用中传递 SAP 用户名和密码,认证与 SAP 会话应由 B1 网关统一管理。登录信息、会话 Cookie、证书及跨域策略均不得写入页面代码、接口参数、浏览器日志或本说明文档。</p>
</section>
<section id="login">
<h2>3. B1 登录与会话</h2>
<p>对接方案规定:每次直接调用 SAP Service Layer 前,先登录取得响应体中的 <code>SessionId</code>;后续请求在 Header 中携带 <code>Cookie: B1SESSION=&lt;SessionId&gt;;</code>。方案样例的会话有效期为 30 分钟,具体以登录响应的 <code>SessionTimeout</code> 为准。</p>
<div class="notice"><strong>项目当前模式:</strong>Vue 页面并没有直接调用 <code>/Login</code>,也没有给每次请求附加 <code>B1SESSION</code>。这是正确的浏览器安全边界B1 网关必须负责登录、缓存/续期会话并转发请求。下列直接调用示例只适用于网关服务端或 Postman 联调,不能将账号密码搬到前端。</div>
<h3>3.1 直接登录 B1 Service Layer</h3>
<pre><code>POST https://{b1-host}:50000/b1s/v1/Login
Content-Type: application/json
{
"CompanyDB": "TEST_YL 或 SBO_YL",
"UserName": "${B1_USER}",
"Password": "${B1_PASSWORD}",
"Language": "15"
}
// 成功响应必须读取并安全保存 SessionId不要写入浏览器 localStorage。
{
"SessionId": "...",
"Version": "...",
"SessionTimeout": 30
}</code></pre>
<h3>3.2 后续查询/更新 Header</h3>
<pre><code>GET https://{b1-host}:50000/b1s/v1/ProductionOrders?$filter=AbsoluteEntry eq 1234
Cookie: B1SESSION=${SESSION_ID};
Accept: application/json</code></pre>
<p>收到 401、会话过期或 “not connected to a company” 类错误时,网关应只重登录一次后重试原请求;仍失败则返回失败给 MES。禁止在前端静默无限重试避免重复创建采购申请、生产发料单等外部单据。</p>
</section>
<section id="protocol">
<h2>4. MES 网关报文协议</h2>
<p><code>b1s.js</code><code>tm.js</code> 均向各自网关根路径发送 HTTP <code>POST</code>。网关请求体为 JSON实际下游动词由 <code>func</code> 指定B1 或 TM 的认证 Header 由网关维护。</p>
<table>
<thead><tr><th>字段</th><th>类型</th><th>说明</th><th>示例</th></tr></thead>
<tbody>
<tr><td><code>func</code></td><td>string</td><td>目标 Service Layer 动词</td><td><code>GET</code> 可查询;<code>POST</code><code>PATCH</code> 禁止调用</td></tr>
<tr><td><code>cmd</code></td><td>string</td><td>SAP 对象路径,封装会移除传入路径中的首个 <code>/</code></td><td><code>ProductionOrders(1234)</code></td></tr>
<tr><td><code>content</code></td><td>string</td><td>业务参数或请求体的 JSON 字符串</td><td><code>{"ProductionOrderStatus":"boposClosed"}</code></td></tr>
</tbody>
</table>
<pre><code>// 读取getB1('/ProductionOrders', { "$filter": "AbsoluteEntry eq 1234" })
POST {baseURLB1}
Content-Type: application/json
{
"func": "GET",
"cmd": "ProductionOrders",
"content": "{\"$filter\":\"AbsoluteEntry eq 1234\"}"
}
// 禁止调用func=PATCHpatchB1('/ProductionOrders(1234)', { ProductionOrderStatus: 'boposClosed' })
{
"func": "PATCH",
"cmd": "ProductionOrders(1234)",
"content": "{\"ProductionOrderStatus\":\"boposClosed\"}"
}</code></pre>
<p class="small">封装默认超时为 100 秒。调用结果统一为 <code>{ success: true, data }</code><code>{ success: false, message }</code>;页面必须检查 <code>success</code> 后再提示用户或更新本地状态。</p>
</section>
<section id="services">
<h2>5. B1 查询、更新与生产反馈</h2>
<h3>5.1 生产订单 <code>ProductionOrders</code></h3>
<table>
<thead><tr><th>操作</th><th>调用</th><th>用途</th><th>写入风险</th></tr></thead>
<tbody>
<tr><td><span class="tag read">GET</span></td><td><code>getB1('/ProductionOrders', { '$filter': 'AbsoluteEntry eq 订单号' })</code></td><td>读取订单、工序阶段、资源行等数据。</td><td>无写入;结果为空时不可直接取 <code>value[0]</code></td></tr>
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1('/ProductionOrders(订单号)', { ProductionOrderStatus: 'boposClosed' })</code></td><td>关闭生产订单。</td><td>高。须逐单记录结果,处理部分成功和重复关闭。</td></tr>
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1('ProductionOrders(订单号)', { ProductionOrderLines, ProductionOrdersStages })</code></td><td>工时校验场景更新订单工序与资源。</td><td>高。先读取最新订单,再合并工序/资源,不能用陈旧的整单数组覆盖 SAP 数据。</td></tr>
</tbody>
</table>
<p>生产订单是 MES 与 SAP 的主关联对象。以 <code>AbsoluteEntry</code>MES 中的订单号/计划号)查询;订单状态使用 <code>boposPlanned</code><code>boposReleased</code><code>boposClosed</code><code>boposCancelled</code>。更新 <code>ProductionOrderLines</code><code>ProductionOrdersStages</code>SAP 不保证返回完整订单,必须立即按 <code>AbsoluteEntry</code> 重查,并将实际的 <code>LineNumber</code><code>StgEntry</code><code>StgSeqNum</code> 回写到 MES 的关联记录。</p>
<pre><code>// 当前项目可直接使用的查询方式:由 B1 网关持有会话
const orderResult = await getB1('/ProductionOrders', {
'$filter': 'AbsoluteEntry eq ' + orderNo,
'$select': 'AbsoluteEntry,ProductionOrderStatus,ItemNo,PlannedQuantity,Project'
});
if (!orderResult.success || !orderResult.data?.value?.length) {
throw new Error(orderResult.message || '未找到 SAP 生产订单');
}
const order = orderResult.data.value[0];</code></pre>
<h3>5.2 工位资源 <code>Resources</code></h3>
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/Resources', { VisCode, Name, Type: 'rtMachine', Group: 1, Active: 'tYES', ... })</code></td><td>新增 MES 工位后同步创建 SAP 资源。</td></tr>
<tr><td><span class="tag write">PATCH</span></td><td><code>patchB1(&quot;/Resources('工位号')&quot;, { Name })</code></td><td>工位名称变更后同步 SAP 资源名称。</td></tr>
</tbody></table>
<h3>5.3 工艺阶段 <code>RouteStages</code></h3>
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/RouteStages', { Code, Description, CreationDate, DateOfUpdate })</code></td><td>新增 MES 工艺后同步创建 SAP 工艺阶段。</td></tr>
<tr><td><span class="tag read">GET</span> + <span class="tag write">PATCH</span></td><td>先用 <code>Code</code> 过滤查询得到 <code>InternalNumber</code>,再 <code>patchB1('/RouteStages(' + InternalNumber + ')', {...})</code></td><td>编辑 MES 工艺时更新 SAP 描述和更新时间。</td></tr>
</tbody></table>
<h3>5.4 采购申请 <code>PurchaseRequests</code></h3>
<table><thead><tr><th>操作</th><th>调用与关键字段</th><th>业务场景</th></tr></thead><tbody>
<tr><td><span class="tag write">POST</span></td><td><code>postB1('/PurchaseRequests', { ReqType, Requester, DocDate, RequredDate, DocumentLines })</code></td><td>外协派工并同步 SAP 时创建采购申请;<code>DocumentLines</code> 中包含物料、数量、仓库、生产订单及工序关联字段。</td></tr>
</tbody></table>
<p>采购申请创建成功后,必须从返回数据取得并保存 SAP <code>DocEntry</code><code>DocNum</code>。表头至少维护 <code>ReqType</code><code>Requester</code><code>DocDate</code><code>DocDueDate</code><code>TaxDate</code><code>RequriedDate</code>;每个 <code>DocumentLines</code> 行至少维护 <code>ItemCode</code><code>Quantity</code><code>WarehouseCode</code>。日期按 <code>YYYY-MM-DD</code> 传递,数量按业务精度处理。</p>
<h3>5.5 生产报工反馈 <code>InventoryGenExits</code></h3>
<p>项目的工时校验页面会先同步生产订单工序/资源,再创建 SAP 生产发料单,以回传设备或人工报工。单据头使用 <code>DocDate</code><code>DocDueDate</code><code>Comments</code>;行项目基于生产订单使用 <code>BaseType: 202</code><code>BaseEntry</code>(生产订单号)、<code>BaseLine</code>SAP 生产订单行号),并携带资源/物料行、数量、仓库及工序阶段关联。</p>
<pre><code>const feedback = await postB1('/InventoryGenExits', {
DocDate: '2026-08-03',
DocDueDate: '2026-08-03',
Comments: 'MES报工 AID:12345; 项目:HT-0001',
DocumentLines: [{
BaseType: 202,
BaseEntry: 1234,
BaseLine: 2,
LineType: 'dlt_Resource',
WarehouseCode: '',
U_ResName: '数控车床A',
Quantity: 1.5
}]
});
if (!feedback.success) throw new Error(feedback.message || 'SAP 生产反馈失败');
// 保存返回的 DocEntry作为 MES 报工与 SAP 发料单的追溯键。</code></pre>
</section>
<section id="tm">
<h2>6. TM 条码任务:认证、创建与反馈</h2>
<h3>6.1 当前可调用链路</h3>
<p>项目使用 <code>src/api/tm.js</code>,运行时入口为 <code>window.dt_Config.baseURLtm</code>。现有页面已实际调用以下路径:<code>posttm('/stocktask/task/issueordertask', payload)</code> 创建领料出库任务;<code>posttm('/stocktask/task/receiptordertask', payload)</code> 创建收货/退库入库任务。网关把 <code>func</code><code>cmd</code><code>content</code> 转发至 TM OpenAPI。</p>
<table><thead><tr><th>TM 业务接口</th><th>下游 OpenAPI 路径</th><th>项目触发场景</th><th>核心请求字段</th></tr></thead><tbody>
<tr><td>创建出库任务</td><td><code>POST /openapi/v1/stocktask/task/issueordertask</code></td><td>加工中心、装配中心、质量中心领料。</td><td><code>doc_date</code><code>doc_type</code><code>external_num</code><code>task_items[]</code></td></tr>
<tr><td>创建入库任务</td><td><code>POST /openapi/v1/stocktask/task/receiptordertask</code></td><td>不合格品入库、退库质检后入库。</td><td><code>doc_date</code><code>doc_type</code><code>external_num</code><code>task_items[]</code></td></tr>
</tbody></table>
<h3>6.2 TM 怎么登录</h3>
<div class="notice risk"><strong>当前事实:</strong>提供的 TM OpenAPI 资料只列出 Header <code>Authorization: AccessToken</code>,并定义 401/403 响应;没有给出“登录/换取 AccessToken”的 URL、请求体、Token 有效期或刷新协议。项目源码也没有实现 <code>logintm</code>,虽然仪表盘调用了该名称。因此当前代码不能作为 TM 登录实现的依据。</div>
<p>要使 TM 调用可用,必须由条码系统供应方提供并确认以下五项,再由网关实现,前端不保存 Token登录/换取 Token 地址与方法、账号认证字段、Header 格式、有效期与刷新方式、401 后的重试规则。网关应将 Token 写入服务端安全存储,并在转发 TM 请求时增加 <code>Authorization: &lt;AccessToken&gt;</code> 和需要时的 <code>Accept-Language: zh_CN</code></p>
<h3>6.3 实际任务报文与成功判定</h3>
<pre><code>const payload = {
doc_date: '2026-08-03',
doc_type: '202-60', // 现有领料页面使用的业务类型;变更前需与 TM 数据字典核对
external_num: '1234', // MES/SAP 关联单据号
task_items: [{
base_type: '202',
base_entry: '1234',
base_line_num: 2,
external_num: '1234',
item_code: 'ITEM-001',
item_name: '物料名称',
line_memo: 'MES领料任务',
whs_code: 'W03',
manage_type: 'B',
price: 0,
quantity: 2
}]
};
const tmResult = await posttm('/stocktask/task/issueordertask', payload);
if (!tmResult.success) throw new Error(tmResult.message || 'TM 网关请求失败');
// TM 接口返回结构为 { code, data, message }。
// 必须按供应方确认的成功 code 判断,并保存 data 中的任务标识;不能仅凭 HTTP 2xx 提示“请求成功”。
if (!isTmBusinessSuccess(tmResult.data)) throw new Error(tmResult.data?.message || 'TM 创建任务失败');</code></pre>
<p>TM 入库任务同样使用 <code>receiptordertask</code>;入库明细必须至少包含物料编码与数量,涉及批次时还需传 <code>batch_number</code>。条码接口文档定义的返回结构为 <code>{ code, data, message }</code>HTTP 200/201 才代表传输成功401 表示 Token 无效403 表示无权限404 表示路径/资源不存在。业务成功码需由 TM 供应方确认后配置到网关。</p>
<div class="notice risk"><strong>现有代码需注意:</strong>多个页面在 <code>await posttm(...)</code> 后不检查 <code>result2.success</code><code>result2.data.code</code> 即弹出“请求成功”。联调或正式上线前,必须改为以上述两层校验为准,并把 TM 的任务 ID、返回码、返回信息和请求流水号落库才能支持查询、重推与对账。</div>
</section>
<section id="sql">
<h2>7. SAP 只读数据查询</h2>
<p>以下数据通过 SQL Server 链接服务器 <code>[SAP]</code> 读取,不属于 Service Layer 写接口。存储过程只能使用最小字段集,避免无条件跨库大范围查询。</p>
<table>
<thead><tr><th>SAP 视图</th><th>项目用途</th><th>代表字段/关联口径</th></tr></thead>
<tbody>
<tr><td><code>SBO_YL.dbo.UBT_OITM</code></td><td>物料下拉查询、设计报工物料查询。</td><td>物料编码、物料名称、物料描述、规格型号、自制件属性。</td></tr>
<tr><td><code>SBO_YL.dbo.VIEW_OPRJ</code></td><td>设计报工项目号查询。</td><td>项目代码、项目名称;项目号必须从 SAP 项目视图读取。</td></tr>
<tr><td><code>SBO_YL.dbo.VIEW_Jijiankukc</code></td><td>及时齐套跟踪的缺件和库存查询。</td><td>ItemCode、DocEntry、Project、未发货数量、在制采购、采购预计交货日期、库存量等。</td></tr>
<tr><td><code>SBO_YL.dbo.UBT_ODRF_ODLNMES</code></td><td>发货通知与发货瓶颈看板。</td><td>生产单号、项目号、物料、交货数量、要求发货时间、单据状态。</td></tr>
</tbody>
</table>
<pre><code>-- 只读示例:以参数限定、显式转换数据类型
SELECT TOP (100)
CAST([物料编码] AS nvarchar(100)) AS [物料编码],
CAST([物料名称] AS nvarchar(200)) AS [物料名称]
FROM [SAP].[SBO_YL].[dbo].[UBT_OITM]
WHERE CAST([物料编码] AS nvarchar(100)) LIKE N'%' + @过滤 + N'%'
ORDER BY CAST([物料编码] AS nvarchar(100));</code></pre>
<div class="notice">当四段名称跨库查询出现性能问题,应优先采用受控的 <code>OPENQUERY([SAP], ...)</code> 或将目标集先落入临时表,再与 MES 数据关联。不要在页面主列表中循环逐行查询 SAP。</div>
</section>
<section id="mytask">
<h2>8. 定时同步存储过程 <code>dbo.update_MyTask</code></h2>
<p>该过程运行在 <code>YL_MESDB</code>,不接收参数。它通过 SQL Server 链接服务器 <code>[SAP].[SBO_YL].[dbo]</code> 读取 SAP 视图,再更新 MES 本地表;过程本身不调用 Service Layer也不向 SAP 写入数据。</p>
<h3>8.1 SQL Agent 定时作业</h3>
<table><thead><tr><th>项目</th><th>实际配置</th></tr></thead><tbody>
<tr><td>作业名称</td><td><code>更新</code>,已启用</td></tr>
<tr><td>作业步骤</td><td><code>执行更新</code>,数据库 <code>YL_MESDB</code></td></tr>
<tr><td>执行命令</td><td><code>EXEC update_MyTask</code></td></tr>
<tr><td>计划</td><td><code>定时1min</code>,已启用;每日按 1 分钟间隔执行,起始时间 00:00:00。</td></tr>
</tbody></table>
<h3>8.2 实际同步内容</h3>
<table><thead><tr><th>MES 本地表</th><th>SAP 来源</th><th>更新字段与业务含义</th></tr></thead><tbody>
<tr><td><code>质量检验_质检任务_SAP</code></td><td><code>ubt_OPKL_UrgentMaterials</code></td><td>按物料编码更新 <code>加急总数</code><code>加急状态</code></td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OWOR_OIGN</code></td><td>按订单编号更新 <code>入库数量</code>(来源已完工数量)。</td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_ODRF_ODLNMES</code></td><td>按生产单号更新 <code>发货状态</code><code>要求发货日期</code></td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td><code>ubt_OPKL_UrgentMaterials</code></td><td>按物料编号更新 <code>加急总数</code><code>加急状态</code></td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OPKL_CompleteSet</code></td><td>按生产订单号更新 <code>齐套</code><code>发料状态</code><code>齐套时间</code><code>拣配状态</code></td></tr>
<tr><td><code>MES_接口_生产计划_生产任务</code></td><td><code>UBT_OPKL_CompleteSet</code></td><td>当 SAP 执行状态为“可执行”且订单行号为 1 时,将 <code>任务状态</code> 更新为 1。</td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td><code>UBT_OWOR</code><code>UBT_MES_ISSUEPRINT</code></td><td>将已取消/已结算订单标记为“已取消”,并同步 <code>派工时间</code>(打印时间)。</td></tr>
</tbody></table>
<h3>8.3 执行方式</h3>
<pre><code>-- SQL Agent 当前每分钟执行一次的命令
USE [YL_MESDB];
GO
EXEC [dbo].[update_MyTask];
GO</code></pre>
<p>过程将同步分为三个独立事务块,每个块使用 <code>TRY...CATCH</code>:发生错误即回滚当前事务并重新抛出错误。所有同步结果以 MES 本地表更新为准,页面查询应读取相应 MES 字段,不应把此过程误认为直接更新 SAP 单据的接口。</p>
</section>
<section id="pagecalls">
<h2>9. 页面 SAP / TM 接口调用清单</h2>
<p>本节按当前 <code>src/views</code> 中的有效调用整理,未计入注释代码和“副本”页面。所有前端调用均是向 MES 网关发送 HTTP <code>POST</code>;以下 <code>func</code> 才是网关转发给 B1/TM 的实际方法。</p>
<div class="notice risk"><strong>调用限制:</strong>本说明中所有 <code>"func": "POST"</code><code>"func": "PATCH"</code> 的网关请求均为<strong>禁止调用</strong>,不得在 Postman、浏览器控制台或其他客户端执行。即使 <code>QueryService_PostQuery</code> 的业务用途为查询,它的网关 <code>func</code> 仍为 <code>POST</code>,同样禁止调用。仅 <code>"func": "GET"</code> 可用于只读查询。</div>
<h3>9.1 Postman 网关环境</h3>
<table><thead><tr><th>Postman 变量</th><th>当前项目配置</th><th>用途</th></tr></thead><tbody>
<tr><td><code>{{mes_b1_gateway}}</code></td><td><code>https://192.168.2.92:9996/b1s</code></td><td>SAP B1 网关</td></tr>
<tr><td><code>{{mes_tm_gateway}}</code></td><td><code>https://192.168.2.92:9996/openapi</code></td><td>TM 条码网关</td></tr>
</tbody></table>
<pre><code>POST {{mes_b1_gateway}}
Content-Type: application/json
{
"func": "GET",
"cmd": "ProductionOrders",
"content": "{\"$filter\":\"AbsoluteEntry eq 7316\"}"
}</code></pre>
<p>这是页面 <code>getB1('/ProductionOrders', { '$filter': 'AbsoluteEntry eq 7316' })</code> 发出的实际网关格式。将 <code>cmd</code> 填为下表对象路径,<code>content</code> 必须是 JSON 字符串而不是 JSON 对象。</p>
<h3>9.2 页面与功能映射、操作与截图</h3>
<table><thead><tr><th>页面</th><th>功能入口</th><th>系统 / func</th><th>cmd</th><th>页面实际传入参数</th></tr></thead><tbody>
<tr><td><code>SystemMaintenance/WorkstationManagement</code></td><td>新增工位</td><td>B1 / <span class="tag write">POST</span></td><td><code>Resources</code></td><td><code>VisCode</code> 工位号、<code>Name</code> 工位名、<code>ForeignName</code><code>Type=rtMachine</code><code>Group=1</code><code>UnitOfMeasure</code><code>IssueMethod=rimManual</code><code>Active=tYES</code><code>Inactive=tNO</code><code>Remarks</code><code>Allocation=raOnStartDate</code></td></tr>
<tr><td><code>SystemMaintenance/WorkstationManagement</code></td><td>编辑工位</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>Resources('工位号')</code></td><td><code>Name</code></td></tr>
<tr><td><code>ProcessManagement/ProcedureManagement</code></td><td>新增工艺</td><td>B1 / <span class="tag write">POST</span></td><td><code>RouteStages</code></td><td><code>Code</code>MES 工艺编号)、<code>Description</code>(工艺名称)、<code>CreationDate</code><code>DateOfUpdate</code></td></tr>
<tr><td><code>ProcessManagement/ProcedureManagement</code></td><td>编辑工艺</td><td>B1 / <span class="tag read">GET</span><span class="tag write">PATCH</span></td><td><code>RouteStages</code><code>RouteStages(InternalNumber)</code></td><td>先以 <code>$filter: Code eq '工艺编号'</code> 查询;从返回行取得 <code>InternalNumber</code> 后更新 <code>Description</code><code>DateOfUpdate</code></td></tr>
<tr><td><code>PlanManagement/PlannOrderClose</code></td><td>关闭生产订单</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单编号)</code></td><td><code>AbsoluteEntry</code><code>ProductionOrderStatus=boposClosed</code></td></tr>
<tr><td><code>PlanManagement/WorkstationPlan</code><code>SelfMakePlan</code><code>SelfMakePlando</code><code>SelfMakePlandone</code></td><td>排产完成</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单号)</code></td><td><code>AbsoluteEntry</code><code>U_MODueDate</code>(最晚完成)、<code>U_MOStartDate</code>(最早开始)。</td></tr>
<tr><td><code>PlanManagement/InstallMakePlan</code><code>InstallMakePlanDo</code><code>InstallMakePlanDone</code><code>SystemInstallTask</code><code>ValueInstallTask</code></td><td>派工</td><td>B1 / <span class="tag write">POST</span></td><td><code>PurchaseRequests</code></td><td><code>ReqType=12</code><code>Requester</code><code>PriceMode=G</code><code>RequesterBranch=-2</code><code>RequesterDepartment=-2</code><code>DocDate</code><code>DocDueDate</code><code>TaxDate</code><code>RequriedDate</code><code>Comments</code><code>DocumentLines[ItemCode, Quantity, WarehouseCode, U_WWOworID]</code></td></tr>
<tr><td>上述 5 个装配排产页</td><td>排产完成</td><td>B1 / <span class="tag write">PATCH</span></td><td><code>ProductionOrders(订单号)</code></td><td><code>AbsoluteEntry</code><code>U_MODueDate</code><code>U_MOStartDate</code><code>U_YJQTdate</code>(均使用页面计算出的开始/完成日期)。</td></tr>
<tr><td><code>ProductionManagement/OutsourceMange</code><code>SaleOutsourceMange</code></td><td>派工并同步 SAP</td><td>B1 / <span class="tag write">POST</span></td><td><code>PurchaseRequests</code></td><td>表头同派工;行项目实际含 <code>ItemCode</code><code>Quantity=指派数量</code><code>WarehouseCode</code><code>U_WWOworID</code>(订单号)、<code>U_WWOrst</code>(工序)、<code>U_WWOrstHS</code>(最后工序)、<code>U_WWOrstID</code>(最后 TaskAID</td></tr>
<tr><td><code>ProductionManagement/AssemblyCenter</code><code>MachiningCenter</code><code>QualityManagement/QualityCenter</code></td><td>领料弹窗</td><td>B1 / <span class="tag read">GET</span></td><td><code>ProductionOrders</code></td><td><code>$filter=AbsoluteEntry eq 当前订单号</code>;页面使用返回的 <code>ProductionOrderLines</code> 作为领料明细。</td></tr>
<tr><td><code>QualityManagement/CheckTask/materialReturn</code></td><td>退库质检后入库</td><td>B1 / <span class="tag read">GET</span></td><td><code>ProductionOrders</code></td><td><code>$filter=AbsoluteEntry eq 计划号</code>;按零件编码从 <code>ProductionOrderLines</code> 取得 <code>LineNumber</code>,作为 TM <code>base_line_num</code></td></tr>
<tr><td><code>ProductionManagement/WorkHoursCheck</code></td><td>工时校验上传 SAP</td><td>B1 / <span class="tag read">GET</span><span class="tag write">PATCH</span><span class="tag write">POST</span></td><td><code>ProductionOrders</code><code>InventoryGenExits</code></td><td><code>AbsoluteEntry</code> 查询订单;更新 <code>ProductionOrderLines</code><code>ProductionOrdersStages</code>;再提交 <code>DocDate</code><code>DocDueDate</code><code>Comments</code><code>DocumentLines</code>(资源报工行)。</td></tr>
<tr><td><code>QualityManagement/CheckTask/processReceive</code></td><td>外协收检</td><td>B1 / <span class="tag write">POST</span></td><td><code>QueryService_PostQuery</code><code>PurchaseDeliveryNotes</code></td><td>先传 <code>QueryPath=$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)</code><code>QueryOption</code>(订单号、工序和行状态筛选);匹配后传 <code>CardCode</code><code>CardName</code><code>DocDate</code><code>DocumentLines[BaseEntry, BaseLine, BaseType=22, Quantity, U_WWPassedQty]</code> 创建采购收货单。</td></tr>
<tr><td><code>ProductionManagement/AssemblyCenter</code><code>MachiningCenter</code><code>QualityManagement/QualityCenter</code><code>CheckTask/salesReturn</code></td><td>领料/销售退货出库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/issueordertask</code></td><td><code>doc_date</code><code>doc_type=202-60</code><code>external_num</code><code>task_items[base_type=202, base_entry, base_line_num, external_num, item_code, item_name, line_memo, whs_code, manage_type=B, price=0, quantity]</code></td></tr>
<tr><td><code>ProductionManagement/MachiningCenter</code></td><td>不合格品入库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/receiptordertask</code></td><td><code>doc_date</code><code>doc_type=202-59</code><code>external_num=计划号</code><code>task_items[base_entry, base_type=202, external_num, item_code, item_name, whs_code, manage_type=B, price=0, quantity=不合格数]</code></td></tr>
<tr><td><code>QualityManagement/CheckTask/materialReturn</code></td><td>退库质检合格后入库任务</td><td>TM / <span class="tag write">POST</span></td><td><code>stocktask/task/receiptordertask</code></td><td><code>doc_date</code><code>doc_type=202-60</code><code>external_num</code><code>target_type=202-59</code>,行项目含 <code>external_line_id</code><code>batch_number</code><code>task_materials_items[item_code, batch_number, quantity, open_quantity]</code> 及领料任务通用字段。</td></tr>
</tbody></table>
<h4 class="operation-heading">9.2.1 页面实际操作与系统截图</h4>
<p>以下为 MES 页面中的实际操作入口。截图来自系统操作手册中的真实页面;请先在 MES 页面完成业务操作。涉及 <span class="tag write">POST</span><span class="tag write">PATCH</span> 的接口均由系统受控流程触发,禁止在 Postman 中直接调用。</p>
<div class="operation-grid">
<article class="operation-card">
<h4>1. 工位资源维护</h4>
<p><strong>页面入口:</strong>系统管理 &gt; 工位管理。</p>
<ol>
<li>按工位名称输入查询条件,点击“查询”确认现有记录。</li>
<li>点击“新增”维护工位号、工位名称及资源属性;已有工位点击所在行“编辑”。</li>
<li>核对工位号无重复后,在 MES 页面提交保存。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>Resources</code>(新增)或 <span class="tag write">PATCH</span> <code>Resources('工位号')</code>(编辑)。禁止直接调用。</p>
<figure><a href="../static/user-manual/workstation-list.png" target="_blank"><img src="../static/user-manual/workstation-list.png" alt="MES 工位管理页面"></a><figcaption>系统管理 - 工位管理:查询、新增、编辑入口。</figcaption></figure>
</article>
<article class="operation-card">
<h4>2. 工艺阶段维护</h4>
<p><strong>页面入口:</strong>工艺管理 &gt; 工序管理。</p>
<ol>
<li>输入工艺名称,点击“查询”定位工序。</li>
<li>点击“新增”录入工序编码、工序名称;修改时点击对应行“编辑”。</li>
<li>提交前确认工序编码与 SAP B1 的 <code>RouteStages.Code</code> 对应。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>查询为 B1 <span class="tag read">GET</span> <code>RouteStages</code>;新增/编辑为 <span class="tag write">POST</span>/<span class="tag write">PATCH</span> <code>RouteStages</code>。禁止直接调用写请求。</p>
<figure><a href="../static/user-manual/process-procedure.png" target="_blank"><img src="../static/user-manual/process-procedure.png" alt="MES 工序管理页面"></a><figcaption>工艺管理 - 工序管理:按工序进行查询和维护。</figcaption></figure>
</article>
<article class="operation-card">
<h4>3. 工位排产与日期回写</h4>
<p><strong>页面入口:</strong>计划排产 &gt; 工位任务汇总。</p>
<ol>
<li>使用生产订单、销售订单、物料和工序等条件筛选任务。</li>
<li>切换至“日程”视图,选择待排产任务并调整计划开始、计划完成日期。</li>
<li>在 MES 完成排产;关闭订单时须进入计划排产的订单关闭页面执行确认。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>排产和订单关闭均使用 B1 <span class="tag write">PATCH</span> <code>ProductionOrders(订单号)</code>。禁止直接调用。</p>
<figure><a href="../static/user-manual/plan-workstation-schedule.png" target="_blank"><img src="../static/user-manual/plan-workstation-schedule.png" alt="MES 工位排产日程页面"></a><figcaption>计划排产 - 工位任务汇总:日程视图中的任务排产。</figcaption></figure>
</article>
<article class="operation-card">
<h4>4. 外协派工</h4>
<p><strong>页面入口:</strong>生产管理 &gt; 外协管理,或采购外协管理。</p>
<ol>
<li>按生产订单、供应商或工序查询待派工记录。</li>
<li>选择待派工行,填写或确认派工数量、仓库和计划日期。</li>
<li>在页面点击“派工并同步 SAP”由 MES 创建对应采购申请。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>PurchaseRequests</code>,行项目含物料、数量、仓库、订单号和工序。禁止直接调用。</p>
<figure><a href="../static/user-manual/production-outsource.png" target="_blank"><img src="../static/user-manual/production-outsource.png" alt="MES 外协管理页面"></a><figcaption>生产管理 - 外协管理:筛选待派工任务后在页面执行派工。</figcaption></figure>
</article>
<article class="operation-card">
<h4>5. 加工/装配领料条码任务</h4>
<p><strong>页面入口:</strong>生产管理 &gt; 加工中心或装配中心。</p>
<ol>
<li>按生产订单筛选并选中当前加工或装配任务。</li>
<li>点击“领料”,在弹窗中核对生产订单物料明细、批次、仓库和数量。</li>
<li>确认后由 MES 创建条码出库任务;在 TM 端按条码任务继续执行。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>明细读取为 B1 <span class="tag read">GET</span> <code>ProductionOrders</code>TM 出库任务为 <span class="tag write">POST</span> <code>stocktask/task/issueordertask</code>。禁止直接调用写请求。</p>
<figure><a href="../static/user-manual/production-machining-center.png" target="_blank"><img src="../static/user-manual/production-machining-center.png" alt="MES 加工中心页面"></a><figcaption>生产管理 - 加工中心:从任务列表进入领料业务。</figcaption></figure>
</article>
<article class="operation-card">
<h4>6. 工时校验与 SAP 生产反馈</h4>
<p><strong>页面入口:</strong>生产管理 &gt; 工时校验。</p>
<ol>
<li>按任务 ID、生产订单、操作人、时间范围和校验状态查询报工记录。</li>
<li>选中待处理记录后使用“一键校验”;仅在业务授权的情况下使用“直接校验”。</li>
<li>由 MES 根据校验结果更新订单工序并提交资源报工反馈,不在 Postman 重放请求。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag read">GET</span> <code>ProductionOrders</code>,以及 <span class="tag write">PATCH</span> <code>ProductionOrders</code><span class="tag write">POST</span> <code>InventoryGenExits</code>。禁止直接调用写请求。</p>
<figure><a href="../static/user-manual/production-work-hours-check.png" target="_blank"><img src="../static/user-manual/production-work-hours-check.png" alt="MES 工时校验页面"></a><figcaption>生产管理 - 工时校验:通过筛选、勾选和校验按钮处理报工。</figcaption></figure>
</article>
<article class="operation-card">
<h4>7. 序检收检与采购收货</h4>
<p><strong>页面入口:</strong>质量管理 &gt; 序检收检。</p>
<ol>
<li>切换至“序检收检”页签,按生产订单、物料、检验结果或状态查询。</li>
<li>选择待收检任务,点击该行“收检”,在收检界面填写合格数量等结果。</li>
<li>提交后由系统匹配采购订单行并生成采购收货单。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag write">POST</span> <code>QueryService_PostQuery</code> 查询采购订单行,随后 <span class="tag write">POST</span> <code>PurchaseDeliveryNotes</code> 收货。两项均禁止直接调用。</p>
<figure><a href="../static/user-manual/quality-process-receive.png" target="_blank"><img src="../static/user-manual/quality-process-receive.png" alt="MES 序检收检页面"></a><figcaption>质量管理 - 序检收检:选择任务行后点击“收检”。</figcaption></figure>
</article>
<article class="operation-card">
<h4>8. 退库质检与条码入库</h4>
<p><strong>页面入口:</strong>质量管理 &gt; 原材料退库检验。</p>
<ol>
<li>按单据码、生产订单、物料和检验状态查询待处理记录,点击行内“退库检”。</li>
<li>录入合格数量和批次信息,确认退库质检结论。</li>
<li>系统读取生产订单行号后创建 TM 入库任务TM 端扫码完成实物入库。</li>
</ol>
<p class="operation-trigger"><strong>接口触发:</strong>B1 <span class="tag read">GET</span> <code>ProductionOrders</code> 取得行号TM <span class="tag write">POST</span> <code>stocktask/task/receiptordertask</code> 创建入库任务。禁止直接调用写请求。</p>
<figure><a href="../static/user-manual/quality-material-return.png" target="_blank"><img src="../static/user-manual/quality-material-return.png" alt="MES 原材料退库检验页面"></a><figcaption>质量管理 - 原材料退库检验:完成检验后由系统创建条码入库任务。</figcaption></figure>
</article>
</div>
<h3>9.3 可直接提交的 Postman 请求体</h3>
<p>以下请求体用于识别实际页面参数。仅标记为 <code>func=GET</code> 的请求可在 Postman 的 <strong>Body / raw / JSON</strong> 中执行;所有 <code>func=POST</code><code>func=PATCH</code> 请求均禁止调用。</p>
<pre><code>// 1. B1查询生产订单供领料、工时校验、退库页面使用
POST {{mes_b1_gateway}}
{
"func": "GET",
"cmd": "ProductionOrders",
"content": "{\"$filter\":\"AbsoluteEntry eq 7316\"}"
}
// 禁止调用func=POSTB1 新增工位资源
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "Resources",
"content": "{\"VisCode\":\"WC-001\",\"Name\":\"测试工位\",\"ForeignName\":\"\",\"Type\":\"rtMachine\",\"Group\":1,\"UnitOfMeasure\":\"\",\"IssueMethod\":\"rimManual\",\"Active\":\"tYES\",\"Inactive\":\"tNO\",\"Remarks\":\"\",\"Allocation\":\"raOnStartDate\"}"
}
// 禁止调用func=PATCHB1 更新工位名称
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "Resources('WC-001')",
"content": "{\"Name\":\"测试工位(已更新)\"}"
}
// 4. B1按工艺代码查询再用返回的 InternalNumber 更新
POST {{mes_b1_gateway}}
{
"func": "GET",
"cmd": "RouteStages",
"content": "{\"$filter\":\"Code eq '10'\"}"
}
// 禁止调用func=PATCHB1 更新工艺阶段
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "RouteStages(10)",
"content": "{\"Description\":\"装配\",\"DateOfUpdate\":\"2026-08-03\"}"
}
// 禁止调用func=PATCHB1 排产日期回写生产订单
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "ProductionOrders(7316)",
"content": "{\"AbsoluteEntry\":7316,\"U_MODueDate\":\"2026-08-10\",\"U_MOStartDate\":\"2026-08-05\",\"U_YJQTdate\":\"2026-08-05\"}"
}
// 禁止调用func=PATCHB1 关闭生产订单
POST {{mes_b1_gateway}}
{
"func": "PATCH",
"cmd": "ProductionOrders(7316)",
"content": "{\"AbsoluteEntry\":7316,\"ProductionOrderStatus\":\"boposClosed\"}"
}</code></pre>
<pre><code>// 禁止调用func=POSTB1 装配派工创建采购申请
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "PurchaseRequests",
"content": "{\"ReqType\":12,\"Requester\":\"SAPJK001\",\"PriceMode\":\"G\",\"RequesterBranch\":-2,\"RequesterDepartment\":-2,\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"TaxDate\":\"2026-08-03\",\"RequriedDate\":\"2026-08-03\",\"Comments\":\"MES派工\",\"DocumentLines\":[{\"ItemCode\":\"108-001\",\"Quantity\":1,\"WarehouseCode\":\"W03\",\"U_WWOworID\":7316}]}"
}
// 禁止调用func=POSTB1 外协派工创建采购申请(增加工序关联字段)
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "PurchaseRequests",
"content": "{\"ReqType\":12,\"Requester\":\"SAPJK001\",\"PriceMode\":\"G\",\"RequesterBranch\":-2,\"RequesterDepartment\":-2,\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"TaxDate\":\"2026-08-03\",\"RequriedDate\":\"2026-08-10\",\"Comments\":\"MES外协派工\",\"DocumentLines\":[{\"ItemCode\":\"108-001\",\"Quantity\":3,\"WarehouseCode\":\"W03\",\"U_WWOworID\":7316,\"U_WWOrst\":\"外协工序\",\"U_WWOrstHS\":\"最后工序\",\"U_WWOrstID\":999}]}"
}
// 禁止调用func=POSTB1 工时校验的生产反馈DocumentLines 必须来自已查询到的 SAP 订单行
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "InventoryGenExits",
"content": "{\"DocDate\":\"2026-08-03\",\"DocDueDate\":\"2026-08-03\",\"Comments\":\"MES报工 AID:12345\",\"DocumentLines\":[{\"Quantity\":1.5,\"BaseType\":202,\"BaseEntry\":7316,\"BaseLine\":2,\"LineType\":\"dlt_Resource\",\"WarehouseCode\":\"\",\"U_ResName\":\"数控车床A\"}]}"
}
// 禁止调用func=POSTB1 外协收检前查询采购订单及行项目
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "QueryService_PostQuery",
"content": "{\"QueryPath\":\"$crossjoin(PurchaseOrders,PurchaseOrders/DocumentLines)\",\"QueryOption\":\"$expand=PurchaseOrders($select=DocEntry,DocNum,CardCode,CardName),PurchaseOrders/DocumentLines($select=ItemCode,LineNum,Price,U_WWOworID,U_WWOrstHS,LineStatus)&$filter=PurchaseOrders/DocEntry eq PurchaseOrders/DocumentLines/DocEntry and PurchaseOrders/DocumentLines/U_WWOworID eq 7316\"}"
}
// 禁止调用func=POSTB1 外协收检创建采购收货单
POST {{mes_b1_gateway}}
{
"func": "POST",
"cmd": "PurchaseDeliveryNotes",
"content": "{\"CardCode\":\"V001\",\"CardName\":\"供应商名称\",\"DocDate\":\"2026-08-03\",\"DocumentLines\":[{\"BaseEntry\":100,\"BaseLine\":0,\"BaseType\":22,\"Quantity\":5,\"U_WWPassedQty\":0}]}"
}</code></pre>
<pre><code>// 禁止调用func=POSTTM 创建领料出库任务
POST {{mes_tm_gateway}}
{
"func": "POST",
"cmd": "stocktask/task/issueordertask",
"content": "{\"doc_date\":\"2026-08-03\",\"doc_type\":\"202-60\",\"external_num\":7316,\"task_items\":[{\"base_type\":\"202\",\"base_entry\":7316,\"base_line_num\":2,\"external_num\":7316,\"item_code\":\"ITEM-001\",\"item_name\":\"物料名称\",\"line_memo\":\"MES领料\",\"whs_code\":\"\",\"manage_type\":\"B\",\"price\":0,\"quantity\":2}]}"
}
// 禁止调用func=POSTTM 创建不合格品/退库入库任务
POST {{mes_tm_gateway}}
{
"func": "POST",
"cmd": "stocktask/task/receiptordertask",
"content": "{\"doc_date\":\"2026-08-03\",\"doc_type\":\"202-59\",\"external_num\":7316,\"task_items\":[{\"base_type\":\"202\",\"base_entry\":7316,\"base_line_num\":2,\"external_num\":7316,\"item_code\":\"ITEM-001\",\"item_name\":\"物料名称\",\"whs_code\":\"\",\"manage_type\":\"B\",\"price\":0,\"quantity\":1}]}"
}</code></pre>
<p class="small">TM 返回为 <code>{ code, data, message }</code>B1 返回为网关透传的 Service Layer 响应。上面的请求体只用于已具备业务权限的测试/联调环境,订单号、行号、供应商、资源和物料均必须先从业务数据或前置查询结果获得。</p>
</section>
<p class="footer">依据当前前端封装与项目内 SQL 脚本整理。SAP 对象字段、网关认证方式和生产地址发生调整时,应同步修订本说明并完成回归验证。</p>
</main>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,44 @@
# 存储过程基础数据前端处理审计
审计日期2026-07-28
## 审计范围与口径
`src/views` 下的 99 个 Vue 页面进行静态检查。其中 88 个页面通过 `CreateData` 调用存储过程11 个页面未发现该调用。
本清单只记录“存储过程查询出基础行数据后,前端又参与形成页面业务展示结果”的当前执行路径,包含:合并、分组汇总、树形构造、去重、跨查询回填和状态推导。
以下情况不计入:单字段加减乘除、日期或数值格式化、下拉框标签映射、纯分页/索引处理、纯排序调整、纯颜色/样式推导、外协相关计算、日历事件重塑、`WEB_基本表_产品结构_查询`,以及前端页面未实际展示的计算或未被当前查询入口调用的遗留方法。
## 结论
按最新排除口径,剩余 **7 个页面**。这些页面的显示结果并不完全等同于某一个存储过程的原始返回,浏览器仍在重新组织任务、订单、工时或工位汇总。若这些结果需要与导出、接口或其他页面保持严格一致,应逐步将规则收敛到存储过程或后端服务。
## 已确认的当前执行路径
| 页面 | 查询存储过程 | 前端处理后显示的内容 |
| --- | --- | --- |
| `ProductionManagement/ProductionTaskManage` | `MES_ProductAdmin_Query``MES_ProductTask_WorkTimeSum` | 用第二次查询结果按 TaskAID、工序回填每条任务的总工时。 |
| `ProductionManagement/AssembleTaskManage` | `MES_OrderPlanned_Query``MES_OrderPlanned_ChildTask_Get` | 将子任务按 TaskAID 合并到父任务的 `children`,形成树表。 |
| `PlanManagement/WorkstationPlan` | `机加已排产_获取任务列表``设备管理_设备状态_查询` | “工位排产”标签实际展示按工位和日期分组后的任务数、数量、标准/结算工时汇总。 |
| `ProductionManagement/ProductionPlanTrack``AnomalousManagement/UrgentTask` | `生产管理_生产计划跟踪` | 将工序基础行按订单合并为订单级数据,并构造子工序和当前工序;排序、颜色及外协条件处理不计入。 |
| `ProductionManagement/AssemblePlanTrack` | `MES_OrderPlanned_Queryzp` | 按订单聚合工序并构造子工序;颜色推导不计入。 |
| `PlanManagement/TimelyKitTrackingResult` | `生产管理_及时齐套跟踪结果_查询` | 按订单、合同、计划、产品去重合并;缺件明细再去重,并解析工艺路线明细;外协工艺路线样式不计入。 |
## 明确排除项
- `CraftManagement/CraftMaintain``WEB_基本表_产品结构_查询` 不再输出。
- `ProductionManagement/Workhours``SettlementWorkhours``Timesheet``DesignReportTask/FinancialHours``DesignReportTask/HoursReport` 当前查询路径已改为直接解析存储过程返回的树和汇总,不再列入。
- `SaleManagement/saleorderstatus` 当前查询路径已改为直接解析 `销售管理_销售订单状态_树形查询` 返回的订单树,不再列入。
- `PlanManagement/PlanShell` 当前查询路径已改为直接解析 `计划排产_查询计划信息_树形查询` 返回的订单树,不再列入。
- `PlanManagement/SelfMakePlan``SelfMakePlando``InstallMakePlan``InstallMakePlanDo``SelfMakePlandone``InstallMakePlanDone``ValueInstallTask``SystemInstallTask` 只保留前端排序或样式标记,按新口径不列入。
- `PlanManagement/priorityinstall` 的数据重塑仅供日历使用,移除日历相关计算后不列入。
- `ProductionManagement/AssembleTasksSum``ProductionTasksSum` 虽保留源码,但菜单表中所有角色记录的 `是否启用` 均为 `0`,前端动态菜单不显示,不列入。
- `AnomalousManagement/OutPunctualWork``ProductionManagement/OutsourceMange``SaleOutsourceMange``OutsourceSheet` 属于外协相关处理,按新口径不列入。
- `ProductionManagement/MachiningCenter``AssemblyCenter``QualityManagement/QualityCenter` 只按选中 TaskAID 取回单条总工时,其余为单项进度除法,不列入。
## 风险与建议
1. 多个任务汇总页面会以第二个查询结果回填总工时;若查询范围或分页不一致,展示数据可能不完整。
2. 订单跟踪和齐套跟踪把多行基础数据合并为订单级展示,若前端分页后再处理,会出现同一订单跨页无法完整合并的风险。
3. 工位排产页在前端累计工时形成实际展示的工位汇总表,导出或其他接口若未复用规则,数值可能不一致。

View File

@@ -0,0 +1,654 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>MES 工时模块全流程技术说明</title>
<style>
@page { size: A4; margin: 16mm 14mm 17mm; }
* { box-sizing: border-box; }
html { font-family: "Microsoft YaHei", "Segoe UI", sans-serif; color: #20262d; font-size: 10.5pt; line-height: 1.62; }
body { margin: 0; background: #fff; }
h1, h2, h3, h4 { color: #153b4f; margin: 0; font-weight: 700; page-break-after: avoid; }
h1 { font-size: 27pt; line-height: 1.22; }
h2 { margin-top: 22px; padding: 7px 0 5px; border-bottom: 2px solid #15968f; font-size: 18pt; }
h3 { margin-top: 18px; font-size: 13.5pt; }
h4 { margin-top: 13px; font-size: 11pt; color: #355b6a; }
p { margin: 7px 0; }
ul, ol { margin: 6px 0 9px 21px; padding: 0; }
li { margin: 3px 0; }
code { font-family: Consolas, "Microsoft YaHei", monospace; font-size: 9.2pt; color: #8b2f3b; background: #f4f6f7; padding: 1px 3px; border-radius: 2px; word-break: break-all; }
pre { white-space: pre-wrap; word-break: break-word; background: #f4f7f8; border-left: 4px solid #15968f; padding: 10px 12px; font-size: 9pt; line-height: 1.5; page-break-inside: avoid; }
table { width: 100%; border-collapse: collapse; margin: 9px 0 14px; font-size: 8.8pt; table-layout: fixed; }
th, td { border: 1px solid #b9c5ca; padding: 5px 6px; vertical-align: top; word-break: break-word; }
th { background: #eaf2f3; color: #153b4f; text-align: left; font-weight: 700; }
tr { page-break-inside: avoid; }
.cover { min-height: 250mm; display: flex; flex-direction: column; justify-content: center; padding: 12mm 8mm; page-break-after: always; border-top: 10px solid #153b4f; border-bottom: 3px solid #15968f; }
.cover .kicker { color: #15968f; font-size: 12pt; font-weight: 700; margin-bottom: 16px; }
.cover .subtitle { margin-top: 16px; font-size: 14pt; color: #4d6069; }
.cover .meta { margin-top: 42px; border-top: 1px solid #b9c5ca; padding-top: 14px; color: #4d6069; }
.page-break { page-break-before: always; }
.note, .warning, .critical { margin: 10px 0; padding: 9px 11px; border-left: 4px solid; page-break-inside: avoid; }
.note { background: #edf7f6; border-color: #15968f; }
.warning { background: #fff6df; border-color: #d59622; }
.critical { background: #fff0f0; border-color: #b43d46; }
.small { font-size: 8.7pt; color: #596970; }
.toc a { color: #153b4f; text-decoration: none; }
.toc li { border-bottom: 1px dotted #aab7bd; padding: 2px 0; }
.flow { display: grid; grid-template-columns: 1fr 28px 1fr 28px 1fr; align-items: stretch; gap: 4px; margin: 12px 0 16px; page-break-inside: avoid; }
.flow .box { border: 1px solid #93a7af; background: #f8fafb; padding: 9px; min-height: 75px; }
.flow .arrow { display: flex; align-items: center; justify-content: center; color: #15968f; font-size: 18pt; font-weight: 700; }
.pill { display: inline-block; border: 1px solid #8ea1a9; padding: 1px 5px; margin: 1px 2px; border-radius: 3px; font-size: 8pt; background: #fff; }
.formula { background: #f4f7f8; border: 1px solid #c4d0d5; padding: 8px 10px; font-family: Consolas, "Microsoft YaHei", monospace; page-break-inside: avoid; }
.muted { color: #64757d; }
.w15 { width: 15%; } .w18 { width: 18%; } .w20 { width: 20%; } .w25 { width: 25%; } .w30 { width: 30%; } .w35 { width: 35%; }
</style>
</head>
<body>
<section class="cover">
<div class="kicker">MES_Manage_View_V20 / 生产工时专题</div>
<h1>MES 工时模块全流程技术说明</h1>
<div class="subtitle">从加工中心、装配中心和外协业务入口,到工时修正、校验、查询、报表、结算及生产计划跟踪</div>
<div class="meta">
<p><strong>整理范围:</strong>页面、交互流程、存储过程、计算方法、数据表、视图、SAP Service Layer、工时查询、报表、结算、外协与生产计划跟踪</p>
<p><strong>代码基线:</strong><code>snapshot/local-save-20260625-154806</code>,提交 <code>8fdd0b6</code></p>
<p><strong>数据库定义核对:</strong>2026-07-21只读查询当前对象定义</p>
<p><strong>文档版本:</strong>V1.0 / 2026-07-21</p>
</div>
</section>
<section class="toc">
<h2>目录</h2>
<ol>
<li><a href="#scope">范围、边界与结论</a></li>
<li><a href="#architecture">总流程与数据分层</a></li>
<li><a href="#pages">页面及功能清单</a></li>
<li><a href="#machining">加工中心工时流程</a></li>
<li><a href="#assembly">装配中心工时流程</a></li>
<li><a href="#maintenance">工时修正与异常工时</a></li>
<li><a href="#validation">工时校验与 SAP 上传</a></li>
<li><a href="#calculation">工时计算方法与公式</a></li>
<li><a href="#downstream">工时查询、工时报表与结算工时</a></li>
<li><a href="#outsource">外协与生产计划跟踪</a></li>
<li><a href="#procedures">存储过程和函数清单</a></li>
<li><a href="#tables">数据表清单与字段说明</a></li>
<li><a href="#views">视图及取数规则</a></li>
<li><a href="#sap">SAP 对接映射</a></li>
<li><a href="#states">状态、操作类别与单位</a></li>
<li><a href="#appendix">调用矩阵与资料来源</a></li>
</ol>
</section>
<section id="scope">
<h2>1. 范围、边界与结论</h2>
<h3>1.1 本文范围</h3>
<p>本文以生产现场产生工时的加工中心、装配中心和外协业务为起点完整覆盖工时修正、工时校验、SAP 上传,以及校验后的工时查询、工时报表、结算工时和生产计划跟踪。直接参与计算的班次、人员与工位绑定也纳入范围。</p>
<table>
<tr><th class="w20">层级</th><th>纳入内容</th><th class="w30">边界说明</th></tr>
<tr><td>现场入口</td><td>加工中心、装配中心的开始、结束、辅助、报工、加班、异常工时</td><td>产生原始操作记录和工时秒数</td></tr>
<tr><td>计算支撑</td><td>人员绑定、班次管理、生产任务、资源主数据、设备状态</td><td>决定参与人员、班次重叠、资源编码</td></tr>
<tr><td>校验前维护</td><td>工时修正、补录、开始/结束时间重算</td><td>仍写入原始操作记录表</td></tr>
<tr><td>校验与外部系统</td><td>工时校验、上传分钟计算、SAP 资源行与工时单据、校验副本</td><td>形成可统计的校验结果</td></tr>
<tr><td>查询与统计</td><td>工时查询、项目/作业者/任务/设备工时报表、结算工时</td><td>按任务、日期、人员、设备、物料等维度汇总</td></tr>
<tr><td>生产跟踪</td><td>外协管理、外协报表、生产计划跟踪</td><td>关联工时事件、工序进度、发收料、质检与供应商信息</td></tr>
</table>
<h3>1.2 明确排除的业务域</h3>
<p><code>设计报工</code><code>设计工时校验</code><code>设计工时报表</code>使用独立任务、报工和校验对象,不属于本生产工时链路,本文不纳入。</p>
<h3>1.3 核心结论</h3>
<ul>
<li>两类现场入口最终都写入 <code>YL_加工中心_操作记录表</code>,这是生产工时的事实源。</li>
<li>数据库工时统一以<strong></strong>存储页面主要以秒编辑、以分钟展示SAP <code>InventoryGenExits.DocumentLines.Quantity</code> 使用<strong>分钟</strong></li>
<li>设备工时来自 <code>实际工时</code>,典型公式为“开始至结束总秒数 - 暂停秒数”;人员工时来自 <code>总时长</code>,并可按人员/班次拆成独立记录。</li>
<li><code>View_生产工时视图</code>把原始记录、校验副本、生产订单、设备绑定数合并成校验页面的统一模型。</li>
<li>批量校验先调用 <code>usp_BatchValidateWorkTime</code>算出 SAP 上传分钟,再逐条补齐 SAP 工序/资源、生成工时单据;只有上传成功后才复制到校验表。</li>
<li>工时查询面向工序报工明细,工时报表提供项目、作业者、任务、设备四种统计口径,结算工时按物料、订单、工位汇总报工与辅助工时。</li>
<li>外协工序不进入标准内部生产工时视图,改用独立的外协任务、发收料、操作记录、采购和质检链路跟踪。</li>
</ul>
</section>
<section id="architecture">
<h2>2. 总流程与数据分层</h2>
<div class="flow">
<div class="box"><strong>现场动作</strong><br>加工中心:开始加工/辅助/报工<br>装配中心:人员开始/结束</div>
<div class="arrow"></div>
<div class="box"><strong>事实记录</strong><br><code>YL_加工中心_操作记录表</code><br>开始、结束、设备秒数、人员秒数</div>
<div class="arrow"></div>
<div class="box"><strong>统一视图</strong><br><code>View_生产工时视图</code><br>叠加订单、绑定、校验状态</div>
</div>
<div class="flow">
<div class="box"><strong>修正</strong><br>调整开始/结束、设备/人员工时、班次标准工时</div>
<div class="arrow"></div>
<div class="box"><strong>计算与 SAP</strong><br>班次内外拆分、日比例系数、资源行、工时单据</div>
<div class="arrow"></div>
<div class="box"><strong>校验结束</strong><br><code>生产管理_工时校验_校验工时表</code><br>形成已校验副本</div>
</div>
<div class="flow">
<div class="box"><strong>查询与报表</strong><br>工序、项目、作业者、任务、设备维度</div>
<div class="arrow"></div>
<div class="box"><strong>结算</strong><br>物料/订单/工位汇总<br>报工、辅助、单件工时</div>
<div class="arrow"></div>
<div class="box"><strong>计划跟踪</strong><br>工序状态、标准工时、外协发收料、质检与进度</div>
</div>
<h3>2.1 五层模型</h3>
<table>
<tr><th class="w18"></th><th class="w25">主要对象</th><th>职责</th></tr>
<tr><td>任务层</td><td><code>MES_接口_生产计划_生产任务</code><br><code>View_生产订单_MES</code></td><td>提供订单、TaskAID、工序、指派工位、分配数、完成数、任务/加工状态。</td></tr>
<tr><td>记录层</td><td><code>YL_加工中心_操作记录表</code><br><code>YL_加工中心_报工记录</code></td><td>记录每次现场动作、起止时间、设备工时、人员工时、加班和描述。</td></tr>
<tr><td>计算层</td><td><code>View_生产工时视图</code><br><code>usp_Calculate*</code></td><td>清洗记录、补齐上下文、按班次和当日标准工时计算上传分钟。</td></tr>
<tr><td>校验/外部层</td><td><code>生产管理_工时校验_校验工时表</code><br>SAP Service Layer</td><td>保存校验副本;补 SAP 工序/资源并提交资源消耗工时单据。</td></tr>
<tr><td>消费与跟踪层</td><td>工时查询/报表/结算过程<br><code>生产管理_生产计划跟踪</code><br><code>View_外协报表视图</code></td><td>把工时转为管理统计、单件结算和生产/外协进度信息。</td></tr>
</table>
</section>
<section id="pages" class="page-break">
<h2>3. 页面及功能清单</h2>
<table>
<tr><th class="w18">页面</th><th class="w25">组件路径</th><th>工时职责</th><th class="w18">阶段</th></tr>
<tr><td>加工中心</td><td><code>ProductionManagement/MachiningCenter/index.vue</code></td><td>设备型任务开始、辅助、结束报工、暂停口径、加班拆分、异常补录和工时修改。</td><td>起点</td></tr>
<tr><td>装配中心</td><td><code>ProductionManagement/AssemblyCenter/index.vue</code></td><td>以当前登录人员为粒度开始/结束任务,记录装配人员工时与加班。</td><td>起点</td></tr>
<tr><td>人员绑定</td><td><code>ProductionManagement/PersonnelBinding/index.vue</code></td><td>维护工位与人员关系;影响人员工时拆分、绑定设备数和 SAP 人员资源。</td><td>支撑</td></tr>
<tr><td>班次管理</td><td><code>ProductionManagement/ShiftManagement/index.vue</code></td><td>维护班次起止时间及班次人员;影响重叠秒数、班次内外拆分和比例系数。</td><td>支撑</td></tr>
<tr><td>工时修正</td><td><code>ProductionManagement/WorkhoursEdit/index.vue</code></td><td>查询当天/指定日期工时,修正开始结束、设备/人员秒数和班次标准工时,可补录操作记录。</td><td>校验前</td></tr>
<tr><td>工时校验</td><td><code>ProductionManagement/WorkHoursCheck/index.vue</code></td><td>查询昨日以前记录、筛选机加/装配/加班、修正、批量计算、上传 SAP、保存校验状态。</td><td>终点</td></tr>
<tr><td>工时查询</td><td><code>ProductionManagement/Workhours/index.vue</code></td><td>按 TaskAID、日期和明细三级展示工序工时、报工数量、单件工时与工艺标准工时。</td><td>查询</td></tr>
<tr><td>工时报表</td><td><code>ProductionManagement/Timesheet/index.vue</code></td><td>提供项目、作业者、任务、设备四类树形统计及对应导出。</td><td>统计</td></tr>
<tr><td>结算工时</td><td><code>ProductionManagement/SettlementWorkhours/index.vue</code></td><td>按物料和订单工位汇总报工、辅助、完成数、合计工时和结算单件工时,可导出 Excel。</td><td>结算</td></tr>
<tr><td>外协管理</td><td><code>ProductionManagement/OutsourceMange/index.vue</code><br><code>SaleOutsourceMange/index.vue</code></td><td>外协任务派工、发料、收料、供应商、备注、打印、历史和质检记录。</td><td>外协入口</td></tr>
<tr><td>外协报表</td><td><code>ProductionManagement/OutsourceSheet/index.vue</code></td><td>按订单和外协组汇总供应商、金额、计划/到货时间、发收料、质检和完成数量并导出。</td><td>外协统计</td></tr>
<tr><td>生产计划跟踪</td><td><code>ProductionManagement/ProductionPlanTrack/index.vue</code></td><td>按订单聚合工序路线、标准工时、开工/结束、外协结束、收料、质检、进度和加急状态。</td><td>计划跟踪</td></tr>
</table>
<div class="note"><strong>菜单范围:</strong>生产工时主链路涵盖“加工中心、装配中心、人员绑定、班次管理、工时修正、工时校验、工时查询、工时报表、结算工时、外协管理、外协报表、生产计划跟踪”。设计报工相关菜单明确排除。</div>
</section>
<section id="machining">
<h2>4. 加工中心工时流程</h2>
<h3>4.1 开始加工</h3>
<ol>
<li>页面检查已选择任务,并用 <code>生产管理_加工中心_设备是否正在加工</code>防止同一指派设备并行加工。</li>
<li>允许的任务状态为“可执行/已开工”,允许的前置加工状态为“报工、暂停、空、辅助结束”。</li>
<li>提交 <code>TaskAID、optor、收料、分配数</code><code>MES_ProductTask_WorkingStart</code></li>
<li>存储过程把任务状态置为已开工,更新开工/操作时间,必要时同步前序合格数为收料数量。</li>
<li>通过 <code>MES_ProductCenter_OptRecord_Save</code>插入“开始加工”记录,开始时间为数据库当前时间。</li>
</ol>
<h3>4.2 辅助开始与辅助结束</h3>
<p><code>MES_ProductTask_HelpStart</code>写入“辅助开始”;<code>MES_ProductTask_HelpEnd</code>更新辅助完成量、任务进度和状态,并调用公共记录过程闭合时间区间。辅助结束允许指定实际调机人员,并可拆出普通加班、休息日加班或法定休息日加班记录。</p>
<h3>4.3 正常报工</h3>
<ol>
<li>页面仅允许加工状态为“开始加工”的任务进入报工。</li>
<li>加载同订单任务、班次配置和最近开始时间;页面根据时间判断原始班次,并收集报工数量、绑定任务、前序不合格数、班次和加班人员。</li>
<li><code>MES_ProductTask_ProdReport</code>校验报工累计数量不得超过收料/指派数量,更新完成数量和任务状态。</li>
<li>主“报工”记录由 <code>MES_ProductCenter_OptRecord_Save</code>闭合:总时长为起止差,暂停总时长为周期内暂停之和,实际工时为两者之差。</li>
<li>工作日调用 <code>计算人员工时</code>按工位绑定人员和班次重叠生成独立人员记录;休息日/法定休息日不在此步骤生成普通人员工时,而由加班记录承担。</li>
</ol>
<h3>4.4 公共记录过程的周期配对</h3>
<table>
<tr><th>结束动作</th><th>寻找的开始动作</th><th>形成字段</th></tr>
<tr><td>报工</td><td>同 TaskAID、同工位的“开始加工”</td><td><code>关联开始记录ID、开始时间、结束时间、总时长、暂停总时长、实际工时</code></td></tr>
<tr><td>辅助结束</td><td>同 TaskAID、同工位的“辅助开始”</td><td>同上,操作类别和 SAP 资源使用“辅助-”前缀</td></tr>
<tr><td>暂停</td><td>最近的“开始加工/辅助开始”</td><td>闭合开始记录,写入暂停关联与暂停时长</td></tr>
</table>
<h3>4.5 加工中心内置维护</h3>
<p>页面还提供异常工时列表、异常工时新增和单条工时修改。修改时间后前端以 <code>round((结束-开始)/1000)</code>重算秒数,并调用 <code>加工中心_修改工时_保存修改记录</code>更新原始记录。</p>
</section>
<section id="assembly">
<h2>5. 装配中心工时流程</h2>
<h3>5.1 人员开始</h3>
<ol>
<li>页面以 <code>TaskAID + 当前用户名</code>检查当前用户是否已有未结束记录。</li>
<li>调用 <code>MES_人员工时记录_开始</code>;可执行任务第一次开始时更新为已开工。</li>
<li>插入操作类别为“开始加工”的记录,工位取任务指派对象,操作人取当前用户名,结束时间为空。</li>
<li>页面随后重新读取 <code>MES_人员工时记录_获取进行中任务</code><code>...获取进行中任务2</code>,保持本地状态与数据库一致。</li>
</ol>
<h3>5.2 人员结束</h3>
<p>结束时必须找到同任务、同用户、操作类别为“开始加工”且结束时间为空的最近记录。用户补充备注、工序说明、异常说明,并选择工作日/休息日/法定休息日、是否加班、普通/特殊工时人员及班次标准工时。</p>
<table>
<tr><th class="w25">场景</th><th>装配结束过程的拆分规则</th></tr>
<tr><td>工作日,不加班</td><td>全部起止秒数作为普通工作时间;更新开始记录的 <code>总时长</code></td></tr>
<tr><td>工作日,加班</td><td>以白班结束时间为切点:班次结束前为普通工作时间,之后为加班;若开始已晚于班次结束,全部为加班。</td></tr>
<tr><td>休息日/法定日,加班</td><td>全部起止秒数作为加班,主开始记录的工时和总时长被置 0另插加班人员记录。</td></tr>
<tr><td>休息日/法定日,不加班</td><td>过程先识别为“休息日工作/法定休息日工作”,但随后主记录在休息日分支中被置 0同时会向 <code>YL_加工中心_报工记录</code>写一条工作记录。此处存在双表口径差异。</td></tr>
</table>
<h3>5.3 装配与机加的主要差异</h3>
<table>
<tr><th>维度</th><th>加工中心</th><th>装配中心</th></tr>
<tr><td>主对象</td><td>设备任务 + 工位绑定人员</td><td>当前登录人员 + 装配任务</td></tr>
<tr><td>开始过程</td><td><code>MES_ProductTask_WorkingStart</code></td><td><code>MES_人员工时记录_开始</code></td></tr>
<tr><td>结束过程</td><td><code>MES_ProductTask_ProdReport</code>或辅助结束</td><td><code>MES_人员工时记录_结束</code></td></tr>
<tr><td>设备工时</td><td>主报工记录通常有 <code>实际工时</code></td><td>人员开始记录通常以 <code>总时长</code>为主</td></tr>
<tr><td>人员拆分</td><td>可由工位绑定和班次交叉生成多条</td><td>以登录用户结束记录,并可另生成加班人员记录</td></tr>
</table>
</section>
<section id="maintenance" class="page-break">
<h2>6. 工时修正与异常工时</h2>
<h3>6.1 工时修正页面</h3>
<p>“工时修正”读取 <code>工时校验_获取操作记录列表</code>,允许在进入最终校验前修正记录。主要筛选包括日期、校验状态、机加/装配性质、异常、任务 ID、生产订单、加班与人员。</p>
<ul>
<li>开始/结束时间变化时,设备工时和人员工时同时按秒重算。</li>
<li>保存调用 <code>工时校验_保存校验记录</code>,实际行为是更新原始操作记录表,并未插入校验表。</li>
<li><code>加工工时</code>映射原表 <code>实际工时</code><code>总时长</code>映射人员时间;班次标准工时写回原表。</li>
<li>可查看指定工位当天每分钟设备状态累计,但当前查看按钮在工时校验页被注释,工时修正页仍保留调用能力。</li>
<li>可补录“报工/辅助结束”,补录过程直接按起止时间计算 <code>实际工时</code>,写入原始操作记录。</li>
</ul>
<h3>6.2 异常工时</h3>
<p>加工中心和装配中心均内嵌异常工时入口。<code>异常工时_新增操作记录</code>根据订单与 TaskAID 补齐物料/工序上下文,按起止时间计算秒数并写入事实表;<code>加工中心_异常工时_获取操作记录列表</code>用于回查;<code>加工中心_修改工时_保存修改记录</code>用于修正。</p>
<div class="warning"><strong>管理原则:</strong>修正和补录都会直接改变事实源。当前过程记录最后编辑人/时间,但没有独立的修改前值历史表;审计主要依赖最后编辑字段和操作描述。</div>
</section>
<section id="validation">
<h2>7. 工时校验与 SAP 上传</h2>
<h3>7.1 查询范围</h3>
<p>默认显示未校验、机加、正常记录。查询过程 <code>工时校验_获取昨日之前操作记录列表</code>固定增加“开始时间小于今天 00:00:00”因此当日记录不会进入终检。页面可按任务 ID、订单、人员、机加/装配、加班与校验状态筛选。</p>
<h3>7.2 一键校验顺序</h3>
<ol>
<li>只处理用户勾选且尚未校验的记录。</li>
<li>生产订单 <code>3886</code>直接复制进校验表,不计算、不上传 SAP。</li>
<li>其他记录传入 <code>usp_BatchValidateWorkTime</code>,逐条得到 <code>UploadMinutes、WorkType、CalculationDetail</code></li>
<li>对计算成功记录,读取 SAP 生产订单和 MES 工序,补齐缺失的工序阶段和资源行。</li>
<li>按操作类别形成设备或人员资源工时行;先更新 SAP 生产订单资源行计划量,再 POST 资源发料单。</li>
<li>只有 SAP 上传返回成功,才调用 <code>工时校验_批量保存校验记录</code>形成已校验副本。</li>
<li>计算失败或 SAP 上传失败的记录保持未校验,便于再次处理。</li>
</ol>
<h3>7.3 页面颜色与人工修正</h3>
<ul>
<li>结束时间为空:红色优先级。</li>
<li>设备工时或人员工时大于 33,000 秒:红色优先级。</li>
<li>结束时间早于昨天 00:00橙色优先级。</li>
<li>未校验记录可修改起止时间、设备/人员秒数和标准工时;已校验记录只读。</li>
</ul>
<h3>7.4 已校验判定</h3>
<p><code>View_生产工时视图</code>通过 <code>生产管理_工时校验_校验工时表.报工记录id = 原始记录.AID</code>关联。存在校验副本即 <code>已校验=1</code>,并优先显示校验表字段。</p>
</section>
<section id="calculation" class="page-break">
<h2>8. 工时计算方法与公式</h2>
<h3>8.1 基础时间</h3>
<div class="formula">总时长秒 = DATEDIFF(SECOND, 开始时间, 结束时间)<br>暂停总时长秒 = 周期内所有已闭合暂停记录的暂停时长之和<br>设备实际工时秒 = 总时长秒 - 暂停总时长秒</div>
<p>在统一视图中:<code>加工工时 = 校验表.工时(有校验副本时)或 原表.实际工时</code><code>总时长 = 原表.总时长</code></p>
<h3>8.2 人员工时拆分</h3>
<p><code>计算人员工时</code>获取工位绑定人员,并与所有有效班次做笛卡尔组合,再调用 <code>计算班次重叠秒数</code>计算每个人在各班次的重叠时间。仅保留人员已绑定的班次和正重叠记录;指定人员若无班次绑定,则保留重叠最长班次,完全无重叠时至少给 1 秒。</p>
<div class="formula">当前生效公式:人员计算工时秒 = 班次重叠秒数<br><span class="muted">历史“重叠秒数 / 绑定设备数”的分摊公式已在存储过程中注释,不再生效。</span></div>
<h3>8.3 当日归一化系数</h3>
<p><code>usp_CalculateDailyRatio</code>按“操作人 + 开始日期”汇总符合条件的总时长:</p>
<ul>
<li><code>总时长 &gt; 300</code>秒;</li>
<li><code>阶段标识 != -1</code></li>
<li>订单不等于 <code>3886</code></li>
<li>排除“加班、休息日工作、法定休息日工作”。</li>
</ul>
<div class="formula">当日总分钟 = Σ有效记录总时长秒 / 60<br>比例系数 Ratio = (标准工时小时 × 60) / 当日总分钟<br>若当日总分钟或标准工时不大于 0则 Ratio = 1</div>
<h3>8.4 班次内外拆分</h3>
<p><code>usp_CalculateShiftTime</code>将一个起止区间逐段分到班次内和班次外,支持跨天班次;如果结束早于开始,会先交换。班次优先按人员名称从 <code>View_设备工位人员</code>匹配,其次按工位;匹配不到则默认 <code>07:45-16:30</code></p>
<h3>8.5 最终 SAP 上传分钟</h3>
<table>
<tr><th class="w25">操作类别</th><th>上传分钟公式</th><th class="w25">工时类型</th></tr>
<tr><td>总时长小于 300 秒</td><td><code>0</code>,跳过 SAP但计算结果按成功处理</td><td>跳过SAP</td></tr>
<tr><td>普通报工、开始加工</td><td><code>(总时长秒 / 60) × Ratio</code></td><td>工作</td></tr>
<tr><td>辅助开始、辅助结束</td><td><code>(总时长秒 / 60) × Ratio</code></td><td>辅助</td></tr>
<tr><td>工作日加班</td><td><code>总时长秒 / 60</code>,不乘系数</td><td>加班</td></tr>
<tr><td>休息日/法定休息日加班</td><td><code>班次内分钟 × Ratio + 班次外分钟</code></td><td>加班</td></tr>
<tr><td>其他类别</td><td><code>(总时长秒 / 60) × Ratio</code></td><td>其他</td></tr>
</table>
<h3>8.6 示例</h3>
<table>
<tr><th>场景</th><th>输入</th><th>结果</th></tr>
<tr><td>普通工时归一化</td><td>某人当日有效总工时 420 分钟,标准工时 8 小时;本条 60 分钟</td><td>Ratio=480/420=1.142857;上传约 68.57 分钟</td></tr>
<tr><td>工作日加班</td><td>加班记录总时长 7,200 秒</td><td>上传 120 分钟,不乘 Ratio</td></tr>
<tr><td>设备报工</td><td>起止 3,600 秒,暂停 600 秒</td><td>总时长 3,600 秒;设备实际工时 3,000 秒SAP 设备 Quantity=50 分钟</td></tr>
<tr><td>短记录</td><td>总时长 299 秒</td><td>UploadMinutes=0WorkType=跳过SAP随后可直接保存为已校验</td></tr>
</table>
</section>
<section id="downstream" class="page-break">
<h2>9. 工时查询、工时报表与结算工时</h2>
<h3>9.1 工时查询</h3>
<p>“工时查询”页面调用 <code>生产管理_工时查询_工序工时_查询</code>,用于从生产报工记录反查具体任务、日期和单次工时。查询参数包括合同号、产品编码、订单号、开始/结束日期和数据条数,默认最多返回 100 条基础工时记录。</p>
<h4>数据范围</h4>
<ul>
<li>主数据源为 <code>View_生产工时视图</code>,只取操作内容或操作类别为“报工/辅助结束”的记录。</li>
<li>要求 <code>加工工时 &gt; 0</code>,因此该页面以设备报工工时为主体。</li>
<li>用订单号和工艺顺序关联 <code>车间生产管理工艺_零件生产工艺_工艺库</code>,补充标准工时。</li>
<li>同 TaskAID、同开始时间从 <code>View_生产工时视图全部</code>汇总加工工时不大于 0 的人员行,拼成操作人列表。</li>
<li>报工数量按 TaskAID + 开始时间取最大值,异常记录取负数;装配工位报工数量固定显示 0。</li>
</ul>
<h4>三级结构</h4>
<table>
<tr><th class="w20">层级</th><th>分组</th><th>展示内容</th></tr>
<tr><td>Level 1</td><td>TaskAID</td><td>任务描述、报工次数、去重报工数量、总工时、单件工时、工艺工时。</td></tr>
<tr><td>Level 2</td><td>TaskAID + 工作日期</td><td>日期报工次数、日期数量、日期总工时和单件工时。</td></tr>
<tr><td>Level 3</td><td>单次开始时间</td><td>班次、操作人、生产订单、正常/调机类型、工位、工时、报工数量和开始时间。</td></tr>
</table>
<div class="formula">工时小时 = 加工工时秒 / 3600<br>工时分钟 = 加工工时秒 / 60<br>单件工时(分钟/件) = 工时分钟 / 报工数量;无有效数量时回退到工艺标准工时</div>
<h3>9.2 工时报表</h3>
<p>“工时报表”页面调用四套统计过程,公共筛选项包括合同号、操作人、产品编码、工序名称、订单号、工时类型和日期范围。页面将结果构造成树形表,顶部只汇总第一层工时,并可按工时类型显示分类合计。</p>
<table>
<tr><th class="w20">页签</th><th class="w30">存储过程</th><th>分组和用途</th></tr>
<tr><td>项目工时</td><td><code>工时统计_项目工时_查询</code></td><td>Level 1 按合同号+产品汇总Level 2 按工序、班组工时类型、操作人和订单展开。</td></tr>
<tr><td>作业者工时</td><td><code>工时统计_作业者工时_查询</code></td><td>Level 1 操作人汇总Level 2 按日期Level 3 展开任务、工序、类别、起止时间、异常/工序说明。</td></tr>
<tr><td>任务工时</td><td><code>工时统计_任务工时_查询</code></td><td>Level 1 按合同、订单、产品、工序、班组工时类型和操作类别汇总Level 2 展开操作人和单次工时。</td></tr>
<tr><td>设备工时</td><td><code>工时统计_设备工时_查询</code></td><td>Level 1 工位汇总Level 2 按日期Level 3 展开订单、产品、工序、班次、报工类型和起止时间。</td></tr>
</table>
<h4>报表有效工时口径</h4>
<table>
<tr><th class="w30">记录条件</th><th>有效工时秒</th></tr>
<tr><td>报工/辅助结束且加工工时大于 0</td><td>加工工时,代表设备工时。</td></tr>
<tr><td>报工/辅助结束且加工工时为 0、总时长大于 0</td><td>总时长,代表人员工时。</td></tr>
<tr><td>加班类别</td><td>总时长。</td></tr>
<tr><td>开始加工且总时长大于 0</td><td>总时长,主要覆盖装配人员开始/结束记录。</td></tr>
<tr><td>作业者报表中的异常</td><td>总时长取负数,用于冲减。</td></tr>
</table>
<p>人员的“工时类型”来自 <code>登录基础数据_人员信息.班组</code>,没有班组时归入“未分类”。项目、作业者和任务报表基于 <code>View_生产工时视图全部</code>,因此可以覆盖已关闭订单;设备报表要求 <code>阶段标识=-1</code>,人员类统计通常排除该阶段。</p>
<h4>导出</h4>
<p>四个页签分别调用对应的 <code>..._查询_导出</code>过程,前端以操作类型 <code>2001</code>触发服务端表格文件生成。导出字段包含合同、订单、产品、工序、人员/设备、指派对象、数量、起止时间和工时。</p>
<h3>9.3 结算工时</h3>
<p>“结算工时”页面调用 <code>生产管理_结算工时_查询</code>,查询参数为合同号、产品编码、订单号、工位、日期范围和数据条数。过程将生产计划、生产任务和工时视图连接,形成物料汇总和订单工位明细两层数据。</p>
<h4>数据条件与分组</h4>
<ul>
<li>生产任务物料类型必须为 <code>pit_Resource</code></li>
<li>生产订单编号大于 6000生产计划单据状态不为空。</li>
<li>工位优先使用生产任务指派对象,未设置时使用工时记录工位名称。</li>
<li>同 TaskAID、同开始时间从全量工时视图拼接人员工时行的操作人。</li>
<li>Level 1 按物料编号/描述汇总Level 2 按物料、订单、工位和工序顺序汇总。</li>
</ul>
<h4>结算公式</h4>
<div class="formula">报工工时 = Σ普通报工加工工时秒 / 3600<br>辅助工时 = Σ辅助结束加工工时秒 / 3600<br>合计工时 = 报工工时 + 辅助工时<br>结算报工单件工时 = 报工工时 / 报工完成数<br>结算辅助单件工时 = 辅助工时 / 辅助完成数</div>
<p>页面同时展示报工完成数、辅助完成数、记录数、操作人和工序顺序,并在浏览器端计算三项总工时。导出使用前端 XLSX 生成“结算工时”工作表。</p>
</section>
<section id="outsource">
<h2>10. 外协与生产计划跟踪</h2>
<h3>10.1 外协在工时体系中的位置</h3>
<p>外协工序仍以生产任务和 <code>TaskAID</code>为主线,并把发料、收料动作写入 <code>YL_加工中心_操作记录表</code>;但 <code>View_生产工时视图</code>明确过滤 <code>工位名称='外协'</code>,因此外协不参与内部设备/人员工时校验、SAP 人员资源工时和常规工时报表。</p>
<div class="flow">
<div class="box"><strong>外协派工</strong><br>连续工序分组、供应商、计划时间、打印与备注</div>
<div class="arrow"></div>
<div class="box"><strong>外协发料</strong><br>更新任务收料数量<br>写“收料”操作记录</div>
<div class="arrow"></div>
<div class="box"><strong>外协收料</strong><br>更新任务完成数量<br>写“报工”操作记录</div>
</div>
<p>外协“报工”代表外协收货/完成数量事件,并非内部人员计时。外协用开始/结束事件时间、发料数量、收料数量、供应商采购到货日期、金额和质检结果完成进度跟踪。</p>
<h3>10.2 外协管理页面</h3>
<table>
<tr><th class="w25">功能</th><th class="w35">过程</th><th>说明</th></tr>
<tr><td>任务查询</td><td><code>生产管理_外协管理_查询外协全部</code><br><code>...查询外协</code></td><td>读取外协资源任务,按订单、产品、工序、派工/发料/完成状态筛选;连续订单行和同一外协分组按组判断状态。</td></tr>
<tr><td>派工</td><td><code>计划排产_派工</code></td><td>设置外协工位、供应商/人员、指派数量、计划时间和外协分组。</td></tr>
<tr><td>外协发料</td><td><code>生产管理_外协管理_外协发料查询</code><br><code>...外协发料保存</code></td><td>增加任务收料数量并写“收料”操作记录;任务可转为已开工/可执行。</td></tr>
<tr><td>外协收料</td><td><code>生产管理_外协管理_外协收料保存</code></td><td>增加完成数量,达到指派数量时任务置完成,并写工位为外协的“报工”操作记录。</td></tr>
<tr><td>历史与质检</td><td><code>...外协历史查询</code><br><code>...查询外协历史记录</code><br><code>...查询质检记录</code></td><td>回查派工、发收料和收检结果。</td></tr>
<tr><td>单据维护</td><td><code>...更新打印次数</code><br><code>...更新备注</code></td><td>保留外协打印和备注信息。</td></tr>
</table>
<h3>10.3 外协报表</h3>
<p>“外协报表”调用 <code>生产管理_外协报表_查询</code>,数据源为 <code>View_外协报表视图</code>。过程按订单号、拆分内码和供应商合并连续外协工序,并分页返回:</p>
<ul>
<li>计划号、合同号、订单、产品、合并工序名称和 TaskAID 列表;</li>
<li>供应商、含税单价/行总计、计划开始/完成、采购预计到货和外协结束时间;</li>
<li>指派数量、发料数量、外协报工收料数量、完成数量;</li>
<li>收检合格/不合格、上序合格数、开票状态、材质和要求完工日期;</li>
<li>首行或上序已有合格数时标记为可执行。</li>
</ul>
<p><code>生产管理_外协报表_导出</code>提供相同口径的服务端导出。</p>
<h3>10.4 生产计划跟踪</h3>
<p>“生产计划跟踪”调用 <code>生产管理_生产计划跟踪</code>,读取包含已关闭订单的生产任务视图,并把订单下各资源工序组织成路线。页面可按订单、合同、产品、工序、计划时间、排产、自制件属性、加急和单据状态筛选,并在前端按是否包含外协工序再次过滤。</p>
<table>
<tr><th class="w25">信息组</th><th>来源与用途</th></tr>
<tr><td>计划与任务</td><td>计划号、计划/指派数量、计划开始/完成、要求完工日期、任务状态、加工状态、进度和标准工时。</td></tr>
<tr><td>工时事件</td><td>按 TaskAID 从操作记录取最早开始、最大结束;外协结束取“报工”记录的开始时间。</td></tr>
<tr><td>质量</td><td>收检合格/不合格按 TaskAID 汇总;终检按计划号判断。</td></tr>
<tr><td>外协</td><td>指派对象为“外协”或工序名含外协即标识外协;连续订单行且外协分组相同的工序按最后一道工序状态统一着色。</td></tr>
<tr><td>路线状态</td><td>已报工/辅助结束/有收检结果显示完成色;外协已发料但收检未齐显示进行色;可执行、已开工和待执行分别显示不同路线状态。</td></tr>
</table>
<p>该页面把工艺标准工时、实际操作起止、外协发收料、质检与任务进度放在同一订单路线中,是工时事实与生产计划执行之间的主要追踪入口。</p>
</section>
<section id="procedures">
<h2>11. 存储过程和函数清单</h2>
<h3>11.1 加工中心核心过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th><th class="w30">主要读写对象</th></tr>
<tr><td><code>MES_ProductTask_WorkingStart</code></td><td>开始加工,更新任务状态/收料并生成开始记录。</td><td>生产任务、生产订单视图、质检记录、公共记录过程</td></tr>
<tr><td><code>MES_ProductTask_HelpStart</code></td><td>辅助开始,更新加工状态并生成开始记录。</td><td>生产任务、数据字典、公共记录过程</td></tr>
<tr><td><code>MES_ProductTask_HelpEnd</code></td><td>辅助结束、数量/进度、班次和加班拆分。</td><td>生产任务、班次表、操作记录、报工记录</td></tr>
<tr><td><code>MES_ProductTask_ProdReport</code></td><td>正常报工、绑定任务、完成数量、班次与加班处理。</td><td>生产任务、操作记录、报工记录、班次表</td></tr>
<tr><td><code>MES_ProductCenter_OptRecord_Save</code></td><td>统一插入操作记录,配对开始/暂停/结束,计算总时长、暂停和实际工时。</td><td><code>YL_加工中心_操作记录表</code></td></tr>
<tr><td><code>计算人员工时</code></td><td>按工位人员绑定、班次人员绑定和重叠时间生成人员工时行。</td><td>绑定表、班次表、人员表、操作记录</td></tr>
<tr><td><code>计算班次重叠秒数</code></td><td>标量函数,计算起止区间与班次区间的重叠秒数,最多跨 3 天。</td><td>纯计算</td></tr>
</table>
<h3>11.2 装配中心核心过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th></tr>
<tr><td><code>MES_人员工时记录_开始</code></td><td>防止同用户同任务重复开始,更新任务为已开工,插入未闭合“开始加工”记录。</td></tr>
<tr><td><code>MES_人员工时记录_结束</code></td><td>闭合开始记录,拆分工作/加班,写备注和说明,必要时生成普通报工表及加班操作记录。</td></tr>
<tr><td><code>MES_人员工时记录_获取进行中任务</code></td><td>读取当前用户进行中的开始记录。</td></tr>
<tr><td><code>MES_人员工时记录_获取进行中任务2</code></td><td>读取另一组进行中任务数据,供装配页面恢复状态。</td></tr>
</table>
<h3>11.3 修正与补录过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th></tr>
<tr><td><code>工时校验_获取操作记录列表</code></td><td>工时修正页面分页查询。</td></tr>
<tr><td><code>工时校验_保存校验记录</code></td><td>名称虽含“保存校验”,当前定义实际更新原始记录起止、总时长、实际工时和班次标准工时。</td></tr>
<tr><td><code>工时校验_新增操作记录</code></td><td>补录报工/辅助记录DATEDIFF 计算实际工时。</td></tr>
<tr><td><code>异常工时_新增操作记录</code></td><td>新增异常工时并补齐任务上下文。</td></tr>
<tr><td><code>加工中心_修改工时_保存修改记录</code></td><td>加工/装配页面内修改异常工时。</td></tr>
<tr><td><code>工时校验_获取设备数据</code></td><td>基于每分钟设备状态,用 LEAD 计算当天运行、待机、关机、报警累计时间。</td></tr>
</table>
<h3>11.4 最终校验与计算过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th></tr>
<tr><td><code>工时校验_获取昨日之前操作记录列表</code></td><td>从统一视图分页读取今天以前记录;输出校验/性质/异常/加班/人员筛选结果。</td></tr>
<tr><td><code>usp_BatchValidateWorkTime</code></td><td>拆分 AID逐条计算上传分钟输出成功/失败、详情 JSON 和比例组 JSON。</td></tr>
<tr><td><code>usp_CalculateUploadMinutes</code></td><td>确定类别、班次内外、日比例系数和最终上传分钟。</td></tr>
<tr><td><code>usp_CalculateDailyRatio</code></td><td>计算操作人当日标准工时归一化比例。</td></tr>
<tr><td><code>usp_CalculateShiftTime</code></td><td>逐段累计班次内/外秒数,支持跨天。</td></tr>
<tr><td><code>usp_ValidateWorkTime</code></td><td>单条计算、构造 SAP JSON并在事务中写校验详情当前页面单条调用路径已注释主流程未使用。</td></tr>
<tr><td><code>工时校验_批量保存校验记录</code></td><td>把尚无校验副本的原始记录复制到校验表,作为最终已校验标志。</td></tr>
<tr><td><code>工时校验_获取订单工序</code></td><td>按订单获取工序、工艺顺序、TaskAID、SAP VisCode。</td></tr>
<tr><td><code>工时校验_获取资源</code></td><td>按资源名称读取 SAP <code>UBT_ORSC</code> 的 VisCode 和成本。</td></tr>
</table>
<h3>11.5 查询、报表与结算过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th><th class="w25">主要来源</th></tr>
<tr><td><code>生产管理_工时查询_工序工时_查询</code></td><td>生成 TaskAID、日期、单次开始记录三级工序工时树计算数量、小时和单件分钟。</td><td>当前工时视图、全量工时视图、工艺库</td></tr>
<tr><td><code>工时统计_项目工时_查询</code></td><td>按合同产品及工序/班组/人员/订单汇总。</td><td>全量工时视图、人员信息</td></tr>
<tr><td><code>工时统计_作业者工时_查询</code></td><td>按人员、日期和报工明细统计,异常工时负数冲减。</td><td>全量工时视图、人员信息</td></tr>
<tr><td><code>工时统计_任务工时_查询</code></td><td>按订单产品工序任务汇总并展开操作人明细。</td><td>全量工时视图、人员信息</td></tr>
<tr><td><code>工时统计_设备工时_查询</code></td><td>按设备、日期和明细统计阶段标识为 -1 的设备工时。</td><td>全量工时视图</td></tr>
<tr><td><code>工时统计_*_查询_导出</code></td><td>为四类工时报表生成服务端导出数据。</td><td>对应查询口径</td></tr>
<tr><td><code>生产管理_结算工时_查询</code></td><td>按物料、订单、工位汇总报工、辅助、完成数量和单件结算工时。</td><td>生产计划、生产任务、当前/全量工时视图</td></tr>
</table>
<h3>11.6 外协与计划跟踪过程</h3>
<table>
<tr><th class="w30">对象</th><th>作用</th></tr>
<tr><td><code>生产管理_外协管理_查询外协全部</code></td><td>查询全部外协任务,按连续外协分组统一判断派工、发料和完成状态。</td></tr>
<tr><td><code>生产管理_外协管理_外协发料保存</code></td><td>增加任务收料数量并通过公共记录过程写“收料”操作。</td></tr>
<tr><td><code>生产管理_外协管理_外协收料保存</code></td><td>增加完成数量、更新任务完成状态并写外协“报工”操作。</td></tr>
<tr><td><code>生产管理_外协报表_查询</code></td><td>按订单、拆分内码和供应商合并外协工序,返回采购、数量、质检和时间信息。</td></tr>
<tr><td><code>生产管理_外协报表_导出</code></td><td>导出外协报表。</td></tr>
<tr><td><code>生产管理_生产计划跟踪</code></td><td>合并生产任务、标准工时、操作起止、外协结束和质检状态,输出订单工序路线。</td></tr>
</table>
</section>
<section id="tables" class="page-break">
<h2>12. 数据表清单与字段说明</h2>
<h3>12.1 YL_加工中心_操作记录表事实源</h3>
<p>该表同时承载设备动作、人员动作、加班、异常和补录。当前可见索引为 <code>IX_YL_加工中心_操作记录表_TaskAID_操作内容</code>,键列包含 TaskAID、操作内容、开始时间、结束时间、操作人未查询到显式主键索引。</p>
<table>
<tr><th class="w25">字段组</th><th>字段</th><th>说明</th></tr>
<tr><td>身份与分类</td><td>AID、操作类别编号、操作类别、阶段标识、TaskAID</td><td>AID 是记录标识TaskAID 关联生产任务。</td></tr>
<tr><td>业务上下文</td><td>工序名称、工位编号、工位名称、操作人、合同号、订单编号、物料编号、物料描述</td><td>保留报工发生时的任务快照。</td></tr>
<tr><td>动作内容</td><td>操作数值、操作内容、操作描述、备注、工序说明、异常说明</td><td>数量、显示动作和人工说明。</td></tr>
<tr><td>时间与工时</td><td>开始时间、结束时间、工时、总时长、实际工时、报工日期</td><td>核心单位均为秒;实际工时主要作为设备工时。</td></tr>
<tr><td>周期关联</td><td>关联开始记录ID、关联暂停记录ID、关联操作类型、暂停时间、暂停时长、暂停总时长</td><td>支持开始-暂停-恢复-结束的周期闭合。</td></tr>
<tr><td>状态与审计</td><td>已报工、不装配、是否更新、最后编辑人、最后编辑时间</td><td>控制可见性和保留最近编辑信息。</td></tr>
<tr><td>班次</td><td>班次标准工时(默认 8、班次</td><td>供归一化和加班计算使用。</td></tr>
</table>
<h3>12.2 生产管理_工时校验_校验工时表</h3>
<p>该表保存校验副本,大部分业务字段与事实表一致,并增加:</p>
<table>
<tr><th class="w25">字段</th><th>作用</th></tr>
<tr><td><code>报工记录id</code></td><td>关联原始操作记录 AID是“已校验”的判断依据。</td></tr>
<tr><td><code>计算详情</code></td><td>预留保存计算 JSON主批量流程当前未写入。</td></tr>
<tr><td><code>上传工时</code></td><td>预留保存最终 SAP 分钟;主批量流程当前未写入。</td></tr>
<tr><td><code>工时类型</code></td><td>工作、辅助、加班、其他、跳过SAP主批量流程当前未写入。</td></tr>
</table>
<h3>12.3 其他关键表</h3>
<table>
<tr><th class="w30"></th><th>用途</th></tr>
<tr><td><code>MES_接口_生产计划_生产任务</code></td><td>任务状态、加工状态、完成数量、工序、指派工位和 TaskAID。</td></tr>
<tr><td><code>MES_接口_生产计划</code></td><td>订单头/计划数据,为统一视图补合同号、计划数量、入库和单据状态。</td></tr>
<tr><td><code>YL_加工中心_报工记录</code></td><td>保存报工日期、班次、工位、操作人、工时类型、数量、工时和确认/上报状态。</td></tr>
<tr><td><code>班次表</code></td><td>班次编号、名称、开始/结束时间、删除状态。</td></tr>
<tr><td><code>班次人员绑定表</code></td><td>人员属于哪个班次及绑定时间。</td></tr>
<tr><td><code>工位人员绑定表</code></td><td>人员与 SAP 资源工位的绑定关系及有效状态。</td></tr>
<tr><td><code>登录基础数据_人员信息</code></td><td>人员编号和姓名映射。</td></tr>
<tr><td><code>MES_资源主数据</code></td><td>工位 VisCode 与名称,用于绑定和 SAP 资源行。</td></tr>
<tr><td><code>历史_工位设备状态每分钟记录</code></td><td>每分钟设备状态,用于工时修正页面核对设备运行时间。</td></tr>
<tr><td><code>YL_基础表_数据字典</code></td><td>将“开始加工、辅助开始、辅助结束、暂停、报工”等名称映射成编号。</td></tr>
<tr><td><code>YL_质量检验_质检记录</code></td><td>加工开始时取得前序合格数,影响收料数量。</td></tr>
<tr><td><code>车间生产管理工艺_零件生产工艺_工艺库</code></td><td>按订单和工艺顺序提供标准工时,供工时查询和生产计划跟踪对比。</td></tr>
<tr><td><code>SAP.SBO_YL.dbo.UBT_WW_MES_OPORandOPCH</code></td><td>外协采购供应商、价格、预计到货、开票和材质信息。</td></tr>
</table>
</section>
<section id="views">
<h2>13. 视图及取数规则</h2>
<h3>13.1 View_生产工时视图</h3>
<p>面向当前有效生产订单,是工时修正、工时校验、计算过程的核心视图。连接关系:</p>
<pre>YL_加工中心_操作记录表 o
LEFT JOIN 生产管理_工时校验_校验工时表 c ON o.AID = c.报工记录id
LEFT JOIN View_生产订单_MES m ON COALESCE(c.TaskAID, o.TaskAID) = m.TaskAID
LEFT JOIN MES_接口_生产计划 s ON COALESCE(c.订单编号, o.订单编号) = s.订单编号
LEFT JOIN View_工位人员绑定数 b ON o.操作人 = b.人员姓名</pre>
<p>有校验副本时优先取校验表字段;无校验副本时取原始记录。主要过滤:</p>
<ul>
<li>排除工位“外协”。</li>
<li>报工记录必须有结束时间。</li>
<li>未校验的“收料”不显示。</li>
<li>消除已经被报工/辅助结束闭合的开始记录、未闭合的辅助结束和暂停形成的重复记录。</li>
<li>要求操作数值非空,或是尚未闭合的开始动作,或操作描述非空。</li>
<li>当日班次最小标准工时取该操作人、同日、“报工”记录的最小班次标准工时。</li>
</ul>
<h3>13.2 View_生产工时视图全部</h3>
<p>与核心视图结构和过滤基本一致,但任务来源改为 <code>View_生产订单全部包括已关闭</code>,主要供工时统计与历史查询。</p>
<h3>13.3 View_校验后的生产工时</h3>
<p>同样合并原始与校验数据,但强制 <code>c.AID IS NOT NULL</code>,只返回已形成校验副本的记录。</p>
<h3>13.4 绑定与班次视图</h3>
<table>
<tr><th class="w30">视图</th><th>规则</th></tr>
<tr><td><code>View_工位人员绑定数</code></td><td>按人员统计当前有效且能匹配资源主数据的不同工位数。</td></tr>
<tr><td><code>View_设备工位人员</code></td><td>连接人员、工位绑定、班次人员绑定和班次表,提供人员/工位的班次起止时间;仅保留有效绑定。</td></tr>
<tr><td><code>View_生产订单_MES</code></td><td>提供 TaskAID、订单、工序、工位、任务状态、计划与完成数量是所有入口过程的任务上下文。</td></tr>
</table>
<h3>13.5 View_外协报表视图</h3>
<p>该视图仅保留物料类型为 <code>pit_Resource</code>且指派对象为“外协”的生产任务,合并以下信息:</p>
<ul>
<li>生产任务的计划、指派、完成、进度、外协分组和状态;</li>
<li>操作记录的最早开始、最大结束、发料“收料”数量和外协“报工”收料数量;</li>
<li>收检合格/不合格数量;</li>
<li>SAP 外协采购的供应商、价格、预计到货、开票和材质。</li>
</ul>
</section>
<section id="sap" class="page-break">
<h2>14. SAP 对接映射</h2>
<h3>14.1 调用封装</h3>
<p><code>src/api/b1s.js</code>把 GET/POST/PATCH 都封装成向配置的 B1 代理地址发 POST请求体含 <code>func、cmd、content</code>;默认超时 100 秒。</p>
<h3>14.2 校验上传步骤</h3>
<table>
<tr><th class="w18">顺序</th><th class="w30">接口</th><th>用途</th></tr>
<tr><td>1</td><td><code>GET ProductionOrders</code></td><td><code>AbsoluteEntry</code>取得生产订单、阶段和资源行。</td></tr>
<tr><td>2</td><td><code>PATCH ProductionOrders(id)</code></td><td>补齐 MES 工序阶段和当前工序需要的设备/人员资源。</td></tr>
<tr><td>3</td><td><code>PATCH ProductionOrders(id)</code></td><td>把匹配资源行的 <code>PlannedQuantity</code>调整为已发数量加本次 Quantity。</td></tr>
<tr><td>4</td><td><code>POST InventoryGenExits</code></td><td>创建资源消耗单据Comments 记录 MES 工时 AID。</td></tr>
</table>
<h3>14.3 工序和资源规则</h3>
<ul>
<li>当前工序匹配条件MES 工序名称相等且工艺顺序等于工时记录订单行号。</li>
<li>StageID 取 MES 工艺顺序;特定期初物料、<code>Z108-001</code><code>26</code>强制 StageID=1。</li>
<li>普通设备资源名:工位名称;普通人员资源名:操作人。</li>
<li>辅助设备/人员资源:<code>辅助-工位</code><code>辅助-人员</code></li>
<li>加班人员资源:<code>加班-人员</code></li>
<li>资源 VisCode 由 <code>工时校验_获取资源</code>从 SAP <code>UBT_ORSC</code>按精确名称获取。</li>
</ul>
<h3>14.4 DocumentLines 映射</h3>
<table>
<tr><th class="w25">字段</th><th></th></tr>
<tr><td>Quantity</td><td>设备行:<code>加工工时秒/60</code>;人员行:数据库计算的 <code>UploadMinutes</code></td></tr>
<tr><td>BaseType</td><td><code>202</code>(生产订单)。</td></tr>
<tr><td>BaseEntry</td><td>生产订单编号/AbsoluteEntry。</td></tr>
<tr><td>BaseLine</td><td>SAP 生产订单中匹配资源行的 LineNumber。</td></tr>
<tr><td>LineType</td><td><code>dlt_Resource</code></td></tr>
<tr><td>WarehouseCode</td><td>空字符串。</td></tr>
<tr><td>U_ResName</td><td>原始工位名称或操作人名称。</td></tr>
</table>
</section>
<section id="states">
<h2>15. 状态、操作类别与单位</h2>
<h3>15.1 任务状态</h3>
<table>
<tr><th class="w20">值/名称</th><th>业务含义</th><th>变化条件</th></tr>
<tr><td>0 / 待执行</td><td>尚不可开工</td><td>由计划和前序控制</td></tr>
<tr><td>1 / 可执行</td><td>允许开始</td><td>第一次开始加工后转 2</td></tr>
<tr><td>2 / 已开工</td><td>任务处理中</td><td>继续开始仅记录新周期</td></tr>
<tr><td>4 / 已完成</td><td>完成数量达到指派数量</td><td>报工/辅助结束累计完成</td></tr>
</table>
<h3>15.2 操作类别</h3>
<p><span class="pill">收料</span><span class="pill">辅助开始</span><span class="pill">辅助结束</span><span class="pill">开始加工</span><span class="pill">暂停</span><span class="pill">报工</span><span class="pill">加班</span><span class="pill">休息日加班</span><span class="pill">法定休息日加班</span><span class="pill">休息日工作</span><span class="pill">法定休息日工作</span></p>
<h3>15.3 单位约定</h3>
<table>
<tr><th>位置</th><th>字段/显示</th><th>单位</th></tr>
<tr><td>数据库事实表</td><td>工时、总时长、实际工时、暂停时长</td><td></td></tr>
<tr><td>工时修正/校验编辑框</td><td>设备工时、人员工时</td><td></td></tr>
<tr><td>工时校验表格</td><td>设备工时、人员工时</td><td>分钟(秒/60</td></tr>
<tr><td>计算过程</td><td>UploadMinutes</td><td>分钟decimal(18,2)</td></tr>
<tr><td>SAP 资源行</td><td>Quantity</td><td>分钟</td></tr>
<tr><td>班次标准工时</td><td>页面输入与记录字段</td><td>业务上按小时使用,但部分过程注释写“分钟”,需统一</td></tr>
</table>
</section>
<section id="appendix">
<h2>16. 调用矩阵与资料来源</h2>
<h3>16.1 页面到对象调用矩阵</h3>
<table>
<tr><th class="w18">页面</th><th class="w35">直接过程/接口</th><th>核心落点</th></tr>
<tr><td>加工中心</td><td>WorkingStart、HelpStart、HelpEnd、ProdReport、OptRecord_Save、异常新增/修改</td><td>生产任务、操作记录、报工记录</td></tr>
<tr><td>装配中心</td><td>人员工时开始/结束、获取进行中任务、异常新增/修改</td><td>生产任务、操作记录、报工记录</td></tr>
<tr><td>人员绑定</td><td>工位绑定人员查询/保存</td><td>工位人员绑定表、资源主数据</td></tr>
<tr><td>班次管理</td><td>班次查询/保存/删除、班次绑定人员查询/保存</td><td>班次表、班次人员绑定表</td></tr>
<tr><td>工时修正</td><td>获取操作记录、保存校验记录、补录、设备数据</td><td>操作记录、设备分钟状态</td></tr>
<tr><td>工时校验</td><td>昨日之前列表、BatchValidate、Calculate*、获取订单/资源、SAP GET/PATCH/POST、批量保存</td><td>统一视图、SAP、校验表</td></tr>
<tr><td>工时查询</td><td>生产管理_工时查询_工序工时_查询</td><td>当前/全量工时视图、工艺标准工时</td></tr>
<tr><td>工时报表</td><td>项目/作业者/任务/设备查询及四套导出过程</td><td>全量工时视图、人员班组</td></tr>
<tr><td>结算工时</td><td>生产管理_结算工时_查询</td><td>生产计划、任务、当前/全量工时视图</td></tr>
<tr><td>外协管理/报表</td><td>外协任务查询、派工、发料、收料、历史、质检、报表和导出</td><td>外协任务、操作记录、采购、质检、外协报表视图</td></tr>
<tr><td>生产计划跟踪</td><td>生产管理_生产计划跟踪</td><td>全部订单、操作记录、工艺库、质检记录</td></tr>
</table>
<h3>16.2 主要代码来源</h3>
<ul>
<li><code>src/views/ProductionManagement/MachiningCenter/index.vue</code></li>
<li><code>src/views/ProductionManagement/AssemblyCenter/index.vue</code></li>
<li><code>src/views/ProductionManagement/WorkhoursEdit/index.vue</code></li>
<li><code>src/views/ProductionManagement/WorkHoursCheck/index.vue</code></li>
<li><code>src/views/ProductionManagement/PersonnelBinding/index.vue</code></li>
<li><code>src/views/ProductionManagement/ShiftManagement/index.vue</code></li>
<li><code>src/views/ProductionManagement/Workhours/index.vue</code></li>
<li><code>src/views/ProductionManagement/Timesheet/index.vue</code></li>
<li><code>src/views/ProductionManagement/SettlementWorkhours/index.vue</code></li>
<li><code>src/views/ProductionManagement/OutsourceMange/index.vue</code></li>
<li><code>src/views/ProductionManagement/SaleOutsourceMange/index.vue</code></li>
<li><code>src/views/ProductionManagement/OutsourceSheet/index.vue</code></li>
<li><code>src/views/ProductionManagement/ProductionPlanTrack/index.vue</code></li>
<li><code>src/api/b1s.js</code></li>
</ul>
<h3>16.3 数据库核对说明</h3>
<p>本文通过只读查询 SQL Server 系统目录获取当前存储过程参数、模块定义、对象依赖、表字段、索引和班次配置。未执行任何业务存储过程,未新增、更新或删除数据库数据。文档不包含数据库地址、账号或密码。</p>
<div class="note"><strong>使用建议:</strong>本说明适合作为流程评审、工时口径确认、SAP 联调和后续重构的基线。若数据库对象在 2026-07-21 后调整,应重新提取定义并更新版本。</div>
</section>
</body>
</html>

Binary file not shown.

151
doc/工时计算.html Normal file
View File

@@ -0,0 +1,151 @@
<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>生产报工工时计算规则</title>
<style>
:root{--ink:#182633;--muted:#5d6b78;--line:#d7e0e7;--blue:#0f668b;--blue-bg:#ecf7fb;--green:#16734b;--green-bg:#edf8f1;--amber:#966000;--amber-bg:#fff5df;--red:#aa3f37;--red-bg:#fff1ef}
*{box-sizing:border-box} body{margin:0;background:#f1f5f7;color:var(--ink);font:14px/1.7 "Microsoft YaHei",Arial,sans-serif}.page{width:min(1180px,calc(100% - 32px));margin:24px auto 48px;background:#fff;border:1px solid var(--line);box-shadow:0 8px 26px rgba(23,48,65,.08)}header{padding:34px 40px 26px;border-bottom:4px solid var(--blue);background:#f6fbfd}main{padding:0 40px 42px}h1{margin:0 0 8px;font-size:28px;line-height:1.35;letter-spacing:0}h2{margin:34px 0 14px;padding-bottom:8px;border-bottom:1px solid var(--line);color:#123f57;font-size:20px;letter-spacing:0}h3{margin:22px 0 8px;color:#135374;font-size:16px;letter-spacing:0}p{margin:8px 0}.meta{color:var(--muted)}.nav{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.nav a{padding:4px 9px;border:1px solid #b8d5e0;color:#0d5779;text-decoration:none;background:#fff}.nav a:hover{background:var(--blue-bg)}.summary{margin:18px 0;padding:13px 16px;border-left:4px solid var(--blue);background:var(--blue-bg)}.warn{margin:16px 0;padding:13px 16px;border-left:4px solid var(--amber);background:var(--amber-bg)}.risk{margin:16px 0;padding:13px 16px;border-left:4px solid var(--red);background:var(--red-bg)}.formula{margin:12px 0;padding:14px 16px;border:1px solid #b9d6e2;background:#f7fcfe;font:14px/1.8 Consolas,"Courier New",monospace;white-space:pre-wrap}.flow{display:grid;grid-template-columns:1fr 36px 1fr 36px 1fr;gap:8px;align-items:stretch;margin:16px 0}.box{padding:12px;border:1px solid #b9d7e1;background:var(--blue-bg)}.box.green{border-color:#bddbc9;background:var(--green-bg)}.box.amber{border-color:#ead39e;background:var(--amber-bg)}.box strong{display:block;color:#11465f}.arrow{display:flex;align-items:center;justify-content:center;color:#337995;font-size:24px}table{width:100%;border-collapse:collapse;margin:12px 0 18px}th,td{padding:9px 10px;vertical-align:top;border:1px solid var(--line);text-align:left}th{background:#eef4f6;color:#173b4c}code{padding:1px 4px;border-radius:2px;background:#eef1f3;color:#8a3025;font:12px Consolas,"Courier New",monospace}ol,ul{margin:8px 0;padding-left:24px}li{margin:5px 0}.pill{display:inline-block;margin:2px 4px 2px 0;padding:2px 7px;border:1px solid #c4d5dd;background:#f8fbfc;color:#35515f}.small{font-size:12px;color:var(--muted)}.example{padding:12px 15px;border:1px dashed #aacbd8;background:#fbfeff}.example strong{color:#126086}.er{display:grid;grid-template-columns:1fr 42px 1fr 42px 1fr;gap:10px;align-items:center;margin:18px 0}.entity{min-height:132px;padding:12px;border:2px solid #7db6ca;background:#f6fcfe}.entity h3{margin:0 0 7px;color:#12516e;font-size:15px}.entity.green{border-color:#7dbb99;background:#f1fbf5}.entity.amber{border-color:#d7ae58;background:#fff9ea}.entity .key{font:12px Consolas,"Courier New",monospace;color:#8a3025}.relationship{text-align:center;color:#266e8d;font-size:24px}.relation-label{display:block;color:#40616f;font-size:11px;line-height:1.3}.er-bottom{display:grid;grid-template-columns:1fr 42px 1fr;gap:10px;align-items:center;width:66%;margin:8px 0 0 auto}.er-caption{margin-top:9px;color:var(--muted);font-size:12px}footer{margin-top:30px;padding-top:14px;border-top:1px solid var(--line);font-size:12px;color:var(--muted)}@media(max-width:760px){.page{width:100%;margin:0;border:0}header,main{padding-left:18px;padding-right:18px}.flow,.er,.er-bottom{grid-template-columns:1fr;width:100%}.arrow{min-height:20px;transform:rotate(90deg)}.relationship{min-height:20px;transform:rotate(90deg)}table{display:block;overflow-x:auto}}@media print{body{background:#fff}.page{width:100%;margin:0;border:0;box-shadow:none}.nav{display:none}table,.formula,.example,.er{break-inside:avoid}}
</style>
</head>
<body>
<div class="page">
<header>
<h1>生产报工工时计算规则</h1>
<div class="meta">范围:加工中心、装配中心报工产生的工时,以及工时校验计算出的 SAP 上传分钟</div>
<div class="meta">版本2026-07-28 | 依据:线上 YL_MESDB 当前过程定义与当前页面代码的只读核验</div>
<nav class="nav"><a href="#input">输入</a><a href="#machine">加工中心</a><a href="#assembly">装配中心</a><a href="#people">人员工时</a><a href="#er">ER图</a><a href="#validation">工时校验</a><a href="#examples">示例</a><a href="#rules">速查</a></nav>
</header>
<main>
<section id="input">
<h2>1. 先区分四类数字</h2>
<div class="summary"><strong>核心结论:</strong>报工数量、设备实际工时、人员总时长、校验上传分钟是四个不同口径。页面上都可能显示为“工时”或“数量”,但不能互相代入计算。</div>
<table>
<tr><th>数值</th><th>来源和计算</th><th>单位</th><th>用途</th></tr>
<tr><td>报工数量</td><td>用户录入 <code>partCount</code>,累计写入任务 <code>完成数量</code></td><td>件/业务单位</td><td>判断任务完成,和秒、分钟没有换算关系。</td></tr>
<tr><td>总时长</td><td><code>结束时间 - 开始时间</code></td><td></td><td>人员时间、校验比例和上传计算的基础。</td></tr>
<tr><td>实际工时</td><td><code>总时长 - 暂停总时长</code></td><td></td><td>加工中心设备实际运转工时。</td></tr>
<tr><td>UploadMinutes</td><td>由校验过程按工时类型、班次和当日比例系数换算。</td><td>分钟</td><td>SAP 资源消耗单据的 <code>Quantity</code></td></tr>
</table>
<div class="flow"><div class="box"><strong>输入</strong>开始/结束时间<br>暂停记录<br>人员、班次、加班类型</div><div class="arrow"></div><div class="box green"><strong>原始计算</strong>总时长、实际工时<br>人员工时、加班工时</div><div class="arrow"></div><div class="box amber"><strong>校验计算</strong>比例系数<br>UploadMinutes分钟</div></div>
</section>
<section id="machine">
<h2>2. 加工中心:设备工时怎么算</h2>
<p>过程 <code>MES_ProductTask_WorkingStart</code>产生“开始加工”记录;报工或辅助结束最终经 <code>MES_ProductCenter_OptRecord_Save</code>闭合一个工作周期。该过程使用同一 <code>TaskAID + 工位名称</code>的开始、暂停、结束记录计算。</p>
<div class="formula">周期总时长(秒) = DATEDIFF(SECOND, 周期开始时间, 本次结束时间)
暂停总时长(秒) = Σ DATEDIFF(SECOND, 每次暂停开始时间, 对应恢复/结束时间)
设备实际工时(秒) = 周期总时长 - 暂停总时长</div>
<table>
<tr><th>动作</th><th>计算影响</th><th>写入/更新字段</th></tr>
<tr><td>开始加工</td><td>记录周期起点,不立即形成完整工时。</td><td>开始时间,结束时间为空。</td></tr>
<tr><td>暂停</td><td>开始记录先按开始到暂停的差值闭合;暂停本身等待后续恢复或结束来确定暂停时长。</td><td>暂停时间、暂停时长、关联记录。</td></tr>
<tr><td>报工/辅助结束</td><td>找到周期开始,汇总周期内已闭合暂停,计算总时长和设备实际工时。</td><td>结束时间、总时长、暂停总时长、实际工时。</td></tr>
</table>
<div class="warn"><strong>关键差异:</strong>设备工时使用“扣暂停后的实际工时”;下节的人员工时使用“开始到结束的总时长”,不扣暂停。两者不必相等,这是当前过程实现的既有口径。</div>
</section>
<section id="assembly">
<h2>3. 装配中心:普通工时和加班工时怎么算</h2>
<p><code>MES_人员工时记录_开始</code>写入当前用户的未结束“开始加工”记录。<code>MES_人员工时记录_结束</code>找到同 <code>TaskAID + 操作人</code>最近的未结束记录,以数据库当前时间为结束时间:</p>
<div class="formula">总工时(秒) = DATEDIFF(SECOND, 开始时间, 结束时间)</div>
<table>
<tr><th>日期和选择</th><th>普通工作时间(秒)</th><th>加班时间(秒)</th><th>规则</th></tr>
<tr><td>工作日,未选择加班</td><td>总工时</td><td>0</td><td>整段作为普通报工时间。</td></tr>
<tr><td>工作日,选择加班,且跨过白班结束点</td><td>白班结束时间 - 开始时间</td><td>结束时间 - 白班结束时间</td><td>白班结束时间从 <code>班次表</code>中“白班”取得,缺失时默认 <code>16:30</code></td></tr>
<tr><td>工作日,选择加班,开始已在白班结束后</td><td>0</td><td>总工时</td><td>整段作为工作日加班。</td></tr>
<tr><td>休息日/法定休息日,选择加班</td><td>0</td><td>总工时</td><td>整段按“休息日加班”或“法定休息日加班”生成加班人员记录。</td></tr>
<tr><td>休息日/法定休息日,未选择加班</td><td>过程变量先取总工时</td><td>0</td><td>随后原开始记录的 <code>工时、总时长</code>会被置为 0同时写入“休息日工作/法定休息日工作”报工记录。</td></tr>
</table>
<div class="risk"><strong>需注意的现状:</strong>休息日未选择加班时,结束过程内部先计算普通工作时间,但随后又将原操作记录的 <code>工时</code><code>总时长</code>置零,报工记录保留该工作时间。这会造成操作记录表与报工记录表的工时口径不同,追溯时必须同时检查两张表。</div>
</section>
<section id="people">
<h2>4. 加工中心:人员工时怎么算</h2>
<p>加工中心在<strong>非休息日、非法定休息日</strong>的报工/辅助结束周期,调用 <code>计算人员工时</code>。过程将工位绑定人员与有效班次组合,计算每名人员在可用班次内的时间重叠。</p>
<div class="formula">班次重叠秒数 = max(0, min(结束时间, 班次结束) - max(开始时间, 班次开始))
人员计算工时(秒) = 班次重叠秒数</div>
<ul>
<li>仅保留已绑定到对应班次且重叠秒数大于 0 的人员-班次组合。</li>
<li>指定实际干活人员有班次绑定时,只保留其绑定班次;没有班次绑定时,保留重叠最长的班次。若所有班次均无重叠,过程会给该指定人员 <code>1 秒</code>最小值。</li>
<li>当前实际公式<strong>不再</strong>除以绑定设备数。旧的 <code>重叠秒数 / 绑定设备数</code>逻辑在过程里已注释,现行代码直接使用重叠秒数。</li>
<li>每个满足条件的人员-班次组合都会向 <code>YL_加工中心_操作记录表</code>插入一条人员工时分摊记录,字段 <code>总时长</code>写入该人员的计算工时秒数。</li>
</ul>
</section>
<section id="er">
<h2>5. 报工数据流转 ER 图</h2>
<p>实线箭头表示主要主键关联,箭头上的文字表示数据生成或计算方向。报工记录是数量和确认信息的承载表,操作记录才是起止时间与工时事实源。</p>
<div class="er">
<div class="entity"><h3>生产任务</h3><div class="key">MES_接口_生产计划_生产任务</div><div>PK: AID = TaskAID<br>任务状态、完成数量、工位、工序</div></div>
<div class="relationship">1 → N<span class="relation-label">TaskAID</span></div>
<div class="entity green"><h3>操作记录(事实源)</h3><div class="key">YL_加工中心_操作记录表</div><div>PK: AID<br>FK: TaskAID<br>开始/结束、总时长、实际工时、操作人</div></div>
<div class="relationship">1 → 0..1<span class="relation-label">AID = 报工记录id</span></div>
<div class="entity amber"><h3>校验工时副本</h3><div class="key">生产管理_工时校验_校验工时表</div><div>PK: AID<br>FK: 报工记录id、TaskAID<br>校验后时间、工时、审计信息</div></div>
</div>
<div class="er-bottom">
<div class="entity"><h3>人员与班次绑定</h3><div class="key">工位人员绑定 / 班次人员绑定 / 班次表</div><div>人员、工位、班次起止时间</div></div>
<div class="relationship"><span class="relation-label">班次重叠秒数<br>标准工时</span></div>
<div class="entity green"><h3>计算结果与 SAP</h3><div class="key">usp_BatchValidateWorkTime</div><div>Ratio、UploadMinutes、WorkType<br>→ SAP 资源消耗 Quantity分钟</div></div>
</div>
<div class="er-caption">计算输入:操作记录的总时长 + 人员/班次绑定。校验结束校验工时表存在“报工记录id = 原操作记录 AID”的副本。任务完成数量和 SAP 上传分钟均不从同一个字段直接换算。</div>
</section>
<section id="validation">
<h2>6. 工时校验:上传分钟怎么算</h2>
<h3>5.1 先判定是否参与计算</h3>
<table>
<tr><th>条件</th><th>实际行为</th></tr>
<tr><td>校验列表</td><td><code>开始时间 &lt; 当天 00:00:00</code>,当天开始的记录不进入该最终校验列表。</td></tr>
<tr><td>单条上传分钟计算</td><td><code>总时长 &lt; 300 秒</code>,返回 <code>UploadMinutes=0</code>、工时类型“跳过SAP”。过程注释/提示写“总时长为0”但实际判断阈值是 300 秒。</td></tr>
<tr><td>批量校验的加班类别</td><td><code>加班、休息日加班、法定休息日加班、休息日工作、法定休息日工作</code><code>usp_BatchValidateWorkTime</code>直接按总时长转分钟,不进入单条上传分钟过程。</td></tr>
</table>
<h3>5.2 当日比例系数</h3>
<p>正常记录需要先调用 <code>usp_CalculateDailyRatio</code>。统计范围是同一操作人、同一开始日期的 <code>View_生产工时视图</code>记录,且满足以下条件:</p>
<ul><li>总时长大于 300 秒;</li><li>阶段标识不等于 -1</li><li>订单号不等于 3886</li><li>操作类别不是“加班、休息日工作、法定休息日工作”。</li></ul>
<div class="formula">当日总分钟 = Σ 合格记录的总时长(秒) / 60
比例系数 Ratio = (标准工时(小时) × 60) / 当日总分钟
当日总分钟 ≤ 0 或标准工时 ≤ 0 时Ratio = 1</div>
<p>标准工时优先取 <code>当日班次最小标准工时</code>,该值不大于 0 时再取该记录的 <code>班次标准工时</code>;两者都不可用时视图默认值为 8。</p>
<h3>5.3 班次内外拆分</h3>
<p><code>usp_CalculateUploadMinutes</code>优先按操作人,再按工位名称读取班次;找不到时默认白班 <code>07:45-16:30</code>。跨天班次由 <code>usp_CalculateShiftTime</code>逐日切段计算。</p>
<div class="formula">班次内分钟 = 班次内秒数 / 60
班次外分钟 = 班次外秒数 / 60
基础分钟 BaseMinutes = 总时长 / 60</div>
<h3>5.4 单条计算过程的最终公式</h3>
<table>
<tr><th>操作类别</th><th>usp_CalculateUploadMinutes 的公式</th></tr>
<tr><td>报工、开始加工、辅助结束、辅助开始及其他普通类别</td><td><code>UploadMinutes = BaseMinutes × Ratio</code></td></tr>
<tr><td>工作日加班</td><td><code>UploadMinutes = BaseMinutes</code>,不乘比例系数。</td></tr>
<tr><td>休息日加班、法定休息日加班</td><td><code>UploadMinutes = 班次内分钟 × Ratio + 班次外分钟</code></td></tr>
</table>
<div class="warn"><strong>批量入口优先级:</strong>当前工时校验页面使用 <code>usp_BatchValidateWorkTime</code>。它先识别所有加班/休息日类别并直接设定 <code>UploadMinutes = 总时长 / 60</code>。因此,上表中的“休息日加班按班次内外拆分”是单条 <code>usp_CalculateUploadMinutes</code>的能力;在当前批量校验页面路径中,会被批量过程的直接换算规则覆盖。</div>
</section>
<section id="examples">
<h2>7. 计算示例</h2>
<div class="example"><strong>示例一:加工中心设备工时</strong><br>开始 08:00暂停 10:00-10:20结束/报工 12:00。<br><code>总时长 = 4 × 3600 = 14,400 秒</code><br><code>暂停总时长 = 20 × 60 = 1,200 秒</code><br><code>设备实际工时 = 14,400 - 1,200 = 13,200 秒 = 220 分钟</code></div>
<div class="example"><strong>示例二:加工中心人员工时</strong><br>同一周期为 08:00-12:00某绑定人员的有效班次为 07:45-16:30。<br><code>班次重叠 = 12:00 - 08:00 = 14,400 秒</code><br><code>该人员计算工时 = 14,400 秒</code><br>即使该人员绑定多台设备,现行代码也不再除以设备数。</div>
<div class="example"><strong>示例三:装配工作日跨白班结束点</strong><br>开始 15:30结束 18:00选择加班白班结束 16:30。<br><code>普通工作时间 = 16:30 - 15:30 = 3,600 秒</code><br><code>加班时间 = 18:00 - 16:30 = 5,400 秒</code></div>
<div class="example"><strong>示例四:正常工时上传分钟</strong><br>某人员当日有效总时长为 600 分钟,标准工时为 8 小时,当前一条普通报工总时长为 120 分钟。<br><code>Ratio = (8 × 60) / 600 = 0.8</code><br><code>UploadMinutes = 120 × 0.8 = 96 分钟</code></div>
<div class="example"><strong>示例五:当前批量校验中的加班</strong><br>一条“工作日加班”原始记录总时长为 5,400 秒。<br><code>UploadMinutes = 5,400 / 60 = 90 分钟</code><br>当前批量过程直接采用此结果,不再应用当日比例系数。</div>
</section>
<section id="rules">
<h2>8. 计算速查与校验结束条件</h2>
<table>
<tr><th>要确认什么</th><th>先看哪个字段/对象</th><th>计算或判断</th></tr>
<tr><td>设备实际运行多久</td><td>原操作记录:开始时间、结束时间、暂停总时长</td><td><code>实际工时 = 总时长 - 暂停总时长</code></td></tr>
<tr><td>装配人员正常/加班多久</td><td>装配开始记录、班次表、是否加班/休息日参数</td><td>按白班结束点或休息日规则切分。</td></tr>
<tr><td>加工人员分到多久</td><td>工位人员绑定、班次人员绑定、起止时间</td><td><code>人员工时 = 班次重叠秒数</code></td></tr>
<tr><td>SAP 会上传几分钟</td><td>总时长、操作类别、标准工时、同人同日记录</td><td>普通记录乘 Ratio当前批量加班直接 <code>总时长/60</code></td></tr>
<tr><td>是否已完成工时校验</td><td><code>生产管理_工时校验_校验工时表</code></td><td>存在 <code>报工记录id = 原始操作记录.AID</code> 的副本即已校验。</td></tr>
</table>
<div class="risk"><strong>不要混用字段:</strong><code>实际工时</code>适合看设备扣暂停后的运行时间;<code>总时长</code>是人员与上传分钟计算基础;<code>UploadMinutes</code>是经过规则换算后的 SAP 数量。若需核算差异,应在同一条原始记录 AID 上同时比对这三个值,而不是用报工数量推算工时。</div>
</section>
<footer>主要核验对象:<code>MES_ProductCenter_OptRecord_Save</code><code>MES_人员工时记录_结束</code><code>计算人员工时</code><code>usp_CalculateDailyRatio</code><code>usp_CalculateShiftTime</code><code>usp_CalculateUploadMinutes</code><code>usp_BatchValidateWorkTime</code><code>View_生产工时视图</code>。本文未执行生产数据写入。</footer>
</main>
</div>
</body>
</html>

Binary file not shown.

View File

@@ -0,0 +1,101 @@
# 系统类与阀类装配任务查询性能优化
## 变更信息
- 变更日期2026-07-25
- 变更环境:正式环境 `YL_MESDB`
- 变更范围:系统类装配任务查询、阀类装配任务查询
- 业务数据变更:无
- 前端文件变更:系统类、阀类页面首屏分页和单元格按需编辑
- IIS 文件变更:正式前端尚未部署,已生成待发布静态包
## 问题定位
原查询的主要耗时来自以下部分:
1. `View_生产工时视图` 在同一次查询中被重复扫描和分组四次。
2. 流程告警、装配在岗人员、质检在岗人员使用逐行相关子查询,结果行数增加时重复访问基础表。
3. SAP 关联数据在筛选候选任务前进行聚合,扩大了查询工作量。
4. 多个高频连接字段缺少适合当前访问方式的非聚集索引。
正式环境优化前缓存统计:
| 查询 | 平均耗时 | 平均逻辑读 |
| --- | ---: | ---: |
| 系统类装配任务 | 约 4.16 秒 | 约 142.7 万页 |
| 阀类装配任务 | 约 4.47 秒 | 约 154.7 万页 |
## 优化内容
1. 新增共享核心过程 `dbo.计划排产_装配任务查询_核心`,两个原过程保留原名称和参数,仅作为分类入口。
2. 先将符合条件的任务写入临时表,再对工时、流程、在岗人员、质检和 SAP 数据进行候选集范围内的汇总。
3.`View_生产工时视图` 的四次扫描合并为一次,任务工时和合同工时在一次聚合中计算。
4. 保留合同工时修复,合同维度继续使用 `订单合同号`
5. 将动态拼接条件改为参数化筛选,降低重复编译和字符串条件风险。
6. 新增 5 个辅助索引:
- `物料基础数据_零件图纸.IX_零件图纸_num`
- `车间生产管理工艺_零件生产工艺_工艺库.IX_工艺库_订单_顺序`
- `YL_质量检验_质检记录.IX_质检记录_质检类型_计划号`
- `登录基础数据_人员信息.IX_人员信息_姓名_班组`
- `流程表.IX_流程表_关联计划_流程`
## 验证结果
完整结果集逐列哈希比对结果一致:
| 查询 | 优化前 | 优化后 | 结果行数 | 数据一致性 |
| --- | ---: | ---: | ---: | --- |
| 系统类默认查询 | 3500 ms | 681 ms | 55 | 一致 |
| 阀类默认查询 | 6415 ms | 1316 ms | 283 | 一致 |
筛选条件回归均通过,包括指定订单、指定合同和未完成状态;其中阀类未完成查询由 `23431 ms` 降至 `623 ms`
正式接口按前端实际分页参数回归:
| 接口查询 | HTTP 状态 | 返回数据 | 接口耗时 |
| --- | ---: | ---: | ---: |
| 系统类 | 200 | 20/55 行 | 1201 ms |
| 阀类 | 200 | 20/283 行 | 940 ms |
部署后累计调用统计在 2026-07-25 最终核验时为:
| 查询 | 调用次数 | 平均耗时 | 平均逻辑读 |
| --- | ---: | ---: | ---: |
| 系统类装配任务 | 13 | 775.02 ms | 397782 页 |
| 阀类装配任务 | 13 | 1104.29 ms | 412203 页 |
合同工时非零数据复核:系统类合同装配工时 34 行、合同质检工时 20 行;阀类合同装配工时 97 行、合同质检工时 34 行。
## 部署与回滚
- 过程部署脚本:`db_backups/optimize_install_task_queries_20260725.sql`
- 过程回滚脚本:`db_backups/rollback_install_task_queries_20260725.sql`
- 索引部署脚本:`db_backups/optimize_install_task_query_indexes_20260725.sql`
- 索引回滚脚本:`db_backups/rollback_install_task_query_indexes_20260725.sql`
- 线上精确备份过程:
- `dbo.计划排产_系统类任务查询_优化前_20260725`
- `dbo.计划排产_阀类任务查询_优化前_20260725`
建议观察一个业务周期后再决定是否删除两个优化前备份过程。导出过程不在本次变更范围内。
## 首屏渲染二次优化
用户反馈数据库优化后页面体感仍需数秒。按正式接口连续测量,系统类通常为 `0.70-0.99` 秒,阀类通常为 `0.88-1.14` 秒;剩余等待主要发生在浏览器渲染阶段。原页面默认请求 100 行,并为每一行同时创建日期选择器、多选下拉框和预算数字输入框。
本次前端调整如下:
1. 默认分页由 100 行改为 20 行,可选 20、50、100 行。
2. 修复分页控件使用 `donepageSize/donepageCurrent`、请求却使用 `pageSize/pageCurrent` 的状态错配。
3. 日期、二次派工和预算字段默认使用文本显示,点击对应单元格后才创建编辑控件。
4. 保留原保存过程、日期修改过程、二次派工过程和预算计算公式,不改变业务数据口径。
正式接口 20 行回归结果:
| 查询 | 接口耗时范围 | 返回行数 | 响应字符数 |
| --- | ---: | ---: | ---: |
| 系统类 | 696-987 ms | 20/55 | 19670 |
| 阀类 | 876-1143 ms | 20/260 | 18672 |
相较原 100 行响应,系统类响应体由约 52825 字符降至 19670 字符,阀类由约 93429 字符降至 18672 字符;同时首屏不再批量创建各行编辑控件。
曾在正式库事务内验证“预展开合同订单后连接工时视图”和 3 个筛选索引。完整结果哈希一致,但系统类接口由约 0.82 秒增加到约 1.09 秒,阀类约 1.04 秒无明显收益,因此已完整回滚并清理临时过程和索引,未纳入正式方案。

View File

@@ -0,0 +1,53 @@
# 装配任务预算进度功能
## 功能范围
系统类装配任务和阀类装配任务页面新增:
| 字段 | 来源 | 单位/格式 |
| --- | --- | --- |
| 任务预算装配工时 | 人工录入,按生产订单保存 | 小时 |
| 任务预算装配进度 | 任务装配工时 / 任务预算装配工时 | 百分比,保留两位小数 |
| 合同预算测试工时 | 人工录入,按销售合同保存 | 小时 |
| 合同预算测试进度 | 合同质检工时 / 合同预算测试工时 | 百分比,保留两位小数 |
预算工时为 `0` 时,对应进度显示 `0.00%`。进度允许超过 `100%`,用于反映实际工时超出预算的情况。
## 数据设计
- `dbo.计划排产_装配任务预算`:以订单号为主键保存任务预算。
- `dbo.计划排产_装配合同预算`:以合同号为主键保存合同预算。
- `dbo.计划排产_装配任务预算_保存`:参数化保存过程,校验预算类型、业务键和非负预算。
- `dbo.计划排产_装配任务查询_核心`:返回新增 4 个字段并计算百分比。
- `dbo.计划排产_装配任务查询_核心_预算前_20260725`:正式环境部署前的精确过程备份。
预算按小时录入;数据库中的实际装配和质检工时为秒,计算时先除以 `3600` 转换为小时,再除以预算并乘以 `100`
## 验证结果
1. 正式数据库事务回归:订单 `5727` 临时设置任务预算 `100` 小时、合同预算 `50` 小时,得到任务进度 `27.13%`、合同测试进度 `39.59%`,随后回滚,预算表均为 0 行。
2. 正式接口读写回归:两个预算保存均返回 `result=1`,再次查询得到相同进度;仅删除带 `Codex接口回归` 标记且值完全匹配的两条测试数据,清理后预算表均为 0 行。
3. 新旧查询一致性:系统类 55 行、阀类 283 行;全部原字段均存在且公共字段 SHA-256 哈希一致,只新增需求中的 4 个字段。
4. 性能回归:本次对比中系统类新查询约 `723 ms`,阀类新查询约 `904 ms`,未发现性能退化。
5. 前端生产构建成功Webpack 仅报告项目既有的大资源包告警。
6. 页面初始化防误保存回归:预算原值加入行状态后,重新启动页面并等待初始化,正式预算表持续为 0 行,未再产生零值记录。
## 发布状态
- 正式数据库:已部署并验证。
- 前端源码:已修改并通过生产构建。
- 正式前端静态站点未部署。当前未提供正式前端站点地址、IIS 物理目录或受控发布通道;`192.168.2.92:10101` 为后端接口站点,不承载当前前端入口。
- 本地预览:`https://127.0.0.1:1998/`,使用开发自签名证书。
发布包:`release_packages/MES_Manage_View_V20_装配任务预算进度_20260725.zip`
- 大小62,963,217 字节
- SHA-256`5E53DA3CA7BF2825589077D1F90433E57549096090F460F3E32A1DEC5F8D232B`
- 包内包含正式环境 `static/config.js`
## 回滚
- 数据库部署:`db_backups/add_install_task_budget_progress_20260725.sql`
- 数据库回滚:`db_backups/rollback_install_task_budget_progress_20260725.sql`
数据库回滚恢复预算功能上线前的核心查询并删除保存过程,但有意保留两张预算表,防止已经录入的人工预算数据丢失。正式前端发布时必须先备份原静态目录,前端回滚使用该目录备份。

Binary file not shown.

View File

@@ -53,7 +53,7 @@ BEGIN
MAX() AS ,
MIN() AS ,
MIN() AS ,
MAX() AS ,
CONVERT(char(10), MAX(), 23) AS ,
MAX() AS ,
MAX() AS ,
MAX() AS ,
@@ -62,7 +62,7 @@ BEGIN
MAX() AS ,
MAX(_报工) AS _报工,
MAX(CAST( AS NVARCHAR(MAX))) AS ,
MAX() AS ,
CONVERT(char(10), MAX(), 23) AS ,
MAX() AS ,
MAX() AS ,
MAX() AS ,

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,417 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Bcl.AsyncInterfaces</name>
</assembly>
<members>
<member name="T:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1">
<summary>Provides the core logic for implementing a manual-reset <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource"/> or <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1"/>.</summary>
<typeparam name="TResult"></typeparam>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuation">
<summary>
The callback to invoke when the operation completes if <see cref="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.OnCompleted(System.Action{System.Object},System.Object,System.Int16,System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags)"/> was called before the operation completed,
or <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCoreShared.s_sentinel"/> if the operation completed before a callback was supplied,
or null if a callback hasn't yet been provided and the operation hasn't yet completed.
</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuationState">
<summary>State to pass to <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuation"/>.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._executionContext">
<summary><see cref="T:System.Threading.ExecutionContext"/> to flow to the callback, or null if no flowing is required.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._capturedContext">
<summary>
A "captured" <see cref="T:System.Threading.SynchronizationContext"/> or <see cref="T:System.Threading.Tasks.TaskScheduler"/> with which to invoke the callback,
or null if no special context is required.
</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._completed">
<summary>Whether the current operation has completed.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._result">
<summary>The result with which the operation succeeded, or the default value if it hasn't yet completed or failed.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._error">
<summary>The exception with which the operation failed, or null if it hasn't yet completed or completed successfully.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._version">
<summary>The current version of this value, used to help prevent misuse.</summary>
</member>
<member name="P:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.RunContinuationsAsynchronously">
<summary>Gets or sets whether to force continuations to run asynchronously.</summary>
<remarks>Continuations may run asynchronously if this is false, but they'll never run synchronously if this is true.</remarks>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.Reset">
<summary>Resets to prepare for the next operation.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SetResult(`0)">
<summary>Completes with a successful result.</summary>
<param name="result">The result.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SetException(System.Exception)">
<summary>Complets with an error.</summary>
<param name="error"></param>
</member>
<member name="P:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.Version">
<summary>Gets the operation version.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.GetStatus(System.Int16)">
<summary>Gets the status of the operation.</summary>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.GetResult(System.Int16)">
<summary>Gets the result of the operation.</summary>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.OnCompleted(System.Action{System.Object},System.Object,System.Int16,System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags)">
<summary>Schedules the continuation action for this operation.</summary>
<param name="continuation">The continuation to invoke when the operation has completed.</param>
<param name="state">The state object to pass to <paramref name="continuation"/> when it's invoked.</param>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
<param name="flags">The flags describing the behavior of the continuation.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.ValidateToken(System.Int16)">
<summary>Ensures that the specified token matches the current version.</summary>
<param name="token">The token supplied by <see cref="T:System.Threading.Tasks.ValueTask"/>.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SignalCompletion">
<summary>Signals that the operation has completed. Invoked after the result or error has been set.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.InvokeContinuation">
<summary>
Invokes the continuation with the appropriate captured context / scheduler.
This assumes that if <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._executionContext"/> is not null we're already
running within that <see cref="T:System.Threading.ExecutionContext"/>.
</summary>
</member>
<member name="T:System.Threading.Tasks.TaskAsyncEnumerableExtensions">
<summary>Provides a set of static methods for configuring <see cref="T:System.Threading.Tasks.Task"/>-related behaviors on asynchronous enumerables and disposables.</summary>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.ConfigureAwait(System.IAsyncDisposable,System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async disposable will be performed.</summary>
<param name="source">The source async disposable.</param>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured async disposable.</returns>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.ConfigureAwait``1(System.Collections.Generic.IAsyncEnumerable{``0},System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async iteration will be performed.</summary>
<typeparam name="T">The type of the objects being iterated.</typeparam>
<param name="source">The source enumerable being iterated.</param>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured enumerable.</returns>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.WithCancellation``1(System.Collections.Generic.IAsyncEnumerable{``0},System.Threading.CancellationToken)">
<summary>Sets the <see cref="T:System.Threading.CancellationToken"/> to be passed to <see cref="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)"/> when iterating.</summary>
<typeparam name="T">The type of the objects being iterated.</typeparam>
<param name="source">The source enumerable being iterated.</param>
<param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to use.</param>
<returns>The configured enumerable.</returns>
</member>
<member name="T:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder">
<summary>Represents a builder for asynchronous iterators.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.Create">
<summary>Creates an instance of the <see cref="T:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder"/> struct.</summary>
<returns>The initialized instance.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.MoveNext``1(``0@)">
<summary>Invokes <see cref="M:System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext"/> on the state machine while guarding the <see cref="T:System.Threading.ExecutionContext"/>.</summary>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="stateMachine">The state machine instance, passed by reference.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
<summary>Schedules the state machine to proceed to the next action when the specified awaiter completes.</summary>
<typeparam name="TAwaiter">The type of the awaiter.</typeparam>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="awaiter">The awaiter.</param>
<param name="stateMachine">The state machine.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
<summary>Schedules the state machine to proceed to the next action when the specified awaiter completes.</summary>
<typeparam name="TAwaiter">The type of the awaiter.</typeparam>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="awaiter">The awaiter.</param>
<param name="stateMachine">The state machine.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.Complete">
<summary>Marks iteration as being completed, whether successfully or otherwise.</summary>
</member>
<member name="P:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.ObjectIdForDebugger">
<summary>Gets an object that may be used to uniquely identify this builder to the debugger.</summary>
</member>
<member name="T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute">
<summary>Indicates whether a method is an asynchronous iterator.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute.#ctor(System.Type)">
<summary>Initializes a new instance of the <see cref="T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute"/> class.</summary>
<param name="stateMachineType">The type object for the underlying state machine type that's used to implement a state machine method.</param>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredAsyncDisposable">
<summary>Provides a type that can be used to configure how awaits on an <see cref="T:System.IAsyncDisposable"/> are performed.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredAsyncDisposable.DisposeAsync">
<summary>Asynchronously releases the unmanaged resources used by the <see cref="T:System.Runtime.CompilerServices.ConfiguredAsyncDisposable" />.</summary>
<returns>A task that represents the asynchronous dispose operation.</returns>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1">
<summary>Provides an awaitable async enumerable that enables cancelable iteration and configured awaits.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.ConfigureAwait(System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async iteration will be performed.</summary>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured enumerable.</returns>
<remarks>This will replace any previous value set by <see cref="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.ConfigureAwait(System.Boolean)"/> for this iteration.</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.WithCancellation(System.Threading.CancellationToken)">
<summary>Sets the <see cref="T:System.Threading.CancellationToken"/> to be passed to <see cref="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)"/> when iterating.</summary>
<param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to use.</param>
<returns>The configured enumerable.</returns>
<remarks>This will replace any previous <see cref="T:System.Threading.CancellationToken"/> set by <see cref="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.WithCancellation(System.Threading.CancellationToken)"/> for this iteration.</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.GetAsyncEnumerator">
<summary>Returns an enumerator that iterates asynchronously through collections that enables cancelable iteration and configured awaits.</summary>
<returns>An enumerator for the <see cref="T:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1" /> class.</returns>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator">
<summary>Provides an awaitable async enumerator that enables cancelable iteration and configured awaits.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.MoveNextAsync">
<summary>Advances the enumerator asynchronously to the next element of the collection.</summary>
<returns>
A <see cref="T:System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1"/> that will complete with a result of <c>true</c>
if the enumerator was successfully advanced to the next element, or <c>false</c> if the enumerator has
passed the end of the collection.
</returns>
</member>
<member name="P:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.Current">
<summary>Gets the element in the collection at the current position of the enumerator.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.DisposeAsync">
<summary>
Performs application-defined tasks associated with freeing, releasing, or
resetting unmanaged resources asynchronously.
</summary>
</member>
<member name="T:System.Runtime.CompilerServices.EnumeratorCancellationAttribute">
<summary>Allows users of async-enumerable methods to mark the parameter that should receive the cancellation token value from <see cref="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)" />.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.EnumeratorCancellationAttribute.#ctor">
<summary>Initializes a new instance of the <see cref="T:System.Runtime.CompilerServices.EnumeratorCancellationAttribute" /> class.</summary>
</member>
<member name="T:System.Runtime.InteropServices.LibraryImportAttribute">
<summary>
Attribute used to indicate a source generator should create a function for marshalling
arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
</summary>
<remarks>
This attribute is meaningless if the source generator associated with it is not enabled.
The current built-in source generator only supports C# and only supplies an implementation when
applied to static, partial, non-generic methods.
</remarks>
</member>
<member name="M:System.Runtime.InteropServices.LibraryImportAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Runtime.InteropServices.LibraryImportAttribute"/>.
</summary>
<param name="libraryName">Name of the library containing the import.</param>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.LibraryName">
<summary>
Gets the name of the library containing the import.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.EntryPoint">
<summary>
Gets or sets the name of the entry point to be called.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling">
<summary>
Gets or sets how to marshal string arguments to the method.
</summary>
<remarks>
If this field is set to a value other than <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />,
<see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType" /> must not be specified.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType">
<summary>
Gets or sets the <see cref="T:System.Type"/> used to control how string arguments to the method are marshalled.
</summary>
<remarks>
If this field is specified, <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling" /> must not be specified
or must be set to <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.SetLastError">
<summary>
Gets or sets whether the callee sets an error (SetLastError on Windows or errno
on other platforms) before returning from the attributed method.
</summary>
</member>
<member name="T:System.Runtime.InteropServices.StringMarshalling">
<summary>
Specifies how strings should be marshalled for generated p/invokes
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Custom">
<summary>
Indicates the user is supplying a specific marshaller in <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType"/>.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf8">
<summary>
Use the platform-provided UTF-8 marshaller.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf16">
<summary>
Use the platform-provided UTF-16 marshaller.
</summary>
</member>
<member name="T:System.Collections.Generic.IAsyncEnumerable`1">
<summary>Exposes an enumerator that provides asynchronous iteration over values of a specified type.</summary>
<typeparam name="T">The type of values to enumerate.</typeparam>
</member>
<member name="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)">
<summary>Returns an enumerator that iterates asynchronously through the collection.</summary>
<param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken"/> that may be used to cancel the asynchronous iteration.</param>
<returns>An enumerator that can be used to iterate asynchronously through the collection.</returns>
</member>
<member name="T:System.Collections.Generic.IAsyncEnumerator`1">
<summary>Supports a simple asynchronous iteration over a generic collection.</summary>
<typeparam name="T">The type of objects to enumerate.</typeparam>
</member>
<member name="M:System.Collections.Generic.IAsyncEnumerator`1.MoveNextAsync">
<summary>Advances the enumerator asynchronously to the next element of the collection.</summary>
<returns>
A <see cref="T:System.Threading.Tasks.ValueTask`1"/> that will complete with a result of <c>true</c> if the enumerator
was successfully advanced to the next element, or <c>false</c> if the enumerator has passed the end
of the collection.
</returns>
</member>
<member name="P:System.Collections.Generic.IAsyncEnumerator`1.Current">
<summary>Gets the element in the collection at the current position of the enumerator.</summary>
</member>
<member name="T:System.IAsyncDisposable">
<summary>Provides a mechanism for releasing unmanaged resources asynchronously.</summary>
</member>
<member name="M:System.IAsyncDisposable.DisposeAsync">
<summary>
Performs application-defined tasks associated with freeing, releasing, or
resetting unmanaged resources asynchronously.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.AllowNullAttribute">
<summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DisallowNullAttribute">
<summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullAttribute">
<summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullAttribute">
<summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter may be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter will not be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute">
<summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with the associated parameter name.</summary>
<param name="parameterName">
The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.ParameterName">
<summary>Gets the associated parameter name.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute">
<summary>Applied to a method that will never return under any circumstance.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute">
<summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified parameter value.</summary>
<param name="parameterValue">
The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
the associated parameter matches this value.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.ParameterValue">
<summary>Gets the condition parameter value.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with a field or property member.</summary>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String[])">
<summary>Initializes the attribute with the list of field and property members.</summary>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String)">
<summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field or property member will not be null.
</param>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String[])">
<summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field and property members will not be null.
</param>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,542 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Extensions.Caching.Memory</name>
</assembly>
<members>
<member name="P:Microsoft.Extensions.Caching.Memory.CacheEntry.SlidingExpiration">
<summary>
Gets or sets how long a cache entry can be inactive (e.g. not accessed) before it will be removed.
This will not extend the entry lifetime beyond the absolute expiration (if set).
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.CacheEntry.ExpirationTokens">
<summary>
Gets the <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/> instances which cause the cache entry to expire.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.CacheEntry.PostEvictionCallbacks">
<summary>
Gets or sets the callbacks will be fired after the cache entry is evicted from the cache.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.CacheEntry.Priority">
<summary>
Gets or sets the priority for keeping the cache entry in the cache during a
memory pressure triggered cleanup. The default is <see cref="F:Microsoft.Extensions.Caching.Memory.CacheItemPriority.Normal"/>.
</summary>
</member>
<member name="T:Microsoft.Extensions.Caching.Memory.MemoryCache">
<summary>
An implementation of <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> using a dictionary to
store its entries.
</summary>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.#ctor(Microsoft.Extensions.Options.IOptions{Microsoft.Extensions.Caching.Memory.MemoryCacheOptions})">
<summary>
Creates a new <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCache"/> instance.
</summary>
<param name="optionsAccessor">The options of the cache.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.#ctor(Microsoft.Extensions.Options.IOptions{Microsoft.Extensions.Caching.Memory.MemoryCacheOptions},Microsoft.Extensions.Logging.ILoggerFactory)">
<summary>
Creates a new <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCache"/> instance.
</summary>
<param name="optionsAccessor">The options of the cache.</param>
<param name="loggerFactory">The factory used to create loggers.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Finalize">
<summary>
Cleans up the background collection events.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCache.Count">
<summary>
Gets the count of the current entries for diagnostic purposes.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCache.Keys">
<summary>
Gets an enumerable of the all the keys in the <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCache"/>.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCache.Size">
<summary>
Internal accessor for Size for testing only.
Note that this is only eventually consistent with the contents of the collection.
See comment on <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCache.CoherentState"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.CreateEntry(System.Object)">
<inheritdoc />
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.TryGetValue(System.Object,System.Object@)">
<inheritdoc />
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Remove(System.Object)">
<inheritdoc />
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Clear">
<summary>
Removes all keys and values from the cache.
</summary>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.GetCurrentStatistics">
<summary>
Gets a snapshot of the current statistics for the memory cache.
</summary>
<returns>Returns <see langword="null"/> if statistics are not being tracked because <see cref="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.TrackStatistics" /> is <see langword="false"/>.</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.UpdateCacheSizeExceedsCapacity(Microsoft.Extensions.Caching.Memory.CacheEntry,Microsoft.Extensions.Caching.Memory.CacheEntry,Microsoft.Extensions.Caching.Memory.MemoryCache.CoherentState)">
<summary>
Determines if increasing the cache size by the size of the
entry would cause it to exceed any size limit on the cache.
</summary>
<returns>
<see langword="true" /> if increasing the cache size would
cause it to exceed the size limit; otherwise, <see langword="false" />.
</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Compact(System.Double)">
Remove at least the given percentage (0.10 for 10%) of the total entries (or estimated memory?), according to the following policy:
1. Remove all expired items.
2. Bucket by CacheItemPriority.
3. Least recently used objects.
?. Items with the soonest absolute expiration.
?. Items with the soonest sliding expiration.
?. Larger objects - estimated by object graph size, inaccurate.
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Dispose">
<inheritdoc />
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryCache.Dispose(System.Boolean)">
<summary>
Disposes the cache and clears all entries.
</summary>
<param name="disposing"><see langword="true" /> to dispose the object resources; <see langword="false" /> to take no action.</param>
</member>
<member name="T:Microsoft.Extensions.Caching.Memory.MemoryCache.CoherentState">
<summary>
Wrapper for the memory cache entries collection.
Entries may have various sizes. If a size limit has been set, the cache keeps track of the aggregate of all the entries' sizes
in order to trigger compaction when the size limit is exceeded.
For performance reasons, the size is not updated atomically with the collection, but is only made eventually consistent.
When the memory cache is cleared, it replaces the backing collection entirely. This may occur in parallel with operations
like add, set, remove, and compact which may modify the collection and thus its overall size.
To keep the overall size eventually consistent, therefore, the collection and the overall size are wrapped in this CoherentState
object. Individual operations take a local reference to this wrapper object while they work, and make size updates to this object.
Clearing the cache simply replaces the object, so that any still in progress updates do not affect the overall size value for
the new backing collection.
</summary>
</member>
<member name="T:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions">
<summary>
Specifies options for <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCache"/>.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.Clock">
<summary>
Gets or sets the clock used by the cache for expiration.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.ExpirationScanFrequency">
<summary>
Gets or sets the minimum length of time between successive scans for expired items.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.SizeLimit">
<summary>
Gets or sets the maximum size of the cache.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.CompactOnMemoryPressure">
<summary>
Gets or sets a value that indicates whether the cache is compacted when the maximum size is exceeded.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.CompactionPercentage">
<summary>
Gets or sets the amount the cache is compacted by when the maximum size is exceeded.
</summary>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.TrackLinkedCacheEntries">
<summary>
Gets or sets a value that indicates whether linked entries are tracked.
</summary>
<value>
<see langword="true"/> if linked entries are tracked; otherwise, <see langword="false" />.
The default is <see langword="false" />.
</value>
<remarks>Prior to .NET 7, this feature was always enabled.</remarks>
</member>
<member name="P:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions.TrackStatistics">
<summary>
Gets or sets a value that indicates whether memory cache statistics are tracked.
</summary>
<value>
<see langword="true"/> if memory cache statistics are tracked; otherwise, <see langword="false" />.
The default is <see langword="false" />.
</value>
</member>
<member name="T:Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions">
<summary>
Specifies options for <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions.#ctor">
<summary>
Initializes a new instance of <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions"/>.
</summary>
</member>
<member name="T:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache">
<summary>
Implements <see cref="T:Microsoft.Extensions.Caching.Distributed.IDistributedCache"/> using <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.#ctor(Microsoft.Extensions.Options.IOptions{Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions})">
<summary>
Creates a new <see cref="T:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache"/> instance.
</summary>
<param name="optionsAccessor">The options of the cache.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.#ctor(Microsoft.Extensions.Options.IOptions{Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions},Microsoft.Extensions.Logging.ILoggerFactory)">
<summary>
Creates a new <see cref="T:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache"/> instance.
</summary>
<param name="optionsAccessor">The options of the cache.</param>
<param name="loggerFactory">The logger factory to create <see cref="T:Microsoft.Extensions.Logging.ILogger"/> used to log messages.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.Get(System.String)">
<summary>
Gets the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> as a byte array.
</summary>
<param name="key">The key of the item to get.</param>
<returns>The byte array value of the key.</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.GetAsync(System.String,System.Threading.CancellationToken)">
<summary>
Asynchronously gets the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> as a byte array.
</summary>
<param name="key">The key of the item to get.</param>
<param name="token">The <see cref="T:System.Threading.CancellationToken"/> to use to cancel operation.</param>
<returns>The task for getting the byte array value associated with the specified key from the cache.</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.Set(System.String,System.Byte[],Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions)">
<summary>
Sets the specified item associated with a key in the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> as a byte array.
</summary>
<param name="key">The key of the item to set.</param>
<param name="value">The byte array value of the item to set.</param>
<param name="options">The cache options for the item to set.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.SetAsync(System.String,System.Byte[],Microsoft.Extensions.Caching.Distributed.DistributedCacheEntryOptions,System.Threading.CancellationToken)">
<summary>
Asynchronously sets the specified item associated with a key in the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> as a byte array.
</summary>
<param name="key">The key of the item to set.</param>
<param name="value">The byte array value of the item to set.</param>
<param name="options">The cache options for the item to set.</param>
<param name="token">The <see cref="T:System.Threading.CancellationToken"/> to use to cancel operation.</param>
<returns>The task for setting the byte array value associated with the specified key in the cache.</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.Refresh(System.String)">
<summary>
Refreshes the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/>.
</summary>
<param name="key">The key of the item to refresh.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.RefreshAsync(System.String,System.Threading.CancellationToken)">
<summary>
Asynchronously refreshes the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/>.
</summary>
<param name="key">The key of the item to refresh.</param>
<param name="token">The <see cref="T:System.Threading.CancellationToken"/> to use to cancel operation.</param>
<returns>The task for refreshing the specified key in the cache.</returns>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.Remove(System.String)">
<summary>
Removes the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/>.
</summary>
<param name="key">The key of the item to remove.</param>
</member>
<member name="M:Microsoft.Extensions.Caching.Distributed.MemoryDistributedCache.RemoveAsync(System.String,System.Threading.CancellationToken)">
<summary>
Asynchronously removes the specified item associated with a key from the <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/>.
</summary>
<param name="key">The key of the item to remove.</param>
<param name="token">The <see cref="T:System.Threading.CancellationToken"/> to use to cancel operation.</param>
<returns>The task for removing the specified key from the cache.</returns>
</member>
<member name="T:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions">
<summary>
Extension methods for setting up memory cache related services in an <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
</summary>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
<summary>
Adds a non distributed in-memory implementation of <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> to the
<see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
</summary>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add services to.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{Microsoft.Extensions.Caching.Memory.MemoryCacheOptions})">
<summary>
Adds a non distributed in-memory implementation of <see cref="T:Microsoft.Extensions.Caching.Memory.IMemoryCache"/> to the
<see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />.
</summary>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add services to.</param>
<param name="setupAction">
The <see cref="T:System.Action`1"/> to configure the provided <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryCacheOptions"/>.
</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddDistributedMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection)">
<summary>
Adds a default implementation of <see cref="T:Microsoft.Extensions.Caching.Distributed.IDistributedCache"/> that stores items in memory
to the <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />. Frameworks that require a distributed cache to work
can safely add this dependency as part of their dependency list to ensure that there is at least
one implementation available.
</summary>
<remarks>
<see cref="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddDistributedMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection)"/> should only be used in single
server scenarios as this cache stores items in memory and doesn't expand across multiple machines.
For those scenarios it is recommended to use a proper distributed cache that can expand across
multiple machines.
</remarks>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add services to.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddDistributedMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions})">
<summary>
Adds a default implementation of <see cref="T:Microsoft.Extensions.Caching.Distributed.IDistributedCache"/> that stores items in memory
to the <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" />. Frameworks that require a distributed cache to work
can safely add this dependency as part of their dependency list to ensure that there is at least
one implementation available.
</summary>
<remarks>
<see cref="M:Microsoft.Extensions.DependencyInjection.MemoryCacheServiceCollectionExtensions.AddDistributedMemoryCache(Microsoft.Extensions.DependencyInjection.IServiceCollection)"/> should only be used in single
server scenarios as this cache stores items in memory and doesn't expand across multiple machines.
For those scenarios it is recommended to use a proper distributed cache that can expand across
multiple machines.
</remarks>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection" /> to add services to.</param>
<param name="setupAction">
The <see cref="T:System.Action`1"/> to configure the provided <see cref="T:Microsoft.Extensions.Caching.Memory.MemoryDistributedCacheOptions"/>.
</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:System.ThrowHelper.ThrowIfNull(System.Object,System.String)">
<summary>Throws an <see cref="T:System.ArgumentNullException"/> if <paramref name="argument"/> is null.</summary>
<param name="argument">The reference type argument to validate as non-null.</param>
<param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param>
</member>
<member name="M:System.ThrowHelper.IfNullOrWhitespace(System.String,System.String)">
<summary>
Throws either an <see cref="T:System.ArgumentNullException"/> or an <see cref="T:System.ArgumentException"/>
if the specified string is <see langword="null"/> or whitespace respectively.
</summary>
<param name="argument">String to be checked for <see langword="null"/> or whitespace.</param>
<param name="paramName">The name of the parameter being checked.</param>
<returns>The original value of <paramref name="argument"/>.</returns>
</member>
<member name="T:System.Runtime.InteropServices.LibraryImportAttribute">
<summary>
Attribute used to indicate a source generator should create a function for marshalling
arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
</summary>
<remarks>
This attribute is meaningless if the source generator associated with it is not enabled.
The current built-in source generator only supports C# and only supplies an implementation when
applied to static, partial, non-generic methods.
</remarks>
</member>
<member name="M:System.Runtime.InteropServices.LibraryImportAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Runtime.InteropServices.LibraryImportAttribute"/>.
</summary>
<param name="libraryName">Name of the library containing the import.</param>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.LibraryName">
<summary>
Gets the name of the library containing the import.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.EntryPoint">
<summary>
Gets or sets the name of the entry point to be called.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling">
<summary>
Gets or sets how to marshal string arguments to the method.
</summary>
<remarks>
If this field is set to a value other than <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />,
<see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType" /> must not be specified.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType">
<summary>
Gets or sets the <see cref="T:System.Type"/> used to control how string arguments to the method are marshalled.
</summary>
<remarks>
If this field is specified, <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling" /> must not be specified
or must be set to <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.SetLastError">
<summary>
Gets or sets whether the callee sets an error (SetLastError on Windows or errno
on other platforms) before returning from the attributed method.
</summary>
</member>
<member name="T:System.Runtime.InteropServices.StringMarshalling">
<summary>
Specifies how strings should be marshalled for generated p/invokes
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Custom">
<summary>
Indicates the user is supplying a specific marshaller in <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType"/>.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf8">
<summary>
Use the platform-provided UTF-8 marshaller.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf16">
<summary>
Use the platform-provided UTF-16 marshaller.
</summary>
</member>
<member name="M:System.Marvin.ComputeHash32(System.ReadOnlySpan{System.Byte},System.UInt64)">
<summary>
Compute a Marvin hash and collapse it into a 32-bit hash.
</summary>
</member>
<member name="M:System.Marvin.ComputeHash32(System.Byte@,System.UInt32,System.UInt32,System.UInt32)">
<summary>
Compute a Marvin hash and collapse it into a 32-bit hash.
</summary>
</member>
<member name="P:System.SR.CacheEntryHasEmptySize">
<summary>Cache entry must specify a value for {0} when {1} is set.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.AllowNullAttribute">
<summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DisallowNullAttribute">
<summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullAttribute">
<summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullAttribute">
<summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter may be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter will not be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute">
<summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with the associated parameter name.</summary>
<param name="parameterName">
The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.ParameterName">
<summary>Gets the associated parameter name.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute">
<summary>Applied to a method that will never return under any circumstance.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute">
<summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified parameter value.</summary>
<param name="parameterValue">
The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
the associated parameter matches this value.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.ParameterValue">
<summary>Gets the condition parameter value.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with a field or property member.</summary>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String[])">
<summary>Initializes the attribute with the list of field and property members.</summary>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String)">
<summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field or property member will not be null.
</param>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String[])">
<summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field and property members will not be null.
</param>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,535 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Extensions.Configuration.Abstractions</name>
</assembly>
<members>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext">
<summary>
Provides data about the current item of the configuration.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext.#ctor(System.String,System.String,System.String,Microsoft.Extensions.Configuration.IConfigurationProvider)">
<summary>
Initializes a new instance of <see cref="T:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext"/>.
</summary>
<param name="path">The path of the current item of the configuration.</param>
<param name="key">The key of the current item of the configuration.</param>
<param name="value">The value of the current item of the configuration.</param>
<param name="configurationProvider">The <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider" /> to use to get the value of the current item.</param>
</member>
<member name="P:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext.Path">
<summary>
Gets the path of the current item.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext.Key">
<summary>
Gets the key of the current item.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext.Value">
<summary>
Gets the value of the current item.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.ConfigurationDebugViewContext.ConfigurationProvider">
<summary>
Gets the <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider" /> that was used to get the value of the current item.
</summary>
</member>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationExtensions">
<summary>
Provides extension methods for configuration classes.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.Add``1(Microsoft.Extensions.Configuration.IConfigurationBuilder,System.Action{``0})">
<summary>
Adds a new configuration source.
</summary>
<param name="builder">The builder to add to.</param>
<param name="configureSource">Configures the source secrets.</param>
<returns>The <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder"/>.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.GetConnectionString(Microsoft.Extensions.Configuration.IConfiguration,System.String)">
<summary>
Gets the specified connection string from the specified configuration.
Shorthand for <c>GetSection("ConnectionStrings")[name]</c>.
</summary>
<param name="configuration">The configuration to enumerate.</param>
<param name="name">The connection string key.</param>
<returns>The connection string.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.AsEnumerable(Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Get the enumeration of key value pairs within the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration" />
</summary>
<param name="configuration">The configuration to enumerate.</param>
<returns>An enumeration of key value pairs.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.AsEnumerable(Microsoft.Extensions.Configuration.IConfiguration,System.Boolean)">
<summary>
Get the enumeration of key value pairs within the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration" />
</summary>
<param name="configuration">The configuration to enumerate.</param>
<param name="makePathsRelative"><see langword="true" /> to trim the current configuration's path from the front of the returned child keys.</param>
<returns>An enumeration of key value pairs.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.Exists(Microsoft.Extensions.Configuration.IConfigurationSection)">
<summary>
Determines whether the section has a <see cref="P:Microsoft.Extensions.Configuration.IConfigurationSection.Value"/> or has children.
</summary>
<param name="section">The section to enumerate.</param>
<returns><see langword="true" /> if the section has values or children; otherwise, <see langword="false" />.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationExtensions.GetRequiredSection(Microsoft.Extensions.Configuration.IConfiguration,System.String)">
<summary>
Gets a configuration subsection with the specified key.
</summary>
<param name="configuration">The configuration to enumerate.</param>
<param name="key">The key of the configuration section.</param>
<returns>The <see cref="T:Microsoft.Extensions.Configuration.IConfigurationSection"/>.</returns>
<remarks>
If no matching sub-section is found with the specified key, an exception is raised.
</remarks>
<exception cref="T:System.InvalidOperationException">There is no section with key <paramref name="key"/>.</exception>
</member>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationKeyNameAttribute">
<summary>
Specifies the key name for a configuration property.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationKeyNameAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of <see cref="T:Microsoft.Extensions.Configuration.ConfigurationKeyNameAttribute"/>.
</summary>
<param name="name">The key name.</param>
</member>
<member name="P:Microsoft.Extensions.Configuration.ConfigurationKeyNameAttribute.Name">
<summary>
Gets the key name for a configuration property.
</summary>
</member>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationPath">
<summary>
Provides utility methods and constants for manipulating Configuration paths.
</summary>
</member>
<member name="F:Microsoft.Extensions.Configuration.ConfigurationPath.KeyDelimiter">
<summary>
The delimiter ":" used to separate individual keys in a path.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationPath.Combine(System.String[])">
<summary>
Combines path segments into one path.
</summary>
<param name="pathSegments">The path segments to combine.</param>
<returns>The combined path.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationPath.Combine(System.Collections.Generic.IEnumerable{System.String})">
<summary>
Combines path segments into one path.
</summary>
<param name="pathSegments">The path segments to combine.</param>
<returns>The combined path.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationPath.GetSectionKey(System.String)">
<summary>
Extracts the last path segment from the path.
</summary>
<param name="path">The path.</param>
<returns>The last path segment of the path.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationPath.GetParentPath(System.String)">
<summary>
Extracts the path corresponding to the parent node for a given path.
</summary>
<param name="path">The path.</param>
<returns>The original path minus the last individual segment found in it. Null if the original path corresponds to a top level node.</returns>
</member>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationRootExtensions">
<summary>
Provides extension methods for <see cref="T:Microsoft.Extensions.Configuration.IConfigurationRoot"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationRootExtensions.GetDebugView(Microsoft.Extensions.Configuration.IConfigurationRoot)">
<summary>
Generates a human-readable view of the configuration showing where each value came from.
</summary>
<returns>The debug view.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationRootExtensions.GetDebugView(Microsoft.Extensions.Configuration.IConfigurationRoot,System.Func{Microsoft.Extensions.Configuration.ConfigurationDebugViewContext,System.String})">
<summary>
Generates a human-readable view of the configuration showing where each value came from.
</summary>
<param name="root">The configuration root.</param>
<param name="processValue">
The function for processing the value, for example, hiding secrets.
Parameters:
ConfigurationDebugViewContext: Context of the current configuration item.
returns: A string value is used to assign as the Value of the configuration section.
</param>
<returns>The debug view.</returns>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfiguration">
<summary>
Represents a set of key/value application configuration properties.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfiguration.Item(System.String)">
<summary>
Gets or sets a configuration value.
</summary>
<param name="key">The configuration key.</param>
<returns>The configuration value.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfiguration.GetSection(System.String)">
<summary>
Gets a configuration sub-section with the specified key.
</summary>
<param name="key">The key of the configuration section.</param>
<returns>The <see cref="T:Microsoft.Extensions.Configuration.IConfigurationSection"/>.</returns>
<remarks>
This method will never return <c>null</c>. If no matching sub-section is found with the specified key,
an empty <see cref="T:Microsoft.Extensions.Configuration.IConfigurationSection"/> will be returned.
</remarks>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfiguration.GetChildren">
<summary>
Gets the immediate descendant configuration sub-sections.
</summary>
<returns>The configuration sub-sections.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfiguration.GetReloadToken">
<summary>
Returns a <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/> that can be used to observe when this configuration is reloaded.
</summary>
<returns>A <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/>.</returns>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationBuilder">
<summary>
Represents a type used to build application configuration.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationBuilder.Properties">
<summary>
Gets a key/value collection that can be used to share data between the <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder"/>
and the registered <see cref="T:Microsoft.Extensions.Configuration.IConfigurationSource"/>s.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationBuilder.Sources">
<summary>
Gets the sources used to obtain configuration values
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationBuilder.Add(Microsoft.Extensions.Configuration.IConfigurationSource)">
<summary>
Adds a new configuration source.
</summary>
<param name="source">The configuration source to add.</param>
<returns>The same <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder"/>.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationBuilder.Build">
<summary>
Builds an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> with keys and values from the set of sources registered in
<see cref="P:Microsoft.Extensions.Configuration.IConfigurationBuilder.Sources"/>.
</summary>
<returns>An <see cref="T:Microsoft.Extensions.Configuration.IConfigurationRoot"/> with keys and values from the registered sources.</returns>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationManager">
<summary>
Represents a mutable configuration object.
</summary>
<remarks>
It is both an <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder"/> and an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/>.
As sources are added, it updates its current view of configuration.
</remarks>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationProvider">
<summary>
Provides configuration key/values for an application.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationProvider.TryGet(System.String,System.String@)">
<summary>
Tries to get a configuration value for the specified key.
</summary>
<param name="key">The key.</param>
<param name="value">When this method returns, contains the value for the specified key.</param>
<returns><see langword="true" /> if a value for the specified key was found, otherwise <see langword="false" />.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationProvider.Set(System.String,System.String)">
<summary>
Sets a configuration value for the specified key.
</summary>
<param name="key">The key.</param>
<param name="value">The value.</param>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationProvider.GetReloadToken">
<summary>
Attempts to get an <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/> for change tracking.
</summary>
<returns>An <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/> token if this provider supports change tracking, <see langword="null"/> otherwise.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationProvider.Load">
<summary>
Loads configuration values from the source represented by this <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationProvider.GetChildKeys(System.Collections.Generic.IEnumerable{System.String},System.String)">
<summary>
Returns the immediate descendant configuration keys for a given parent path based on the data of this
<see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/> and the set of keys returned by all the preceding
<see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/> providers.
</summary>
<param name="earlierKeys">The child keys returned by the preceding providers for the same parent path.</param>
<param name="parentPath">The parent path.</param>
<returns>The child keys.</returns>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationRoot">
<summary>
Represents the root of an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> hierarchy.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationRoot.Reload">
<summary>
Forces the configuration values to be reloaded from the underlying <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/> providers.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationRoot.Providers">
<summary>
Gets the <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/> providers for this configuration.
</summary>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationSection">
<summary>
Represents a section of application configuration values.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationSection.Key">
<summary>
Gets the key this section occupies in its parent.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationSection.Path">
<summary>
Gets the full path to this section within the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/>.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.IConfigurationSection.Value">
<summary>
Gets or sets the section value.
</summary>
</member>
<member name="T:Microsoft.Extensions.Configuration.IConfigurationSource">
<summary>
Represents a source of configuration key/values for an application.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.IConfigurationSource.Build(Microsoft.Extensions.Configuration.IConfigurationBuilder)">
<summary>
Builds the <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/> for this source.
</summary>
<param name="builder">The <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder"/>.</param>
<returns>An <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider"/></returns>
</member>
<member name="M:System.ThrowHelper.ThrowIfNull(System.Object,System.String)">
<summary>Throws an <see cref="T:System.ArgumentNullException"/> if <paramref name="argument"/> is null.</summary>
<param name="argument">The reference type argument to validate as non-null.</param>
<param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param>
</member>
<member name="M:System.ThrowHelper.IfNullOrWhitespace(System.String,System.String)">
<summary>
Throws either an <see cref="T:System.ArgumentNullException"/> or an <see cref="T:System.ArgumentException"/>
if the specified string is <see langword="null"/> or whitespace respectively.
</summary>
<param name="argument">String to be checked for <see langword="null"/> or whitespace.</param>
<param name="paramName">The name of the parameter being checked.</param>
<returns>The original value of <paramref name="argument"/>.</returns>
</member>
<member name="T:System.Runtime.InteropServices.LibraryImportAttribute">
<summary>
Attribute used to indicate a source generator should create a function for marshalling
arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
</summary>
<remarks>
This attribute is meaningless if the source generator associated with it is not enabled.
The current built-in source generator only supports C# and only supplies an implementation when
applied to static, partial, non-generic methods.
</remarks>
</member>
<member name="M:System.Runtime.InteropServices.LibraryImportAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Runtime.InteropServices.LibraryImportAttribute"/>.
</summary>
<param name="libraryName">Name of the library containing the import.</param>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.LibraryName">
<summary>
Gets the name of the library containing the import.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.EntryPoint">
<summary>
Gets or sets the name of the entry point to be called.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling">
<summary>
Gets or sets how to marshal string arguments to the method.
</summary>
<remarks>
If this field is set to a value other than <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />,
<see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType" /> must not be specified.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType">
<summary>
Gets or sets the <see cref="T:System.Type"/> used to control how string arguments to the method are marshalled.
</summary>
<remarks>
If this field is specified, <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling" /> must not be specified
or must be set to <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.SetLastError">
<summary>
Gets or sets whether the callee sets an error (SetLastError on Windows or errno
on other platforms) before returning from the attributed method.
</summary>
</member>
<member name="T:System.Runtime.InteropServices.StringMarshalling">
<summary>
Specifies how strings should be marshalled for generated p/invokes
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Custom">
<summary>
Indicates the user is supplying a specific marshaller in <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType"/>.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf8">
<summary>
Use the platform-provided UTF-8 marshaller.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf16">
<summary>
Use the platform-provided UTF-16 marshaller.
</summary>
</member>
<member name="P:System.SR.InvalidSectionName">
<summary>Section '{0}' not found in configuration.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.AllowNullAttribute">
<summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DisallowNullAttribute">
<summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullAttribute">
<summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullAttribute">
<summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter may be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter will not be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute">
<summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with the associated parameter name.</summary>
<param name="parameterName">
The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.ParameterName">
<summary>Gets the associated parameter name.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute">
<summary>Applied to a method that will never return under any circumstance.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute">
<summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified parameter value.</summary>
<param name="parameterValue">
The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
the associated parameter matches this value.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.ParameterValue">
<summary>Gets the condition parameter value.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with a field or property member.</summary>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String[])">
<summary>Initializes the attribute with the list of field and property members.</summary>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String)">
<summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field or property member will not be null.
</param>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String[])">
<summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field and property members will not be null.
</param>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,654 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Extensions.Configuration.Binder</name>
</assembly>
<members>
<member name="T:Microsoft.Extensions.Configuration.BinderOptions">
<summary>
Specifies options used by the <see cref="T:Microsoft.Extensions.Configuration.ConfigurationBinder"/>.
</summary>
</member>
<member name="P:Microsoft.Extensions.Configuration.BinderOptions.BindNonPublicProperties">
<summary>
Gets or sets a value that indicates whether the binder attempts to set all properties or only public properties.
</summary>
<value>
<see langword="true" /> if the binder attempts to set all non-read-only properties; <see langword="false" /> if only public properties are set.
</value>
</member>
<member name="P:Microsoft.Extensions.Configuration.BinderOptions.ErrorOnUnknownConfiguration">
<summary>
Gets or sets a value that indicates whether exceptions are thrown when converting a value or when a configuration
key is found for which the provided model object doesn't have an appropriate property that matches the key's name.
</summary>
<value>
<see langword="true" /> if an <see cref="T:System.InvalidOperationException"/> is thrown with a description; <see langword="false" /> if no exceptions are thrown. The default is <see langword="false" />.
</value>
</member>
<member name="T:Microsoft.Extensions.Configuration.ConfigurationBinder">
<summary>
Static helper class that allows binding strongly typed objects to configuration values.
</summary>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Get``1(Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Attempts to bind the configuration instance to a new instance of type T.
If this configuration section has a value, that will be used.
Otherwise binding by matching property names against configuration keys recursively.
</summary>
<typeparam name="T">The type of the new instance to bind.</typeparam>
<param name="configuration">The configuration instance to bind.</param>
<returns>The new instance of T if successful, default(T) otherwise.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Get``1(Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Attempts to bind the configuration instance to a new instance of type T.
If this configuration section has a value, that will be used.
Otherwise binding by matching property names against configuration keys recursively.
</summary>
<typeparam name="T">The type of the new instance to bind.</typeparam>
<param name="configuration">The configuration instance to bind.</param>
<param name="configureOptions">Configures the binder options.</param>
<returns>The new instance of T if successful, default(T) otherwise.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Get(Microsoft.Extensions.Configuration.IConfiguration,System.Type)">
<summary>
Attempts to bind the configuration instance to a new instance of type T.
If this configuration section has a value, that will be used.
Otherwise binding by matching property names against configuration keys recursively.
</summary>
<param name="configuration">The configuration instance to bind.</param>
<param name="type">The type of the new instance to bind.</param>
<returns>The new instance if successful, null otherwise.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Get(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Attempts to bind the configuration instance to a new instance of type T.
If this configuration section has a value, that will be used.
Otherwise binding by matching property names against configuration keys recursively.
</summary>
<param name="configuration">The configuration instance to bind.</param>
<param name="type">The type of the new instance to bind.</param>
<param name="configureOptions">Configures the binder options.</param>
<returns>The new instance if successful, null otherwise.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(Microsoft.Extensions.Configuration.IConfiguration,System.String,System.Object)">
<summary>
Attempts to bind the given object instance to the configuration section specified by the key by matching property names against configuration keys recursively.
</summary>
<param name="configuration">The configuration instance to bind.</param>
<param name="key">The key of the configuration section to bind.</param>
<param name="instance">The object to bind.</param>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(Microsoft.Extensions.Configuration.IConfiguration,System.Object)">
<summary>
Attempts to bind the given object instance to configuration values by matching property names against configuration keys recursively.
</summary>
<param name="configuration">The configuration instance to bind.</param>
<param name="instance">The object to bind.</param>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(Microsoft.Extensions.Configuration.IConfiguration,System.Object,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Attempts to bind the given object instance to configuration values by matching property names against configuration keys recursively.
</summary>
<param name="configuration">The configuration instance to bind.</param>
<param name="instance">The object to bind.</param>
<param name="configureOptions">Configures the binder options.</param>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue``1(Microsoft.Extensions.Configuration.IConfiguration,System.String)">
<summary>
Extracts the value with the specified key and converts it to type T.
</summary>
<typeparam name="T">The type to convert the value to.</typeparam>
<param name="configuration">The configuration.</param>
<param name="key">The key of the configuration section's value to convert.</param>
<returns>The converted value.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue``1(Microsoft.Extensions.Configuration.IConfiguration,System.String,``0)">
<summary>
Extracts the value with the specified key and converts it to type T.
</summary>
<typeparam name="T">The type to convert the value to.</typeparam>
<param name="configuration">The configuration.</param>
<param name="key">The key of the configuration section's value to convert.</param>
<param name="defaultValue">The default value to use if no value is found.</param>
<returns>The converted value.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.String)">
<summary>
Extracts the value with the specified key and converts it to the specified type.
</summary>
<param name="configuration">The configuration.</param>
<param name="type">The type to convert the value to.</param>
<param name="key">The key of the configuration section's value to convert.</param>
<returns>The converted value.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.GetValue(Microsoft.Extensions.Configuration.IConfiguration,System.Type,System.String,System.Object)">
<summary>
Extracts the value with the specified key and converts it to the specified type.
</summary>
<param name="configuration">The configuration.</param>
<param name="type">The type to convert the value to.</param>
<param name="key">The key of the configuration section's value to convert.</param>
<param name="defaultValue">The default value to use if no value is found.</param>
<returns>The converted value.</returns>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.ResetPropertyValue(System.Reflection.PropertyInfo,System.Object,Microsoft.Extensions.Configuration.BinderOptions)">
<summary>
Reset the property value to the value from the property getter. This is useful for properties that have a getter or setters that perform some logic changing the object state.
</summary>
<param name="property">The property to reset.</param>
<param name="instance">The instance to reset the property on.</param>
<param name="options">The binder options.</param>
<remarks>
This method doesn't do any configuration binding. It just resets the property value to the value from the property getter.
This method called only when creating an instance using a primary constructor with parameters names match properties names.
</remarks>
</member>
<member name="M:Microsoft.Extensions.Configuration.ConfigurationBinder.CreateInstance(System.Type,Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Configuration.BinderOptions,System.Reflection.ParameterInfo[]@)">
<summary>
Create an instance of the specified type.
</summary>
<param name="type">The type to create an instance of.</param>
<param name="config">The configuration to bind to the instance.</param>
<param name="options">The binder options.</param>
<param name="constructorParameters">The parameters of the constructor used to create the instance.</param>
<returns>The created instance.</returns>
<exception cref="T:System.InvalidOperationException">If the type cannot be created.</exception>
<remarks>
constructorParameters will not be null only when using a constructor with a parameters which get their values from the configuration
This happen when using types having properties match the constructor parameter names. `record` types are an example.
In such cases we need to carry the parameters list to avoid binding the properties again during BindProperties.
</remarks>
</member>
<member name="M:System.ThrowHelper.ThrowIfNull(System.Object,System.String)">
<summary>Throws an <see cref="T:System.ArgumentNullException"/> if <paramref name="argument"/> is null.</summary>
<param name="argument">The reference type argument to validate as non-null.</param>
<param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param>
</member>
<member name="M:System.ThrowHelper.IfNullOrWhitespace(System.String,System.String)">
<summary>
Throws either an <see cref="T:System.ArgumentNullException"/> or an <see cref="T:System.ArgumentException"/>
if the specified string is <see langword="null"/> or whitespace respectively.
</summary>
<param name="argument">String to be checked for <see langword="null"/> or whitespace.</param>
<param name="paramName">The name of the parameter being checked.</param>
<returns>The original value of <paramref name="argument"/>.</returns>
</member>
<member name="T:System.Runtime.InteropServices.LibraryImportAttribute">
<summary>
Attribute used to indicate a source generator should create a function for marshalling
arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
</summary>
<remarks>
This attribute is meaningless if the source generator associated with it is not enabled.
The current built-in source generator only supports C# and only supplies an implementation when
applied to static, partial, non-generic methods.
</remarks>
</member>
<member name="M:System.Runtime.InteropServices.LibraryImportAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Runtime.InteropServices.LibraryImportAttribute"/>.
</summary>
<param name="libraryName">Name of the library containing the import.</param>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.LibraryName">
<summary>
Gets the name of the library containing the import.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.EntryPoint">
<summary>
Gets or sets the name of the entry point to be called.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling">
<summary>
Gets or sets how to marshal string arguments to the method.
</summary>
<remarks>
If this field is set to a value other than <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />,
<see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType" /> must not be specified.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType">
<summary>
Gets or sets the <see cref="T:System.Type"/> used to control how string arguments to the method are marshalled.
</summary>
<remarks>
If this field is specified, <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling" /> must not be specified
or must be set to <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.SetLastError">
<summary>
Gets or sets whether the callee sets an error (SetLastError on Windows or errno
on other platforms) before returning from the attributed method.
</summary>
</member>
<member name="T:System.Runtime.InteropServices.StringMarshalling">
<summary>
Specifies how strings should be marshalled for generated p/invokes
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Custom">
<summary>
Indicates the user is supplying a specific marshaller in <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType"/>.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf8">
<summary>
Use the platform-provided UTF-8 marshaller.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf16">
<summary>
Use the platform-provided UTF-16 marshaller.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute">
<summary>
Indicates that certain members on a specified <see cref="T:System.Type"/> are accessed dynamically,
for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which members are being accessed during the execution
of a program.
This attribute is valid on members whose type is <see cref="T:System.Type"/> or <see cref="T:System.String"/>.
When this attribute is applied to a location of type <see cref="T:System.String"/>, the assumption is
that the string represents a fully qualified type name.
When this attribute is applied to a class, interface, or struct, the members specified
can be accessed dynamically on <see cref="T:System.Type"/> instances returned from calling
<see cref="M:System.Object.GetType"/> on instances of that class, interface, or struct.
If the attribute is applied to a method it's treated as a special case and it implies
the attribute should be applied to the "this" parameter of the method. As such the attribute
should only be used on instance methods of types assignable to System.Type (or string, but no methods
will use it there).
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute.#ctor(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute"/> class
with the specified member types.
</summary>
<param name="memberTypes">The types of members dynamically accessed.</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute.MemberTypes">
<summary>
Gets the <see cref="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes"/> which specifies the type
of members dynamically accessed.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes">
<summary>
Specifies the types of members that are dynamically accessed.
This enumeration has a <see cref="T:System.FlagsAttribute"/> attribute that allows a
bitwise combination of its member values.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.None">
<summary>
Specifies no members.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicParameterlessConstructor">
<summary>
Specifies the default, parameterless public constructor.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors">
<summary>
Specifies all public constructors.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors">
<summary>
Specifies all non-public constructors.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods">
<summary>
Specifies all public methods.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods">
<summary>
Specifies all non-public methods.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields">
<summary>
Specifies all public fields.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields">
<summary>
Specifies all non-public fields.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes">
<summary>
Specifies all public nested types.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes">
<summary>
Specifies all non-public nested types.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties">
<summary>
Specifies all public properties.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties">
<summary>
Specifies all non-public properties.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents">
<summary>
Specifies all public events.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents">
<summary>
Specifies all non-public events.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces">
<summary>
Specifies all interfaces implemented by the type.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All">
<summary>
Specifies all members.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute">
<summary>
Indicates that the specified method requires the ability to generate new code at runtime,
for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which methods are unsafe to call when compiling ahead of time.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute"/> class
with the specified message.
</summary>
<param name="message">
A message that contains information about the usage of dynamic code.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.Message">
<summary>
Gets a message that contains information about the usage of dynamic code.
</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.Url">
<summary>
Gets or sets an optional URL that contains more information about the method,
why it requires dynamic code, and what options a consumer has to deal with it.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute">
<summary>
Indicates that the specified method requires dynamic access to code that is not referenced
statically, for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which methods are unsafe to call when removing unreferenced
code from an application.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute"/> class
with the specified message.
</summary>
<param name="message">
A message that contains information about the usage of unreferenced code.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.Message">
<summary>
Gets a message that contains information about the usage of unreferenced code.
</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.Url">
<summary>
Gets or sets an optional URL that contains more information about the method,
why it requires unreferenced code, and what options a consumer has to deal with it.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<summary>
Suppresses reporting of a specific rule violation, allowing multiple suppressions on a
single code artifact.
</summary>
<remarks>
<see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/> is different than
<see cref="T:System.Diagnostics.CodeAnalysis.SuppressMessageAttribute"/> in that it doesn't have a
<see cref="T:System.Diagnostics.ConditionalAttribute"/>. So it is always preserved in the compiled assembly.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.#ctor(System.String,System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/>
class, specifying the category of the tool and the identifier for an analysis rule.
</summary>
<param name="category">The category for the attribute.</param>
<param name="checkId">The identifier of the analysis rule the attribute applies to.</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category">
<summary>
Gets the category identifying the classification of the attribute.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category"/> property describes the tool or tool analysis category
for which a message suppression attribute applies.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.CheckId">
<summary>
Gets the identifier of the analysis tool rule to be suppressed.
</summary>
<remarks>
Concatenated together, the <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category"/> and <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.CheckId"/>
properties form a unique check identifier.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Scope">
<summary>
Gets or sets the scope of the code that is relevant for the attribute.
</summary>
<remarks>
The Scope property is an optional argument that specifies the metadata scope for which
the attribute is relevant.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Target">
<summary>
Gets or sets a fully qualified path that represents the target of the attribute.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Target"/> property is an optional argument identifying the analysis target
of the attribute. An example value is "System.IO.Stream.ctor():System.Void".
Because it is fully qualified, it can be long, particularly for targets such as parameters.
The analysis tool user interface should be capable of automatically formatting the parameter.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.MessageId">
<summary>
Gets or sets an optional argument expanding on exclusion criteria.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.MessageId"/> property is an optional argument that specifies additional
exclusion where the literal metadata target is not sufficiently precise. For example,
the <see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/> cannot be applied within a method,
and it may be desirable to suppress a violation against a statement in the method that will
give a rule violation, but not against all statements in the method.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Justification">
<summary>
Gets or sets the justification for suppressing the code analysis message.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.AllowNullAttribute">
<summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DisallowNullAttribute">
<summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullAttribute">
<summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullAttribute">
<summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter may be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter will not be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute">
<summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with the associated parameter name.</summary>
<param name="parameterName">
The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.ParameterName">
<summary>Gets the associated parameter name.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute">
<summary>Applied to a method that will never return under any circumstance.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute">
<summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified parameter value.</summary>
<param name="parameterValue">
The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
the associated parameter matches this value.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.ParameterValue">
<summary>Gets the condition parameter value.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with a field or property member.</summary>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String[])">
<summary>Initializes the attribute with the list of field and property members.</summary>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String)">
<summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field or property member will not be null.
</param>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String[])">
<summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field and property members will not be null.
</param>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="P:System.SR.Error_CannotActivateAbstractOrInterface">
<summary>Cannot create instance of type '{0}' because it is either abstract or an interface.</summary>
</member>
<member name="P:System.SR.Error_CannotBindToConstructorParameter">
<summary>Cannot create instance of type '{0}' because one or more parameters cannot be bound to. Constructor parameters cannot be declared as in, out, or ref. Invalid parameters are: '{1}'</summary>
</member>
<member name="P:System.SR.Error_ConstructorParametersDoNotMatchProperties">
<summary>Cannot create instance of type '{0}' because one or more parameters cannot be bound to. Constructor parameters must have corresponding properties. Fields are not supported. Missing properties are: '{1}'</summary>
</member>
<member name="P:System.SR.Error_FailedBinding">
<summary>Failed to convert configuration value at '{0}' to type '{1}'.</summary>
</member>
<member name="P:System.SR.Error_FailedToActivate">
<summary>Failed to create instance of type '{0}'.</summary>
</member>
<member name="P:System.SR.Error_GeneralErrorWhenBinding">
<summary>'{0}' was set and binding has failed. The likely cause is an invalid configuration value.</summary>
</member>
<member name="P:System.SR.Error_MissingConfig">
<summary>'{0}' was set on the provided {1}, but the following properties were not found on the instance of {2}: {3}</summary>
</member>
<member name="P:System.SR.Error_MissingPublicInstanceConstructor">
<summary>Cannot create instance of type '{0}' because it is missing a public instance constructor.</summary>
</member>
<member name="P:System.SR.Error_MultipleParameterizedConstructors">
<summary>Cannot create instance of type '{0}' because it has multiple public parameterized constructors.</summary>
</member>
<member name="P:System.SR.Error_ParameterBeingBoundToIsUnnamed">
<summary>Cannot create instance of type '{0}' because one or more parameters are unnamed.</summary>
</member>
<member name="P:System.SR.Error_ParameterHasNoMatchingConfig">
<summary>Cannot create instance of type '{0}' because parameter '{1}' has no matching config. Each parameter in the constructor that does not have a default value must have a corresponding config entry.</summary>
</member>
<member name="P:System.SR.Error_UnsupportedMultidimensionalArray">
<summary>Cannot create instance of type '{0}' because multidimensional arrays are not supported.</summary>
</member>
</members>
</doc>

View File

@@ -0,0 +1,608 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Extensions.Options.ConfigurationExtensions</name>
</assembly>
<members>
<member name="T:Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1">
<summary>
Creates <see cref="T:Microsoft.Extensions.Primitives.IChangeToken"/>s so that <see cref="T:Microsoft.Extensions.Options.IOptionsMonitor`1"/> gets
notified when <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> changes.
</summary>
<typeparam name="TOptions"></typeparam>
</member>
<member name="M:Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1.#ctor(Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Constructor taking the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance to watch.
</summary>
<param name="config">The configuration instance.</param>
</member>
<member name="M:Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1.#ctor(System.String,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Constructor taking the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance to watch.
</summary>
<param name="name">The name of the options instance being watched.</param>
<param name="config">The configuration instance.</param>
</member>
<member name="P:Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1.Name">
<summary>
The name of the option instance being changed.
</summary>
</member>
<member name="M:Microsoft.Extensions.Options.ConfigurationChangeTokenSource`1.GetChangeToken">
<summary>
Returns the reloadToken from the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/>.
</summary>
<returns></returns>
</member>
<member name="T:Microsoft.Extensions.Options.ConfigureFromConfigurationOptions`1">
<summary>
Configures an option instance by using <see cref="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(Microsoft.Extensions.Configuration.IConfiguration,System.Object)"/> against an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/>.
</summary>
<typeparam name="TOptions">The type of options to bind.</typeparam>
</member>
<member name="M:Microsoft.Extensions.Options.ConfigureFromConfigurationOptions`1.#ctor(Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Constructor that takes the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance to bind against.
</summary>
<param name="config">The <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance.</param>
</member>
<member name="T:Microsoft.Extensions.Options.NamedConfigureFromConfigurationOptions`1">
<summary>
Configures an option instance by using <see cref="M:Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(Microsoft.Extensions.Configuration.IConfiguration,System.Object)"/> against an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/>.
</summary>
<typeparam name="TOptions">The type of options to bind.</typeparam>
</member>
<member name="M:Microsoft.Extensions.Options.NamedConfigureFromConfigurationOptions`1.#ctor(System.String,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Constructor that takes the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance to bind against.
</summary>
<param name="name">The name of the options instance.</param>
<param name="config">The <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance.</param>
</member>
<member name="M:Microsoft.Extensions.Options.NamedConfigureFromConfigurationOptions`1.#ctor(System.String,Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Constructor that takes the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance to bind against.
</summary>
<param name="name">The name of the options instance.</param>
<param name="config">The <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> instance.</param>
<param name="configureBinder">Used to configure the <see cref="T:Microsoft.Extensions.Configuration.BinderOptions"/>.</param>
</member>
<member name="T:Microsoft.Extensions.DependencyInjection.OptionsBuilderConfigurationExtensions">
<summary>
Extension methods for adding configuration related options services to the DI container via <see cref="T:Microsoft.Extensions.Options.OptionsBuilder`1"/>.
</summary>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsBuilderConfigurationExtensions.Bind``1(Microsoft.Extensions.Options.OptionsBuilder{``0},Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Registers a configuration instance which <typeparamref name="TOptions"/> will bind against.
</summary>
<typeparam name="TOptions">The options type to be configured.</typeparam>
<param name="optionsBuilder">The options builder to add the services to.</param>
<param name="config">The configuration being bound.</param>
<returns>The <see cref="T:Microsoft.Extensions.Options.OptionsBuilder`1"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsBuilderConfigurationExtensions.Bind``1(Microsoft.Extensions.Options.OptionsBuilder{``0},Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Registers a configuration instance which <typeparamref name="TOptions"/> will bind against.
</summary>
<typeparam name="TOptions">The options type to be configured.</typeparam>
<param name="optionsBuilder">The options builder to add the services to.</param>
<param name="config">The configuration being bound.</param>
<param name="configureBinder">Used to configure the <see cref="T:Microsoft.Extensions.Configuration.BinderOptions"/>.</param>
<returns>The <see cref="T:Microsoft.Extensions.Options.OptionsBuilder`1"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsBuilderConfigurationExtensions.BindConfiguration``1(Microsoft.Extensions.Options.OptionsBuilder{``0},System.String,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Registers the dependency injection container to bind <typeparamref name="TOptions"/> against
the <see cref="T:Microsoft.Extensions.Configuration.IConfiguration"/> obtained from the DI service provider.
</summary>
<typeparam name="TOptions">The options type to be configured.</typeparam>
<param name="optionsBuilder">The options builder to add the services to.</param>
<param name="configSectionPath">The name of the configuration section to bind from.</param>
<param name="configureBinder">Optional. Used to configure the <see cref="T:Microsoft.Extensions.Configuration.BinderOptions"/>.</param>
<returns>The <see cref="T:Microsoft.Extensions.Options.OptionsBuilder`1"/> so that additional calls can be chained.</returns>
<exception cref="T:System.ArgumentNullException">
<paramref name="optionsBuilder"/> or <paramref name="configSectionPath" /> is <see langword="null"/>.
</exception>
<seealso cref="M:Microsoft.Extensions.DependencyInjection.OptionsBuilderConfigurationExtensions.Bind``1(Microsoft.Extensions.Options.OptionsBuilder{``0},Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})"/>
</member>
<member name="T:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions">
<summary>
Extension methods for adding configuration-related options services to the DI container.
</summary>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Registers a configuration instance that <typeparamref name="TOptions" /> will bind against.
</summary>
<typeparam name="TOptions">The type of options being configured.</typeparam>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> to add the services to.</param>
<param name="config">The configuration being bound.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String,Microsoft.Extensions.Configuration.IConfiguration)">
<summary>
Registers a configuration instance that <typeparamref name="TOptions" /> will bind against.
</summary>
<typeparam name="TOptions">The type of options being configured.</typeparam>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> to add the services to.</param>
<param name="name">The name of the options instance.</param>
<param name="config">The configuration being bound.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Registers a configuration instance that <typeparamref name="TOptions" /> will bind against.
</summary>
<typeparam name="TOptions">The type of options being configured.</typeparam>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> to add the services to.</param>
<param name="config">The configuration being bound.</param>
<param name="configureBinder">Used to configure the <see cref="T:Microsoft.Extensions.Configuration.BinderOptions"/>.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:Microsoft.Extensions.DependencyInjection.OptionsConfigurationServiceCollectionExtensions.Configure``1(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String,Microsoft.Extensions.Configuration.IConfiguration,System.Action{Microsoft.Extensions.Configuration.BinderOptions})">
<summary>
Registers a configuration instance that <typeparamref name="TOptions" /> will bind against.
</summary>
<typeparam name="TOptions">The type of options being configured.</typeparam>
<param name="services">The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> to add the services to.</param>
<param name="name">The name of the options instance.</param>
<param name="config">The configuration being bound.</param>
<param name="configureBinder">Used to configure the <see cref="T:Microsoft.Extensions.Configuration.BinderOptions"/>.</param>
<returns>The <see cref="T:Microsoft.Extensions.DependencyInjection.IServiceCollection"/> so that additional calls can be chained.</returns>
</member>
<member name="M:System.ThrowHelper.ThrowIfNull(System.Object,System.String)">
<summary>Throws an <see cref="T:System.ArgumentNullException"/> if <paramref name="argument"/> is null.</summary>
<param name="argument">The reference type argument to validate as non-null.</param>
<param name="paramName">The name of the parameter with which <paramref name="argument"/> corresponds.</param>
</member>
<member name="M:System.ThrowHelper.IfNullOrWhitespace(System.String,System.String)">
<summary>
Throws either an <see cref="T:System.ArgumentNullException"/> or an <see cref="T:System.ArgumentException"/>
if the specified string is <see langword="null"/> or whitespace respectively.
</summary>
<param name="argument">String to be checked for <see langword="null"/> or whitespace.</param>
<param name="paramName">The name of the parameter being checked.</param>
<returns>The original value of <paramref name="argument"/>.</returns>
</member>
<member name="T:System.Runtime.InteropServices.LibraryImportAttribute">
<summary>
Attribute used to indicate a source generator should create a function for marshalling
arguments instead of relying on the runtime to generate an equivalent marshalling function at run-time.
</summary>
<remarks>
This attribute is meaningless if the source generator associated with it is not enabled.
The current built-in source generator only supports C# and only supplies an implementation when
applied to static, partial, non-generic methods.
</remarks>
</member>
<member name="M:System.Runtime.InteropServices.LibraryImportAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Runtime.InteropServices.LibraryImportAttribute"/>.
</summary>
<param name="libraryName">Name of the library containing the import.</param>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.LibraryName">
<summary>
Gets the name of the library containing the import.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.EntryPoint">
<summary>
Gets or sets the name of the entry point to be called.
</summary>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling">
<summary>
Gets or sets how to marshal string arguments to the method.
</summary>
<remarks>
If this field is set to a value other than <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />,
<see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType" /> must not be specified.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType">
<summary>
Gets or sets the <see cref="T:System.Type"/> used to control how string arguments to the method are marshalled.
</summary>
<remarks>
If this field is specified, <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshalling" /> must not be specified
or must be set to <see cref="F:System.Runtime.InteropServices.StringMarshalling.Custom" />.
</remarks>
</member>
<member name="P:System.Runtime.InteropServices.LibraryImportAttribute.SetLastError">
<summary>
Gets or sets whether the callee sets an error (SetLastError on Windows or errno
on other platforms) before returning from the attributed method.
</summary>
</member>
<member name="T:System.Runtime.InteropServices.StringMarshalling">
<summary>
Specifies how strings should be marshalled for generated p/invokes
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Custom">
<summary>
Indicates the user is supplying a specific marshaller in <see cref="P:System.Runtime.InteropServices.LibraryImportAttribute.StringMarshallingCustomType"/>.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf8">
<summary>
Use the platform-provided UTF-8 marshaller.
</summary>
</member>
<member name="F:System.Runtime.InteropServices.StringMarshalling.Utf16">
<summary>
Use the platform-provided UTF-16 marshaller.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute">
<summary>
Indicates that certain members on a specified <see cref="T:System.Type"/> are accessed dynamically,
for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which members are being accessed during the execution
of a program.
This attribute is valid on members whose type is <see cref="T:System.Type"/> or <see cref="T:System.String"/>.
When this attribute is applied to a location of type <see cref="T:System.String"/>, the assumption is
that the string represents a fully qualified type name.
When this attribute is applied to a class, interface, or struct, the members specified
can be accessed dynamically on <see cref="T:System.Type"/> instances returned from calling
<see cref="M:System.Object.GetType"/> on instances of that class, interface, or struct.
If the attribute is applied to a method it's treated as a special case and it implies
the attribute should be applied to the "this" parameter of the method. As such the attribute
should only be used on instance methods of types assignable to System.Type (or string, but no methods
will use it there).
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute.#ctor(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute"/> class
with the specified member types.
</summary>
<param name="memberTypes">The types of members dynamically accessed.</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembersAttribute.MemberTypes">
<summary>
Gets the <see cref="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes"/> which specifies the type
of members dynamically accessed.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes">
<summary>
Specifies the types of members that are dynamically accessed.
This enumeration has a <see cref="T:System.FlagsAttribute"/> attribute that allows a
bitwise combination of its member values.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.None">
<summary>
Specifies no members.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicParameterlessConstructor">
<summary>
Specifies the default, parameterless public constructor.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors">
<summary>
Specifies all public constructors.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors">
<summary>
Specifies all non-public constructors.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods">
<summary>
Specifies all public methods.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods">
<summary>
Specifies all non-public methods.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields">
<summary>
Specifies all public fields.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields">
<summary>
Specifies all non-public fields.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes">
<summary>
Specifies all public nested types.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes">
<summary>
Specifies all non-public nested types.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties">
<summary>
Specifies all public properties.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties">
<summary>
Specifies all non-public properties.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents">
<summary>
Specifies all public events.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents">
<summary>
Specifies all non-public events.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.Interfaces">
<summary>
Specifies all interfaces implemented by the type.
</summary>
</member>
<member name="F:System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All">
<summary>
Specifies all members.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute">
<summary>
Indicates that the specified method requires the ability to generate new code at runtime,
for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which methods are unsafe to call when compiling ahead of time.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute"/> class
with the specified message.
</summary>
<param name="message">
A message that contains information about the usage of dynamic code.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.Message">
<summary>
Gets a message that contains information about the usage of dynamic code.
</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresDynamicCodeAttribute.Url">
<summary>
Gets or sets an optional URL that contains more information about the method,
why it requires dynamic code, and what options a consumer has to deal with it.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute">
<summary>
Indicates that the specified method requires dynamic access to code that is not referenced
statically, for example through <see cref="N:System.Reflection"/>.
</summary>
<remarks>
This allows tools to understand which methods are unsafe to call when removing unreferenced
code from an application.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.#ctor(System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute"/> class
with the specified message.
</summary>
<param name="message">
A message that contains information about the usage of unreferenced code.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.Message">
<summary>
Gets a message that contains information about the usage of unreferenced code.
</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.RequiresUnreferencedCodeAttribute.Url">
<summary>
Gets or sets an optional URL that contains more information about the method,
why it requires unreferenced code, and what options a consumer has to deal with it.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute">
<summary>
Suppresses reporting of a specific rule violation, allowing multiple suppressions on a
single code artifact.
</summary>
<remarks>
<see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/> is different than
<see cref="T:System.Diagnostics.CodeAnalysis.SuppressMessageAttribute"/> in that it doesn't have a
<see cref="T:System.Diagnostics.ConditionalAttribute"/>. So it is always preserved in the compiled assembly.
</remarks>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.#ctor(System.String,System.String)">
<summary>
Initializes a new instance of the <see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/>
class, specifying the category of the tool and the identifier for an analysis rule.
</summary>
<param name="category">The category for the attribute.</param>
<param name="checkId">The identifier of the analysis rule the attribute applies to.</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category">
<summary>
Gets the category identifying the classification of the attribute.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category"/> property describes the tool or tool analysis category
for which a message suppression attribute applies.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.CheckId">
<summary>
Gets the identifier of the analysis tool rule to be suppressed.
</summary>
<remarks>
Concatenated together, the <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Category"/> and <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.CheckId"/>
properties form a unique check identifier.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Scope">
<summary>
Gets or sets the scope of the code that is relevant for the attribute.
</summary>
<remarks>
The Scope property is an optional argument that specifies the metadata scope for which
the attribute is relevant.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Target">
<summary>
Gets or sets a fully qualified path that represents the target of the attribute.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Target"/> property is an optional argument identifying the analysis target
of the attribute. An example value is "System.IO.Stream.ctor():System.Void".
Because it is fully qualified, it can be long, particularly for targets such as parameters.
The analysis tool user interface should be capable of automatically formatting the parameter.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.MessageId">
<summary>
Gets or sets an optional argument expanding on exclusion criteria.
</summary>
<remarks>
The <see cref="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.MessageId"/> property is an optional argument that specifies additional
exclusion where the literal metadata target is not sufficiently precise. For example,
the <see cref="T:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute"/> cannot be applied within a method,
and it may be desirable to suppress a violation against a statement in the method that will
give a rule violation, but not against all statements in the method.
</remarks>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.UnconditionalSuppressMessageAttribute.Justification">
<summary>
Gets or sets the justification for suppressing the code analysis message.
</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.AllowNullAttribute">
<summary>Specifies that null is allowed as an input even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DisallowNullAttribute">
<summary>Specifies that null is disallowed as an input even if the corresponding type allows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullAttribute">
<summary>Specifies that an output may be null even if the corresponding type disallows it.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullAttribute">
<summary>Specifies that an output will not be null even if the corresponding type allows it. Specifies that an input argument was not null when the call returns.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue"/>, the parameter may be null even if the corresponding type disallows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter may be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MaybeNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute">
<summary>Specifies that when a method returns <see cref="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue"/>, the parameter will not be null even if the corresponding type allows it.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified return value condition.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated parameter will not be null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute">
<summary>Specifies that the output will be non-null if the named parameter is non-null.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with the associated parameter name.</summary>
<param name="parameterName">
The associated parameter name. The output will be non-null if the argument to the parameter specified is non-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.NotNullIfNotNullAttribute.ParameterName">
<summary>Gets the associated parameter name.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnAttribute">
<summary>Applied to a method that will never return under any circumstance.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute">
<summary>Specifies that the method will not return if the associated Boolean parameter is passed the specified value.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.#ctor(System.Boolean)">
<summary>Initializes the attribute with the specified parameter value.</summary>
<param name="parameterValue">
The condition parameter value. Code after the method will be considered unreachable by diagnostics if the argument to
the associated parameter matches this value.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.DoesNotReturnIfAttribute.ParameterValue">
<summary>Gets the condition parameter value.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String)">
<summary>Initializes the attribute with a field or property member.</summary>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.#ctor(System.String[])">
<summary>Initializes the attribute with the list of field and property members.</summary>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
<member name="T:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute">
<summary>Specifies that the method or property will ensure that the listed field and property members have not-null values when returning with the specified return value condition.</summary>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String)">
<summary>Initializes the attribute with the specified return value condition and a field or property member.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field or property member will not be null.
</param>
<param name="member">
The field or property member that is promised to be not-null.
</param>
</member>
<member name="M:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.#ctor(System.Boolean,System.String[])">
<summary>Initializes the attribute with the specified return value condition and list of field and property members.</summary>
<param name="returnValue">
The return value condition. If the method returns this value, the associated field and property members will not be null.
</param>
<param name="members">
The list of field and property members that are promised to be not-null.
</param>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.ReturnValue">
<summary>Gets the return value condition.</summary>
</member>
<member name="P:System.Diagnostics.CodeAnalysis.MemberNotNullWhenAttribute.Members">
<summary>Gets field or property member names.</summary>
</member>
</members>
</doc>

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More