208 lines
9.4 KiB
Python
208 lines
9.4 KiB
Python
from django.db import models
|
||
from django.utils.html import format_html
|
||
import qrcode
|
||
from io import BytesIO
|
||
import base64
|
||
|
||
class ESP32Config(models.Model):
|
||
"""
|
||
ESP32 硬件配置选项模型
|
||
用于定义可售卖的硬件参数
|
||
"""
|
||
name = models.CharField(max_length=100, verbose_name="配置名称")
|
||
chip_type = models.CharField(max_length=50, verbose_name="芯片型号", help_text="例如: ESP32-S3, ESP32-C3")
|
||
flash_size = models.IntegerField(verbose_name="Flash大小(MB)", default=4)
|
||
ram_size = models.IntegerField(verbose_name="PSRAM大小(MB)", default=2)
|
||
has_camera = models.BooleanField(default=False, verbose_name="是否包含摄像头")
|
||
has_microphone = models.BooleanField(default=False, verbose_name="是否包含麦克风")
|
||
price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="价格")
|
||
description = models.TextField(verbose_name="描述", blank=True)
|
||
detail_image = models.ImageField(upload_to='products/details/', blank=True, null=True, verbose_name="详情页长图 (上传)")
|
||
detail_image_url = models.URLField(blank=True, null=True, verbose_name="详情页长图 (URL)", help_text="如果填写了URL,将优先使用URL")
|
||
static_image_url = models.URLField(blank=True, null=True, verbose_name="产品静态图 (URL)")
|
||
model_3d_url = models.URLField(blank=True, null=True, verbose_name="产品3D模型 (URL)", help_text="请上传包含 .obj 模型文件和 .mtl 材质文件的 .zip 压缩包")
|
||
|
||
def __str__(self):
|
||
return f"{self.name} - ¥{self.price}"
|
||
|
||
class Meta:
|
||
verbose_name = "硬件配置 (小智参数)"
|
||
verbose_name_plural = "硬件配置 (小智参数)"
|
||
|
||
|
||
class ProductFeature(models.Model):
|
||
"""
|
||
产品特性模型 (关联到具体硬件配置)
|
||
"""
|
||
product = models.ForeignKey(ESP32Config, on_delete=models.CASCADE, related_name='features', verbose_name="所属产品")
|
||
title = models.CharField(max_length=50, verbose_name="特性标题")
|
||
description = models.TextField(verbose_name="特性描述")
|
||
icon_name = models.CharField(max_length=50, blank=True, null=True, verbose_name="Antd图标名称", help_text="例如: SafetyCertificate, Eye, Thunderbolt")
|
||
icon_image = models.ImageField(upload_to='products/features/', blank=True, null=True, verbose_name="特性图标 (上传)")
|
||
icon_url = models.URLField(blank=True, null=True, verbose_name="特性图标 (URL)")
|
||
order = models.IntegerField(default=0, verbose_name="排序权重", help_text="数字越小越靠前")
|
||
|
||
def __str__(self):
|
||
return f"{self.product.name} - {self.title}"
|
||
|
||
class Meta:
|
||
verbose_name = "产品特性"
|
||
verbose_name_plural = "产品特性"
|
||
ordering = ['order']
|
||
|
||
|
||
class Salesperson(models.Model):
|
||
"""
|
||
销售人员模型
|
||
"""
|
||
name = models.CharField(max_length=50, verbose_name="销售员姓名")
|
||
code = models.CharField(max_length=20, unique=True, verbose_name="推广码", help_text="唯一的推广标识码,如: zhangsan01")
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||
|
||
def __str__(self):
|
||
return f"{self.name} ({self.code})"
|
||
|
||
class Meta:
|
||
verbose_name = "销售员"
|
||
verbose_name_plural = "销售员管理"
|
||
|
||
|
||
class WeChatPayConfig(models.Model):
|
||
"""
|
||
微信支付配置模型
|
||
"""
|
||
app_id = models.CharField(max_length=50, verbose_name="AppID")
|
||
mch_id = models.CharField(max_length=50, verbose_name="商户号(MchID)")
|
||
api_key = models.CharField(max_length=100, verbose_name="API密钥(Key)")
|
||
app_secret = models.CharField(max_length=100, verbose_name="AppSecret", blank=True, null=True)
|
||
notify_url = models.URLField(verbose_name="回调通知地址")
|
||
is_active = models.BooleanField(default=True, verbose_name="是否启用")
|
||
|
||
class Meta:
|
||
verbose_name = "微信支付配置"
|
||
verbose_name_plural = "微信支付配置"
|
||
|
||
def __str__(self):
|
||
return f"微信支付配置 ({'启用' if self.is_active else '禁用'})"
|
||
|
||
def save(self, *args, **kwargs):
|
||
# 确保只有一个启用的配置
|
||
if self.is_active:
|
||
WeChatPayConfig.objects.filter(is_active=True).exclude(id=self.id).update(is_active=False)
|
||
super().save(*args, **kwargs)
|
||
|
||
|
||
class Order(models.Model):
|
||
"""
|
||
订单模型
|
||
记录用户的购买请求和支付状态
|
||
"""
|
||
STATUS_CHOICES = (
|
||
('pending', '待支付'),
|
||
('paid', '已支付'),
|
||
('shipped', '已发货'),
|
||
('cancelled', '已取消'),
|
||
)
|
||
|
||
config = models.ForeignKey(ESP32Config, on_delete=models.CASCADE, verbose_name="所选配置")
|
||
quantity = models.IntegerField(default=1, verbose_name="数量")
|
||
total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="总价")
|
||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="订单状态")
|
||
|
||
# 销售归属
|
||
salesperson = models.ForeignKey(Salesperson, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属销售员", related_name='orders')
|
||
|
||
# 用户信息
|
||
customer_name = models.CharField(max_length=100, verbose_name="收货人姓名", default="")
|
||
phone_number = models.CharField(max_length=20, verbose_name="联系电话", default="")
|
||
shipping_address = models.TextField(verbose_name="发货地址", default="")
|
||
|
||
# 微信支付相关字段
|
||
wechat_trade_no = models.CharField(max_length=100, blank=True, null=True, verbose_name="微信支付单号")
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||
|
||
def __str__(self):
|
||
return f"Order #{self.id} - {self.customer_name} - {self.status}"
|
||
|
||
class Meta:
|
||
verbose_name = "订单"
|
||
verbose_name_plural = "订单列表"
|
||
|
||
|
||
class Service(models.Model):
|
||
"""
|
||
AI服务项目模型
|
||
"""
|
||
title = models.CharField(max_length=100, verbose_name="服务名称")
|
||
icon = models.ImageField(upload_to='services/icons/', blank=True, null=True, verbose_name="图标 (上传)")
|
||
icon_url = models.URLField(blank=True, null=True, verbose_name="图标 (URL)")
|
||
description = models.TextField(verbose_name="简介")
|
||
features = models.TextField(verbose_name="特性列表", help_text="每行一个特性")
|
||
price = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name="起步价格")
|
||
unit = models.CharField(max_length=20, default="次", verbose_name="计费单位", help_text="例如:次、小时、月、个")
|
||
delivery_time = models.CharField(max_length=50, blank=True, verbose_name="预计交付周期", help_text="例如:3-5个工作日")
|
||
delivery_content = models.TextField(blank=True, verbose_name="交付内容", help_text="描述将交付给客户的具体成果")
|
||
color = models.CharField(max_length=20, default="#00f0ff", verbose_name="主题色")
|
||
detail_image = models.ImageField(upload_to='services/details/', blank=True, null=True, verbose_name="详情页长图 (上传)")
|
||
detail_image_url = models.URLField(blank=True, null=True, verbose_name="详情页长图 (URL)")
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
class Meta:
|
||
verbose_name = "AI服务"
|
||
verbose_name_plural = "AI服务管理"
|
||
|
||
|
||
class ServiceOrder(models.Model):
|
||
"""
|
||
AI服务订单模型
|
||
"""
|
||
STATUS_CHOICES = (
|
||
('pending', '待沟通/待支付'),
|
||
('processing', '服务进行中'),
|
||
('completed', '已完成'),
|
||
('cancelled', '已取消'),
|
||
)
|
||
|
||
service = models.ForeignKey(Service, on_delete=models.CASCADE, verbose_name="所选服务")
|
||
customer_name = models.CharField(max_length=100, verbose_name="客户姓名")
|
||
company_name = models.CharField(max_length=100, blank=True, verbose_name="公司名称")
|
||
phone_number = models.CharField(max_length=20, verbose_name="联系电话")
|
||
email = models.EmailField(blank=True, verbose_name="电子邮箱")
|
||
requirements = models.TextField(verbose_name="具体需求描述", blank=True)
|
||
|
||
total_price = models.DecimalField(max_digits=10, decimal_places=2, verbose_name="预估总价", default=0)
|
||
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="订单状态")
|
||
|
||
salesperson = models.ForeignKey(Salesperson, on_delete=models.SET_NULL, null=True, blank=True, verbose_name="所属销售员")
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||
updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")
|
||
|
||
def __str__(self):
|
||
return f"{self.customer_name} - {self.service.title}"
|
||
|
||
class Meta:
|
||
verbose_name = "服务订单"
|
||
verbose_name_plural = "服务订单列表"
|
||
|
||
|
||
class ARService(models.Model):
|
||
"""
|
||
AR体验服务模型
|
||
"""
|
||
title = models.CharField(max_length=100, verbose_name="体验名称")
|
||
description = models.TextField(verbose_name="简介")
|
||
cover_image = models.ImageField(upload_to='ar/covers/', blank=True, null=True, verbose_name="封面/长图 (上传)")
|
||
cover_image_url = models.URLField(blank=True, null=True, verbose_name="封面/长图 (URL)")
|
||
created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")
|
||
|
||
def __str__(self):
|
||
return self.title
|
||
|
||
class Meta:
|
||
verbose_name = "AR体验"
|
||
verbose_name_plural = "AR体验管理"
|