提高创建对话的稳定性
This commit is contained in:
parent
1505bce19f
commit
8efbbdf7f1
@ -169,45 +169,46 @@ class NegotiationViewSet(viewsets.ModelViewSet):
|
|||||||
serializer_class = NegotiationSerializer
|
serializer_class = NegotiationSerializer
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
def create(self, request, *args, **kwargs):
|
||||||
"""创建谈判并返回包含初始消息的响应"""
|
"""创建谈判(事务保护版)"""
|
||||||
|
try:
|
||||||
|
# 开启事务:所有数据库操作要么全部成功,要么全部回滚
|
||||||
|
with transaction.atomic():
|
||||||
|
# 1. 验证请求数据
|
||||||
serializer = self.get_serializer(data=request.data)
|
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']
|
creator = serializer.validated_data['creator']
|
||||||
product = serializer.validated_data['product']
|
product = serializer.validated_data['product']
|
||||||
|
|
||||||
# 检查该用户是否存在
|
# 2. 检查达人是否存在
|
||||||
if not CreatorProfile.objects.filter(id=creator.id).exists():
|
if not CreatorProfile.objects.filter(id=creator.id).exists():
|
||||||
return Response({
|
return Response(
|
||||||
"code": 404,
|
{"code": 404, "message": "未找到指定的达人", "data": None},
|
||||||
"message": "未找到指定的达人",
|
status=status.HTTP_404_NOT_FOUND
|
||||||
"data": None
|
)
|
||||||
})
|
|
||||||
|
|
||||||
# Check if the product exists
|
# 3. 检查商品是否存在
|
||||||
if not Product.objects.filter(id=product.id).exists():
|
if not Product.objects.filter(id=product.id).exists():
|
||||||
return Response({
|
return Response(
|
||||||
"code": 404,
|
{"code": 404, "message": "未找到指定的商品", "data": None},
|
||||||
"message": "未找到指定的商品",
|
status=status.HTTP_404_NOT_FOUND
|
||||||
"data": None
|
)
|
||||||
})
|
|
||||||
|
|
||||||
# Check if a negotiation already exists for the same creator and product
|
# 4. 检查是否已存在相同谈判
|
||||||
existing_negotiation = Negotiation.objects.filter(creator=creator, product=product).first()
|
if Negotiation.objects.filter(creator=creator, product=product).exists():
|
||||||
if existing_negotiation:
|
return Response(
|
||||||
return Response({
|
{
|
||||||
"code": 400,
|
"code": 400,
|
||||||
"message": "谈判已存在",
|
"message": "谈判已存在",
|
||||||
"data": {
|
"data": {}
|
||||||
"negotiation_id": existing_negotiation.id
|
},
|
||||||
}
|
status=status.HTTP_400_BAD_REQUEST
|
||||||
})
|
)
|
||||||
|
|
||||||
# 1. 创建谈判记录
|
# 5. 创建谈判记录
|
||||||
negotiation = serializer.save()
|
negotiation = serializer.save()
|
||||||
|
|
||||||
# 2. 生成并保存初始消息
|
# 6. 生成初始消息
|
||||||
initial_message = self._generate_welcome_message(negotiation)
|
initial_message = self._generate_welcome_message(negotiation)
|
||||||
message = Message.objects.create(
|
message = Message.objects.create(
|
||||||
negotiation=negotiation,
|
negotiation=negotiation,
|
||||||
@ -216,8 +217,9 @@ class NegotiationViewSet(viewsets.ModelViewSet):
|
|||||||
stage=negotiation.status
|
stage=negotiation.status
|
||||||
)
|
)
|
||||||
|
|
||||||
# 4. 构建响应数据
|
# 7. 返回成功响应
|
||||||
response_data = {
|
return Response(
|
||||||
|
{
|
||||||
"code": 200,
|
"code": 200,
|
||||||
"message": "谈判已创建",
|
"message": "谈判已创建",
|
||||||
"data": {
|
"data": {
|
||||||
@ -226,10 +228,18 @@ class NegotiationViewSet(viewsets.ModelViewSet):
|
|||||||
"content": initial_message,
|
"content": initial_message,
|
||||||
"created_at": message.created_at
|
"created_at": message.created_at
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
status=status.HTTP_201_CREATED,
|
||||||
|
headers=self.get_success_headers(serializer.data)
|
||||||
|
)
|
||||||
|
|
||||||
headers = self.get_success_headers(serializer.data)
|
except Exception as e:
|
||||||
return Response(response_data, status=status.HTTP_201_CREATED, headers=headers)
|
# 记录异常细节(实际生产环境应接入监控系统)
|
||||||
|
# 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'])
|
@action(detail=True, methods=['post'])
|
||||||
def chat(self, request, pk=None):
|
def chat(self, request, pk=None):
|
||||||
|
Loading…
Reference in New Issue
Block a user