74 lines
2.9 KiB
Python
74 lines
2.9 KiB
Python
|
|
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'<Package {self.name}>'
|