diff --git a/db_backups/add_formality_confirm_report_menu_20260626.sql b/db_backups/add_formality_confirm_report_menu_20260626.sql
new file mode 100644
index 0000000..5c68899
--- /dev/null
+++ b/db_backups/add_formality_confirm_report_menu_20260626.sql
@@ -0,0 +1,110 @@
+USE [YL_MESDB]
+GO
+
+SET NOCOUNT ON;
+
+DECLARE @Title nvarchar(100) = N'手续确认报表';
+DECLARE @Path nvarchar(300) = N'FormalityConfirmReport/index';
+DECLARE @Component nvarchar(300) = N'/ProductionManagement/FormalityConfirmReport/index';
+DECLARE @Name nvarchar(100) = N'FormalityConfirmReport';
+DECLARE @SourcePath nvarchar(300) = N'AssemblyCenter/index';
+DECLARE @SourceComponent nvarchar(300) = N'/ProductionManagement/AssemblyCenter/index';
+DECLARE @TargetRole int = NULL;
+
+IF OBJECT_ID(N'dbo.登录基础数据_二级菜单', N'U') IS NULL
+BEGIN
+ RAISERROR(N'未找到表 dbo.登录基础数据_二级菜单。', 16, 1);
+ RETURN;
+END;
+
+DECLARE @IdIsIdentity bit = ISNULL(COLUMNPROPERTY(OBJECT_ID(N'dbo.登录基础数据_二级菜单'), N'id', 'IsIdentity'), 0);
+
+IF @IdIsIdentity = 1
+BEGIN
+ ;WITH SourceRows AS (
+ SELECT
+ src.[账号代码],
+ src.[pid],
+ src.[icon]
+ FROM [dbo].[登录基础数据_二级菜单] src
+ WHERE src.[是否启用] = 1
+ AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
+ AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'装配中心')
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[登录基础数据_二级菜单] existing
+ WHERE existing.[账号代码] = src.[账号代码]
+ AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
+ )
+ )
+ INSERT INTO [dbo].[登录基础数据_二级菜单]
+ ([pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用], [操作时间])
+ SELECT
+ [pid],
+ @Path,
+ @Component,
+ NULL,
+ @Name,
+ @Title,
+ [icon],
+ [账号代码],
+ 1,
+ GETDATE()
+ FROM SourceRows;
+END
+ELSE
+BEGIN
+ ;WITH SourceRows AS (
+ SELECT
+ ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn,
+ src.[账号代码],
+ src.[pid],
+ src.[icon]
+ FROM [dbo].[登录基础数据_二级菜单] src
+ WHERE src.[是否启用] = 1
+ AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
+ AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'装配中心')
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[登录基础数据_二级菜单] existing
+ WHERE existing.[账号代码] = src.[账号代码]
+ AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
+ )
+ ),
+ BaseId AS (
+ SELECT ISNULL(MAX([id]), 0) AS maxId
+ FROM [dbo].[登录基础数据_二级菜单]
+ )
+ INSERT INTO [dbo].[登录基础数据_二级菜单]
+ ([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [模块代码], [是否启用], [操作时间])
+ SELECT
+ BaseId.maxId + SourceRows.rn,
+ SourceRows.[pid],
+ @Path,
+ @Component,
+ NULL,
+ @Name,
+ @Title,
+ SourceRows.[icon],
+ SourceRows.[账号代码],
+ BaseId.maxId + SourceRows.rn,
+ 1,
+ GETDATE()
+ FROM SourceRows
+ CROSS JOIN BaseId;
+END;
+
+UPDATE [dbo].[登录基础数据_二级菜单]
+SET
+ [path] = @Path,
+ [componet] = @Component,
+ [name] = @Name,
+ [title] = @Title,
+ [模块代码] = [id],
+ [是否启用] = 1
+WHERE [title] = @Title OR [componet] = @Component;
+
+SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码], [模块代码], [是否启用]
+FROM [dbo].[登录基础数据_二级菜单]
+WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title
+ORDER BY [账号代码], [id];
diff --git a/db_backups/add_punctual_inspection_menu_20260626.sql b/db_backups/add_punctual_inspection_menu_20260626.sql
new file mode 100644
index 0000000..052a2c6
--- /dev/null
+++ b/db_backups/add_punctual_inspection_menu_20260626.sql
@@ -0,0 +1,123 @@
+USE [YL_MESDB]
+GO
+
+SET NOCOUNT ON;
+
+DECLARE @Title nvarchar(100) = N'及时检验报表';
+DECLARE @Path nvarchar(300) = N'CheckTask/punctualInspection';
+DECLARE @Component nvarchar(300) = N'/QualityManagement/CheckTask/punctualInspection';
+DECLARE @Name nvarchar(100) = N'PunctualInspectionReport';
+DECLARE @SourcePath nvarchar(300) = N'CheckTask/processReceive';
+DECLARE @SourceComponent nvarchar(300) = N'/QualityManagement/CheckTask/processReceive';
+DECLARE @TargetRole int = NULL; -- NULL means all roles that already have 序检收检.
+
+IF OBJECT_ID(N'dbo.登录基础数据_二级菜单', N'U') IS NULL
+BEGIN
+ RAISERROR(N'未找到表 dbo.登录基础数据_二级菜单。', 16, 1);
+ RETURN;
+END;
+
+DECLARE @IdIsIdentity bit = ISNULL(COLUMNPROPERTY(OBJECT_ID(N'dbo.登录基础数据_二级菜单'), N'id', 'IsIdentity'), 0);
+
+IF @IdIsIdentity = 1
+BEGIN
+ ;WITH SourceRows AS (
+ SELECT
+ src.[账号代码],
+ COALESCE(reportParent.[id], src.[pid]) AS [pid],
+ src.[icon]
+ FROM [dbo].[登录基础数据_二级菜单] src
+ OUTER APPLY (
+ SELECT TOP (1) rp.[id]
+ FROM [dbo].[登录基础数据_二级菜单] rp
+ WHERE rp.[账号代码] = src.[账号代码]
+ AND rp.[是否启用] = 1
+ AND rp.[title] = N'质量报表'
+ ORDER BY rp.[id]
+ ) reportParent
+ WHERE src.[是否启用] = 1
+ AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
+ AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'序检收检')
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[登录基础数据_二级菜单] existing
+ WHERE existing.[账号代码] = src.[账号代码]
+ AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
+ )
+ )
+ INSERT INTO [dbo].[登录基础数据_二级菜单]
+ ([pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用])
+ SELECT
+ [pid],
+ @Path,
+ @Component,
+ NULL,
+ @Name,
+ @Title,
+ [icon],
+ [账号代码],
+ 1
+ FROM SourceRows;
+END
+ELSE
+BEGIN
+ ;WITH SourceRows AS (
+ SELECT
+ ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn,
+ src.[账号代码],
+ COALESCE(reportParent.[id], src.[pid]) AS [pid],
+ src.[icon]
+ FROM [dbo].[登录基础数据_二级菜单] src
+ OUTER APPLY (
+ SELECT TOP (1) rp.[id]
+ FROM [dbo].[登录基础数据_二级菜单] rp
+ WHERE rp.[账号代码] = src.[账号代码]
+ AND rp.[是否启用] = 1
+ AND rp.[title] = N'质量报表'
+ ORDER BY rp.[id]
+ ) reportParent
+ WHERE src.[是否启用] = 1
+ AND (@TargetRole IS NULL OR src.[账号代码] = @TargetRole)
+ AND (src.[path] = @SourcePath OR src.[componet] = @SourceComponent OR src.[title] = N'序检收检')
+ AND NOT EXISTS (
+ SELECT 1
+ FROM [dbo].[登录基础数据_二级菜单] existing
+ WHERE existing.[账号代码] = src.[账号代码]
+ AND (existing.[path] = @Path OR existing.[componet] = @Component OR existing.[title] = @Title)
+ )
+ ),
+ BaseId AS (
+ SELECT ISNULL(MAX([id]), 0) AS maxId
+ FROM [dbo].[登录基础数据_二级菜单]
+ )
+ INSERT INTO [dbo].[登录基础数据_二级菜单]
+ ([id], [pid], [path], [componet], [redirect], [name], [title], [icon], [账号代码], [是否启用])
+ SELECT
+ BaseId.maxId + SourceRows.rn,
+ SourceRows.[pid],
+ @Path,
+ @Component,
+ NULL,
+ @Name,
+ @Title,
+ SourceRows.[icon],
+ SourceRows.[账号代码],
+ 1
+ FROM SourceRows
+ CROSS JOIN BaseId;
+END;
+
+UPDATE [dbo].[登录基础数据_二级菜单]
+SET
+ [path] = @Path,
+ [componet] = @Component,
+ [name] = @Name,
+ [title] = @Title,
+ [模块代码] = [id],
+ [是否启用] = 1
+WHERE [title] = @Title OR [componet] = @Component;
+
+SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码], [是否启用]
+FROM [dbo].[登录基础数据_二级菜单]
+WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title
+ORDER BY [账号代码], [id];
diff --git a/db_backups/create_formality_confirm_report_20260626.sql b/db_backups/create_formality_confirm_report_20260626.sql
new file mode 100644
index 0000000..416d2e9
--- /dev/null
+++ b/db_backups/create_formality_confirm_report_20260626.sql
@@ -0,0 +1,212 @@
+USE [YL_MESDB]
+GO
+
+IF OBJECT_ID(N'dbo.生产管理_手续确认报表记录', N'U') IS NULL
+BEGIN
+ CREATE TABLE [dbo].[生产管理_手续确认报表记录] (
+ [AID] bigint IDENTITY(1,1) NOT NULL CONSTRAINT [PK_生产管理_手续确认报表记录] PRIMARY KEY,
+ [TaskAID] bigint NOT NULL,
+ [订单编号] int NULL,
+ [手续确认] int NOT NULL CONSTRAINT [DF_生产管理_手续确认报表记录_手续确认] DEFAULT (1),
+ [确认人] nvarchar(50) NULL,
+ [确认时间] datetime NOT NULL CONSTRAINT [DF_生产管理_手续确认报表记录_确认时间] DEFAULT (GETDATE()),
+ [备注] nvarchar(500) NULL
+ );
+
+ CREATE UNIQUE INDEX [UX_生产管理_手续确认报表记录_TaskAID]
+ ON [dbo].[生产管理_手续确认报表记录] ([TaskAID]);
+END
+GO
+
+IF OBJECT_ID(N'dbo.生产管理_手续确认报表_查询', N'P') IS NULL
+BEGIN
+ EXEC(N'CREATE PROCEDURE [dbo].[生产管理_手续确认报表_查询] AS BEGIN SET NOCOUNT ON; END');
+END
+GO
+
+ALTER PROCEDURE [dbo].[生产管理_手续确认报表_查询]
+ @TaskAID int = -1,
+ @订单号 int = -1,
+ @零件编号 nvarchar(50) = N'',
+ @零件名称 nvarchar(50) = N'',
+ @计划开工_Start nvarchar(50) = N'',
+ @计划开工_End nvarchar(50) = N'',
+ @生产状态 int = -1,
+ @工位名称 nvarchar(50) = N'',
+ @计划号 nvarchar(50) = N'',
+ @销售订单 nvarchar(50) = N''
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ SELECT TOP (500)
+ main.TaskAID,
+ main.[订单编号] AS 订单号,
+ main.合同号,
+ main.自制件属性,
+ main.加急总数,
+ main.派工特殊说明,
+ main.[订单拆分内码],
+ main.[订单行号],
+ main.[开工时间],
+ main.[物料编号] AS 零件编码,
+ main.[物料描述] AS 零件名称,
+ CASE WHEN ISNULL(main.[加急状态], 0) = 1 THEN N'加急' ELSE N'否' END AS [加急],
+ main.[优先级] AS [优先],
+ main.[指派对象编号],
+ main.[指派对象],
+ main.[工序名称],
+ main.[二次派工],
+ main.[计划号],
+ ISNULL(main.[指派数量], 0) AS 分配数,
+ main.[计划开始时间] AS 计划开始,
+ main.[计划完成时间] AS 计划完成,
+ main.[最晚开始时间] AS 最晚开始,
+ main.[齐套时间] AS 发料齐套时间,
+ ISNULL(main.[收料数量], 0) AS 收料,
+ ISNULL(main.[完成数量], 0) AS 完成数量,
+ ISNULL(main.[入库], 0) AS 入库,
+ ISNULL(main.[入库数量], 0) AS 入库数量,
+ main.[订单状态],
+ main.[单据状态],
+ CASE
+ WHEN ISNULL(main.齐套, 0) = 1 THEN N'是'
+ WHEN ISNULL(main.齐套, 0) = 0 THEN N'否'
+ ELSE N''
+ END AS [齐套],
+ CASE
+ WHEN ISNULL(main.发料状态, 0) = 1 THEN N'发料齐套'
+ WHEN ISNULL(main.发料状态, 0) = 2 THEN N'发料缺件'
+ ELSE N''
+ END AS [发料状态],
+ CASE
+ WHEN ISNULL(main.拣配状态, 0) = 1 THEN N'已拣配'
+ WHEN ISNULL(main.拣配状态, 0) = 0 THEN N'未拣配'
+ ELSE N''
+ END AS [拣配状态],
+ CASE
+ WHEN ISNULL(main.任务状态, 0) = 4 THEN N'已完成'
+ WHEN ISNULL(main.任务状态, 0) = 2 THEN N'已开工'
+ WHEN ISNULL(main.任务状态, 0) = 0 THEN N'待执行'
+ WHEN ISNULL(main.任务状态, 0) = 1 THEN N'可执行'
+ ELSE N''
+ END AS [任务状态],
+ CASE
+ WHEN ISNULL(main.加工状态, 0) = 2 THEN N'辅助开始'
+ WHEN ISNULL(main.加工状态, 0) = 3 THEN N'辅助结束'
+ WHEN ISNULL(main.加工状态, 0) = 4 THEN N'开始加工'
+ WHEN ISNULL(main.加工状态, 0) = 5 THEN N'暂停'
+ WHEN ISNULL(main.加工状态, 0) = 6 THEN N'报工'
+ ELSE N''
+ END AS [加工状态],
+ ISNULL(main.加工状态, 0) AS 加工状态编号,
+ CASE WHEN ISNULL(main.[首检], -1) = 1 THEN N'OK' WHEN ISNULL(main.[首检], -1) = 0 THEN N'NG' ELSE N'' END AS [首检],
+ CASE WHEN ISNULL(main.[序检], -1) = 1 THEN N'OK' WHEN ISNULL(main.[序检], -1) = 0 THEN N'NG' ELSE N'' END AS [序检],
+ next_task.[工序名称] AS 下序名称,
+ ISNULL(prev_quality.上序合格数, 0) AS 上序合格数,
+ second_worker.二次派工名称,
+ CASE WHEN confirm.TaskAID IS NULL THEN N'未完成' ELSE N'已完成' END AS 手续确认,
+ confirm.确认人 AS 手续确认人,
+ confirm.确认时间 AS 手续确认时间
+ FROM [dbo].[View_生产订单_MES] AS main
+ OUTER APPLY (
+ SELECT TOP (1) next_task.[工序名称]
+ FROM [dbo].[View_生产订单_MES] AS next_task
+ WHERE next_task.[订单编号] = main.[订单编号]
+ AND next_task.[订单行号] = main.[订单行号] + 1
+ AND next_task.[排产状态] = 1
+ ORDER BY next_task.[订单行号]
+ ) AS next_task
+ OUTER APPLY (
+ SELECT ISNULL(SUM(ISNULL(a.合格数, 0)), 0) AS 上序合格数
+ FROM [dbo].[YL_质量检验_质检记录] AS a
+ INNER JOIN [dbo].[MES_接口_生产计划_生产任务] AS b ON a.TaskAID = b.AID
+ WHERE b.订单编号 = main.[订单编号]
+ AND b.订单行号 = main.[订单行号] - 1
+ AND a.检测类型编号 = 6
+ ) AS prev_quality
+ OUTER APPLY (
+ SELECT STRING_AGG(a.Personnel_Name, N',') AS 二次派工名称
+ FROM [dbo].[登录基础数据_人员信息] AS a
+ WHERE EXISTS (
+ SELECT 1
+ FROM STRING_SPLIT(ISNULL(main.二次派工, N''), N',') AS ids
+ WHERE LTRIM(RTRIM(ids.value)) = CAST(a.Personnel_Number AS varchar(50))
+ )
+ ) AS second_worker
+ LEFT JOIN [dbo].[生产管理_手续确认报表记录] AS confirm ON confirm.TaskAID = main.TaskAID
+ WHERE main.[排产状态] = 1
+ AND ISNULL(main.[指派对象], N'') <> N'外协'
+ AND ISNULL(main.[指派对象], N'') LIKE N'%装配%'
+ AND confirm.TaskAID IS NULL
+ AND ISNULL(main.[入库], 0) <> 1
+ AND ISNULL(main.[入库数量], 0) <= 0
+ AND ISNULL(main.[订单状态], N'') NOT LIKE N'%取消%'
+ AND ISNULL(main.[订单状态], N'') NOT LIKE N'%关闭%'
+ AND ISNULL(main.[单据状态], N'') = N''
+ AND (@订单号 <= 0 OR main.[订单编号] = @订单号)
+ AND (@计划号 = N'' OR main.[计划号] = @计划号)
+ AND (@销售订单 = N'' OR main.[合同号] LIKE N'%' + @销售订单 + N'%')
+ AND (@TaskAID <= 0 OR main.[TaskAID] = @TaskAID)
+ AND (@零件编号 = N'' OR main.[物料编号] LIKE N'%' + @零件编号 + N'%')
+ AND (@零件名称 = N'' OR main.[物料描述] LIKE N'%' + @零件名称 + N'%')
+ AND (@计划开工_Start = N'' OR main.[计划开始时间] >= TRY_CONVERT(datetime, @计划开工_Start))
+ AND (@计划开工_End = N'' OR main.[计划开始时间] <= TRY_CONVERT(datetime, @计划开工_End))
+ AND (@工位名称 = N'' OR main.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@工位名称, N',')))
+ AND (
+ @生产状态 IS NULL
+ OR @生产状态 = -1
+ OR @生产状态 = 10
+ OR ISNULL(main.任务状态, 0) = @生产状态
+ )
+ ORDER BY
+ CASE WHEN ISNULL(main.[加急状态], 0) = 1 THEN 0 ELSE 1 END,
+ CASE WHEN ISNULL(main.齐套, 0) = 1 THEN 0 ELSE 1 END,
+ main.[计划开始时间],
+ main.[订单编号],
+ main.[阶段标识];
+END
+GO
+
+IF OBJECT_ID(N'dbo.生产管理_手续确认报表_确认', N'P') IS NULL
+BEGIN
+ EXEC(N'CREATE PROCEDURE [dbo].[生产管理_手续确认报表_确认] AS BEGIN SET NOCOUNT ON; END');
+END
+GO
+
+ALTER PROCEDURE [dbo].[生产管理_手续确认报表_确认]
+ @TaskAID bigint,
+ @订单号 int = NULL,
+ @确认人 nvarchar(50) = N'',
+ @备注 nvarchar(500) = N''
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ IF @TaskAID IS NULL OR @TaskAID <= 0
+ BEGIN
+ SELECT 0 AS result, N'TaskAID不能为空' AS msg;
+ RETURN;
+ END;
+
+ IF EXISTS (SELECT 1 FROM [dbo].[生产管理_手续确认报表记录] WHERE TaskAID = @TaskAID)
+ BEGIN
+ UPDATE [dbo].[生产管理_手续确认报表记录]
+ SET
+ [手续确认] = 1,
+ [确认人] = @确认人,
+ [确认时间] = GETDATE(),
+ [备注] = @备注
+ WHERE TaskAID = @TaskAID;
+ END
+ ELSE
+ BEGIN
+ INSERT INTO [dbo].[生产管理_手续确认报表记录]
+ ([TaskAID], [订单编号], [手续确认], [确认人], [确认时间], [备注])
+ VALUES
+ (@TaskAID, @订单号, 1, @确认人, GETDATE(), @备注);
+ END;
+
+ SELECT 1 AS result, N'确认成功' AS msg;
+END
+GO
diff --git a/db_backups/create_quality_punctual_inspection_report_proc_20260626.sql b/db_backups/create_quality_punctual_inspection_report_proc_20260626.sql
new file mode 100644
index 0000000..1cbcc78
--- /dev/null
+++ b/db_backups/create_quality_punctual_inspection_report_proc_20260626.sql
@@ -0,0 +1,132 @@
+USE [YL_MESDB]
+GO
+
+IF OBJECT_ID(N'dbo.质量管理_及时检验报表_查询', N'P') IS NULL
+BEGIN
+ EXEC(N'CREATE PROCEDURE [dbo].[质量管理_及时检验报表_查询] AS BEGIN SET NOCOUNT ON; END');
+END
+GO
+
+ALTER PROCEDURE [dbo].[质量管理_及时检验报表_查询]
+ @合同号 nvarchar(100) = N'',
+ @订单号 nvarchar(100) = N'',
+ @零件编号 nvarchar(100) = N'',
+ @零件名称 nvarchar(100) = N'',
+ @完工日期_Start nvarchar(20) = N'',
+ @完工日期_End nvarchar(20) = N'',
+ @检测日期_Start nvarchar(20) = N'',
+ @检测日期_End nvarchar(20) = N'',
+ @检测结果 nvarchar(10) = N'',
+ @检测人 nvarchar(50) = N'',
+ @检测类别 nvarchar(50) = N'',
+ @属性 nvarchar(50) = N''
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ ;WITH QualitySummary AS (
+ SELECT
+ TaskAID,
+ SUM(ISNULL(检验数量, 0)) AS 检验数量,
+ SUM(ISNULL(合格数, 0)) AS 合格数,
+ SUM(ISNULL(不合格数, 0)) AS 不合格数,
+ MAX(检测人) AS 检测人,
+ MAX(检测时间) AS 检测时间,
+ MAX(检测说明) AS 检测说明
+ FROM [dbo].[YL_质量检验_质检记录]
+ WHERE 检测类型编号 = 6
+ GROUP BY TaskAID
+ ),
+ OperationSummary AS (
+ SELECT
+ TaskAID,
+ 订单编号,
+ 物料描述,
+ 物料编号,
+ 工序名称,
+ SUM(ISNULL(操作数值, 0)) AS 完成数量,
+ MAX(结束时间) AS 结束时间
+ FROM [dbo].[YL_加工中心_操作记录表]
+ WHERE ISNULL(操作类别编号, 0) IN (3, 6)
+ AND TaskAID IS NOT NULL
+ AND 结束时间 IS NOT NULL
+ GROUP BY
+ TaskAID,
+ 订单编号,
+ 物料描述,
+ 物料编号,
+ 工序名称
+ )
+ SELECT TOP (500)
+ o.TaskAID AS TaskAID,
+ o.订单编号 AS 计划号,
+ v.合同号,
+ o.物料描述 AS 零件名称,
+ o.物料编号 AS 零件编码,
+ v.指派对象 AS 工位名称,
+ o.工序名称 AS 工序名称,
+ CAST(N'' AS nvarchar(100)) AS 供应商,
+ CAST(N'' AS nvarchar(100)) AS 采购收货单,
+ v.自制件属性,
+ o.完成数量 AS 完成数量,
+ ISNULL(v.加急状态, 0) AS 加急状态,
+ ISNULL(v.加急总数, 0) AS 加急总数,
+ ISNULL(q.检验数量, 0) AS 检验数量,
+ ISNULL(q.合格数, 0) AS 合格数,
+ ISNULL(q.不合格数, 0) AS 不合格数,
+ ISNULL(q.检测人, N'') AS 检测人,
+ ISNULL(CONVERT(nvarchar(19), q.检测时间, 120), N'') AS 检测时间,
+ ISNULL(q.检测说明, N'') AS 检测说明,
+ CONVERT(nvarchar(19), o.结束时间, 120) AS 结束时间,
+ DATEDIFF(DAY, CONVERT(date, o.结束时间), CONVERT(date, GETDATE())) AS 超期天数,
+ CASE
+ WHEN q.TaskAID IS NULL THEN 0
+ WHEN q.合格数 > 0 AND q.不合格数 = 0 THEN 1
+ WHEN q.不合格数 > 0 THEN 2
+ ELSE 0
+ END AS 检测状态
+ FROM OperationSummary AS o
+ LEFT JOIN QualitySummary AS q ON o.TaskAID = q.TaskAID
+ LEFT JOIN [dbo].[View_生产订单全部(包括已关闭)] AS v ON o.TaskAID = v.TaskAID
+ WHERE ISNULL(v.单据状态, N'') = N''
+ AND ISNULL(o.完成数量, 0) > ISNULL(q.检验数量, 0)
+ AND DATEDIFF(DAY, CONVERT(date, o.结束时间), CONVERT(date, GETDATE())) > 2
+ AND (@订单号 = N'' OR o.订单编号 = @订单号)
+ AND (@合同号 = N'' OR v.合同号 LIKE N'%' + @合同号 + N'%')
+ AND (@零件编号 = N'' OR o.物料编号 LIKE N'%' + @零件编号 + N'%')
+ AND (@零件名称 = N'' OR o.物料描述 LIKE N'%' + @零件名称 + N'%')
+ AND (
+ @完工日期_Start = N''
+ OR CONVERT(date, o.结束时间) >= TRY_CONVERT(date, @完工日期_Start)
+ )
+ AND (
+ @完工日期_End = N''
+ OR CONVERT(date, o.结束时间) <= TRY_CONVERT(date, @完工日期_End)
+ )
+ AND (
+ @检测日期_Start = N''
+ OR CONVERT(date, q.检测时间) >= TRY_CONVERT(date, @检测日期_Start)
+ )
+ AND (
+ @检测日期_End = N''
+ OR CONVERT(date, q.检测时间) <= TRY_CONVERT(date, @检测日期_End)
+ )
+ AND (
+ @检测结果 = N''
+ OR (@检测结果 = N'1' AND ISNULL(q.合格数, 0) > 0 AND ISNULL(q.不合格数, 0) = 0)
+ OR (@检测结果 = N'0' AND ISNULL(q.不合格数, 0) > 0)
+ )
+ AND (@检测人 = N'' OR ISNULL(q.检测人, N'') LIKE N'%' + @检测人 + N'%')
+ AND (
+ @属性 = N''
+ OR @属性 = N'0'
+ OR (@属性 = N'1' AND ISNULL(v.自制件属性, N'') NOT LIKE N'%装配%')
+ OR (@属性 = N'2' AND ISNULL(v.自制件属性, N'') LIKE N'%装配%')
+ )
+ ORDER BY
+ ISNULL(v.加急状态, 0) DESC,
+ DATEDIFF(DAY, CONVERT(date, o.结束时间), CONVERT(date, GETDATE())) DESC,
+ o.结束时间 ASC,
+ o.订单编号 DESC;
+END
+GO
diff --git a/db_backups/update_quality_details_release_qty_20260626.sql b/db_backups/update_quality_details_release_qty_20260626.sql
new file mode 100644
index 0000000..4a40a13
--- /dev/null
+++ b/db_backups/update_quality_details_release_qty_20260626.sql
@@ -0,0 +1,173 @@
+USE [YL_MESDB]
+GO
+
+ALTER PROCEDURE [dbo].[质量管理_质检明细_查询]
+ @质检类型 nvarchar(4000) = '10',
+ @开始日期 datetime = NULL,
+ @结束日期 datetime = NULL,
+ @订单号 nvarchar(4000) = '0',
+ @合同号 nvarchar(4000) = '0',
+ @零件编码 nvarchar(4000) = '0',
+ @零件名称 nvarchar(4000) = '0',
+ @PageCurrent int = 1,
+ @PageSize int = 20,
+ @PageCount int OUTPUT,
+ @ItemCount int OUTPUT,
+ @放行 nvarchar(10) = NULL
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ DECLARE @tbname sysname = ' [dbo].[View_质检明细] '
+ DECLARE @fieldkey sysname = 'QT_AID'
+ DECLARE @where nvarchar(4000)
+ DECLARE @fieldshow nvarchar(1000)
+ DECLARE @fieldOrder nvarchar(1000) = ' 检测时间 DESC, QT_AID DESC '
+
+ SET @where = ' (1=1) '
+
+ IF @质检类型 = '10'
+ SET @where = @where + ' AND (1=1) '
+ ELSE IF @质检类型 = '0'
+ SET @where = @where + ' AND 质检类型 = ''收检'' '
+ ELSE IF @质检类型 = '1'
+ SET @where = @where + ' AND 质检类型 = ''终检'' '
+ ELSE IF @质检类型 = '2'
+ SET @where = @where + ' AND 质检类型 = ''来料检验'' '
+ ELSE IF @质检类型 = '3'
+ SET @where = @where + ' AND 质检类型 = ''退库检验'' '
+
+ IF @订单号 <> '0'
+ SET @where = @where + ' AND 计划号 LIKE ''%' + @订单号 + '%'' '
+
+ --IF @合同号 <> '0'
+ -- SET @where = @where + ' AND 内部合同号 LIKE ''%' + @合同号 + '%'' '
+
+ IF @零件编码 <> '0'
+ SET @where = @where + ' AND 零件编码 LIKE ''%' + @零件编码 + '%'' '
+
+ IF @零件名称 <> '0'
+ SET @where = @where + ' AND 零件名称 LIKE ''%' + @零件名称 + '%'' '
+
+ IF @放行 = '1'
+ SET @where = @where + ' AND ISNULL(放行数量, 0) > 0 '
+ ELSE IF @放行 = '0'
+ SET @where = @where + ' AND ISNULL(放行数量, 0) <= 0 '
+
+ IF @开始日期 IS NOT NULL
+ SET @where = @where + ' AND 检测时间 >= ''' + CONVERT(nvarchar(30), @开始日期, 120) + ''' '
+
+ IF @结束日期 IS NOT NULL
+ SET @where = @where + ' AND 检测时间 <= ''' + CONVERT(nvarchar(30), @结束日期, 120) + ''' '
+
+ SET @fieldshow = '
+ [QT_AID]
+ ,[质检类型]
+ ,[零件编码]
+ ,[零件名称]
+ ,[内部合同号]
+ ,[计划号]
+ ,[工序名称]
+ ,[检验数量]
+ ,[合格数]
+ ,[不合格数]
+ ,[放行数量]
+ ,[检测人]
+ ,[检测时间]
+ ,[检测说明]
+ ,[工位名称]
+ ,[订单类型]'
+
+ EXEC [dbo].[sp_xt_pagesplit]
+ @tbname,
+ @fieldkey,
+ @where,
+ @fieldshow,
+ @fieldOrder,
+ @PageCurrent,
+ @PageSize,
+ @PageCount OUTPUT,
+ @ItemCount OUTPUT
+END
+GO
+
+ALTER PROCEDURE [dbo].[质量管理_质检明细_导出]
+ @质检类型 nvarchar(4000) = '10',
+ @开始日期 datetime = NULL,
+ @结束日期 datetime = NULL,
+ @订单号 nvarchar(4000) = '0',
+ @合同号 nvarchar(4000) = '0',
+ @零件编码 nvarchar(4000) = '0',
+ @零件名称 nvarchar(4000) = '0',
+ @放行 nvarchar(10) = NULL
+AS
+BEGIN
+ SET NOCOUNT ON;
+
+ SELECT '质检明细_' + REPLACE(REPLACE(REPLACE(CONVERT(NVARCHAR(19), GETDATE(), 21), ':', ''), '-', ''), ' ', '-') AS tablename, '15' AS tabletype
+
+ SELECT 256*12 AS 质检类型, 256*40 AS 零件编码, 256*20 AS 零件名称, 256*12 AS 内部合同号, 256*12 AS 计划号,
+ 256*15 AS 工序名称, 256*15 AS 检验数量, 256*10 AS 合格数, 256*25 AS 不合格数, 256*12 AS 放行数量,
+ 256*12 AS 检测人, 256*10 AS 工位名称, 256*20 AS 检测时间, 256*20 AS 检测说明
+
+ SELECT 0 AS 质检类型, 0 AS 零件编码, 0 AS 零件名称, 0 AS 内部合同号, 0 AS 计划号,
+ 0 AS 工序名称, 0 AS 检验数量, 0 AS 合格数, 0 AS 不合格数, 0 AS 放行数量,
+ 0 AS 检测人, 0 AS 工位名称, 0 AS 检测时间, 0 AS 检测说明
+
+ DECLARE @where nvarchar(max) = ' where '
+ DECLARE @selStr nvarchar(max) =
+ 'SELECT
+ [质检类型]
+ ,[零件编码]
+ ,[零件名称]
+ ,[内部合同号]
+ ,[计划号]
+ ,[工序名称]
+ ,[检验数量]
+ ,[合格数]
+ ,[不合格数]
+ ,[放行数量]
+ ,[检测人]
+ ,[工位名称]
+ ,[检测时间]
+ ,[检测说明]
+ FROM [dbo].[View_质检明细]'
+
+ IF @质检类型 = '10'
+ SET @where = @where + ' (1=1) '
+ ELSE IF @质检类型 = '0'
+ SET @where = @where + ' AND 质检类型 = ''收检'' '
+ ELSE IF @质检类型 = '1'
+ SET @where = @where + ' AND 质检类型 = ''终检'' '
+ ELSE IF @质检类型 = '2'
+ SET @where = @where + ' AND 质检类型 = ''来料检验'' '
+ ELSE IF @质检类型 = '3'
+ SET @where = @where + ' AND 质检类型 = ''退库检验'' '
+
+ IF @订单号 <> '0'
+ SET @where = @where + ' AND 计划号 LIKE ''%' + @订单号 + '%'' '
+
+ --IF @合同号 <> '0'
+ -- SET @where = @where + ' AND 内部合同号 LIKE ''%' + @合同号 + '%'' '
+
+ IF @零件编码 <> '0'
+ SET @where = @where + ' AND 零件编码 LIKE ''%' + @零件编码 + '%'' '
+
+ IF @零件名称 <> '0'
+ SET @where = @where + ' AND 零件名称 LIKE ''%' + @零件名称 + '%'' '
+
+ IF @放行 = '1'
+ SET @where = @where + ' AND ISNULL(放行数量, 0) > 0 '
+ ELSE IF @放行 = '0'
+ SET @where = @where + ' AND ISNULL(放行数量, 0) <= 0 '
+
+ IF @开始日期 IS NOT NULL
+ SET @where = @where + ' AND 检测时间 >= ''' + CONVERT(nvarchar(30), @开始日期, 120) + ''' '
+
+ IF @结束日期 IS NOT NULL
+ SET @where = @where + ' AND 检测时间 <= ''' + CONVERT(nvarchar(30), @结束日期, 120) + ''' '
+
+ SET @selStr = @selStr + @where + ' ORDER BY 检测时间 DESC'
+ EXEC sp_executesql @selStr
+END
+GO
diff --git a/src/views/PlanManagement/PlannOrderClose/index.vue b/src/views/PlanManagement/PlannOrderClose/index.vue
index 20fa61b..b7443e3 100644
--- a/src/views/PlanManagement/PlannOrderClose/index.vue
+++ b/src/views/PlanManagement/PlannOrderClose/index.vue
@@ -21,10 +21,13 @@