bidmaster-cli/src/bidmaster/models/project.py
sladro c1292fcacc feat: add validation and toc pipeline upgrades
Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
2025-11-19 10:11:21 +08:00

79 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""项目数据模型
定义标书项目的数据结构,包括项目信息、任务清单、文档结构等。
"""
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)