102 lines
2.8 KiB
Python
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"
|
|
) |