根据产品平均单价更新库存领取金额.sql 1.95 KB
-- ============================================================
-- 根据产品 F_AveragePrice 更新库存领取的单价、总价
-- 说明:领取记录在 lq_inventory_usage,单价 F_UnitPrice、总价 F_TotalAmount;
--       单价取产品 F_AveragePrice,若为 0 或 NULL 则取 F_Price;总价 = 单价 × 领取数量。
--       同时按批次汇总,回写 lq_inventory_usage_application 的 F_TotalAmount。
-- ============================================================

-- 一、预览:将要更新的使用记录条数及金额变化(不修改数据)
SELECT
    u.F_Id AS 使用记录ID,
    u.F_ProductId AS 产品ID,
    p.F_ProductName AS 产品名称,
    u.F_UsageQuantity AS 领取数量,
    u.F_UnitPrice AS 当前单价,
    u.F_TotalAmount AS 当前总价,
    IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price) AS 新单价_取自产品,
    IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price) * u.F_UsageQuantity AS 新总价
FROM lq_inventory_usage u
INNER JOIN lq_product p ON u.F_ProductId = p.F_Id
WHERE u.F_IsEffective = 1
  AND (u.F_UnitPrice != IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price)
       OR u.F_TotalAmount != IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price) * u.F_UsageQuantity)
LIMIT 500;

-- 二、更新库存使用记录:单价、总价(按产品 F_AveragePrice,否则 F_Price)
UPDATE lq_inventory_usage u
INNER JOIN lq_product p ON u.F_ProductId = p.F_Id
SET
    u.F_UnitPrice = IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price),
    u.F_TotalAmount = IFNULL(NULLIF(p.F_AveragePrice, 0), p.F_Price) * u.F_UsageQuantity,
    u.F_UpdateTime = NOW()
WHERE u.F_IsEffective = 1;

-- 三、按批次汇总,更新申请表的 F_TotalAmount
UPDATE lq_inventory_usage_application a
INNER JOIN (
    SELECT F_UsageBatchId, SUM(F_TotalAmount) AS batch_total
    FROM lq_inventory_usage
    WHERE F_IsEffective = 1
    GROUP BY F_UsageBatchId
) t ON a.F_UsageBatchId = t.F_UsageBatchId
SET a.F_TotalAmount = t.batch_total
WHERE a.F_IsEffective = 1;