Co-authored-by: factory-droid[bot] <138933559+factory-droid[bot]@users.noreply.github.com>
79 lines
2.5 KiB
Python
79 lines
2.5 KiB
Python
"""项目数据模型
|
||
|
||
定义标书项目的数据结构,包括项目信息、任务清单、文档结构等。
|
||
"""
|
||
|
||
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) |