fix: 剩余服务文件时间统一为北京时间

- agent_dispatcher、alert_service、report_generator、
  oss_storage、work_order_service 全部使用 beijing_now()
- 全局无遗留 UTC 时间调用

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-09 16:29:28 +08:00
parent 766ee6a69a
commit 10b25742f8
5 changed files with 18 additions and 14 deletions

View File

@@ -11,13 +11,14 @@
""" """
import json import json
from datetime import datetime, timedelta, timezone from datetime import timedelta
from typing import Dict, Optional from typing import Dict, Optional
from openai import AsyncOpenAI from openai import AsyncOpenAI
from app.config import settings from app.config import settings
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
INTENT_SYSTEM_PROMPT = """你是物业安防AI助手。根据用户消息识别意图仅输出JSON。 INTENT_SYSTEM_PROMPT = """你是物业安防AI助手。根据用户消息识别意图仅输出JSON。
@@ -144,7 +145,7 @@ class AgentDispatcher:
# 解析时间范围 # 解析时间范围
time_range = params.get("time_range", "today") time_range = params.get("time_range", "today")
now = datetime.now(timezone.utc) now = beijing_now()
if time_range == "week": if time_range == "week":
start = now - timedelta(days=now.weekday()) start = now - timedelta(days=now.weekday())
start = start.replace(hour=0, minute=0, second=0, microsecond=0) start = start.replace(hour=0, minute=0, second=0, microsecond=0)

View File

@@ -3,13 +3,14 @@
处理告警 CRUD旧版告警系统已迁移至 alarm_event_service 处理告警 CRUD旧版告警系统已迁移至 alarm_event_service
""" """
import uuid import uuid
from datetime import datetime, timezone from datetime import datetime
from typing import Optional, List, Dict, Any from typing import Optional, List, Dict, Any
from app.models import Alert, AlertStatus, AlertLevel, get_session from app.models import Alert, AlertStatus, AlertLevel, get_session
from app.schemas import AlertCreate, AlertHandleRequest from app.schemas import AlertCreate, AlertHandleRequest
from app.services.oss_storage import get_oss_storage from app.services.oss_storage import get_oss_storage
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
class AlertService: class AlertService:
@@ -20,7 +21,7 @@ class AlertService:
def generate_alert_no(self) -> str: def generate_alert_no(self) -> str:
"""生成告警编号""" """生成告警编号"""
timestamp = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S") timestamp = beijing_now().strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8].upper() unique_id = uuid.uuid4().hex[:8].upper()
return f"ALT{timestamp}{unique_id}" return f"ALT{timestamp}{unique_id}"
@@ -161,8 +162,8 @@ class AlertService:
alert.status = AlertStatus(handle_data.status) alert.status = AlertStatus(handle_data.status)
alert.handle_remark = handle_data.remark alert.handle_remark = handle_data.remark
alert.handled_by = handled_by alert.handled_by = handled_by
alert.handled_at = datetime.now(timezone.utc) alert.handled_at = beijing_now()
alert.updated_at = datetime.now(timezone.utc) alert.updated_at = beijing_now()
db.commit() db.commit()
db.refresh(alert) db.refresh(alert)
@@ -183,7 +184,7 @@ class AlertService:
alert.status = AlertStatus.DISPATCHED alert.status = AlertStatus.DISPATCHED
alert.work_order_id = work_order_id alert.work_order_id = work_order_id
alert.updated_at = datetime.now(timezone.utc) alert.updated_at = beijing_now()
db.commit() db.commit()
db.refresh(alert) db.refresh(alert)

View File

@@ -8,12 +8,13 @@
import os import os
import time import time
import uuid import uuid
from datetime import datetime, timezone from datetime import datetime
from typing import Optional from typing import Optional
from pathlib import Path from pathlib import Path
from app.config import settings from app.config import settings
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
# 按需导入 COS SDK # 按需导入 COS SDK
@@ -148,7 +149,7 @@ def _generate_object_key(prefix: str = "", ext: str = ".jpg") -> str:
生成对象存储 Key 生成对象存储 Key
格式: {prefix}/{YYYY}/{MM}/{DD}/{YYYYMMDDHHmmss}_{uuid8}{ext} 格式: {prefix}/{YYYY}/{MM}/{DD}/{YYYYMMDDHHmmss}_{uuid8}{ext}
""" """
now = datetime.now(timezone.utc) now = beijing_now()
date_path = now.strftime("%Y/%m/%d") date_path = now.strftime("%Y/%m/%d")
timestamp = now.strftime("%Y%m%d%H%M%S") timestamp = now.strftime("%Y%m%d%H%M%S")
unique_id = uuid.uuid4().hex[:8].upper() unique_id = uuid.uuid4().hex[:8].upper()

View File

@@ -5,7 +5,7 @@
""" """
import io import io
from datetime import datetime, timedelta, timezone from datetime import timedelta
from typing import Optional, Tuple from typing import Optional, Tuple
from openpyxl import Workbook from openpyxl import Workbook
@@ -13,6 +13,7 @@ from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from app.models import AlarmEvent, get_session from app.models import AlarmEvent, get_session
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
TYPE_NAMES = {"leave_post": "人员离岗", "intrusion": "周界入侵"} TYPE_NAMES = {"leave_post": "人员离岗", "intrusion": "周界入侵"}
@@ -35,7 +36,7 @@ def generate_alarm_report(
Returns: Returns:
(filename, bytes_io) 或 None无数据时 (filename, bytes_io) 或 None无数据时
""" """
now = datetime.now(timezone.utc) now = beijing_now()
if time_range == "today": if time_range == "today":
start = now.replace(hour=0, minute=0, second=0, microsecond=0) start = now.replace(hour=0, minute=0, second=0, microsecond=0)
label = now.strftime("%Y%m%d") label = now.strftime("%Y%m%d")

View File

@@ -6,16 +6,16 @@
""" """
import uuid import uuid
from datetime import datetime, timezone
from typing import Optional, Dict, List, Tuple from typing import Optional, Dict, List, Tuple
from app.models import WorkOrder, WorkOrderStatus, WorkOrderPriority, get_session from app.models import WorkOrder, WorkOrderStatus, WorkOrderPriority, get_session
from app.utils.logger import logger from app.utils.logger import logger
from app.utils.timezone import beijing_now
def generate_order_no() -> str: def generate_order_no() -> str:
"""生成工单编号: WO + YYYYMMDDHHmmss + 6位uuid""" """生成工单编号: WO + YYYYMMDDHHmmss + 6位uuid"""
ts = datetime.now(timezone.utc).strftime("%Y%m%d%H%M%S") ts = beijing_now().strftime("%Y%m%d%H%M%S")
return f"WO{ts}{uuid.uuid4().hex[:6].upper()}" return f"WO{ts}{uuid.uuid4().hex[:6].upper()}"
@@ -114,7 +114,7 @@ class WorkOrderService:
if result: if result:
order.result = result order.result = result
now = datetime.now(timezone.utc) now = beijing_now()
if status == "processing" and not order.started_at: if status == "processing" and not order.started_at:
order.started_at = now order.started_at = now
elif status == "completed": elif status == "completed":