# 系统使用统计开发任务拆解 ## 1. 目标 基于以下文档,拆解“系统使用统计”功能的一期开发任务: - `docs/系统使用统计/系统使用统计最终需求.md` - `docs/系统使用统计/系统使用统计接口设计.md` - `docs/系统使用统计/系统使用统计表设计.md` 本拆解以“一期可落地”为目标,优先实现: - 登录统计 - 上传统计 - 评查统计 - 按用户、部门、地区、文档大类、文档类型、入口模块汇总 - 概览页 - 明细查询页 - 导出能力 ## 2. 一期范围定义 ### 2.1 本期必须交付 - 登录事件入库 - `sso_users.last_login_at` 更新 - 评查运行记录补齐 `trigger_user_id` - 系统使用统计后端接口 - 概览页前端页面 - 明细查询页前端页面 - 明细导出 ### 2.2 本期建议交付 - 文档大类映射表与管理方式 - 趋势图与排行榜 - 地区口径切换(用户地区 / 文档地区) ### 2.3 本期不做 - 全量行为审计流水 - 页面访问轨迹 - AI 对话统计 - 聚合表预计算 - 复杂驾驶舱 ## 3. 开发阶段拆分 建议按 6 个阶段推进: 1. 数据库变更 2. 登录链路补数 3. 评查链路补数 4. 统计查询后端接口 5. 前端页面开发 6. 联调、验收与导出 --- ## 4. 阶段一:数据库变更 ### 4.1 目标 完成一期所需表结构调整与新增表落库。 ### 4.2 任务项 #### 任务 1:为 `sso_users` 增加最近登录时间字段 - 类型:数据库变更 - 目标:新增 `last_login_at` - 影响:用户列表、登录成功时更新 建议 SQL: ```sql ALTER TABLE sso_users ADD COLUMN IF NOT EXISTS last_login_at TIMESTAMPTZ NULL; ``` #### 任务 2:创建登录事件表 `usage_login_events` - 类型:数据库变更 - 目标:支撑登录统计、登录明细、按部门/地区统计 - 依赖:无 建议执行内容: - 创建表 - 创建索引 - 检查权限 #### 任务 3:创建文档大类映射表 `usage_document_category_mappings`(若决定一期落地) - 类型:数据库变更 - 目标:实现动态文档大类统计 - 依赖:需要业务确认是否复用现有一级分类 ### 4.3 产出 - SQL 迁移脚本 - 回滚脚本(至少提供字段/表删除草案) - 初始化数据脚本(若有文档大类映射) --- ## 5. 阶段二:登录链路补数 ### 5.1 目标 在登录成功/失败时写入结构化登录统计数据。 ### 5.2 代码位置 - `fastapi_modules/fastapi_leaudit/controllers/auth/authController.py` - `fastapi_modules/fastapi_leaudit/services/impl/authServiceImpl.py` - `fastapi_common/fastapi_common_security/jwtService.py` ### 5.3 任务项 #### 任务 4:设计登录统计服务/仓储 建议新增一个轻量服务,例如: - `fastapi_modules/fastapi_leaudit/services/usageStatsService.py` - `fastapi_modules/fastapi_leaudit/services/impl/usageStatsServiceImpl.py` 职责: - 记录登录成功事件 - 记录登录失败事件 - 更新 `sso_users.last_login_at` #### 任务 5:登录成功时写入 `usage_login_events` 需要记录: - `user_id` - `sub` - `username_snapshot` - `nick_name_snapshot` - `department_name_snapshot` - `ou_name_snapshot` - `area_snapshot` - `login_time` - `login_result = success` - `login_type` - `token_jti`(可选) - `ip_address`(可选) - `user_agent`(可选) #### 任务 6:登录成功后更新 `sso_users.last_login_at` 规则: - 仅成功登录时更新 - OAuth 与密码登录都要更新 #### 任务 7:登录失败时写入 `usage_login_events` 规则: - 不更新 `last_login_at` - 尽量保留失败原因 - 若无法识别用户,可 `user_id` 为空,但保留 `sub` ### 5.4 验收标准 - 成功登录后数据库有事件记录 - `sso_users.last_login_at` 被更新 - 失败登录后数据库有失败记录 - 不影响现有登录返回结构 --- ## 6. 阶段三:评查链路补数 ### 6.1 目标 补齐评查发起人的可统计性,解决“谁发起评查”问题。 ### 6.2 代码位置 - `fastapi_modules/fastapi_leaudit/controllers/documentController.py` - `fastapi_modules/fastapi_leaudit/controllers/auditController.py` - `fastapi_modules/fastapi_leaudit/services/impl/documentServiceImpl.py` - `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py` ### 6.3 问题说明 当前 `leaudit_audit_runs` 已有字段: - `trigger_user_id` 但创建 run 时没有写入。 ### 6.4 任务项 #### 任务 8:调整 `AuditService.Run` 入参,接收 `CurrentUserId` 现状: - `Run(DocumentId, RuleType, Force, Speed)` 建议改为: - `Run(CurrentUserId, DocumentId, RuleType, Force, Speed)` #### 任务 9:在 `LeauditAuditRun` 创建时写入 `trigger_user_id` 代码位置: - `fastapi_modules/fastapi_leaudit/services/impl/auditServiceImpl.py` #### 任务 10:梳理所有触发评查入口 需要逐一确认是否能拿到当前用户: - 上传后自动评查 - 手工发起评查 - 重新评查 如存在系统自动触发场景,可约定: - 系统触发:`trigger_user_id = NULL` - 用户触发:写入真实用户 ID ### 6.5 验收标准 - 用户上传自动触发评查时,有 `trigger_user_id` - 用户手工发起评查时,有 `trigger_user_id` - 统计接口可按用户正确统计评查次数 --- ## 7. 阶段四:统计后端接口开发 ### 7.1 目标 实现《系统使用统计接口设计》定义的一期接口。 ### 7.2 建议新增代码位置 #### 控制器 建议新增: - `fastapi_modules/fastapi_leaudit/controllers/usageStatsController.py` #### 服务接口 建议新增: - `fastapi_modules/fastapi_leaudit/services/usageStatsService.py` #### 服务实现 建议新增: - `fastapi_modules/fastapi_leaudit/services/impl/usageStatsServiceImpl.py` #### DTO / VO 建议新增: - `fastapi_modules/fastapi_leaudit/domian/Dto/usageStatsDto.py` - `fastapi_modules/fastapi_leaudit/domian/vo/usageStatsVo.py` ### 7.3 一期接口优先级 #### P0 - `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` #### P1 - `GET /api/v3/usage-stats/by-categories` - `GET /api/v3/usage-stats/by-document-types` - `GET /api/v3/usage-stats/by-entry-modules` - `GET /api/v3/usage-stats/export` ### 7.4 任务项 #### 任务 11:实现统一筛选参数解析 统一处理: - `dateFrom` - `dateTo` - `userId` - `departmentName` - `area` - `areaScope` - `entryModuleId` - `documentCategoryId` - `documentTypeId` - `page` - `pageSize` - `sortBy` - `sortOrder` #### 任务 12:实现概览统计接口 返回: - 登录用户数 - 登录次数 - 活跃用户数 - 上传文档数 - 上传附件数 - 评查次数 - 完成评查数 - 失败评查数 #### 任务 13:实现趋势统计接口 支持指标: - 登录 - 上传 - 评查 - 活跃用户 支持粒度: - 日 - 周 - 月 #### 任务 14:实现按用户汇总接口 输出: - 用户基础信息 - 登录次数 - 上传次数 - 附件上传次数 - 评查次数 - 最近登录时间 #### 任务 15:实现按部门汇总接口 输出: - 部门名称 - 用户数 - 登录人数/次数 - 上传次数 - 评查次数 #### 任务 16:实现按地区汇总接口 支持: - 用户地区口径 - 文档地区口径 #### 任务 17:实现按文档类型 / 文档大类 / 入口模块汇总接口 前提: - 若一期做文档大类映射表,则支持大类统计 - 若一期不做,则可先上线文档类型与入口模块统计,大类接口后置 #### 任务 18:实现明细查询接口 至少支持: - 登录明细 - 上传明细 - 评查明细 #### 任务 19:实现导出接口 建议先支持: - CSV - XLSX(二期可补) ### 7.5 验收标准 - 所有接口按统一结构返回 - 支持时间范围筛选 - 支持分页与排序 - 数据可回溯到明细 --- ## 8. 阶段五:前端页面开发 ### 8.1 目标 完成一期两个页面: - 使用概览页 - 明细查询页 ### 8.2 建议前端位置 基于现有 `legal-platform-frontend`,建议新增: #### 页面目录 - `legal-platform-frontend/app/(audit)/usage-stats/page.tsx` - `legal-platform-frontend/app/(audit)/usage-stats/UsageStatsClient.tsx` #### 组件目录 - `legal-platform-frontend/components/usage-stats/OverviewCards.tsx` - `legal-platform-frontend/components/usage-stats/TrendChart.tsx` - `legal-platform-frontend/components/usage-stats/RankTable.tsx` - `legal-platform-frontend/components/usage-stats/Filters.tsx` - `legal-platform-frontend/components/usage-stats/DetailsTable.tsx` #### API 封装 - `legal-platform-frontend/lib/api/usage-stats.ts` ### 8.3 任务项 #### 任务 20:实现筛选区组件 支持: - 时间范围 - 用户 - 部门 - 地区 - 地区口径 - 入口模块 - 文档类型 - 文档大类 - 数据类型 #### 任务 21:实现概览卡片区 展示: - 登录用户数 - 活跃用户数 - 上传文档数 - 评查次数 - 完成评查数 - 失败评查数 #### 任务 22:实现趋势图 展示: - 登录趋势 - 上传趋势 - 评查趋势 #### 任务 23:实现排行区 展示: - 用户排行 - 部门排行 - 地区排行 #### 任务 24:实现明细表格 支持: - 切换登录 / 上传 / 评查 - 分页 - 排序 - 导出 ### 8.4 验收标准 - 页面在桌面端正常展示 - 筛选逻辑生效 - 与接口联调成功 - 导出按钮可用 --- ## 9. 阶段六:联调与验收 ### 9.1 联调顺序建议 1. 登录事件入库联调 2. 评查 `trigger_user_id` 联调 3. 概览接口联调 4. 明细接口联调 5. 前端筛选联调 6. 导出联调 ### 9.2 验收清单 #### 登录统计 - 成功登录后有事件记录 - 失败登录后有失败记录 - 用户表最近登录时间正确更新 #### 上传统计 - 主文件上传统计正确 - 附件上传统计正确 - 可按用户/部门/地区过滤 #### 评查统计 - 能统计发起次数 - 能统计完成次数 - 能统计失败次数 - 能按用户统计评查次数 #### 分类统计 - 能按文档类型统计 - 能按入口模块统计 - 若一期做大类映射,则能按文档大类统计 #### 页面功能 - 概览页展示正常 - 明细页查询正常 - 导出正常 --- ## 10. 角色分工建议 ### 后端 负责: - SQL 变更 - 登录/评查补数 - 统计接口 - 导出接口 ### 前端 负责: - 页面开发 - 筛选器 - 图表与表格 - 导出按钮 ### 测试/产品 负责: - 统计口径确认 - 用例验收 - 历史数据校验 --- ## 11. 风险点与注意事项 ### 风险 1:当前没有历史登录明细 影响: - 上线前的历史登录次数无法完整回补 建议: - 上线后开始累计 - 历史阶段只展示“最近登录时间”或不展示登录趋势历史 ### 风险 2:`trigger_user_id` 目前未写入 影响: - 历史评查记录按用户统计可能不完整 建议: - 新逻辑上线后补齐新增数据 - 历史 run 若无法还原则标记为“未知触发人” ### 风险 3:文档大类口径不统一 影响: - 报表分类不稳定 建议: - 一期尽量确认是否复用现有一级分类 - 若无法确认,优先落地映射表方案 ### 风险 4:部门/地区历史快照漂移 影响: - 用户调岗后,历史统计可能变化 建议: - 登录事件表采用快照字段 - 上传/评查若后续要求强一致历史归属,可二期再补快照机制 --- ## 12. 一期最终实施顺序建议 推荐按照以下顺序推进: 1. 出 SQL 迁移脚本 2. 先补登录事件与最近登录时间 3. 再补评查触发人 4. 开发概览与明细接口 5. 开发前端概览页与明细页 6. 做导出 7. 联调验收 这样做的好处是: - 风险最小 - 统计口径先稳定 - 前后端可以并行推进 - 一期就能较快交付可用结果