交付出件箱

← 返回出件箱

双驾驶舱建设方案 v1.2 · 增量修订(时间筛选 / 模块配色 / 省名 / 渠道树)

🟢 2026-08-26 更新:D9 / D10 / D11 已由长官拍板(见第五节),两张原型图已按 v1.2 全部四条改动重出并真渲染验过。本文件仍是方案正本。

🟢 2026-08-26 第二轮:长官反馈「A屏还是有点满、字太多」「B屏小字收起来」「补一下管理上真需要的功能」——
A屏做减法(上屏文字砍 23%),B屏说明类小字整条收进 ⓘ,另补 4 个零补录功能、明确 1 个做不了的(见第六节)。

2026-08-19 · 在 v1.1 基础上按长官四条反馈做增量修订,不推翻已有设计
v1.1 的九条已定口径、四大缺口、D1–D8、12 模块落位、接口清单、验收清单全部继续有效
本版新增内容的代码事实均本轮 grep 实证(证据带 file:line)


〇、结论速览

结论:四条全部可做,数据底子都验到了;三处真冲突(D9/D10/D11)已于 08-26 拍板,图已按此重出。

条 长官要求 能不能做 卡点
一 全局时间筛选器,默认近7天 ✅ 可做 🔴 选「近12个月」时地图热力/光点物理拿不到数据——登录审计只留 6 个月(app/models/audit.py:24),必须有降级规则
二 A屏模块配色分区 ✅ 可做,且不用加新色 ⚠️ 模块色(紫/橙/青绿)会和状态色(橙=预警、红=异常)撞语义,必须靠"边框低饱和 vs 徽章实色"分开
三 地图加省名、有部署省点亮 ✅ 可做 ⚠️ 与 08-18「地图移除城市名」是加省名不加城市名,不冲突;但港澳台京津沪 6 个小省放不下,需引线
四 渠道–二级渠道总览视图 ✅ 可做,字段全现成零补录 ✅ 口径已定(D9·08-26):②到账额;下单额/结算额不上屏

三个新增决策 D9 / D10 / D11 已于 08-26 拍板(②到账额 / 去后缀短名 / 接受仅时间维度可交互),详见第五节;图已按此重出。


一、全局时间筛选器

结论:两屏都加,默认近7天;但必须把指标分成"存量"和"期间"两类分开处理——否则切到近12个月时"在营机构 328 家"纹丝不动,会被当成 bug。

1.1 交互位置

屏 位置 形态 选项
A屏 右上角,与「数据更新于 09:14:32」同一行,置于其左侧 轻量胶囊组,选中态=主青 #2AD4FF 描边+发光,未选=次文字 #7BA7C9 今日 / 近7天 / 近30天 / 近12个月(4 项,无自定义)
B屏 顶部指标区上方独立一行,左对齐;右侧留「手动刷新」按钮 完整分段控件 + 日期区间弹层 今日 / 近7天 / 近30天 / 近12个月 / 自定义

1.2 刷新规则

事件 行为
切换时间 全屏所有"期间指标"重新取数;存量指标不动;切换期间各卡显示骨架屏,不显示旧数字(防看错)
自动轮询 沿用 v1.1:KPI 30s / 光点 15s / 热力 5min;轮询继承当前时间选择,不会把口径偷偷改回默认
并发 切换时取消上一次未返回的请求(防慢响应覆盖新口径)
A屏轮播 轮播卡切换不改时间口径;时间口径是全屏唯一的

1.3 联动矩阵(关键:存量 vs 期间)

模块 类型 跟随时间筛选 说明
在营合作机构 328 存量 ❌ 不跟随 时点快照;标题旁固定小字「截至当前」
当前生效席位 1,842 存量 ❌ 不跟随 同上
活跃机构数 期间 ✅ 近7天=近7日活跃,今日=今日活跃
本期续费完成率 期间 ⚠️ 半跟随 已定口径是「当期+滚动12月」双口径,不接受任意区间;筛选器只切换展示哪一个(今日/近7天/近30天→当期;近12个月→滚动12月)
待续费机构 / 未来90天待续费 前瞻 ❌ 不跟随 看的是未来到期,与回溯窗口无关;固定 30/90 天
地图热力 期间 ✅ 🔴 见 1.4
登录光点 期间 ✅ 🔴 见 1.4
渠道产能榜 期间 ✅
月度业务曲线 期间 ⚠️ 固定近12月 本身就是12个月趋势,筛选器只高亮所选区间,不裁剪曲线
续费预警列表 前瞻 ❌ 不跟随 同待续费
异常告警 期间 ✅
甘特图 期间 ✅ 时间轴范围跟随
到期分布 前瞻 ❌ 不跟随 固定未来12个月
渠道树(第四节) 期间 ✅ 默认近7天

大屏上必须有视觉区分:存量/前瞻类指标卡右上角打一个灰色「固定」小角标,否则切时间时它们不动 = 用户报 bug。

1.4 🔴 近12个月的数据天花板(必须降级)

数据源 可回溯 证据
登录审计 auth_audit_logs 仅 6 个月(APScheduler 每天 02:00 清) app/models/audit.py:24
订单/席位/结算 不受影响 结算域表无清理任务

规则:选「近12个月」时——

模块 处理
地图热力 / 登录光点 / 活跃数 自动降级为近6个月,并在模块角上显示灰字「登录数据仅留存6个月」
渠道榜 / 曲线 / 甘特 / 到期 / 渠道树 正常按12个月

❌ 不允许静默返回6个月数据却标"近12个月"——那是数字造假。


二、A屏模块配色分区

结论:不引入任何新色值,全部从 v1.1 已校验令牌里取;模块色只走"边框 + 标题栏底纹",实色填充永远留给状态语义。

2.1 模块级配色表

模块 色相 取自 v1.1 令牌 标题栏底纹 左边框 数字/正文
中央地图 深空蓝(基底) 底色 #0A1628 / 面板 #0F2137 无(主区不加色框) 无 主文字 #E2F3FF
渠道产能 / 渠道树 紫 分类槽3 #8B77E0 rgba(139,119,224,.12) 2px rgba(139,119,224,.55) 数字仍用主青 #2AD4FF
续费 / 预警 橙 状态橙 #FF9F40 rgba(255,159,64,.12) 2px rgba(255,159,64,.55) 同上
增长 / 异常 青绿 分类槽4 #21A876 rgba(33,168,118,.12) 2px rgba(33,168,118,.55) 同上
KPI 四卡 中性 面板 #0F2137 + 青边 rgba(42,212,255,.15) — — 数字主青
洞察走马灯 中性 同 KPI — — —

2.2 三条铁律(不写死就会串色)

# 铁律 为什么
1 模块色只用于边框和标题栏底纹(alpha ≤0.55 / ≤0.12),永不实色填充 状态徽章(预警橙 #FF9F40 实色、异常红 #FF4D5E 实色)必须一眼压过模块色,否则"预警模块里的正常项"看起来也像在报警
2 图表系列色不受模块色影响,仍按 v1.1 §5.4 五槽固定顺序 模块色是分区,系列色是数据编码,两套不能混;否则紫色模块里的柱子全紫=分不出系列
3 地图主区不加彩色边框 地图是视线锚点,加框会和热力渐变(单色相蓝青)打架

2.3 防疲劳

项 做法
同屏色相数 ≤4(蓝基底 + 紫 + 橙 + 青绿),不再增加
边框亮度 统一 alpha 0.55,不做呼吸动效(动效只留给光点/告警)
长时间观看 模块底仍是面板底 #0F2137,色彩只在边缘 2px + 标题条,大面积仍是深色——这是"区分"而不是"彩色化"

全部色值取自 v1.1 第五节已过色觉/对比度机器校验的令牌,无一处新增色相,因此不需要重跑校验;若后续要调,按 v1.1 D4 规则必须重跑。


三、地图省名与省份点亮

结论:34 个省全部标名,标名颜色自己就是"有没有部署"的第二重编码;6 个放不下的小省走引线。

3.1 省名标注方案

视野 标注 字号 举例
全国(默认) 去后缀短名 12px 广东 / 内蒙古 / 黑龙江 / 上海
省份放大(B屏点击后) 全称 14px 广东省 / 内蒙古自治区 / 上海市

✅ D10 已定(08-26):去后缀短名。长官说的"简称"不取一字简称(粤/苏/黑)—— 大屏远距离辨识差、且非行业通用读法。图已按短名出。

3.2 有部署 / 无部署的两态

状态 省块填充 省名颜色 判定
有部署 + 有活跃 热力渐变 5 档 #1B5077 → #2FBCE2(v1.1 §5.3) 主文字 #E2F3FF 该省机构数 >0 且区间内有活跃
有部署 + 零活跃 最浅档 #1B5077 主文字 #E2F3FF,名后加灰点 · 有机构但选定区间无登录
无部署 深灰底 #0F2137(面板底,不进热力渐变) 灰色 #7BA7C9 该省 0 机构

3.3 省名可读性(深色底上标字的老问题)

规则 内容
衬底 省名一律加 rgba(10,22,40,.55) 圆角小衬底(2px 内边距),保证在最浅档 #2FBCE2 和最深灰 #0F2137 上都 ≥4.5:1
与光点关系 光点画在省名之下一层;省名 z-index 最高,始终可见(长官明确要求)
冲突避让 省名居省块视觉重心;与光点重叠时光点降 alpha,不移省名
引线 北京 / 天津 / 上海 / 香港 / 澳门 / 台湾 6 个省块过小,省名移到图外,用 1px 细引线连回;引线色 rgba(123,167,201,.4)
A屏 省名同样显示(长官要求"始终可见");这是对 v1.1「A屏地图无文字标注」的明确修订,省名是导航必需,不属于被砍的"堆信息"

3.4 与 08-18 决定的关系

08-18 移除的是机构点位与城市名(D7 不采集坐标),本次加的是省名——两者不冲突,省名不依赖任何坐标数据,纯静态地理标注,零数据前提。


四、渠道–二级渠道总览视图(新增)

结论:字段全部现成、零补录,树已画出;"收了多少钱"的三个口径已拍板取 ②到账额(D9,08-26)。

4.1 数据链路(本轮 grep 实证)

层 字段 出处
一级渠道 Channel.channel_level = 1 settlement/backend/app/models/settlement.py:136
二级渠道 channel_level = 2 + parent_channel_id(自关联 FK) 同上 :136,137
机构挂靠 OrgSignupProfile.channel_id(NOT NULL,带索引 ix_org_signup_profiles_channel_id) 同上 :205,196
金额①下单 StoreServiceOrder.amount_due + .source_channel_id(NOT NULL),时间锚 created_at(TimestampMixin :77) 同上 :570,566
金额②到账 PaymentConfirmation.confirmed_amount + .confirmed_at(NOT NULL) 同上 :368,370
金额③结算 SettlementStatement.total_amount + .channel_id + period_start/end 同上 :460,454,458,459
分成比例 Channel.rate_percent / expansion_rate_percent / renewal_rate_percent 同上 :126,130,133

业务已在用这套层级:结算单预览按 level 过滤(services/settlement/settlement_statements.py:970-974)、平台移动端已展示 parent_channel_name(platform_mobile_paging.py:217)。不是我新造的概念。

4.2 三个金额口径(D9 已定:②到账额 · 08-26 拍板)

口径 含义 时间锚 与全局筛选器 推荐
① 下单额 机构下了多少单 orders.created_at ✅ 自然日,天然对齐 含未付款单,偏高
② 到账额 真收到多少钱 payment_confirmations.confirmed_at ✅ 自然日,天然对齐 ⭐ 推荐
③ 渠道结算额 渠道实际分到多少 period_start/end(半月账期) 🔴 对不齐——选"近7天"时半月账期无法切分 只能按账期选

推荐口径②,理由:贴合"收了多少钱"的字面意思、时间锚是自然日与筛选器天然对齐、且不含水分。
若长官要口径③,则该视图的时间筛选必须单独降级为「按账期选(本期 / 上期 / 近3期 / 近12月)」,与全局筛选器脱钩——这是账期制的物理限制,不是能绕的。

4.3 🔴 孤儿节点(代码里真实存在,必须画)

现网有三类渠道,不是两类:

类 判定 树上怎么放
一级 level=1 根节点
二级·有父 level=2 AND parent_channel_id IS NOT NULL 挂在对应一级下
二级·无父 level=2 AND parent_channel_id IS NULL 🔴 单独一个「未挂靠二级渠道」分组放在最下方,不允许静默丢掉

判定依据:settlement_statements.py:970-974 与 platform_mobile_paging.py:118-122 两处业务代码都显式分了这三类。

4.4 布局(横向树,从左到右三级)

┌──────────────────────────────────────────────────────────────┐
│ 渠道 · 二级渠道总览        [近7天▾]   口径:到账额   合计 ¥1,284,600 │
│                                                              │
│  一级渠道            二级渠道              机构                │
│  ┌──────────┐                                                │
│  │ 明视渠道  │══════════╗                                     │
│  │ ¥486,200 │          ║  ┌────────────┐                     │
│  └──────────┘          ╚══│ 华东明视     │───●●●●●  12家       │
│                           │ ¥310,400/12家│                    │
│                           └────────────┘                     │
│                        ┌────────────┐                        │
│                     ╔══│ 华南明视     │───●●●    7家           │
│                     ║  │ ¥175,800/7家 │                       │
│  ┌──────────┐       ║  └────────────┘                        │
│  │ 康眼合作  │═══════╝                                        │
│  │ ¥298,700 │                                                │
│  └──────────┘                                                │
│  ─────────── 未挂靠二级渠道(3) ───────────                     │
└──────────────────────────────────────────────────────────────┘
元素 内容 尺寸编码
一级节点 渠道名 + 总金额 节点高度按金额分 3 档(不做连续缩放,防小渠道看不见)
二级节点 名称 + 金额 + 机构数 同上
机构叶子 默认聚合成小圆点串 + 「N 家」;展开后每点显示机构名 + 金额 圆点固定 6px,不按金额缩放
连线 一级→二级、二级→机构 粗细 = 金额,3 档(细1px / 中3px / 粗6px),带 hover 数值

为什么金额用分档不用连续缩放:现网渠道金额量级差可能上百倍,连续缩放会让尾部渠道细成一根发丝、点成一个像素——分档保证每个节点都看得见,这与 v1.1「未定位机构必须上屏,不隐藏」是同一条原则。

4.5 交互

动作 A屏 B屏
进入 自动轮播页之一(15s) 独立标签页
机构叶子 永远聚合成圆点+计数,不展开、不出机构名(脱敏铁律) 点二级节点 → 展开机构列表
节点点击 无(除时间胶囊外零交互) 点机构 → 复用模块12 详情面板
Hover 无 连线显金额、节点显占比
折叠 一级节点超过 6 个时,金额 TOP5 + 「其他 N 个」聚合 全部展开,纵向滚动
时间 跟随全局筛选(默认近7天) 同左,另支持自定义

4.6 配色(沿用第二节,属"渠道"模块 → 紫系)

元素 色值 出处
视图边框/标题栏 rgba(139,119,224,.55) / .12 底纹 第二节渠道模块色
一级节点 面板底 #0F2137 + 紫边 #8B77E0 v1.1 令牌
二级节点 面板底 + 紫边 alpha .35 同上
机构圆点 主青 #2AD4FF v1.1 令牌
连线 紫 #8B77E0,alpha 按档 .35/.6/.9 同上
金额数字 主青 #2AD4FF v1.1 令牌
未挂靠分组 次文字 #7BA7C9 虚线分隔 v1.1 令牌

无一处新增色值。

4.7 工程

项 约定
图表库 echarts TreeChart(属大屏目录,符合既定政策);echarts/core + 按需 use([TreeChart, TooltipComponent, CanvasRenderer]);A屏零交互版不引 Tooltip
接口 新增 GET /cockpit/channel-tree?range=&metric=(建议命名,当前代码不存在,已核对)
口径 金额口径由 D9 决定,服务端定死,不给前端切(防两屏算出两个数)
权限 A屏走展示账号白名单,响应不含机构名;B屏渠道账号沿用 zhaoyang_permissions.py:293-315 隔离,只看得到自己那棵子树

五、D9 / D10 / D11 —— 2026-08-26 已拍板

结论:三条全部按推荐拍定,两张原型图已按此重出(cockpit-a-mockup-20260818.html / cockpit-b-mockup-20260818.html,08-26 更新)。

# 决策 定论(08-26 长官拍板) 落图后的物理后果
D9 渠道树金额口径 ✅ ②到账额 树上只出一个数,锚 confirmed_at(自然日),与全局时间胶囊天然对齐;口径服务端定死不给前端切,防两屏算出两个数
D10 省名写法 ✅ 去后缀短名(广东 / 内蒙古) 34 省全部常显;京津沪港澳台 6 个小省走引线牵到图外;放大态才转全称
D11 A屏交互边界 ✅ 接受「仅时间维度可交互」,含 60s 无操作自动回落近7天 A屏全屏只有时间胶囊可点;下钻 / 筛选 / 处置仍然全禁;v1.0/v1.1 里「零交互」的表述以本条为准

D1–D8 沿用 v1.1。目前未拍的只有两条:

# 决策 状态
D8 B屏是否展示结算域操作留痕 未拍。audit_logs 生产账号只有 INSERT 没有 SELECT(settlement/db/grants.sql:48)
D12(08-26 新提) 目标达成率做不做 + ①目标值从哪来 ②按什么维度下目标 未拍。不拍就物理做不了,理由见第六节 6.4

落图时新发现、需要一并知道的三件事

# 事 说明
1 「无部署省」必须与登录光点交叉校验 出图时先按直觉把新疆/甘肃标成无部署,渲染后发现这些省有登录光点 —— 自相矛盾。改用点在多边形判定重算:无部署省必须零光点。落图结果 34 省 = 10 无部署 + 2 有部署零活跃 + 22 活跃,有部署 24 省,与 KPI「覆盖 24 省」对齐
2 B屏加时间筛选器会挤爆固定高度大屏 B屏 1132×637 是定死的版式基准。新增一行筛选器后渲染自查报出 5 处内容被截断(最多 14px)。没有改版式基准,改为回收纵向预算:screen/col 间距 10→6px、卡片内边距 9→6px,截断回到基线 0
3 模块分色只落 A屏,不落 B屏 方案第二节本就限定 A屏。B屏是管控屏,橙/红已被预警/异常状态占用语义,再叠模块色会串;已在 B屏差异清单里写明「不适用」

六、08-26 长官第二轮反馈:A屏做减法 / B屏收小字 / 补管理上真缺的功能

结论:「A屏再少一点」和「补新功能」是反方向的两件事,处理办法是——A屏只做减法一个字不加,新功能全部落 B屏,并且不新增任何面板。

6.1 A屏减法(上屏文字 675 字 → 522 字,砍掉 23%)

动作 改前 改后 为什么
KPI 副行 4 个 KPI 各带一行小字 全删,改为数字后跟一个 ▲/▼ 一个箭头顶一句话,远距离也看得懂
KPI 数字 30px 34px 大屏核心数字要够屏高 1/10
渠道产能 TOP5(5 行) TOP3 大屏是给人一眼扫的,不是给人读排行榜的
大区分布 7 行 TOP4 + 「其他3区 75」 七大区口径没变,只是尾部聚合
条形/数字 11px / 10.5px 13px / 13.5px 加粗 行数少了,把省下的空间还给字号
地图副标题 一行长句(底色=…光点=…省名=…) 删,口径并进图例 标题不解释口径
地图图例 4 段 3 段短句(光点=机构登录 / 底色 深=活跃多 / 灰=无部署)
轮播提示 两行小字「15s 自动轮播 ⇄ …」 两个圆点指示器 ●○ 轮播是看得出来的,不用写
走马灯 4 条长句 2 条短句

🔴 A屏没有新增任何功能,时间胶囊(D11)仍是全屏唯一可点的东西。

6.2 B屏:说明类小字整条收起

6.3 补三个功能(管理上真需要、方案里原来没有)

全部零补录,且全部落 B屏、不新增面板。

# 功能 落在哪 数据出处(已 grep 实证) 管理上解决什么
1 收入构成(首次开通 / 增购 / 续费三分) 切换区新标签 settlement.py:520 order_type in ('首次开通','增购','续费') 原方案只有「多少家」,没有「钱从哪来」。续费占比掉、首签占比涨 = 靠拉新撑收入、存量在流失,只看家数看不出来
2 结算待办(四态流转卡在哪一环) 切换区新标签 settlement.py:440 status generated/pending_review/approved/paid_registered 结算是半月账期,单子卡住没人看得见。渠道拿不到钱就不卖力——这是渠道产能下滑的上游原因,现在只能等渠道来催
3 沉默席位(买了不用的席位数) 「当前生效席位」副行,零额外空间 user.py:78 last_login_at + :102 seat_expires_at 续费流失的先行指标。等到「剩余 3 天」才预警已经晚了,买了半年没登录的机构才是真正要提前接触的
4 同比 / 环比箭头 两屏所有 KPI 数字后 纯计算,不需要任何新字段 管理看板没有对比就没法判断好坏。这条同时服务「一眼看懂」——一个箭头顶一句话

6.4 🔴 想做但做不了的一个:目标达成率

全库搜 target_amount / quota / goal_value / kpi_target —— 命中 11 处全部是 API 配额(app/models/api_key.py 的 APIKeyQuota / H5QuotaUsage),没有任何经营目标字段。

所以「本季新签达成率 78%」这类卡片现在物理上做不出来。要做,必须长官先定两件事:①目标值从哪来(人工在后台录入?还是按去年同期自动生成)②按什么维度下目标(全国 / 大区 / 渠道 / 单机构)。在这两条定下来之前,我不会把达成率画进图里。

6.5 落图时又踩到的两个坑

# 坑 处理
1 切换区加到 5 个标签,主屏那张卡物理放不下 实测第 5 个标签直接不可见。主屏改 3 标签 + ▾ 收起,第二节宽卡(≈570px)5 标签全展开。这是按容器宽度折叠,不是两套设计
2 「收起」差点名存实亡 给 <details> 子元素写了 display:block,把浏览器的收起行为覆盖了 —— 渲染自查报 6 处溢出才发现文字根本没被隐藏。改成 .hint>span{display:none} + 展开走浮层

七、v1.1 中本次未动的部分

九条已定口径 / 四大缺口 / 12 模块×两屏落位表 / 联动下钻三级规则 / 8 个接口清单 / 摸底 SQL 修订(含新增第⑪段)/ 11 项验收清单 / 深色令牌 v1 / D1–D8 —— 全部原样有效,本版只做加法。

新增验收项 3 条(并入 v1.1 第七节):

# 验收项 判定
12 切「近12个月」时地图 显示"登录数据仅留存6个月"提示,且返回条数确实是6个月的量
13 存量指标固定性 在 4 个时间档间来回切,「在营机构」「生效席位」数字不变
14 渠道树金额闭合 各二级金额合计 + 未挂靠分组 = 一级合计 = 顶部总计,不允许有差

八、下一步

序 事项 谁
1 拍 D9 / D10 / D11 长官
2 两张原型图按本版重出(时间胶囊 / 模块分色 / 省名 / 渠道树共 4 处结构改动) 我,等长官发话
3 摸底 SQL(先跑第⑪段和第②段) 有生产库权限的同事

⚠️ 现有 A/B 两张原型图尚未包含本版四条改动,长官现在看到的图是 v1.1 状态。要不要出新图,等一句话。


本方案纯文档,零代码改动。第四节数据链路与第一节 6 个月天花板均为本轮(2026-08-19)在 worktree HEAD 8f92bd1b 上 grep 实证,含对照组自证;行号在 origin/test 上可能漂移,符号名不会。所有金额/机构数字均为占位示意,未连生产库。
云机环境 · 非验收证据。