-- 库存查询2026年前未完成订单需求明细，按组件完成状态排除已完成组件并汇总导出；修改人:Ld 修改时间:2026-07-24 11:30:00;
SET NOCOUNT ON;

;WITH 组件订单 AS
(
    SELECT
        c.组件流水号,
        o.订单编号,
        o.下单日期,
        o.下单人,
        ISNULL(kh.客户名称, '') AS 客户名称,
        ISNULL(psn.姓名, CONVERT(nvarchar(50), o.下单人)) AS 下单人姓名,
        c.是否分配,
        c.产品状态,
        c.数量 AS 组件数量,
        c.完成数量 AS 组件完成数量,
        o.订单类型,
        o.是否提交,
        p.是否启用
    FROM dbo.PDM_组件名称 c
    INNER JOIN dbo.PDM_机床名称 m ON c.机床流水号 = m.机床流水号
    INNER JOIN dbo.PDM_项目名称 p ON m.项目流水号 = p.项目流水号
    INNER JOIN dbo.合同管理_订单信息_基础表 o ON p.项目流水号 = o.项目流水号
    LEFT JOIN dbo.客户关系管理系统_客户名称 kh ON p.客户流水号 = kh.客户流水号
    LEFT JOIN dbo.人事档案管理_人员名单 psn ON o.下单人 = psn.人员编号
),
需求明细 AS
(
    SELECT
        co.订单编号,
        co.下单日期,
        co.客户名称,
        co.下单人姓名,
        b.组件流水号,
        b.物料流水号,
        ISNULL(mat.名称, b.名称) AS 零件名称,
        ISNULL(mat.代号, b.代号) AS 图号,
        SUM(ISNULL(b.零件数量, 0)) AS 需求量
    FROM dbo.PDM_零件明细表_基本件 b
    INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
    LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON b.物料流水号 = mat.物料流水号
    WHERE co.是否分配 = 1
      AND co.订单类型 <> 3
      AND co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
      AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
    GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, b.组件流水号, b.物料流水号, ISNULL(mat.名称, b.名称), ISNULL(mat.代号, b.代号)

    UNION ALL

    SELECT
        co.订单编号,
        co.下单日期,
        co.客户名称,
        co.下单人姓名,
        s.组件流水号,
        s.物料流水号,
        mat.名称 AS 零件名称,
        mat.代号 AS 图号,
        SUM(ISNULL(s.零件数量, 0)) AS 需求量
    FROM dbo.PDM_零件明细表_标准件和外购件 s
    INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
    LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON s.物料流水号 = mat.物料流水号
    WHERE co.是否分配 = 1
      AND co.订单类型 <> 3
      AND co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
      AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
    GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, s.组件流水号, s.物料流水号, mat.名称, mat.代号

    UNION ALL

    SELECT
        co.订单编号,
        co.下单日期,
        co.客户名称,
        co.下单人姓名,
        t.组件流水号,
        t.物料流水号,
        mat.名称 AS 零件名称,
        mat.代号 AS 图号,
        SUM(ISNULL(t.实领数, 0)) AS 需求量
    FROM dbo.车间装配管理_装配执行_临时领料明细 t
    LEFT JOIN 组件订单 co ON t.组件流水号 = co.组件流水号
    LEFT JOIN dbo.库存管理_物料主文件_基本 mat ON t.物料流水号 = mat.物料流水号
    WHERE t.物料流水号 IS NOT NULL
      AND co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
      AND NOT (ISNULL(co.产品状态, 0) = 4 OR (ISNULL(co.组件数量, 0) > 0 AND ISNULL(co.组件完成数量, 0) >= ISNULL(co.组件数量, 0)))
    GROUP BY co.订单编号, co.下单日期, co.客户名称, co.下单人姓名, t.组件流水号, t.物料流水号, mat.名称, mat.代号
),
已领明细 AS
(
    SELECT co.订单编号, b.组件流水号, b.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
    FROM dbo.车间装配管理_领料单明细 l
    INNER JOIN dbo.PDM_零件明细表_基本件 b ON l.基本件流水号 = b.基本件流水号
    INNER JOIN 组件订单 co ON b.组件流水号 = co.组件流水号
    WHERE co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
    GROUP BY co.订单编号, b.组件流水号, b.物料流水号

    UNION ALL

    SELECT co.订单编号, s.组件流水号, s.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
    FROM dbo.车间装配管理_领料单明细 l
    INNER JOIN dbo.PDM_零件明细表_标准件和外购件 s ON l.标准件和外购件流水号 = s.标准件和外购件流水号
    INNER JOIN 组件订单 co ON s.组件流水号 = co.组件流水号
    WHERE co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
    GROUP BY co.订单编号, s.组件流水号, s.物料流水号

    UNION ALL

    SELECT co.订单编号, l.组件流水号, l.物料流水号, SUM(ISNULL(l.已领数量, 0)) AS 已领数
    FROM dbo.车间装配管理_领料单明细 l
    LEFT JOIN 组件订单 co ON l.组件流水号 = co.组件流水号
    WHERE l.物料流水号 IS NOT NULL
      AND ISNULL(l.物料流水号, 0) <> 0
      AND ISNULL(l.基本件流水号, 0) = 0
      AND ISNULL(l.标准件和外购件流水号, 0) = 0
      AND co.下单日期 < '2026-01-01'
      AND NOT (ISNULL(co.是否提交, 0) = 6 AND ISNULL(co.是否启用, 0) = 1)
    GROUP BY co.订单编号, l.组件流水号, l.物料流水号
),
已领汇总 AS
(
    SELECT 订单编号, 组件流水号, 物料流水号, SUM(已领数) AS 已领数
    FROM 已领明细
    GROUP BY 订单编号, 组件流水号, 物料流水号
),
基本未完成 AS
(
    SELECT b.组件流水号, COUNT(*) AS 未完成数
    FROM dbo.PDM_零件明细表_基本件 b
    LEFT JOIN dbo.车间生产管理_零件工艺计划_视图 v ON b.基本件流水号 = v.基本件流水号
    WHERE ISNULL(v.考核状态, 0) < 3
    GROUP BY b.组件流水号
),
采购未完成 AS
(
    SELECT 组件流水号, COUNT(*) AS 未完成数
    FROM dbo.采购管理_采购合同明细_查询视图
    WHERE ISNULL(采购状态, N'') <> N'已入库'
    GROUP BY 组件流水号
),
存在部件组件 AS
(
    SELECT 组件流水号 FROM dbo.PDM_零件明细表_基本件
    UNION
    SELECT 组件流水号 FROM dbo.PDM_零件明细表_标准件和外购件
    UNION
    SELECT 组件流水号 FROM dbo.采购管理_采购合同明细_查询视图
),
全部完成组件 AS
(
    SELECT e.组件流水号
    FROM 存在部件组件 e
    LEFT JOIN 基本未完成 b ON e.组件流水号 = b.组件流水号
    LEFT JOIN 采购未完成 p ON e.组件流水号 = p.组件流水号
    WHERE ISNULL(b.未完成数, 0) = 0
      AND ISNULL(p.未完成数, 0) = 0
),
最终明细 AS
(
    SELECT
        d.订单编号,
        CONVERT(varchar(10), d.下单日期, 23) AS 下单日期,
        d.客户名称,
        d.下单人姓名 AS 下单人,
        d.零件名称,
        d.图号,
        d.需求量,
        ISNULL(l.已领数, 0) AS 已领数,
        CASE WHEN d.需求量 > ISNULL(l.已领数, 0) THEN d.需求量 - ISNULL(l.已领数, 0) ELSE 0 END AS 最终需求量
    FROM 需求明细 d
    LEFT JOIN 已领汇总 l
        ON d.订单编号 = l.订单编号
       AND d.组件流水号 = l.组件流水号
       AND d.物料流水号 = l.物料流水号
    WHERE NOT EXISTS (SELECT 1 FROM 全部完成组件 c WHERE c.组件流水号 = d.组件流水号)
)
SELECT 订单编号, 下单日期, 客户名称, 下单人, 零件名称, 图号, SUM(需求量) AS 需求量, SUM(已领数) AS 已领数, SUM(最终需求量) AS 最终需求量
FROM 最终明细
WHERE 最终需求量 > 0
GROUP BY 订单编号, 下单日期, 客户名称, 下单人, 零件名称, 图号
ORDER BY 下单日期 DESC, 订单编号, 零件名称, 图号;
