117 lines
4.1 KiB
Python
117 lines
4.1 KiB
Python
"""生产系统 ORM 模型(新建表)"""
|
||
from sqlalchemy import Column, Integer, String, Date, DateTime, ForeignKey, Enum as SQLEnum, JSON
|
||
from sqlalchemy.orm import relationship
|
||
from sqlalchemy.sql import func
|
||
import enum
|
||
from app.database import Base
|
||
|
||
|
||
class ProjectStatus(str, enum.Enum):
|
||
"""项目状态枚举"""
|
||
DRAFT = "draft"
|
||
ACTIVE = "active"
|
||
COMPLETED = "completed"
|
||
CANCELLED = "cancelled"
|
||
|
||
|
||
class WorkOrderStatus(str, enum.Enum):
|
||
"""工单状态枚举"""
|
||
PENDING = "pending"
|
||
IN_PROGRESS = "in_progress"
|
||
COMPLETED = "completed"
|
||
CANCELLED = "cancelled"
|
||
|
||
|
||
class ApprovalStatus(str, enum.Enum):
|
||
"""缺料审批状态枚举"""
|
||
PENDING = "PENDING"
|
||
APPROVED = "APPROVED"
|
||
REJECTED = "REJECTED"
|
||
|
||
|
||
class PmsProject(Base):
|
||
"""项目表"""
|
||
__tablename__ = "pms_project"
|
||
|
||
id = Column(Integer, primary_key=True, index=True)
|
||
project_no = Column(String(50), unique=True, nullable=False, index=True)
|
||
name = Column(String(255), nullable=False)
|
||
start_date = Column(Date, nullable=True)
|
||
end_date = Column(Date, nullable=True)
|
||
status = Column(
|
||
SQLEnum(ProjectStatus),
|
||
default=ProjectStatus.DRAFT,
|
||
nullable=False
|
||
)
|
||
created_at = Column(DateTime, server_default=func.now())
|
||
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|
||
|
||
work_orders = relationship("PmsWorkOrder", back_populates="project")
|
||
|
||
|
||
class PmsWorkOrder(Base):
|
||
"""工单表"""
|
||
__tablename__ = "pms_work_order"
|
||
|
||
id = Column(Integer, primary_key=True, index=True)
|
||
work_order_no = Column(String(50), unique=True, nullable=False, index=True)
|
||
project_id = Column(Integer, ForeignKey("pms_project.id"), nullable=False)
|
||
target_base_id = Column(Integer, ForeignKey("material_base.id"), nullable=False)
|
||
target_quantity = Column(Integer, nullable=False, default=0)
|
||
assignee_name = Column(String(100), nullable=True)
|
||
status = Column(
|
||
SQLEnum(WorkOrderStatus),
|
||
default=WorkOrderStatus.PENDING,
|
||
nullable=False
|
||
)
|
||
created_at = Column(DateTime, server_default=func.now())
|
||
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|
||
|
||
project = relationship("PmsProject", back_populates="work_orders")
|
||
material = relationship("MaterialBase", foreign_keys=[target_base_id])
|
||
material_requisitions = relationship("PmsMaterialRequisition", back_populates="work_order")
|
||
|
||
|
||
class PmsMaterialRequisition(Base):
|
||
"""领料映射表"""
|
||
__tablename__ = "pms_material_requisition"
|
||
|
||
id = Column(Integer, primary_key=True, index=True)
|
||
work_order_id = Column(Integer, ForeignKey("pms_work_order.id"), nullable=False)
|
||
inventory_outbound_no = Column(String(100), nullable=False)
|
||
created_at = Column(DateTime, server_default=func.now())
|
||
|
||
work_order = relationship("PmsWorkOrder", back_populates="material_requisitions")
|
||
|
||
|
||
class PmsMaterialApproval(Base):
|
||
"""缺料审批表"""
|
||
__tablename__ = "pms_material_approval"
|
||
|
||
id = Column(Integer, primary_key=True, index=True)
|
||
work_order_id = Column(Integer, ForeignKey("pms_work_order.id"), nullable=False)
|
||
missing_material_id = Column(Integer, ForeignKey("material_base.id"), nullable=False)
|
||
required_qty = Column(Integer, nullable=False)
|
||
reason = Column(String(500), nullable=True)
|
||
status = Column(
|
||
SQLEnum(ApprovalStatus),
|
||
default=ApprovalStatus.PENDING,
|
||
nullable=False
|
||
)
|
||
created_at = Column(DateTime, server_default=func.now())
|
||
|
||
work_order = relationship("PmsWorkOrder")
|
||
material = relationship("MaterialBase", foreign_keys=[missing_material_id])
|
||
|
||
|
||
class PmsUserPreference(Base):
|
||
"""用户偏好表"""
|
||
__tablename__ = "pms_user_preference"
|
||
|
||
id = Column(Integer, primary_key=True, index=True)
|
||
user_id = Column(Integer, nullable=False, index=True) # 对应 SysUser.id
|
||
default_bom_target_id = Column(Integer, nullable=True) # 默认关注的成品ID
|
||
favorite_target_ids = Column(JSON, nullable=True) # 常看成品ID列表,PostgreSQL JSON 数组
|
||
created_at = Column(DateTime, server_default=func.now())
|
||
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now())
|