diff --git a/apps/wpm/serializers.py b/apps/wpm/serializers.py index a05b58af..1b5a70a9 100644 --- a/apps/wpm/serializers.py +++ b/apps/wpm/serializers.py @@ -256,6 +256,9 @@ class MlogSerializer(CustomModelSerializer): fields = '__all__' read_only_fields = EXCLUDE_FIELDS + \ ['submit_time', 'submit_user', 'material_outs'] + extra_kwargs = { + "batch": {"required": True} + } def create(self, validated_data): mtask: Mtask = validated_data.get('mtask', None) @@ -370,7 +373,27 @@ class MlogbInSerializer(CustomModelSerializer): raise ValidationError('批次号不匹配') attrs['material_in'] = mlog.material_in return attrs + + def create(self, validated_data): + mlog: Mlog = validated_data['mlog'] + if mlog.submit_time is not None: + raise ParseError('生产日志已提交不可编辑') + return super().create(validated_data) + def update(self, instance, validated_data): + mlog: Mlog = instance.mlog + if mlog.submit_time is not None: + raise ParseError('生产日志已提交不可编辑') + return super().update(instance, validated_data) + +class MlogbInUpdateSerializer(CustomModelSerializer): + class Meta: + model = Mlogb + fields = ['id', 'count_use', 'count_break'] + +class MlogbOutSerializer(CustomModelSerializer): + pass + class MlogRevertSerializer(serializers.Serializer): change_reason = serializers.CharField(label='撤回原因') diff --git a/apps/wpm/views.py b/apps/wpm/views.py index 26749e1e..891de0f9 100644 --- a/apps/wpm/views.py +++ b/apps/wpm/views.py @@ -15,13 +15,13 @@ from apps.pm.models import Mtask from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import BulkCreateModelMixin -from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter +from .filters import StLogFilter, SfLogFilter, WMaterialFilter, MlogFilter, HandoverFilter, MlogbFilter from .models import SfLog, SfLogExp, StLog, WMaterial, Mlog, Handover, Mlogb, AttLog, OtherLog from .serializers import (SflogExpSerializer, SfLogSerializer, StLogSerializer, WMaterialSerializer, MlogRevertSerializer, MlogSerializer, MlogRelatedSerializer, DeptBatchSerializer, HandoverSerializer, GenHandoverSerializer, GenHandoverWmSerializer, MlogAnaSerializer, AttLogSerializer, OtherLogSerializer, MlogInitSerializer, MlogChangeSerializer, - MlogbDetailSerializer, MlogbInSerializer) + MlogbDetailSerializer, MlogbInSerializer, MlogbInUpdateSerializer) from .services import mlog_submit, update_mtask, handover_submit, mlog_revert, cal_material_count_from_mlog, cal_mtask_progress_from_mlog from apps.utils.thread import MyThread from apps.monitor.services import create_auditlog, delete_auditlog @@ -440,19 +440,33 @@ class MlogbViewSet(ListModelMixin, CustomGenericViewSet): perms_map = {'get': '*'} queryset = Mlogb.objects.all() serializer_class = MlogbDetailSerializer - filterset_fields = ['mlog', 'mtask', 'material_in', 'material_out'] + filterset_class = MlogbFilter -class MlogbInViewSet(CreateModelMixin, DestroyModelMixin, CustomGenericViewSet): +class MlogbInViewSet(CreateModelMixin, UpdateModelMixin, DestroyModelMixin, CustomGenericViewSet): perms_map = {'post': 'mlog.update', 'delete': 'mlog.update'} queryset = Mlogb.objects.all() serializer_class = MlogbInSerializer + update_serializer_class = MlogbInUpdateSerializer + + @transaction.atomic + def perform_destroy(self, instance): + ins: Mlogb = instance + if ins.mlog.submit_time is not None: + raise ParseError('生产日志已提交不可编辑') + if ins.mtask: + query_dict = {"material_out__isnull": False, "mlog": ins.mlog, "mtask": ins.mtask} + route = ins.mtask.route + if route.batch_bind: + query_dict["batch"] = ins.batch + Mlogb.objects.filter(**query_dict).delete() + instance.delete() @transaction.atomic def perform_create(self, serializer): ins: Mlogb = serializer.save() # 创建输出 - if ins.mtask: + if ins.mtask and ins.material_in: material_out = ins.mlog.material_out route = ins.mlog.route if material_out is None: