diff --git a/apps/mtm/filters.py b/apps/mtm/filters.py index 00f21050..658053b8 100644 --- a/apps/mtm/filters.py +++ b/apps/mtm/filters.py @@ -2,18 +2,22 @@ from django_filters import rest_framework as filters from apps.mtm.models import Goal, Material from django.db.models.expressions import F + class MaterialFilter(filters.FilterSet): tag = filters.CharFilter(method='filter_tag') + class Meta: model = Material fields = { "type": ["exact", "in"], - "is_hidden": ["exact"] + "is_hidden": ["exact"], + "is_assemb": ["exact"] } - + def filter_tag(self, queryset, name, value): if value == 'low_inm': - queryset = queryset.exclude(count_safe=None).filter(count__lte = F('count_safe')) + queryset = queryset.exclude(count_safe=None).filter( + count__lte=F('count_safe')) return queryset @@ -26,4 +30,4 @@ class GoalFilter(filters.FilterSet): "goal_cate": ["exact", "in"], "goal_cate__code": ["exact", "in"], "year": ["exact"] - } \ No newline at end of file + } diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 34dbd872..47b47fd4 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -41,6 +41,7 @@ class Material(CommonAModel): (MA_TYPE_HELPTOOL, '辅助工装'), (MA_TYPE_OFFICE, '办公用品') ) + name = models.CharField('名称', max_length=50) number = models.CharField('编号', max_length=100, null=True, blank=True) specification = models.CharField( @@ -54,10 +55,12 @@ class Material(CommonAModel): count = models.PositiveIntegerField('物料库存总数', default=0) count_safe = models.PositiveIntegerField('安全库存总数', null=True, blank=True) process = models.ForeignKey( - Process, verbose_name='所在工序', on_delete=models.CASCADE, null=True, blank=True) + Process, verbose_name='所用工序', on_delete=models.CASCADE, null=True, blank=True) parent = models.ForeignKey( 'self', null=True, blank=True, on_delete=models.SET_NULL, verbose_name='父物料') is_hidden = models.BooleanField('是否隐藏', default=False) + is_assemb = models.BooleanField('是否组合件', default=False) + components = models.JSONField('组件', default=dict, null=False, blank=True) class Meta: verbose_name = '物料表' @@ -136,9 +139,9 @@ class Goal(CommonADModel): unique_together = ("mgroup", "year", "goal_cate") -class Route(CommonAModel): +class Route(CommonADModel): """ - 工艺路线 + 加工路线 """ material = models.ForeignKey( Material, verbose_name='关联产品', on_delete=models.CASCADE) @@ -165,4 +168,4 @@ class Route(CommonAModel): raise ValidationError('首步缺少输入/最后一步缺少输出') if autotask: kwargs['is_autotask'] = True - return Route.objects.annotate(mgroups=Subquery(Mgroup.objects.filter(process=OuterRef('pk')))).filter(**kwargs).order_by('sort', 'process__sort', 'create_time') + return rq diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 819884bf..5fc8bec5 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -14,6 +14,8 @@ class ShiftSerializer(CustomModelSerializer): class MaterialSerializer(CustomModelSerializer): + process_name = serializers.CharField(source='process.name', read_only=True) + class Meta: model = Material fields = '__all__' @@ -25,6 +27,8 @@ class MgroupSerializer(CustomModelSerializer): label="所属部门", queryset=Dept.objects.all(), required=True) belong_dept_name = serializers.CharField( source='belong_dept.name', read_only=True) + process_name = serializers.CharField(source='process.name', read_only=True) + process_cate = serializers.CharField(source='process.cate', read_only=True) class Meta: model = Mgroup @@ -75,6 +79,14 @@ class RouteSerializer(CustomModelSerializer): material_ = MaterialSerializer(source='material', read_only=True) process_name = serializers.CharField(source='process.name', read_only=True) process_cate = serializers.CharField(source='process.cate', read_only=True) + material_in_name = serializers.CharField( + source='material_in.name', read_only=True) + material_out_name = serializers.CharField( + source='material_out.name', read_only=True) + material_out_type = serializers.CharField( + source='material_out.type', read_only=True) + material_out_is_hidden = serializers.BooleanField( + source='material_out.is_hidden', read_only=True) class Meta: model = Route @@ -88,9 +100,10 @@ class RouteSerializer(CustomModelSerializer): return super().validate(attrs) def gen_material_out(self, instance): + name = f'{instance.material.name}-中' instance.material_out, _ = Material.objects.get_or_create(type=Material.MA_TYPE_HALFGOOD, parent=instance.material, process=instance.process, defaults={'parent': instance.material, 'process': instance.process, - 'is_hidden': True, 'name': instance.material.name, + 'is_hidden': True, 'name': name, 'number': instance.material.number, 'specification': instance.material.specification, 'type': Material.MA_TYPE_HALFGOOD, @@ -101,12 +114,18 @@ class RouteSerializer(CustomModelSerializer): def create(self, validated_data): instance = super().create(validated_data) - self.gen_material_out() + if 'material_out' in validated_data and validated_data['material_out']: + pass + else: + self.gen_material_out(instance) return instance def update(self, instance, validated_data): validated_data.pop('material', None) validated_data.pop('process', None) instance = super().update(instance, validated_data) - self.gen_material_out() + if 'material_out' in validated_data and validated_data['material_out']: + pass + else: + self.gen_material_out(instance) return instance