"""项目数据模型 定义标书项目的数据结构,包括项目信息、任务清单、文档结构等。 """ from datetime import datetime from enum import Enum from uuid import UUID, uuid4 from pydantic import BaseModel, Field from .task import Task class ProjectStatus(str, Enum): """项目状态""" CREATED = "created" ANALYZING = "analyzing" GENERATING = "generating" COMPLETED = "completed" class DocumentChapter(BaseModel): """文档章节结构""" id: str = Field(..., description="章节ID") title: str = Field(..., description="章节标题") level: int = Field(..., description="章节层级") requirements: str = Field(default="", description="章节内容要求") word_count: int = Field(default=0, description="预期字数") is_generated: bool = Field(default=False, description="是否已生成内容") class Project(BaseModel): """项目模型""" id: UUID = Field(default_factory=uuid4, description="项目唯一标识") name: str = Field(..., description="项目名称") description: str = Field(default="", description="项目描述") status: ProjectStatus = Field(default=ProjectStatus.CREATED, description="项目状态") # 文件路径 source_file: str = Field(..., description="招标文件路径") work_dir: str = Field(..., description="工作目录") # 文档结构 chapters: list[DocumentChapter] = Field(default_factory=list, description="文档章节结构") tasks: list[Task] = Field(default_factory=list, description="任务清单") # 时间戳 created_at: datetime = Field(default_factory=datetime.now, description="创建时间") updated_at: datetime = Field(default_factory=datetime.now, description="更新时间") class Config: use_enum_values = True def add_task(self, task: Task) -> None: """添加任务""" self.tasks.append(task) self.updated_at = datetime.now() def get_task_by_id(self, task_id: UUID) -> Task | None: """根据ID获取任务""" for task in self.tasks: if task.id == task_id: return task return None def get_pending_tasks(self) -> list[Task]: """获取待处理任务""" return [task for task in self.tasks if task.status.value == "pending"] @property def progress(self) -> float: """获取项目进度(0-1)""" if not self.tasks: return 0.0 completed = len([t for t in self.tasks if t.status.value == "completed"]) return completed / len(self.tasks)