diff --git a/db_backups/create_design_report_task_module_20260630.sql b/db_backups/create_design_report_task_module_20260630.sql new file mode 100644 index 0000000..9ee75c8 --- /dev/null +++ b/db_backups/create_design_report_task_module_20260630.sql @@ -0,0 +1,773 @@ +/* + 设计报工任务模块 + 说明: + 1. 新建独立设计报工表和独立存储过程。 + 2. 不写入现有生产报工表。 + 3. 不上传 SAP。 + 4. 不新增菜单权限,不写入菜单表和角色权限表。 +*/ + +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_设计报工_任务] + ( + [DID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, + [项目号] nvarchar(100) NULL, + [物料编码] nvarchar(100) NULL, + [物料名称] nvarchar(200) NULL, + [图号] nvarchar(100) NULL, + [任务描述] nvarchar(500) NULL, + [关联父件物料编码] nvarchar(100) NULL, + [关联父件物料名称] nvarchar(200) NULL, + [设计要求] nvarchar(max) NULL, + [研发立项号] nvarchar(100) NULL, + [研发目的] nvarchar(500) NULL, + [指派对象ID] nvarchar(1000) NULL, + [指派对象] nvarchar(1000) NULL, + [预计开始时间] datetime NULL, + [预计结束时间] datetime NULL, + [单据状态] nvarchar(50) NOT NULL CONSTRAINT [DF_MES_设计报工_任务_单据状态] DEFAULT (N'待开始'), + [创建日期] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_任务_创建日期] DEFAULT (GETDATE()), + [创建人] nvarchar(100) NULL, + [最后编辑人] nvarchar(100) NULL, + [最后编辑时间] datetime NULL, + [备注] nvarchar(500) NULL + ); +END +GO + +IF OBJECT_ID(N'[dbo].[MES_设计报工_记录]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[MES_设计报工_记录] + ( + [RID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, + [DID] int NOT NULL, + [操作人ID] nvarchar(100) NULL, + [操作人] nvarchar(100) NULL, + [开始时间] datetime NULL, + [结束时间] datetime NULL, + [工时秒数] int NULL, + [报工状态] nvarchar(50) NOT NULL CONSTRAINT [DF_MES_设计报工_记录_报工状态] DEFAULT (N'执行中'), + [已校验] bit NOT NULL CONSTRAINT [DF_MES_设计报工_记录_已校验] DEFAULT (0), + [校验人ID] nvarchar(100) NULL, + [校验人] nvarchar(100) NULL, + [校验时间] datetime NULL, + [创建时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_记录_创建时间] DEFAULT (GETDATE()), + [备注] nvarchar(500) NULL, + CONSTRAINT [FK_MES_设计报工_记录_任务] FOREIGN KEY ([DID]) REFERENCES [dbo].[MES_设计报工_任务]([DID]) + ); +END +GO + +IF OBJECT_ID(N'[dbo].[MES_设计报工_校验记录]', N'U') IS NULL +BEGIN + CREATE TABLE [dbo].[MES_设计报工_校验记录] + ( + [VID] int IDENTITY(1,1) NOT NULL PRIMARY KEY, + [RID] int NOT NULL, + [DID] int NOT NULL, + [校验前开始时间] datetime NULL, + [校验前结束时间] datetime NULL, + [校验后开始时间] datetime NULL, + [校验后结束时间] datetime NULL, + [校验后工时秒数] int NULL, + [校验人ID] nvarchar(100) NULL, + [校验人] nvarchar(100) NULL, + [校验时间] datetime NOT NULL CONSTRAINT [DF_MES_设计报工_校验记录_校验时间] DEFAULT (GETDATE()), + [校验备注] nvarchar(500) NULL + ); +END +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_MES_设计报工_任务_查询' AND object_id = OBJECT_ID(N'[dbo].[MES_设计报工_任务]')) + CREATE INDEX [IX_MES_设计报工_任务_查询] ON [dbo].[MES_设计报工_任务]([单据状态], [项目号], [物料编码], [预计开始时间], [预计结束时间]); +GO + +IF NOT EXISTS (SELECT 1 FROM sys.indexes WHERE name = N'IX_MES_设计报工_记录_DID' AND object_id = OBJECT_ID(N'[dbo].[MES_设计报工_记录]')) + CREATE INDEX [IX_MES_设计报工_记录_DID] ON [dbo].[MES_设计报工_记录]([DID], [开始时间], [结束时间], [已校验]); +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_物料查询] + @过滤 nvarchar(200) = N'' +AS +BEGIN + SET NOCOUNT ON; + + SELECT TOP 100 + CAST([物料编码] AS nvarchar(100)) AS [物料编码], + ISNULL( + NULLIF(CAST([物料名称] AS nvarchar(200)), N''), + CAST([物料描述] AS nvarchar(200)) + ) AS [物料名称], + CAST([物料描述] AS nvarchar(500)) AS [物料描述], + CAST([规格型号] AS nvarchar(200)) AS [规格型号], + CAST([自制件属性] AS nvarchar(100)) AS [自制件属性] + FROM [SAP].[SBO_YL].[dbo].[UBT_OITM] + WHERE + ISNULL(@过滤, N'') = N'' + OR CAST([物料编码] AS nvarchar(100)) LIKE N'%' + @过滤 + N'%' + OR CAST([物料名称] AS nvarchar(200)) LIKE N'%' + @过滤 + N'%' + OR CAST([物料描述] AS nvarchar(500)) LIKE N'%' + @过滤 + N'%' + ORDER BY CAST([物料编码] AS nvarchar(100)); +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_人员查询] + @过滤 nvarchar(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @人员 table + ( + [人员编号] int NULL, + [人员姓名] nvarchar(100) NULL, + [账号] nvarchar(100) NULL, + [角色] nvarchar(100) NULL, + [部门名称] nvarchar(100) NULL + ); + + INSERT INTO @人员 + EXEC [dbo].[系统管理_人员管理_所有有效人员查询]; + + SELECT TOP 200 + CAST([人员编号] AS nvarchar(50)) AS [人员编号], + [人员姓名], + [账号], + [角色], + [部门名称] + FROM @人员 + WHERE + ISNULL(@过滤, N'') = N'' + OR CAST([人员编号] AS nvarchar(50)) LIKE N'%' + @过滤 + N'%' + OR [人员姓名] LIKE N'%' + @过滤 + N'%' + OR [账号] LIKE N'%' + @过滤 + N'%' + ORDER BY [人员姓名]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_项目查询] + @过滤 nvarchar(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + SELECT DISTINCT TOP 100 + [项目号] + FROM [dbo].[MES_设计报工_任务] + WHERE + ISNULL([项目号], N'') <> N'' + AND (ISNULL(@过滤, N'') = N'' OR [项目号] LIKE N'%' + @过滤 + N'%') + ORDER BY [项目号]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_查询] + @DID int = NULL, + @项目号 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'' +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.[指派对象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 [未结束报工数], + CONVERT(varchar(19), r.[最后开始时间], 120) AS [最后开始时间], + CONVERT(varchar(19), r.[最后结束时间], 120) AS [最后结束时间] + FROM [dbo].[MES_设计报工_任务] AS t + OUTER APPLY + ( + SELECT + COUNT(1) AS [报工次数], + SUM(CASE WHEN rr.[结束时间] IS NULL THEN 1 ELSE 0 END) AS [未结束报工数], + MAX(rr.[开始时间]) AS [最后开始时间], + MAX(rr.[结束时间]) AS [最后结束时间] + FROM [dbo].[MES_设计报工_记录] AS rr + WHERE rr.[DID] = t.[DID] + ) AS r + 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 @单据状态 = 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)) + 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(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'' +AS +BEGIN + SET NOCOUNT ON; + + INSERT INTO [dbo].[MES_设计报工_任务] + ( + [项目号], [物料编码], [物料名称], [图号], [任务描述], + [关联父件物料编码], [关联父件物料名称], [设计要求], + [研发立项号], [研发目的], [指派对象ID], [指派对象], + [预计开始时间], [预计结束时间], [单据状态], + [创建人], [最后编辑人], [最后编辑时间], [备注] + ) + VALUES + ( + 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''), + 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(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'' +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''), + [指派对象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 +AS +BEGIN + SET NOCOUNT ON; + + IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID) + BEGIN + SELECT CAST(0 AS int) AS [result], N'该任务已有设计报工记录,不能删除' AS [message]; + RETURN; + END + + DELETE FROM [dbo].[MES_设计报工_任务] + 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; + + IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_任务] WHERE [DID] = @DID) + BEGIN + SELECT CAST(0 AS int) AS [result], N'任务不存在' AS [message]; + RETURN; + END + + 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 EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) + 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''), GETDATE(), N'执行中'); + + UPDATE [dbo].[MES_设计报工_任务] + SET [单据状态] = N'执行中', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE() + WHERE [DID] = @DID; + + SELECT CAST(1 AS int) AS [result], N'开始成功' AS [message], SCOPE_IDENTITY() AS [RID]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_结束] + @DID int, + @操作人ID nvarchar(100) = N'', + @操作人 nvarchar(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @RID int; + SELECT TOP 1 @RID = [RID] + FROM [dbo].[MES_设计报工_记录] + WHERE [DID] = @DID AND [结束时间] IS NULL + ORDER BY [开始时间] DESC, [RID] DESC; + + IF @RID IS NULL + BEGIN + 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 [单据状态] = N'已结束', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE() + WHERE [DID] = @DID AND [单据状态] <> N'已完成'; + + SELECT CAST(1 AS int) AS [result], N'结束成功' AS [message], @RID AS [RID]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_任务_完成] + @DID int, + @操作人 nvarchar(100) = 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 + + IF EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NULL) + BEGIN + SELECT CAST(0 AS int) AS [result], N'任务存在未结束报工,不能完成' AS [message]; + RETURN; + END + + IF NOT EXISTS (SELECT 1 FROM [dbo].[MES_设计报工_记录] WHERE [DID] = @DID AND [结束时间] IS NOT NULL) + BEGIN + SELECT CAST(0 AS int) AS [result], N'任务未产生已结束报工,不能完成' AS [message]; + RETURN; + END + + UPDATE [dbo].[MES_设计报工_任务] + SET [单据状态] = N'已完成', [最后编辑人] = NULLIF(@操作人, N''), [最后编辑时间] = GETDATE() + WHERE [DID] = @DID; + + SELECT CAST(1 AS int) AS [result], N'完成成功' AS [message]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_记录_查询] + @DID int = NULL, + @项目号 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.[指派对象], + 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.[备注], + 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 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].[设计报工_工时校验_查询] + @DID int = NULL, + @项目号 nvarchar(100) = N'', + @物料编码 nvarchar(100) = N'', + @操作人 nvarchar(100) = N'', + @开始日期 nvarchar(30) = N'', + @结束日期 nvarchar(30) = N'', + @校验状态 nvarchar(50) = N'未校验' +AS +BEGIN + SET NOCOUNT ON; + + EXEC [dbo].[设计报工_记录_查询] + @DID = @DID, + @项目号 = @项目号, + @物料编码 = @物料编码, + @操作人 = @操作人, + @开始日期 = @开始日期, + @结束日期 = @结束日期, + @校验状态 = @校验状态; +END +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; + + SELECT CAST(1 AS int) AS [result], N'校验成功' AS [message]; +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 @xml xml; + + 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 [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; + + SELECT CAST(1 AS int) AS [result], N'批量校验成功' AS [message], @@ROWCOUNT AS [count]; +END +GO + +CREATE OR ALTER PROCEDURE [dbo].[设计报工_工时报表_作业者工时_查询] + @开始日期 nvarchar(30) = N'', + @结束日期 nvarchar(30) = 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.[任务描述], + r.[开始时间], + r.[结束时间], + ISNULL(r.[工时秒数], 0) AS [工时秒数], + 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 (@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(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 [备注] + 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(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 [备注] + 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 [任务描述], + 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 [备注] + FROM base + ) + SELECT * + FROM result + ORDER BY [操作人], [工作日期], [Level], [RID]; +END +GO diff --git a/db_backups/exclude_unfinished_assembly_orders_from_close_query_20260707.sql b/db_backups/exclude_unfinished_assembly_orders_from_close_query_20260707.sql new file mode 100644 index 0000000..36ca409 --- /dev/null +++ b/db_backups/exclude_unfinished_assembly_orders_from_close_query_20260707.sql @@ -0,0 +1,210 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[计划排产_生产订单关闭_查询全部订单] + @订单号 nvarchar(100) = N'', + @单据状态 nvarchar(100) = N'', -- 可选值:'已关闭'、'未关闭'、'可关闭' + @属性 nvarchar(100) = N'' +AS +BEGIN + SET NOCOUNT ON; + + IF (@单据状态 = N'可关闭') + BEGIN + CREATE TABLE #工时订单 + ( + 订单号 nvarchar(100) NOT NULL PRIMARY KEY + ); + + INSERT INTO #工时订单 (订单号) + SELECT DISTINCT CONVERT(nvarchar(100), 订单号) + FROM dbo.View_生产工时视图 + WHERE 订单号 IS NOT NULL; + + ;WITH 未结束装配订单 AS + ( + SELECT + CONVERT(nvarchar(100), t.订单编号) AS 订单编号 + FROM dbo.YL_加工中心_操作记录表 AS t + WHERE t.操作类别 = N'开始加工' + AND t.结束时间 IS NULL + AND t.工位名称 LIKE N'%装配%' + AND t.操作数值 IS NOT NULL + GROUP BY CONVERT(nvarchar(100), t.订单编号) + ), + 收检数量 AS + ( + SELECT + 计划号, + SUM(ISNULL(合格数, 0)) AS 合格数合计, + SUM(ISNULL(不合格数, 0)) AS 不合格数合计 + FROM dbo.YL_质量检验_质检记录 + WHERE 质检类型 = N'收检' + GROUP BY 计划号 + ), + 终检数量 AS + ( + SELECT + 计划号, + SUM(ISNULL(合格数, 0)) AS 终检合格数合计, + SUM(ISNULL(不合格数, 0)) AS 终检不合格数合计 + FROM dbo.YL_质量检验_质检记录 + WHERE 质检类型 = N'终检' + GROUP BY 计划号 + ), + 可关闭订单 AS + ( + SELECT + v.订单号 AS 订单编号, + MAX(v.产品名称) AS 产品名称, + MAX(v.产品编码) AS 产品编码, + MAX(v.入库数量) AS 入库数量, + MAX(v.订单合同号) AS 合同号, + MAX(终检数量.终检不合格数合计) AS 终检不合格数合计, + MAX(终检数量.终检合格数合计) AS 终检合格数合计, + MAX(v.计划数量) AS 计划数量, + MAX(v.确认状态) AS 确认状态, + MAX(v.单据状态) AS 单据状态, + MAX(收检数量.不合格数合计) AS 不合格数合计, + MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) AS 是否全部校验 + FROM dbo.View_生产工时视图 AS v + LEFT JOIN 收检数量 ON v.订单号 = 收检数量.计划号 + LEFT JOIN 终检数量 ON v.订单号 = 终检数量.计划号 + WHERE v.单据状态 IS NULL + AND (@订单号 = N'' OR v.订单号 = @订单号) + AND ( + @属性 NOT IN (N'机加', N'装配') + OR (@属性 = N'机加' AND v.自制件属性 = N'机加件') + OR (@属性 = N'装配' AND v.自制件属性 LIKE N'%装配%') + ) + GROUP BY v.订单号 + HAVING + MIN(CASE WHEN v.Expr1 IS NULL THEN 0 ELSE 1 END) = 1 + AND ( + MAX(终检数量.终检合格数合计) + MAX(收检数量.不合格数合计) = MAX(v.计划数量) + OR MAX(v.计划数量) = MAX(v.入库数量) + OR MAX(收检数量.不合格数合计) = MAX(v.计划数量) + ) + AND MAX(ISNULL(v.入库数量, 0)) = MAX(ISNULL(终检数量.终检合格数合计, 0)) + + UNION ALL + + SELECT + CONVERT(nvarchar(100), p.订单编号) AS 订单编号, + MAX(p.物料描述) AS 产品名称, + MAX(p.物料编号) AS 产品编码, + MAX(p.入库数量) AS 入库数量, + MAX(p.合同号) AS 合同号, + MAX(终检数量.终检不合格数合计) AS 终检不合格数合计, + MAX(终检数量.终检合格数合计) AS 终检合格数合计, + MAX(p.计划数量) AS 计划数量, + MAX(p.确认状态) AS 确认状态, + MAX(p.单据状态) AS 单据状态, + MAX(收检数量.不合格数合计) AS 不合格数合计, + 1 AS 是否全部校验 + FROM dbo.MES_接口_生产计划 AS p + LEFT JOIN 收检数量 ON CONVERT(nvarchar(100), p.订单编号) = CONVERT(nvarchar(100), 收检数量.计划号) + LEFT JOIN 终检数量 ON CONVERT(nvarchar(100), p.订单编号) = CONVERT(nvarchar(100), 终检数量.计划号) + LEFT JOIN #工时订单 AS wh ON wh.订单号 = CONVERT(nvarchar(100), p.订单编号) + WHERE p.单据状态 IS NULL + AND wh.订单号 IS NULL + AND (@订单号 = N'' OR CONVERT(nvarchar(100), p.订单编号) = @订单号) + AND ( + @属性 NOT IN (N'机加', N'装配') + OR (@属性 = N'机加' AND p.自制件属性 = N'机加件') + OR (@属性 = N'装配' AND p.自制件属性 LIKE N'%装配%') + ) + GROUP BY p.订单编号 + HAVING + ( + MAX(终检数量.终检合格数合计) + MAX(收检数量.不合格数合计) = MAX(p.计划数量) + OR MAX(p.计划数量) = MAX(p.入库数量) + OR MAX(收检数量.不合格数合计) = MAX(p.计划数量) + ) + AND MAX(ISNULL(p.入库数量, 0)) = MAX(ISNULL(终检数量.终检合格数合计, 0)) + ) + SELECT + c.订单编号, + c.产品名称, + c.产品编码, + c.入库数量, + c.合同号, + c.终检不合格数合计, + c.终检合格数合计, + c.计划数量, + c.确认状态, + c.单据状态, + c.不合格数合计, + c.是否全部校验 + FROM 可关闭订单 AS c + WHERE NOT EXISTS + ( + SELECT 1 + FROM 未结束装配订单 AS u + WHERE u.订单编号 = CONVERT(nvarchar(100), c.订单编号) + ) + ORDER BY c.订单编号; + + RETURN; + END + + ;WITH 未结束装配订单 AS + ( + SELECT + CONVERT(nvarchar(100), t.订单编号) AS 订单编号 + FROM dbo.YL_加工中心_操作记录表 AS t + WHERE t.操作类别 = N'开始加工' + AND t.结束时间 IS NULL + AND t.工位名称 LIKE N'%装配%' + AND t.操作数值 IS NOT NULL + GROUP BY CONVERT(nvarchar(100), t.订单编号) + ) + SELECT TOP 100 + v.订单编号, + MAX(v.物料描述) AS 产品名称, + MAX(v.物料编号) AS 产品编码, + MAX(v.入库数量) AS 入库数量, + MAX(v.合同号) AS 合同号, + MAX(zj_终检数量.终检不合格数合计) AS 终检不合格数合计, + MAX(zj_终检数量.终检合格数合计) AS 终检合格数合计, + MAX(v.计划数量) AS 计划数量, + MAX(v.确认状态) AS 确认状态, + MAX(v.单据状态) AS 单据状态 + FROM dbo.MES_接口_生产计划 AS v + LEFT JOIN + ( + SELECT + 计划号, + SUM(ISNULL(合格数, 0)) AS 终检合格数合计, + SUM(ISNULL(不合格数, 0)) AS 终检不合格数合计 + FROM dbo.YL_质量检验_质检记录 + WHERE 质检类型 = N'终检' + GROUP BY 计划号 + ) AS zj_终检数量 ON v.订单编号 = zj_终检数量.计划号 + WHERE 1 = 1 + AND (@订单号 = N'' OR CONVERT(nvarchar(100), v.订单编号) = @订单号) + AND NOT EXISTS + ( + SELECT 1 + FROM 未结束装配订单 AS u + WHERE u.订单编号 = CONVERT(nvarchar(100), v.订单编号) + ) + AND ( + @单据状态 NOT IN (N'SAP未关闭', N'已关闭', N'未关闭') + OR (@单据状态 = N'SAP未关闭' AND v.单据状态 = N'已关闭') + OR (@单据状态 = N'已关闭' AND (v.单据状态 = N'已关闭' OR v.单据状态 = N'已取消')) + OR (@单据状态 = N'未关闭' AND v.单据状态 IS NULL) + ) + AND ( + @属性 NOT IN (N'机加', N'装配') + OR (@属性 = N'机加' AND v.自制件属性 = N'机加件') + OR (@属性 = N'装配' AND v.自制件属性 LIKE N'%装配%') + ) + GROUP BY v.订单编号; +END +GO diff --git a/db_backups/fix_settlement_workhours_query_restore_workhour_rows_20260707.sql b/db_backups/fix_settlement_workhours_query_restore_workhour_rows_20260707.sql new file mode 100644 index 0000000..dc13ee7 --- /dev/null +++ b/db_backups/fix_settlement_workhours_query_restore_workhour_rows_20260707.sql @@ -0,0 +1,280 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +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; + + 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.订单编号 AS 订单号, + q.订单行号, + q.物料编码 AS 产品编码, + q.物料名称 AS 产品名称, + q.工序名称, + COALESCE(NULLIF(q.指派对象, N''), v.工位名称) AS 工位名称, + 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 @开始日期 = N'' OR v.开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = N'' 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) / 60.0 / 60.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.订单号, + 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 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 + 1 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') AS taskDescription, + CAST(0 AS INT) AS productionOrderNo, + N'' AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + N'' AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount, + CAST(0 AS INT) AS 工序顺序 + FROM 物料汇总 + + UNION ALL + + SELECT + 2 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') + + CASE WHEN NULLIF(ISNULL(工序名称, N''), N'') IS NULL THEN N'' ELSE N' ' + 工序名称 END + + CASE WHEN 工序顺序 IS NULL THEN N'' ELSE N' 序' + CAST(工序顺序 AS VARCHAR(20)) END AS taskDescription, + 订单号 AS productionOrderNo, + ISNULL(工位名称, N'') AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + ISNULL(操作人, N'') AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount, + 工序顺序 + FROM 订单工位汇总 + + ORDER BY productionOrderNo, 工序顺序, materialCode, [Level], station; +END +GO diff --git a/db_backups/optimize_settlement_workhours_query_20260707.sql b/db_backups/optimize_settlement_workhours_query_20260707.sql new file mode 100644 index 0000000..b6a6471 --- /dev/null +++ b/db_backups/optimize_settlement_workhours_query_20260707.sql @@ -0,0 +1,378 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +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; + + DECLARE @TopCount INT = CASE WHEN ISNULL(@数据条数, 0) <= 0 THEN 100 ELSE @数据条数 END; + + CREATE TABLE #任务 + ( + TaskAID BIGINT NOT NULL PRIMARY KEY, + 订单编号 INT NOT NULL, + 订单行号 INT NULL, + 产品编码 NVARCHAR(1000) NULL, + 产品名称 NVARCHAR(1000) NULL, + 工序名称 NVARCHAR(100) NULL, + 工位名称 NVARCHAR(100) NULL, + 物料编号 NVARCHAR(1000) NULL, + 物料描述 NVARCHAR(1000) NULL, + 合同号 NVARCHAR(100) NULL + ); + + INSERT INTO #任务 + ( + TaskAID, + 订单编号, + 订单行号, + 产品编码, + 产品名称, + 工序名称, + 工位名称, + 物料编号, + 物料描述, + 合同号 + ) + SELECT TOP (@TopCount) + q.AID AS TaskAID, + q.订单编号, + q.订单行号, + q.物料编码 AS 产品编码, + q.物料名称 AS 产品名称, + q.工序名称, + q.指派对象 AS 工位名称, + p.物料编号, + p.物料描述, + p.合同号 + FROM dbo.MES_接口_生产计划 AS p + INNER JOIN dbo.MES_接口_生产计划_生产任务 AS q + ON q.订单编号 = p.订单编号 + AND q.物料类型 = N'pit_Resource' + WHERE p.单据状态 IS NOT NULL + AND p.订单编号 > 6000 + AND (@合同号 IS NULL OR @合同号 = N'' OR p.合同号 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 q.指派对象 LIKE N'%' + @工位 + N'%') + ORDER BY q.订单编号 DESC, q.订单行号; + + CREATE TABLE #基础数据 + ( + 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 + t.TaskAID, + v.开始时间, + v.操作内容, + v.操作类别, + v.操作人, + v.加工工时, + v.操作数值, + t.合同号 AS 订单合同号, + t.订单编号 AS 订单号, + t.订单行号, + t.产品编码, + t.产品名称, + t.工序名称, + t.工位名称, + t.物料编号, + t.物料描述 + FROM #任务 AS t + OUTER APPLY + ( + SELECT + ISNULL(c.操作类别, o.操作类别) AS 操作类别, + ISNULL(c.操作人, o.操作人) AS 操作人, + ISNULL(c.操作数值, o.操作数值) AS 操作数值, + ISNULL(c.操作内容, o.操作内容) AS 操作内容, + ISNULL(c.开始时间, o.开始时间) AS 开始时间, + ISNULL(c.结束时间, o.结束时间) AS 结束时间, + ISNULL(c.工时, o.实际工时) AS 加工工时 + FROM dbo.YL_加工中心_操作记录表 AS o + LEFT JOIN dbo.生产管理_工时校验_校验工时表 AS c + ON o.AID = c.报工记录id + WHERE o.TaskAID = t.TaskAID + AND o.工位名称 <> N'外协' + AND (o.操作类别 <> N'报工' OR ISNULL(c.结束时间, o.结束时间) IS NOT NULL) + AND (c.AID IS NOT NULL OR o.操作类别 <> N'收料') + AND ( + c.AID IS NOT NULL + OR o.操作内容 NOT IN (N'开始加工', N'辅助开始') + OR o.结束时间 IS NOT NULL + OR NOT EXISTS + ( + SELECT 1 + FROM dbo.YL_加工中心_操作记录表 AS t2 + WHERE t2.操作内容 IN (N'报工', N'辅助结束') + AND t2.TaskAID = o.TaskAID + AND t2.开始时间 = o.开始时间 + ) + ) + AND ( + o.操作内容 NOT IN (N'辅助结束') + OR NOT EXISTS + ( + SELECT 1 + FROM dbo.YL_加工中心_操作记录表 AS p + WHERE p.操作内容 = N'辅助结束' + AND p.TaskAID = o.TaskAID + AND p.结束时间 IS NULL + ) + ) + AND ( + o.操作内容 NOT IN (N'开始加工', N'辅助开始') + OR NOT EXISTS + ( + SELECT 1 + FROM dbo.YL_加工中心_操作记录表 AS p + WHERE p.操作内容 = N'暂停' + AND p.TaskAID = o.TaskAID + AND p.结束时间 = o.开始时间 + AND p.操作人 = o.操作人 + ) + ) + AND ( + o.操作数值 IS NOT NULL + OR (o.操作内容 IN (N'开始加工', N'辅助开始') AND o.结束时间 IS NULL) + OR o.操作描述 <> N'' + ) + ) AS v + WHERE (@开始日期 IS NULL OR @开始日期 = N'' OR v.开始时间 >= @开始日期) + AND (@结束日期 IS NULL OR @结束日期 = N'' OR v.开始时间 < DATEADD(DAY, 1, @结束日期)); + + 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.YL_加工中心_操作记录表 AS o + ON o.TaskAID = k.TaskAID + AND o.开始时间 >= CONVERT(DATETIME, k.开始时间, 120) + AND o.开始时间 < DATEADD(SECOND, 1, CONVERT(DATETIME, k.开始时间, 120)) + LEFT JOIN dbo.生产管理_工时校验_校验工时表 AS c + ON o.AID = c.报工记录id + CROSS APPLY STRING_SPLIT(REPLACE(REPLACE(ISNULL(ISNULL(c.操作人, o.操作人), N''), N',', N','), N'、', N','), N',') AS s + WHERE ISNULL(ISNULL(c.工时, o.实际工时), 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) / 60.0 / 60.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.订单号, + 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 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 + 1 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') AS taskDescription, + CAST(0 AS INT) AS productionOrderNo, + N'' AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + N'' AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount, + CAST(0 AS INT) AS 工序顺序 + FROM 物料汇总 + + UNION ALL + + SELECT + 2 AS [Level], + 物料编号 AS materialCode, + 物料描述 AS materialDesc, + ISNULL(物料描述, N'') + N' ' + ISNULL(物料编号, N'') + + CASE WHEN NULLIF(ISNULL(工序名称, N''), N'') IS NULL THEN N'' ELSE N' ' + 工序名称 END + + CASE WHEN 工序顺序 IS NULL THEN N'' ELSE N' 序' + CAST(工序顺序 AS VARCHAR(20)) END AS taskDescription, + 订单号 AS productionOrderNo, + ISNULL(工位名称, N'') AS station, + CAST(报工工时 AS VARCHAR(20)) AS reportWorkHours, + CAST(主辅工时 AS VARCHAR(20)) AS auxiliaryWorkHours, + CAST(报工完成数 AS VARCHAR(20)) AS reportFinishQty, + CAST(辅助完成数 AS VARCHAR(20)) AS auxiliaryFinishQty, + CAST(合计工时 AS VARCHAR(20)) AS totalWorkHours, + CAST(CASE WHEN 报工完成数 > 0 THEN (报工工时 - 0 * 报工完成数) / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS clampingTime, + CAST(0 AS VARCHAR(20)) AS programTime, + CAST(CASE WHEN 报工完成数 > 0 THEN 报工工时 / 报工完成数 ELSE 0 END AS VARCHAR(20)) AS settlementReportPieceHours, + CAST(CASE WHEN 辅助完成数 > 0 THEN 主辅工时 / 辅助完成数 ELSE 0 END AS VARCHAR(20)) AS settlementAuxiliaryPieceHours, + ISNULL(操作人, N'') AS operatorNames, + CAST(记录数 AS VARCHAR(20)) AS recordCount, + 工序顺序 + FROM 订单工位汇总 + + ORDER BY productionOrderNo, 工序顺序, materialCode, [Level], station; +END +GO diff --git a/gptlog-process/gpdlog.md b/gptlog-process/gpdlog.md index 8a911d6..4c3a7fc 100644 --- a/gptlog-process/gpdlog.md +++ b/gptlog-process/gpdlog.md @@ -1617,3 +1617,116 @@ pm run build:通过,仅有既有警告。 - Word 文档已包含 `已有设计报工记录不能删除`。 - Word 文档已包含 `不上传 SAP` 和 `不参与现有生产工时报表`。 - 任务矩阵中 `DRT-009 项目号来源` 状态为待确认,`DRT-010 数据库和页面开发` 状态为待开始。 + +## 2026-06-30 设计报工任务模块文档归档与菜单权限口径补充 + +### 用户反馈 +- 根据修改后的文档,将文档复制到对应路径。 +- 在对应路径下新增或修改 README、01-06 文档。 +- 将完整执行过程追加到 `/gptlog-process/gpdlog.md`。 +- 不分配菜单权限。 + +### 执行过程 +1. 确认修改后的源文档为 `doc/设计报工任务模块.docx`。 +2. 确认对应路径为 `work/ProductionManagement/DesignReportTask/`。 +3. 将源 Word 文档复制到 `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx`。 +4. 更新 README 索引,增加复制后的 Word 文档说明,并写入“不分配菜单权限”。 +5. 更新 `01-项目功能内容.md`,补充独立性要求和文档归档路径。 +6. 更新 `02-项目程序开发详细步骤.md`,删除菜单权限分配动作,明确不写菜单表和角色权限表。 +7. 更新 `03-推进台账.md`,记录本轮做了什么、改了哪些文件、验证了什么、下一步是什么。 +8. 更新 `04-任务矩阵.md`,新增文档复制和菜单权限口径任务,并将开发验收标准调整为“不分配菜单权限”。 +9. 更新 `05-验收证据.md`,记录工作目录归档路径和菜单权限口径。 +10. 更新 `06-决策记录.md`,新增 DDR-006:本阶段不分配菜单权限。 +11. 追加仓库内总日志和绝对路径总日志。 + +### 修改文件 +- `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx` +- `work/ProductionManagement/DesignReportTask/README.md` +- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md` +- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/DesignReportTask/03-推进台账.md` +- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md` +- `work/ProductionManagement/DesignReportTask/05-验收证据.md` +- `work/ProductionManagement/DesignReportTask/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- `work/ProductionManagement/DesignReportTask/设计报工任务模块.docx` 已存在。 +- README 已列出复制后的 Word 文档。 +- `02-项目程序开发详细步骤.md` 已明确本阶段不分配菜单权限。 +- `04-任务矩阵.md` 已新增 `DRT-011` 和 `DRT-012`。 +- `06-决策记录.md` 已新增 `DDR-006 本阶段不分配菜单权限`。 + +## 2026-06-30 新建设计报工模块页面、数据表和功能 + +### 用户反馈 +- 新建文档里面的页面、数据表、功能。 +- 继续遵守“不分配菜单权限”的要求。 + +### 执行过程 +1. 读取 `work/ProductionManagement/DesignReportTask/01-项目功能内容.md`,确认需要落地 4 个页面、3 张独立表和独立设计报工功能。 +2. 读取现有页面和通用数据库调用方式,确认页面使用 `CreateData` / `ExecDatabase` 调用存储过程。 +3. 查询数据库中现有物料查询和人员查询返回字段: + - 物料字段包含 `物料编码`、`物料名称`、`物料描述`。 + - 人员字段包含 `人员编号`、`人员姓名`、`账号`、`角色`。 +4. 新增数据库脚本 `db_backups/create_design_report_task_module_20260630.sql`。 +5. 第一次发布脚本时,SAP 物料字段存在 `ntext` 与 `nvarchar` 比较问题,修正为显式 `CAST` 后重新发布。 +6. 成功发布 3 张独立表: + - `dbo.MES_设计报工_任务` + - `dbo.MES_设计报工_记录` + - `dbo.MES_设计报工_校验记录` +7. 成功发布 15 个独立过程: + - `设计报工_物料查询` + - `设计报工_人员查询` + - `设计报工_项目查询` + - `设计报工_任务_查询` + - `设计报工_任务_新增` + - `设计报工_任务_编辑` + - `设计报工_任务_删除` + - `设计报工_任务_开始` + - `设计报工_任务_结束` + - `设计报工_任务_完成` + - `设计报工_记录_查询` + - `设计报工_工时校验_查询` + - `设计报工_工时校验_保存` + - `设计报工_工时校验_批量保存` + - `设计报工_工时报表_作业者工时_查询` +8. 事务内验证业务规则: + - 新增测试任务成功。 + - 未开始直接完成返回“任务未产生已结束报工,不能完成”。 + - 开始任务成功。 + - 开始后未结束直接完成返回“任务存在未结束报工,不能完成”。 + - 结束任务成功。 + - 结束后完成成功。 + - 事务回滚,测试数据未保留。 +9. 新增 4 个前端页面: + - `src/views/ProductionManagement/DesignReportTask/Task/index.vue` + - `src/views/ProductionManagement/DesignReportTask/Report/index.vue` + - `src/views/ProductionManagement/DesignReportTask/Check/index.vue` + - `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue` +10. 执行 `npm run build`,构建通过,仅有项目既有 asset size、entrypoint size、browserslist warning。 +11. 更新 `work/ProductionManagement/DesignReportTask/` 下 README 和 01-06 文档。 +12. 本轮未新增菜单权限脚本,未写入菜单表和角色权限表。 + +### 修改文件 +- `db_backups/create_design_report_task_module_20260630.sql` +- `src/views/ProductionManagement/DesignReportTask/Task/index.vue` +- `src/views/ProductionManagement/DesignReportTask/Report/index.vue` +- `src/views/ProductionManagement/DesignReportTask/Check/index.vue` +- `src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue` +- `work/ProductionManagement/DesignReportTask/README.md` +- `work/ProductionManagement/DesignReportTask/01-项目功能内容.md` +- `work/ProductionManagement/DesignReportTask/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/DesignReportTask/03-推进台账.md` +- `work/ProductionManagement/DesignReportTask/04-任务矩阵.md` +- `work/ProductionManagement/DesignReportTask/05-验收证据.md` +- `work/ProductionManagement/DesignReportTask/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 数据库脚本发布成功。 +- 表和过程对象存在,过程修改时间为 `2026-06-30 18:01:39` 至 `2026-06-30 18:01:40`。 +- 下拉验证:`设计报工_物料查询 @过滤=N'5960'` 可返回物料,`设计报工_人员查询 @过滤=N'孙'` 可返回人员。 +- 业务规则事务验证通过,测试数据已回滚。 +- `npm run build` 通过,仅有项目既有 warning。 +- 未分配菜单权限。 diff --git a/src/views/PlanManagement/SelfMakePlando/index.vue b/src/views/PlanManagement/SelfMakePlando/index.vue index d69c6cd..c1d7f08 100644 --- a/src/views/PlanManagement/SelfMakePlando/index.vue +++ b/src/views/PlanManagement/SelfMakePlando/index.vue @@ -197,6 +197,12 @@ @click="getitemdata(scope.row.订单号)">查看 + + + + + + @@ -334,7 +340,95 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -351,6 +445,7 @@ export default { data() { return { dialogcasual:false, + dialogcasual2:false, activeTab: 'form', doneactiveTab: 'form', orderNo: '', @@ -613,6 +708,25 @@ export default { }) }) }, + getWorkHour(item){ + var param = [] + this.dialogcasual2 = true + this.itemdata = [] + param.push(["产品编码",item]) + param.push(["合同号",'']) + param.push(["订单号",'']) + param.push(["工位",'']) + param.push(["开始日期",'']) + param.push(["结束日期",'']) + param.push(["数据条数",100]) + var Data = this.CreateData('11', '生产管理_结算工时_查询',param) + this.ExecDatabase(Data).then(response => { + response.data.forEach(element => { + if(element.Level == 2) + this.itemdata.push(element) + }) + }) + }, getCurrentTime() { const now = new Date(); const year = now.getFullYear(); diff --git a/src/views/PlanManagement/TimelyKitTrackingResult/index.vue b/src/views/PlanManagement/TimelyKitTrackingResult/index.vue index eb5d3b0..de9c3ae 100644 --- a/src/views/PlanManagement/TimelyKitTrackingResult/index.vue +++ b/src/views/PlanManagement/TimelyKitTrackingResult/index.vue @@ -396,7 +396,12 @@ export default { return this.getProcessBaseClass(process) }, getRouteProcessName(process) { - return String(process.工序名称 || '') + const name = String(process.工序名称 || '') + const assignee = String(process.指派对象 || '') + if (!assignee || name.includes(`(${assignee})`) || name.includes(`(${assignee})`)) { + return name + } + return `${name}(${assignee})` }, escapeProcessHtml(value) { return String(value == null ? '' : value) diff --git a/src/views/ProductionManagement/DesignReportTask/Check/index.vue b/src/views/ProductionManagement/DesignReportTask/Check/index.vue new file mode 100644 index 0000000..320296f --- /dev/null +++ b/src/views/ProductionManagement/DesignReportTask/Check/index.vue @@ -0,0 +1,281 @@ + + + + + diff --git a/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue b/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue new file mode 100644 index 0000000..626b3e4 --- /dev/null +++ b/src/views/ProductionManagement/DesignReportTask/HoursReport/index.vue @@ -0,0 +1,192 @@ + + + + + diff --git a/src/views/ProductionManagement/DesignReportTask/Report/index.vue b/src/views/ProductionManagement/DesignReportTask/Report/index.vue new file mode 100644 index 0000000..35e36fa --- /dev/null +++ b/src/views/ProductionManagement/DesignReportTask/Report/index.vue @@ -0,0 +1,202 @@ + + + + + diff --git a/src/views/ProductionManagement/DesignReportTask/Task/index.vue b/src/views/ProductionManagement/DesignReportTask/Task/index.vue new file mode 100644 index 0000000..f152d0c --- /dev/null +++ b/src/views/ProductionManagement/DesignReportTask/Task/index.vue @@ -0,0 +1,578 @@ + + + + + diff --git a/src/views/ProductionManagement/OutsourceMange/index.vue b/src/views/ProductionManagement/OutsourceMange/index.vue index a7f6290..1204259 100644 --- a/src/views/ProductionManagement/OutsourceMange/index.vue +++ b/src/views/ProductionManagement/OutsourceMange/index.vue @@ -119,13 +119,13 @@