from dataclasses import dataclass from fastapi import Query from pydantic import BaseModel, ConfigDict, Field, field_validator from app.common.enums import QueueEnum from app.core.base_params import BaseQueryParam, TenantByQueryParam, UserByQueryParam from app.core.base_schema import BaseSchema, CommonSchema, TenantBySchema, UserBySchema class ChapterCreateSchema(BaseModel): """章节创建模型。""" template_id: int = Field(..., ge=1, description="能源报告模板ID") chapter_name: str = Field(..., min_length=1, max_length=128, description="章节名称") chapter_order: int = Field(default=999, ge=0, description="章节排序") rule_id: int = Field(..., ge=1, description="关联规则ID") description: str | None = Field(default=None, max_length=500, description="描述") @field_validator("chapter_name") @classmethod def validate_chapter_name(cls, value: str) -> str: value = value.strip() if not value: raise ValueError("章节名称不能为空") return value class ChapterUpdateSchema(BaseModel): """章节更新模型。""" chapter_name: str = Field(..., min_length=1, max_length=128, description="章节名称") chapter_order: int = Field(default=999, ge=0, description="章节排序") rule_id: int = Field(..., ge=1, description="关联规则ID") description: str | None = Field(default=None, max_length=500, description="描述") @field_validator("chapter_name") @classmethod def validate_chapter_name(cls, value: str) -> str: value = value.strip() if not value: raise ValueError("章节名称不能为空") return value class ChapterOutSchema(ChapterCreateSchema, BaseSchema, UserBySchema, TenantBySchema): """章节响应模型。""" model_config = ConfigDict(from_attributes=True) rule_name: str | None = Field(default=None, description="关联规则名称") @dataclass class ChapterQueryParam(BaseQueryParam, UserByQueryParam, TenantByQueryParam): """章节查询参数。""" template_id: int | None = Query(None, ge=1, description="模板ID") chapter_name: str | None = Query(None, description="章节名称") rule_id: int | None = Query(None, ge=1, description="规则ID") def __post_init__(self) -> None: if isinstance(self.template_id, int): self.template_id = (QueueEnum.eq.value, self.template_id) if self.chapter_name: self.chapter_name = (QueueEnum.like.value, self.chapter_name) if isinstance(self.rule_id, int): self.rule_id = (QueueEnum.eq.value, self.rule_id)