From 793c6e381714b47fb2435b503b82301286efe26d Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 16 Aug 2025 21:33:40 +0800 Subject: [PATCH] =?UTF-8?q?fix(statistic):=20=E4=BF=AE=E5=A4=8D=E7=BB=9F?= =?UTF-8?q?=E8=AE=A1=E4=BB=BB=E5=8A=A1=E4=B8=AD=E5=9B=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=AE=B0=E5=BD=95=E6=A0=BC=E5=BC=8F=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在处理来自数据库的记录时,增加对记录类型的检查和时间戳格式的转换。确保即使记录不是预期的字典格式,或者时间戳字段为None或字符串格式,程序也能够安全处理,避免因`TypeError`或`AttributeError`导致整个统计任务中断(说真的这都一天了为什么还没人修) --- src/chat/utils/statistic.py | 39 ++++++++++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/chat/utils/statistic.py b/src/chat/utils/statistic.py index 4af41f05e..486c6d2d3 100644 --- a/src/chat/utils/statistic.py +++ b/src/chat/utils/statistic.py @@ -384,10 +384,19 @@ class StatisticOutputTask(AsyncTask): model_class=LLMUsage, filters={"timestamp": {"$gte": query_start_time}}, order_by="-timestamp" - ) + ) or [] for record in records: - record_timestamp = record['timestamp'] # 从字典中获取 + if not isinstance(record, dict): + continue + + record_timestamp = record.get('timestamp') + if isinstance(record_timestamp, str): + record_timestamp = datetime.fromisoformat(record_timestamp) + + if not record_timestamp: + continue + for idx, (_, period_start) in enumerate(collect_period): if record_timestamp >= period_start: for period_key, _ in collect_period[idx:]: @@ -490,11 +499,22 @@ class StatisticOutputTask(AsyncTask): model_class=OnlineTime, filters={"end_timestamp": {"$gte": query_start_time}}, order_by="-end_timestamp" - ) + ) or [] for record in records: - record_end_timestamp = record['end_timestamp'] - record_start_timestamp = record['start_timestamp'] + if not isinstance(record, dict): + continue + + record_end_timestamp = record.get('end_timestamp') + if isinstance(record_end_timestamp, str): + record_end_timestamp = datetime.fromisoformat(record_end_timestamp) + + record_start_timestamp = record.get('start_timestamp') + if isinstance(record_start_timestamp, str): + record_start_timestamp = datetime.fromisoformat(record_start_timestamp) + + if not record_end_timestamp or not record_start_timestamp: + continue for idx, (_, period_boundary_start) in enumerate(collect_period): if record_end_timestamp >= period_boundary_start: @@ -535,10 +555,15 @@ class StatisticOutputTask(AsyncTask): model_class=Messages, filters={"time": {"$gte": query_start_timestamp}}, order_by="-time" - ) + ) or [] for message in records: - message_time_ts = message['time'] # This is a float timestamp + if not isinstance(message, dict): + continue + message_time_ts = message.get('time') # This is a float timestamp + + if not message_time_ts: + continue chat_id = None chat_name = None