From f939b827a88d287826b619fbb3ba6c50fefa224f Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 18 Nov 2021 15:07:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8D=8A=E6=88=90=E5=93=81=E8=A1=A8=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E9=A2=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hb_server/apps/wpm/models.py | 4 ++-- hb_server/apps/wpm/serializers.py | 32 +++++++++++++++++++++++++ hb_server/apps/wpm/views.py | 40 +++++++++++++++++++++---------- 3 files changed, 62 insertions(+), 14 deletions(-) diff --git a/hb_server/apps/wpm/models.py b/hb_server/apps/wpm/models.py index 8ec6790..2f0007e 100644 --- a/hb_server/apps/wpm/models.py +++ b/hb_server/apps/wpm/models.py @@ -4,7 +4,7 @@ import django.utils.timezone as timezone from django.db.models.query import QuerySet from apps.inm.models import WareHouse from apps.pm.models import ProductionPlan, SubProductionPlan -from apps.system.models import CommonAModel, CommonBModel, Organization, User, Dict, File +from apps.system.models import CommonADModel, CommonAModel, CommonBModel, Organization, User, Dict, File from utils.model import SoftModel, BaseModel from simple_history.models import HistoricalRecords from apps.mtm.models import Material, Process, RecordFormField, Step, RecordForm @@ -45,7 +45,7 @@ class WProduct(CommonAModel): production_plan = models.ForeignKey(ProductionPlan, verbose_name='关联主生产计划', on_delete=models.CASCADE) warehouse = models.ForeignKey(WareHouse, verbose_name='所在仓库', on_delete=models.SET_NULL, null=True, blank=True) -class Operation(CommonAModel): +class Operation(CommonADModel): """ 生产操作 """ diff --git a/hb_server/apps/wpm/serializers.py b/hb_server/apps/wpm/serializers.py index fc6be42..aad7ef7 100644 --- a/hb_server/apps/wpm/serializers.py +++ b/hb_server/apps/wpm/serializers.py @@ -14,6 +14,7 @@ from apps.wpm.models import Operation, WMaterial, WProduct, OperationRecord, Ope from django.db import transaction class PickHalfSerializer(serializers.Serializer): + id = serializers.PrimaryKeyRelatedField(queryset=SubProductionProgress.objects.all(), label='子计划进度ID') wproducts = serializers.ListField(child=serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all(), label='半成品ID'), required=False) # 从半成品表里直接修改状态 class PickDetailSerializer(serializers.Serializer): @@ -148,6 +149,37 @@ class OperationListSerializer(serializers.ModelSerializer): model = Operation fields = '__all__' +class OperationCreateSerializer(serializers.Serializer): + """ + 操作创建 + """ + step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") + # subproduction_plan = serializers.PrimaryKeyRelatedField(queryset=SubProductionPlan.objects.all(), label="子计划ID", required=False) + wproducts = serializers.ListField(child= + serializers.PrimaryKeyRelatedField(queryset=WProduct.objects.all()), label="半成品ID列表", required=False) + + def validate(self, data): + # subproduction_plan = data['subproduction_plan'] + step = data['step'] + + # stepIds=[i['id'] for i in subproduction_plan.steps] + # if step.id not in stepIds: + # raise exceptions.ValidationError('请选择正确的子工序操作') + + if 'wproducts' in data and data['wproducts']: + if step.type == Step.STEP_TYPE_DIV: + raise exceptions.ValidationError(_('不可进行此操作')) + for i in data['wproducts']: + if i.is_executed: + raise exceptions.ValidationError('不可进行操作') + # if i.subproduction_plan != subproduction_plan: + # raise exceptions.ValidationError('半成品所属子计划不一致') + if i.step != step: + raise exceptions.ValidationError('半成品所属子工序不一致') + else: + if step.type != Step.STEP_TYPE_DIV: + raise exceptions.ValidationError(_('请选择半成品进行操作')) + return data class OperationInitSerializer(serializers.Serializer): step = serializers.PrimaryKeyRelatedField(queryset=Step.objects.all(), label="子工序ID") diff --git a/hb_server/apps/wpm/views.py b/hb_server/apps/wpm/views.py index 1b63890..cab6c45 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, RetrieveModelMixin +from rest_framework.mixins import CreateModelMixin, 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 @@ -10,14 +10,14 @@ from apps.inm.signals import update_inm from apps.mtm.models import Material, RecordForm, Step, SubprodctionMaterial, TechDoc from apps.mtm.serializers import RecordFormDetailSerializer, SubprodctionMaterialListSerializer, TechDocListSerializer from apps.pm.models import SubProductionPlan, SubProductionProgress -from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer +from apps.pm.serializers import SubProductionPlanListSerializer, SubProductionPlanUpdateSerializer, SubProductionProgressSerializer from apps.qm.models import TestRecordItem from apps.system.mixins import CreateUpdateModelAMixin, OptimizationMixin from rest_framework.decorators import action from apps.wpm.models import OperationWproduct, WMaterial, WProduct, Operation, OperationMaterial, OperationRecord, OperationRecordItem -from apps.wpm.serializers import OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer +from apps.wpm.serializers import OperationCreateSerializer, OperationDetailSerializer, OperationListSerializer, PickHalfSerializer, PickSerializer, OperationInitSerializer, OperationSubmitSerializer, WMaterialListSerializer, WProductListSerializer, WplanPutInSerializer, WpmTestRecordCreateSerializer, WproductPutInSerializer from rest_framework.response import Response from django.db import transaction from rest_framework import exceptions, serializers @@ -49,19 +49,25 @@ class WPlanViewSet(ListModelMixin, GenericViewSet): """ 领半成品 """ - mIds = SubProductionProgress.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN, - material__type=Material.MA_TYPE_HALFGOOD).values_list('material', flat=True) - queyset = WProduct.objects.filter(is_hidden=False, material__in=mIds, act_state=WProduct.WPR_ACT_STATE_OK) - return Response(WProductListSerializer(instance=queyset, many=True).data) + spps = SubProductionProgress.objects.filter(type=SubprodctionMaterial.SUB_MA_TYPE_IN, + material__type=Material.MA_TYPE_HALFGOOD, subproduction_plan=sp).select_related('material') + return Response(SubProductionProgressSerializer(instance=spps, many=True).data) elif request.method=='POST': serializer= PickHalfSerializer(data=request.data) serializer.is_valid(raise_exception=True) vdata = serializer.data - wps = WProduct.objects.filter(pk__in=[x for x in vdata['wproducts']]) first_step = Step.objects.get(pk=sp.steps[0].id) - wps.update(step=first_step, is_executed=False, - act_state=WProduct.WPR_ACT_STATE_DOING, is_hidden=False, warehouse=None, - subproduction_plan=sp, production_plan=sp.production_plan) + for i in vdata: + if 'wproducts' in i and len(i['wproducts'])>0: + spp = SubProductionProgress.objects.get(pk=i['id']) + spp.count_pick = spp.count_pick + len(i['wproducts']) + if spp.count_pick > spp.count: + raise exceptions.APIException('超过计划数') + spp.save() + wps = WProduct.objects.filter(pk__in=[x for x in i['wproducts']]) + wps.update(step=first_step, is_executed=False, + act_state=WProduct.WPR_ACT_STATE_DOING, is_hidden=False, warehouse=None, + subproduction_plan=sp, production_plan=sp.production_plan) return Response() @@ -253,7 +259,7 @@ class WProductViewSet(ListModelMixin, GenericViewSet): wproduct.save() return Response() -class OperationViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): +class OperationViewSet(ListModelMixin, RetrieveModelMixin, CreateModelMixin, GenericViewSet): """ 生产操作记录 """ @@ -267,8 +273,18 @@ class OperationViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet): def get_serializer_class(self): if self.action == 'retrieve': return OperationDetailSerializer + elif self.action == 'create': + return OperationCreateSerializer return super().get_serializer_class() + @transaction.atomic + def create(self, request, *args, **kwargs): + data = request.data + serializer = OperationCreateSerializer(data=data, context={'request':self.request}) + serializer.is_valid(raise_exception=True) + vdata = serializer.validated_data #校验之后的数据 + return Response() + class DoFormInit(CreateAPIView, GenericAPIView): perms_map={'*':'*'} serializer_class=OperationInitSerializer