You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

195 lines
7.2 KiB
Python

from sqlalchemy import JSON, UUID, Boolean, Column, DateTime, Float, ForeignKey, Integer, Numeric, String
from sqlalchemy.orm import relationship
from src.database.core import Base
from src.models import DefaultMixin
import uuid
class AerosSimulation(Base, DefaultMixin):
__tablename__ = "rbd_tr_aeros_simulation"
status = Column(String, nullable=False)
started_at = Column(DateTime, nullable=True)
completed_at = Column(DateTime, nullable=True)
input = Column(JSON, nullable=True)
error = Column(JSON, nullable=True)
simulation_name = Column(String, nullable=False)
schematic_name = Column(String, nullable=False)
reliability = Column(JSON, nullable=True)
duration = Column(Integer, nullable=True)
offset = Column(Integer, nullable=True)
is_default = Column(Boolean, default=False)
created_by = Column(UUID(as_uuid=True), nullable=True)
calc_results = relationship(
"AerosSimulationCalcResult", back_populates="aeros_simulation", lazy="raise"
)
plot_results = relationship(
"AerosSimulationPlotResult", back_populates="aeros_simulation", lazy="raise"
)
class AerosSchematic(Base, DefaultMixin):
__tablename__ = "rbd_ms_aeros_schematic"
schematic_name = Column(String, nullable=False)
alias = Column(String, nullable=False)
class AerosNode(Base, DefaultMixin):
__tablename__ = "rbd_ms_aeros_node"
id = Column(
UUID(as_uuid=True),
primary_key=True,
default=uuid.uuid4,
unique=True,
nullable=False,
)
node_type = Column(String, nullable=False)
original_node_id = Column(Integer, nullable=False)
node_id = Column(Integer, nullable=False)
node_name = Column(String, nullable=False)
structure_name = Column(String, nullable=False)
schematic_name = Column(String, nullable=False)
schematic_id = Column(UUID(as_uuid=True),ForeignKey("rbd_ms_aeros_node.id"), nullable=False)
original_schematic_id = Column(Integer, nullable=False)
ref_schematic_id = Column(Integer, nullable=False)
orignal_ref_schematic_id = Column(Integer, nullable=False)
aeros_schematic_id = Column(UUID(as_uuid=True),ForeignKey("rbd_ms_aeros_schematic.id") ,nullable=False)
model_image = Column(JSON, nullable=True)
parent = relationship(
"AerosNode",
remote_side=[id],
back_populates="children",
foreign_keys=[schematic_id],
)
equipment = relationship(
"MasterEquipment",
lazy="selectin",
primaryjoin="and_(AerosNode.node_name == foreign(MasterEquipment.location_tag))",
uselist=False, # Add this if it's a one-to-one relationship
)
children = relationship(
"AerosNode", back_populates="parent", foreign_keys=[schematic_id]
)
calc_results = relationship(
"AerosSimulationCalcResult", back_populates="aeros_node"
)
plot_results = relationship(
"AerosSimulationPlotResult", back_populates="aeros_node"
)
aeros_equipment = relationship(
"AerosEquipment", lazy="selectin", primaryjoin="and_(AerosNode.node_name == foreign(AerosEquipment.node_name))", uselist=False
)
class AerosSimulationCalcResult(Base, DefaultMixin):
__tablename__ = "rbd_tr_aeros_simulation_calc_result"
total_downtime = Column(Float, nullable=False)
total_uptime = Column(Float, nullable=False)
num_events = Column(Integer, nullable=False)
production = Column(Float, nullable=False)
production_std = Column(Float, nullable=False)
ideal_production = Column(Float, nullable=False)
availability = Column(Float, nullable=False)
efficiency = Column(Float, nullable=False)
effective_loss = Column(Float, nullable=False)
num_cm = Column(Integer, nullable=False)
cm_waiting_time = Column(Float, nullable=False)
total_cm_downtime = Column(Float, nullable=False)
num_pm = Column(Integer, nullable=False)
total_pm_downtime = Column(Float, nullable=False)
num_ip = Column(Integer, nullable=False)
total_ip_downtime = Column(Float, nullable=False)
num_oh = Column(Integer, nullable=False)
total_oh_downtime = Column(Float, nullable=False)
t_wait_for_crew = Column(Float, nullable=False)
t_wait_for_spare = Column(Float, nullable=False)
duration_at_full = Column(Float, nullable=False)
duration_above_hh = Column(Float, nullable=False)
duration_above_h = Column(Float, nullable=False)
duration_below_l = Column(Float, nullable=False)
duration_below_ll = Column(Float, nullable=False)
duration_at_empty = Column(Float, nullable=False)
stg_input = Column(Float, nullable=True)
stg_output = Column(Float, nullable=True)
average_level = Column(Float, nullable=True)
potential_production = Column(Float, nullable=True)
eaf = Column(Float, nullable=True)
eaf_konkin = Column(Float, nullable=True, default=0)
efor = Column(Float, nullable=True)
derating_hours = Column(Float, nullable=True)
eta = Column(Float, nullable=True)
beta = Column(Float, nullable=True)
mttr = Column(Integer, nullable=True)
parameters = Column(JSON, nullable=True)
contribution = Column(Float, nullable=True)
criticality = Column(Float, nullable=True)
contribution_factor = Column(Float, nullable=True)
total_mo_downtime = Column(Float, nullable=True)
total_po_downtime = Column(Float, nullable=True)
sof = Column(Float, nullable=True)
aeros_simulation_id = Column(
UUID(as_uuid=True), ForeignKey("rbd_tr_aeros_simulation.id"), nullable=False
)
aeros_node_id = Column(
UUID(as_uuid=True), ForeignKey("rbd_ms_aeros_node.id"), nullable=False
)
aeros_node = relationship("AerosNode", back_populates="calc_results", lazy="raise")
aeros_simulation = relationship(
"AerosSimulation", back_populates="calc_results", lazy="raise"
)
class AerosSimulationPlotResult(Base, DefaultMixin):
__tablename__ = "rbd_tr_aeros_simulation_plot_result"
max_flow_rate = Column(Numeric, nullable=False)
storage_capacity = Column(Numeric, nullable=False)
point_availabilities = Column(JSON, nullable=False)
point_flowrates = Column(JSON, nullable=False)
timestamp_outs = Column(JSON, nullable=False)
aeros_simulation_id = Column(
UUID(as_uuid=True), ForeignKey("rbd_tr_aeros_simulation.id"), nullable=False
)
aeros_node_id = Column(
UUID(as_uuid=True), ForeignKey("rbd_ms_aeros_node.id"), nullable=False
)
aeros_node = relationship("AerosNode", back_populates="plot_results", lazy="raise")
aeros_simulation = relationship(
"AerosSimulation", back_populates="plot_results", lazy="raise"
)
class EafContribution(Base, DefaultMixin):
__tablename__ = "rbd_ms_eaf_contribution"
location_tag = Column(String, nullable=False)
eaf_contribution = Column(Float, nullable=False)
efficiency_uptime = Column(Float, nullable=False)
edh = Column(Float, nullable=False)
# models.py
class AerosSimulationProgress(Base):
__tablename__ = "simulation_progress"
simulation_id = Column(Integer, primary_key=True)
status = Column(String, default="pending") # pending, running, failed, completed
step = Column(String, nullable=True)
progress = Column(Integer, default=0) # 0-100
error_message = Column(String, nullable=True)