import requests import logging import json from django.conf import settings from asgiref.sync import async_to_sync from channels.layers import get_channel_layer logger = logging.getLogger('brands') class OfferStatusService: """提供获取达人谈判状态的服务""" @staticmethod def fetch_status(creator_id, product_id): """ 获取达人对产品的谈判状态 :param creator_id: 达人ID :param product_id: 产品ID :return: 状态字符串 """ try: url = "http://81.69.223.133:58099/api/operation/negotiations/offer_status/" payload = { 'creator_id': str(creator_id), 'product_id': str(product_id) } response = requests.post(url, data=payload) if response.status_code == 200: data = response.json() if data['code'] == 200: return data['data']['status'] else: logger.error(f"获取谈判状态失败: {data['message']}") return None else: logger.error(f"请求谈判状态接口失败: {response.status_code}") return None except Exception as e: logger.error(f"获取谈判状态时发生错误: {str(e)}") return None @staticmethod def update_creator_status(campaign_id, creator_id, status): """ 更新达人的状态 :param campaign_id: 活动ID :param creator_id: 达人ID :param status: 新状态 :return: 是否更新成功 """ try: from apps.daren_detail.models import CreatorCampaign # 更新数据库中的状态 creator_campaign = CreatorCampaign.objects.get( campaign_id=campaign_id, creator_id=creator_id ) # 如果状态没有变化,则不进行更新 if creator_campaign.status == status: return False creator_campaign.status = status creator_campaign.save() logger.info(f"已更新数据库中的状态: 活动 {campaign_id}, 达人 {creator_id}, 状态 {status}") return True except CreatorCampaign.DoesNotExist: logger.error(f"找不到关联记录: 活动 {campaign_id}, 达人 {creator_id}") return False except Exception as e: logger.error(f"更新达人状态时发生错误: {str(e)}") return False @staticmethod def get_campaign_creator_data(campaign_id): """ 获取活动关联的所有达人信息 :param campaign_id: 活动ID :return: 达人信息列表 """ try: from apps.daren_detail.models import CreatorCampaign, CreatorProfile # 查询与活动关联的所有达人关联记录 creator_campaigns = CreatorCampaign.objects.filter( campaign_id=campaign_id ).select_related('creator') creator_list = [] for cc in creator_campaigns: creator = cc.creator # 格式化粉丝数和观看量 followers_formatted = f"{int(creator.followers / 1000)}k" if creator.followers else "0" avg_views_formatted = f"{int(creator.avg_video_views / 1000)}k" if creator.avg_video_views else "0" # 构建响应数据 creator_data = { "id": str(creator.id), "name": creator.name, "avatar": creator.avatar_url, "category": creator.category, "followers": followers_formatted, "views": avg_views_formatted, "gmv": f"${creator.gmv}k" if creator.gmv else "$0", "pricing": f"${creator.pricing_min}" if creator.pricing_min else "$0", "status": cc.status } creator_list.append(creator_data) return creator_list except Exception as e: logger.error(f"获取活动达人数据时发生错误: {str(e)}") return [] @staticmethod def send_status_update(campaign_id, creator_id, status): """ 通过WebSocket发送状态更新 :param campaign_id: 活动ID :param creator_id: 达人ID :param status: 状态 """ try: # 先更新数据库中的状态 updated = OfferStatusService.update_creator_status(campaign_id, creator_id, status) # 如果状态没有变化,则不发送更新 if not updated: return # 获取最新的所有达人数据 creator_list = OfferStatusService.get_campaign_creator_data(campaign_id) channel_layer = get_channel_layer() # 构建消息数据 - 使用标准的API响应格式 message = { 'code': 200, 'message': '状态已更新', 'data': creator_list } # 发送到活动特定的群组 async_to_sync(channel_layer.group_send)( f'campaign_{campaign_id}', { 'type': 'send_update', 'message': json.dumps(message) } ) logger.info(f"已发送状态更新: 活动 {campaign_id}, 达人 {creator_id}, 状态 {status}") except Exception as e: logger.error(f"发送WebSocket更新失败: {str(e)}")