[governance] 投诉去重口径: 多渠道归并(非重复) vs 真重复(同渠道) + 年度分层 #55
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
2026-09-11 用户明确最终口径(此前我混淆了两个概念):
★核心:两个概念必须分开(我此前混淆)
我此前的错误:
实证验证(2026-09-11)
V1 年度分布 + 完善度
external_complaintscard_complaints2026 年完善度(明显更高):
V2/V3 两类重复的规模(核心数据)
多渠道事件样例(应归并 1 笔):
真重复样例(同渠道拷贝复制):
V4 编号的年度反转(印证用户「26年编号很完善」)
→ 2026 年 545/557 = 97.8% 是唯一受理号(质量高);2025 年多为批次码。
处理动作 / 设计要求
complaint_scope.py):group_complaint_events(rows, window_days=7):按(SN, 电话)分组 + 时间窗聚类kind='multi_channel'(同一投诉,聚合渠道,不计重复)kind='true_dup'(真重复,计 1 笔,标dup_of)kind='single'multi_channel/true_dup供人工查/complaints/summary、/complaints/analysis的补充表计数改走事件口径multi_channel_events/true_dup_rows供前端展示needs_review,前端提供 Tabdedup_hash唯一索引保持不变验收标准 / 关闭条件
dup_ofcount(*)不变(external_complaints2,655 /card_complaints873)SN=58482343088704返回 3 个渠道)pytest/ruff/vitest/eslint全绿关联
docs/reports/20260911-投诉去重分析/(5 份 CSV)备注: 源文档修订与库的同步(用户已手改腾讯文档)
用户已手工修订腾讯文档中的明显错误日期与空白日期。需注意:
⚠️ 库不会跟随源文档删除:
→ 「源文档对齐」需架构级变更(软删 + 连续N次未出现才确认),建议独立工单评估,
本单只做库内标记 + 统计侧归并(可逆、可审计)。
提交记录
commit:
2f4e4ec—feat(complaints): 投诉事件归并 — 多渠道(非重复) vs 真重复(同渠道) + 年度分层 (#55)6 个文件,+912 / −17:
services/complaint_scope.pydedup_events重写 +split_phones+ 事件常量api/v1/complaints.py_suppl_stats接入事件口径tests/test_complaint_scope.pyscripts/export_dedup_analysis.py.gitignoredocs/reports/20260911-投诉去重分析/README.md提交前门禁
ruff check app/ tests/ scripts/pytest tests/— 全绿(test_complaint_scope61 项)vitest— 46/46eslint— 无告警gitleaks— no leaks found验收基线(实测 2026 全年)
验证方式(可复现)
关于「源文档修订」的结论(重要,用户已手改腾讯文档)
⚠️ 库不会跟随源文档删除:
后者正是 2026-09-05 那次 2,527 行重复导入的成因(日期转置 → 指纹变 → 新增而非更新)。
→ 「源文档对齐」需架构级变更(软删 + 连续 N 次未出现才确认),建议单独立单评估。
且 #42 记载「上游推送会丢失编号 53%」,上游本身不稳定,贸然跟随删除风险高。
本单发现的数据质量问题
/分隔)split_phones)complaint_no列未完成(建议拆单)
needs_review的 Tab(同设备同日多电话)提交记录(#55 收尾)
commit:
adb2751—feat(complaints): 事件口径前端化 + 人工审核入口 (#55)3 个文件,+309 / −40:
api/v1/complaints.py_suppl_event_metrics+ 新增/dedup-reviewviews/dashboards/ComplaintAnalysis.vueapi/complaint.jscomplaintDedupReview交付内容
1. 前端可见「多渠道(非重复)」与「真重复(同渠道)」
卡商独立区块由 2 格扩为 4 格:
2. 人工审核入口
新增「人工审核」Tab(带
el-badge待审核数),对应你说的:3. 后端实现收敛为单一来源
抽出
_suppl_event_metrics(...),/summary与/analysis共用:避免两处复制粘贴导致口径漂移(这正是我在 #52/#53 踩过的坑)。
验收证据(可复现)
实测输出:
门禁
ruff check app/无告警pytest tests/全绿eslint无告警;vitest46/46;vite build通过gitleaks预检 no leaks found一个坑(供后人避雷)
直接调用端点函数时,
Query(None)的默认值是Query对象本身而非None:HTTP 请求走 FastAPI 依赖注入无此问题。我第一次直调就得到了
groups=0的假结论。#55 剩余项
complaint_no列关闭凭证核验 (2026-09-14)
修复位置:
app/api/v1/complaints.py:460_suppl_event_metrics(唯一实现,两处复用)核验方式(只读,未改任何代码)
cd backend && .venv/bin/python -m pytest <files>逐条对应验收标准
complaints.py:478-479定义;multi_channel_events独立计数(非true_dup)dup_of:479;true_dup_events独立计数complaints.py:480legacy_unmerged—— ≤2025 年不归并(用户「旧数据允许偏差」);strict_min_year随返回值暴露count(*)不变external_complaints = 2,656/card_complaints = 873(与库中实际一致)★ 实测(近3月,渠道列按表真实字段传入)
门禁
pytest -k "complaint"→ passed(含test_complaint_scope.py等 163 passed)结论:四条验收标准全部达成(含年度分层与零删除),予以关闭。