# 系统使用统计实施版

## 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`

老的“最终需求 / 表设计 / 接口设计 / 开发任务拆解”内容，统一并入这两份主文档，不再继续扩散。
