Blame view

项目文档相关/sql/根据产品平均单价更新库存领取金额.sql 1.95 KB
d8035736   “wangming”   Refactor project ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
  -- ============================================================
  -- 根据产品 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;