93 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
| from rest_framework.decorators import action
 | |
| from apps.utils.viewsets import CustomModelViewSet, CustomGenericViewSet
 | |
| from apps.utils.mixins import CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin
 | |
| 
 | |
| from apps.wpmw.models import Wpr, WprDefect
 | |
| from apps.wpmw.serializers import WprSerializer, WprNewSerializer, WprDetailSerializer, WproutListSerializer
 | |
| from rest_framework.response import Response
 | |
| from apps.mtm.models import Material
 | |
| from rest_framework.exceptions import ParseError
 | |
| from django.db import transaction
 | |
| 
 | |
| 
 | |
| class WprViewSet(CustomListModelMixin, RetrieveModelMixin, ComplexQueryMixin, 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", "number_out"]
 | |
| 
 | |
|     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})
 | |
|     
 | |
|     @action(methods=['get'], detail=False, perms_map={'get': '*'})
 | |
|     def number_out_last(self, request, *args, **kwargs):
 | |
|         """获取最新的出库对外编号
 | |
|         
 | |
|         获取最新的出库对外编号(get请求传入prefix参数)"""
 | |
|         prefix = request.query_params.get("prefix")
 | |
|         wpr_qs_last = Wpr.objects.filter(number_out__startswith=prefix).order_by("number_out").last()
 | |
|         if wpr_qs_last:
 | |
|             number_out = wpr_qs_last.number_out
 | |
|             number_int = number_out.lstrip(prefix).lstrip('0')
 | |
|             return Response({"number_out_last": wpr_qs_last.number_out, "number_out_int_last": number_int})
 | |
|         else:
 | |
|             return Response({"number_out_last": None})
 | |
|     
 | |
|     @action(methods=['post'], detail=False, perms_map={'post': '*'}, serializer_class=WproutListSerializer)
 | |
|     @transaction.atomic
 | |
|     def assgin_number_out(self, request, *args, **kwargs):
 | |
|         """分配出库对外编号
 | |
| 
 | |
|         分配出库对外编号"""
 | |
|         sr = WproutSerializer(data=request.data)
 | |
|         sr.is_valid(raise_exception=True)
 | |
|         vdata = sr.validated_data
 | |
|         number_outs = [i["number_out"] for i in vdata]
 | |
|         existing_numbers = Wpr.objects.filter(number_out__in=number_outs).values_list('number_out', flat=True)
 | |
|         if existing_numbers.exists():
 | |
|             used_numbers = list(existing_numbers)
 | |
|             raise ParseError(f"以下对外编号已被使用: {used_numbers[0]} 共{len(used_numbers)}个")
 | |
|         for i in vdata:
 | |
|             wpr = Wpr.objects.get(id=i["id"])
 | |
|             if wpr.number_out:
 | |
|                 raise ParseError(f"编号为{wpr.number}的产品已经分配了对外编号")
 | |
|             wpr.number_out = i["number_out"]
 | |
|             wpr.save()
 | |
|         return Response() |