From b400b13dede7b3ad3cdd22210c69e61b49b0ef57 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Thu, 3 Apr 2025 14:48:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=80=9A=E8=BF=87=E6=8C=87=E5=AE=9Amat?= =?UTF-8?q?=5Fin/mat=5Fout=E5=A4=8D=E5=88=B6=E5=B7=A5=E8=89=BA=E8=B7=AF?= =?UTF-8?q?=E7=BA=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/mtm/serializers.py | 18 +++++++++++------- apps/mtm/views.py | 33 +++++++++++++++++++++++++-------- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index d21758a7..a9ef01ed 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -149,6 +149,11 @@ class RoutePackSerializer(CustomModelSerializer): # raise ParseError('不可变更产品') # return super().update(instance, validated_data) +class RoutePackCopySerializer(serializers.Serializer): + routepack = serializers.CharField(label='工艺包ID') + new_name = serializers.CharField(label='新名称') + material_in = serializers.CharField(label='原料ID') + material_out = serializers.CharField(label='产品ID') class RouteSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) @@ -184,7 +189,8 @@ class RouteSerializer(CustomModelSerializer): raise ParseError('切分数量必须大于1') return super().validate(attrs) - def gen_material_out(self, instance: Route, material_out_tracking:int): + @classmethod + def gen_material_out(cls, instance: Route, material_out_tracking:int, user=None): """ 自动形成物料 """ @@ -218,8 +224,8 @@ class RouteSerializer(CustomModelSerializer): 'type': Material.MA_TYPE_HALFGOOD, 'cate': material.cate, 'tracking': material_out_tracking, - 'create_by': self.request.user, - 'update_by': self.request.user, + 'create_by': user, + 'update_by': user, }) return material_out @@ -227,7 +233,6 @@ class RouteSerializer(CustomModelSerializer): process = validated_data['process'] routepack = validated_data.get('routepack', None) material_out_tracking = validated_data.pop("material_out_tracking", Material.MA_TRACKING_BATCH) - need_save = False if routepack: pass # if Route.objects.filter(routepack=routepack, process=process).exists(): @@ -252,7 +257,7 @@ class RouteSerializer(CustomModelSerializer): # raise ParseError('物料工序错误!请重新选择') else: if instance.material: - instance.material_out = self.gen_material_out(instance, material_out_tracking) + instance.material_out = RouteSerializer.gen_material_out(instance, material_out_tracking, user=self.request.user) instance.save() rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first() if rx: @@ -269,7 +274,6 @@ class RouteSerializer(CustomModelSerializer): with transaction.atomic(): instance = super().update(instance, validated_data) material_out = instance.material_out - need_save = False if material_out: if material_out.process is None: material_out.process = process @@ -282,7 +286,7 @@ class RouteSerializer(CustomModelSerializer): # raise ParseError('物料工序错误!请重新选择') else: if instance.material: - instance.material_out = self.gen_material_out(instance, material_out_tracking) + instance.material_out = RouteSerializer.gen_material_out(instance, material_out_tracking, user=self.request.user) instance.save() rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first() if rx: diff --git a/apps/mtm/views.py b/apps/mtm/views.py index 79ab02d5..13a193fa 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -11,7 +11,7 @@ from apps.mtm.serializers import (GoalSerializer, MaterialSerializer, MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer, ShiftSerializer, TeamSerializer, ProcessSerializer, RouteSerializer, TeamMemberSerializer, RoutePackSerializer, - SruleSerializer, RouteMatSerializer) + SruleSerializer, RouteMatSerializer, RoutePackCopySerializer) from apps.mtm.services import get_mgroup_goals, daoru_material, get_mgroup_days from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin @@ -232,26 +232,43 @@ class RoutePackViewSet(CustomModelViewSet): return Response(status=204) @transaction.atomic - @action(methods=['post'], detail=True, perms_map={'post': 'routepack.create'}, serializer_class=Serializer) + @action(methods=['post'], detail=False, perms_map={'post': 'routepack.create'}, serializer_class=RoutePackCopySerializer) def copy(self, request, *args, **kwargs): """复制工艺路线 复制工艺路线 """ - obj = self.get_object() + data = request.data + sr = RoutePackCopySerializer(data=data) + sr.is_valid(raise_exception=True) + vdata = sr.validated_data user = request.user now = timezone.now() + new_name = vdata["name"] + rp = RoutePack.objects.get(id=vdata["id"]) + matin = Material.objects.get(id=vdata["material_in"]) + matout = Material.objects.get(id=vdata["material_out"]) obj_c = RoutePack() - obj_c.name = f'{obj.name}_copy' - obj_c.material = obj.material + obj_c.name = new_name + obj_c.material = matout obj_c.create_by = user obj_c.create_time = now obj_c.save() - for route in Route.objects.filter(routepack=obj): + genM = {} + for ind, route in enumerate(Route.get_routes(routepack=rp)): route_new = Route() + process = route.process for f in Route._meta.fields: - if f.name not in ['id', 'create_by', 'update_by', 'create_time', 'update_time']: + if f.name in ['process', 'sort', 'is_autotask', 'is_count_utask', 'out_rate', 'div_number', 'hour_work', 'batch_bind']: setattr(route_new, f.name, getattr(route, f.name, None)) + route_new.material = matout + material_out = RouteSerializer.gen_material_out(instance=route_new, material_out_tracking=route.material_out.tracking) + route_new.material_out = material_out + if ind == 0: + route_new.material_in = matin + elif route.material_in.process and route.material_in.process.id in genM: + route_new.material_in = genM[route.material_in.process.id] + genM[process.id] = material_out route_new.routepack = obj_c route_new.create_by = user route_new.create_time = now @@ -261,7 +278,7 @@ class RoutePackViewSet(CustomModelViewSet): rm_new.route = route_new rm_new.material = rm.material rm_new.save() - return Response() + return Response({"id": route_new.id}) @transaction.atomic @action(methods=['post'], detail=True, permission_classes = [IsAdminUser], serializer_class=Serializer)