diff --git a/apps/mtm/filters.py b/apps/mtm/filters.py index b45c2daf..ef51633a 100644 --- a/apps/mtm/filters.py +++ b/apps/mtm/filters.py @@ -1,5 +1,5 @@ from django_filters import rest_framework as filters -from apps.mtm.models import Goal, Material +from apps.mtm.models import Goal, Material, Route from django.db.models.expressions import F @@ -16,7 +16,8 @@ class MaterialFilter(filters.FilterSet): "is_assemb": ["exact"], "need_route": ["exact"], "orderitem_material__order": ['exact'], - "pu_orderitem_material__pu_order": ["exact"] + "pu_orderitem_material__pu_order": ["exact"], + "route_material_out__mgroup": ["exact"] } def filter_tag(self, queryset, name, value): @@ -36,3 +37,15 @@ class GoalFilter(filters.FilterSet): "goal_cate__code": ["exact", "in"], "year": ["exact"] } + + +class RouteFilter(filters.FilterSet): + class Meta: + model = Route + fields = { + "material": ["exact", "in", "isnull"], + "material_out": ["exact", "in"], + "process": ["exact", "in"], + "is_autotask": ["exact"], + "mgroup": ["exact", "in", "isnull"], + } diff --git a/apps/mtm/migrations/0023_auto_20231102_1128.py b/apps/mtm/migrations/0023_auto_20231102_1128.py new file mode 100644 index 00000000..a8795bde --- /dev/null +++ b/apps/mtm/migrations/0023_auto_20231102_1128.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.12 on 2023-11-02 03:28 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0022_alter_material_cate'), + ] + + operations = [ + migrations.AddField( + model_name='route', + name='mgroup', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='route_mgroup', to='mtm.mgroup', verbose_name='指定工段'), + ), + migrations.AlterField( + model_name='route', + name='material', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='关联产品'), + ), + migrations.AlterField( + model_name='route', + name='out_rate', + field=models.FloatField(blank=True, default=100, verbose_name='出材率'), + ), + migrations.AlterField( + model_name='route', + name='process', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='mtm.process', verbose_name='工序'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 5cd8b7e4..b47fec85 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -147,9 +147,11 @@ class Route(CommonADModel): 加工路线 """ material = models.ForeignKey( - Material, verbose_name='关联产品', on_delete=models.CASCADE) + Material, verbose_name='关联产品', on_delete=models.CASCADE, null=True, blank=True) process = models.ForeignKey( - Process, verbose_name='工序', on_delete=models.CASCADE) + Process, verbose_name='工序', on_delete=models.CASCADE, null=True, blank=True) + mgroup = models.ForeignKey(Mgroup, verbose_name='指定工段', on_delete=models.CASCADE, + null=True, blank=True, related_name='route_mgroup') sort = models.PositiveSmallIntegerField('顺序', default=1) is_autotask = models.BooleanField('是否自动排产', default=False) material_in = models.ForeignKey( @@ -157,7 +159,7 @@ class Route(CommonADModel): material_out = models.ForeignKey( Material, verbose_name='主要输出物料', on_delete=models.CASCADE, related_name='route_material_out', null=True, blank=True) is_count_utask = models.BooleanField('是否主任务统计', default=False) - out_rate = models.FloatField('出材率', default=100, null=True, blank=True) + out_rate = models.FloatField('出材率', default=100, blank=True) @staticmethod def get_routes(material: Material, autotask: bool = False): diff --git a/apps/mtm/views.py b/apps/mtm/views.py index d7aeaf3d..d97df4b1 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -4,7 +4,7 @@ from rest_framework.mixins import ListModelMixin from rest_framework.response import Response from rest_framework.exceptions import ParseError -from apps.mtm.filters import GoalFilter, MaterialFilter +from apps.mtm.filters import GoalFilter, MaterialFilter, RouteFilter from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route from apps.mtm.serializers import (GoalSerializer, MaterialSerializer, MgroupGoalYearSerializer, MgroupSerializer, @@ -112,7 +112,7 @@ class ProcessViewSet(CustomModelViewSet): class RouteViewSet(CustomModelViewSet): queryset = Route.objects.all() serializer_class = RouteSerializer - filterset_fields = ['material', 'process', 'is_autotask'] + filterset_class = RouteFilter ordering = ['sort', 'create_time'] select_related_fields = ['material', - 'process', 'material_in', 'material_out'] + 'process', 'material_in', 'material_out', 'mgroup']