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 @@ 查询 + 批量确认 + 批量关闭
- + + @@ -77,6 +80,9 @@ export default { original: '', tableData: [], // 设备信息表 + multipleSelection: [], + batchConfirming: false, + batchClosing: false } }, @@ -84,7 +90,13 @@ export default { ...mapGetters([ 'id', 'token' - ]) + ]), + selectedConfirmRows() { + return this.multipleSelection.filter(row => this.isRowConfirmable(row)) + }, + selectedCloseRows() { + return this.multipleSelection.filter(row => this.isRowCloseSelectable(row)) + } }, created() { this.searchTable() @@ -105,35 +117,163 @@ export default { }) }, - handleDelete(row) { + isRowConfirmable(row) { + return row.确认状态 != 1 + }, + isRowCloseSelectable(row) { + return row.确认状态 == 1 && row.单据状态 !== '已关闭' + }, + isRowSelectable(row) { + return this.isRowConfirmable(row) || this.isRowCloseSelectable(row) + }, + handleSelectionChange(val) { + this.multipleSelection = val + }, + async confirmOrder(row) { + var param = [] + param[0] = ['订单号', row.订单编号] + var Data = this.CreateData('12', '计划排产_生产订单关闭_确认订单', param) + const response = await this.ExecDatabase(Data) + const result = response.data && response.data[0] ? response.data[0] : {} + if (String(result.result) === '1') { + return { success: true } + } + return { + success: false, + message: result.提示信息 || '确认失败' + } + }, + async closeOrder(row) { var param = [] param[0] = ['订单号', row.订单编号] var Data = this.CreateData('11', '计划排产_生产订单关闭_关闭订单', param) - this.ExecDatabase(Data).then(response => { - if (response.data[0].result === 1) { + const response = await this.ExecDatabase(Data) + const result = response.data && response.data[0] ? response.data[0] : {} + if (String(result.result) === '1') { + await patchB1('/ProductionOrders(' + row.订单编号 + ')', { + AbsoluteEntry: row.订单编号, + ProductionOrderStatus: 'boposClosed' + }) + return { success: true } + } + return { + success: false, + message: result.提示信息 || '关闭失败' + } + }, + async handleDelete(row) { + try { + const result = await this.closeOrder(row) + if (result.success) { this.$message.success('关闭成功') this.pageCurrent = 1 this.searchTable() - patchB1("/ProductionOrders("+row.订单编号+")",{ - "AbsoluteEntry": row.订单编号, - "ProductionOrderStatus": 'boposClosed', - }) } else { - this.$message.error(`${response.data[0].提示信息}`) + this.$message.error(result.message) } - }) + } catch (error) { + this.$message.error(error.message || '关闭失败') + } }, - handledo(row){ - var param = [] - param[0] = ['订单号', row.订单编号] - var Data = this.CreateData('12', '计划排产_生产订单关闭_确认订单', param) - this.ExecDatabase(Data).then(response => { - if (response.data[0].result === '1') { - this.$message.success('确认成功') - this.pageCurrent = 1 - this.searchTable() - } - }) + async handleBatchClose() { + const rows = this.selectedCloseRows + if (rows.length === 0) { + this.$message.warning('请选择可关闭的订单') + return + } + + const confirmResult = await this.$confirm(`确认批量关闭选中的 ${rows.length} 个订单吗?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).catch(() => false) + + if (!confirmResult) { + return + } + + this.batchClosing = true + const failedOrders = [] + for (const row of rows) { + try { + const result = await this.closeOrder(row) + if (!result.success) { + failedOrders.push(`${row.订单编号}:${result.message}`) + } + } catch (error) { + failedOrders.push(`${row.订单编号}:${error.message || '关闭失败'}`) + } + } + + this.batchClosing = false + this.multipleSelection = [] + this.pageCurrent = 1 + this.searchTable() + + const successCount = rows.length - failedOrders.length + if (failedOrders.length === 0) { + this.$message.success(`批量关闭成功,共 ${successCount} 个订单`) + return + } + + this.$message.warning(`批量关闭完成,成功 ${successCount} 个,失败 ${failedOrders.length} 个:${failedOrders.join(';')}`) + }, + async handledo(row){ + try { + const result = await this.confirmOrder(row) + if (result.success) { + this.$message.success('确认成功') + this.pageCurrent = 1 + this.searchTable() + } else { + this.$message.error(result.message) + } + } catch (error) { + this.$message.error(error.message || '确认失败') + } + }, + async handleBatchConfirm() { + const rows = this.selectedConfirmRows + if (rows.length === 0) { + this.$message.warning('请选择可确认的订单') + return + } + + const confirmResult = await this.$confirm(`确认批量确认选中的 ${rows.length} 个订单吗?`, '提示', { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + }).catch(() => false) + + if (!confirmResult) { + return + } + + this.batchConfirming = true + const failedOrders = [] + for (const row of rows) { + try { + const result = await this.confirmOrder(row) + if (!result.success) { + failedOrders.push(`${row.订单编号}:${result.message}`) + } + } catch (error) { + failedOrders.push(`${row.订单编号}:${error.message || '确认失败'}`) + } + } + + this.batchConfirming = false + this.multipleSelection = [] + this.pageCurrent = 1 + this.searchTable() + + const successCount = rows.length - failedOrders.length + if (failedOrders.length === 0) { + this.$message.success(`批量确认成功,共 ${successCount} 个订单`) + return + } + + this.$message.warning(`批量确认完成,成功 ${successCount} 个,失败 ${failedOrders.length} 个:${failedOrders.join(';')}`) }, handleSizeChanges(val) { this.pageCurrent = 1 @@ -147,4 +287,8 @@ export default { } } - + \ No newline at end of file diff --git a/src/views/ProcessManagement/ProcessInquiry/index.vue b/src/views/ProcessManagement/ProcessInquiry/index.vue index defbe1a..5981aac 100644 --- a/src/views/ProcessManagement/ProcessInquiry/index.vue +++ b/src/views/ProcessManagement/ProcessInquiry/index.vue @@ -142,10 +142,14 @@
-
+
物料编码 {{ printData.orderInfo.零件图号 }}
+
+ 原料编码 + {{ printData.orderInfo.原料编码 }} +
@@ -286,6 +290,18 @@ export default { if (!date) return '' return date.split(' ').length > 1 ? date.split(' ')[0] : date }, + + async getRawMaterialCodes(orderNo) { + const param = [] + param.push(['订单编号', orderNo]) + const Data = this.CreateData('11', '工艺管理_获取物料原料信息', param) + const response = await this.ExecDatabase(Data) + const rawMaterialCodes = (response.data || []) + .filter(element => element.U_MoType === '机加件' && element.子件编码) + .map(element => String(element.子件编码)) + + return Array.from(new Set(rawMaterialCodes)).join('、') + }, handleRowClick(row) { this.selectedRow = row @@ -351,7 +367,10 @@ export default { const response = await this.ExecDatabase(Data) if (response.data && response.data.length > 0) { - const orderInfo = response.data[0] + const orderInfo = { + ...response.data[0], + 原料编码: await this.getRawMaterialCodes(item.订单编号) + } const processList = [] // 为整个订单生成二维码 @@ -799,4 +818,4 @@ export default { height: auto !important; } } - \ No newline at end of file + diff --git a/src/views/ProductionManagement/AssemblyCenter/index.vue b/src/views/ProductionManagement/AssemblyCenter/index.vue index 1b51e02..f827e44 100644 --- a/src/views/ProductionManagement/AssemblyCenter/index.vue +++ b/src/views/ProductionManagement/AssemblyCenter/index.vue @@ -333,11 +333,11 @@
- 开始 + {{ workStartLoading ? '开始中...' : '开始' }}
\ No newline at end of file + diff --git a/src/views/ProductionManagement/FormalityConfirmReport/index.vue b/src/views/ProductionManagement/FormalityConfirmReport/index.vue new file mode 100644 index 0000000..3612659 --- /dev/null +++ b/src/views/ProductionManagement/FormalityConfirmReport/index.vue @@ -0,0 +1,290 @@ + + + + + diff --git a/src/views/ProductionManagement/ProductionPlanTrack/index.vue b/src/views/ProductionManagement/ProductionPlanTrack/index.vue index d36dc74..9c0fda1 100644 --- a/src/views/ProductionManagement/ProductionPlanTrack/index.vue +++ b/src/views/ProductionManagement/ProductionPlanTrack/index.vue @@ -148,7 +148,7 @@
- + + + + + diff --git a/src/views/QualityManagement/QualityDetails/index.vue b/src/views/QualityManagement/QualityDetails/index.vue index 0fe4d30..f27cfea 100644 --- a/src/views/QualityManagement/QualityDetails/index.vue +++ b/src/views/QualityManagement/QualityDetails/index.vue @@ -24,6 +24,17 @@ + 放行: + + + + + 质检日期起: +