from dataclasses import dataclass from fastapi import Query from pydantic import BaseModel, ConfigDict, Field, field_validator from app.api.v1.module_common.file.schema import FileOutSchema from app.api.v1.module_energy.report_template.schema import EnergyReportTemplateOutSchema 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 EnergyReportReviewCreateSchema(BaseModel): """能源报告审核任务创建模型。""" task_name: str = Field(..., min_length=1, max_length=128, description="任务名称") template_id: int = Field(..., ge=1, description="能源报告模板ID") file_id: int = Field(..., ge=1, description="上传文档文件ID") status: int = Field(default=0, ge=0, le=2, description="状态 0:待审查 1:已审查 2:审查失败") reviewer_id: int | None = Field(default=None, ge=1, description="审查人ID") description: str | None = Field(default=None, max_length=500, description="描述") @field_validator("task_name") @classmethod def validate_task_name(cls, value: str) -> str: value = value.strip() if not value: raise ValueError("任务名称不能为空") return value @field_validator("status") @classmethod def validate_status(cls, value: int) -> int: if value not in {0, 1, 2}: raise ValueError("状态仅支持 0(待审查)、1(已审查)、2(审查失败)") return value class EnergyReportReviewUpdateSchema(EnergyReportReviewCreateSchema): """能源报告审核任务更新模型。""" class EnergyReportReviewOutSchema(EnergyReportReviewCreateSchema, BaseSchema, UserBySchema, TenantBySchema): """能源报告审核任务响应模型。""" model_config = ConfigDict(from_attributes=True) template: EnergyReportTemplateOutSchema | None = Field(default=None, description="能源报告模板") file: FileOutSchema | None = Field(default=None, description="上传文档") reviewer: CommonSchema | None = Field(default=None, description="审查人") template_name: str | None = Field(default=None, description="模板名称") reviewer_name: str | None = Field(default=None, description="审查人名称") file_url: str | None = Field(default=None, description="文档访问地址") original_name: str | None = Field(default=None, description="文档原始名称") class EnergyReportReviewStatsSchema(BaseModel): """能源报告审核任务统计模型。""" submitted_count: int = Field(default=0, description="提交任务数") reviewed_count: int = Field(default=0, description="已审查任务数") pending_count: int = Field(default=0, description="待审查任务数") failed_count: int = Field(default=0, description="审查失败任务数") class EnergyReportReviewPageOutSchema(BaseModel): """能源报告审核任务分页和统计响应模型。""" page_no: int = Field(description="当前页码") page_size: int = Field(description="每页数量") total: int = Field(description="总数") has_next: bool = Field(description="是否有下一页") stats: EnergyReportReviewStatsSchema = Field(description="统计数据") items: list[dict] = Field(default_factory=list, description="列表数据") @dataclass class EnergyReportReviewQueryParam(BaseQueryParam, UserByQueryParam, TenantByQueryParam): """能源报告审核任务查询参数。""" task_name: str | None = Query(None, description="任务名称") status: int | None = Query(None, ge=0, le=2, description="状态 0:待审查 1:已审查 2:审查失败") template_id: int | None = Query(None, ge=1, description="模板ID") reviewer_id: int | None = Query(None, ge=1, description="审查人ID") def __post_init__(self) -> None: if self.task_name: self.task_name = (QueueEnum.like.value, self.task_name) if isinstance(self.status, int): self.status = (QueueEnum.eq.value, self.status) if isinstance(self.template_id, int): self.template_id = (QueueEnum.eq.value, self.template_id) if isinstance(self.reviewer_id, int): self.reviewer_id = (QueueEnum.eq.value, self.reviewer_id)