diff --git a/db_backups/add_product_pass_rate_workstation_menu_20260630.sql b/db_backups/add_product_pass_rate_workstation_menu_20260630.sql new file mode 100644 index 0000000..14b05e3 --- /dev/null +++ b/db_backups/add_product_pass_rate_workstation_menu_20260630.sql @@ -0,0 +1,147 @@ +USE [YL_MESDB] +GO + +SET NOCOUNT ON; + +DECLARE @Title nvarchar(100) = N'产品合格率(工位)'; +DECLARE @Path nvarchar(300) = N'ProductPassRateWorkstation/index'; +DECLARE @Component nvarchar(300) = N'/ProductionManagement/ProductPassRateWorkstation/index'; +DECLARE @Name nvarchar(100) = N'ProductPassRateWorkstation'; +DECLARE @SourcePath nvarchar(300) = N'ProductionPlanTrack/index'; +DECLARE @SourceComponent nvarchar(300) = N'/ProductionManagement/ProductionPlanTrack/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.[账号代码], + COALESCE(prodParent.[id], src.[pid]) AS [pid], + src.[icon], + src.[AddData], + src.[DeleteData], + src.[EditData], + src.[SearchData] + FROM [dbo].[登录基础数据_二级菜单] AS src + OUTER APPLY + ( + SELECT TOP (1) rp.[id] + FROM [dbo].[登录基础数据_二级菜单] AS rp + WHERE rp.[账号代码] = src.[账号代码] + AND rp.[是否启用] = 1 + AND rp.[title] = N'生产管理' + ORDER BY rp.[id] + ) AS prodParent + 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].[登录基础数据_二级菜单] AS 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], [账号代码], [是否启用], [AddData], [DeleteData], [EditData], [SearchData]) + SELECT + [pid], + @Path, + @Component, + NULL, + @Name, + @Title, + [icon], + [账号代码], + 1, + [AddData], + [DeleteData], + [EditData], + [SearchData] + FROM SourceRows; +END +ELSE +BEGIN + ;WITH SourceRows AS + ( + SELECT + ROW_NUMBER() OVER (ORDER BY src.[账号代码], src.[id]) AS rn, + src.[账号代码], + COALESCE(prodParent.[id], src.[pid]) AS [pid], + src.[icon], + src.[AddData], + src.[DeleteData], + src.[EditData], + src.[SearchData] + FROM [dbo].[登录基础数据_二级菜单] AS src + OUTER APPLY + ( + SELECT TOP (1) rp.[id] + FROM [dbo].[登录基础数据_二级菜单] AS rp + WHERE rp.[账号代码] = src.[账号代码] + AND rp.[是否启用] = 1 + AND rp.[title] = N'生产管理' + ORDER BY rp.[id] + ) AS prodParent + 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].[登录基础数据_二级菜单] AS 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], [账号代码], [是否启用], [AddData], [DeleteData], [EditData], [SearchData]) + SELECT + BaseId.maxId + SourceRows.rn, + SourceRows.[pid], + @Path, + @Component, + NULL, + @Name, + @Title, + SourceRows.[icon], + SourceRows.[账号代码], + 1, + SourceRows.[AddData], + SourceRows.[DeleteData], + SourceRows.[EditData], + SourceRows.[SearchData] + 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 OR [path] = @Path; + +SELECT [id], [pid], [path], [componet], [name], [title], [icon], [账号代码], [是否启用], [SearchData] +FROM [dbo].[登录基础数据_二级菜单] +WHERE [path] = @Path OR [componet] = @Component OR [title] = @Title +ORDER BY [账号代码], [id]; + diff --git a/db_backups/create_product_pass_rate_workstation_20260630.sql b/db_backups/create_product_pass_rate_workstation_20260630.sql new file mode 100644 index 0000000..ae3ec7c --- /dev/null +++ b/db_backups/create_product_pass_rate_workstation_20260630.sql @@ -0,0 +1,172 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +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(200) = N'', + @物料名称 nvarchar(200) = N'', + @关闭日期_Start nvarchar(50) = N'', + @关闭日期_End nvarchar(50) = N'', + @工序 nvarchar(100) = N'', + @工位 nvarchar(100) = N'', + @合格状态 nvarchar(20) = N'不合格' +AS +BEGIN + SET NOCOUNT ON; + + DECLARE @开始日期 date = TRY_CONVERT(date, NULLIF(@关闭日期_Start, N'')); + DECLARE @结束日期 date = TRY_CONVERT(date, NULLIF(@关闭日期_End, N'')); + + IF @开始日期 IS NULL AND @结束日期 IS NULL AND @生产订单号 = N'' + BEGIN + SET @开始日期 = DATEADD(day, -30, CONVERT(date, GETDATE())); + SET @结束日期 = CONVERT(date, GETDATE()); + END; + + CREATE TABLE #已关闭订单 + ( + [生产订单号] nvarchar(100) NOT NULL PRIMARY KEY, + [关闭日期] datetime NULL, + [物料名称] nvarchar(200) NULL, + [物料编码] nvarchar(50) NULL, + [计划数量] decimal(18, 4) NULL + ); + + DECLARE @SapSql nvarchar(max) = + N'SELECT 生产订单号, 实际结算日期, 产品名称, 产品编码, 产品计划数量, 单据状态 FROM SBO_YL.dbo.UBT_OWOR WHERE 单据状态 IS NOT NULL'; + + IF @生产订单号 <> N'' + SET @SapSql += N' AND 生产订单号 = ''' + REPLACE(@生产订单号, N'''', N'''''') + N''''; + + IF @开始日期 IS NOT NULL + SET @SapSql += N' AND 实际结算日期 >= ''' + CONVERT(nvarchar(10), @开始日期, 120) + N''''; + + IF @结束日期 IS NOT NULL + SET @SapSql += N' AND 实际结算日期 < ''' + CONVERT(nvarchar(10), DATEADD(day, 1, @结束日期), 120) + N''''; + + DECLARE @OpenQuerySql nvarchar(max) = + N'INSERT INTO #已关闭订单 + ([生产订单号], [关闭日期], [物料名称], [物料编码], [计划数量]) + SELECT CONVERT(nvarchar(100), [生产订单号]) AS [生产订单号], + [实际结算日期] AS [关闭日期], + [产品名称] AS [物料名称], + [产品编码] AS [物料编码], + CAST(ISNULL([产品计划数量], 0) AS decimal(18, 4)) AS [计划数量] + FROM OPENQUERY([SAP], ''' + REPLACE(@SapSql, N'''', N'''''') + N''') + WHERE (@物料编码 = N'''' OR [产品编码] LIKE N''%'' + @物料编码 + N''%'') + AND (@物料名称 = N'''' OR [产品名称] LIKE N''%'' + @物料名称 + N''%'')'; + + EXEC sp_executesql + @OpenQuerySql, + N'@物料编码 nvarchar(200), @物料名称 nvarchar(200)', + @物料编码 = @物料编码, + @物料名称 = @物料名称; + + CREATE TABLE #明细汇总 + ( + [生产订单号] nvarchar(100) NOT NULL, + [工序号] int NULL, + [工序] nvarchar(200) NOT NULL, + [工位] nvarchar(200) NOT NULL, + [完成数量] decimal(18, 4) NOT NULL, + [不良数量] decimal(18, 4) NOT NULL, + [合格率] decimal(18, 2) NULL, + [检测说明] nvarchar(max) NULL + ); + + ;WITH 明细基础 AS + ( + SELECT + o.[生产订单号], + COALESCE(t.[订单行号], q.[行号]) AS [工序号], + COALESCE(NULLIF(q.[工序名称], N''), NULLIF(t.[工序名称], N''), N'') AS [工序], + COALESCE(NULLIF(q.[工位名称], N''), NULLIF(t.[指派对象], N''), N'空白') AS [工位], + CAST(ISNULL(q.[检验数量], ISNULL(q.[合格数], 0) + ISNULL(q.[不合格数], 0)) AS decimal(18, 4)) AS [完成数量], + CAST(ISNULL(q.[不合格数], 0) AS decimal(18, 4)) AS [不良数量], + NULLIF(LTRIM(RTRIM(CONVERT(nvarchar(max), q.[检测说明]))), N'') AS [检测说明] + FROM #已关闭订单 AS o + INNER JOIN [dbo].[YL_质量检验_质检记录] AS q + ON CONVERT(nvarchar(100), q.[计划号]) = o.[生产订单号] + LEFT JOIN [dbo].[MES_接口_生产计划_生产任务] AS t + ON q.[TaskAID] = t.[AID] + WHERE q.[质检类型] = N'收检' + AND (@工序 = N'' OR COALESCE(NULLIF(q.[工序名称], N''), NULLIF(t.[工序名称], N''), N'') LIKE N'%' + @工序 + N'%') + AND (@工位 = N'' OR COALESCE(NULLIF(q.[工位名称], N''), NULLIF(t.[指派对象], N''), N'空白') LIKE N'%' + @工位 + N'%') + ) + INSERT INTO #明细汇总 + ([生产订单号], [工序号], [工序], [工位], [完成数量], [不良数量], [合格率], [检测说明]) + SELECT + [生产订单号], + [工序号], + [工序], + [工位], + SUM([完成数量]) AS [完成数量], + SUM([不良数量]) AS [不良数量], + CAST( + CASE + WHEN SUM([完成数量]) = 0 THEN NULL + ELSE (SUM([完成数量]) - SUM([不良数量])) * 100.0 / SUM([完成数量]) + END AS decimal(18, 2) + ) AS [合格率], + STRING_AGG(CONVERT(nvarchar(max), [检测说明]), N';') AS [检测说明] + FROM 明细基础 + GROUP BY [生产订单号], [工序号], [工序], [工位]; + + ;WITH 一级汇总 AS + ( + SELECT + [生产订单号], + SUM([完成数量]) AS [完成数量], + SUM([不良数量]) AS [不良数量], + CAST( + CASE + WHEN SUM([完成数量]) = 0 THEN NULL + ELSE (SUM([完成数量]) - SUM([不良数量])) * 100.0 / SUM([完成数量]) + END AS decimal(18, 2) + ) AS [合格率] + FROM #明细汇总 + GROUP BY [生产订单号] + ) + SELECT + o.[关闭日期], + o.[生产订单号], + o.[物料名称], + o.[物料编码], + o.[计划数量], + a.[完成数量], + a.[不良数量], + a.[合格率], + ( + SELECT + d.[工序], + d.[工序号], + d.[工位], + d.[完成数量], + d.[不良数量], + d.[合格率], + ISNULL(d.[检测说明], N'') AS [检测说明] + FROM #明细汇总 AS d + WHERE d.[生产订单号] = o.[生产订单号] + ORDER BY d.[工序号], d.[工序], d.[工位] + FOR JSON PATH + ) AS [明细JSON] + FROM #已关闭订单 AS o + INNER JOIN 一级汇总 AS a + ON o.[生产订单号] = a.[生产订单号] + WHERE (@合格状态 = N'' OR @合格状态 = N'全部' + OR (@合格状态 = N'合格' AND ISNULL(a.[合格率], 0) >= 100) + OR (@合格状态 = N'不合格' AND ISNULL(a.[合格率], 0) < 100)) + ORDER BY o.[关闭日期] DESC, TRY_CONVERT(int, o.[生产订单号]) DESC, o.[生产订单号] DESC; +END +GO diff --git a/db_backups/update_plan_order_close_no_work_hours_20260630.sql b/db_backups/update_plan_order_close_no_work_hours_20260630.sql new file mode 100644 index 0000000..f6a0e56 --- /dev/null +++ b/db_backups/update_plan_order_close_no_work_hours_20260630.sql @@ -0,0 +1,188 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO +SET QUOTED_IDENTIFIER ON +GO + +/* + 2026-06-30 + 生产订单关闭查询:可关闭订单补充“无工时但满足其他可关闭条件”的特殊情况。 + + 规则: + 1. 有工时订单:继续要求 View_生产工时视图 中所有工时记录已校验。 + 2. 无工时订单:必须在 MES_接口_生产计划 中存在,且 View_生产工时视图 中没有任何工时记录。 + 3. 无工时订单不做工时全部校验,但仍必须满足原有可关闭条件: + - 单据状态为空; + - 终检/收检/计划数量/入库数量满足原过程 HAVING 条件; + - 入库数量等于终检合格数。 +*/ +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 + 计划号, + 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 + 订单编号, + 产品名称, + 产品编码, + 入库数量, + 合同号, + 终检不合格数合计, + 终检合格数合计, + 计划数量, + 确认状态, + 单据状态, + 不合格数合计, + 是否全部校验 + FROM 可关闭订单 + ORDER BY 订单编号; + + RETURN; + END + + 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 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/update_timely_kit_tracking_result_inventory_20260630.sql b/db_backups/update_timely_kit_tracking_result_inventory_20260630.sql new file mode 100644 index 0000000..c0aa6d6 --- /dev/null +++ b/db_backups/update_timely_kit_tracking_result_inventory_20260630.sql @@ -0,0 +1,409 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL +BEGIN + EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END'); +END +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] + @订单号 int = 0, + @物料类型 nvarchar(50) = N'', + @合同号 nvarchar(50) = N'', + @产品编码 nvarchar(50) = N'', + @产品名称 nvarchar(50) = N'', + @工序名称 nvarchar(50) = N'', + @计划开始 nvarchar(50) = N'', + @计划完成 nvarchar(50) = N'', + @排产状态 nvarchar(50) = N'全部', + @指派对象 nvarchar(50) = N'全部', + @计划号 nvarchar(50) = N'', + @发货状态 nvarchar(50) = N'全部', + @齐套 nvarchar(50) = N'全部', + @检验状态 nvarchar(50) = N'', + @发料状态 nvarchar(50) = N'全部', + @自制件属性 nvarchar(50) = N'全部' +AS +BEGIN + SET NOCOUNT ON; + + ;WITH SAP缺件源 AS ( + SELECT + s.DocEntry, + s.Project COLLATE DATABASE_DEFAULT AS Project, + s.[行号], + s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode, + s.U_Name COLLATE DATABASE_DEFAULT AS U_Name, + ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性, + ISNULL(s.[未发货数量], 0) AS 未发货数量, + ISNULL(s.[库存量], 0) AS 库存数量, + ISNULL(s.[在制采购], 0) AS 在制采购, + s.[采购预计交货日期], + ISNULL(s.[采购未清数量], 0) AS 采购未清数量, + ISNULL(s.[到货草稿], 0) AS 到货草稿 + FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s + WHERE ISNULL(s.[未发货数量], 0) > 0 + ), + SAP缺件 AS ( + SELECT TOP (2000) + src.* + FROM ( + SELECT + SAP缺件源.*, + ROW_NUMBER() OVER ( + PARTITION BY + SAP缺件源.DocEntry, + SAP缺件源.Project, + SAP缺件源.ItemCode, + SAP缺件源.属性 + ORDER BY + SAP缺件源.[未发货数量] DESC, + SAP缺件源.[行号] + ) AS rn + FROM SAP缺件源 + ) AS src + WHERE src.rn = 1 + ), + 查询结果 AS ( + SELECT + ISNULL(v.[计划号], N'') AS [计划号], + ISNULL(v.[合同号], N'') AS [合同号], + v.[订单编号] AS [订单号], + v.[物料编号] AS [产品编码], + v.[物料描述] AS [产品名称], + v.[计划数量订单], + v.[入库数量], + v.[计划完成] AS [要求完工日期], + v.[要求发货日期], + CASE + WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货' + ELSE N'未发货' + END AS [发货状态], + CASE + WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是' + ELSE N'否' + END AS [齐套], + CASE + WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配' + ELSE N'未拣配' + END AS [拣配状态], + CASE + WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套' + WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件' + ELSE N'未发料' + END AS [发料状态], + CASE + WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工' + ELSE N'待执行' + END AS [装配开工], + v.[完成数量], + CASE + WHEN final_check.[计划号] IS NOT NULL THEN N'是' + ELSE N'否' + END AS [终检], + CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺], + CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态], + ISNULL(v.[自制件属性], N'') AS [自制件属性], + v.[计划开始时间] AS [预计齐套时间], + sap.ItemCode AS [缺件物料编码], + sap.U_Name AS [缺件物料名称], + sap.[未发货数量] AS [缺件数量], + sap.[库存数量] AS [库存数量], + CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性], + CASE + WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[到货草稿], 0)), N'') + ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'') + END AS [缺件生产订单号], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度], + CASE + WHEN sap.[属性] = N'' THEN + N'未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) + + N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) + + N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成') + ELSE ISNULL(route.[工艺路线], N'') + END AS [工艺路线], + CASE + WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期] + ELSE route.[预计完成时间] + END AS [预计完成时间], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细], + sap.[采购未清数量], + sap.[到货草稿], + ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态], + sap.DocEntry AS [SAP单据], + sap.[行号] AS [SAP行号] + FROM SAP缺件 AS sap + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] = sap.DocEntry + ORDER BY m.[订单行号] + ) AS v + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] <> v.[订单编号] + AND ( + (sap.[属性] = N'机加件' AND m.[物料编号] = sap.ItemCode) + OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N'')) + ) + ORDER BY m.[订单编号] DESC, m.[订单行号] + ) AS detail_order + OUTER APPLY ( + SELECT TOP (1) q.[计划号] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[质检类型] = N'终检' + AND q.[计划号] = v.[订单编号] + ) AS final_check + OUTER APPLY ( + SELECT + MAX(p.[计划完成时间]) AS [预计完成时间], + STUFF(( + SELECT N'、' + p2.[工序名称] + + CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END + FROM [dbo].[View_生产订单_MES] AS p2 + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR XML PATH(N''), TYPE + ).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线], + ( + SELECT + p2.[订单行号], + p2.[工序名称], + p2.[指派对象], + p2.[计划开始时间], + p2.[计划完成时间], + ISNULL(p2.[进度], 0) AS [进度], + ISNULL(p2.[完成数量], 0) AS [完成数量], + ISNULL(p2.[收料数量], 0) AS [收料数量], + ISNULL(p2.[加工状态], 0) AS [加工状态], + p2.[开工时间], + ISNULL(check_qty.[收检合格数], 0) AS [收检合格数], + ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数] + FROM [dbo].[View_生产订单_MES] AS p2 + OUTER APPLY ( + SELECT + SUM(ISNULL(q.[合格数], 0)) AS [收检合格数], + SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[TaskAID] = p2.[TaskAID] + AND q.[质检类型] = N'收检' + ) AS check_qty + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR JSON PATH + ) AS [工艺路线明细] + FROM [dbo].[View_生产订单_MES] AS p + WHERE p.[订单编号] = detail_order.[订单编号] + AND p.[物料类型] = N'pit_Resource' + ) AS route + OUTER APPLY ( + SELECT TOP (1) + pending.[订单行号], + pending.[工序名称], + pending.[加工状态], + pending.[进度], + pending.[完成数量], + pending.[计划数量], + pending.[开工时间] + FROM [dbo].[View_生产订单_MES] AS pending + WHERE pending.[订单编号] = detail_order.[订单编号] + AND pending.[物料类型] = N'pit_Resource' + AND NOT ( + ISNULL(pending.[进度], 0) >= 100 + OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0)) + ) + ORDER BY pending.[订单行号] + ) AS pending + OUTER APPLY ( + SELECT TOP (1) prev.[工序名称] + FROM [dbo].[View_生产订单_MES] AS prev + WHERE prev.[订单编号] = detail_order.[订单编号] + AND prev.[物料类型] = N'pit_Resource' + AND prev.[订单行号] < pending.[订单行号] + ORDER BY prev.[订单行号] DESC + ) AS prev_step + OUTER APPLY ( + SELECT TOP (1) last_step.[工序名称] + FROM [dbo].[View_生产订单_MES] AS last_step + WHERE last_step.[订单编号] = detail_order.[订单编号] + AND last_step.[物料类型] = N'pit_Resource' + ORDER BY last_step.[订单行号] DESC + ) AS last_step + OUTER APPLY ( + SELECT + CASE + WHEN detail_order.[订单编号] IS NULL THEN N'' + WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕' + WHEN ISNULL(pending.[进度], 0) > 0 + OR ISNULL(pending.[完成数量], 0) > 0 + OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6) + OR pending.[开工时间] > '1900-01-01' + THEN ISNULL(pending.[工序名称], N'') + N'中' + WHEN prev_step.[工序名称] IS NULL THEN N'' + ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'') + END AS [当前序] + ) AS current_step + OUTER APPLY ( + SELECT + CASE + WHEN sap.[属性] <> N'' THEN N'' + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ISNULL(task.[入库数量], 0) > 0 + ) + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ( + ISNULL(task.[入库数量], 0) <= 0 + OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0) + ) + ) THEN N'已完成' + ELSE N'未完成' + END AS [质检状态] + ) AS purchase_check + WHERE + v.[订单编号] IS NOT NULL + AND (@订单号 <= 0 OR v.[订单编号] = @订单号) + AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号) + AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%') + AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%') + AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%') + AND (@工序名称 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS fp + WHERE fp.[订单编号] = v.[订单编号] + AND fp.[工序名称] = @工序名称 + )) + AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始)) + AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成)) + AND (@排产状态 = N'全部' OR @排产状态 = N'' OR + (@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR + (@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0) + ) + AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS ap + WHERE ap.[订单编号] = v.[订单编号] + AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N',')) + )) + AND (@发货状态 = N'全部' OR @发货状态 = N'' OR + (@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR + (@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1') + ) + AND (@齐套 = N'全部' OR @齐套 = N'' OR + (@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR + (@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1) + ) + AND (@发料状态 = N'全部' OR @发料状态 = N'' OR + (@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR + (@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR + (@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2')) + ) + AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR + (@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR + (@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%')) + ) + AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态)) + ) + SELECT TOP (1000) + [计划号], + [合同号], + [订单号], + [产品编码], + [产品名称], + [计划数量订单], + [入库数量], + [要求完工日期], + [要求发货日期], + [发货状态], + [齐套], + [拣配状态], + [发料状态], + [装配开工], + [完成数量], + [终检], + [生产工艺], + [排产状态], + [自制件属性], + [预计齐套时间], + [缺件物料编码], + [缺件物料名称], + [缺件数量], + [库存数量], + [缺件属性], + [缺件生产订单号], + [进度], + [工艺路线], + [预计完成时间], + [工艺路线明细], + [采购未清数量], + [到货草稿], + [质检状态], + [SAP单据], + [SAP行号] + FROM ( + SELECT + 查询结果.*, + ROW_NUMBER() OVER ( + PARTITION BY + [订单号], + CASE + WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号] + ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号]) + END + ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号] + ) AS rn + FROM 查询结果 + ) AS dedup + WHERE rn = 1 + ORDER BY + [预计齐套时间], + [订单号], + [缺件生产订单号], + [缺件物料编码]; +END +GO diff --git a/db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql b/db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql new file mode 100644 index 0000000..5363c03 --- /dev/null +++ b/db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql @@ -0,0 +1,423 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL +BEGIN + EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END'); +END +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] + @订单号 int = 0, + @物料类型 nvarchar(50) = N'', + @合同号 nvarchar(50) = N'', + @产品编码 nvarchar(50) = N'', + @产品名称 nvarchar(50) = N'', + @工序名称 nvarchar(50) = N'', + @计划开始 nvarchar(50) = N'', + @计划完成 nvarchar(50) = N'', + @排产状态 nvarchar(50) = N'全部', + @指派对象 nvarchar(50) = N'全部', + @计划号 nvarchar(50) = N'', + @发货状态 nvarchar(50) = N'全部', + @齐套 nvarchar(50) = N'全部', + @检验状态 nvarchar(50) = N'', + @发料状态 nvarchar(50) = N'全部', + @自制件属性 nvarchar(50) = N'全部' +AS +BEGIN + SET NOCOUNT ON; + + ;WITH SAP缺件源 AS ( + SELECT + s.DocEntry, + s.Project COLLATE DATABASE_DEFAULT AS Project, + s.[行号], + s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode, + s.U_Name COLLATE DATABASE_DEFAULT AS U_Name, + ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性, + ISNULL(s.[未发货数量], 0) AS 未发货数量, + ISNULL(s.[库存量], 0) AS 库存数量, + ISNULL(s.[在制采购], 0) AS 在制采购, + ISNULL(s.DocNum, 0) AS DocNum, + s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员, + s.[采购预计交货日期], + ISNULL(s.[采购未清数量], 0) AS 采购未清数量, + ISNULL(s.[到货草稿], 0) AS 到货草稿 + FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s + WHERE ISNULL(s.[未发货数量], 0) > 0 + ), + SAP缺件 AS ( + SELECT TOP (2000) + src.* + FROM ( + SELECT + SAP缺件源.*, + ROW_NUMBER() OVER ( + PARTITION BY + SAP缺件源.DocEntry, + SAP缺件源.Project, + SAP缺件源.ItemCode, + SAP缺件源.属性 + ORDER BY + SAP缺件源.[未发货数量] DESC, + SAP缺件源.[行号] + ) AS rn + FROM SAP缺件源 + ) AS src + WHERE src.rn = 1 + ), + 查询结果 AS ( + SELECT + ISNULL(v.[计划号], N'') AS [计划号], + ISNULL(v.[合同号], N'') AS [合同号], + v.[订单编号] AS [订单号], + v.[物料编号] AS [产品编码], + v.[物料描述] AS [产品名称], + v.[计划数量订单], + v.[入库数量], + v.[计划完成] AS [要求完工日期], + v.[要求发货日期], + CASE + WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货' + ELSE N'未发货' + END AS [发货状态], + CASE + WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是' + ELSE N'否' + END AS [齐套], + CASE + WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配' + ELSE N'未拣配' + END AS [拣配状态], + CASE + WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套' + WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件' + ELSE N'未发料' + END AS [发料状态], + CASE + WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工' + ELSE N'待执行' + END AS [装配开工], + v.[完成数量], + CASE + WHEN final_check.[计划号] IS NOT NULL THEN N'是' + ELSE N'否' + END AS [终检], + CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺], + CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态], + ISNULL(v.[自制件属性], N'') AS [自制件属性], + v.[计划开始时间] AS [预计齐套时间], + sap.ItemCode AS [缺件物料编码], + sap.U_Name AS [缺件物料名称], + sap.[未发货数量] AS [缺件数量], + sap.[库存数量] AS [库存数量], + CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性], + CASE + WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[在制采购], 0)), N'') + ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'') + END AS [缺件生产订单号], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度], + CASE + WHEN sap.[属性] = N'' THEN + N'采购员:' + ISNULL(NULLIF(sap.[采购员], N''), N'-') + + N' / 未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) + + N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) + + N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成') + ELSE ISNULL(route.[工艺路线], N'') + END AS [工艺路线], + CASE + WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期] + ELSE route.[预计完成时间] + END AS [预计完成时间], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细], + sap.[采购未清数量], + sap.[到货草稿], + ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态], + sap.DocEntry AS [SAP单据], + sap.[行号] AS [SAP行号] + FROM SAP缺件 AS sap + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] = sap.DocEntry + ORDER BY m.[订单行号] + ) AS v + OUTER APPLY ( + SELECT m.* + FROM ( + SELECT + m.*, + ROW_NUMBER() OVER ( + PARTITION BY m.[订单编号] + ORDER BY m.[订单行号] + ) AS rn + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] <> v.[订单编号] + AND ( + (sap.[属性] = N'机加件' AND ( + m.[物料编号] = sap.ItemCode + OR (sap.DocNum > 0 AND m.[订单编号] = sap.DocNum) + )) + OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N'')) + ) + ) AS m + WHERE m.rn = 1 + ) AS detail_order + OUTER APPLY ( + SELECT TOP (1) q.[计划号] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[质检类型] = N'终检' + AND q.[计划号] = v.[订单编号] + ) AS final_check + OUTER APPLY ( + SELECT + MAX(p.[计划完成时间]) AS [预计完成时间], + STUFF(( + SELECT N'、' + p2.[工序名称] + + CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END + FROM [dbo].[View_生产订单_MES] AS p2 + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR XML PATH(N''), TYPE + ).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线], + ( + SELECT + p2.[订单行号], + p2.[工序名称], + p2.[指派对象], + p2.[计划开始时间], + p2.[计划完成时间], + ISNULL(p2.[进度], 0) AS [进度], + ISNULL(p2.[完成数量], 0) AS [完成数量], + ISNULL(p2.[收料数量], 0) AS [收料数量], + ISNULL(p2.[加工状态], 0) AS [加工状态], + p2.[开工时间], + ISNULL(check_qty.[收检合格数], 0) AS [收检合格数], + ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数] + FROM [dbo].[View_生产订单_MES] AS p2 + OUTER APPLY ( + SELECT + SUM(ISNULL(q.[合格数], 0)) AS [收检合格数], + SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[TaskAID] = p2.[TaskAID] + AND q.[质检类型] = N'收检' + ) AS check_qty + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR JSON PATH + ) AS [工艺路线明细] + FROM [dbo].[View_生产订单_MES] AS p + WHERE p.[订单编号] = detail_order.[订单编号] + AND p.[物料类型] = N'pit_Resource' + ) AS route + OUTER APPLY ( + SELECT TOP (1) + pending.[订单行号], + pending.[工序名称], + pending.[加工状态], + pending.[进度], + pending.[完成数量], + pending.[计划数量], + pending.[开工时间] + FROM [dbo].[View_生产订单_MES] AS pending + WHERE pending.[订单编号] = detail_order.[订单编号] + AND pending.[物料类型] = N'pit_Resource' + AND NOT ( + ISNULL(pending.[进度], 0) >= 100 + OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0)) + ) + ORDER BY pending.[订单行号] + ) AS pending + OUTER APPLY ( + SELECT TOP (1) prev.[工序名称] + FROM [dbo].[View_生产订单_MES] AS prev + WHERE prev.[订单编号] = detail_order.[订单编号] + AND prev.[物料类型] = N'pit_Resource' + AND prev.[订单行号] < pending.[订单行号] + ORDER BY prev.[订单行号] DESC + ) AS prev_step + OUTER APPLY ( + SELECT TOP (1) last_step.[工序名称] + FROM [dbo].[View_生产订单_MES] AS last_step + WHERE last_step.[订单编号] = detail_order.[订单编号] + AND last_step.[物料类型] = N'pit_Resource' + ORDER BY last_step.[订单行号] DESC + ) AS last_step + OUTER APPLY ( + SELECT + CASE + WHEN detail_order.[订单编号] IS NULL THEN N'' + WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕' + WHEN ISNULL(pending.[进度], 0) > 0 + OR ISNULL(pending.[完成数量], 0) > 0 + OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6) + OR pending.[开工时间] > '1900-01-01' + THEN ISNULL(pending.[工序名称], N'') + N'中' + WHEN prev_step.[工序名称] IS NULL THEN N'' + ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'') + END AS [当前序] + ) AS current_step + OUTER APPLY ( + SELECT + CASE + WHEN sap.[属性] <> N'' THEN N'' + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ISNULL(task.[入库数量], 0) > 0 + ) + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ( + ISNULL(task.[入库数量], 0) <= 0 + OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0) + ) + ) THEN N'已完成' + ELSE N'未完成' + END AS [质检状态] + ) AS purchase_check + WHERE + v.[订单编号] IS NOT NULL + AND (@订单号 <= 0 OR v.[订单编号] = @订单号) + AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号) + AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%') + AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%') + AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%') + AND (@工序名称 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS fp + WHERE fp.[订单编号] = v.[订单编号] + AND fp.[工序名称] = @工序名称 + )) + AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始)) + AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成)) + AND (@排产状态 = N'全部' OR @排产状态 = N'' OR + (@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR + (@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0) + ) + AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS ap + WHERE ap.[订单编号] = v.[订单编号] + AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N',')) + )) + AND (@发货状态 = N'全部' OR @发货状态 = N'' OR + (@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR + (@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1') + ) + AND (@齐套 = N'全部' OR @齐套 = N'' OR + (@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR + (@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1) + ) + AND (@发料状态 = N'全部' OR @发料状态 = N'' OR + (@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR + (@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR + (@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2')) + ) + AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR + (@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR + (@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%')) + ) + AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态)) + ) + SELECT TOP (1000) + [计划号], + [合同号], + [订单号], + [产品编码], + [产品名称], + [计划数量订单], + [入库数量], + [要求完工日期], + [要求发货日期], + [发货状态], + [齐套], + [拣配状态], + [发料状态], + [装配开工], + [完成数量], + [终检], + [生产工艺], + [排产状态], + [自制件属性], + [预计齐套时间], + [缺件物料编码], + [缺件物料名称], + [缺件数量], + [库存数量], + [缺件属性], + [缺件生产订单号], + [进度], + [工艺路线], + [预计完成时间], + [工艺路线明细], + [采购未清数量], + [到货草稿], + [质检状态], + [SAP单据], + [SAP行号] + FROM ( + SELECT + 查询结果.*, + ROW_NUMBER() OVER ( + PARTITION BY + [订单号], + CASE + WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号] + ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号]) + END + ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号] + ) AS rn + FROM 查询结果 + ) AS dedup + WHERE rn = 1 + ORDER BY + [预计齐套时间], + [订单号], + [缺件生产订单号], + [缺件物料编码]; +END +GO diff --git a/db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql b/db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql new file mode 100644 index 0000000..6dd18bc --- /dev/null +++ b/db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql @@ -0,0 +1,418 @@ +USE [YL_MESDB] +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +IF OBJECT_ID(N'dbo.生产管理_及时齐套跟踪结果_查询', N'P') IS NULL +BEGIN + EXEC(N'CREATE PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] AS BEGIN SET NOCOUNT ON; END'); +END +GO + +SET ANSI_NULLS ON +GO + +SET QUOTED_IDENTIFIER ON +GO + +ALTER PROCEDURE [dbo].[生产管理_及时齐套跟踪结果_查询] + @订单号 int = 0, + @物料类型 nvarchar(50) = N'', + @合同号 nvarchar(50) = N'', + @产品编码 nvarchar(50) = N'', + @产品名称 nvarchar(50) = N'', + @工序名称 nvarchar(50) = N'', + @计划开始 nvarchar(50) = N'', + @计划完成 nvarchar(50) = N'', + @排产状态 nvarchar(50) = N'全部', + @指派对象 nvarchar(50) = N'全部', + @计划号 nvarchar(50) = N'', + @发货状态 nvarchar(50) = N'全部', + @齐套 nvarchar(50) = N'全部', + @检验状态 nvarchar(50) = N'', + @发料状态 nvarchar(50) = N'全部', + @自制件属性 nvarchar(50) = N'全部' +AS +BEGIN + SET NOCOUNT ON; + + ;WITH SAP缺件源 AS ( + SELECT + s.DocEntry, + s.Project COLLATE DATABASE_DEFAULT AS Project, + s.[行号], + s.ItemCode COLLATE DATABASE_DEFAULT AS ItemCode, + s.U_Name COLLATE DATABASE_DEFAULT AS U_Name, + ISNULL(s.[属性] COLLATE DATABASE_DEFAULT, N'') AS 属性, + ISNULL(s.[未发货数量], 0) AS 未发货数量, + ISNULL(s.[库存量], 0) AS 库存数量, + ISNULL(s.[在制采购], 0) AS 在制采购, + ISNULL(s.DocNum, 0) AS DocNum, + s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员, + s.[采购预计交货日期], + ISNULL(s.[采购未清数量], 0) AS 采购未清数量, + ISNULL(s.[到货草稿], 0) AS 到货草稿 + FROM [SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc] AS s + WHERE ISNULL(s.[未发货数量], 0) > 0 + ), + SAP缺件 AS ( + SELECT TOP (2000) + src.* + FROM ( + SELECT + SAP缺件源.*, + ROW_NUMBER() OVER ( + PARTITION BY + SAP缺件源.DocEntry, + SAP缺件源.Project, + SAP缺件源.ItemCode, + SAP缺件源.属性 + ORDER BY + SAP缺件源.[未发货数量] DESC, + SAP缺件源.[行号] + ) AS rn + FROM SAP缺件源 + ) AS src + WHERE src.rn = 1 + ), + 查询结果 AS ( + SELECT + ISNULL(v.[计划号], N'') AS [计划号], + ISNULL(v.[合同号], N'') AS [合同号], + v.[订单编号] AS [订单号], + v.[物料编号] AS [产品编码], + v.[物料描述] AS [产品名称], + v.[计划数量订单], + v.[入库数量], + v.[计划完成] AS [要求完工日期], + v.[要求发货日期], + CASE + WHEN ISNULL(v.[发货状态], 0) = 1 THEN N'已发货' + ELSE N'未发货' + END AS [发货状态], + CASE + WHEN ISNULL(v.[齐套], 0) = 1 THEN N'是' + ELSE N'否' + END AS [齐套], + CASE + WHEN ISNULL(v.[拣配状态], 0) = 1 THEN N'已拣配' + ELSE N'未拣配' + END AS [拣配状态], + CASE + WHEN ISNULL(v.[发料状态], N'') = N'1' THEN N'发料齐套' + WHEN ISNULL(v.[发料状态], N'') = N'2' THEN N'发料缺件' + ELSE N'未发料' + END AS [发料状态], + CASE + WHEN ISNULL(v.[任务状态], 0) IN (2, 4) OR v.[开工时间] > '1900-01-01' THEN N'已开工' + ELSE N'待执行' + END AS [装配开工], + v.[完成数量], + CASE + WHEN final_check.[计划号] IS NOT NULL THEN N'是' + ELSE N'否' + END AS [终检], + CASE WHEN ISNULL(v.[生产工艺], 0) = 1 THEN N'是' ELSE N'否' END AS [生产工艺], + CASE WHEN ISNULL(v.[排产状态], 0) = 1 THEN N'已排产' ELSE N'未排产' END AS [排产状态], + ISNULL(v.[自制件属性], N'') AS [自制件属性], + v.[计划开始时间] AS [预计齐套时间], + sap.ItemCode AS [缺件物料编码], + sap.U_Name AS [缺件物料名称], + sap.[未发货数量] AS [缺件数量], + sap.[库存数量] AS [库存数量], + CASE WHEN sap.[属性] = N'' THEN N'外购' ELSE sap.[属性] END AS [缺件属性], + CASE + WHEN sap.[属性] = N'' THEN ISNULL(CONVERT(nvarchar(50), NULLIF(sap.[在制采购], 0)), N'') + ELSE ISNULL(CONVERT(nvarchar(50), detail_order.[订单编号]), N'') + END AS [缺件生产订单号], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(current_step.[当前序], N'') END AS [进度], + CASE + WHEN sap.[属性] = N'' THEN + N'采购员:' + ISNULL(NULLIF(sap.[采购员], N''), N'-') + + N' / 未清数量:' + CONVERT(nvarchar(30), sap.[采购未清数量]) + + N' / 到货草稿:' + CONVERT(nvarchar(30), sap.[到货草稿]) + + N' / 质检状态:' + ISNULL(purchase_check.[质检状态], N'未完成') + ELSE ISNULL(route.[工艺路线], N'') + END AS [工艺路线], + CASE + WHEN sap.[属性] = N'' THEN sap.[采购预计交货日期] + ELSE route.[预计完成时间] + END AS [预计完成时间], + CASE WHEN sap.[属性] = N'' THEN N'' ELSE ISNULL(route.[工艺路线明细], N'[]') END AS [工艺路线明细], + sap.[采购未清数量], + sap.[到货草稿], + ISNULL(purchase_check.[质检状态], CASE WHEN sap.[属性] = N'' THEN N'未完成' ELSE N'' END) AS [质检状态], + sap.DocEntry AS [SAP单据], + sap.[行号] AS [SAP行号] + FROM SAP缺件 AS sap + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] = sap.DocEntry + ORDER BY m.[订单行号] + ) AS v + OUTER APPLY ( + SELECT TOP (1) m.* + FROM [dbo].[View_生产订单_MES] AS m + WHERE m.[物料类型] = N'pit_Resource' + AND ISNULL(m.[排产状态], 0) = 1 + AND m.[订单编号] <> v.[订单编号] + AND ( + (sap.[属性] = N'机加件' AND ( + (sap.DocNum > 0 AND m.[订单编号] = sap.DocNum) + OR (sap.DocNum <= 0 AND m.[物料编号] = sap.ItemCode) + )) + OR (sap.[属性] LIKE N'%装配%' AND m.[物料编号] = sap.ItemCode AND ISNULL(m.[合同号], N'') = ISNULL(sap.Project, N'')) + ) + ORDER BY + CASE WHEN sap.DocNum > 0 AND m.[订单编号] = sap.DocNum THEN 0 ELSE 1 END, + m.[订单编号] DESC, + m.[订单行号] + ) AS detail_order + OUTER APPLY ( + SELECT TOP (1) q.[计划号] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[质检类型] = N'终检' + AND q.[计划号] = v.[订单编号] + ) AS final_check + OUTER APPLY ( + SELECT + MAX(p.[计划完成时间]) AS [预计完成时间], + STUFF(( + SELECT N'、' + p2.[工序名称] + + CASE WHEN ISNULL(p2.[指派对象], N'') = N'' THEN N'' ELSE N'(' + p2.[指派对象] + N')' END + FROM [dbo].[View_生产订单_MES] AS p2 + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR XML PATH(N''), TYPE + ).value(N'.', N'nvarchar(max)'), 1, 1, N'') AS [工艺路线], + ( + SELECT + p2.[订单行号], + p2.[工序名称], + p2.[指派对象], + p2.[计划开始时间], + p2.[计划完成时间], + ISNULL(p2.[进度], 0) AS [进度], + ISNULL(p2.[完成数量], 0) AS [完成数量], + ISNULL(p2.[收料数量], 0) AS [收料数量], + ISNULL(p2.[加工状态], 0) AS [加工状态], + p2.[开工时间], + ISNULL(check_qty.[收检合格数], 0) AS [收检合格数], + ISNULL(check_qty.[收检不合格数], 0) AS [收检不合格数] + FROM [dbo].[View_生产订单_MES] AS p2 + OUTER APPLY ( + SELECT + SUM(ISNULL(q.[合格数], 0)) AS [收检合格数], + SUM(ISNULL(q.[不合格数], 0)) AS [收检不合格数] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[TaskAID] = p2.[TaskAID] + AND q.[质检类型] = N'收检' + ) AS check_qty + WHERE p2.[订单编号] = detail_order.[订单编号] + AND p2.[物料类型] = N'pit_Resource' + ORDER BY p2.[订单行号] + FOR JSON PATH + ) AS [工艺路线明细] + FROM [dbo].[View_生产订单_MES] AS p + WHERE p.[订单编号] = detail_order.[订单编号] + AND p.[物料类型] = N'pit_Resource' + ) AS route + OUTER APPLY ( + SELECT TOP (1) + pending.[订单行号], + pending.[工序名称], + pending.[加工状态], + pending.[进度], + pending.[完成数量], + pending.[计划数量], + pending.[开工时间] + FROM [dbo].[View_生产订单_MES] AS pending + WHERE pending.[订单编号] = detail_order.[订单编号] + AND pending.[物料类型] = N'pit_Resource' + AND NOT ( + ISNULL(pending.[进度], 0) >= 100 + OR (ISNULL(pending.[计划数量], 0) > 0 AND ISNULL(pending.[完成数量], 0) >= ISNULL(pending.[计划数量], 0)) + ) + ORDER BY pending.[订单行号] + ) AS pending + OUTER APPLY ( + SELECT TOP (1) prev.[工序名称] + FROM [dbo].[View_生产订单_MES] AS prev + WHERE prev.[订单编号] = detail_order.[订单编号] + AND prev.[物料类型] = N'pit_Resource' + AND prev.[订单行号] < pending.[订单行号] + ORDER BY prev.[订单行号] DESC + ) AS prev_step + OUTER APPLY ( + SELECT TOP (1) last_step.[工序名称] + FROM [dbo].[View_生产订单_MES] AS last_step + WHERE last_step.[订单编号] = detail_order.[订单编号] + AND last_step.[物料类型] = N'pit_Resource' + ORDER BY last_step.[订单行号] DESC + ) AS last_step + OUTER APPLY ( + SELECT + CASE + WHEN detail_order.[订单编号] IS NULL THEN N'' + WHEN pending.[订单行号] IS NULL THEN ISNULL(last_step.[工序名称], N'') + N'毕' + WHEN ISNULL(pending.[进度], 0) > 0 + OR ISNULL(pending.[完成数量], 0) > 0 + OR ISNULL(pending.[加工状态], 0) IN (2, 3, 4, 5, 6) + OR pending.[开工时间] > '1900-01-01' + THEN ISNULL(pending.[工序名称], N'') + N'中' + WHEN prev_step.[工序名称] IS NULL THEN N'' + ELSE prev_step.[工序名称] + N'毕待' + ISNULL(pending.[工序名称], N'') + END AS [当前序] + ) AS current_step + OUTER APPLY ( + SELECT + CASE + WHEN sap.[属性] <> N'' THEN N'' + WHEN EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ISNULL(task.[入库数量], 0) > 0 + ) + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[质量检验_质检任务_SAP] AS task + OUTER APPLY ( + SELECT SUM(ISNULL(q.[检验数量], 0)) AS [已检验数量] + FROM [dbo].[YL_质量检验_质检记录] AS q + WHERE q.[检测类型编号] = 5 + AND q.[计划号] = task.[订单编号] + AND q.[行号] = task.[行号] + AND q.[订单类型] = task.[订单类型] + ) AS checked_qty + WHERE sap.[到货草稿] > 0 + AND task.[订单类型] = N'20' + AND task.[订单编号] = sap.[到货草稿] + AND ( + ISNULL(task.[入库数量], 0) <= 0 + OR ISNULL(checked_qty.[已检验数量], 0) < ISNULL(task.[入库数量], 0) + ) + ) THEN N'已完成' + ELSE N'未完成' + END AS [质检状态] + ) AS purchase_check + WHERE + v.[订单编号] IS NOT NULL + AND (@订单号 <= 0 OR v.[订单编号] = @订单号) + AND (@计划号 = N'' OR ISNULL(v.[计划号], N'') = @计划号) + AND (@合同号 = N'' OR ISNULL(v.[合同号], N'') LIKE N'%' + @合同号 + N'%') + AND (@产品编码 = N'' OR ISNULL(v.[物料编号], N'') LIKE N'%' + @产品编码 + N'%') + AND (@产品名称 = N'' OR ISNULL(v.[物料描述], N'') LIKE N'%' + @产品名称 + N'%') + AND (@工序名称 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS fp + WHERE fp.[订单编号] = v.[订单编号] + AND fp.[工序名称] = @工序名称 + )) + AND (@计划开始 = N'' OR v.[计划开始时间] >= TRY_CONVERT(datetime, @计划开始)) + AND (@计划完成 = N'' OR v.[计划开始时间] <= TRY_CONVERT(datetime, @计划完成)) + AND (@排产状态 = N'全部' OR @排产状态 = N'' OR + (@排产状态 = N'已完成' AND ISNULL(v.[排产状态], 0) = 1) OR + (@排产状态 = N'未完成' AND ISNULL(v.[排产状态], 0) = 0) + ) + AND (@指派对象 = N'全部' OR @指派对象 = N'' OR EXISTS ( + SELECT 1 + FROM [dbo].[View_生产订单_MES] AS ap + WHERE ap.[订单编号] = v.[订单编号] + AND ap.[指派对象] IN (SELECT LTRIM(RTRIM(value)) FROM STRING_SPLIT(@指派对象, N',')) + )) + AND (@发货状态 = N'全部' OR @发货状态 = N'' OR + (@发货状态 = N'已发货' AND ISNULL(v.[发货状态], N'0') = N'1') OR + (@发货状态 = N'未发货' AND ISNULL(v.[发货状态], N'0') <> N'1') + ) + AND (@齐套 = N'全部' OR @齐套 = N'' OR + (@齐套 = N'是' AND ISNULL(v.[齐套], 0) = 1) OR + (@齐套 = N'否' AND ISNULL(v.[齐套], 0) <> 1) + ) + AND (@发料状态 = N'全部' OR @发料状态 = N'' OR + (@发料状态 = N'发料齐套' AND ISNULL(v.[发料状态], N'0') = N'1') OR + (@发料状态 = N'发料缺件' AND ISNULL(v.[发料状态], N'0') = N'2') OR + (@发料状态 = N'未发料' AND ISNULL(v.[发料状态], N'0') NOT IN (N'1', N'2')) + ) + AND (@自制件属性 = N'全部' OR @自制件属性 = N'' OR + (@自制件属性 = N'机加' AND (sap.[属性] = N'机加件' OR v.[自制件属性] = N'机加件')) OR + (@自制件属性 = N'装配' AND (sap.[属性] LIKE N'%装配%' OR v.[自制件属性] LIKE N'%装配%')) + ) + AND (@检验状态 = N'' OR (sap.[属性] = N'' AND ISNULL(purchase_check.[质检状态], N'') = @检验状态)) + ) + SELECT TOP (1000) + [计划号], + [合同号], + [订单号], + [产品编码], + [产品名称], + [计划数量订单], + [入库数量], + [要求完工日期], + [要求发货日期], + [发货状态], + [齐套], + [拣配状态], + [发料状态], + [装配开工], + [完成数量], + [终检], + [生产工艺], + [排产状态], + [自制件属性], + [预计齐套时间], + [缺件物料编码], + [缺件物料名称], + [缺件数量], + [库存数量], + [缺件属性], + [缺件生产订单号], + [进度], + [工艺路线], + [预计完成时间], + [工艺路线明细], + [采购未清数量], + [到货草稿], + [质检状态], + [SAP单据], + [SAP行号] + FROM ( + SELECT + 查询结果.*, + ROW_NUMBER() OVER ( + PARTITION BY + [订单号], + CASE + WHEN ISNULL([缺件生产订单号], N'') <> N'' THEN [缺件生产订单号] + ELSE [缺件物料编码] + N':' + CONVERT(nvarchar(30), [SAP行号]) + END + ORDER BY [缺件数量] DESC, [SAP单据], [SAP行号] + ) AS rn + FROM 查询结果 + ) AS dedup + WHERE rn = 1 + ORDER BY + [预计齐套时间], + [订单号], + [缺件生产订单号], + [缺件物料编码]; +END +GO diff --git a/doc/新增产品合格率.docx b/doc/新增产品合格率.docx new file mode 100644 index 0000000..2ba05fc Binary files /dev/null and b/doc/新增产品合格率.docx differ diff --git a/doc/设计报工任务模块.docx b/doc/设计报工任务模块.docx new file mode 100644 index 0000000..1025f55 Binary files /dev/null and b/doc/设计报工任务模块.docx differ diff --git a/gptlog-process/gpdlog.md b/gptlog-process/gpdlog.md index 445e992..8a911d6 100644 --- a/gptlog-process/gpdlog.md +++ b/gptlog-process/gpdlog.md @@ -1165,3 +1165,455 @@ pm run build:通过,仅有既有警告。 - `@订单号=7321`:外购缺件按到货草稿 `11209` 显示缺件生产订单号,质检状态来自采购入库检口径。 - 默认查询统计:总行数 198,产品编码/产品名称为空行数 0,缺件生产订单号等于主订单号行数 0,非外购质检状态非空行数 0。 - `npm run build` 通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。 + +## 2026-06-30 修正及时齐套跟踪结果库存数量、采购员和工艺路线样式 + +### 用户反馈 + +1. `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 页面二级数据需要在缺件数量后增加库存数量字段,库存数量在 SAP 里有。 +2. 去掉拼接的采购员字段。 +3. 工艺路线需要左对齐,当前间隔偏大。 +4. 工艺路线颜色参考生产计划跟踪页面,使用红、蓝、绿,不使用橙色。 +5. 所有改动按昨日方式维护 01-06 文档、README 索引、推进台账、任务矩阵、验收证据、决策记录,并追加总日志。 + +### 执行过程 + +1. 读取目标页面 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue`,确认二级明细已有缺件数量、采购员列,以及本页自定义工艺路线样式。 +2. 读取参考页面 `src/views/ProductionManagement/ProductionPlanTrack/index.vue`,确认生产计划跟踪的工艺路线为左对齐、紧凑间距、红/蓝/绿文字配色。 +3. 修改前端页面: + - 在二级明细“缺件数量”后新增“库存数量”列。 + - 在 `mergeRows` 中新增 `库存数量: this.formatQuantity(row.库存数量)`。 + - 删除二级明细“采购员”列和 `采购员` 映射。 + - 工艺路线名称只显示工序名称,不再拼接指派对象。 + - 删除橙色状态判断和橙色样式。 + - 调整 `.process-route` 相关样式为左对齐、缩小箭头和单元格间距、红/蓝/绿三色。 +4. 连接数据库 `192.168.2.92 / YL_MESDB`,读取 SAP 视图字段列表,确认 `[SAP].[SBO_YL].[dbo].[VIEW_Jijiankukc]` 包含 `库存量` 字段。 +5. 新增数据库增量脚本 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql`,不覆盖 20260629 历史脚本。 +6. 修改增量脚本: + - 在 `SAP缺件源` 中增加 `ISNULL(s.[库存量], 0) AS 库存数量`。 + - 在查询结果中输出 `sap.[库存数量] AS [库存数量]`。 + - 最终 SELECT 输出 `[库存数量]`。 + - 删除 `sap.[采购员]` 输出。 + - 外购采购状态文本从 `采购员 + 未清数量 + 到货草稿 + 质检状态` 改为 `未清数量 + 到货草稿 + 质检状态`。 +7. 执行 `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` 发布过程,发布成功。 +8. 验证 `@订单号=2007`,返回缺件 `24112-011-HY-WF50L`,缺件数量 `78`,库存数量 `27`,结果列不再包含采购员。 +9. 验证 `@订单号=7321`,返回缺件 `XX-YG01013990`,缺件数量 `6`,库存数量 `2`,外购采购状态不再包含采购员。 +10. 执行过程定义检查,结果为“有库存数量 / 未拼接采购员”。 +11. 曾尝试用 `OPENQUERY([LOCALSERVER], ...)` 做辅助落表验证,但数据库未配置 `LOCALSERVER` linked server,该无效命令不作为验收证据,已用过程样例和定义检查替代。 +12. 执行 `npm run build`,构建通过,仅有项目既有资源体积过大和 Browserslist/caniuse-lite 过期警告。 +13. 更新 README、01-06 文档、推进台账、任务矩阵、验收证据、决策记录,并追加本日志。 + +### 修改文件 + +- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` +- `db_backups/update_timely_kit_tracking_result_inventory_20260630.sql` +- `work/PlanManagement/TimelyKitTrackingResult/README.md` +- `work/PlanManagement/TimelyKitTrackingResult/01-项目功能内容.md` +- `work/PlanManagement/TimelyKitTrackingResult/02-项目程序开发详细步骤.md` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- SAP 视图字段确认:`VIEW_Jijiankukc` 包含 `库存量`。 +- SAP 视图取样:`DocEntry=2007`、`ItemCode=24112-011-HY-WF50L`、`未发货数量=78`、`库存量=27`。 +- 查询过程发布成功。 +- `@订单号=2007` 返回 `库存数量=27`。 +- `@订单号=7321` 返回 `库存数量=2`。 +- 过程定义检查:有 `库存数量`,未拼接 `采购员:`。 +- `npm run build` 通过,仅有项目既有 warning。 + +### 下一步 + +- 登录系统人工验收“及时齐套跟踪结果”展开行,确认库存数量位置、外购采购状态文本、工艺路线左对齐和红/蓝/绿颜色符合现场预期。 + +## 2026-06-30 修正及时齐套跟踪结果 7134 工艺路线判色 + +### 用户反馈 + +- 当前页二级数据 `7134` 的工艺路线颜色仍有问题:当前页显示一个蓝色两个红色,生产计划跟踪显示两个蓝色一个红色。 + +### 执行过程 + +1. 对比当前页 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 和生产计划跟踪 `src/views/ProductionManagement/ProductionPlanTrack/index.vue` 的工艺路线判色函数。 +2. 查询数据库确认 `7134` 工艺数据: + - 打磨:加工状态 `6`,收检合格数 `6`。 + - 打压检测:加工状态为空,收检合格数 `6`。 + - 喷塑:外协,收检合格数 `0`。 +3. 确认差异原因:当前页旧逻辑按进度、计划数量、完成数量或收检数量达到计划数量判蓝;生产计划跟踪按加工状态 `6/3` 或 `收检合格数 > 0` 判蓝。 +4. 修改当前页判色逻辑: + - 新增 `isBlueProcess`,与生产计划跟踪一致。 + - 新增 `isGreenProcess`,与生产计划跟踪外协绿色口径一致。 + - 新增 `getProcessBaseClass` 和 `getOutsourceGroupClassState`,复用生产计划跟踪的外协连续分组判色口径。 + - `formatProcessRoute` 改为基于 `outsourceGroupClasses` 获取颜色。 +5. 本地模拟 `7134` 判色结果:`step1:process-route-blue,step2:process-route-blue,step3:process-route-red`。 +6. 执行 `npm run build`,构建通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。 +7. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。 + +### 修改文件 + +- `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- SQL 验证 `7134` 的第二道工序“打压检测”有 `收检合格数=6`。 +- 本地判色模拟结果为两个蓝色、一个红色。 +- 当前页无 `process-route-orange`。 +- `npm run build` 通过,仅有项目既有 warning。 + +### 下一步 + +- 登录页面展开 `7134`,确认当前页工艺路线颜色与生产计划跟踪一致。 + +## 2026-06-30 恢复外购采购状态采购员拼接 + +### 用户反馈 + +- 还原字段拼接采购员部分。 +- 不要单独的采购员列。 + +### 执行过程 + +1. 确认前端 `src/views/PlanManagement/TimelyKitTrackingResult/index.vue` 当前没有单独采购员列。 +2. 修改最新过程脚本 `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql`: + - 在 `SAP缺件源` 中重新读取 `s.[采购员] COLLATE DATABASE_DEFAULT AS 采购员`。 + - 外购 `工艺路线/采购状态` 文本改为 `采购员:xxx / 未清数量:xxx / 到货草稿:xxx / 质检状态:xxx`。 + - 不在最终 SELECT 中输出单独 `采购员` 字段。 +3. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。 +4. 查询 `@订单号=7321` 验证: + - 缺件生产订单号为 `4111`,来自 SAP `在制采购`。 + - 工艺路线/采购状态为 `采购员:张丹 / 未清数量:50 / 到货草稿:11209 / 质检状态:未完成`。 + - 预计完成时间为 `2026-06-25`,来自 SAP `采购预计交货日期`。 +5. 使用 `sys.dm_exec_describe_first_result_set_for_object` 检查结果集列,确认没有单独 `采购员` 列。 +6. 使用 `Select-String` 检查前端页面,确认没有 `label="采购员"` 或 `prop="采购员"`。 +7. 执行 `npm run build`,构建通过,仅有项目既有资源体积和 Browserslist/caniuse-lite 过期警告。 +8. 更新推进台账、任务矩阵、验收证据、决策记录和总日志。 + +### 修改文件 + +- `db_backups/update_timely_kit_tracking_result_purchase_order_20260630.sql` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 查询过程发布成功。 +- `@订单号=7321` 外购采购状态已包含 `采购员:张丹`。 +- 结果集无单独 `采购员` 列。 +- 前端无单独采购员列。 +- `npm run build` 通过,仅有项目既有 warning。 + +### 下一步 + +- 登录页面确认外购采购状态文本显示采购员,且二级表没有单独采购员列。 + +## 2026-06-30 自制缺件显示所有匹配生产订单 + +### 用户反馈 + +- 同一个生产订单号不要出现重复。 +- 同一缺件物料所有匹配生产订单都显示。 + +### 执行过程 + +1. 排查 `@订单号=4222` 当前结果,确认旧过程只返回二级生产订单 `5960` 或 `7142` 中的一条。 +2. 查询 SAP 缺件视图,确认 `4222` 的缺件物料为 `22-103-060-YDZF-20V1.0-4.1`,`DocNum=5960`。 +3. 查询 MES 生产订单,确认同一缺件物料同时存在 `5960` 和 `7142` 两个生产订单。 +4. 定位旧逻辑问题:`detail_order` 使用 `SELECT TOP (1)`,天然只能显示一个匹配生产订单。 +5. 新增脚本 `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql`。 +6. 修改 `detail_order`: + - 去掉自制件匹配的 `TOP (1)` 单行限制。 + - 使用 `ROW_NUMBER() OVER (PARTITION BY m.[订单编号] ORDER BY m.[订单行号])`,确保同一生产订单号只保留一条代表行。 + - 同一缺件物料匹配到的多个不同生产订单全部返回。 +7. 发布 `dbo.生产管理_及时齐套跟踪结果_查询` 成功。 +8. 验证 `@订单号=4222` 返回两条二级数据:`5960` 和 `7142`,且同一生产订单号不重复。 +9. 更新 README、推进台账、任务矩阵、验收证据、决策记录和总日志。 + +### 修改文件 + +- `db_backups/update_timely_kit_tracking_result_multi_detail_orders_20260630.sql` +- `work/PlanManagement/TimelyKitTrackingResult/README.md` +- `work/PlanManagement/TimelyKitTrackingResult/03-推进台账.md` +- `work/PlanManagement/TimelyKitTrackingResult/04-任务矩阵.md` +- `work/PlanManagement/TimelyKitTrackingResult/05-验收证据.md` +- `work/PlanManagement/TimelyKitTrackingResult/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 + +- 查询过程发布成功。 +- `@订单号=4222` 二级数据返回 `5960` 和 `7142`。 +- 同一生产订单号没有重复。 +- `5960` 显示 13 道工艺路线,`7142` 显示 4 道工艺路线。 + +### 下一步 + +- 登录页面展开 `4222`,确认二级数据同时显示所有匹配生产订单且不重复。 + +## 2026-06-30 11:47:54 复核同缺件物料多生产订单显示 + +### 复核内容 +- 按用户最新口径确认:同一个生产订单号不要出现重复,同一缺件物料所有匹配生产订单都显示。 + +### 验证结果 +- 执行 `EXEC dbo.[生产管理_及时齐套跟踪结果_查询] @订单号 = 4222`。 +- 二级数据中缺件物料 `22-103-060-YDZF-20V1.0-4.1` 当前同时返回生产订单 `5960` 和 `7142`。 +- 同一生产订单号未重复出现。 + +## 2026-06-30 生产订单关闭无工时可关闭处理 + +### 用户反馈 +- `dbo.计划排产_生产订单关闭_查询全部订单` 的“可关闭”查询以工时为基准。 +- 当前只能查出全部校验的工时再筛选。 +- 特殊情况:没有工时记录,但满足其他条件的订单也需要进入可关闭处理。 + +### 执行过程 +1. 读取线上过程定义,确认“可关闭”分支以 `dbo.View_生产工时视图` 为主表。 +2. 核对页面 `src/views/PlanManagement/PlannOrderClose/index.vue`,确认默认查询为“可关闭 + 机加”。 +3. 核对 `MES_接口_生产计划`、`View_生产工时视图` 字段,确认可从生产计划补充无工时订单。 +4. 查询样例,确认 `7410` 无工时,但计划数量、入库数量、终检合格数均为 `1`,单据状态为空,属性为机加件。 +5. 新增脚本 `db_backups/update_plan_order_close_no_work_hours_20260630.sql`。 +6. 将“可关闭”分支调整为有工时订单和无工时满足条件订单合并: + - 有工时订单继续要求全部工时校验。 + - 无工时订单免工时校验,但保留原可关闭条件。 +7. 初版全量查询超时后,改为先写入 `#工时订单` 临时表,再判断无工时,避免重复展开复杂视图。 +8. 发布存储过程成功。 +9. 验证 `@订单号=7410, @单据状态=可关闭, @属性=机加` 可返回。 +10. 验证默认“可关闭 + 机加”查询约 `0.56` 秒返回,并命中 `7280`、`7409`、`7410`。 + +### 修改文件 +- `db_backups/update_plan_order_close_no_work_hours_20260630.sql` +- `work/PlanManagement/PlannOrderClose/README.md` +- `work/PlanManagement/PlannOrderClose/01-项目功能内容.md` +- `work/PlanManagement/PlannOrderClose/02-项目程序开发详细步骤.md` +- `work/PlanManagement/PlannOrderClose/03-推进台账.md` +- `work/PlanManagement/PlannOrderClose/04-任务矩阵.md` +- `work/PlanManagement/PlannOrderClose/05-验收证据.md` +- `work/PlanManagement/PlannOrderClose/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 数据库过程发布成功。 +- 无工时订单 `7410` 可进入可关闭结果。 +- 默认“可关闭 + 机加”查询未超时,约 `0.56` 秒返回。 + +## 2026-06-30 新增产品合格率(工位)页面 + +### 用户反馈 +- 查看 `doc/新增产品合格率.docx`。 +- 根据文档新增页面 `产品合格率(工位)`。 + +### 执行过程 +1. 解包并读取 `doc/新增产品合格率.docx`,确认页面放在生产管理下。 +2. 读取文档截图和文字,确认一级字段为关闭日期、生产订单号、物料名称、物料编码、计划数量、完成数量、不良数量、合格率。 +3. 确认二级字段为工序、工序号、工位、完工数量、不良数量、合格率、检验说明。 +4. 查询 `dbo.YL_质量检验_质检记录` 字段,确认生产订单号为 `计划号`,订单行号为 `行号`,工位字段为 `工位名称`。 +5. 查询 SAP 视图 `SBO_YL.dbo.UBT_OWOR`,确认关闭日期字段为 `实际结算日期`,已关闭口径为 `单据状态 IS NOT NULL`。 +6. 新增查询脚本 `db_backups/create_product_pass_rate_workstation_20260630.sql`。 +7. 初版四段名跨库查询较慢,改为 `OPENQUERY([SAP], ...)` 将 SAP 已关闭订单先取到本地临时表。 +8. 新增菜单脚本 `db_backups/add_product_pass_rate_workstation_menu_20260630.sql`,写入生产管理下 `产品合格率(工位)` 菜单。 +9. 新增前端页面 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`,实现查询区、主表、展开二级明细和合格率颜色。 +10. 发布查询过程和菜单脚本。 +11. 验证样例 `@生产订单号=7649` 返回一级汇总和二级明细。 +12. 执行 `npm run build`,构建通过。 + +### 修改文件 +- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue` +- `db_backups/create_product_pass_rate_workstation_20260630.sql` +- `db_backups/add_product_pass_rate_workstation_menu_20260630.sql` +- `work/ProductionManagement/ProductPassRateWorkstation/README.md` +- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md` +- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md` +- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md` +- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md` +- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 查询过程 `dbo.生产管理_产品合格率工位_查询` 发布成功,修改时间 `2026-06-30 14:31:00.690`。 +- 菜单写入 `12` 条角色记录,ID 范围 `236-247`。 +- 近 7 天查询返回 `175` 行,耗时约 `0.37` 秒。 +- 空条件查询自动限定近 30 天,返回 `1420` 行,耗时约 `1.17` 秒。 +- `npm run build` 通过,仅有项目既有 warning。 + +## 2026-06-30 产品合格率(工位)默认不查询和合格状态筛选 + +### 用户反馈 +- 默认进来不查询数据。 +- 增加合格和不合格筛选。 +- 主数据合格率小于 `100` 的为不合格。 +- 默认不合格。 + +### 执行过程 +1. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`,新增 `@合格状态` 参数。 +2. 查询结果按主数据合格率过滤:`合格` 为大于等于 `100`,`不合格` 为小于 `100`,`全部` 不过滤。 +3. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`,删除页面创建时自动查询。 +4. 查询区新增“合格状态”下拉,默认值为 `不合格`。 +5. 查询时向过程传入 `合格状态`。 +6. 发布查询过程成功。 +7. 验证近 30 天筛选结果:不合格 `50` 行,合格 `1370` 行,全部 `1420` 行。 +8. 执行 `npm run build`,构建通过。 + +### 修改文件 +- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue` +- `db_backups/create_product_pass_rate_workstation_20260630.sql` +- `work/ProductionManagement/ProductPassRateWorkstation/README.md` +- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md` +- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md` +- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md` +- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md` +- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 页面进入不再自动查询。 +- 合格状态默认 `不合格`。 +- 不合格筛选最高合格率为 `99.99`,符合小于 `100` 的判定。 +- `npm run build` 通过,仅有项目既有 warning。 + +## 2026-06-30 产品合格率(工位)关闭日期拆分 + +### 用户反馈 +- 关闭日期筛选拆成两个筛选。 +- 客户不习惯一次选两个日期。 + +### 执行过程 +1. 修改 `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue`。 +2. 将原 `daterange` 日期范围选择器拆成两个独立 `date` 日期选择器。 +3. 前端字段改为 `searchForm.closeDateStart` 和 `searchForm.closeDateEnd`。 +4. 查询参数仍然使用 `关闭日期_Start` 和 `关闭日期_End`,数据库过程无需修改。 +5. 执行 `npm run build`,构建通过。 +6. 更新产品合格率 README/01-05 文档和总日志。 + +### 修改文件 +- `src/views/ProductionManagement/ProductPassRateWorkstation/index.vue` +- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md` +- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md` +- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md` +- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- `npm run build` 通过,仅有项目既有 warning。 +- 数据库过程无需重新发布。 + +## 2026-06-30 产品合格率(工位)修正工序号来源 + +### 用户反馈 +- 工序号为什么都是空。 +- 工序号应取 `dbo.MES_接口_生产计划_生产任务.订单行号`。 +- 该表中订单行号肯定不会为空。 + +### 执行过程 +1. 查询 `dbo.MES_接口_生产计划_生产任务` 字段,确认存在 `AID`、`订单编号`、`订单行号`、`工序名称`、`指派对象`。 +2. 查询样例数据,确认 `订单行号` 在生产任务表中有值。 +3. 定位原脚本中工序号来源为 `COALESCE(View_生产订单_MES.订单行号, 质检记录.行号)`。 +4. 确认质检记录的 `TaskAID` 对应生产任务表的 `AID`。 +5. 修改 `db_backups/create_product_pass_rate_workstation_20260630.sql`: + - 明细关联表改为 `dbo.MES_接口_生产计划_生产任务`。 + - 关联条件改为 `q.TaskAID = t.AID`。 + - 工序号改为 `COALESCE(t.订单行号, q.行号)`。 + - 工序和工位补值也改为优先使用生产任务表的 `工序名称`、`指派对象`。 +6. 发布 `dbo.生产管理_产品合格率工位_查询` 成功。 +7. 验证 `7649` 二级明细工序号为 `1`、`2`、`3`。 +8. 验证近 30 天 `3281` 条二级明细中空工序号为 `0`。 + +### 修改文件 +- `db_backups/create_product_pass_rate_workstation_20260630.sql` +- `work/ProductionManagement/ProductPassRateWorkstation/01-项目功能内容.md` +- `work/ProductionManagement/ProductPassRateWorkstation/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/ProductPassRateWorkstation/03-推进台账.md` +- `work/ProductionManagement/ProductPassRateWorkstation/04-任务矩阵.md` +- `work/ProductionManagement/ProductPassRateWorkstation/05-验收证据.md` +- `work/ProductionManagement/ProductPassRateWorkstation/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 查询过程修改时间:`2026-06-30 15:12:24.840`。 +- `7649` 返回:领料 1、数车 2、打磨 3。 +- 近 30 天明细行数 `3281`,空工序号行数 `0`。 + +## 2026-06-30 AGV执行中任务改为已完成 + +### 用户反馈 +- 处理页面 `ProductionManagement/AGVtask/index` 里面任务状态为执行中的数据。 +- 所有执行中任务都改为已完成。 + +### 执行过程 +1. 读取页面 `src/views/ProductionManagement/AGVtask/index.vue`,确认页面中 `RUNNING` 显示为执行中,`FINISHED` 显示为已完成。 +2. 查询数据库对象,确认实时数据来自 `dbo.AGV_实时数据`,历史完成数据写入 `dbo.AGV_历史数据`。 +3. 处理前统计实时表状态:`PENDING 1`、`RUNNING 35`。 +4. 按完成任务口径处理 `RUNNING` 数据:插入历史表时 `TaskStatus` 写为 `FINISHED`,并设置 `EndTime`、`Duration`,随后从实时表删除这些执行中任务。 +5. 处理完成后,调用页面实时查询过程验证 `RUNNING` 无数据。 +6. 验证实时表仅剩 `PENDING 1`,最近 5 分钟历史表新增 `FINISHED 35`。 +7. 新增 AGVtask README 和 01-06 文档,记录功能内容、执行步骤、推进台账、任务矩阵、验收证据和决策记录。 + +### 修改文件 +- `work/ProductionManagement/AGVtask/README.md` +- `work/ProductionManagement/AGVtask/01-项目功能内容.md` +- `work/ProductionManagement/AGVtask/02-项目程序开发详细步骤.md` +- `work/ProductionManagement/AGVtask/03-推进台账.md` +- `work/ProductionManagement/AGVtask/04-任务矩阵.md` +- `work/ProductionManagement/AGVtask/05-验收证据.md` +- `work/ProductionManagement/AGVtask/06-决策记录.md` +- `gptlog-process/gpdlog.md` + +### 验证结果 +- 已转历史数量:`35`。 +- 页面实时查询过程按 `RUNNING` 查询返回空结果。 +- 实时表剩余状态:`PENDING 1`。 +- 历史表最近 5 分钟状态:`FINISHED 35`。 + +## 2026-06-30 设计报工任务模块方案文档修订 + +### 用户反馈 +- 读取 `doc/设计报工任务模块.docx`,梳理方案。 +- 项目号具体取哪个 SAP 视图字段后续提供。 +- 完成要求已有结束时间,未结束不能完成。 +- 删除任务时,如果已经有报工记录,不能删除。 +- 不参与之前任何生产/SAP/工时报表流程,整体独立。 +- 修改文档。 + +### 执行过程 +1. 解析 `doc/设计报工任务模块.docx` 正文,确认原始需求包含设计任务、设计报工、设计工时校验、设计工时报表四个页面。 +2. 对照参考页面: + - `ProcessManagement/PartDrawlook/index.vue` + - `PlanManagement/SelfMakePlando/index.vue` + - `ProductionManagement/WorkHoursCheck/index.vue` + - `ProductionManagement/Workhours/index.vue` +3. 新增 `work/ProductionManagement/DesignReportTask/` 文档目录。 +4. 写入 README 和 01-06 文档,记录功能内容、开发步骤、推进台账、任务矩阵、验收证据和决策记录。 +5. 将 Word 文档正文整理为确认版方案。 +6. 解析更新后的 Word 文档,验证关键口径已写入。 + +### 修改文件 +- `doc/设计报工任务模块.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` + +### 验证结果 +- Word 文档已包含 `项目号:具体 SAP 视图和字段后续提供`。 +- Word 文档已包含 `未结束不能完成`。 +- Word 文档已包含 `已有设计报工记录不能删除`。 +- Word 文档已包含 `不上传 SAP` 和 `不参与现有生产工时报表`。 +- 任务矩阵中 `DRT-009 项目号来源` 状态为待确认,`DRT-010 数据库和页面开发` 状态为待开始。 diff --git a/src/views/PlanManagement/TimelyKitTrackingResult/index.vue b/src/views/PlanManagement/TimelyKitTrackingResult/index.vue index 86d7dfc..eb5d3b0 100644 --- a/src/views/PlanManagement/TimelyKitTrackingResult/index.vue +++ b/src/views/PlanManagement/TimelyKitTrackingResult/index.vue @@ -79,6 +79,7 @@ + @@ -93,7 +94,6 @@ - @@ -269,13 +269,13 @@ export default { 缺件物料编码: row.缺件物料编码, 缺件物料名称: row.缺件物料名称, 缺件数量: this.formatQuantity(row.缺件数量), + 库存数量: this.formatQuantity(row.库存数量), 缺件属性: row.缺件属性, 缺件生产订单号: row.缺件生产订单号, 进度: row.进度, 工艺路线: row.工艺路线, 工艺路线明细: this.parseRouteDetails(row.工艺路线明细), 预计完成时间: row.预计完成时间, - 采购员: row.采购员, 采购未清数量: this.formatQuantity(row.采购未清数量), 到货草稿: row.到货草稿, 质检状态: row.质检状态, @@ -315,39 +315,88 @@ export default { 辅助结束: 3, 开始加工: 4, 暂停: 5, - 报工: 6 + 报工: 6, + 装配加工: 4 } return statusMap[value] || 0 }, - isProcessComplete(process) { - const progress = this.toProcessNumber(process.进度) - const planCount = this.toProcessNumber(process.计划数量) - const finishCount = this.toProcessNumber(process.完成数量) - const checkedCount = this.toProcessNumber(process.收检合格数) + this.toProcessNumber(process.收检不合格数) - return progress >= 100 || - (planCount > 0 && finishCount >= planCount) || - (planCount > 0 && checkedCount >= planCount) + isOutsourceProcess(process) { + return process.指派对象 === '外协' || + String(process.工序名称 || '').includes('(外协)') || + String(process.工序名称 || '').includes('(外协)') }, - getProcessClass(process, index, processes) { - if (this.isProcessComplete(process)) { - return 'process-route-blue' - } + isBlueProcess(process) { const statusNum = this.getProcessStatusNum(process.加工状态) - if (this.isValidProcessDate(process.开工时间) || [2, 4].includes(statusNum) || this.toProcessNumber(process.进度) > 0) { + const countNum = parseInt(process.收检合格数) + return statusNum === 6 || statusNum === 3 || countNum > 0 + }, + isGreenProcess(process) { + return this.isOutsourceProcess(process) && + this.toProcessNumber(process.收料数量) > this.toProcessNumber(process.收检合格数) + this.toProcessNumber(process.收检不合格数) + }, + getProcessBaseClass(process) { + if (this.isGreenProcess(process)) { return 'process-route-green' } - if (index > 0 && this.isProcessComplete(processes[index - 1])) { - return 'process-route-orange' + + if (this.isBlueProcess(process)) { + return 'process-route-blue' } + + const statusNum = this.getProcessStatusNum(process.加工状态) + if (statusNum === 2 || statusNum === 4) { + return 'process-route-green' + } + return 'process-route-red' }, - getRouteProcessName(process) { - const name = String(process.工序名称 || '') - const assignee = String(process.指派对象 || '') - if (!assignee || name.includes(`(${assignee})`) || name.includes(`(${assignee})`)) { - return name + getOutsourceGroupClassState(processes) { + const classes = new Map() + let currentIndexes = [] + let lastProcess = null + + const flushOutsourceRun = () => { + if (currentIndexes.length > 0 && lastProcess) { + const className = this.getProcessBaseClass(lastProcess) + currentIndexes.forEach(index => classes.set(index, className)) + } + currentIndexes = [] + lastProcess = null } - return `${name}(${assignee})` + + const isSameContinuousGroup = process => { + if (!lastProcess) { + return true + } + const lineNo = this.toProcessNumber(process.订单行号) + const lastLineNo = this.toProcessNumber(lastProcess.订单行号) + return lineNo === lastLineNo + 1 && + String(process.外协分组 || '') === String(lastProcess.外协分组 || '') + } + + processes.forEach((process, index) => { + if (!this.isOutsourceProcess(process)) { + flushOutsourceRun() + return + } + if (!isSameContinuousGroup(process)) { + flushOutsourceRun() + } + currentIndexes.push(index) + lastProcess = process + }) + flushOutsourceRun() + + return classes + }, + getProcessClass(process, index, outsourceGroupClasses) { + if (this.isOutsourceProcess(process)) { + return outsourceGroupClasses.get(index) || this.getProcessBaseClass(process) + } + return this.getProcessBaseClass(process) + }, + getRouteProcessName(process) { + return String(process.工序名称 || '') }, escapeProcessHtml(value) { return String(value == null ? '' : value) @@ -365,6 +414,7 @@ export default { const maxPerRow = 8 const rows = Math.ceil(processes.length / maxPerRow) + const outsourceGroupClasses = this.getOutsourceGroupClassState(processes) let html = '
' for (let rowIndex = 0; rowIndex < rows; rowIndex++) { @@ -376,20 +426,20 @@ export default { html += '' rowProcesses.forEach((process, index) => { - const className = this.getProcessClass(process, startIndex + index, processes) + const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses) const date = this.formatDate(process.计划开始时间 || process.计划完成时间) html += `` if (index < rowProcesses.length - 1) html += '' }) html += '' rowProcesses.forEach((process, index) => { - const className = this.getProcessClass(process, startIndex + index, processes) + const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses) html += `` if (index < rowProcesses.length - 1) html += '' }) html += '' rowProcesses.forEach((process, index) => { - const className = this.getProcessClass(process, startIndex + index, processes) + const className = this.getProcessClass(process, startIndex + index, outsourceGroupClasses) const count = this.formatQuantity(process.收检合格数) html += `` if (index < rowProcesses.length - 1) html += '' @@ -473,39 +523,53 @@ export default { .process-route { overflow-x: auto; - padding: 2px 0; + padding: 0; + text-align: left; } ::v-deep .process-route-wrap { min-width: 480px; + text-align: left; } ::v-deep .process-route-table { - border-collapse: separate; - border-spacing: 0; - margin: 0 auto; + border-collapse: collapse; + margin: 0; + text-align: left; + table-layout: auto; } ::v-deep .process-route-table td { - border-radius: 2px; - line-height: 20px; - min-width: 72px; - padding: 2px 5px; - text-align: center; + line-height: 1.4; + min-width: 35px; + padding: 2px 2px; + text-align: left; white-space: nowrap; } -::v-deep .process-route-date, +::v-deep .process-route-date { + color: #8899aa !important; + font-size: 10px !important; + padding: 2px 2px !important; +} + ::v-deep .process-route-count { - font-size: 12px; + font-size: 12px !important; + font-weight: 700; } ::v-deep .process-route-arrow, ::v-deep .process-route-arrow-hidden { background: transparent; - color: #606266; - min-width: 18px; - width: 18px; + min-width: 8px; + padding: 2px 0 !important; + width: 8px; +} + +::v-deep .process-route-arrow { + color: rgba(0, 164, 255, 0.6) !important; + font-size: 10px !important; + text-align: center !important; } ::v-deep .process-route-arrow-hidden { @@ -513,29 +577,24 @@ export default { } ::v-deep .process-route-spacer td { - height: 6px; - line-height: 6px; - padding: 0; + height: 4px; + line-height: 1 !important; + padding: 0 !important; } ::v-deep .process-route-green { - background: #f0f9eb; - color: #67c23a; + color: #28d961; + font-weight: 700; } ::v-deep .process-route-blue { - background: #ecf5ff; - color: #409eff; -} - -::v-deep .process-route-orange { - background: #fdf6ec; - color: #e6a23c; + color: #09a8ff; + font-weight: 700; } ::v-deep .process-route-red { - background: #fef0f0; - color: #f56c6c; + color: #ff3f37; + font-weight: 700; } ::v-deep .detail-row td { diff --git a/src/views/ProductionManagement/ProductPassRateWorkstation/index.vue b/src/views/ProductionManagement/ProductPassRateWorkstation/index.vue new file mode 100644 index 0000000..32c9081 --- /dev/null +++ b/src/views/ProductionManagement/ProductPassRateWorkstation/index.vue @@ -0,0 +1,283 @@ + + + + + diff --git a/src/views/QualityManagement/CheckTask/processReceive.vue b/src/views/QualityManagement/CheckTask/processReceive.vue index 44f7298..0a358ae 100644 --- a/src/views/QualityManagement/CheckTask/processReceive.vue +++ b/src/views/QualityManagement/CheckTask/processReceive.vue @@ -221,18 +221,7 @@ width="80" prop="工位名称" /> - - + + +
${this.escapeProcessHtml(date)}
${this.escapeProcessHtml(this.getRouteProcessName(process))}
合格${this.escapeProcessHtml(count)}