diff --git a/hb_server/apps/wpm/filters.py b/hb_server/apps/wpm/filters.py new file mode 100644 index 0000000..f14d741 --- /dev/null +++ b/hb_server/apps/wpm/filters.py @@ -0,0 +1,17 @@ +from django_filters import rest_framework as filters +from .models import Operation, WMaterial, WProduct + +class WMaterialFilterSet(filters.FilterSet): + + operation = filters.NumberFilter(method='filter_operation') + class Meta: + model = WMaterial + fields = ['material', 'subproduction_plan', 'subproduction_plan__process', 'subproduction_plan__workshop'] + + def filter_operation(self, queryset, name, value): + operation = Operation.objects.get(pk=value) + wproducts = WProduct.objects.filter(ow_wproduct__operation=value) + if wproducts.exists(): + pass + else: + pass \ No newline at end of file diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index e0d7b62..f2d3f5f 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -62,7 +62,7 @@ class OperationWproduct(BaseModel): 生产操作半成品关联表 """ operation = models.ForeignKey(Operation, verbose_name='关联操作', on_delete=models.CASCADE, related_name='ow_operation') - wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE) + wproduct = models.ForeignKey(WProduct, verbose_name='关联半成品', on_delete=models.CASCADE, related_name='ow_wproduct') number = models.CharField('物品编号', null=True, blank=True, max_length=50) material = models.ForeignKey(Material, verbose_name='操作时的物料状态', on_delete=models.CASCADE) subproduction_plan = models.ForeignKey(SubProductionPlan, verbose_name='当前子生产计划', on_delete=models.CASCADE) diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 02c6702..bc1b8b7 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -15,6 +15,7 @@ from apps.qm.models import TestRecordItem from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action +from apps.wpm.filters import WMaterialFilterSet from apps.wpm.models import OperationEquip, OperationWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem from apps.wpm.serializers import OperationEquipListSerializer, OperationEquipUpdateSerializer, OperationMaterialCreate1Serailizer, OperationMaterialCreate2Serailizer, OperationMaterialCreate3Serializer, OperationMaterialListSerializer, OperationRecordListSerializer, OperationRecordSubmitSerializer, OperationUpdateSerializer, OperationWproductListSerializer, OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer @@ -25,6 +26,7 @@ from rest_framework import exceptions, serializers from apps.wpm.services import WpmServies from django.utils import timezone from utils.tools import ranstr +from rest_framework import status # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): """ @@ -137,7 +139,7 @@ class WMaterialViewSet(CreateUpdateModelAMixin, ListModelMixin, GenericViewSet): perms_map={'*':'*'} queryset = WMaterial.objects.select_related('material').all() serializer_class = WMaterialListSerializer - filterset_fields = ['material', 'subproduction_plan', 'subproduction_plan__process', 'subproduction_plan__workshop'] + filterset_class = WMaterialFilterSet ordering_fields = ['material__number'] ordering = ['material__number'] @@ -282,6 +284,12 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, Upd return OperationUpdateSerializer return super().get_serializer_class() + def destroy(self, request, *args, **kwargs): + instance = self.get_object() + if instance.is_submited: + raise exceptions.APIException('该操作已提交') + self.perform_destroy(instance) + return Response(status=status.HTTP_204_NO_CONTENT) @transaction.atomic def create(self, request, *args, **kwargs): data = request.data