feat(usage-stats): add usage stats backend apis

This commit is contained in:
wren
2026-05-09 20:06:59 +08:00
parent c9d7a693b8
commit 4d56652879
7 changed files with 1315 additions and 0 deletions
@@ -0,0 +1,192 @@
"""系统使用统计控制器。"""
from __future__ import annotations
from typing import Any
from fastapi import Depends, Query
from fastapi_common.fastapi_common_security.security import verify_access_token
from fastapi_common.fastapi_common_web.controller import BaseController
from fastapi_common.fastapi_common_web.domain.responses import Result
from fastapi_modules.fastapi_leaudit.domian.vo.usageStatsVo import (
UsageStatsAreaPageVO,
UsageStatsDepartmentPageVO,
UsageStatsDetailPageVO,
UsageStatsOverviewVO,
UsageStatsTrendVO,
UsageStatsUserPageVO,
)
from fastapi_modules.fastapi_leaudit.services.impl.usageStatsServiceImpl import UsageStatsServiceImpl
from fastapi_modules.fastapi_leaudit.services.usageStatsService import IUsageStatsService
class UsageStatsController(BaseController):
"""系统使用统计控制器。"""
def __init__(self):
super().__init__(prefix="/v3/usage-stats", tags=["系统使用统计"])
self.UsageStatsService: IUsageStatsService = UsageStatsServiceImpl()
@self.router.get("/overview", response_model=Result[UsageStatsOverviewVO])
async def GetOverview(
dateFrom: str | None = None,
dateTo: str | None = None,
area: str | None = None,
areaScope: str | None = None,
entryModuleId: int | None = None,
documentTypeId: int | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetOverview(
CurrentUserId=int(payload["user_id"]),
Filters={
"dateFrom": dateFrom,
"dateTo": dateTo,
"area": area,
"areaScope": areaScope,
"entryModuleId": entryModuleId,
"documentTypeId": documentTypeId,
},
)
return Result.success(data=data)
@self.router.get("/trends", response_model=Result[UsageStatsTrendVO])
async def GetTrends(
dateFrom: str | None = None,
dateTo: str | None = None,
granularity: str = "day",
metric: str = "audit",
area: str | None = None,
areaScope: str | None = None,
entryModuleId: int | None = None,
documentTypeId: int | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetTrends(
CurrentUserId=int(payload["user_id"]),
Filters={
"dateFrom": dateFrom,
"dateTo": dateTo,
"granularity": granularity,
"metric": metric,
"area": area,
"areaScope": areaScope,
"entryModuleId": entryModuleId,
"documentTypeId": documentTypeId,
},
)
return Result.success(data=data)
@self.router.get("/by-users", response_model=Result[UsageStatsUserPageVO])
async def GetUsers(
page: int = 1,
pageSize: int = 20,
keyword: str | None = None,
userId: int | None = None,
departmentName: str | None = None,
area: str | None = None,
areaScope: str | None = None,
dateFrom: str | None = None,
dateTo: str | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetUsers(
CurrentUserId=int(payload["user_id"]),
Filters={
"page": page,
"pageSize": pageSize,
"keyword": keyword,
"userId": userId,
"departmentName": departmentName,
"area": area,
"areaScope": areaScope,
"dateFrom": dateFrom,
"dateTo": dateTo,
},
)
return Result.success(data=data)
@self.router.get("/by-departments", response_model=Result[UsageStatsDepartmentPageVO])
async def GetDepartments(
page: int = 1,
pageSize: int = 20,
departmentName: str | None = None,
area: str | None = None,
areaScope: str | None = None,
dateFrom: str | None = None,
dateTo: str | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetDepartments(
CurrentUserId=int(payload["user_id"]),
Filters={
"page": page,
"pageSize": pageSize,
"departmentName": departmentName,
"area": area,
"areaScope": areaScope,
"dateFrom": dateFrom,
"dateTo": dateTo,
},
)
return Result.success(data=data)
@self.router.get("/by-areas", response_model=Result[UsageStatsAreaPageVO])
async def GetAreas(
page: int = 1,
pageSize: int = 20,
areaScope: str = Query("user", description="地区口径:user/document"),
dateFrom: str | None = None,
dateTo: str | None = None,
entryModuleId: int | None = None,
documentTypeId: int | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetAreas(
CurrentUserId=int(payload["user_id"]),
Filters={
"page": page,
"pageSize": pageSize,
"areaScope": areaScope,
"dateFrom": dateFrom,
"dateTo": dateTo,
"entryModuleId": entryModuleId,
"documentTypeId": documentTypeId,
},
)
return Result.success(data=data)
@self.router.get("/details", response_model=Result[UsageStatsDetailPageVO])
async def GetDetails(
dataType: str = Query("audit", description="login/upload/audit"),
page: int = 1,
pageSize: int = 20,
userId: int | None = None,
departmentName: str | None = None,
area: str | None = None,
areaScope: str | None = None,
entryModuleId: int | None = None,
documentTypeId: int | None = None,
dateFrom: str | None = None,
dateTo: str | None = None,
payload: dict[str, Any] = Depends(verify_access_token),
):
data = await self.UsageStatsService.GetDetails(
CurrentUserId=int(payload["user_id"]),
Filters={
"dataType": dataType,
"page": page,
"pageSize": pageSize,
"userId": userId,
"departmentName": departmentName,
"area": area,
"areaScope": areaScope,
"entryModuleId": entryModuleId,
"documentTypeId": documentTypeId,
"dateFrom": dateFrom,
"dateTo": dateTo,
},
)
return Result.success(data=data)