from rest_framework.decorators import action from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin from apps.wpmw.models import Wpr, WprDefect from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer from rest_framework.response import Response from apps.mtm.models import Material class WprViewSet(CustomListModelMixin, RetrieveModelMixin, CustomGenericViewSet): """动态产品 动态产品 """ perms_map = {"get": "*"} select_related_fields = ["wm", "mb", "material"] prefetch_related_fields = ["defects"] queryset = Wpr.objects.all() serializer_class = WprSerializer retrieve_serializer_class = WprDetailSerializer filterset_fields = { "mb": ["exact", "isnull"], "wm": ["exact", "isnull"], "material__process": ["exact"], "state": ["exact"], "defects": ["exact"], "number": ["exact"] } ordering = ["number", "create_time"] ordering_fields = ["number", "create_time", "update_time"] search_fields = ["number", "material__name", "material__model", "material__specification"] def filter_queryset(self, queryset): qs = super().filter_queryset(queryset) if "mb__isnull" in self.request.query_params or "wm__isnull" in self.request.query_params: pass else: qs.exclude(mb=None, wm=None) return qs @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WprNewSerializer) def new_number(self, request, *args, **kwargs): """获取新的编号""" data = request.data year = data.get("year") month = data.get("month") material_start = data.get("material_start") wps_qs = Wpr.objects.filter(material_start=material_start, create_time__year=year, create_time__month=month).order_by("create_time") wpr_last = wps_qs.order_by("number").last() count = wps_qs.count() last_number = wpr_last.number if count > 0 else None last_number_count = int(last_number.split("-")[-1].lstrip('0')) mat = Material.objects.get(id=material_start) return Response({"count": count, "last_number": last_number, "material_model":mat.model, "last_number_count": last_number_count})