# database/models.py - SQLAlchemy ORM 数据模型 from datetime import datetime from sqlalchemy import ( Column, Integer, String, Text, Boolean, DateTime, ForeignKey, Enum, ) from sqlalchemy.orm import declarative_base, relationship Base = declarative_base() class Project(Base): """项目表""" __tablename__ = "projects" id = Column(Integer, primary_key=True, autoincrement=True) name = Column(String(200), nullable=False, unique=True) language = Column(String(50), nullable=False, default="python") description = Column(Text, nullable=True) output_dir = Column(String(500), nullable=True) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) raw_requirements = relationship("RawRequirement", back_populates="project", cascade="all, delete-orphan") functional_requirements = relationship("FunctionalRequirement", back_populates="project", cascade="all, delete-orphan") change_history = relationship("ChangeHistory", back_populates="project", cascade="all, delete-orphan") def __repr__(self): return f"" class RawRequirement(Base): """原始需求表""" __tablename__ = "raw_requirements" id = Column(Integer, primary_key=True, autoincrement=True) project_id = Column(Integer, ForeignKey("projects.id"), nullable=False) content = Column(Text, nullable=False) source_type = Column(String(20), nullable=False, default="text") # text / file source_name = Column(String(200), nullable=True) knowledge = Column(Text, nullable=True) created_at = Column(DateTime, default=datetime.utcnow) project = relationship("Project", back_populates="raw_requirements") functional_requirements = relationship("FunctionalRequirement", back_populates="raw_requirement", cascade="all, delete-orphan") def __repr__(self): return f"" class FunctionalRequirement(Base): """功能需求表""" __tablename__ = "functional_requirements" id = Column(Integer, primary_key=True, autoincrement=True) project_id = Column(Integer, ForeignKey("projects.id"), nullable=False) raw_req_id = Column(Integer, ForeignKey("raw_requirements.id"), nullable=False) index_no = Column(Integer, nullable=False) title = Column(String(200), nullable=False) description = Column(Text, nullable=False) function_name = Column(String(200), nullable=False) priority = Column(Enum("high", "medium", "low"), default="medium") module = Column(String(100), nullable=True, default="default") # 功能模块 status = Column(String(50), nullable=False, default="pending") # pending / generated / failed is_custom = Column(Boolean, nullable=False, default=False) created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) project = relationship("Project", back_populates="functional_requirements") raw_requirement = relationship("RawRequirement", back_populates="functional_requirements") code_files = relationship("CodeFile", back_populates="functional_requirement", cascade="all, delete-orphan") def __repr__(self): return ( f"" ) class CodeFile(Base): """生成代码文件表""" __tablename__ = "code_files" id = Column(Integer, primary_key=True, autoincrement=True) func_req_id = Column(Integer, ForeignKey("functional_requirements.id"), nullable=False) file_name = Column(String(200), nullable=False) file_path = Column(String(500), nullable=False) module = Column(String(100), nullable=True) # 冗余存储,方便查询 language = Column(String(50), nullable=False) content = Column(Text, nullable=True) generated_at = Column(DateTime, default=datetime.utcnow) functional_requirement = relationship("FunctionalRequirement", back_populates="code_files") def __repr__(self): return f"" class ChangeHistory(Base): """变更历史表""" __tablename__ = "change_history" id = Column(Integer, primary_key=True, autoincrement=True) project_id = Column(Integer, ForeignKey("projects.id"), nullable=False) change_time = Column(DateTime, default=datetime.utcnow) changes = Column(Text, nullable=False) # 记录变更内容 status = Column(String(50), nullable=False, default="pending") # pending / confirmed project = relationship("Project", back_populates="change_history") def __repr__(self): return f""