feat: 通过指定mat_in/mat_out复制工艺路线
This commit is contained in:
parent
a8f9676ed0
commit
b400b13ded
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue