Files
smart-project-pricing/后端服务/app/models/project.py
2026-01-31 21:33:06 +08:00

102 lines
2.8 KiB
Python

"""服务项目模型
管理医美服务项目基础信息
"""
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"
)