from decimal import Decimal, InvalidOperation from rest_framework import status, views from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from basic_info import models as basic_models from business import services as business_services from .stock_change_views.mixins import StockChangeViewMixin class PurchaseOrderView(StockChangeViewMixin, views.APIView): """创建采购订单并触发入库任务""" permission_classes = [IsAuthenticated] def post(self, request): if not self.check_employee_permission(request): return self.permission_error_response('无权限访问') merchant = request.user.employee.merchant data = request.data or {} supplier_id = data.get('supplier') warehouse_id = data.get('warehouse') order_date = data.get('order_date') total_amount = data.get('total_amount') items = data.get('items', []) remarks = data.get('remarks', '') if not supplier_id: return Response({'error': '缺少供应商 ID'}, status=status.HTTP_400_BAD_REQUEST) if not warehouse_id: return Response({'error': '缺少仓库 ID'}, status=status.HTTP_400_BAD_REQUEST) try: supplier = basic_models.Supplier.objects.get(id=supplier_id, merchant=merchant) except basic_models.Supplier.DoesNotExist: return Response({'error': f'供应商 {supplier_id} 不存在'}, status=status.HTTP_400_BAD_REQUEST) try: basic_models.WareHouse.objects.get(id=warehouse_id, merchant=merchant) except basic_models.WareHouse.DoesNotExist: return Response({'error': f'仓库 {warehouse_id} 不存在'}, status=status.HTTP_400_BAD_REQUEST) try: total_amount_decimal = Decimal(str(total_amount)) except (InvalidOperation, TypeError): return Response({'error': 'total_amount 必须为合法数值'}, status=status.HTTP_400_BAD_REQUEST) try: purchase_order = business_services.create_purchase_order( merchant=merchant, supplier=supplier, order_date=order_date, total_amount=total_amount_decimal, warehouse_id=warehouse_id, items=items, remarks=remarks, created_by=request.user, ) except ValueError as exc: return Response({'error': str(exc)}, status=status.HTTP_400_BAD_REQUEST) return Response( { 'id': purchase_order.id, 'message': '采购单创建成功,入库任务已排队', }, status=status.HTTP_201_CREATED, )