"""生产系统 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())