# 宇之然内容创作平台 - 文章生成API from pydantic import BaseModel from datetime import datetime from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from typing import List, Optional import asyncio from core.security import get_current_user, create_audit_log from app.database import get_db from app.models import Topic, User router = APIRouter() class BatchGenerateRequest(BaseModel): topic_ids: Optional[List[str]] = None class BatchOptimizeRequest(BaseModel): topic_ids: List[int] @router.post("/run") async def batch_generate( request: BatchGenerateRequest, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """批量创建选题文章(简化版)""" # 如果没有指定topic_ids,则获取所有待处理的选题 if not request.topic_ids: topics = db.query(Topic).filter(Topic.status != "已发布").all() topic_ids = [t.id for t in topics] else: topic_ids = request.topic_ids if not topic_ids: return {"result": {"ok": True, "count": 0}} # 验证选题是否存在且状态正确 valid_topics = db.query(Topic).filter( Topic.id.in_(topic_ids), Topic.status != "已发布" ).all() if len(valid_topics) != len(topic_ids): invalid_count = len(topic_ids) - len(valid_topics) raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=f"有{invalid_count}个选题状态不正确或不存在" ) # 更新选题状态为"待审查" for topic in valid_topics: topic.generated_at = datetime.utcnow() topic.status = "待审查" topic.updated_at = datetime.utcnow() db.commit() # 记录审计日志 create_audit_log( db=db, user_id=current_user.id, action="batch_generate", resource_type="topic", resource_id=None, details=f"处理选题数量: {len(valid_topics)}" ) return { "result": { "ok": True, "count": len(valid_topics) } } @router.post("/optimize/run") async def batch_optimize( request: BatchOptimizeRequest, current_user: User = Depends(get_current_user), db: Session = Depends(get_db) ): """批量优化选题文章""" # 检查选题是否存在且状态正确(必须是待审查) valid_topics = db.query(Topic).filter( Topic.id.in_(request.topic_ids), Topic.status == "待审查" ).all() if len(valid_topics) != len(request.topic_ids): invalid_count = len(request.topic_ids) - len(valid_topics) raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=f"有{invalid_count}个选题状态不正确或不存在" ) # 执行优化逻辑(简化实现) auto_passed = 0 need_manual = 0 for topic in valid_topics: # 这里应该调用实际的合规性检查逻辑 # 简化实现:随机决定通过或不通过 import random if random.choice([True, False]): topic.status = "待发布" auto_passed += 1 else: topic.status = "待审查" need_manual += 1 topic.updated_at = datetime.utcnow() db.commit() # 记录审计日志 create_audit_log( db=db, user_id=current_user.id, action="batch_optimize", resource_type="topic", resource_id=None, details=f"自动通过: {auto_passed}, 需人工: {need_manual}" ) return { "summary": { "passed_auto": auto_passed, "need_manual": need_manual, "total": len(valid_topics) } }