diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index 4c4fd0a..b6ddf64 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -8,7 +8,8 @@ from apps.mtm.serializers import MaterialSimpleSerializer, StepSimpleSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress from django.utils import timezone from django.utils.translation import gettext_lazy as _ -from apps.wpm.models import WMaterial, WProduct, OperationRecord, OperationRecordItem +from apps.system.serializers import UserSimpleSerializer +from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, OperationRecordItem class PickDetailSerializer(serializers.Serializer): material = serializers.PrimaryKeyRelatedField(queryset=Material.objects.all(), label="物料ID") @@ -90,6 +91,27 @@ class WProductListSerializer(serializers.ModelSerializer): model = WProduct fields = '__all__' +class OperationDetailSerializer(serializers.ModelSerializer): + wproducts_ = serializers.SerializerMethodField() + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + m_state_ = MaterialSimpleSerializer(source='m_state', read_only=True) + p_state_ = StepSimpleSerializer(source='p_state', read_only=True) + class Meta: + model = Operation + fields = '__all__' + + def get_wproducts_(self, obj): + return list(WProduct.objects.filter(id__in=obj.wproducts_).values('id', 'number')) + +class OperationListSerializer(serializers.ModelSerializer): + create_by_ = UserSimpleSerializer(source='create_by', read_only=True) + m_state_ = MaterialSimpleSerializer(source='m_state', read_only=True) + p_state_ = StepSimpleSerializer(source='p_state', read_only=True) + class Meta: + model = Operation + fields = '__all__' + + class OperationInitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID") @@ -105,10 +127,14 @@ class OperationInitSerializer(serializers.Serializer): raise serializers.ValidationError('请选择正确的子工序操作') if 'wproducts' in data and data['wproducts']: + if step.type == Step.STEP_TYPE_DIV: + raise serializers.ValidationError(_('不可进行此操作')) for i in data['wproducts']: + if i.is_executed: + raise serializers.ValidationError('不可进行操作') if i.subproduction_plan != subproduction_plan: raise serializers.ValidationError('半成品所属子计划不一致') - if i.step != step: + if i.p_state != step: raise serializers.ValidationError('半成品所属子工序不一致') else: if step.type != Step.STEP_TYPE_DIV: diff --git a/hb_server/apps/wpm/urls.py b/hb_server/apps/wpm/urls.py index 89057f7..7c43ac7 100644 --- a/hb_server/apps/wpm/urls.py +++ b/hb_server/apps/wpm/urls.py @@ -3,11 +3,12 @@ from rest_framework import urlpatterns from django.urls import path, include from rest_framework.routers import DefaultRouter -from apps.wpm.views import DoFormInit, DoFormSubmit, WMaterialViewSet, WPlanViewSet, WProductViewSet +from apps.wpm.views import DoFormInit, DoFormSubmit, OperationViewSet, WMaterialViewSet, WPlanViewSet, WProductViewSet router = DefaultRouter() router.register('wmaterial', WMaterialViewSet, basename='wmaterial') router.register('wproduct', WProductViewSet, basename='wproduct') +router.register('operation', OperationViewSet, basename='operation') router.register('subplan', WPlanViewSet, basename='wplan') urlpatterns = [ path('do/init/', DoFormInit.as_view()), diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 4876301..9cf608d 100644 --- a/hb_server/apps/wpm/views.py +++ b/hb_server/apps/wpm/views.py @@ -1,6 +1,6 @@ from django.shortcuts import render from rest_framework.generics import CreateAPIView, GenericAPIView -from rest_framework.mixins import ListModelMixin +from rest_framework.mixins import ListModelMixin, RetrieveModelMixin from rest_framework.utils import serializer_helpers from rest_framework.utils.field_mapping import get_relation_kwargs from rest_framework.views import APIView @@ -14,7 +14,7 @@ from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wpm.models import WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer +from apps.wpm.serializers import OperationDetailSerializer, OperationListSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer from rest_framework.response import Response # Create your views here. class WPlanViewSet(ListModelMixin, GenericViewSet): @@ -55,13 +55,33 @@ class WProductViewSet(ListModelMixin, GenericViewSet): 半成品 """ perms_map={'*':'*'} - queryset = WProduct.objects.select_related('p_state', 'm_state').all() + queryset = WProduct.objects.select_related('p_state', 'm_state').filter(is_hidden=True) serializer_class = WProductListSerializer filterset_fields = ['p_state', 'subproduction_plan', 'm_state', 'production_plan', 'p_state__process'] search_fields = ['number'] ordering_fields = ['id'] ordering = ['id'] + @action(methods=['post'], detail=False, perms_map={'post':'*'}, serializer_class=PickSerializer) + def test(): + pass + +class OperationViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): + """ + 生产操作记录 + """ + perms_map={'*':'*'} + queryset = Operation.objects.select_related('p_state', 'm_state').all() + serializer_class = OperationListSerializer + filterset_fields = ['p_state', 'm_state'] + ordering_fields = ['id'] + ordering = ['-id'] + + def get_serializer_class(self): + if self.action == 'retrieve': + return OperationDetailSerializer + return super().get_serializer_class() + class DoFormInit(CreateAPIView, GenericAPIView): perms_map={'*':'*'} serializer_class=OperationInitSerializer