-- ============================================================
-- 修复: [dbo].[质量管理_质量检验_入库质检任务_查询]
-- 错误1: CheckedQuantity CTE 末尾多余逗号 (语法错误)
-- 错误2: QualityData 中 检测类型编号 硬编码6 vs WHERE过滤5 (不一致)
-- 错误3: 检测说明 列缺少表前缀 (歧义)
-- 错误4: GROUP BY 含不必要的 cq.聚合字段
-- 日期: 2026-05-22
-- ============================================================

USE [YL_MESDB]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[质量管理_质量检验_入库质检任务_查询]
    @订单号 NVARCHAR(100) = '',
    @零件编号 NVARCHAR(100) = '',
    @零件名称 NVARCHAR(100) = '',
    @检测日期_Start NVARCHAR(20) = '',
    @检测日期_End NVARCHAR(20) = '',
    @检测结果 NVARCHAR(10) = '',
    @检测人 NVARCHAR(50) = '',
    @状态 NVARCHAR(10) = '',
    @单据码 NVARCHAR(50) = ''
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @SQL NVARCHAR(MAX)
    DECLARE @WhereConditions NVARCHAR(MAX) = ''
    DECLARE @TaskWhere NVARCHAR(MAX) = ''
    DECLARE @OuterWhere NVARCHAR(MAX) = ''

    -- 构建任务表筛选条件（用于内层）
    SET @TaskWhere = @TaskWhere + ' AND (task.订单类型 = ''20'') '
    IF @单据码 <> ''
        SET @TaskWhere = @TaskWhere + ' AND task.单据码 LIKE ''%' + @单据码 + '%'''
    IF @订单号 <> ''
        SET @TaskWhere = @TaskWhere + ' AND task.订单编号 LIKE ''%' + @订单号 + '%'''
    IF @零件编号 <> ''
        SET @TaskWhere = @TaskWhere + ' AND task.物料编码 LIKE ''%' + @零件编号 + '%'''
    IF @零件名称 <> ''
        SET @TaskWhere = @TaskWhere + ' AND task.物料名称 LIKE ''%' + @零件名称 + '%'''

    -- 构建外层筛选条件（用于计算结果）
    IF @检测结果 <> ''
        SET @OuterWhere = @OuterWhere + ' AND 检测结果 = ' + @检测结果
    IF @状态 <> ''
        SET @OuterWhere = @OuterWhere + ' AND 状态 = ''' + @状态 + ''''
    IF @检测人 <> ''
        SET @OuterWhere = @OuterWhere + ' AND 检测人 LIKE ''%' + @检测人 + '%'''
    IF @检测日期_Start <> '' AND @检测日期_End <> ''
        SET @OuterWhere = @OuterWhere + ' AND CAST(检验时间 AS DATE) BETWEEN ''' + @检测日期_Start + ''' AND ''' + @检测日期_End + ''''

    -- 构建内层WHERE
    DECLARE @InnerWhere NVARCHAR(MAX) = ''
    IF LEN(@TaskWhere) > 0
        SET @InnerWhere = ' WHERE ' + SUBSTRING(@TaskWhere, 5, LEN(@TaskWhere))

    SET @SQL = '
WITH QualityData AS (
    SELECT 
        计划号, 
        检验数量, 
        合格数, 
        不合格数, 
        检测人, 
        检测时间,
        检测类型编号          -- ============ 修复点②：不要硬编码，取实际值 ============
    FROM [dbo].[YL_质量检验_质检记录]
    WHERE 检测类型编号 = 5    -- ← WHERE 和 SELECT 一致了
),
-- 统计已检验数量和合格数
CheckedQuantity AS (
    SELECT 
        计划号,
        行号,
        订单类型 AS 质检订单类型,
        SUM(检验数量) AS 已检验数量,
        SUM(合格数) AS 累计合格数,
        SUM(不合格数) AS 累计不合格数,
        MAX(检测说明) AS 检测说明    -- ============ 修复点①：去掉末尾多余的逗号 ============
    FROM [dbo].[YL_质量检验_质检记录]
    WHERE 检测类型编号 = 5
    GROUP BY 计划号, 行号, 订单类型
),
AggregatedData AS (
    SELECT 
        task.订单编号 AS 计划号,
        task.单据码,
        task.订单类型,
        task.物料编码,
        task.物料名称,
        task.到货数,
        task.入库数量,
        task.加急状态,
        task.行号,
        task.采购到货时间,
        task.存放位置,
        task.加急总数,
        -- 使用累计数据
        ISNULL(cq.已检验数量, 0) AS 检验数量,
        ISNULL(cq.累计合格数, 0) AS 合格数,
        ISNULL(cq.累计不合格数, 0) AS 不合格数,
        ISNULL(cq.已检验数量, 0) AS 已检验数量,
        cq.检测说明 AS 备注,                                -- ============ 修复点③：加上表前缀 cq. ============
        task.入库数量 - ISNULL(cq.已检验数量, 0) AS 剩余待检数量,
        -- 检测人（取最新的或合并多人）
        CASE 
            WHEN COUNT(DISTINCT qd.检测人) = 1 THEN MAX(qd.检测人)
            ELSE STUFF((
                SELECT DISTINCT '', '' + 检测人 
                FROM QualityData qd2 
                WHERE qd2.计划号 = task.订单编号
                  AND ISNULL(qd2.检测人, '''') <> ''''
                FOR XML PATH('''')), 1, 2, '''')
        END AS 检测人,
        MAX(qd.检测时间) AS 检验时间,
        -- 检测结果（基于累计数据）
        CASE 
            WHEN ISNULL(cq.累计不合格数, 0) > 0 THEN 2
            WHEN ISNULL(cq.累计合格数, 0) > 0 THEN 1
            ELSE 0
        END AS 检测结果,
        -- 检验状态
        CASE 
            WHEN ISNULL(cq.已检验数量, 0) >= task.入库数量 AND task.入库数量 > 0 THEN ''1''
            ELSE ''0''
        END AS 状态
    FROM [dbo].[质量检验_质检任务_SAP] task
    LEFT JOIN QualityData qd ON task.订单编号 = qd.计划号
    LEFT JOIN CheckedQuantity cq ON task.订单编号 = cq.计划号 AND task.行号 = cq.行号 AND task.订单类型 = cq.质检订单类型
    ' + @InnerWhere + '
    GROUP BY 
        task.订单编号, task.单据码, task.订单类型, 
        task.物料编码, task.物料名称, task.到货数, 
        task.入库数量, task.加急状态, task.行号, 
        task.采购到货时间, task.存放位置, task.加急总数,
        cq.已检验数量, cq.累计合格数, cq.累计不合格数,
        cq.检测说明            -- ============ 修复点④：GROUP BY 加入新增的检测说明列 ============
)
SELECT * FROM AggregatedData
WHERE 1=1' + @OuterWhere + '
ORDER BY 加急状态 DESC'

    PRINT @SQL
    EXEC sp_executesql @SQL
END
GO
