交付出件箱
← 返回出件箱
接力档 · 渠道机构驾驶舱大屏(双屏)
2026-08-26 收口 · 取代 handoff-cockpit-20260819.md(已过期)
状态:方案 v1.2 定稿 + D9/D10/D11 已拍板 + 两张图已重出 + 08-26 第二轮反馈(A屏减法 / B屏收小字 / 补 4 个功能)已落图。
本项目至今仍是零代码改动,产出全部是调研/方案/原型文档。
一、开局必读五条
- 不写业务代码。 长官原话:"先别开工,我现在要的是数据报告、调研报告"。
- 不提工期排期。
- 报告写法:每块先给「结论:」一句话 + 表格承载细节 + 砍论证过程。
- 交付双投递:正本
~/reports/ + sg devshare -c 'cp ... ~/reports/shared/';长官给公网裸链 https://dev-tokyo.tail3912a6.ts.net/<文件名>(根目录即文件名,无 /reports/shared/ 前缀)。
- 图表库:大屏用 echarts(
echarts/core + 按需 use(),禁全量禁 CDN),其余一律 recharts。
二、正本是哪份(只看这三个)
| 文件 |
是什么 |
状态 |
dual-cockpit-proposal-v1.2-20260819.md |
方案正本(08-26 已把 D9/D10/D11 决策写回第五节) |
✅ 给长官看这份 |
cockpit-a-mockup-20260818.html |
A屏展示版原型 |
✅ 08-26 已含 v1.2 四条改动,真渲染验过 |
cockpit-b-mockup-20260818.html |
B屏管控版原型 |
✅ 同上 |
版本链:geo-cockpit-research v1/v2/v3(08-14~15) → cockpit-research-20260815.md(12模块调研定稿,仍然有效) → dual-cockpit-proposal-20260818.md(v1.0 双屏) → v1.1-20260819 → v1.2-20260819(现行正本,08-26 更新决策)
三、已定 vs 待拍板
已定(别再列成待确认)
九条口径规则(见调研定稿第四节)+ D1 / D7(不采集机构坐标,08-18)+ D9 / D10 / D11(08-26 新拍):
| # |
决策 |
定论 |
| D9 |
渠道树金额口径 |
②到账额(payment_confirmations.confirmed_amount + confirmed_at),服务端定死不给前端切 |
| D10 |
省名写法 |
去后缀短名(广东 / 内蒙古),不用一字简称 |
| D11 |
A屏交互边界 |
仅时间维度可交互,含 60s 无操作自动回落近7天;下钻/筛选/处置仍全禁 |
待拍板(2 个)
| # |
决策 |
状态 |
| D8 |
B屏是否展示结算域操作留痕 |
未拍。audit_logs 生产账号只有 INSERT 没有 SELECT(settlement/db/grants.sql:48),要展示得单开只读账号/视图 |
| D12(08-26 新提) |
要不要做目标达成率,以及两个前提:①目标值从哪来(后台人工录入 / 按去年同期自动生成)②按什么维度下目标(全国 / 大区 / 渠道 / 单机构) |
未拍。没这两条就物理做不了 —— 全库 target_amount/quota/goal_value/kpi_target 命中 11 处全部是 API 配额(app/models/api_key.py),无任何经营目标字段。已明确写进方案 §6.4,未拍板前不许把达成率画进图 |
三·五、08-26 第二轮反馈落图结果
长官反馈原话方向:「A屏还是有点满、信息再少一点、字别那么多、第一眼看到最重要的几个数」「B屏可以比A屏复杂一点但别复杂太多,小字说明收起来点开再看」「补一下方案里没用上但管理上需要的功能」。
| 做了什么 |
结果 |
| A屏减法 |
上屏中文 675 → 522 字(-23%);KPI 副行全删改 ▲▼、数字 30→34px、渠道产能 TOP5→TOP3、大区分布 7 行→TOP4+其他3区、地图副标题删、图例 4→3 段、轮播提示改圆点、走马灯 4 句→2 句。口径一个没改、功能一个没加 |
| B屏收小字 |
6 条纯说明整条收进 ⓘ(原生 <details> + 浮层),屏上只留口径词 |
| 补 4 个功能(全部零补录、全落 B屏、不新增面板) |
①收入构成 settlement.py:520 order_type ②结算待办 settlement.py:440 status ③沉默席位 user.py:78 last_login_at ④同比环比箭头(纯计算) |
| 明确做不了 1 个 |
目标达成率:全库 target/quota/goal 命中 11 处全是 API 配额,无经营目标字段。要做必须长官先定「目标值从哪来 + 按什么维度下目标」 |
🔴 两个新视图的数字与渠道树同源:收入构成 591,700+423,900+269,000 = 1,284,600,与渠道树合计一致。改任一处必须同步另一处。
四、08-26 这轮出图踩到的五个坑(下一会话别再踩)
| # |
坑 |
怎么发现的 / 怎么定的 |
| 1 |
"无部署省"跟登录光点自相矛盾 |
第一版按直觉把新疆/甘肃/香港标成无部署,渲染出来发现这些省上面就有登录光点。改用点在多边形判定重算:无部署省必须零光点。终态 34 省 = 10 无部署 + 2 有部署零活跃 + 22 活跃 → 有部署 24 省,与 KPI「覆盖 24 省」对齐。改这批省份时必须重跑这个交叉校验 |
| 2 |
B屏加一行时间筛选器会挤爆固定高度大屏 |
渲染自查报 5 处内容截断(最多 14px),而改动前基线是 0。没动 1132×637 版式基准,改为回收纵向预算:screen/col 间距 10→6px、卡片内边距 9→6px,截断回到 0。以后往 B屏主视图加任何一行,都要重跑截断自查并跟基线比 |
| 3 |
B屏没有 A屏那套 CSS 变量 |
从 A屏搬渠道树过去时用了 var(--bg)/var(--cy),B屏 :root 里根本没定义(它在 .dark 作用域里重定义 --s50 系列),结果整块渲染成白底。已换成字面量 #0A1628/#2AD4FF 等。跨图搬组件必须先查目标图的令牌定义 |
| 4 |
「收起」差点名存实亡 |
给 <details> 子元素写了 display:block,把浏览器收起行为覆盖了,文字根本没隐藏 —— 是渲染自查报 6 处溢出才发现的。改 .hint>span{display:none} + 展开走浮层。折叠做完必须造一份 <details open> 真渲染看一眼,光看收起态验不出来 |
| 5 |
切换区加到 5 个标签,主屏那张卡放不下 |
实测第 5 个标签直接不可见(宽约 250px)。主屏改 3 标签 + ▾ 收起,第二节宽卡 5 标签全展开。往窄卡加标签前先量容器宽度 |
四、代码事实(本轮已 grep 实证 · 下一会话别重查)
基线:worktree HEAD 8f92bd1b(2026-08-12),落后 origin/test 641 个提交。行号可能漂移,符号名不会。
4.1 A屏光点链路(五段全通,零补录)
| 环节 |
出处 |
| 登录事件表 |
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) |
4.2 五条硬约束(做设计时绕不开)
| # |
约束 |
出处 |
| 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 |
4.3 渠道树数据链路(v1.2 新验,全现成)
| 项 |
出处(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。树上必须单列「未挂靠二级渠道」 |
4.4 四大缺口(08-15 实证,结论未变)
机构地理位置(D7 已定不采集,改用登录 IP)/ 在线状态(无心跳,用活跃四级替代)/ 强制下线(席位改 device_id 即踢,管理员和渠道需新建且必须同时废 refresh)/ 数据行级权限(核心侧无,结算侧渠道隔离已在生产跑,settlement/backend/app/auth/zhaoyang_permissions.py:293-315,可直接沿用)。
五、唯一的实质阻塞(没变)
摸底 SQL 从 08-14 挂到今天仍无人执行。 云机不连生产库,必须由有生产库权限的同事跑。
- 文件:
geo-cockpit-baseline-sql-20260814.md(10 段)
- 先跑第⑪段(A屏地图预演:近7日
login_success 按机构聚合 + IP 空/私网占比,SQL 全文在 v1.1 §6.1)和第②段(IP 真实性)
- 判据:私网 IP 占比 >20% → 先修反代再上光点
- 原第①段「机构可定位率」随 D7 降为选修
六、下一步
| 序 |
事项 |
谁 |
前提 |
| 1 |
验收两张图:四条改动 + 08-26 减法/收小字/新增 4 功能 |
长官 |
图已就绪,等反馈 |
| 2 |
拍 D8(结算域操作留痕要不要上 B屏) |
长官 |
遗留决策之一 |
| 3 |
拍 D12(目标达成率做不做 + 目标值从哪来 + 按什么维度下) |
长官 |
遗留决策之二,不拍就做不了 |
| 4 |
跑摸底 SQL 第⑪、②段 |
有生产库权限的同事 |
唯一实质阻塞,从 08-14 挂到现在 |
| 5 |
开工写代码 |
—— |
长官尚未发话,本项目仍是零代码改动 |
下一会话开局三句话
- 先读本档 + 方案
dual-cockpit-proposal-v1.2-20260819.md 第五、六节(两轮决策与改动全在这两节)
- 不要重新 grep 代码事实,第四节已经全部实证过,带 file:line
- 长官若给新的出图反馈 → 先
cp 备份到 /tmp,改完必须跑 --check 并跟基线比差值(两图基线均为:真内容溢出 0 / 半截截断 0 / div 闭合差 0)
七、环境注意
| 项 |
说明 |
| 写出件箱 |
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,数据类结论一律标"未实测" |
本项目全程零代码改动,产出为纯调研/方案/原型文档。