"""统计服务:统一 TG 命令和 Web API 的统计口径""" from __future__ import annotations from datetime import datetime from db.models import Action, Ban, Message from services.time_utils import local_day_range def day_range(day: str | None = None) -> tuple[str, datetime, datetime]: """返回当前应用时区的 (YYYY-MM-DD, start, end)。""" return local_day_range(day) async def get_daily_stats(day: str | None = None) -> dict: """获取单日统计。""" day_str, start, end = day_range(day) msg_count = await Message.filter(created_at__gte=start, created_at__lt=end).count() spam_count = await Message.filter(created_at__gte=start, created_at__lt=end, is_spam=True).count() ban_count = await Ban.filter(created_at__gte=start, created_at__lt=end).count() total_bans = await Ban.all().count() join_count = await Action.filter(action="JOIN", created_at__gte=start, created_at__lt=end).count() leave_count = await Action.filter(action="LEAVE", created_at__gte=start, created_at__lt=end).count() delete_count = await Action.filter(action="DELETE", created_at__gte=start, created_at__lt=end).count() unban_count = await Action.filter(action="UNBAN", created_at__gte=start, created_at__lt=end).count() return { "date": day_str, "messages": msg_count, "spam_messages": spam_count, "bans": ban_count, "today_bans": ban_count, "total_bans": total_bans, "joins": join_count, "leaves": leave_count, "deleted": delete_count, "unbans": unban_count, "chat_count": msg_count, }