2026-08-19 收口 · 取代
handoff-cockpit-20260815.md(已过期)
状态:方案 v1.2 定稿,等长官拍 D9/D10/D11 + 等摸底 SQL。长官明确"先别开工"。
~/reports/ + sg devshare -c 'cp ... ~/reports/shared/';长官给公网裸链 https://dev-tokyo.tail3912a6.ts.net/<文件名>(根目录即文件名,无 /reports/shared/ 前缀)。别在云机 curl 外网验证(返 000 是白名单设计)。echarts/core + 按需 use(),禁全量禁 CDN),其余一律 recharts。| 文件 | 是什么 | 状态 |
|---|---|---|
dual-cockpit-proposal-v1.2-20260819.md |
方案正本,双屏 + 四条修订 | ✅ 给长官看这份 |
cockpit-a-mockup-20260818.html |
A屏展示版原型 | ✅ 已渲染验过,但只到 v1.1 状态 |
cockpit-b-mockup-20260818.html |
B屏管控版原型 | ✅ 同上 |
🔴 两张图不含 v1.2 的四条改动(时间胶囊 / 模块分色 / 省名 / 渠道树)。长官发话才出新图,且必须先拍 D9、D10,否则渠道树标题和省名写法要返工。
geo-cockpit-research v1/v2/v3(08-14~15) → cockpit-research-20260815.md(12模块调研定稿) → dual-cockpit-proposal-20260818.md(v1.0 双屏) → v1.1-20260819(补 5 个缺口) → v1.2-20260819(四条增量修订 · 现行)
调研定稿 cockpit-research-20260815.md 里的 12 模块设计仍然有效,v1.1/v1.2 都是在它上面加,没推翻。
九条口径规则(待续费/未激活/永久席位/活跃四级/不新增口径/未定位必上屏/续费率双口径/标准七大区/区域管理员本期不做)—— 见调研定稿第四节,v1.1/v1.2 全部沿用。
| # | 决策 | 定论 |
|---|---|---|
| D1 | B屏地图续费状态点色 | 随 D7 了结:无点位无点色,状态放下钻清单徽章 |
| D7 | 是否采集机构坐标 | ✅ 不采集(08-18 长官拍板)。A屏光点=登录 IP 归属地;B屏=省级色块 |
| # | 决策 | 我的推荐 | 不定的后果 |
|---|---|---|---|
| D9 | 渠道树金额口径:①下单 / ②到账 / ③渠道结算 | ②到账额 | 三个数差很大;选③则该视图时间筛选必须脱钩全局改按半月账期。卡住出图 |
| D10 | 省名用一字简称(粤)还是去后缀短名(广东) | 短名 | 卡住出图 |
| D11 | A屏定位从「零交互」放宽为「仅时间维度可交互」 | 接受(含60s自动回落) | 与 v1.0/v1.1 定位表述有出入 |
| D8 | B屏是否展示结算域操作留痕 | 视权限成本定 | audit_logs 生产账号无 SELECT,要展示得单开只读账号/视图 |
| D2 | 深色科技风两屏统一 | 统一 | |
| D3 | A屏是否显示机构名 | 不显示 | |
| D4 | 深色令牌 v1 色板 | 按 v1.1 第五节定稿 | 改色必须重跑校验脚本 |
| D5 | A屏预警/异常计数是否对外显示 | 做成开关,默认隐藏 | |
| D6 | A屏热力口径 | 近7日(B屏维持今日) |
基线:worktree HEAD
8f92bd1b(2026-08-12),落后origin/test641 个提交。行号可能漂移,符号名不会。
| 环节 | 出处 |
|---|---|
| 登录事件表 | app/models/audit.py:23 AuthAuditLog → auth_audit_logs,event_type CHECK 5 类含 login_success |
| IP 列 | app/models/audit.py:37 ip = Column(INET, nullable=True);login_attempts 同款 :74 |
| 机构端登录也落这表 | app/api/seat_auth.py:173 调 auth_service._write_audit(),写入体 app/services/auth_service.py:498 |
| 事件→机构 | auth_audit_logs.user_id → app/models/user.py:58 linked_org_id;CHECK 约束 :142 保证 org_seat 必有;渠道 channel_id 见 :143 |
| 真实公网 IP | 取值 request.client.host(seat_auth.py:135);生产 uvicorn 带 --proxy-headers --forwarded-allow-ips *(deploy/Dockerfile.api:67)+ nginx XFF(deploy/nginx/chat.tongban.love.conf:108-109);生产 compose 用的正是这份(deploy/docker-compose.prod.yml:78) |
| 同库 | 结算表与核心同库 doctor_ai_brain,账号 settlement_rw(deploy/docker-compose.prod.yml 注释 + settlement/db/grants.sql) |
| # | 约束 | 出处 |
|---|---|---|
| 1 | 登录审计只留 6 个月,每天 02:00 清 → 时间筛选器选"近12个月"时地图必须降级为6个月 | app/models/audit.py:24 |
| 2 | 审计写入 best-effort,异常被吞 → 不能当权威计数,KPI 必须复用 app/api/admin_activity.py 现有活跃口径 |
app/services/auth_service.py:508-509 |
| 3 | ip 可空 → 光点必须处理 NULL,计入"未定位" |
app/models/audit.py:37 |
| 4 | 无 logout 事件 → 在线人数做不了,只能活跃四级 |
app/models/audit.py:47-49 |
| 5 | 结算域 audit_logs 生产账号只有 INSERT 没有 SELECT |
settlement/db/grants.sql:48(:59-60 明确不转属主)→ D8 |
| 项 | 出处(settlement/backend/app/models/settlement.py) |
|---|---|
| 渠道层级 | channel_level(:136) + parent_channel_id 自关联(:137) |
| 机构挂靠 | OrgSignupProfile.channel_id NOT NULL(:205),索引 :196 |
| 金额①下单 | amount_due(:570) + source_channel_id(:566),时间锚 created_at(TimestampMixin :77) |
| 金额②到账 | PaymentConfirmation.confirmed_amount(:368) + confirmed_at(:370) |
| 金额③结算 | SettlementStatement.total_amount(:460) + channel_id(:454) + period_start/end(:458,459),半月账期 |
| 分成比例 | rate_percent(:126) / expansion_(:130) / renewal_(:133) |
| 🔴 三类渠道不是两类 | level=1 / level=2 有父 / level=2 无父——业务代码两处显式分了三类:services/settlement/settlement_statements.py:970-974、platform_mobile_paging.py:118-122。树上必须单列「未挂靠二级渠道」 |
机构地理位置(D7 已定不采集,改用登录 IP)/ 在线状态(无心跳,用活跃四级替代)/ 强制下线(席位改 device_id 即踢,管理员和渠道需新建且必须同时废 refresh)/ 数据行级权限(核心侧无,结算侧渠道隔离已在生产跑,settlement/backend/app/auth/zhaoyang_permissions.py:293-315,可直接沿用)。
摸底 SQL 至今无人执行(08-14 挂到今天)。云机不连生产库,必须由有生产库权限的同事跑。
geo-cockpit-baseline-sql-20260814.md(10 段)login_success 按机构聚合 + IP 空/私网占比,SQL 全文在 v1.1 §6.1)和第②段(IP 真实性)| 序 | 事项 | 谁 |
|---|---|---|
| 1 | 看 A/B 两张原型图,拍 D9 / D10 / D11 | 长官 |
| 2 | 按 v1.2 重出两张原型图(4 处结构改动:时间胶囊 / 模块分色 / 省名 / 渠道树) | 下一会话,等长官发话 + D9/D10 已定 |
| 3 | 跑摸底 SQL | 有生产库权限的同事 |
| 项 | 说明 |
|---|---|
| 写出件箱 | sg devshare -c 'cp ~/reports/x.md ~/reports/shared/'(进程没继承组,直接 cp 会 Permission denied) |
| 渲染通道 | node ~/render-env/browse.js <html> --out /tmp/x --width 1440 --check(无 root,@sparticuz/chromium + 自有 fontconfig CJK)。内存只有 3.4G,别并行渲染,跑前 free -m |
| 渲染假阳性 | --check 报的 DIV.mapbox 溢出是雷达环装饰(position:absolute + pointer-events:none),属规范 3.2 要排除的假阳性;同一文件两次渲染结果会不同(动画帧位置),别当成 bug 去改 |
| /tmp 有别的 dev 的文件 | /tmp/diag.js 属 dev2,heredoc 写不进去会静默失败。自己的临时脚本写 ~/tmp-diag/ |
| 改图前 | 先 cp 备份到 /tmp(~/reports 不是 git 仓库,没有版本历史);改完比 div 开闭差值有没有变(本项目两张图基线都是 0) |
| 当前 worktree | bridge-cse_015JZxr4M7bzyAzVybMMqYrC,分支 worktree-bridge-cse_015...,工作区无代码改动,只有 reports-out/ 未跟踪 |
| 不能做的 | 本机不连生产库、不跑全量 e2e,数据类结论一律标"未实测" |
本项目全程零代码改动,产出为纯调研/方案文档。