68 lines
1.7 KiB
Python
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"
|
|
)
|