daren/apps/brands/services/offer_status_service.py
2025-05-20 12:17:45 +08:00

163 lines
5.8 KiB
Python

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://127.0.0.1:8000/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)}")