xiaoyi
2026-10-30 c99dda111f11698d2689c9095ed96dd9e4fa32cd
fix(qc): 清洗历史质检数据,修复首页合格率超过 100%

现象:首页 KPI「来料检验合格率 133703.70%」「出货检验合格率 88642.86%」

根因:合格率算法为 合格数量 / 检验数量(标准质量口径,代码未变),
但历史导入数据的 check_quantity 被写成固定小值:
· IQC 27 条全部为 5
· OQC 7 条全部为 1
而 qualified_quantity 填的是到货/出货总量(27 条 IQC 全部 received = qualified)
→ 分子远大于分母,合格率爆表。

代码逻辑(MesQcIqcServiceImpl:127):
check_quantity = qualified_quantity + unqualified_quantity

清洗依据(执行前已核对):
IQC 27 条:qualified + unqualified = received_quantity 全部吻合
OQC 7 条:qualified + unqualified = out_quantity 全部吻合
→ 只改 check_quantity 一列,不动合格/不合格/接收数量

结果:
IQC 检验量 135 → 180500,合格率 133703.70% → 100.00%
OQC 检验量 7 → 6205,合格率 88642.86% → 100.00%
违反公式条数:0

备份:/data/backup/mysql/manual/pre_qc_quantity_fix_20261030113005.sql
脚本幂等:ABS(check_quantity - (qualified+unqualified)) > 0.001 才更新
已添加1个文件
72 ■■■■■ 文件已修改
sql/mysql/fix_qc_check_quantity_20261030.sql 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
sql/mysql/fix_qc_check_quantity_20261030.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,72 @@
-- ============================================================
-- ä¿®å¤é¦–页「来料合格率 / å‡ºè´§åˆæ ¼çŽ‡ã€è¶…è¿‡ 100% çš„问题
-- ç”Ÿæˆæ—¶é—´ï¼š2026-10-30
--
-- é—®é¢˜çŽ°è±¡ï¼šé¦–é¡µ KPI æ˜¾ç¤º
--   æ¥æ–™æ£€éªŒåˆæ ¼çއ 133703.70%(应为 100%)
--   å‡ºè´§æ£€éªŒåˆæ ¼çއ  88642.86%(应为 100%)
--
-- æ ¹å› ï¼šåˆæ ¼çŽ‡ç®—æ³• = åˆæ ¼æ•°é‡ / æ£€éªŒæ•°é‡ï¼ˆæ ‡å‡†è´¨é‡å£å¾„)
--       ä½†åŽ†å²å¯¼å…¥æ•°æ®çš„ check_quantity(检验数量)被写成了固定小值
--       ï¼ˆIQC å…¨ä¸º 5,OQC å…¨ä¸º 1),而 qualified_quantity å¡«çš„æ˜¯åˆ°è´§/出货总量。
--       åˆ†å­è¿œå¤§äºŽåˆ†æ¯ â†’ åˆæ ¼çŽ‡çˆ†è¡¨ã€‚
--
-- ä»£ç é€»è¾‘(MesQcIqcServiceImpl:127):
--   check_quantity = qualified_quantity + unqualified_quantity
--
-- æ•°æ®äº‹å®žï¼ˆæ¸…洗前已核对):
--   IQC 27 æ¡ï¼šqualified + unqualified = received_quantity  å…¨éƒ¨å»åˆ
--   OQC  7 æ¡ï¼šqualified + unqualified = out_quantity       å…¨éƒ¨å»åˆ
--   â†’ åªéœ€æŠŠ check_quantity æ”¹æˆè¿™ä¸ªå’Œå³å¯ï¼Œä¸åŠ¨å…¶å®ƒä»»ä½•åˆ—
--
-- å½±å“ï¼šä¿®å¤åŽ IQC / OQC åˆæ ¼çŽ‡å‡æ¢å¤ä¸º 100.00%
-- å¤‡ä»½ï¼š/data/backup/mysql/manual/pre_qc_quantity_fix_*.sql
-- å¹‚等:可重复执行(已正确的不会再变)
-- ============================================================
-- ---------- 1. æ¸…洗前快照 ----------
SELECT 'IQC-清洗前' AS çŽ¯èŠ‚, COUNT(*) AS è®°å½•æ•°,
       SUM(check_quantity) AS æ£€éªŒé‡åˆè®¡, SUM(qualified_quantity) AS åˆæ ¼é‡åˆè®¡,
       ROUND(SUM(qualified_quantity)/SUM(check_quantity)*100, 2) AS å½“前合格率
  FROM mes_qc_iqc WHERE deleted = 0;
SELECT 'OQC-清洗前' AS çŽ¯èŠ‚, COUNT(*) AS è®°å½•æ•°,
       SUM(check_quantity) AS æ£€éªŒé‡åˆè®¡, SUM(qualified_quantity) AS åˆæ ¼é‡åˆè®¡,
       ROUND(SUM(qualified_quantity)/SUM(check_quantity)*100, 2) AS å½“前合格率
  FROM mes_qc_oqc WHERE deleted = 0;
-- ---------- 2. ä¿®æ­£ IQC:检验数量 = åˆæ ¼æ•°é‡ + ä¸åˆæ ¼æ•°é‡ ----------
UPDATE mes_qc_iqc
   SET check_quantity = qualified_quantity + unqualified_quantity,
       updater        = '1',
       update_time    = NOW()
 WHERE deleted = 0
   AND ABS(check_quantity - (qualified_quantity + unqualified_quantity)) > 0.001;
-- ---------- 3. ä¿®æ­£ OQC:检验数量 = åˆæ ¼æ•°é‡ + ä¸åˆæ ¼æ•°é‡ ----------
UPDATE mes_qc_oqc
   SET check_quantity = qualified_quantity + unqualified_quantity,
       updater        = '1',
       update_time    = NOW()
 WHERE deleted = 0
   AND ABS(check_quantity - (qualified_quantity + unqualified_quantity)) > 0.001;
-- ---------- 4. æ¸…洗后校验 ----------
SELECT 'IQC-清洗后' AS çŽ¯èŠ‚, COUNT(*) AS è®°å½•æ•°,
       SUM(check_quantity) AS æ£€éªŒé‡åˆè®¡, SUM(qualified_quantity) AS åˆæ ¼é‡åˆè®¡,
       ROUND(SUM(qualified_quantity)/SUM(check_quantity)*100, 2) AS åˆæ ¼çއ
  FROM mes_qc_iqc WHERE deleted = 0;
SELECT 'OQC-清洗后' AS çŽ¯èŠ‚, COUNT(*) AS è®°å½•æ•°,
       SUM(check_quantity) AS æ£€éªŒé‡åˆè®¡, SUM(qualified_quantity) AS åˆæ ¼é‡åˆè®¡,
       ROUND(SUM(qualified_quantity)/SUM(check_quantity)*100, 2) AS åˆæ ¼çއ
  FROM mes_qc_oqc WHERE deleted = 0;
-- ---------- 5. ç¡®è®¤æ²¡æœ‰ä»»ä½•一条再违反公式 ----------
SELECT 'IQC è¿åå…¬å¼æ¡æ•°' AS æ£€æŸ¥é¡¹,
       SUM(CASE WHEN ABS(check_quantity - (qualified_quantity + unqualified_quantity)) > 0.001 THEN 1 ELSE 0 END) AS æ¡æ•°
  FROM mes_qc_iqc WHERE deleted = 0;
SELECT 'OQC è¿åå…¬å¼æ¡æ•°' AS æ£€æŸ¥é¡¹,
       SUM(CASE WHEN ABS(check_quantity - (qualified_quantity + unqualified_quantity)) > 0.001 THEN 1 ELSE 0 END) AS æ¡æ•°
  FROM mes_qc_oqc WHERE deleted = 0;