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})