云
昨天 74b0d9c5ab1dc316b29f8525dcffe45225d4c43c
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
-- 流转卡工序记录 投入/产出/不合格 按工序收率重算 | 目标库 mom-hm | 2026-10-15
--
-- 口径(与 docs/流转卡投入产出按收率重算方案.md 一致,与生产任务数量同源):
--   产出(pᵢ) = CEIL( Q / (rᵢ₊₁ × … × rₙ) )
--   投入(p₁) = CEIL( 产出(p₁) / r₁ )        -- 首道
--   投入(pᵢ) = 产出(pᵢ₋₁)                    -- i ≥ 2,取 sort 升序上一道产出
--   不合格品(pᵢ) = 投入(pᵢ) - 产出(pᵢ)
--
-- 备份(重算前):
--   SELECT id,card_id,sort,process_id,input_quantity,output_quantity,unqualified_quantity
--   FROM mes_pro_card_process WHERE deleted=0 ORDER BY card_id,sort;   -> task-before.tsv
--
-- 说明:因 MySQL 不允许 UPDATE 与自身子查询同时出现(errno 1093),用临时表暂存重算结果。
 
CREATE TEMPORARY TABLE tmp_card_recalc AS
SELECT t.cp_id,
       t.out_qty,
       COALESCE(LAG(t.out_qty) OVER (PARTITION BY t.work_order_id ORDER BY t.sort ASC),
                CEIL(t.out_qty / COALESCE(t.yield_rate, 1))) AS in_qty
FROM (
  SELECT cp2.id AS cp_id, c.work_order_id, cp2.sort, wop.yield_rate,
         CEIL(wo.quantity / COALESCE(EXP(SUM(LN(COALESCE(wop.yield_rate, 1)))
              OVER (PARTITION BY c.work_order_id ORDER BY cp2.sort DESC
                    ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)), 1)) AS out_qty
  FROM mes_pro_card_process cp2
  JOIN mes_pro_card c ON c.id = cp2.card_id AND c.deleted = 0
  JOIN mes_pro_work_order wo ON wo.id = c.work_order_id
  JOIN mes_pro_work_order_process wop
    ON wop.work_order_id = c.work_order_id AND wop.process_id = cp2.process_id AND wop.deleted = 0
  WHERE cp2.deleted = 0
) t;
 
UPDATE mes_pro_card_process cp
JOIN tmp_card_recalc x ON x.cp_id = cp.id
SET cp.input_quantity       = x.in_qty,
    cp.output_quantity      = x.out_qty,
    cp.unqualified_quantity = x.in_qty - x.out_qty;
 
DROP TEMPORARY TABLE tmp_card_recalc;