提高创建对话的稳定性

This commit is contained in:
Xiaofeng 2025-05-20 17:38:57 +08:00
parent 1505bce19f
commit 8efbbdf7f1

View File

@ -169,45 +169,46 @@ class NegotiationViewSet(viewsets.ModelViewSet):
serializer_class = NegotiationSerializer
def create(self, request, *args, **kwargs):
"""创建谈判并返回包含初始消息的响应"""
"""创建谈判(事务保护版)"""
try:
# 开启事务:所有数据库操作要么全部成功,要么全部回滚
with transaction.atomic():
# 1. 验证请求数据
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.is_valid(raise_exception=True) # 自动返回400错误
# Extract creator and product from validated data
creator = serializer.validated_data['creator']
product = serializer.validated_data['product']
# 检查该用户是否存在
# 2. 检查达人是否存在
if not CreatorProfile.objects.filter(id=creator.id).exists():
return Response({
"code": 404,
"message": "未找到指定的达人",
"data": None
})
return Response(
{"code": 404, "message": "未找到指定的达人", "data": None},
status=status.HTTP_404_NOT_FOUND
)
# Check if the product exists
# 3. 检查商品是否存在
if not Product.objects.filter(id=product.id).exists():
return Response({
"code": 404,
"message": "未找到指定的商品",
"data": None
})
return Response(
{"code": 404, "message": "未找到指定的商品", "data": None},
status=status.HTTP_404_NOT_FOUND
)
# Check if a negotiation already exists for the same creator and product
existing_negotiation = Negotiation.objects.filter(creator=creator, product=product).first()
if existing_negotiation:
return Response({
# 4. 检查是否已存在相同谈判
if Negotiation.objects.filter(creator=creator, product=product).exists():
return Response(
{
"code": 400,
"message": "谈判已存在",
"data": {
"negotiation_id": existing_negotiation.id
}
})
"data": {}
},
status=status.HTTP_400_BAD_REQUEST
)
# 1. 创建谈判记录
# 5. 创建谈判记录
negotiation = serializer.save()
# 2. 生成并保存初始消息
# 6. 生成初始消息
initial_message = self._generate_welcome_message(negotiation)
message = Message.objects.create(
negotiation=negotiation,
@ -216,8 +217,9 @@ class NegotiationViewSet(viewsets.ModelViewSet):
stage=negotiation.status
)
# 4. 构建响应数据
response_data = {
# 7. 返回成功响应
return Response(
{
"code": 200,
"message": "谈判已创建",
"data": {
@ -226,10 +228,18 @@ class NegotiationViewSet(viewsets.ModelViewSet):
"content": initial_message,
"created_at": message.created_at
}
}
},
status=status.HTTP_201_CREATED,
headers=self.get_success_headers(serializer.data)
)
headers = self.get_success_headers(serializer.data)
return Response(response_data, status=status.HTTP_201_CREATED, headers=headers)
except Exception as e:
# 记录异常细节(实际生产环境应接入监控系统)
# logger.error(f"谈判创建失败: {str(e)}", exc_info=True)
return Response(
{"code": 500, "message": "服务器内部错误", "data": None},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)
@action(detail=True, methods=['post'])
def chat(self, request, pk=None):