交付出件箱

← 返回出件箱

接力档 · 渠道机构驾驶舱大屏(双屏)

2026-08-26 收口 · 取代 handoff-cockpit-20260819.md(已过期)
状态:方案 v1.2 定稿 + D9/D10/D11 已拍板 + 两张图已重出 + 08-26 第二轮反馈(A屏减法 / B屏收小字 / 补 4 个功能)已落图。
本项目至今仍是零代码改动,产出全部是调研/方案/原型文档。


一、开局必读五条

  1. 不写业务代码。 长官原话:"先别开工,我现在要的是数据报告、调研报告"。
  2. 不提工期排期。
  3. 报告写法:每块先给「结论:」一句话 + 表格承载细节 + 砍论证过程。
  4. 交付双投递:正本 ~/reports/ + sg devshare -c 'cp ... ~/reports/shared/';长官给公网裸链 https://dev-tokyo.tail3912a6.ts.net/<文件名>(根目录即文件名,无 /reports/shared/ 前缀)。
  5. 图表库:大屏用 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 挂到今天仍无人执行。 云机不连生产库,必须由有生产库权限的同事跑。


六、下一步

序 事项 谁 前提
1 验收两张图:四条改动 + 08-26 减法/收小字/新增 4 功能 长官 图已就绪,等反馈
2 拍 D8(结算域操作留痕要不要上 B屏) 长官 遗留决策之一
3 拍 D12(目标达成率做不做 + 目标值从哪来 + 按什么维度下) 长官 遗留决策之二,不拍就做不了
4 跑摸底 SQL 第⑪、②段 有生产库权限的同事 唯一实质阻塞,从 08-14 挂到现在
5 开工写代码 —— 长官尚未发话,本项目仍是零代码改动

下一会话开局三句话

  1. 先读本档 + 方案 dual-cockpit-proposal-v1.2-20260819.md 第五、六节(两轮决策与改动全在这两节)
  2. 不要重新 grep 代码事实,第四节已经全部实证过,带 file:line
  3. 长官若给新的出图反馈 → 先 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,数据类结论一律标"未实测"


本项目全程零代码改动,产出为纯调研/方案/原型文档。