"""项目人工成本模型 管理项目的人工成本配置 """ 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" )