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('不可变更产品')
# 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:

View File

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