1
0
mirror of https://gitlab.com/MoonTestUse1/AdministrationItDepartmens.git synced 2025-08-14 00:25:46 +02:00

чиним билд19

This commit is contained in:
MoonTestUse1
2025-01-02 01:03:30 +06:00
parent 9a4b48e545
commit 75a62900cb
3 changed files with 52 additions and 81 deletions

View File

@@ -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 ""
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

View File

@@ -16,4 +16,8 @@ class Employee(Base):
password = Column(String, nullable=False)
created_at = Column(DateTime(timezone=True), server_default=func.now())
requests = relationship("Request", back_populates="employee")
requests = relationship(
"app.models.request.Request",
back_populates="employee",
lazy="dynamic"
)

View File

@@ -30,4 +30,7 @@ class Request(Base):
status = Column(Enum(RequestStatus), nullable=False, default=RequestStatus.NEW)
created_at = Column(DateTime(timezone=True), server_default=func.now())
employee = relationship("Employee", back_populates="requests")
employee = relationship(
"app.models.employee.Employee",
back_populates="requests"
)