fix: 合规审查卡死修复 + 小红书复制格式 + today-only过滤

This commit is contained in:
Yuzhiran Dev
2026-05-27 18:25:30 +08:00
parent 6585909ffc
commit bd3228806d
14 changed files with 278 additions and 148 deletions
+39 -2
View File
@@ -1,5 +1,6 @@
from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.orm import Session
from sqlalchemy import func as sa_func
from typing import List, Optional
from ..database import get_db
@@ -17,15 +18,44 @@ DEFAULT_CONFIGS = {
"scheduled_optimize": {"name": "🔍 合规审查", "cron": "03:00", "params": {"auto_pass_threshold": 80}},
"scheduled_optimize_sources": {"name": "📡 信息源优化", "cron": "05:00", "params": {}},
"scheduled_metrics_sync": {"name": "📊 指标同步", "cron": "06:00", "params": {}},
"scheduled_task_monitor": {"name": "⏰ 任务监控", "cron": "*", "params": {}},
}
def _attach_last_log(resp: TaskConfigResponse, db: Session, module_id: str) -> TaskConfigResponse:
"""从最近一次 TaskLog 中附加 last_run_at 和 result_data"""
last_log = db.query(TaskLog).filter(
TaskLog.module_id == module_id, TaskLog.status.in_(["success", "failed"])
).order_by(TaskLog.started_at.desc()).first()
if last_log:
resp.last_run_at = last_log.started_at
resp.result_data = last_log.result_data or {}
return resp
@router.get("", response_model=List[TaskConfigResponse])
def list_configs(db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):
configs = db.query(TaskConfig).order_by(TaskConfig.id).all()
if not configs:
_ensure_defaults(db)
configs = db.query(TaskConfig).order_by(TaskConfig.id).all()
return [TaskConfigResponse.model_validate(c) for c in configs]
# 批量查询各模块最近一次运行记录
latest_ids = db.query(
sa_func.max(TaskLog.id).label('max_id')
).filter(
TaskLog.status.in_(["success", "failed"])
).group_by(TaskLog.module_id).subquery()
latest_logs = db.query(TaskLog).filter(
TaskLog.id.in_(db.query(latest_ids.c.max_id))
).all()
log_by_module = {log.module_id: log for log in latest_logs}
result = []
for cfg in configs:
resp = TaskConfigResponse.model_validate(cfg)
log = log_by_module.get(cfg.module_id)
if log:
resp.last_run_at = log.started_at
resp.result_data = log.result_data or {}
result.append(resp)
return result
@router.get("/{module_id}", response_model=TaskConfigResponse)
def get_config(module_id: str, db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):
@@ -33,7 +63,14 @@ def get_config(module_id: str, db: Session = Depends(get_db), admin_user=Depends
if not cfg:
_ensure_defaults(db)
cfg = db.query(TaskConfig).filter(TaskConfig.module_id == module_id).first()
return cfg
if not cfg:
default = DEFAULT_CONFIGS.get(module_id, {})
cfg = TaskConfig(module_id=module_id, enabled=True, params=default.get("params", {}), schedule=default.get("cron", ""))
db.add(cfg)
db.commit()
db.refresh(cfg)
resp = TaskConfigResponse.model_validate(cfg)
return _attach_last_log(resp, db, module_id)
@router.put("/{module_id}", response_model=TaskConfigResponse)
def update_config(module_id: str, data: TaskConfigUpdate, db: Session = Depends(get_db), admin_user=Depends(get_current_admin)):