Commit 581b3e16 authored by Data Governance Dev's avatar Data Governance Dev

fix(idcard-scan): 反查时现场 validate,避免大小写/collation 漏匹配导致误标「不合规」

- 问题:MySQL DISTINCT/IN 按 collation 比较(utf8mb4_unicode_ci 不区分
  大小写),但 Python dict 区分大小写。如果数据库真实存的是大写 X 但
  distinct 返回小写 x,bad_reasons 里只有小写的 key,反查拿到大写 X
  的行就查不到 key,错误地标 '不合规'。
- 例子:'42112319760324521X'(合规)+ '42112319760324521x'(CHARSET
  违规)共存时,大写 X 那行被错误标 '不合规',且原因不明确。
- 修复:去掉 bad_reasons 缓存查询,对每行现场 validate —— 合规行直接
  丢弃,违规行给出准确原因。出现丢弃时打 INFO 日志方便排查。
parent a5990444
......@@ -470,6 +470,15 @@ def _fetch_bad_rows_one(
"""反查某列的违规行;返回 (tname, cname, rows_with_reason)
rows_with_reason 每行 = 原数据库行 + '_id_card_violation' 字段(违规原因)
2026-08-17 修复:现场再 validate 一次,不再依赖 bad_reasons key 匹配
- 背景:MySQL DISTINCT / IN 按 collation 比较(utf8mb4_unicode_ci 不区分
大小写),但 Python dict 区分大小写
- 旧逻辑:如果数据库真实存的是大写 X 但 distinct 返回小写 x,
bad_reasons 里只有 '42112319760324521x',反查拿到大写 X 的行就
查不到 key,错误地标 '不合规'
- 新逻辑:对每行现场 validate 一次 —— 合规行直接丢弃,违规行给出准确原因
(避免 collation / 大小写 / 全角半角等任何键不匹配导致的误标)
"""
progress.start_column(tname, cname)
cfg = DBConfig(**cfg_dict)
......@@ -480,13 +489,30 @@ def _fetch_bad_rows_one(
except Exception as e:
logger.warning(f" · {tname}.{cname} 反查失败:{type(e).__name__}: {e}")
return (tname, cname, [])
# 给每行加上 _id_card_violation 字段
# 给每行加上 _id_card_violation 字段;现场 validate 确保原因准确
enriched = []
skipped_ok = 0
for row in rows:
v = row.get(cname)
v_str = "" if v is None else str(v)
row["_id_card_violation"] = bad_reasons.get(v_str, "不合规")
if v is None:
# NULL 不算违规(2026-08-17 起空白/None/全空格直接合规)
continue
v_str = str(v).strip()
if not v_str:
continue
# 现场 validate(不走 bad_reasons 缓存,避免大小写/collation 不匹配)
r = validate(v_str)
if r["ok"]:
skipped_ok += 1
continue # 这一行实际合规(distinct/IN 因 collation 多匹配到的)
# 违规:注入准确的违规原因
row["_id_card_violation"] = next(iter(r["reasons"].values()), "不合规")
enriched.append(row)
if skipped_ok:
logger.info(
f" · {tname}.{cname} 反查时过滤掉 {skipped_ok} 行(实际合规,"
f"可能是大小写/collation 差异导致 IN 多匹配)"
)
return (tname, cname, enriched)
except Exception as e:
logger.warning(f" · {tname}.{cname} 反查 worker 异常:{type(e).__name__}: {e}")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment