You've already forked opc-backend
62 lines
2.6 KiB
Python
62 lines
2.6 KiB
Python
|
|
from rest_framework import viewsets, permissions, status
|
|||
|
|
from rest_framework.response import Response
|
|||
|
|
from rest_framework.decorators import action
|
|||
|
|
from .models import ReservationResource, ReservationOrder, OrderStatus
|
|||
|
|
from .serializers import ReservationResourceSerializer, ReservationOrderSerializer
|
|||
|
|
import uuid
|
|||
|
|
import datetime
|
|||
|
|
|
|||
|
|
class ReservationResourceViewSet(viewsets.ModelViewSet):
|
|||
|
|
"""
|
|||
|
|
@author: xujl
|
|||
|
|
Api说明: 预约资源(工位、会议室等物理资源)接口视图。用于资源空间的增删改查及上下架管理,控制开放时段。
|
|||
|
|
"""
|
|||
|
|
queryset = ReservationResource.objects.filter(is_active=True)
|
|||
|
|
serializer_class = ReservationResourceSerializer
|
|||
|
|
|
|||
|
|
def get_permissions(self):
|
|||
|
|
if self.action in ['create', 'update', 'partial_update', 'destroy']:
|
|||
|
|
return [permissions.IsAdminUser()]
|
|||
|
|
return [permissions.AllowAny()]
|
|||
|
|
|
|||
|
|
class ReservationOrderViewSet(viewsets.ModelViewSet):
|
|||
|
|
"""
|
|||
|
|
@author: xujl
|
|||
|
|
Api说明: 预约订单接口视图。用于用户发起资源预约、取消预约,以及后台管理员对订单进行状态流转和支付确认管理。
|
|||
|
|
"""
|
|||
|
|
queryset = ReservationOrder.objects.filter(is_deleted=False)
|
|||
|
|
serializer_class = ReservationOrderSerializer
|
|||
|
|
permission_classes = [permissions.IsAuthenticated]
|
|||
|
|
|
|||
|
|
def get_queryset(self):
|
|||
|
|
return ReservationOrder.objects.filter(user=self.request.user, is_deleted=False)
|
|||
|
|
|
|||
|
|
def perform_create(self, serializer):
|
|||
|
|
resource = serializer.validated_data['resource']
|
|||
|
|
quantity = serializer.validated_data.get('quantity', 1)
|
|||
|
|
total_amount = resource.price_per_unit * quantity
|
|||
|
|
|
|||
|
|
# 简单生成订单号
|
|||
|
|
order_no = f"RES{datetime.datetime.now().strftime('%Y%m%d%H%M%S')}{str(uuid.uuid4())[:4].upper()}"
|
|||
|
|
|
|||
|
|
serializer.save(
|
|||
|
|
user=self.request.user,
|
|||
|
|
order_no=order_no,
|
|||
|
|
unit_price=resource.price_per_unit,
|
|||
|
|
total_amount=total_amount,
|
|||
|
|
status=OrderStatus.PENDING_PAY
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
@action(detail=True, methods=['post'])
|
|||
|
|
def pay(self, request, pk=None):
|
|||
|
|
order = self.get_object()
|
|||
|
|
if order.status != OrderStatus.PENDING_PAY:
|
|||
|
|
return Response({'detail': '订单状态不允许支付'}, status=status.HTTP_400_BAD_REQUEST)
|
|||
|
|
|
|||
|
|
order.status = OrderStatus.PAID
|
|||
|
|
order.paid_at = datetime.datetime.now()
|
|||
|
|
order.qr_code_url = f"https://api.opc-platform.com/qr/{order.order_no}"
|
|||
|
|
order.save()
|
|||
|
|
|
|||
|
|
return Response({'status': '支付成功', 'qr_code_url': order.qr_code_url})
|