Compare commits
13 Commits
9e5819355d
...
snapshot/l
| Author | SHA1 | Date | |
|---|---|---|---|
| 98624a6144 | |||
| 6c7ed099da | |||
| ff5ebb5662 | |||
| 1fa1ece06d | |||
| 62f7632fc6 | |||
| e7554da9c7 | |||
| f16fb81ed8 | |||
| 8fdd0b6803 | |||
| e31027aa9d | |||
| 5b7397237e | |||
| 9d08fb1d1a | |||
| 4f42c3a030 | |||
| 38771efb9f |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -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
|
||||
|
||||
197
db_backups/add_design_hours_report_tree_query_20260728.sql
Normal file
197
db_backups/add_design_hours_report_tree_query_20260728.sql
Normal 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
|
||||
122
db_backups/add_design_report_check_pagination_20260723.sql
Normal file
122
db_backups/add_design_report_check_pagination_20260723.sql
Normal 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
|
||||
92
db_backups/add_design_report_check_permissions_20260722.sql
Normal file
92
db_backups/add_design_report_check_permissions_20260722.sql
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
135
db_backups/add_design_report_task_hours_report_20260715.sql
Normal file
135
db_backups/add_design_report_task_hours_report_20260715.sql
Normal 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
|
||||
204
db_backups/add_design_report_task_view_permissions_20260723.sql
Normal file
204
db_backups/add_design_report_task_view_permissions_20260723.sql
Normal 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
|
||||
193
db_backups/add_install_task_budget_progress_20260725.sql
Normal file
193
db_backups/add_install_task_budget_progress_20260725.sql
Normal 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
|
||||
@@ -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
|
||||
194
db_backups/add_plan_kanban_rate_configuration_20260728.sql
Normal file
194
db_backups/add_plan_kanban_rate_configuration_20260728.sql
Normal 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
|
||||
204
db_backups/add_plan_shell_tree_query_20260728.sql
Normal file
204
db_backups/add_plan_shell_tree_query_20260728.sql
Normal 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
|
||||
197
db_backups/add_research_financial_hours_20260723.sql
Normal file
197
db_backups/add_research_financial_hours_20260723.sql
Normal 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
|
||||
272
db_backups/add_sale_order_status_tree_query_20260728.sql
Normal file
272
db_backups/add_sale_order_status_tree_query_20260728.sql
Normal 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
|
||||
281
db_backups/add_settlement_workhours_tree_query_20260728.sql
Normal file
281
db_backups/add_settlement_workhours_tree_query_20260728.sql
Normal 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
|
||||
251
db_backups/add_timesheet_dashboard_tree_query_20260728.sql
Normal file
251
db_backups/add_timesheet_dashboard_tree_query_20260728.sql
Normal 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
|
||||
197
db_backups/alter_design_financial_hours_tree_query_20260728.sql
Normal file
197
db_backups/alter_design_financial_hours_tree_query_20260728.sql
Normal 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
|
||||
68
db_backups/create_design_report_attachments_20260722.sql
Normal file
68
db_backups/create_design_report_attachments_20260722.sql
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
209
db_backups/fix_delivery_notice_list_data_merge_20260720.sql
Normal file
209
db_backups/fix_delivery_notice_list_data_merge_20260720.sql
Normal 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
|
||||
103
db_backups/fix_install_task_contract_hours_20260725.sql
Normal file
103
db_backups/fix_install_task_contract_hours_20260725.sql
Normal 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
|
||||
116
db_backups/fix_outsource_sheet_export_consistency_20260731.sql
Normal file
116
db_backups/fix_outsource_sheet_export_consistency_20260731.sql
Normal 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
|
||||
469
db_backups/optimize_install_task_queries_20260725.sql
Normal file
469
db_backups/optimize_install_task_queries_20260725.sql
Normal 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
|
||||
79
db_backups/optimize_install_task_query_indexes_20260725.sql
Normal file
79
db_backups/optimize_install_task_query_indexes_20260725.sql
Normal 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
|
||||
281
db_backups/optimize_process_workhours_query_20260728.sql
Normal file
281
db_backups/optimize_process_workhours_query_20260728.sql
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
82
db_backups/rollback_install_task_contract_hours_20260725.sql
Normal file
82
db_backups/rollback_install_task_contract_hours_20260725.sql
Normal 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
|
||||
72
db_backups/rollback_install_task_queries_20260725.sql
Normal file
72
db_backups/rollback_install_task_queries_20260725.sql
Normal 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
|
||||
32
db_backups/rollback_install_task_query_indexes_20260725.sql
Normal file
32
db_backups/rollback_install_task_query_indexes_20260725.sql
Normal 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
|
||||
47
db_backups/rollback_secure_test_login_response_20260725.sql
Normal file
47
db_backups/rollback_secure_test_login_response_20260725.sql
Normal 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
|
||||
@@ -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
|
||||
76
db_backups/secure_test_login_response_20260725.sql
Normal file
76
db_backups/secure_test_login_response_20260725.sql
Normal 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
|
||||
@@ -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
|
||||
|
||||
119
db_backups/update_design_report_hours_report_fields_20260727.sql
Normal file
119
db_backups/update_design_report_hours_report_fields_20260727.sql
Normal 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
35
doc/2026年7月27日_工作总结.txt
Normal file
35
doc/2026年7月27日_工作总结.txt
Normal 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
|
||||
搭建生产动态页面的菜单、功能入口、操作流程和相关业务说明文档,整理页面结构和后续开发、验收所需的基础材料。
|
||||
139
doc/MES后台网页版功能与存储过程全量盘点_20260725.md
Normal file
139
doc/MES后台网页版功能与存储过程全量盘点_20260725.md
Normal file
@@ -0,0 +1,139 @@
|
||||
# MES 后台网页版功能与存储过程全量盘点
|
||||
|
||||
盘点日期:2026-07-25 | 环境:测试数据库 YL_MESDB | 角色:1
|
||||
|
||||
## 1. 盘点范围
|
||||
|
||||
- 前端源码:185 个文件,其中 108 个 Vue、77 个 JS。
|
||||
- 菜单:84 条,其中模块 9 个、可进入页面 75 个;75 个页面全部映射到源码文件。
|
||||
- 前端过程调用:772 次 CreateData,281 个唯一字面量过程名,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`:数据库未被静态前端调用清单。
|
||||
496
doc/MES测试环境接管基线_20260725.md
Normal file
496
doc/MES测试环境接管基线_20260725.md
Normal 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/2019,64722 在 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`,网络调用次数为 0;B1/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 修改;将来若生产问题必须修改核心逻辑,需要取得源码或采用经过专项验证的替代构建流程。
|
||||
BIN
doc/SAP接口调用清单.pdf
Normal file
BIN
doc/SAP接口调用清单.pdf
Normal file
Binary file not shown.
47
doc/SAP接口调用清单_第9章.html
Normal file
47
doc/SAP接口调用清单_第9章.html
Normal 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>
|
||||
BIN
doc/SAP接口调用清单_第9章.pdf
Normal file
BIN
doc/SAP接口调用清单_第9章.pdf
Normal file
Binary file not shown.
BIN
doc/SAP接口调用清单_第9章_预览.png
Normal file
BIN
doc/SAP接口调用清单_第9章_预览.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 128 KiB |
588
doc/SAP接口调用说明.html
Normal file
588
doc/SAP接口调用说明.html
Normal 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=<SessionId>;</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=PATCH):patchB1('/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("/Resources('工位号')", { 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: <AccessToken></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>系统管理 > 工位管理。</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>工艺管理 > 工序管理。</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>计划排产 > 工位任务汇总。</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>生产管理 > 外协管理,或采购外协管理。</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>生产管理 > 加工中心或装配中心。</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>生产管理 > 工时校验。</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>质量管理 > 序检收检。</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>质量管理 > 原材料退库检验。</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=POST):B1 新增工位资源
|
||||
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=PATCH):B1 更新工位名称
|
||||
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=PATCH):B1 更新工艺阶段
|
||||
POST {{mes_b1_gateway}}
|
||||
{
|
||||
"func": "PATCH",
|
||||
"cmd": "RouteStages(10)",
|
||||
"content": "{\"Description\":\"装配\",\"DateOfUpdate\":\"2026-08-03\"}"
|
||||
}
|
||||
|
||||
// 禁止调用(func=PATCH):B1 排产日期回写生产订单
|
||||
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=PATCH):B1 关闭生产订单
|
||||
POST {{mes_b1_gateway}}
|
||||
{
|
||||
"func": "PATCH",
|
||||
"cmd": "ProductionOrders(7316)",
|
||||
"content": "{\"AbsoluteEntry\":7316,\"ProductionOrderStatus\":\"boposClosed\"}"
|
||||
}</code></pre>
|
||||
<pre><code>// 禁止调用(func=POST):B1 装配派工创建采购申请
|
||||
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=POST):B1 外协派工创建采购申请(增加工序关联字段)
|
||||
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=POST):B1 工时校验的生产反馈,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=POST):B1 外协收检前查询采购订单及行项目
|
||||
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=POST):B1 外协收检创建采购收货单
|
||||
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=POST):TM 创建领料出库任务
|
||||
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=POST):TM 创建不合格品/退库入库任务
|
||||
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>
|
||||
BIN
doc/主页大图标点击后进入404.docx
Normal file
BIN
doc/主页大图标点击后进入404.docx
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES测试环境接管报告_V1.0_2026-07-25.docx
Normal file
BIN
doc/大连元利流体技术有限公司MES测试环境接管报告_V1.0_2026-07-25.docx
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES测试环境接管报告_V1.1_2026-07-25.docx
Normal file
BIN
doc/大连元利流体技术有限公司MES测试环境接管报告_V1.1_2026-07-25.docx
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES系统标准技术文档_V1.1_2026-07-24.docx
Normal file
BIN
doc/大连元利流体技术有限公司MES系统标准技术文档_V1.1_2026-07-24.docx
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES系统标准技术文档_V1.1_2026-07-24.pdf
Normal file
BIN
doc/大连元利流体技术有限公司MES系统标准技术文档_V1.1_2026-07-24.pdf
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES系统用户操作手册_V1.1_2026-07-23.docx
Normal file
BIN
doc/大连元利流体技术有限公司MES系统用户操作手册_V1.1_2026-07-23.docx
Normal file
Binary file not shown.
BIN
doc/大连元利流体技术有限公司MES系统用户操作手册_V1.1_2026-07-23.pdf
Normal file
BIN
doc/大连元利流体技术有限公司MES系统用户操作手册_V1.1_2026-07-23.pdf
Normal file
Binary file not shown.
44
doc/存储过程基础数据前端处理审计_20260728.md
Normal file
44
doc/存储过程基础数据前端处理审计_20260728.md
Normal 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. 工位排产页在前端累计工时形成实际展示的工位汇总表,导出或其他接口若未复用规则,数值可能不一致。
|
||||
654
doc/工时模块全流程技术说明_20260721.html
Normal file
654
doc/工时模块全流程技术说明_20260721.html
Normal 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>总时长 > 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=0,WorkType=跳过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>加工工时 > 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>
|
||||
BIN
doc/工时模块全流程技术说明_20260721.pdf
Normal file
BIN
doc/工时模块全流程技术说明_20260721.pdf
Normal file
Binary file not shown.
151
doc/工时计算.html
Normal file
151
doc/工时计算.html
Normal 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>开始时间 < 当天 00:00:00</code>,当天开始的记录不进入该最终校验列表。</td></tr>
|
||||
<tr><td>单条上传分钟计算</td><td>若 <code>总时长 < 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>
|
||||
BIN
doc/技术开发详细方案_2026-05-27.docx
Normal file
BIN
doc/技术开发详细方案_2026-05-27.docx
Normal file
Binary file not shown.
101
doc/装配任务查询性能优化_20260725.md
Normal file
101
doc/装配任务查询性能优化_20260725.md
Normal 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 秒无明显收益,因此已完整回滚并清理临时过程和索引,未纳入正式方案。
|
||||
53
doc/装配任务预算进度功能_20260725.md
Normal file
53
doc/装配任务预算进度功能_20260725.md
Normal 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`
|
||||
|
||||
数据库回滚恢复预算功能上线前的核心查询并删除保存过程,但有意保留两张预算表,防止已经录入的人工预算数据丢失。正式前端发布时必须先备份原静态目录,前端回滚使用该目录备份。
|
||||
BIN
doc/设计工时任务报表字段配置修改.docx
Normal file
BIN
doc/设计工时任务报表字段配置修改.docx
Normal file
Binary file not shown.
@@ -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
Binary file not shown.
Binary file not shown.
8722
server_baseline/MES_ManageV20250916_20260725/Bin/ASPNet_Drawing.xml
Normal file
8722
server_baseline/MES_ManageV20250916_20260725/Bin/ASPNet_Drawing.xml
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/BasicData.dll
Normal file
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/BasicData.dll
Normal file
Binary file not shown.
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/BasicData.pdb
Normal file
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/BasicData.pdb
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
4617
server_baseline/MES_ManageV20250916_20260725/Bin/DataLinkMesWork.xml
Normal file
4617
server_baseline/MES_ManageV20250916_20260725/Bin/DataLinkMesWork.xml
Normal file
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/JWT.dll
Normal file
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/JWT.dll
Normal file
Binary file not shown.
Binary file not shown.
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/MES_SPC.dll
Normal file
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/MES_SPC.dll
Normal file
Binary file not shown.
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/MES_SPC.pdb
Normal file
BIN
server_baseline/MES_ManageV20250916_20260725/Bin/MES_SPC.pdb
Normal file
Binary file not shown.
Binary file not shown.
@@ -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>
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -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>
|
||||
Binary file not shown.
@@ -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>
|
||||
Binary file not shown.
@@ -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>
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
@@ -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>
|
||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user