163 lines
5.8 KiB
Python
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)}") |