"""服务项目模型 管理医美服务项目基础信息 """ from typing import Optional, List, TYPE_CHECKING from sqlalchemy import BigInteger, String, Boolean, Integer, Text, ForeignKey from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import BaseModel if TYPE_CHECKING: from app.models.category import Category from app.models.user import User from app.models.project_cost_item import ProjectCostItem from app.models.project_labor_cost import ProjectLaborCost from app.models.project_cost_summary import ProjectCostSummary from app.models.pricing_plan import PricingPlan class Project(BaseModel): """服务项目表""" __tablename__ = "projects" project_code: Mapped[str] = mapped_column( String(50), unique=True, nullable=False, index=True, comment="项目编码" ) project_name: Mapped[str] = mapped_column( String(100), nullable=False, comment="项目名称" ) category_id: Mapped[Optional[int]] = mapped_column( BigInteger, ForeignKey("categories.id"), nullable=True, index=True, comment="项目分类ID" ) description: Mapped[Optional[str]] = mapped_column( Text, nullable=True, comment="项目描述" ) duration_minutes: Mapped[int] = mapped_column( Integer, nullable=False, default=0, comment="操作时长(分钟)" ) is_active: Mapped[bool] = mapped_column( Boolean, nullable=False, default=True, index=True, comment="是否启用" ) created_by: Mapped[Optional[int]] = mapped_column( BigInteger, ForeignKey("users.id"), nullable=True, comment="创建人ID" ) # 关系 category: Mapped[Optional["Category"]] = relationship( "Category", back_populates="projects" ) creator: Mapped[Optional["User"]] = relationship( "User", back_populates="created_projects" ) # 成本相关关系 cost_items: Mapped[List["ProjectCostItem"]] = relationship( "ProjectCostItem", back_populates="project", cascade="all, delete-orphan" ) labor_costs: Mapped[List["ProjectLaborCost"]] = relationship( "ProjectLaborCost", back_populates="project", cascade="all, delete-orphan" ) cost_summary: Mapped[Optional["ProjectCostSummary"]] = relationship( "ProjectCostSummary", back_populates="project", uselist=False, cascade="all, delete-orphan" ) pricing_plans: Mapped[List["PricingPlan"]] = relationship( "PricingPlan", back_populates="project", cascade="all, delete-orphan" )