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

68 lines
1.7 KiB
Python

"""项目人工成本模型
管理项目的人工成本配置
"""
from typing import Optional, TYPE_CHECKING
from decimal import Decimal
from sqlalchemy import BigInteger, Integer, String, DECIMAL, ForeignKey
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import BaseModel
if TYPE_CHECKING:
from app.models.project import Project
from app.models.staff_level import StaffLevel
class ProjectLaborCost(BaseModel):
"""项目人工成本表"""
__tablename__ = "project_labor_costs"
project_id: Mapped[int] = mapped_column(
BigInteger,
ForeignKey("projects.id", ondelete="CASCADE"),
nullable=False,
index=True,
comment="项目ID"
)
staff_level_id: Mapped[int] = mapped_column(
BigInteger,
ForeignKey("staff_levels.id"),
nullable=False,
index=True,
comment="人员级别ID"
)
duration_minutes: Mapped[int] = mapped_column(
Integer,
nullable=False,
comment="操作时长(分钟)"
)
hourly_rate: Mapped[Decimal] = mapped_column(
DECIMAL(10, 2),
nullable=False,
comment="时薪(记录时的快照)"
)
labor_cost: Mapped[Decimal] = mapped_column(
DECIMAL(12, 2),
nullable=False,
comment="人工成本 = duration/60 * hourly_rate"
)
remark: Mapped[Optional[str]] = mapped_column(
String(200),
nullable=True,
comment="备注"
)
# 关系
project: Mapped["Project"] = relationship(
"Project",
back_populates="labor_costs"
)
staff_level: Mapped["StaffLevel"] = relationship(
"StaffLevel",
back_populates="project_labor_costs"
)