mirror of
https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git
synced 2025-08-14 00:25:46 +02:00
чиним билд19
This commit is contained in:
@@ -1,89 +1,53 @@
|
||||
from sqlalchemy import func, text
|
||||
"""Statistics CRUD operations"""
|
||||
from sqlalchemy.orm import Session
|
||||
from sqlalchemy.sql import func
|
||||
from datetime import datetime, timedelta
|
||||
from ..schemas import tables
|
||||
from ..models.request import RequestStatus
|
||||
|
||||
from ..models.request import Request, RequestStatus
|
||||
|
||||
def get_statistics(db: Session, period: str = "week"):
|
||||
# Calculate date range based on period
|
||||
now = datetime.now()
|
||||
if period == "day":
|
||||
start_date = now - timedelta(days=1)
|
||||
elif period == "week":
|
||||
start_date = now - timedelta(weeks=1)
|
||||
elif period == "month":
|
||||
start_date = now - timedelta(days=30)
|
||||
else: # all time
|
||||
start_date = datetime.min
|
||||
"""Get statistics for the given period"""
|
||||
try:
|
||||
# Calculate date range
|
||||
end_date = datetime.now()
|
||||
if period == "week":
|
||||
start_date = end_date - timedelta(days=7)
|
||||
elif period == "month":
|
||||
start_date = end_date - timedelta(days=30)
|
||||
else:
|
||||
start_date = end_date - timedelta(days=7) # default to week
|
||||
|
||||
# Total requests
|
||||
total_requests = db.query(func.count(tables.Request.id)).scalar() or 0
|
||||
# Get total requests
|
||||
total_requests = db.query(func.count(Request.id)).scalar() or 0
|
||||
|
||||
# Resolved requests in period
|
||||
resolved_requests = (
|
||||
db.query(func.count(tables.Request.id))
|
||||
.filter(tables.Request.status == RequestStatus.RESOLVED)
|
||||
.filter(tables.Request.created_at >= start_date)
|
||||
.scalar()
|
||||
or 0
|
||||
)
|
||||
|
||||
# Average resolution time (in hours)
|
||||
avg_resolution = (
|
||||
db.query(
|
||||
func.avg(func.julianday("now") - func.julianday(tables.Request.created_at))
|
||||
* 24
|
||||
# Get requests by status
|
||||
requests_by_status = (
|
||||
db.query(Request.status, func.count(Request.id))
|
||||
.group_by(Request.status)
|
||||
.all()
|
||||
)
|
||||
.filter(
|
||||
tables.Request.status == RequestStatus.RESOLVED,
|
||||
tables.Request.created_at >= start_date,
|
||||
|
||||
# Convert to dictionary
|
||||
status_counts = {
|
||||
status.name: 0 for status in RequestStatus
|
||||
}
|
||||
for status, count in requests_by_status:
|
||||
status_counts[status.name] = count
|
||||
|
||||
# Get recent requests
|
||||
recent_requests = (
|
||||
db.query(Request)
|
||||
.filter(Request.created_at >= start_date)
|
||||
.order_by(Request.created_at.desc())
|
||||
.limit(5)
|
||||
.all()
|
||||
)
|
||||
.scalar()
|
||||
)
|
||||
|
||||
avg_resolution_time = f"{int(avg_resolution or 0)}ч" if avg_resolution else "0ч"
|
||||
return {
|
||||
"total_requests": total_requests,
|
||||
"status_counts": status_counts,
|
||||
"recent_requests": recent_requests
|
||||
}
|
||||
|
||||
# Request volume over time
|
||||
volume_data = (
|
||||
db.query(
|
||||
func.date(tables.Request.created_at).label("date"),
|
||||
func.count(tables.Request.id).label("count"),
|
||||
)
|
||||
.filter(tables.Request.created_at >= start_date)
|
||||
.group_by(text("date"))
|
||||
.all()
|
||||
)
|
||||
|
||||
# Request types distribution
|
||||
type_distribution = (
|
||||
db.query(tables.Request.request_type, func.count(tables.Request.id))
|
||||
.group_by(tables.Request.request_type)
|
||||
.all()
|
||||
)
|
||||
|
||||
# Status distribution
|
||||
status_distribution = (
|
||||
db.query(tables.Request.status, func.count(tables.Request.id))
|
||||
.group_by(tables.Request.status)
|
||||
.all()
|
||||
)
|
||||
|
||||
# Ensure all statuses are represented
|
||||
all_statuses = {status.value: 0 for status in RequestStatus}
|
||||
for status, count in status_distribution:
|
||||
all_statuses[status] = count
|
||||
|
||||
status_data = [(status, count) for status, count in all_statuses.items()]
|
||||
|
||||
return {
|
||||
"totalRequests": total_requests,
|
||||
"resolvedRequests": resolved_requests,
|
||||
"averageResolutionTime": avg_resolution_time,
|
||||
"volumeLabels": [str(d[0]) for d in volume_data],
|
||||
"volumeData": [d[1] for d in volume_data],
|
||||
"typeLabels": [t[0] for t in type_distribution],
|
||||
"typeData": [t[1] for t in type_distribution],
|
||||
"statusLabels": [s[0] for s in status_data],
|
||||
"statusData": [s[1] for s in status_data],
|
||||
}
|
||||
except Exception as e:
|
||||
print(f"Error getting statistics: {e}")
|
||||
raise
|
||||
|
Reference in New Issue
Block a user