分支
feature/org-insights-rebuild(基线origin/test@ 772c8117)· 2026-08-20 · dev3 东京云机
长官令:1+2+3 批全做到前端 · 阈值做配置表 + 读写接口 · 文案用「建档 N 天」· 暂不发 test
原型 v14 的三批改造已全部落码并全流程贯通(库表 → 服务层 → 接口 → 前端 → 测试),
唯一挂起的是第 1 批里的「4 处埋点补 channel」—— 长官定了先去 test 跑 SQL 再决定,我没动它。
本机跑不了任何测试(后端无依赖且装不下、前端无 node_modules),所以下面凡是写「已验证」的,
都是静态验证并贴了命令;凡是跑不了的,一律标「未验证」,没有一条是推断冒充的。
| 层 | 文件 | 动作 |
|---|---|---|
| 库表 | migrations/versions/org_insight_thresholds.py(新) |
单行阈值表 + 7 条 CHECK + 同 commit 落默认行 |
| 模型 | app/models/activity.py +45 行 |
OrgInsightThresholds(加进 Phase 52 同族,不新建文件) |
| 注册 | app/models/__init__.py |
import + __all__ |
| 服务 | app/services/org_insight_service.py(新 · 533 行) |
8 条分组聚合 + 8 状态判定 + 证据/动作/紧迫度排序 + 总览卡/频率分档 |
| 接口 | app/api/admin_activity.py |
重写 GET /org-insights;新增 GET/PUT /org-insights/config |
| 前端 | web/app/(dashboard)/admin/org-insights/page.tsx(786 行) |
整页重构:四卡筛选器 / 警示条 / 分段柱 / 状态分诊 / 频率分档 / 口径抽屉 |
| 测试 | tests/api/test_admin_activity.py、web/__tests__/org-insights-page.test.tsx |
按新契约重写(未跑) |
usage_orgs ∪ plan_orgs → 全部 is_active 机构。test_org_insights_lists_orgs_with_zero_activity 就是钉这条的)date() 函数表达式过滤会绕过 idx_seat_activity_org_time,created_at >= since_dt 走索引、精确边界仍由日期表达式把关resolve_actor 优先级 1 认 seat_ 前缀不看 channel),补了只解决 miniapp/temp_link 区分recency 从全时段 MAX 改为真实「最后活动距今天数」并直接返回cur/max(prev,1) 的假暴涨,本期/上期原始数字直接返回,由页面自己对比seat_expires_at → 状态 3「续费窗口」+ 状态 1「已流失」deal_amount 全链路改称 「已确认方案标价」(quoted_amount)mid >= high 时服务层压到「高频 − 1」,库里存原值 —— 与原型「不会算乱」一致lens=conv 写死请求、后端三榜分支永远只走一个,随重写消失¥N.N 万(旧页 :181 无空格 / :361 有空格)cards / lens / conv / risk / up。仓库内消费方只有这一个页面is_active=true,api_credentials.is_active(决定 ③ 说的「凭据信息是现成的」)。长官令「模拟 test 环境跑一遍」后补做。这是云机本地模拟,不是 test 环境验收:
数据是脚本造的,不是真实业务数据;但 PG / ORM / router / JWT / 迁移全是真的,0 mock。
跑起来用了什么(经长官批准装,全部 pip install --user,不动系统、不碰其他 dev):
最小依赖 sqlalchemy/asyncpg/pydantic/fastapi/httpx/pytest + pgserver(自建 PG 实例,
socket /home/dev3/pgdata3)+ redis/psycopg2/pgvector/jose/alembic。未装 torch/paddle/faiss。
⚠️ 过程中发现共享 PG(dev2 起的 5432)当前是坏的:/dev/shm 今天 04:22 被清空,
其 DSM 段丢失,所有新连接报 could not open shared memory segment。认证是通的(trust 属实),
是服务端状态问题。我没碰它,另起了自己的实例。
| 项 | 结果 | 证据 |
|---|---|---|
| 鉴权(真 JWT 验签) | ✅ | 无 token → 401;admin token → 200 |
| 8 状态判定 | ✅ 10/10 全对 | healthy / renew_window / cliff / untrusted×2 / no_seat / never_active / churned / low_util / worth_digging |
| 缺陷 1(0 活动机构在榜) | ✅ | 从未激活、未配席位两家都在 ranking 里 |
| 状态优先级排序 | ✅ | 不可信 < 续费窗口 < 断崖 < 正常 |
| admin 事件剔除 | ✅ | 造 99 条 admin_view,本月计数仍是 42(不是 141) |
| 原始数字口径 | ✅ | 上周 42 / 剩余到期 4 天 / 报告 10→方案 5 / 标价 5000 / 在用席位 2/2 |
| 契约无分数字段 | ✅ | conv、risk 均不在响应里 |
| 总览四卡 + 警示 + 分档 | ✅ | 月卡「无上期」为 null;警示点名成功;分档家数 = 榜单家数 |
| 阈值配置表读写 | ✅ | GET 默认 30 → PUT 3 → 存住 → 主接口生效 → mid≥high 自动压到 3 → 该机构状态随之改变 |
| N+1 消除 | ✅ 实测恒定 | 机构 8 家 → 33 家,SQL 均为 9 条(旧实现 33 家 ≈ 297 条) |
| alembic 迁移真跑 | ✅ | upgrade 建表 + 默认行 (5,2,30);单行 CHECK 拒 id=2;范围 CHECK 拒 99;downgrade 回滚干净;可重复执行 |
| 仓库 pytest 全套 | ❌ 跑不了(已坐实) | app.main 依赖链一路要到 faiss(GB 级),按长官边界停手未装 |
| 前端 vitest / tsc / 渲染 | ❌ 未跑(长官定:留到 test 验) | web/node_modules 未装 |
actor_id 若指向已删席位或脏数据,(另有 1 项是我断言写错、代码没问题:断崖机构的 42 次落在上一个 7 天,而分段构成看的是本周窗,
本来就该是 0。已改成用「本月计数 = 42 不是 141」来证明 admin 剔除。)
复现脚本存于 ~/reports/e2e-scripts/(e2e_org_insights.py / e2e_nplus1.py / e2e_migration.py)。
结果:67 项断言全绿(38 + 23 + 1 + 5),连跑两轮、两种顺序,互不污染。
| # | 类型 | 问题 | 修法 |
|---|---|---|---|
| 1 | 🔴 前端真 bug | 「近一月不活跃」窗下柱子整条空白 —— 该窗每个来源段都置 0,走了分段分支就什么都不画,连「N 席空置」文案也不出 | 该窗单独画一条橙色「空置席位」条,宽度按席位数归一;数值列改写「N 席空置」 |
| 2 | 🔴 前端真 bug | 口径抽屉会静默改坏用户配置 —— 初值取的是主接口里已被压制过的 thresholds(用户存 mid=6,显示成 3),一保存就把 6 覆盖成 3 | 抽屉一律单独 GET /config 读库里原值,不用主接口的生效值 |
| 3 | ⚠️ 测试卫生 | 我自己的两套测试互相下毒:深度套把阈值 PUT 成 21 没还原,主干套再断言「默认 30」就挂 | 深度套跑完还原默认值 + 加一条断言钉住;连跑两轮两种顺序验证 |
| 4 | ⚠️ 文档撒谎 | 我改过的两个文件里,模块 docstring 还在写「三榜 conv/risk/up + 公式手算断言」 | 已改成新口径,并注明取消原因 |
权限与入参:席位 token → 403 · 非法 range → 422 · 阈值超范围 → 422
频率分档:用满 6/3/1/0 天 → high/mid/low/idle 四档全对
其余分支:机构表旧兼容凭据也算「系统看不见」· 超 30 天窗仍报得出「最后活动 45 天前」·
建档天数 60 · 部分席位过期 ≠ 已流失 · miniapp 单列计数 · 日窗确实只算昨天(10 次,不含前天的 4)·
30 天折线长度与合计 · 日卡「比前一天」增减 · range 参数真起作用(45 天前的方案:7d 窗 0 个 / 90d 窗 1 个)·
配置行被删后 GET 不炸且 PUT 能自愈建行 · 配置表恒单行 · admin_view 审计事件真落库
web/node_modules 未装(长官定:留 test 验)。已做的替代是属性访问级静态核对 ——app.main 依赖链一路要到 faiss(GB 级),本机跑不了已坐实。这次重写没有任何 Phase 文档记录:它改的是 Phase 52 的产物,而 Phase 52 在进度表里是 ✅ 完工状态,
按项目规矩「禁止修改 ✅ 的 Phase」,我不能去改它的历史记录。
所以现在是「代码改了、文档体系里查不到这件事」。要不要按需求变更流程立个新 Phase,请长官定。
53051831 · 8 文件 · 分支 feature/org-insights-rebuild进 https://test.tongban.love → 平台管理 → 机构洞察
(等长官发话)