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())
|