# 系统使用统计实施版 ## 1. 实施目标 基于《系统使用统计最终版》,落地一期可用方案,范围收敛为: - 后端统计接口 - 登录统计补数 - 上传/评查统计查询 - 权限隔离 - 前端“总览 + 按部门 + 按地区”页面 - 上线 SQL 与验收流程 ## 2. 实际落地方案 ### 2.1 数据来源 统计数据来源分两类: - 复用现有业务事实表 - 补最小新增事件表 其中: - 上传统计:复用现有文档与文件表 - 评查统计:复用现有评查运行表 - 登录统计:新增登录事件表 - 用户最近登录时间:补 `sso_users.last_login_at` ### 2.2 复用的现有表 - `sso_users` - 用户、部门、地区来源 - 最近登录时间展示 - `leaudit_documents` - 文档主记录 - 文档类型、地区、状态来源 - `leaudit_document_files` - 主文件上传、附件上传统计 - 上传人、上传时间明细来源 - `leaudit_audit_runs` - 评查发起、完成、失败统计 - 评查时间趋势 - 发起人必须依赖 `trigger_user_id` - `leaudit_document_types` - 文档类型维度 - 入口模块归属 - `leaudit_entry_modules` - 入口模块维度 ## 3. 新增与补齐的库结构 ### 3.1 新增字段 - `sso_users.last_login_at` - 含义:最近一次成功登录时间 - 作用:用户维度统计、最近登录展示 ### 3.2 新增表 - `usage_login_events` - 用途:记录登录成功/失败事件 - 核心字段: - `user_id` - `sub` - `username_snapshot` - `nick_name_snapshot` - `department_name_snapshot` - `ou_name_snapshot` - `area_snapshot` - `login_time` - `login_result` - `login_type` - `ip_address` - `user_agent` - `failure_reason` ### 3.3 已落地 SQL 统一放在:`scripts/创建sql/` 本功能核心脚本: - `scripts/创建sql/schema_add_usage_stats.sql` - `scripts/创建sql/seed_usage_stats_rbac.sql` ## 4. 后端接口口径 统一前缀:`/api/v3/usage-stats` 已定义的一期接口: - `GET /api/v3/usage-stats/overview` - `GET /api/v3/usage-stats/trends` - `GET /api/v3/usage-stats/by-users` - `GET /api/v3/usage-stats/by-departments` - `GET /api/v3/usage-stats/by-areas` - `GET /api/v3/usage-stats/details` 一期前端先接: - `overview` - `by-departments` - `by-areas` ## 5. 核心权限与地区隔离 ### 5.1 页面入口 页面入口放在: - 系统设置 - 路由:`/usage-stats` ### 5.2 权限点 已定义权限: - `usage_stats:overview:read` - `usage_stats:trends:read` - `usage_stats:users:read` - `usage_stats:departments:read` - `usage_stats:areas:read` - `usage_stats:details:read` ### 5.3 角色范围 - `super_admin`:看全量 - `provincial_admin`:看全量 - `admin`:作为地区管理员,仅看本地区 ### 5.4 实施要求 - 不能只靠前端限制 - 必须由后端按当前登录用户地区做数据过滤 - 按地区页在 `admin` 角色下只能返回当前地区数据 ## 6. 一期前端范围 一期页面只做: - 总览 - 按部门 - 按地区 放置位置: - 系统设置 页面要求: - 支持时间范围筛选 - 支持按地区筛选 - 按地区页支持地区口径切换 - 页面可用优先,不继续堆复杂交互 ## 7. 后端实现拆解 ### 7.1 登录链路补数 代码位置: - `fastapi_modules/fastapi_leaudit/controllers/auth/authController.py` - `fastapi_modules/fastapi_leaudit/services/usageStatsService.py` - `fastapi_modules/fastapi_leaudit/services/impl/usageStatsServiceImpl.py` 要求: - 成功登录写 `usage_login_events` - 失败登录写 `usage_login_events` - 成功登录更新 `sso_users.last_login_at` - 不影响现有登录返回结构 ### 7.2 评查链路补数 代码位置: - `fastapi_modules/fastapi_leaudit/controllers/auditController.py` - `fastapi_modules/fastapi_leaudit/services/auditService.py` - `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py` - `fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py` 要求: - 创建评查 run 时写入 `trigger_user_id` - 上传后自动评查与手工发起评查都要补齐 ### 7.3 统计查询接口 代码位置: - `fastapi_modules/fastapi_leaudit/controllers/usageStatsController.py` - `fastapi_modules/fastapi_leaudit/services/usageStatsService.py` - `fastapi_modules/fastapi_leaudit/services/impl/usageStatsServiceImpl.py` 要求: - 概览页可直接取数 - 部门页可分页汇总 - 地区页支持地区口径切换 - 后端完成权限与地区过滤 ## 8. 上线顺序 ### 8.1 SQL 先执行: 1. `scripts/创建sql/schema_add_usage_stats.sql` 2. `scripts/创建sql/seed_usage_stats_rbac.sql` ### 8.2 服务 - 发布后端代码 - 重启后端服务 - 用管理员账号重新登录一次 - 手动上传一次文档 - 手动发起一次评查 ### 8.3 验收 必须验证: - `usage_login_events` 有数据 - `sso_users.last_login_at` 有更新 - `leaudit_audit_runs.trigger_user_id` 有写入 - `/usage-stats` 菜单可见 - 超级管理员可看全量 - 地区管理员只能看本地区 ## 9. 当前推荐验收 SQL ```sql SELECT column_name FROM information_schema.columns WHERE table_name = 'sso_users' AND column_name = 'last_login_at'; SELECT to_regclass('public.usage_login_events'); SELECT id, username, last_login_at FROM sso_users WHERE last_login_at IS NOT NULL ORDER BY last_login_at DESC LIMIT 10; SELECT id, user_id, login_result, login_type, login_time FROM usage_login_events ORDER BY id DESC LIMIT 10; SELECT id, trigger_user_id, status, created_at FROM leaudit_audit_runs ORDER BY id DESC LIMIT 10; ``` ## 10. 当前文档收口原则 本目录只保留这两份: - `docs/系统使用统计/系统使用统计最终版.md` - `docs/系统使用统计/系统使用统计实施版.md` 老的“最终需求 / 表设计 / 接口设计 / 开发任务拆解”内容,统一并入这两份主文档,不再继续扩散。