-- 流转卡工序记录 投入/产出/不合格 按工序收率重算 | 目标库 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;