根据产品平均单价更新库存领取金额.sql
1.95 KB
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;