VWED_server/data/models/storage_area.py

71 lines
2.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
库区数据模型
支持密集库区和一般库区的管理
"""
from sqlalchemy import Column, String, Integer, Boolean, Text, DateTime, Enum
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.mysql import CHAR
from .base import BaseModel
import enum
class StorageAreaType(enum.Enum):
"""库区类型枚举"""
GENERAL = "general" # 一般库区
DENSE = "dense" # 密集库区
class StorageArea(BaseModel):
"""
库区数据模型
一个库区可以包含多个动作点
"""
__tablename__ = 'vwed_storage_area'
id = Column(CHAR(64), primary_key=True, comment='库区ID')
area_name = Column(String(64), nullable=False, unique=True, comment='库区名称')
area_type = Column(Enum(StorageAreaType), nullable=False, default=StorageAreaType.GENERAL, comment='库区类型')
scene_id = Column(String(32), nullable=False, comment='场景ID')
# 选择库位逻辑 1 先进先出 2 先进后出
select_logic = Column(Integer, nullable=False, default=1, comment='选择库位逻辑 1 先进先出 2 先进后出 ')
# 库区属性
max_capacity = Column(Integer, nullable=False, default=0, comment='最大容量')
current_usage = Column(Integer, nullable=False, default=0, comment='当前使用量')
is_active = Column(Boolean, nullable=False, default=True, comment='是否激活')
is_maintenance = Column(Boolean, nullable=False, default=False, comment='是否维护中')
# 库区描述和配置
description = Column(Text, comment='库区描述')
tags = Column(String(255), comment='库区标签')
# 关联关系
operate_points = relationship(
"OperatePoint",
back_populates="storage_area",
cascade="all, delete-orphan"
)
def __repr__(self):
return f"<StorageArea(id={self.id}, area_name={self.area_name}, area_type={self.area_type})>"
def get_available_capacity(self):
"""获取可用容量"""
return self.max_capacity - self.current_usage
def get_usage_rate(self):
"""获取使用率"""
if self.max_capacity == 0:
return 0.0
return (self.current_usage / self.max_capacity) * 100.0
def is_dense_area(self):
"""是否为密集库区"""
return self.area_type == StorageAreaType.DENSE
def is_general_area(self):
"""是否为一般库区"""
return self.area_type == StorageAreaType.GENERAL