from rest_framework import serializers, status from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework.views import APIView from basic_info import models as basic_models class CustomerEmployeeBindingSerializer(serializers.Serializer): """客户员工绑定序列化器""" customer_name = serializers.CharField(max_length=100, help_text='客户名称') employee_name = serializers.CharField(max_length=100, help_text='员工姓名') class CustomerEmployeeBindingView(APIView): """ 客户员工可见性绑定 API 将指定员工添加到指定客户的可见员工列表中。 POST /api/v2/customers/bind-employee/ """ permission_classes = [IsAuthenticated] def post(self, request): serializer = CustomerEmployeeBindingSerializer(data=request.data) serializer.is_valid(raise_exception=True) employee_name = serializer.validated_data['employee_name'] customer_name = serializer.validated_data['customer_name'] # 查询员工 employees = basic_models.Employee.objects.filter(name=employee_name) if employees.count() == 0: return Response( {'error': f'未找到名为 "{employee_name}" 的员工'}, status=status.HTTP_400_BAD_REQUEST ) if employees.count() > 1: return Response( {'error': f'找到多个名为 "{employee_name}" 的员工({employees.count()} 个),请使用更精确的标识'}, status=status.HTTP_403_FORBIDDEN ) # 查询客户 customers = basic_models.Customer.objects.filter(name=customer_name) if customers.count() == 0: return Response( {'error': f'未找到名为 "{customer_name}" 的客户'}, status=status.HTTP_400_BAD_REQUEST ) if customers.count() > 1: return Response( {'error': f'找到多个名为 "{customer_name}" 的客户({customers.count()} 个),请使用更精确的标识'}, status=status.HTTP_403_FORBIDDEN ) # 建立绑定关系 employee = employees.first() customer = customers.first() # 检查是否已经绑定 if customer.visible_employees.filter(id=employee.id).exists(): return Response( { 'message': f'员工 "{employee_name}" 已在客户 "{customer_name}" 的可见列表中', 'customer_id': customer.id, 'employee_id': employee.id, }, status=status.HTTP_200_OK ) # 添加绑定 customer.visible_employees.add(employee) return Response( { 'message': f'成功将员工 "{employee_name}" 添加到客户 "{customer_name}" 的可见列表', 'customer_id': customer.id, 'customer_name': customer.name, 'employee_id': employee.id, 'employee_name': employee.name, }, status=status.HTTP_201_CREATED )