From e89cef4895a3e57916ab7499abc568dc3ea07ff0 Mon Sep 17 00:00:00 2001 From: zhangxinyang Date: Fri, 10 Jul 2026 17:43:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=E6=8A=A5=E5=B7=A5=E7=A0=94=E5=8F=91=E7=AE=A1=E7=90=86=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d_design_report_progress_note_20260710.sql | 288 ++++++++++++++++++ ...ate_design_report_task_module_20260630.sql | 153 +++++++--- ...ix_design_report_check_status_20260710.sql | 158 ++++++++++ ...port_task_to_rd_menu_account1_20260710.sql | 178 +++++++++++ gptlog-process/gpdlog.md | 277 +++++++++++++++++ .../DesignReportTask/Check/index.vue | 16 +- .../DesignReportTask/HoursReport/index.vue | 1 + .../DesignReportTask/Report/index.vue | 79 ++++- .../DesignReportTask/Task/index.vue | 7 +- 9 files changed, 1103 insertions(+), 54 deletions(-) create mode 100644 db_backups/add_design_report_progress_note_20260710.sql create mode 100644 db_backups/fix_design_report_check_status_20260710.sql create mode 100644 db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql diff --git a/db_backups/add_design_report_progress_note_20260710.sql b/db_backups/add_design_report_progress_note_20260710.sql new file mode 100644 index 0000000..221ca63 --- /dev/null +++ b/db_backups/add_design_report_progress_note_20260710.sql @@ -0,0 +1,288 @@ +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 + +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(@进度说明, N'') + WHERE [RID] = @RID; + + UPDATE [dbo].[MES_设计报工_任务] + SET + [单据状态] = CASE + WHEN [单据状态] = N'已完成' THEN N'已完成' + 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 + +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'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始日期, N'')); + DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束日期, N'')); + + 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) + ) + ORDER BY r.[RID] DESC; +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 +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 [操作人], + 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) + ), + 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 diff --git a/db_backups/create_design_report_task_module_20260630.sql b/db_backups/create_design_report_task_module_20260630.sql index b2a7be0..cf19f37 100644 --- a/db_backups/create_design_report_task_module_20260630.sql +++ b/db_backups/create_design_report_task_module_20260630.sql @@ -65,12 +65,19 @@ BEGIN [校验人] nvarchar(100) NULL, [校验时间] datetime NULL, [创建时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_记录_创建时间] DEFAULT (GETDATE()), + [进度说明] nvarchar(500) NULL, [备注] nvarchar(500) NULL, CONSTRAINT [FK_MES_设计报工_记录_任务] FOREIGN KEY ([DID]) REFERENCES [dbo].[MES_设计报工_任务]([DID]) ); END GO +IF COL_LENGTH(N'dbo.MES_设计报工_记录', N'进度说明') IS NULL +BEGIN + ALTER TABLE [dbo].[MES_设计报工_记录] ADD [进度说明] nvarchar(500) NULL; +END +GO + IF OBJECT_ID(N'[dbo].[MES_设计报工_校验记录]', N'U') IS NULL BEGIN CREATE TABLE [dbo].[MES_设计报工_校验记录] @@ -510,14 +517,18 @@ GO CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_结束] @DID int, @操作人ID nvarchar(100) = N'', - @操作人 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 @@ -525,53 +536,66 @@ BEGIN 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 + BEGIN TRY + IF @初始事务数 = 0 BEGIN TRANSACTION; + ELSE SAVE TRANSACTION @保存点名称; - IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID AND [单据状态] = N'已完成') - BEGIN - 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 @RID = [RID] - FROM [dbo].[MES_设计报工_记录] - 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; + 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 - SELECT CAST(0 AS int) AS [result], N'当前人员没有未结束的报工记录' AS [message]; - RETURN; - END + 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'已结束' - WHERE [RID] = @RID; + UPDATE [dbo].[MES_设计报工_记录] + SET + [结束时间] = GETDATE(), + [工时秒数] = DATEDIFF(second, [开始时间], GETDATE()), + [报工状态] = N'已结束', + [进度说明] = NULLIF(@进度说明, 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 AND [单据状态] <> N'已完成'; + UPDATE [dbo].[MES_设计报工_任务] + SET + [单据状态] = CASE + WHEN [单据状态] = N'已完成' THEN N'已完成' + WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) THEN N'执行中' + ELSE N'已结束' + END, + [最后编辑人] = @当前操作人, + [最后编辑时间] = GETDATE() + WHERE [DID] = @DID; - SELECT CAST(1 AS int) AS [result], N'结束成功' AS [message], @RID AS [RID]; + 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 @@ -656,6 +680,7 @@ BEGIN 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 @@ -762,7 +787,21 @@ BEGIN [备注] = NULLIF(@校验备注, N'') WHERE [RID] = @RID; - SELECT CAST(1 AS int) AS [result], N'校验成功' AS [message]; + UPDATE [dbo].[MES_设计报工_任务] + SET + [单据状态] = CASE + WHEN [单据状态] = N'已完成' THEN N'已完成' + WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) THEN N'执行中' + ELSE N'已结束' + END, + [最后编辑人] = NULLIF(@校验人, N''), + [最后编辑时间] = GETDATE() + WHERE [DID] = @DID; + + SELECT + CAST(1 AS int) AS [result], + N'校验成功' AS [message], + (SELECT [单据状态] FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID) AS [任务状态]; END GO @@ -775,7 +814,9 @@ BEGIN SET NOCOUNT ON; DECLARE @RID表 table([RID] int PRIMARY KEY); + DECLARE @DID表 table([DID] int PRIMARY KEY); DECLARE @xml xml; + DECLARE @更新记录数 int; SET @xml = TRY_CONVERT(xml, N'' + REPLACE(ISNULL(@RIDs, N''), N',', N'') + N''); @@ -790,6 +831,12 @@ BEGIN RETURN; END + INSERT INTO @DID表([DID]) + SELECT DISTINCT r.[DID] + FROM [dbo].[MES_设计报工_记录] AS r + INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID] + WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL; + INSERT INTO [dbo].[MES_设计报工_校验记录] ( [RID], [DID], [校验前开始时间], [校验前结束时间], @@ -814,7 +861,21 @@ BEGIN INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID] WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL; - SELECT CAST(1 AS int) AS [result], N'批量校验成功' AS [message], @@ROWCOUNT AS [count]; + SET @更新记录数 = @@ROWCOUNT; + + UPDATE t + SET + [单据状态] = CASE + WHEN t.[单据状态] = N'已完成' THEN N'已完成' + WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = t.[DID] AND [结束时间] IS NULL) THEN N'执行中' + ELSE N'已结束' + END, + [最后编辑人] = NULLIF(@校验人, N''), + [最后编辑时间] = GETDATE() + FROM [dbo].[MES_设计报工_任务] AS t + INNER JOIN @DID表 AS ids ON t.[DID] = ids.[DID]; + + SELECT CAST(1 AS int) AS [result], N'批量校验成功' AS [message], @更新记录数 AS [count]; END GO @@ -850,6 +911,7 @@ BEGIN r.[结束时间], ISNULL(r.[工时秒数], 0) AS [工时秒数], r.[已校验], + r.[进度说明], r.[备注] FROM [dbo].[MES_设计报工_记录] AS r INNER JOIN [dbo].[MES_设计报工_任务] AS t ON r.[DID] = t.[DID] @@ -885,6 +947,7 @@ BEGIN 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 [操作人] @@ -910,6 +973,7 @@ BEGIN 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 [操作人], [工作日期] @@ -935,6 +999,7 @@ BEGIN 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 ) diff --git a/db_backups/fix_design_report_check_status_20260710.sql b/db_backups/fix_design_report_check_status_20260710.sql new file mode 100644 index 0000000..01cb13d --- /dev/null +++ b/db_backups/fix_design_report_check_status_20260710.sql @@ -0,0 +1,158 @@ +USE [YL_MESDB]; +GO + +SET ANSI_NULLS ON; +GO +SET QUOTED_IDENTIFIER ON; +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_保存] + @RID int, + @开始时间 nvarchar(30), + @结束时间 nvarchar(30), + @校验人ID nvarchar(100) = N'', + @校验人 nvarchar(100) = N'', + @校验备注 nvarchar(500) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @开始 datetime = TRY_CONVERT(datetime, NULLIF(@开始时间, N'')); + DECLARE @结束 datetime = TRY_CONVERT(datetime, NULLIF(@结束时间, N'')); + DECLARE @DID int; + DECLARE @旧开始 datetime; + DECLARE @旧结束 datetime; + + SELECT @DID = [DID], @旧开始 = [开始时间], @旧结束 = [结束时间] + FROM [dbo].[MES_设计报工_记录] + WHERE [RID] = @RID; + + IF @DID IS NULL + BEGIN + SELECT CAST(0 AS int) AS [result], N'报工记录不存在' AS [message]; + RETURN; + END + + IF @开始 IS NULL OR @结束 IS NULL OR @结束 <= @开始 + BEGIN + SELECT CAST(0 AS int) AS [result], N'开始时间和结束时间不合法' AS [message]; + RETURN; + END + + INSERT INTO [dbo].[MES_设计报工_校验记录] + ( + [RID], [DID], [校验前开始时间], [校验前结束时间], + [校验后开始时间], [校验后结束时间], [校验后工时秒数], + [校验人ID], [校验人], [校验时间], [校验备注] + ) + VALUES + ( + @RID, @DID, @旧开始, @旧结束, + @开始, @结束, DATEDIFF(second, @开始, @结束), + NULLIF(@校验人ID, N''), NULLIF(@校验人, N''), GETDATE(), NULLIF(@校验备注, N'') + ); + + UPDATE [dbo].[MES_设计报工_记录] + SET + [开始时间] = @开始, + [结束时间] = @结束, + [工时秒数] = DATEDIFF(second, @开始, @结束), + [报工状态] = N'已结束', + [已校验] = 1, + [校验人ID] = NULLIF(@校验人ID, N''), + [校验人] = NULLIF(@校验人, N''), + [校验时间] = GETDATE(), + [备注] = NULLIF(@校验备注, N'') + WHERE [RID] = @RID; + + UPDATE [dbo].[MES_设计报工_任务] + SET + [单据状态] = CASE + WHEN [单据状态] = N'已完成' THEN N'已完成' + WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) THEN N'执行中' + ELSE N'已结束' + END, + [最后编辑人] = NULLIF(@校验人, N''), + [最后编辑时间] = GETDATE() + WHERE [DID] = @DID; + + SELECT + CAST(1 AS int) AS [result], + N'校验成功' AS [message], + (SELECT [单据状态] FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID) AS [任务状态]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时校验_批量保存] + @RIDs nvarchar(max), + @校验人ID nvarchar(100) = N'', + @校验人 nvarchar(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @RID表 table([RID] int PRIMARY KEY); + DECLARE @DID表 table([DID] int PRIMARY KEY); + DECLARE @xml xml; + DECLARE @更新记录数 int; + + SET @xml = TRY_CONVERT(xml, N'' + REPLACE(ISNULL(@RIDs, N''), N',', N'') + N''); + + INSERT INTO @RID表([RID]) + SELECT DISTINCT TRY_CONVERT(int, T.c.value(N'.', N'nvarchar(30)')) + FROM @xml.nodes(N'/r/i') AS T(c) + WHERE TRY_CONVERT(int, T.c.value(N'.', N'nvarchar(30)')) IS NOT NULL; + + IF NOT EXISTS (SELECT 1 FROM @RID表) + BEGIN + SELECT CAST(0 AS int) AS [result], N'没有可校验记录' AS [message]; + RETURN; + END + + INSERT INTO @DID表([DID]) + SELECT DISTINCT r.[DID] + FROM [dbo].[MES_设计报工_记录] AS r + INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID] + WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL; + + INSERT INTO [dbo].[MES_设计报工_校验记录] + ( + [RID], [DID], [校验前开始时间], [校验前结束时间], + [校验后开始时间], [校验后结束时间], [校验后工时秒数], + [校验人ID], [校验人], [校验时间], [校验备注] + ) + SELECT + r.[RID], r.[DID], r.[开始时间], r.[结束时间], + r.[开始时间], r.[结束时间], r.[工时秒数], + NULLIF(@校验人ID, N''), NULLIF(@校验人, N''), GETDATE(), N'批量校验' + FROM [dbo].[MES_设计报工_记录] AS r + INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID] + WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL; + + UPDATE r + SET + [已校验] = 1, + [校验人ID] = NULLIF(@校验人ID, N''), + [校验人] = NULLIF(@校验人, N''), + [校验时间] = GETDATE() + FROM [dbo].[MES_设计报工_记录] AS r + INNER JOIN @RID表 AS ids ON r.[RID] = ids.[RID] + WHERE r.[开始时间] IS NOT NULL AND r.[结束时间] IS NOT NULL; + + SET @更新记录数 = @@ROWCOUNT; + + UPDATE t + SET + [单据状态] = CASE + WHEN t.[单据状态] = N'已完成' THEN N'已完成' + WHEN EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = t.[DID] AND [结束时间] IS NULL) THEN N'执行中' + ELSE N'已结束' + END, + [最后编辑人] = NULLIF(@校验人, N''), + [最后编辑时间] = GETDATE() + FROM [dbo].[MES_设计报工_任务] AS t + INNER JOIN @DID表 AS ids ON t.[DID] = ids.[DID]; + + SELECT CAST(1 AS int) AS [result], N'批量校验成功' AS [message], @更新记录数 AS [count]; +END +GO diff --git a/db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql b/db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql new file mode 100644 index 0000000..407b7bf --- /dev/null +++ b/db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql @@ -0,0 +1,178 @@ +USE [YL_MESDB]; +GO + +SET NOCOUNT ON; +SET XACT_ABORT ON; + +DECLARE @TargetAccount int = 1; +DECLARE @ResearchMenuId int; +DECLARE @PreferredResearchMenuId int = 9; + +BEGIN TRANSACTION; + +SELECT TOP (1) + @ResearchMenuId = [id] +FROM [dbo].[登录基础数据_二级菜单] WITH (UPDLOCK, HOLDLOCK) +WHERE [账号代码] = @TargetAccount + AND [pid] = 0 + AND + ( + [title] = N'研发管理' + OR [path] = '/ResearchManagement' + OR [name] = 'ResearchManagement' + ) +ORDER BY + CASE WHEN [title] = N'研发管理' THEN 0 ELSE 1 END, + [id]; + +IF @ResearchMenuId IS NULL +BEGIN + IF NOT EXISTS + ( + SELECT 1 + FROM [dbo].[登录基础数据_二级菜单] WITH (UPDLOCK, HOLDLOCK) + WHERE [账号代码] = @TargetAccount + AND [id] = @PreferredResearchMenuId + ) + BEGIN + SET @ResearchMenuId = @PreferredResearchMenuId; + END + ELSE + BEGIN + SELECT @ResearchMenuId = ISNULL(MAX([id]), 0) + 1 + FROM [dbo].[登录基础数据_二级菜单] WITH (UPDLOCK, HOLDLOCK) + WHERE [账号代码] = @TargetAccount; + END; + + INSERT INTO [dbo].[登录基础数据_二级菜单] + ([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [模块代码], [是否启用], [操作时间]) + VALUES + (@ResearchMenuId, 0, '/ResearchManagement', '/layout/Layout', NULL, 'ResearchManagement', N'研发管理', 'CreateProject', @TargetAccount, @ResearchMenuId, 1, GETDATE()); +END +ELSE +BEGIN + UPDATE [dbo].[登录基础数据_二级菜单] + SET + [pid] = 0, + [path] = '/ResearchManagement', + [componet] = '/layout/Layout', + [redirect] = NULL, + [name] = 'ResearchManagement', + [title] = N'研发管理', + [icon] = 'CreateProject', + [模块代码] = [id], + [是否启用] = 1, + [操作时间] = GETDATE() + WHERE [账号代码] = @TargetAccount + AND [id] = @ResearchMenuId; +END; + +DECLARE @Menus TABLE +( + rn int IDENTITY(1,1) PRIMARY KEY, + [path] varchar(100) NOT NULL, + [componet] varchar(100) NOT NULL, + [name] varchar(100) NOT NULL, + [title] varchar(100) NOT NULL, + [icon] varchar(100) NULL +); + +INSERT INTO @Menus ([path], [componet], [name], [title], [icon]) +VALUES + ('DesignReportTask/Task/index', '/ProductionManagement/DesignReportTask/Task/index', 'DesignReportTask', N'设计任务', 'DocumentImport'), + ('DesignReportTask/Report/index', '/ProductionManagement/DesignReportTask/Report/index', 'DesignReportWork', N'设计报工', 'DocumentImport'), + ('DesignReportTask/Check/index', '/ProductionManagement/DesignReportTask/Check/index', 'DesignReportCheck', N'设计工时校验', 'PayStateSearch'), + ('DesignReportTask/HoursReport/index', '/ProductionManagement/DesignReportTask/HoursReport/index', 'DesignReportHoursReport', N'设计工时报表', 'DimensionsSummaryReport'); + +DECLARE @BaseId int; + +SELECT @BaseId = ISNULL(MAX([id]), 0) +FROM [dbo].[登录基础数据_二级菜单] WITH (UPDLOCK, HOLDLOCK) +WHERE [账号代码] = @TargetAccount; + +;WITH MissingMenus AS +( + SELECT + ROW_NUMBER() OVER (ORDER BY m.rn) AS new_rn, + m.[path], + m.[componet], + m.[name], + m.[title], + m.[icon] + FROM @Menus AS m + WHERE NOT EXISTS + ( + SELECT 1 + FROM [dbo].[登录基础数据_二级菜单] AS existing WITH (UPDLOCK, HOLDLOCK) + WHERE existing.[账号代码] = @TargetAccount + AND + ( + existing.[path] = m.[path] + OR existing.[componet] = m.[componet] + OR existing.[title] = m.[title] + ) + ) +) +INSERT INTO [dbo].[登录基础数据_二级菜单] + ([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [模块代码], [是否启用], [操作时间]) +SELECT + @BaseId + new_rn, + @ResearchMenuId, + [path], + [componet], + NULL, + [name], + [title], + [icon], + @TargetAccount, + @BaseId + new_rn, + 1, + GETDATE() +FROM MissingMenus; + +UPDATE target +SET + target.[pid] = @ResearchMenuId, + target.[path] = source.[path], + target.[componet] = source.[componet], + target.[redirect] = NULL, + target.[name] = source.[name], + target.[title] = source.[title], + target.[icon] = source.[icon], + target.[模块代码] = target.[id], + target.[是否启用] = 1, + target.[操作时间] = GETDATE() +FROM [dbo].[登录基础数据_二级菜单] AS target +INNER JOIN @Menus AS source + ON target.[账号代码] = @TargetAccount + AND + ( + target.[path] = source.[path] + OR target.[componet] = source.[componet] + OR target.[title] = source.[title] + ); + +COMMIT TRANSACTION; + +SELECT + [id], + [pid], + [path], + [componet], + [name], + [title], + [icon], + [账号代码], + [模块代码], + [是否启用] +FROM [dbo].[登录基础数据_二级菜单] +WHERE [账号代码] = @TargetAccount + AND + ( + [id] = @ResearchMenuId + OR [path] IN (SELECT [path] FROM @Menus) + OR [componet] IN (SELECT [componet] FROM @Menus) + OR [title] IN (SELECT [title] FROM @Menus) + ) +ORDER BY [pid], [id]; +GO diff --git a/gptlog-process/gpdlog.md b/gptlog-process/gpdlog.md index c0f6b78..11ad015 100644 --- a/gptlog-process/gpdlog.md +++ b/gptlog-process/gpdlog.md @@ -2724,3 +2724,280 @@ pm run build:通过,仅有既有警告。 - 用户要求上传的当前工作区全部修改已提交并推送到远程分支。 - 首次推送成功的提交号为 `a6a92ff`。 - 推送后本地与远程分支一致,差异为 `0 0`。 + +## 2026-07-10 DesignReportTask 工时校验补结束后任务状态回写 + +### 用户提问 +- 用户反馈:`ProductionManagement/DesignReportTask/Check/index` 中,已经点击开始但没有结束的任务,在校验页点击“校验”并输入结束时间后可以校验完成,但任务状态没有改变,仍然是“执行中”。 + +### 执行过程 +1. 检查 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`,确认校验保存调用的是 `设计报工_工时校验_保存`。 +2. 检查完整建库脚本 `db_backups/create_design_report_task_module_20260630.sql`,确认 `设计报工_工时校验_保存` 原逻辑只更新 `MES_设计报工_记录`: + - 写入 `开始时间`、`结束时间`、`工时秒数`。 + - 将 `报工状态` 改为 `已结束`。 + - 将 `已校验` 改为 `1`。 + - 写入校验人、校验时间和备注。 +3. 确认原过程没有同步更新 `MES_设计报工_任务.[单据状态]`,这是校验页手工补结束时间后任务仍为“执行中”的原因。 +4. 检查 `Report/index.vue` 和需求文档,确认设计报工状态规则: + - “结束”后任务状态应为 `已结束`。 + - “完成”是单独动作,完成后任务状态才变为 `已完成`。 +5. 决定本次修复口径: + - 校验页手工补结束时间后,如果该 DID 已无未结束报工记录,则任务状态回写为 `已结束`。 + - 如果该 DID 仍有其他未结束报工记录,则任务状态保持 `执行中`。 + - 如果任务已经是 `已完成`,校验保存不回退任务状态。 +6. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`: + - 在校验表格中增加“任务状态”列,直接显示 `单据状态`。 + - 增加 `getStatusType` 方法,按 `已完成`、`执行中`、`已结束` 显示不同标签类型。 + - 单条校验成功后改为 `await this.searchTable()`,确保校验后刷新完成再结束流程。 + - 批量校验成功后也改为 `await this.searchTable()`。 +7. 修改 `db_backups/create_design_report_task_module_20260630.sql` 中 `设计报工_工时校验_保存`: + - 保存校验记录并更新报工记录后,新增任务状态回写逻辑。 + - 状态回写规则为:已完成保持已完成;仍有未结束记录则为执行中;否则为已结束。 + - 返回结果中增加 `任务状态` 字段,便于调用方确认状态。 +8. 修改 `db_backups/create_design_report_task_module_20260630.sql` 中 `设计报工_工时校验_批量保存`: + - 增加受影响 DID 集合。 + - 批量校验后按相同规则回写任务状态。 + - 将记录更新条数保存到变量,避免后续任务更新覆盖返回的 `count`。 +9. 新增增量脚本 `db_backups/fix_design_report_check_status_20260710.sql`: + - 用于直接发布现有数据库。 + - 重建 `设计报工_工时校验_保存` 和 `设计报工_工时校验_批量保存`。 +10. 将增量脚本发布到目标库 `192.168.2.92 / YL_MESDB`,日志中不记录数据库明文密码。 +11. 使用事务构造临时数据验证单条校验: + - 新建一个状态为 `执行中` 的临时任务和一条未结束报工记录。 + - 调用 `设计报工_工时校验_保存` 传入开始时间和结束时间。 + - 返回 `result=1`、`message=校验成功`、`任务状态=已结束`。 + - 查询确认任务状态为 `已结束`,报工记录状态为 `已结束`,`已校验=1`。 + - 回滚事务后确认测试任务残留数量为 `0`。 +12. 使用事务构造多人未结束场景验证: + - 新建一个状态为 `执行中` 的临时任务和两条未结束报工记录。 + - 只对其中一条记录调用 `设计报工_工时校验_保存` 补结束时间并校验。 + - 返回 `result=1`、`任务状态=执行中`。 + - 查询确认仍有 `1` 条未结束记录,任务状态保持 `执行中`。 + - 回滚事务后确认测试任务残留数量为 `0`。 +13. 批量校验测试第一次执行时报错: + - 错误为使用 XML 方法时 `QUOTED_IDENTIFIER` 设置不正确。 + - 原因是新增增量脚本未显式设置 `SET QUOTED_IDENTIFIER ON`。 +14. 检查完整建库脚本,确认完整脚本已有 `SET ANSI_NULLS ON` 和 `SET QUOTED_IDENTIFIER ON`。 +15. 修改 `db_backups/fix_design_report_check_status_20260710.sql`,在过程创建前补充: + - `SET ANSI_NULLS ON` + - `SET QUOTED_IDENTIFIER ON` +16. 重新发布增量脚本到目标库。 +17. 重新使用事务验证批量校验: + - 新建一个状态为 `执行中` 的临时任务和两条已有结束时间的报工记录。 + - 调用 `设计报工_工时校验_批量保存`。 + - 返回 `result=1`、`message=批量校验成功`、`count=2`。 + - 查询确认两条记录均已校验,任务状态变为 `已结束`。 + - 回滚事务后确认测试任务残留数量为 `0`。 +18. 第一次执行 `npm run build` 时 124 秒超时,没有得到构建结论。 +19. 使用更长超时时间重新执行 `npm run build`,构建通过。 +20. 构建输出仅有项目既有的大资源体积 warning,以及 Browserslist / baseline-browser-mapping 数据过期提示。 +21. 检查 Git 状态,确认构建未额外修改 `dist`,当前变更只包含本次源码、数据库脚本和本日志。 + +### 修改文件 +- `src/views/ProductionManagement/DesignReportTask/Check/index.vue` +- `db_backups/create_design_report_task_module_20260630.sql` +- `db_backups/fix_design_report_check_status_20260710.sql` +- `gptlog-process/gpdlog.md` + +### 结论 +- 设计工时校验页手工补结束时间并保存校验后,任务状态会按报工记录自动回写。 +- 单个任务所有报工记录都已有结束时间时,任务状态会从 `执行中` 改为 `已结束`。 +- 同一任务仍有其他未结束报工记录时,任务状态保持 `执行中`。 +- 已完成任务不会因为工时校验被回退状态。 +- 校验页现在直接显示“任务状态”,便于校验后确认状态变化。 + +### 验证结果 +- 单条补结束时间校验:通过,任务状态变为 `已结束`。 +- 多人仍有未结束记录:通过,任务状态保持 `执行中`。 +- 批量校验:通过,任务状态变为 `已结束`,返回 `count=2`。 +- 所有数据库验证均在事务中回滚,测试数据无残留。 +- `npm run build` 构建通过,仅有项目既有 warning。 + +## 2026-07-10 DesignReportTask 新建设计任务取消物料编码必填 + +### 用户提问 +- 用户要求修改 `ProductionManagement/DesignReportTask/Task/index`,新建设计任务时去掉“物料编码”必填规则。 + +### 执行过程 +1. 检查当前 Git 工作区,确认已有上一轮未提交的 `DesignReportTask` 校验状态回写相关改动和日志改动。 +2. 检查 `src/views/ProductionManagement/DesignReportTask/Task/index.vue`。 +3. 搜索 `物料编码`、`rules`、`新增`、`保存` 等关键字,定位到表单校验规则: + - 原规则中 `物料编码` 存在 `{ required: true, message: '请选择物料编码', trigger: 'change' }`。 + - `任务描述` 仍为必填。 +4. 检查 `db_backups/create_design_report_task_module_20260630.sql`,确认数据库表字段 `[物料编码]` 允许为空,新增过程 `设计报工_任务_新增` 也使用 `NULLIF(@物料编码, N'')`,后端没有强制物料编码必填。 +5. 使用 `apply_patch` 修改 `Task/index.vue`: + - 删除 `rules` 中的 `物料编码` 必填校验。 + - 保留 `任务描述` 必填校验。 +6. 复核 `Task/index.vue` 中 `rules` 片段,确认当前只剩: + - `任务描述: [{ required: true, message: '请输入任务描述', trigger: 'blur' }]` +7. 注意到 `Task/index.vue` 中还有本轮之前已经存在的未提交差异,例如“研发目的”布局和人员显示格式调整;本次未回退这些既有改动。 +8. 执行 `npm run build` 验证前端构建。 +9. 构建通过,仅有项目既有的大资源体积 warning,以及 Browserslist / baseline-browser-mapping 数据过期提示。 +10. 检查 Git 状态,确认构建未额外修改 `dist` 输出文件。 +11. 追加本条中文执行日志。 + +### 修改文件 +- `src/views/ProductionManagement/DesignReportTask/Task/index.vue` +- `gptlog-process/gpdlog.md` + +### 结论 +- 新建设计任务时,“物料编码”不再必填。 +- 保存时仍会按原逻辑传递 `物料编码`,为空时后端按空值处理。 +- “任务描述”必填规则保持不变。 + +### 验证结果 +- `Task/index.vue` 表单规则已不包含 `物料编码` 必填校验。 +- `npm run build` 构建通过,仅有项目既有 warning。 + +## 2026-07-10 DesignReportTask 移到研发管理主菜单 + +### 用户提问 +- 用户要求增加主菜单“研发管理”,并将 `DesignReportTask` 下四个页面都放到“研发管理”下面。 +- 用户说明:“研发管理”和“生产管理”平级,属于主菜单。 + +### 执行过程 +1. 检查当前 Git 工作区,确认已有前几轮未提交改动: + - `db_backups/create_design_report_task_module_20260630.sql` + - `gptlog-process/gpdlog.md` + - `src/views/ProductionManagement/DesignReportTask/Check/index.vue` + - `src/views/ProductionManagement/DesignReportTask/Task/index.vue` + - `db_backups/fix_design_report_check_status_20260710.sql` +2. 查询目标库 `192.168.2.92 / YL_MESDB` 的 `[dbo].[登录基础数据_二级菜单]`,日志中不记录数据库明文密码。 +3. 查询 `DesignReportTask` 当前菜单分布: + - 账号代码 `1` 下存在四个页面,均挂在 `pid=3` 的“生产管理”下。 + - 账号代码 `2010` 下只存在 `Task` 和 `Report` 两个页面,均挂在 `pid=3`。 +4. 查询主菜单,确认当前没有“研发管理”主菜单。 +5. 查询账号代码 `1` 的主菜单,确认: + - `id=3` 为“生产管理”。 + - 当前主菜单最大 id 为 `8`。 + - 账号代码 `1` 下 `id=9` 未被占用。 +6. 考虑到用户本轮未指定其他账号,且账号 `2010` 下并不具备四个 `DesignReportTask` 页面,本次按前序操作口径处理账号代码 `1`,避免无意给其他账号新增页面权限。 +7. 检查前端动态路由逻辑: + - `src/router/getTreeData.js` 按 `pid` 构造菜单树。 + - 主菜单使用 `path` 和 `/layout/Layout` 作为布局路由。 + - 子菜单使用原有 `componet=/ProductionManagement/DesignReportTask/...` 加载真实页面组件。 +8. 新增数据库增量脚本 `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql`: + - 若账号 `1` 下不存在“研发管理”,则插入主菜单: + - `id=9` + - `pid=0` + - `path=/ResearchManagement` + - `componet=/layout/Layout` + - `name=ResearchManagement` + - `title=研发管理` + - `icon=CreateProject` + - `账号代码=1` + - `模块代码=9` + - `是否启用=1` + - 若“研发管理”已存在,则更新为上述主菜单配置并启用。 + - 定义 `DesignReportTask` 四个子菜单: + - `DesignReportTask/Task/index`:设计任务 + - `DesignReportTask/Report/index`:设计报工 + - `DesignReportTask/Check/index`:设计工时校验 + - `DesignReportTask/HoursReport/index`:设计工时报表 + - 如果四个子菜单缺失则补录;如果已存在则移动到“研发管理”下并启用。 + - 子菜单 `componet` 保持 `/ProductionManagement/DesignReportTask/...` 不变,避免影响页面组件加载路径。 +9. 执行 `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql` 发布到目标库。 +10. 发布结果返回: + - `id=9`,`pid=0`,`title=研发管理`。 + - `id=248`,`pid=9`,`title=设计任务`。 + - `id=249`,`pid=9`,`title=设计报工`。 + - `id=250`,`pid=9`,`title=设计工时校验`。 + - `id=251`,`pid=9`,`title=设计工时报表`。 +11. 再次查询账号代码 `1` 的主菜单,确认“研发管理”已与“生产管理”同级,均为 `pid=0`。 +12. 再次查询账号代码 `1` 的 `DesignReportTask` 四个页面,确认四条均为 `pid=9`。 +13. 查询账号代码 `1` 下 `pid=3` 的 `DesignReportTask` 数量,结果为 `0`,确认生产管理下已无设计报工页面残留。 +14. 本次不修改前端页面代码;动态菜单通过数据库菜单表生效。 + +### 修改文件 +- `db_backups/move_design_report_task_to_rd_menu_account1_20260710.sql` +- `gptlog-process/gpdlog.md` + +### 结论 +- 账号代码 `1` 已新增“研发管理”主菜单。 +- “研发管理”与“生产管理”平级,均为主菜单,`研发管理.id=9`,`pid=0`。 +- 账号代码 `1` 的 `DesignReportTask` 四个页面已全部移动到“研发管理”下。 +- 生产管理下不再包含账号代码 `1` 的 `DesignReportTask` 页面。 + +### 验证结果 +- `研发管理`:`id=9`,`pid=0`,`path=/ResearchManagement`,`componet=/layout/Layout`,`是否启用=1`。 +- `设计任务`:`id=248`,`pid=9`,`是否启用=1`。 +- `设计报工`:`id=249`,`pid=9`,`是否启用=1`。 +- `设计工时校验`:`id=250`,`pid=9`,`是否启用=1`。 +- `设计工时报表`:`id=251`,`pid=9`,`是否启用=1`。 +- 账号代码 `1` 下生产管理 `pid=3` 的 `DesignReportTask` 页面数量为 `0`。 + +## 2026-07-10 设计报工结束弹框增加进度说明 + +### 用户提问 +- 用户要求修改 `ResearchManagement/DesignReportTask/Report/index`。 +- 点击“结束”时先弹框,弹框显示: + - id 号 + - 物料名称 + - 物料编码 + - 任务描述 + - 新增字段“进度说明” +- 点击弹框里的“确认”后,才执行结束报工。 + +### 执行过程 +1. 根据当前菜单配置确认:虽然菜单已经挂到“研发管理”,真实前端组件仍使用原路径 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`,因此本次修改该组件。 +2. 检查 `Report/index.vue` 现有逻辑: + - “结束”按钮原来直接调用 `endTask(row)`。 + - `endTask(row)` 会先查询最新任务状态和当前操作人未结束报工记录。 + - 校验通过后直接调用存储过程 `设计报工_任务_结束`。 +3. 查询目标库 `192.168.2.92 / YL_MESDB` 的表结构和存储过程定义,日志中不记录数据库明文密码。 +4. 确认 `[dbo].[MES_设计报工_记录]` 原来没有 `[进度说明]` 字段,存储过程 `[dbo].[设计报工_任务_结束]` 原来没有 `@进度说明` 参数。 +5. 采用持久化方案:结束报工弹框录入的“进度说明”写入报工记录表,并在查询和工时报表中返回该字段。 +6. 修改 `src/views/ProductionManagement/DesignReportTask/Report/index.vue`: + - 新增“结束报工”弹框。 + - 弹框内展示 `DID`、`物料编码`、`物料名称`、`任务描述`。 + - 新增可编辑字段 `进度说明`,最大长度 500。 + - 点击列表“结束”时只打开弹框,不立即结束。 + - 点击弹框“确认”后才调用 `设计报工_任务_结束`。 + - 调用结束存储过程时传入 `进度说明`。 + - 调整 `runAction()`,使其成功返回 `true`、失败返回 `false`,便于确认后关闭弹框。 +7. 修改 `src/views/ProductionManagement/DesignReportTask/Check/index.vue`: + - 在报工记录列表增加 `进度说明` 列,便于校验页面查看结束说明。 +8. 修改 `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue`: + - 在工时报表中增加 `进度说明` 列。 +9. 修改初始化脚本 `db_backups/create_design_report_task_module_20260630.sql`: + - `MES_设计报工_记录` 增加 `[进度说明] nvarchar(500) NULL`。 + - 增加字段补齐脚本,字段不存在时自动添加。 + - 重建 `设计报工_任务_结束`,增加 `@进度说明` 参数并写入记录表。 + - 重建 `设计报工_记录_查询`,返回 `进度说明`。 + - 重建 `设计报工_工时报表_作业者工时_查询`,返回 `进度说明`。 +10. 新增数据库增量脚本 `db_backups/add_design_report_progress_note_20260710.sql`: + - 补齐 `[进度说明]` 字段。 + - 重建 `设计报工_任务_结束`。 + - 重建 `设计报工_记录_查询`。 + - 重建 `设计报工_工时报表_作业者工时_查询`。 +11. 执行增量脚本发布到目标库 `192.168.2.92 / YL_MESDB`,执行成功。 +12. 使用数据库事务做验证,验证后回滚测试数据: + - 临时插入一条设计任务。 + - 临时插入一条当前用户未结束报工记录。 + - 执行 `设计报工_任务_结束` 并传入 `进度说明`。 + - 返回 `1, 结束成功`。 + - 查询确认任务状态变为 `已结束`。 + - 查询确认报工记录状态变为 `已结束`,结束时间已写入,`进度说明` 已保存。 + - 查询确认 `设计报工_记录_查询` 可以返回 `进度说明`。 + - 查询确认 `设计报工_工时报表_作业者工时_查询` 可以返回 `进度说明`。 + - 回滚事务后确认测试任务无残留。 +13. 执行 `npm run build`,构建通过。 + +### 修改文件 +- `src/views/ProductionManagement/DesignReportTask/Report/index.vue` +- `src/views/ProductionManagement/DesignReportTask/Check/index.vue` +- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue` +- `db_backups/create_design_report_task_module_20260630.sql` +- `db_backups/add_design_report_progress_note_20260710.sql` +- `gptlog-process/gpdlog.md` + +### 结论 +- 设计报工点击“结束”后会先弹出确认窗口。 +- 弹框显示 id 号、物料编码、物料名称、任务描述,并支持填写“进度说明”。 +- 只有点击弹框“确认”后才会真正执行结束报工。 +- “进度说明”已落库到报工记录,并在校验页面和工时报表中展示。 + +### 验证结果 +- 数据库增量脚本已发布到 `192.168.2.92 / YL_MESDB`。 +- 数据库事务验证通过,测试数据已回滚。 +- `npm run build` 构建通过,仅有项目既有体积和 Browserslist 数据过期 warning。 diff --git a/src/views/ProductionManagement/DesignReportTask/Check/index.vue b/src/views/ProductionManagement/DesignReportTask/Check/index.vue index 2b73490..92f08a9 100644 --- a/src/views/ProductionManagement/DesignReportTask/Check/index.vue +++ b/src/views/ProductionManagement/DesignReportTask/Check/index.vue @@ -71,6 +71,11 @@ + + + @@ -123,10 +160,18 @@ export default { return { loading: false, actionLoading: false, + endDialogVisible: false, tableData: [], projectOptions: [], materialOptions: [], parentMaterialOptions: [], + endForm: { + DID: '', + 物料编码: '', + 物料名称: '', + 任务描述: '', + 进度说明: '' + }, searchForm: { did: '', projectNo: '', @@ -241,12 +286,35 @@ export default { ['操作人', this.currentUserName()] ], '开始成功') }, - endTask(row) { - this.runAction('设计报工_任务_结束', [ - ['DID', row.DID], + async endTask(row) { + const latest = await this.getLatestTask(row.DID) + if (!latest) return + Object.assign(row, latest) + if (Number(latest.当前用户未结束报工数 || 0) <= 0) { + this.$message.warning('当前人员没有未结束的报工记录') + this.searchTable() + return + } + this.endForm = { + DID: latest.DID, + 物料编码: latest.物料编码 || '', + 物料名称: latest.物料名称 || '', + 任务描述: latest.任务描述 || '', + 进度说明: '' + } + this.endDialogVisible = true + }, + async confirmEndTask() { + if (!this.endForm.DID) return + const success = await this.runAction('设计报工_任务_结束', [ + ['DID', this.endForm.DID], ['操作人ID', this.currentUserId()], - ['操作人', this.currentUserName()] + ['操作人', this.currentUserName()], + ['进度说明', this.endForm.进度说明 || ''] ], '结束成功') + if (success) { + this.endDialogVisible = false + } }, async completeTask(row) { const latest = await this.getLatestTask(row.DID) @@ -317,12 +385,15 @@ export default { if (String(result.result) === '1') { this.$message.success(result.message || defaultMessage) this.searchTable() + return true } else { this.$message.error(result.message || '操作失败') + return false } } catch (error) { console.error(`${procedure}失败:`, error) this.$message.error('操作失败') + return false } finally { this.actionLoading = false } diff --git a/src/views/ProductionManagement/DesignReportTask/Task/index.vue b/src/views/ProductionManagement/DesignReportTask/Task/index.vue index 551d034..f7ea6e1 100644 --- a/src/views/ProductionManagement/DesignReportTask/Task/index.vue +++ b/src/views/ProductionManagement/DesignReportTask/Task/index.vue @@ -255,9 +255,9 @@ - + - + @@ -340,7 +340,6 @@ export default { }, formData: this.getEmptyForm(), rules: { - 物料编码: [{ required: true, message: '请选择物料编码', trigger: 'change' }], 任务描述: [{ required: true, message: '请输入任务描述', trigger: 'blur' }] } } @@ -615,7 +614,7 @@ export default { return item.项目名称 ? `${item.项目号} | ${item.项目名称}` : item.项目号 }, formatPersonLabel(item) { - return item.账号 ? `${item.人员姓名} | ${item.账号}` : item.人员姓名 + return item.账号 ? `${item.人员姓名}` : item.人员姓名 }, getResult(response) { const data = response && response.data