交付出件箱

← 返回出件箱

渠道机构地理分布数据驾驶舱 · 建设调研报告

版本 v2.0(在 v1.0 基础上纳入账号安全处置、分级权限管控、异常提醒三项新增需求)
日期 2026-08-14
面向 内部业务决策
调研范围 doctor-ai-brain(核心系统) + settlement(渠道结算系统)


阅读须知 · 本报告的证据边界

本报告所有技术判断均来自对现有代码的逐项检索,每条结论在附录 A 给出 文件:行号 出处,可逐条复核。

必须先讲清楚哪些能信、哪些不能信:

类别 状态
代码层结论(有没有这张表、有没有这个字段、这个功能现在是怎么实现的) ✅ 已物理验证
IP 归属地解析能力(精度、速度、可获取性) ✅ 已在本机真实跑通,结果见 §4.2
数据层结论(多少机构填了地址、日均登录多少次、IP 数据质量) ❌ 未实测。开发机按规矩不连生产库,需业务侧执行摸底 SQL 后回填
性能结论(大屏并发、查询耗时) ❌ 未实测,缺生产同栈环境

凡涉及数量、比例、耗时的地方,本报告一律不给编造的数字。需要实测的部分已整理成独立的《数据摸底 SQL》交付件。


一、项目建设背景与建设目的

1.1 建设背景

业务侧现状

公司目前采用"渠道创建 → 机构入驻 → 机构账号独立登录"的三级管理模式:

这套模式在业务扩张期运转正常,但管理侧的观测手段没有跟上,主要体现在三点:

第一,看不到"在哪里"。 系统从建立至今没有采集过机构的地域信息,管理人员无法回答"我们在哪些省有机构""哪个省覆盖薄弱""某个渠道的机构集中在哪些区域"这类基本问题。

第二,看不到"谁在用"。 登录记录虽然完整落库,但只能通过后台表格逐条翻查。管理人员无法一眼判断当前系统的活跃程度,也无法察觉某个区域的机构集体沉默。

第三,发现问题到处置问题之间是断的。 即便通过审计日志发现某个账号异常,处置动作要切换到另外的管理页面去做,中间隔着若干次跳转和查找,异常响应效率低。

技术侧现状(决定本项目难易的关键)

调研中确认了四项事实,两好两坏:

有利事实一:登录行为已经完整落库,且记录的是用户真实公网 IP。
系统的认证审计表记录了每一次登录成功/失败的账号、IP、终端信息和精确时间,且 Nginx 与应用容器的代理配置是配套的,记录的是用户真实公网地址而非机房内部地址。这意味着"登录实时上屏"的数据源已经存在,不需要新增任何埋点。

有利事实二:渠道、机构、签约、登录四类数据在同一个物理数据库中。
结算系统虽然在架构上已拆分为独立服务,但生产部署是与核心系统同库共存(通过独立数据库账号做权限隔离)。这意味着"机构归属哪个渠道"可以用一条 SQL 直接关联出来,不需要跨服务调用接口拼装数据,方案复杂度降低一个量级。

不利事实一:系统没有任何地理维度数据。
全库没有省、市字段,没有行政区划字典。机构地址有两个来源,但一个是门店分享名片时自己在手机上选的位置(业务上从不强制),另一个是入驻资料里的签约地址(表单校验的是营业执照、门头照、视光师资质、设备照四类文件,地址字段允许为空)。

不利事实二:系统没有"在线状态"这个概念。
登录采用无状态令牌机制,登录后不打卡、不心跳、退出也不落库。系统目前能回答"这个账号今天上午十点登录过",回答不了"这个账号此刻是否在线"。

1.2 建设目的

本项目要达成的目标,按业务价值排序:

  1. 把"全国机构分布"从抽象概念变成一屏可见的事实 —— 管理层、渠道管理、市场决策共用一张图;
  2. 把"谁在用系统"从事后查表变成实时可感 —— 登录即上屏,活跃度一目了然;
  3. 把"发现异常"到"处置异常"的链路缩短到一次点击 —— 在同一个界面完成查看与处置;
  4. 让不同层级的管理者看到与其职责匹配的数据 —— 总部看全国,渠道看自己名下,区域看自己辖区;
  5. 让异常行为主动找人,而不是等人去找 —— 多地登录、非工作时间登录等风险信号主动提醒。

1.3 本项目的真实难点(提前说明)

必须纠正一个常见预期:这不是一个"前端画张地图"的项目。

地图渲染、点位闪烁、统计卡片这些工作,占总工作量不到三分之一。真正的工程量集中在四处,且都在业务与数据层,不在展示层:

难点 本质问题
地图上的点从哪来 机构没有地理坐标,需要建数据、补数据、做地址解析
在线状态怎么算 系统没有在线概念,需要先定义业务口径
强制下线怎么做 无状态令牌天然不支持"踢人",需要改造失效机制
分级权限怎么控 现有权限只管"能不能看见这个菜单",管不了"能看见哪些机构"

后文对每一项都给出了具体方案和工作量判断。


二、详细业务需求拆解

2.1 地图可视化需求

需求描述

以中国电子地图为核心载体,机构账号登录后,地图上对应地理位置的机构点位自动点亮。

拆解

编号 子需求 现状 判定
M1 中国地图底图,支持省级着色 前端无任何地图库 🆕 新建
M2 机构点位按地理坐标落图 无坐标数据 🔴 卡点,见 §2.1.1
M3 登录后对应点位点亮(含动效) 登录数据现成,缺推送与地区判定 🟡 部分
M4 省级热力着色(按活跃度) 依赖 M2 🔴 卡点
M5 点位聚合(同城多机构不重叠) — 🆕 新建
M6 省份下钻(点省看该省机构列表) — 🆕 新建

2.1.1 核心卡点:机构位置从哪来

这是全项目的第一优先级问题。现有两个数据来源都不可靠:

来源 性质 问题
门店名片位置(含经纬度) 席位在手机端手动选点 为分享名片功能设计,业务从不强制,覆盖率大概率很低
入驻签约地址(文字地址) 入驻资料的一部分 表单层面允许为空,审核不校验,覆盖率待实测

建议的解决路径(三层兜底,按优先级取值):

  1. 有签约地址 → 地址解析成省市与坐标(业务语义最正式);
  2. 无签约地址但有门店名片坐标 → 直接用坐标;
  3. 两者都无 → 进入"未定位机构"清单,在大屏上单独计数并明示数量。

关键原则:绝不允许把未定位的机构静默丢弃。 大屏必须显示"全国 X 家机构,其中 Y 家未定位",否则会造成"我们只有这么多机构"的误判——这比没有大屏更危险。

2.1.2 需要业务确认的一个概念问题

"地图上那个点代表什么"这件事,业务上有两种理解,实现方式完全不同:

理解 含义 优点 缺点
A. 机构注册地 这家机构签约时登记在哪 稳定、权威、可核对 不反映实际使用地
B. 本次登录地 这个人这次从哪登的 天然实时,覆盖率高 城市级精度,移动网络会漂移
C. 双轨(建议) 底图点位用注册地,点亮用登录地 两个问题各自用最合适的数据源 实现成本略高

建议选 C。理由是"地域分布"和"登录点亮"本来就是两个不同的业务问题,用一个数据源硬扛必然有一边失真。而且两者不一致时(注册在成都、天天从广州登录)本身就是有价值的风控信号,可直接服务于 §2.6 的异常提醒。

2.2 机构详情查询需求

需求描述

点击地图点位,下钻查看该机构的详细信息。

拆解与现状(这部分是全项目现状最好的)

字段 数据来源 现状
机构名称 机构表 ✅ 现成
归属渠道 签约档案 → 渠道表(同库外键关联) ✅ 现成
登录 IP 认证审计表(真实公网 IP) ✅ 现成
登录时段 认证审计表(带索引,查询高效) ✅ 现成
登录终端 认证审计表的 user_agent 与 detail ✅ 现成
在线状态 — 🔴 需先定义口径,见 §2.2.1
机构基础信息(联系人、电话、启用状态、入驻时间) 机构表 ✅ 现成
签约状态、席位数、有效期 签约档案、用户表 ✅ 现成
近期活跃行为 行为流水表(已有复合索引) ✅ 现成

判定:详情弹窗要展示的信息,九成以上是现成数据,只需查询组装,无需新建采集链路。

2.2.1 "在线状态"必须先定义

再次强调技术事实:系统采用无状态令牌,服务端不维护会话,没有心跳,退出不落库。因此"此刻是否在线"在当前架构下无法精确回答。

有两条路:

路线一(建议):用活跃度分级替代二元在线状态。

状态 判定口径(建议值,需业务确认) 大屏表现
在线 最近 15 分钟内有登录或业务操作 点位常亮 + 呼吸动效
今日活跃 今日有登录或业务操作 点位亮色
近期活跃 7 日内有活动 点位淡色
沉默 超过 7 日无活动 点位灰色

优点是零新增埋点,纯查询实现,口径可解释可审计,且能直接支撑"各省份活跃度"的着色。

路线二:新增前端心跳上报。
每隔一段时间由前端上报一次在线信号。精度更高,但需要新建接口、新建表、处理心跳风暴,且对现有的所有客户端(H5、平板、小程序)都要改造。投入产出比不划算,不建议为大屏单独做。

2.3 账号安全处置需求

需求描述

在大屏上可对机构账号执行强制下线、启用/禁用、重置密码等操作,并记录操作日志。

拆解与现状

操作 现状 说明
启用 / 禁用账号 ✅ 已有接口 用户管理与席位管理均已实现
重置密码 ✅ 已有接口 用户侧与席位侧各有实现
解锁被锁定账号 ✅ 已有接口 现有安全策略配套
操作日志记录 ✅ 可复用现有表 见 §2.3.2
强制下线 🔴 需改造 见 §2.3.1,这是本节唯一的真工程量

2.3.1 强制下线的技术真相(重要)

系统当前的"下线"机制有两套,都不能直接满足需求:

机制一:令牌黑名单。 用户主动退出时,把他那一串具体的令牌加入 Redis 黑名单。
局限:管理员要踢某个账号时,服务端手里根本没有那个账号的令牌字符串(无状态令牌不落库)。所以这套机制只能用于"用户自己退出",无法用于"管理员踢人"。

机制二:席位设备绑定。 席位账号的令牌里带设备标识,每次请求都会与数据库里记录的当前设备做比对,不一致直接拒绝。
这是一个意外的好消息:对机构席位账号而言,只要把数据库里的当前设备标识改掉,该账号的所有请求会立即失效——等于现成的、即时生效的强制下线能力,几乎零成本。

但对管理员账号、机构管理员账号、渠道账号,没有这层校验,强制下线需要新建机制。

建议方案(工程量不大,但必须一次做对):

  1. 在缓存中按账号记录一个"失效时间戳",管理员执行强制下线时写入当前时间;
  2. 令牌校验环节比对令牌的签发时间,早于失效时间戳的一律拒绝;
  3. 必须同时处理续期令牌 —— 这一点最容易漏:访问令牌 30 分钟就过期,但续期令牌最长可达一年。如果只废止访问令牌,被踢的用户 30 分钟后会自动续上,等于没踢。

2.3.2 操作日志:可直接复用现有表

结算系统已有一张通用操作审计表,字段结构与本需求完全对口:

操作人、操作人角色、动作类型、操作对象类型、操作对象 ID、操作前快照、操作后快照、操作理由、请求 ID、操作时间。

建议直接复用,不新建表。 其中"操作前后快照"对安全处置场景尤其重要(谁在什么时候把哪个账号从启用改成了禁用,一目了然),"请求 ID"字段还能直接用于 §7.5 的多人操作冲突防护。

2.3.3 一个必须提出的设计风险

大屏是给人看的,通常常驻显示、甚至可能投屏在办公区;而账号处置是高危操作。把两者放在同一个界面,本身是一个需要谨慎对待的设计。

具体风险:大屏常驻意味着登录态长期挂着,若屏幕无人值守,任何路过的人都可以点击禁用某个客户的账号。

建议的防护设计(供业务决策):

  1. 投屏模式与操作模式分离:大屏默认进入只读的"投屏模式",处置按钮不可见;需要处置时手动切换到"操作模式";
  2. 处置操作二次鉴权:切换到操作模式或执行处置前,要求重新输入密码;
  3. 高危操作二次确认 + 填写理由:禁用、重置密码必须填写操作理由(正好落进日志表的 reason 字段);
  4. 闲置自动退回:操作模式闲置若干分钟后自动退回投屏模式。

2.4 配套数据统计需求

需求描述

全国活跃机构数量、各省份机构活跃度、各渠道机构分布统计卡片。

拆解

卡片 数据来源 现状
全国活跃机构数 登录审计 + 行为流水 ✅ 现有机构洞察功能已有活跃口径,建议复用不重造
今日登录次数 / 环比 登录审计 ✅ 现有看板已有同类实现
覆盖省份数 依赖地理数据 🔴 依赖 §2.1.1
各省份活跃度排行 依赖地理数据 🔴 依赖 §2.1.1
各渠道机构分布 渠道 + 签约档案(同库关联) ✅ 数据现成
未定位机构数 地理数据 🆕 新建(诚实性要求,见 §2.1.1)

重要提示:口径必须与现有报表统一。 系统现有的"机构洞察"页面已经有一套活跃度口径。如果大屏另立一套口径,会出现"同一天两个页面两个数字"的情况,管理层会立刻质疑数据可信度。建议大屏的活跃口径直接复用现有实现,而不是重新写一遍聚合逻辑。

2.5 权限管控需求

需求描述

总管理员、渠道管理员、区域管理员按权限查看不同范围数据。

现状:这是本次新增需求里最贵的一项

现有权限体系是"角色 → 菜单开关"的二元结构:一张表记录"某个角色能不能看见某个菜单"。

这套机制只能控制"能不能进这个页面",完全无法控制"进来后能看到哪些机构的数据"。

本需求要的恰恰是后者——渠道管理员进大屏,只能看到自己名下的机构;区域管理员只能看到自己辖区的机构。这在技术上叫数据行级权限,现有系统一点基础都没有。

逐角色拆解

角色 现状 缺口
总管理员 ✅ 已有超管角色,全量可见 无缺口
渠道管理员 🟡 渠道账号已存在(有独立登录、绑定渠道) ⚠️ 但目前进不了管理后台 —— 后台准入角色白名单里没有渠道角色,渠道账号只能进渠道自己的 H5 页面。要让渠道管理员看大屏,需要开放后台准入,或为渠道做独立的大屏入口
区域管理员 🔴 全库无此概念 检索确认:系统中不存在区域/大区的任何定义、区域与省份的映射关系、以及区域管理员角色。需从零建设

需要新建的能力

  1. 区域体系:区域定义、区域与省份/城市的映射关系、管理员与区域的绑定关系;
  2. 数据范围过滤层:所有大屏查询接口统一按"当前登录者能看哪些机构"做过滤,这一层必须做在后端;
  3. 角色扩展:新增区域管理员角色,并接入现有的菜单权限体系。

一条安全红线

数据范围过滤必须在后端接口层强制执行,绝不能靠前端隐藏。

前端隐藏只是"看不见",接口照样能返回全量数据,任何人打开浏览器开发者工具就能看到本不该看的客户信息。渠道之间存在竞争关系,渠道 A 看到渠道 B 的机构名单属于严重的商业信息泄露。这一条在验收时必须专门测试:用渠道管理员的账号直接调用接口,验证返回的数据确实被过滤。

2.6 异常提醒需求

需求描述

多地登录、频繁掉线、非工作时间登录等异常情况提醒。

逐项可行性判定(这一节结论差异很大,需逐条看)

异常类型 可行性 说明
多地登录 ✅ 可实现 数据基础完备:登录审计有全量 IP 与时间,IP 归属地能力已验证可用。判定逻辑:同一账号在设定时间窗内出现在两个不同城市 → 告警。可进一步做"物理不可达"判定(如 1 小时内北京、广州各登录一次)
非工作时间登录 ✅ 可实现 登录时间现成。注意时区:数据库存的是标准时间,判定必须转成北京时间,系统内已有同类处理先例可参照
频繁掉线 🔴 当前无法实现 见下方说明
异地登录(登录地 ≠ 注册地) ✅ 可实现 §2.1.2 选双轨方案后自然获得
暴力破解 / 撞库 ✅ 已有防护 系统已有失败次数限制与 IP 维度的横向扫描防护,大屏只需把已有信号展示出来

关于"频繁掉线"必须说清楚

系统目前物理上无法统计掉线。 原因是没有心跳机制,也不记录会话终止——系统只知道"什么时候登录的",不知道"什么时候断的",因此"掉线"这个事件在数据层根本不存在。

三个选择,请业务方定夺:

方案 说明 成本
A. 用代理指标替代(建议) 用"短时间内重复登录次数异常"近似表征掉线(频繁掉线通常伴随频繁重连)。口径不精确但零改造 低
B. 新增心跳上报 精确统计在线时长与掉线,但需改造全部客户端 高
C. 本期不做 明确剔除,留待后续 零

建议选 A,并在大屏上把指标名称如实标注为"频繁重连"而非"掉线"——指标名称与实际口径必须一致,这是数据可信度的底线。

告警怎么送达

现状:系统有一个统一错误上报接口,但目前是占位实现,只写日志,既不落表也不推送(代码注释明确写着留待后续升级为"事件表 + 告警规则 + 企业微信机器人")。

已具备的推送通道:阿里云短信、微信订阅消息。

建议:本期告警先做到"大屏内提醒 + 落库可查"(右侧异常提醒栏 + 异常记录列表),不做外部推送。理由是外部推送涉及告警规则配置、免打扰策略、误报处理,是一个独立的运营监控课题,混进本项目会显著拉长工期。


三、整体功能架构设计

3.1 总体架构

┌──────────────────────────────────────────────────────────────┐
│                      数据驾驶舱大屏(全屏页面)                    │
│  ┌────────────┬──────────────────────────┬────────────────┐  │
│  │  统计卡片区   │        中国地图主区域        │   实时动态区     │  │
│  │  ① 统计模块  │        ② 地图模块          │  登录流水       │  │
│  │            │                          │  ⑥ 异常提醒     │  │
│  └────────────┴──────────────────────────┴────────────────┘  │
│                      ↓ 点击点位                                 │
│            ┌──────────────────────────┐                       │
│            │  ③ 详情弹窗模块              │                       │
│            │  机构信息 / 渠道 / 登录记录    │                       │
│            │  ┌────────────────────┐  │                       │
│            │  │ ④ 账号处置模块(受控) │  │                       │
│            │  └────────────────────┘  │                       │
│            └──────────────────────────┘                       │
└──────────────────────────────────────────────────────────────┘
                              ↕
┌──────────────────────────────────────────────────────────────┐
│                    ⑤ 权限模块(贯穿全部请求)                       │
│         菜单准入(已有) + 数据范围过滤(新建 · 后端强制)             │
└──────────────────────────────────────────────────────────────┘
                              ↕
┌──────────────────────────────────────────────────────────────┐
│                       后端服务层                                │
│  大屏查询服务 │ 处置服务 │ IP归属地服务 │ 异常检测 │ ⑦ 日志审计     │
└──────────────────────────────────────────────────────────────┘
                              ↕
┌──────────────────────────────────────────────────────────────┐
│         数据层(同一数据库 · 现有表为主 · 新增两张小表)              │
│  机构 │ 渠道 │ 签约档案 │ 登录审计 │ 行为流水 │ 操作审计            │
│  + 机构地理表(新)  + 区域体系表(新)                            │
└──────────────────────────────────────────────────────────────┘

3.2 各模块设计要点

① 统计卡片模块

② 地图模块

③ 详情弹窗模块

分区展示:机构基础信息 / 归属渠道 / 登录记录(IP + 归属地 + 时间 + 终端)/ 活跃状态 / 席位概况。

登录 IP 按查看者角色脱敏(见 §7.6)。

④ 账号处置模块

⑤ 权限模块

两层结构:

  1. 菜单准入层(复用现有):控制角色能否进入大屏页面;
  2. 数据范围层(新建):统一解析当前登录者可见的机构范围,所有查询接口强制经过此层。
角色 可见范围
总管理员 全部机构
渠道管理员 本渠道名下机构
区域管理员 本辖区省份内机构

实现红线:过滤在后端完成,前端不做任何数据裁剪。

⑥ 异常提醒模块

⑦ 日志审计模块


四、技术选型建议

4.1 前端地图

方案 评价
ECharts + 自托管中国地图数据(建议) 无需申请密钥、无外网依赖、机构位置数据不出网、省市下钻成熟、离线可用
高德 / 百度地图 JS API 底图精美、自带地址解析,但需申请密钥并计费,机构坐标与登录位置要发送给第三方,且页面依赖外网

建议 ECharts 方案。 合规性与可控性优先,内部驾驶舱不需要卫星底图。

需注意:现有前端技术栈的图表库不支持地理投影,必须新增地图库依赖,这是本项目唯一需要新增的前端依赖,需按技术栈管理规则走审批。

4.2 IP 归属地解析(已实测,非推荐而是已验证)

选用离线 IP 归属地库,本机实测结果:

输入 IP 解析结果
220.181.38.148 中国 · 北京 · 北京市 · 电信
61.139.2.69 中国 · 四川省 · 成都市 · 电信
58.216.0.1 中国 · 江苏省 · 常州市 · 电信
223.5.5.5 中国 · 浙江省 · 杭州市 · 阿里云
8.8.8.8 美国(境外可识别)
172.18.0.1 内网IP(可识别机房内部地址)

附带价值:该库能识别内网地址,可用作部署健康探针——一旦大批登录被解析为内网 IP,说明代理配置被改坏,可第一时间发现。

4.3 后端服务

4.4 数据库

4.5 实时通信

系统内已有两种实时技术的先例:WebSocket(实时语音)与 SSE(流式对话)。但本项目建议都不用,采用定时轮询。

方案 评价
定时轮询(建议,15 秒) 实现简单、无连接维护、断网自愈、鉴权沿用现有机制。大屏观众是内部管理人员,并发以个位数计,压力可忽略
SSE 单向推送,但本项目在 SSE 的连接关闭竞态上有过多次踩坑记录,大屏常驻场景的断连重连、鉴权续期都是额外成本
WebSocket 双向能力本项目用不上(处置操作走普通接口更合适),维护成本最高

业务侧的"实时"是指十几秒内看到,不是毫秒级。 轮询完全满足,且最稳。若后续确有秒级需求,可单独立项升级。


五、系统部署模式

5.1 现状

系统目前部署在阿里云服务器上,采用容器化编排,数据库、缓存、后端、前端各自独立容器,通过 Nginx 统一对外提供 HTTPS 服务。已经是云端部署。

需要注意的现实约束:当前服务器资源配置偏紧,各容器均设有内存上限,数据库的缓存参数也调得较小。这一点直接关系到 §7.4 的实时刷新压力评估。

5.2 部署模式对比

模式 说明 适用性
A. 云端部署(强烈建议) 大屏作为现有管理后台的一个页面,随现有系统一起部署 ✅ 数据零同步、权限零重建、运维零增量。管理人员浏览器打开即用,会议室投屏也是打开浏览器
B. 本地部署(办公室独立部署一套) 在公司内网单独部署一套大屏系统 ❌ 需要把生产数据同步到本地(数据一致性、安全性、同步链路全是新增成本),权限体系要重建一套,且离线场景下"实时上屏"本身就不成立
C. 混合(云端服务 + 本地展示终端) 服务在云端,办公室配一台专用显示终端 ✅ 本质上仍是 A,只是多配一台常开的显示设备。若有固定大屏展示需求,建议走这条

结论:采用云端部署(方案 A)。 若需要固定的大屏展示位,配一台专用终端常开浏览器即可(方案 C),无需为此改变部署架构。

大屏常驻的一个技术细节必须提前处理:系统的访问令牌 30 分钟过期。大屏挂一晚上,第二天早上会是一片空白或全是错误提示。必须实现静默续期与断线重连提示,这一条容易被漏,须写入实施清单。


六、分阶段落地实施计划

以下工作量为经验估算,非实测,按单人投入计算,不含需求评审与验收往返时间。

阶段划分原则

数据地基必须先行。 先做前端会得到一张漂亮但没有点的空地图,这是本项目最需要避免的返工。

阶段 内容 估算 交付标志
P0 数据地基 机构地理表建设、IP 归属地能力接入、存量地址批量解析、未定位清单产出、组合索引优化 4~5 人日 地理数据填充率达标,未定位清单明确
P1 只读大屏 地图模块、统计卡片、详情弹窗、轮询刷新、登录点亮、大屏登录态保活 8~10 人日 测试环境可投屏演示
P2 账号处置 强制下线机制改造(含续期令牌废止)、处置操作接入、操作模式与二次鉴权、操作日志与查询页 5~6 人日 处置全链路可用且留痕完整
P3 分级权限 区域体系建设、数据范围过滤层、渠道后台准入、区域管理员角色、越权测试 6~8 人日 三种角色各自登录验证范围隔离
P4 异常提醒 多地/异地/非工作时间/频繁重连检测、异常记录、提醒栏、一键跳转处置 4~5 人日 可复现的异常场景全部命中
合计 27~34 人日 单人约 6~7 周

关键说明

  1. P0 可以立即启动,不依赖任何业务决策;
  2. 地址补录必须与 P0 并行启动,这是唯一一件技术加班也快不了的事——需要业务侧安排人力核对补充。等到 P1 做完才发现没数据,整体会延期 2~4 周;
  3. P3 是最贵的一段,因为要动权限底座。如果业务上可以接受"一期只给总管理员用",P3 可以后置,整体提前约 1.5 周上线;
  4. P2 与 P3 的顺序建议不要调换:先有权限隔离再放开处置能力更安全。若 P3 后置,则 P2 阶段的处置能力应仅对总管理员开放。

建议的并行安排

第 1 周   │ P0 数据地基 ──────────┐
         │ (业务侧)地址补录 ─────┼──── 持续进行
第 2-3 周 │ P1 只读大屏 ──────────┘
第 4 周   │ P2 账号处置
第 5-6 周 │ P3 分级权限
第 7 周   │ P4 异常提醒 + 整体验收

七、潜在风险及应对办法

7.1 数据对接风险

风险 等级 应对
机构地址覆盖率过低,地图大面积空白 🔴 最高 上线前先跑摸底 SQL。可定位率低于 70% 时不应直接进入前端开发,应先补数据。大屏必须显示"未定位机构数",不允许静默丢弃
地址文字不规范(简写、错字、无省份),解析失败 🟡 中 解析失败进人工待办清单;提供后台手工指定省市的入口;不追求 100% 自动化
登录审计中 IP 为空或为内网地址 🟡 中 摸底 SQL 已包含此项体检。若私网 IP 占比高,说明部署配置有问题,必须先修配置,修复后的新数据才可用
渠道数据归属缺失(机构无签约档案) 🟢 低 归属关系是外键强关联,缺失即为数据本身的问题,可通过摸底 SQL 一并暴露

7.2 地图定位精度风险

风险 等级 应对
IP 归属地只到城市级,移动网络会跨市漂移 🟡 中 大屏明确标注"登录位置来自 IP 归属地,仅供参考";机构位置以签约地址为准,两者分开呈现(§2.1.2 双轨方案)
IP 库为 2022 年版本,新 IP 段识别不准 🟡 中 上线前更新库文件;解析不出的显示"未知归属地"而非猜测;建立季度更新机制
VPN / 企业专线导致登录地异常 🟢 低 这类情况会触发"异地登录"提醒,属于功能而非缺陷,但需在告警说明中注明可能的正常原因,避免误判
同城多机构点位重叠 🟢 低 点位聚合 + 展开列表

7.3 权限安全风险

风险 等级 应对
渠道管理员看到其他渠道的机构(商业信息泄露) 🔴 高 数据范围过滤必须在后端强制执行;验收时专项测试:用渠道账号直接调用接口,验证返回数据确实被过滤;前端隐藏不算数
大屏无人值守被误操作 🔴 高 投屏模式与操作模式分离、处置二次鉴权、闲置自动退回只读(§2.3.3)
处置权限授予过宽 🟡 中 查看权限与处置权限分开配置;区域/渠道管理员是否有处置权由业务明确,默认不给
越权处置(渠道管理员禁用非本渠道账号) 🔴 高 处置接口同样经过数据范围校验,不能只在查询接口做过滤

7.4 实时刷新压力风险

风险 等级 应对
大屏轮询叠加,数据库压力上升 🟡 中 15 秒轮询 + 服务端结果缓存(约 10 秒);必须补组合索引;实测后再调频率
服务器资源本身偏紧 🟡 中 大屏查询全部为只读,可考虑与业务查询错峰;上线前在测试环境压测一轮,不在生产直接试
大屏常驻导致登录态过期白屏 🟡 中 静默续期 + 断线重连提示(§5.2)
全量点位数据传输量随机构增长 🟢 低 点位数据按省聚合传输,下钻时才拉明细

7.5 多人操作冲突风险

风险 等级 应对
两名管理员同时处置同一账号,后者覆盖前者 🟡 中 处置接口携带请求 ID 做幂等(现有审计表已有该字段,系统内也有幂等实现先例);操作前校验目标账号状态版本,状态已变则提示刷新后重试
A 刚禁用,B 的界面还显示启用,误判 🟡 中 处置成功后立即刷新该机构状态;轮询周期内的短暂不一致通过操作结果提示消解
谁改的说不清 🟢 低 操作日志记录操作前后快照,责任可追溯到人(这正是复用现有审计表的价值)

7.6 登录 IP 隐私合规风险

这是本项目合规层面最需要正视的一项。 登录 IP 与地理位置,既涉及机构的经营信息,也在特定场景下可能关联到个人。

风险 等级 应对
IP 与位置信息展示范围过宽 🟡 中 按角色分级脱敏:总管理员看完整 IP;其他角色只看归属地或打码 IP(如 220.181.*.*);投屏模式默认打码
大屏投屏在公共区域,客户信息被无关人员看到 🟡 中 投屏模式下机构名称可选择部分打码;办公区大屏摆放位置需业务侧确认
数据外发给第三方 🟢 低 已通过技术选型规避:IP 解析用本地离线库,地图用自托管数据,登录 IP 与机构位置均不出网(这是选择离线方案的核心理由之一)
地址批量解析时外发机构地址 🟡 中 若一次性回填需借助在线地址解析服务,需业务确认后再执行,且仅在回填时使用,不做常态调用
数据留存期限不明确 🟢 低 现有登录审计的留存策略在代码注释与实际实现之间存在不一致(注释称定期清理,实际未实现清理)。建议本项目一并明确留存期限并落实,避免日后被动

八、预期业务价值

8.1 管理效率

场景 现在 建成后
了解全国机构分布 导出表格人工统计 一屏可见,实时
判断某区域是否活跃 无法直接回答 省份着色直接反映
发现异常账号并处置 多页面跳转查找 点击点位,就地处置
核对某渠道的机构规模与分布 需人工关联多张表 渠道卡片直出

8.2 业务决策

8.3 风险控制

8.4 数据资产沉淀(容易被低估的长期价值)

本项目最持久的价值可能不是那块大屏,而是它逼着我们把机构的地理数据补齐了。

这份数据一旦建立并纳入常态维护,可以复用于:区域化运营分析、渠道区域保护策略、市场活动的地域投放、客户地域画像。这是一次性投入、长期复用的基础数据资产。

8.5 价值实现的前提(务必正视)

以下三条不满足,上述价值会大打折扣:

  1. 地理数据必须补到位 —— 覆盖率决定这块屏的可信度。一张只有三成机构的地图,管理层看两次就不会再看;
  2. 指标口径必须与现有报表统一 —— 同一指标两个页面两个数字,数据可信度会瞬间归零;
  3. 权限隔离必须真实有效 —— 渠道之间的数据隔离一旦出问题,是商业事故,不是技术 bug。

附录 A · 证据索引

结论 出处
机构表字段、经纬度用途 app/models/organization.py:11-58
统一用户表六角色、渠道绑定 app/models/user.py:26-70,135-153
渠道表定义 app/models/settlement.py:66-105
签约档案含渠道外键与地址 app/models/settlement.py:109-145、settlement/backend/app/models/settlement.py:213
入驻表单地址为选填、审核只校验四类文件 settlement/backend/app/api/settlement/store_signup.py:98,126-136
登录审计表字段(IP 为原生 INET 类型) app/models/audit.py:24-60
管理端 / 席位登录写审计 app/services/auth_service.py:249-256、app/api/seat_auth.py:362-369
Nginx 传递真实 IP deploy/nginx/chat.tongban.love.conf:107-111
生产容器启用代理头解析 deploy/Dockerfile.api:67
结算与核心同库共存、账号隔离 settlement/deploy/docker-compose.prod.yml:32-34、settlement/db/grants.sql:33-48
令牌黑名单按令牌串拉黑(无法按账号踢人) app/services/auth_service.py:357-360、app/auth/middleware.py:64-68
席位设备绑定每请求校验(现成的踢下线能力) app/auth/middleware.py:255-257,372-373
令牌含签发时间与唯一 ID(可支撑按账号失效改造) app/auth/jwt_local.py:63-64
访问令牌 30 分钟 / 续期令牌最长一年 app/auth/jwt_local.py:26-29
启停、重置密码、解锁接口已存在 app/api/admin_users.py:163,185,203、app/services/seat_service.py:288,445
通用操作审计表(含前后快照、请求 ID) settlement/backend/app/models/settlement.py:615-639
权限表仅为「角色-菜单」二元组,无数据范围 app/models/role_menu_permission.py:10-23
后台准入角色白名单不含渠道角色 app/core/menu_registry.py:14-15
全库无区域 / 大区概念 检索 region/区域/大区 → 0 业务命中
错误上报为占位实现(只记日志、无推送) app/services/incident_logger.py:1-12,44
已有暴力破解与 IP 横向扫描防护 app/api/seat_auth.py:141-190
时区处理先例(北京时间切天) app/api/admin_activity.py:37,157
实时通信先例(WebSocket / SSE) app/api/voice_gateway.py:13、app/api/h5_chat.py:662-664
现有活跃机构统计口径 app/api/admin_activity.py:674,827,840
生产部署资源约束 deploy/docker-compose.prod.yml(各容器内存上限)
前端无地图库、图表库不支持地理投影 web/package.json:14-44
无 IP 归属地能力 检索 geoip/ip2region/maxmind → 0 业务命中
IP 归属地实测结果 本机真实执行,结果见 §4.2

附录 B · 待业务确认事项汇总

编号 事项 建议方案 影响
D1 地图点位代表注册地还是登录地 双轨(§2.1.2) 决定数据模型
D2 在线状态的判定口径与时间窗 活跃度四级 + 15 分钟(§2.2.1) 决定统计口径
D3 频繁掉线如何处理 用"频繁重连"代理指标(§2.6) 决定是否需改造客户端
D4 区域如何划分(几个大区、含哪些省) 待业务定义 P3 阶段前置输入,缺失则无法开工
D5 渠道管理员是否有处置权限 建议默认无 决定权限模型复杂度
D6 大屏是否需要投屏到公共区域 — 决定脱敏策略强度
D7 IP 展示的脱敏级别 按角色分级(§7.6) 合规相关
D8 P3 分级权限是否可后置 若可后置,整体提前约 1.5 周 决定上线节奏
D9 一次性地址回填是否可借助在线解析服务 需业务确认 合规相关

附录 C · 立即可执行的下一步

建议在正式立项评审前完成一件事:跑摸底 SQL。

四条只读查询,约 1 分钟执行完,直接决定本项目排期是 6 周还是 10 周。查询脚本与结果解读说明见配套交付件《驾驶舱大屏 · 数据摸底 SQL》。

核心是两个数字:


本报告为调研结论,不含任何已实施的代码改动。数据层结论待摸底 SQL 执行后回填。本机为隔离开发环境,未连接生产数据库,报告中不提供任何未经实测的数据指标。