diff --git a/apps/inm/serializers.py b/apps/inm/serializers.py index f0468e08..b4522a4f 100644 --- a/apps/inm/serializers.py +++ b/apps/inm/serializers.py @@ -12,7 +12,6 @@ from .models import MIO, MaterialBatch, MIOItem, WareHouse, MIOItemA, MaterialBa from django.db import transaction from server.settings import get_sysconfig from apps.wpmw.models import Wpr -from apps.qm.serializers import FtestProcessSerializer class WareHourseSerializer(CustomModelSerializer): @@ -100,14 +99,6 @@ class MIOItemwSerializer(CustomModelSerializer): fields = "__all__" read_only_fields = EXCLUDE_FIELDS_BASE + ["mioitem"] -class MIOItemwTestSerializer(CustomModelSerializer): - ftest = FtestProcessSerializer(required=False) - class Meta: - model = MIOItemw - fields = ["id", "ftest"] - extra_kwargs = { - 'ftest': {'required': True}, - } class MIOItemCreateSerializer(CustomModelSerializer): assemb = MIOItemACreateSerializer( diff --git a/apps/inm/serializers2.py b/apps/inm/serializers2.py new file mode 100644 index 00000000..db19a976 --- /dev/null +++ b/apps/inm/serializers2.py @@ -0,0 +1,61 @@ +from apps.utils.serializers import CustomModelSerializer +from apps.qm.serializers import FtestProcessSerializer +from apps.inm.models import MIOItemw, MIOItem, MIO +from django.db import transaction +from rest_framework.exceptions import ParseError +from apps.wpmw.models import Wpr +from apps.mtm.models import Material + +class MIOItemwCreateUpdateSerializer(CustomModelSerializer): + ftest = FtestProcessSerializer(required=False) + + class Meta: + model = MIOItemw + fields = ["id", "number", "wpr", "note", "mioitem", "ftest"] + + def validate(self, attrs): + mioitem: MIOItem = attrs["mioitem"] + mio: MIO = mioitem.mio + if mioitem.mio.submit_time is not None: + raise ParseError('出入库已提交不可编辑') + wpr: Wpr = attrs.get("wpr", None) + material:Material = mioitem.material + if material.tracking != Material.MA_TRACKING_SINGLE: + raise ParseError('非单件追踪不可使用') + if mio.type in [MIO.MIO_TYPE_DO_IN, MIO.MIO_TYPE_DO_OUT, MIO.MIO_TYPE_SALE_OUT] and not wpr: + raise ParseError('请选择相应产品') + return attrs + + def save_ftest(self, mioitemw, ftest_data): + ftest = mioitemw.ftest + if not ftest: + ftest_sr = FtestProcessSerializer(data=ftest_data) + ftest = ftest_sr.create(ftest_data) + mioitemw.ftest = ftest + mioitemw.save() + else: + ftest_sr = FtestProcessSerializer() + ftest_sr.update(instance=ftest, validated_data=ftest_data) + return mioitemw + + @transaction.atomic + def create(self, validated_data): + wpr: Wpr = validated_data.get("wpr", None) + if wpr: + mioitem: MIOItem = validated_data["mioitem"] + if MIOItemw.objects.filter(mioitem=mioitem, wpr=wpr).exists(): + raise ParseError('该产品已选入') + ftest_data = validated_data.pop("ftest", None) + mioitemw = super().create(validated_data) + if ftest_data: + mioitemw = self.save_ftest(mioitemw, ftest_data) + return mioitemw + + @transaction.atomic + def update(self, instance, validated_data): + validated_data.pop("mioitem") + ftest_data = validated_data.pop("ftest", None) + mioitemw = super().update(instance, validated_data) + if ftest_data: + mioitemw = self.save_ftest(mioitemw, ftest_data) + return mioitemw \ No newline at end of file diff --git a/apps/inm/views.py b/apps/inm/views.py index 565b0c2c..cfc396ae 100644 --- a/apps/inm/views.py +++ b/apps/inm/views.py @@ -14,7 +14,8 @@ from apps.inm.serializers import ( MaterialBatchSerializer, WareHourseSerializer, MIOListSerializer, MIOItemSerializer, MioItemAnaSerializer, MIODoSerializer, MIOSaleSerializer, MIOPurSerializer, MIOOtherSerializer, MIOItemCreateSerializer, MaterialBatchDetailSerializer, MIODetailSerializer, MIOItemTestSerializer, MIOItemPurInTestSerializer, - MIOItemwSerializer, MIOItemwTestSerializer) + MIOItemwSerializer) +from apps.inm.serializers2 import MIOItemwCreateUpdateSerializer from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.inm.services import InmService, daoru_mb from apps.utils.mixins import (BulkCreateModelMixin, BulkDestroyModelMixin, BulkUpdateModelMixin, @@ -331,9 +332,18 @@ class MIOItemViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyMode return Response(res) -class MIOItemwViewSet(CustomListModelMixin, CustomGenericViewSet): +class MIOItemwViewSet(CustomModelViewSet): + perms_map = {'get': '*', 'post': 'mio.update', 'put': 'mio.update', 'delete': 'mio.update'} queryset = MIOItemw.objects.all() - serializer_class = MIOItemwSerializer + serializer_class = MIOItemwCreateUpdateSerializer + filterset_fields = ['mioitem'] + ordering = ["number"] + ordering_fields = ["number", "create_time"] + + def filter_queryset(self, queryset): + if not self.detail and not self.request.query_params.get('mioitem', None): + raise ParseError('请指定所属出入库记录明细') + return super().filter_queryset(queryset) def cal_mioitem_count(self, mioitem): count = MIOItemw.objects.filter(mioitem=mioitem).count() @@ -342,32 +352,23 @@ class MIOItemwViewSet(CustomListModelMixin, CustomGenericViewSet): mioitem.count_ok = count - mioitem.count_notok mioitem.save() - @action(methods=['post'], detail=True, perms_map={'post': 'mioitem.test'}, serializer_class=MIOItemwTestSerializer) @transaction.atomic - def test(self, request, *args, **kwargs): - """单个检验 + def perform_create(self, serializer): + ins: MIOItemw = serializer.save() + mioitem: MIOItem = ins.mioitem + self.cal_mioitem_count(mioitem) - 单个检验 - """ - ins: MIOItemw = self.get_object() - sr = MIOItemTestSerializer(instance=ins, data=request.data) - sr.is_valid(raise_exception=True) - vdata = sr.validated_data - ftest_data = vdata.pop("ftest", None) - ftest = ins.ftest - if not ftest: - ftest_sr = FtestProcessSerializer(data=ftest_data) - ftest = ftest_sr.create(ftest_data) - ins.ftest = ftest - ins.save() - mioitem: MIOItem = ins.mioitem - if mioitem.test_user is None: - mioitem.test_user = ftest.test_user - mioitem.test_date = ftest.test_date - mioitem.save() - else: - ftest_sr = FtestProcessSerializer() - ftest_sr.update(instance=ftest, validated_data=ftest_data) - self.cal_mioitem_count(ins.mioitem) - return Response(sr.data) + @transaction.atomic + def perform_update(self, serializer): + mioitemw = serializer.save() + self.cal_mioitem_count(mioitemw.mioitem) + + @transaction.atomic + def perform_destroy(self, instance: MIOItemw): + mioitem = instance.mioitem + ftest = instance.ftest + instance.delete() + if ftest: + ftest.delete() + self.cal_mioitem_count(mioitem) \ No newline at end of file