kangda_robot_backend/ruoyi-fastapi-backend/module_admin/dao/sys_statistics_dao.py

267 lines
8.6 KiB
Python

from sqlalchemy import delete, select, update, and_, desc, insert, func
from sqlalchemy.ext.asyncio import AsyncSession
from module_admin.entity.do.sys_statistics_do import SysStatistics
from module_admin.entity.vo.sys_statistics_vo import Sys_statisticsModel, Sys_statisticsPageQueryModel
from utils.page_util import PageUtil
from datetime import datetime, date
class Sys_statisticsDao:
"""
系统统计数据模块数据库操作层
"""
@classmethod
async def get_total_statistics_data(cls, db: AsyncSession):
"""
添加系统统计数据
:param query_db:
:param page_object:
:return:
"""
stmt = (
select(
func.sum(SysStatistics.llm_call).label('llm_call'),
func.sum(SysStatistics.access_control_count).label('access_control_count'),
func.sum(SysStatistics.visitor_guide).label('visitor_guide'),
func.sum(SysStatistics.exhibition_explanation).label('exhibition_explanation'),
)
)
result = await db.execute(stmt)
return result.mappings().first()
@classmethod
async def add_count(cls, db: AsyncSession, field: str, user_name:str , count: int = 1):
stmt = (
select(SysStatistics)
.where(
SysStatistics.stat_date == datetime.now().date()
)
)
result = (await db.execute(stmt)).scalars().first()
if result:
update_stmt = (
update(SysStatistics)
.where(
SysStatistics.statistic_id == result.statistic_id
)
.values(
{
field: getattr(result, field) + count,
"update_time": datetime.now(),
"update_by": user_name,
}
)
)
await db.execute(update_stmt)
else:
insert_stmt = (
insert(SysStatistics)
.values(
{
"stat_date": datetime.now().date(),
field: 1,
"create_time": datetime.now(),
"update_time": datetime.now(),
"create_by": user_name,
}
)
)
await db.execute(insert_stmt)
@classmethod
async def add_model_call_count(cls, db: AsyncSession, user_name: str):
stmt = (
select(SysStatistics)
.where(
SysStatistics.stat_date == datetime.now().date()
)
)
result = (await db.execute(stmt)).scalars().first()
if result:
update_stmt = (
update(SysStatistics)
.where(
SysStatistics.statistic_id == result.statistic_id
)
.values(
{
"llm_call": result.llm_call + 1,
"update_time": datetime.now(),
"update_by": user_name,
}
)
)
await db.execute(update_stmt)
else:
insert_stmt = (
insert(SysStatistics)
.values(
{
"stat_date": datetime.now().date(),
"llm_call": 1,
"create_time": datetime.now(),
"update_time": datetime.now(),
"create_by": user_name,
}
)
)
await db.execute(insert_stmt)
@classmethod
async def get_access_control_success_rate(cls, db: AsyncSession, start_time: datetime, end_time: datetime):
stmt = (
select(SysStatistics.access_control_success_rate, SysStatistics.stat_date)
.where(
and_(
SysStatistics.stat_date >= start_time,
SysStatistics.stat_date <= end_time
)
)
.order_by(desc(SysStatistics.stat_date))
)
return (await db.execute(stmt)).mappings().all()
@classmethod
async def get_visitor_count(cls, db: AsyncSession, start_time: date, end_time: date):
stmt = (
select(SysStatistics.visitor_guide, SysStatistics.stat_date)
.where(
and_(
SysStatistics.stat_date >= start_time,
SysStatistics.stat_date <= end_time,
)
)
.order_by(desc(SysStatistics.stat_date))
)
return (await db.execute(stmt)).mappings().all()
@classmethod
async def get_statistics_data(cls, db: AsyncSession, dd: date):
# 使用 func.date() 确保日期格式正确比较
stmt = (
select(
SysStatistics.llm_call,
SysStatistics.access_control_count,
SysStatistics.visitor_guide,
SysStatistics.exhibition_explanation
)
.where(func.date(SysStatistics.stat_date) == dd)
)
result = (await db.execute(stmt)).mappings().first()
return result
@classmethod
async def get_sys_statistics_detail_by_id(cls, db: AsyncSession, statistic_id: int):
"""
根据统计项目ID获取系统统计数据详细信息
:param db: orm对象
:param statistic_id: 统计项目ID
:return: 系统统计数据信息对象
"""
sys_statistics_info = (
(
await db.execute(
select(SysStatistics)
.where(
SysStatistics.statistic_id == statistic_id
)
)
)
.scalars()
.first()
)
return sys_statistics_info
@classmethod
async def get_sys_statistics_detail_by_info(cls, db: AsyncSession, sys_statistics: Sys_statisticsModel):
"""
根据系统统计数据参数获取系统统计数据信息
:param db: orm对象
:param sys_statistics: 系统统计数据参数对象
:return: 系统统计数据信息对象
"""
sys_statistics_info = (
(
await db.execute(
select(SysStatistics).where(
)
)
)
.scalars()
.first()
)
return sys_statistics_info
@classmethod
async def get_sys_statistics_list(cls, db: AsyncSession, query_object: Sys_statisticsPageQueryModel, is_page: bool = False):
"""
根据查询参数获取系统统计数据列表信息
:param db: orm对象
:param query_object: 查询参数对象
:param is_page: 是否开启分页
:return: 系统统计数据列表信息对象
"""
query = (
select(SysStatistics)
.where(
SysStatistics.stat_date == query_object.stat_date if query_object.stat_date else True,
)
.order_by(SysStatistics.statistic_id)
.distinct()
)
sys_statistics_list = await PageUtil.paginate(db, query, query_object.page_num, query_object.page_size, is_page)
return sys_statistics_list
@classmethod
async def add_sys_statistics_dao(cls, db: AsyncSession, sys_statistics: Sys_statisticsModel):
"""
新增系统统计数据数据库操作
:param db: orm对象
:param sys_statistics: 系统统计数据对象
:return:
"""
db_sys_statistics = SysStatistics(**sys_statistics.model_dump(exclude={}))
db.add(db_sys_statistics)
await db.flush()
return db_sys_statistics
@classmethod
async def edit_sys_statistics_dao(cls, db: AsyncSession, sys_statistics: dict):
"""
编辑系统统计数据数据库操作
:param db: orm对象
:param sys_statistics: 需要更新的系统统计数据字典
:return:
"""
await db.execute(update(SysStatistics), [sys_statistics])
@classmethod
async def delete_sys_statistics_dao(cls, db: AsyncSession, sys_statistics: Sys_statisticsModel):
"""
删除系统统计数据数据库操作
:param db: orm对象
:param sys_statistics: 系统统计数据对象
:return:
"""
await db.execute(delete(SysStatistics).where(SysStatistics.statistic_id.in_([sys_statistics.statistic_id])))