from datetime import datetime from app import db class Package(db.Model): """产品套餐模型""" __tablename__ = 'package' package_id = db.Column(db.String(64), primary_key=True) # 套餐ID product_id = db.Column(db.String(32), db.ForeignKey('product.product_id'), nullable=False) # 关联产品ID name = db.Column(db.String(64), nullable=False) # 套餐名称 description = db.Column(db.Text, nullable=True) # 套餐描述 price = db.Column(db.Float, nullable=False) # 价格 duration = db.Column(db.Integer, nullable=False) # 时长(天) max_devices = db.Column(db.Integer, nullable=False, default=1) # 最大设备数 stock = db.Column(db.Integer, nullable=False, default=-1) # 库存,-1表示无限 status = db.Column(db.Integer, nullable=False, default=1) # 0=禁用, 1=启用 sort_order = db.Column(db.Integer, nullable=False, default=0) # 排序 create_time = db.Column(db.DateTime, default=datetime.utcnow) update_time = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) # 关联关系 product = db.relationship('Product', backref='packages') def __init__(self, **kwargs): super(Package, self).__init__(**kwargs) if not self.package_id: # 自动生成套餐ID import uuid self.package_id = f"PKG_{uuid.uuid4().hex[:8]}".upper() def is_enabled(self): """套餐是否启用""" return self.status == 1 def has_stock(self): """是否有库存""" return self.stock == -1 or self.stock > 0 def get_duration_type(self): """获取时长类型""" if self.duration == -1: return '永久卡' elif self.duration == 1: return '天卡' elif self.duration == 30: return '月卡' elif self.duration == 90: return '季卡' elif self.duration == 365: return '年卡' else: return f'{self.duration}天卡' def to_dict(self): """转换为字典""" return { 'package_id': self.package_id, 'product_id': self.product_id, 'name': self.name, 'description': self.description, 'price': self.price, 'duration': self.duration, 'duration_text': self.get_duration_type(), 'max_devices': self.max_devices, 'stock': self.stock, 'status': self.status, 'status_name': '启用' if self.status == 1 else '禁用', 'sort_order': self.sort_order, 'create_time': self.create_time.strftime('%Y-%m-%d %H:%M:%S') if self.create_time else None, 'update_time': self.update_time.strftime('%Y-%m-%d %H:%M:%S') if self.update_time else None } def __repr__(self): return f''