feat: 通过指定mat_in/mat_out复制工艺路线

This commit is contained in:
caoqianming 2025-04-03 14:48:14 +08:00
parent a8f9676ed0
commit b400b13ded
2 changed files with 36 additions and 15 deletions

View File

@ -149,6 +149,11 @@ class RoutePackSerializer(CustomModelSerializer):
# raise ParseError('不可变更产品') # raise ParseError('不可变更产品')
# return super().update(instance, validated_data) # 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): class RouteSerializer(CustomModelSerializer):
material_ = MaterialSerializer(source='material', read_only=True) material_ = MaterialSerializer(source='material', read_only=True)
@ -184,7 +189,8 @@ class RouteSerializer(CustomModelSerializer):
raise ParseError('切分数量必须大于1') raise ParseError('切分数量必须大于1')
return super().validate(attrs) 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, 'type': Material.MA_TYPE_HALFGOOD,
'cate': material.cate, 'cate': material.cate,
'tracking': material_out_tracking, 'tracking': material_out_tracking,
'create_by': self.request.user, 'create_by': user,
'update_by': self.request.user, 'update_by': user,
}) })
return material_out return material_out
@ -227,7 +233,6 @@ class RouteSerializer(CustomModelSerializer):
process = validated_data['process'] process = validated_data['process']
routepack = validated_data.get('routepack', None) routepack = validated_data.get('routepack', None)
material_out_tracking = validated_data.pop("material_out_tracking", Material.MA_TRACKING_BATCH) material_out_tracking = validated_data.pop("material_out_tracking", Material.MA_TRACKING_BATCH)
need_save = False
if routepack: if routepack:
pass pass
# if Route.objects.filter(routepack=routepack, process=process).exists(): # if Route.objects.filter(routepack=routepack, process=process).exists():
@ -252,7 +257,7 @@ class RouteSerializer(CustomModelSerializer):
# raise ParseError('物料工序错误!请重新选择') # raise ParseError('物料工序错误!请重新选择')
else: else:
if instance.material: 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() instance.save()
rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first() rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first()
if rx: if rx:
@ -269,7 +274,6 @@ class RouteSerializer(CustomModelSerializer):
with transaction.atomic(): with transaction.atomic():
instance = super().update(instance, validated_data) instance = super().update(instance, validated_data)
material_out = instance.material_out material_out = instance.material_out
need_save = False
if material_out: if material_out:
if material_out.process is None: if material_out.process is None:
material_out.process = process material_out.process = process
@ -282,7 +286,7 @@ class RouteSerializer(CustomModelSerializer):
# raise ParseError('物料工序错误!请重新选择') # raise ParseError('物料工序错误!请重新选择')
else: else:
if instance.material: 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() instance.save()
rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first() rx = Route.objects.filter(material_in=instance.material_in, material_out=instance.material_out, process=process).exclude(id=instance.id).first()
if rx: if rx:

View File

@ -11,7 +11,7 @@ from apps.mtm.serializers import (GoalSerializer, MaterialSerializer,
MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer, MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer,
ShiftSerializer, TeamSerializer, ProcessSerializer, ShiftSerializer, TeamSerializer, ProcessSerializer,
RouteSerializer, TeamMemberSerializer, RoutePackSerializer, RouteSerializer, TeamMemberSerializer, RoutePackSerializer,
SruleSerializer, RouteMatSerializer) SruleSerializer, RouteMatSerializer, RoutePackCopySerializer)
from apps.mtm.services import get_mgroup_goals, daoru_material, get_mgroup_days from apps.mtm.services import get_mgroup_goals, daoru_material, get_mgroup_days
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin
@ -232,26 +232,43 @@ class RoutePackViewSet(CustomModelViewSet):
return Response(status=204) return Response(status=204)
@transaction.atomic @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): 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 user = request.user
now = timezone.now() 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 = RoutePack()
obj_c.name = f'{obj.name}_copy' obj_c.name = new_name
obj_c.material = obj.material obj_c.material = matout
obj_c.create_by = user obj_c.create_by = user
obj_c.create_time = now obj_c.create_time = now
obj_c.save() 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() route_new = Route()
process = route.process
for f in Route._meta.fields: 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)) 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.routepack = obj_c
route_new.create_by = user route_new.create_by = user
route_new.create_time = now route_new.create_time = now
@ -261,7 +278,7 @@ class RoutePackViewSet(CustomModelViewSet):
rm_new.route = route_new rm_new.route = route_new
rm_new.material = rm.material rm_new.material = rm.material
rm_new.save() rm_new.save()
return Response() return Response({"id": route_new.id})
@transaction.atomic @transaction.atomic
@action(methods=['post'], detail=True, permission_classes = [IsAdminUser], serializer_class=Serializer) @action(methods=['post'], detail=True, permission_classes = [IsAdminUser], serializer_class=Serializer)