后端: - 审核结果拆分为 4 个独立维度 (法规合规/平台规则/品牌安全/Brief匹配度) - 卖点优先级从 required:bool 改为三级 (core/recommended/reference) - AI 语义匹配卖点覆盖 + AI 整体 Brief 匹配度分析 - BriefMatchDetail 评分详情 (覆盖率+亮点+问题点) - min_selling_points 代理商可配置最少卖点数 + Alembic 迁移 - AI 语境复核过滤误报 - Brief AI 解析 + 规则 AI 解析 - AI 未配置/异常时通知品牌方 - 种子数据更新 (新格式审核结果+brief_match_detail) 前端: - 三端审核页面展示四维度评分卡片 - 卖点编辑改为三级优先级选择器 - BriefMatchDetail 展示 (覆盖率进度条+亮点+问题) - min_selling_points 配置 UI - AI 配置页未配置时静默处理 - 文件预览/下载/签名 URL 优化 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
80 lines
2.7 KiB
Python
80 lines
2.7 KiB
Python
"""
|
||
Brief 相关 Schema
|
||
|
||
卖点格式 (selling_points: List[dict]):
|
||
新格式: {"content": "卖点内容", "priority": "core|recommended|reference"}
|
||
旧格式: {"content": "卖点内容", "required": true|false}
|
||
兼容规则: required=true → priority="core", required=false → priority="recommended"
|
||
"""
|
||
from typing import Optional, List
|
||
from datetime import datetime
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
# ===== 请求 =====
|
||
|
||
class BriefCreateRequest(BaseModel):
|
||
"""创建/更新 Brief 请求"""
|
||
file_url: Optional[str] = None
|
||
file_name: Optional[str] = None
|
||
selling_points: Optional[List[dict]] = None
|
||
blacklist_words: Optional[List[dict]] = None
|
||
competitors: Optional[List[str]] = None
|
||
brand_tone: Optional[str] = None
|
||
min_duration: Optional[int] = None
|
||
max_duration: Optional[int] = None
|
||
other_requirements: Optional[str] = None
|
||
attachments: Optional[List[dict]] = None
|
||
agency_attachments: Optional[List[dict]] = None
|
||
|
||
|
||
class BriefUpdateRequest(BaseModel):
|
||
"""更新 Brief 请求"""
|
||
file_url: Optional[str] = None
|
||
file_name: Optional[str] = None
|
||
selling_points: Optional[List[dict]] = None
|
||
blacklist_words: Optional[List[dict]] = None
|
||
competitors: Optional[List[str]] = None
|
||
brand_tone: Optional[str] = None
|
||
min_duration: Optional[int] = None
|
||
max_duration: Optional[int] = None
|
||
other_requirements: Optional[str] = None
|
||
attachments: Optional[List[dict]] = None
|
||
agency_attachments: Optional[List[dict]] = None
|
||
|
||
|
||
class AgencyBriefUpdateRequest(BaseModel):
|
||
"""代理商更新 Brief 请求(允许更新代理商附件 + 卖点 + 违禁词 + AI解析内容)"""
|
||
agency_attachments: Optional[List[dict]] = None
|
||
selling_points: Optional[List[dict]] = None
|
||
min_selling_points: Optional[int] = None
|
||
blacklist_words: Optional[List[dict]] = None
|
||
brand_tone: Optional[str] = None
|
||
other_requirements: Optional[str] = None
|
||
|
||
|
||
# ===== 响应 =====
|
||
|
||
class BriefResponse(BaseModel):
|
||
"""Brief 响应"""
|
||
id: str
|
||
project_id: str
|
||
project_name: Optional[str] = None
|
||
file_url: Optional[str] = None
|
||
file_name: Optional[str] = None
|
||
selling_points: Optional[List[dict]] = None
|
||
min_selling_points: Optional[int] = None
|
||
blacklist_words: Optional[List[dict]] = None
|
||
competitors: Optional[List[str]] = None
|
||
brand_tone: Optional[str] = None
|
||
min_duration: Optional[int] = None
|
||
max_duration: Optional[int] = None
|
||
other_requirements: Optional[str] = None
|
||
attachments: Optional[List[dict]] = None
|
||
agency_attachments: Optional[List[dict]] = None
|
||
created_at: datetime
|
||
updated_at: datetime
|
||
|
||
class Config:
|
||
from_attributes = True
|