from django.db import models import uuid from django.utils import timezone class Brand(models.Model): """品牌模型""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) name = models.CharField(max_length=100, unique=True, verbose_name='品牌名称') description = models.TextField(blank=True, null=True, verbose_name='品牌描述') logo_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='品牌Logo') category = models.CharField(max_length=100, blank=True, null=True, verbose_name='品牌分类') source = models.CharField(max_length=100, blank=True, null=True, verbose_name='来源') collab_count = models.IntegerField(default=0, verbose_name='合作数量') creators_count = models.IntegerField(default=0, verbose_name='创作者数量') campaign_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='活动ID') # 添加数据统计字段 total_gmv_achieved = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name='总GMV') total_views_achieved = models.DecimalField(max_digits=12, decimal_places=2, default=0, verbose_name='总浏览量') shop_overall_rating = models.DecimalField(max_digits=3, decimal_places=1, default=0.0, verbose_name='店铺评分') # 存储关联到此品牌的所有产品和活动知识库ID列表 dataset_id_list = models.JSONField(default=list, blank=True, verbose_name='知识库ID列表', help_text='所有关联的知识库ID列表') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') is_active = models.BooleanField(default=True, verbose_name='是否激活') class Meta: verbose_name = '品牌' verbose_name_plural = '品牌' def __str__(self): return self.name class Product(models.Model): """产品模型 - 作为一个知识库""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='products', verbose_name='所属品牌') name = models.CharField(max_length=100, verbose_name='产品名称') description = models.TextField(blank=True, null=True, verbose_name='产品描述') image_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='产品图片') # 添加产品详情字段 pid = models.CharField(max_length=100, blank=True, null=True, verbose_name='产品ID') commission_rate = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name='佣金率') open_collab = models.DecimalField(max_digits=5, decimal_places=2, default=0, verbose_name='开放合作率') available_samples = models.IntegerField(default=0, verbose_name='可用样品数') sales_price_min = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='最低销售价') sales_price_max = models.DecimalField(max_digits=10, decimal_places=2, default=0, verbose_name='最高销售价') stock = models.IntegerField(default=0, verbose_name='库存') items_sold = models.IntegerField(default=0, verbose_name='已售数量') product_rating = models.DecimalField(max_digits=3, decimal_places=1, default=0, verbose_name='产品评分') reviews_count = models.IntegerField(default=0, verbose_name='评价数量') collab_creators = models.IntegerField(default=0, verbose_name='合作创作者数') tiktok_shop = models.BooleanField(default=False, verbose_name='是否TikTok商店') dataset_id = models.CharField(max_length=100, verbose_name='知识库ID', help_text='外部知识库系统中的ID') external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID', help_text='外部系统中的唯一标识') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') is_active = models.BooleanField(default=True, verbose_name='是否激活') class Meta: verbose_name = '产品' verbose_name_plural = '产品' unique_together = ['brand', 'name'] indexes = [ models.Index(fields=['brand']), models.Index(fields=['dataset_id']), models.Index(fields=['is_active']), models.Index(fields=['pid']), ] def __str__(self): return f"{self.brand.name} - {self.name}" def save(self, *args, **kwargs): """重写save方法,更新品牌的dataset_id_list""" is_new = self.pk is None super().save(*args, **kwargs) # 刷新品牌的dataset_id_list if is_new and self.is_active and self.dataset_id: brand = self.brand if self.dataset_id not in brand.dataset_id_list: brand.dataset_id_list.append(self.dataset_id) brand.save(update_fields=['dataset_id_list', 'updated_at']) class Campaign(models.Model): """活动模型 - 作为一个知识库""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='campaigns', verbose_name='所属品牌') name = models.CharField(max_length=100, verbose_name='活动名称') description = models.TextField(blank=True, null=True, verbose_name='活动描述') image_url = models.CharField(max_length=255, blank=True, null=True, verbose_name='活动图片') # 活动相关字段 service = models.CharField(max_length=100, blank=True, null=True, verbose_name='服务类型') creator_type = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者类型') creator_level = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者等级') creator_category = models.CharField(max_length=100, blank=True, null=True, verbose_name='创作者分类') creators_count = models.IntegerField(default=0, verbose_name='创作者数量') gmv = models.CharField(max_length=100, blank=True, null=True, verbose_name='GMV范围') followers = models.CharField(max_length=100, blank=True, null=True, verbose_name='粉丝数范围') views = models.CharField(max_length=100, blank=True, null=True, verbose_name='浏览量范围') budget = models.CharField(max_length=100, blank=True, null=True, verbose_name='预算范围') link_product = models.ManyToManyField(Product, blank=True, related_name='campaigns', verbose_name='关联产品') # 时间信息 start_date = models.DateTimeField(blank=True, null=True, verbose_name='开始日期') end_date = models.DateTimeField(blank=True, null=True, verbose_name='结束日期') # 知识库信息 dataset_id = models.CharField(max_length=100, verbose_name='知识库ID', help_text='外部知识库系统中的ID') external_id = models.CharField(max_length=100, blank=True, null=True, verbose_name='外部ID', help_text='外部系统中的唯一标识') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') is_active = models.BooleanField(default=True, verbose_name='是否激活') class Meta: verbose_name = '活动' verbose_name_plural = '活动' unique_together = ['brand', 'name'] indexes = [ models.Index(fields=['brand']), models.Index(fields=['dataset_id']), models.Index(fields=['is_active']), models.Index(fields=['start_date']), models.Index(fields=['end_date']), ] def __str__(self): return f"{self.brand.name} - {self.name}" def save(self, *args, **kwargs): """重写save方法,更新品牌的dataset_id_list""" is_new = self.pk is None super().save(*args, **kwargs) # 刷新品牌的dataset_id_list if is_new and self.is_active and self.dataset_id: brand = self.brand if self.dataset_id not in brand.dataset_id_list: brand.dataset_id_list.append(self.dataset_id) brand.save(update_fields=['dataset_id_list', 'updated_at']) class BrandChatSession(models.Model): """品牌聊天会话模型""" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) brand = models.ForeignKey(Brand, on_delete=models.CASCADE, related_name='chat_sessions', verbose_name='品牌') session_id = models.CharField(max_length=100, unique=True, verbose_name='会话ID') title = models.CharField(max_length=200, default='新对话', verbose_name='会话标题') # 存储此次会话使用的所有知识库ID dataset_id_list = models.JSONField(default=list, blank=True, verbose_name='知识库ID列表') created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建时间') updated_at = models.DateTimeField(auto_now=True, verbose_name='更新时间') is_active = models.BooleanField(default=True, verbose_name='是否激活') class Meta: verbose_name = '品牌聊天会话' verbose_name_plural = '品牌聊天会话' indexes = [ models.Index(fields=['brand']), models.Index(fields=['session_id']), models.Index(fields=['created_at']), ] def __str__(self): return f"{self.brand.name} - {self.title}"