feat: 增加mioitemw的update
This commit is contained in:
parent
5409f5d55d
commit
a2a89a0785
|
@ -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(
|
||||
|
|
|
@ -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
|
|
@ -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)
|
||||
|
Loading…
Reference in New Issue