-- 库存查询需求量与需求量明细一致性排查；修改人:Ld 修改时间:2026-07-24 08:00:00;
SET NOCOUNT ON;

;WITH 组件订单 AS
(
    SELECT c.组件流水号,o.订单编号,c.是否分配,o.订单类型,o.是否提交,p.是否启用,ISNULL(k.简称,'') AS 简称
    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.客户关系管理系统_客户名称 k ON p.客户流水号=k.客户流水号
),
需求明细 AS
(
    SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(b.零件数量,0)) AS 需求量,N'生产订单需求' AS 来源
    FROM dbo.PDM_零件明细表_基本件 b
    INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
    WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,b.组件流水号,b.物料流水号
    UNION ALL
    SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(s.零件数量,0)) AS 需求量,N'生产订单需求' AS 来源
    FROM dbo.PDM_零件明细表_标准件和外购件 s
    INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
    WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,s.组件流水号,s.物料流水号
    UNION ALL
    SELECT co.订单编号,t.组件流水号,t.物料流水号,SUM(ISNULL(t.实领数,0)) AS 需求量,N'临时领料需求' AS 来源
    FROM dbo.车间装配管理_装配执行_临时领料明细 t
    LEFT JOIN 组件订单 co ON t.组件流水号=co.组件流水号
    WHERE t.物料流水号 IS NOT NULL AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,t.组件流水号,t.物料流水号
),
已领明细 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 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 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 NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,l.组件流水号,l.物料流水号
),
已领汇总 AS
(
    SELECT 订单编号,组件流水号,物料流水号,SUM(已领数) AS 已领数
    FROM 已领明细 GROUP BY 订单编号,组件流水号,物料流水号
),
明细 AS
(
    SELECT d.订单编号,d.组件流水号,d.物料流水号,d.需求量,ISNULL(l.已领数,0) AS 已领数,
           CASE WHEN d.需求量>ISNULL(l.已领数,0) THEN d.需求量-ISNULL(l.已领数,0) ELSE 0 END AS 最终需求量,d.来源
    FROM 需求明细 d
    LEFT JOIN 已领汇总 l ON d.物料流水号=l.物料流水号 AND d.组件流水号=l.组件流水号 AND ISNULL(d.订单编号,'')=ISNULL(l.订单编号,'')
),
明细汇总 AS
(
    SELECT 物料流水号,SUM(最终需求量) AS 明细最终需求量
    FROM 明细 WHERE 最终需求量<>0 GROUP BY 物料流水号
)
SELECT COUNT(*) AS 明细有需求物料数,SUM(明细最终需求量) AS 明细最终需求量合计 FROM 明细汇总;

;WITH 组件订单 AS
(
    SELECT c.组件流水号,o.订单编号,c.是否分配,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.项目流水号
),
需求明细 AS
(
    SELECT co.订单编号,b.组件流水号,b.物料流水号,SUM(ISNULL(b.零件数量,0)) AS 需求量
    FROM dbo.PDM_零件明细表_基本件 b
    INNER JOIN 组件订单 co ON b.组件流水号=co.组件流水号
    WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,b.组件流水号,b.物料流水号
    UNION ALL
    SELECT co.订单编号,s.组件流水号,s.物料流水号,SUM(ISNULL(s.零件数量,0)) AS 需求量
    FROM dbo.PDM_零件明细表_标准件和外购件 s
    INNER JOIN 组件订单 co ON s.组件流水号=co.组件流水号
    WHERE co.是否分配=1 AND co.订单类型<>3 AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,s.组件流水号,s.物料流水号
    UNION ALL
    SELECT co.订单编号,t.组件流水号,t.物料流水号,SUM(ISNULL(t.实领数,0)) AS 需求量
    FROM dbo.车间装配管理_装配执行_临时领料明细 t
    LEFT JOIN 组件订单 co ON t.组件流水号=co.组件流水号
    WHERE t.物料流水号 IS NOT NULL AND NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,t.组件流水号,t.物料流水号
),
已领明细 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 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 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 NOT (ISNULL(co.是否提交,0)=6 AND ISNULL(co.是否启用,0)=1)
    GROUP BY co.订单编号,l.组件流水号,l.物料流水号
),
已领汇总 AS
(
    SELECT 订单编号,组件流水号,物料流水号,SUM(已领数) AS 已领数
    FROM 已领明细 GROUP BY 订单编号,组件流水号,物料流水号
),
明细 AS
(
    SELECT d.订单编号,d.组件流水号,d.物料流水号,
           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 ISNULL(d.订单编号,'')=ISNULL(l.订单编号,'')
),
明细汇总 AS
(
    SELECT 物料流水号,SUM(最终需求量) AS 明细最终需求量
    FROM 明细 WHERE 最终需求量<>0 GROUP BY 物料流水号
)
SELECT COUNT(*) AS 明细与需求视图不一致物料数,SUM(ISNULL(m.明细最终需求量,0)) AS 明细合计,SUM(ISNULL(v.需求量,0)) AS 视图合计,SUM(ISNULL(m.明细最终需求量,0)-ISNULL(v.需求量,0)) AS 差异合计
FROM 明细汇总 m FULL JOIN dbo.物料管理_需求量_视图 v ON m.物料流水号=v.物料流水号
WHERE ISNULL(m.明细最终需求量,0)<>ISNULL(v.需求量,0);
