feat: 增加mioitemw的update

This commit is contained in:
caoqianming 2025-01-15 15:02:19 +08:00
parent 5409f5d55d
commit a2a89a0785
3 changed files with 91 additions and 38 deletions

View File

@ -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(

61
apps/inm/serializers2.py Normal file
View File

@ -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

View File

@ -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)