From f8c72a14874c312535363122bc7595681c1b5798 Mon Sep 17 00:00:00 2001 From: caoqianming Date: Tue, 7 Jan 2025 09:50:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0routemat=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mtm/migrations/0049_auto_20250107_0949.py | 34 +++++++++++++++++++ apps/mtm/models.py | 6 ++++ apps/mtm/serializers.py | 14 ++++++-- apps/mtm/urls.py | 3 +- apps/mtm/views.py | 15 +++++--- 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 apps/mtm/migrations/0049_auto_20250107_0949.py diff --git a/apps/mtm/migrations/0049_auto_20250107_0949.py b/apps/mtm/migrations/0049_auto_20250107_0949.py new file mode 100644 index 00000000..4b81c635 --- /dev/null +++ b/apps/mtm/migrations/0049_auto_20250107_0949.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.12 on 2025-01-07 01:49 + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('mtm', '0048_auto_20241218_1431'), + ] + + operations = [ + migrations.CreateModel( + name='RouteMat', + fields=[ + ('id', models.CharField(editable=False, help_text='主键ID', max_length=20, primary_key=True, serialize=False, verbose_name='主键ID')), + ('create_time', models.DateTimeField(default=django.utils.timezone.now, help_text='创建时间', verbose_name='创建时间')), + ('update_time', models.DateTimeField(auto_now=True, help_text='修改时间', verbose_name='修改时间')), + ('is_deleted', models.BooleanField(default=False, help_text='删除标记', verbose_name='删除标记')), + ('material', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.material', verbose_name='辅助物料')), + ('route', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.route', verbose_name='关联路线')), + ], + options={ + 'abstract': False, + }, + ), + migrations.AddField( + model_name='route', + name='materials', + field=models.ManyToManyField(blank=True, related_name='route_materials', through='mtm.RouteMat', to='mtm.Material', verbose_name='关联辅助物料'), + ), + ] diff --git a/apps/mtm/models.py b/apps/mtm/models.py index 31756949..d07888a5 100644 --- a/apps/mtm/models.py +++ b/apps/mtm/models.py @@ -235,6 +235,8 @@ class Route(CommonADModel): div_number = models.PositiveSmallIntegerField('切分数量', default=1, blank=True) hour_work = models.FloatField('工时', null=True, blank=True) batch_bind = models.BooleanField('是否绑定批次', default=True) + materials = models.ManyToManyField(Material, verbose_name='关联辅助物料', related_name="route_materials", + through="mtm.routemat", blank=True) @staticmethod def get_routes(material: Material): @@ -252,3 +254,7 @@ class Route(CommonADModel): if not rq.filter(is_count_utask=True).exists(): raise ParseError('未指定统计步骤') return rq + +class RouteMat(BaseModel): + route = models.ForeignKey(Route, verbose_name='关联路线', on_delete=models.CASCADE) + material = models.ForeignKey(Material, verbose_name='辅助物料', on_delete=models.CASCADE) \ No newline at end of file diff --git a/apps/mtm/serializers.py b/apps/mtm/serializers.py index 663b9a3c..c9547ca5 100644 --- a/apps/mtm/serializers.py +++ b/apps/mtm/serializers.py @@ -1,5 +1,6 @@ from apps.utils.serializers import CustomModelSerializer -from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route, TeamMember, RoutePack, Srule +from apps.mtm.models import (Shift, Material, Mgroup, Team, Goal, + Process, Route, TeamMember, RoutePack, Srule, RouteMat) from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT from rest_framework import serializers from rest_framework.exceptions import ValidationError, ParseError @@ -279,4 +280,13 @@ class SruleSerializer(CustomModelSerializer): class MgroupDaysSerializer(serializers.Serializer): mgroup = serializers.CharField(label="工段ID") - now = serializers.DateTimeField(label="当前时间", required=False) \ No newline at end of file + now = serializers.DateTimeField(label="当前时间", required=False) + + +class RouteMatSerializer(CustomModelSerializer): + material_name = serializers.StringRelatedField( + source='material', read_only=True) + class Meta: + model = RouteMat + fields = "__all__" + read_only_fields = EXCLUDE_FIELDS_BASE \ No newline at end of file diff --git a/apps/mtm/urls.py b/apps/mtm/urls.py index 79eb27e6..ff23df3e 100644 --- a/apps/mtm/urls.py +++ b/apps/mtm/urls.py @@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet, GoalViewSet, ProcessViewSet, RouteViewSet, TeamMemberViewSet, - RoutePackViewSet, SruleViewSet) + RoutePackViewSet, SruleViewSet, RouteMatViewSet) API_BASE_URL = 'api/mtm/' HTML_BASE_URL = 'mtm/' @@ -19,6 +19,7 @@ router.register('routepack', RoutePackViewSet, basename='routepack') router.register('route', RouteViewSet, basename='route') router.register('teammember', TeamMemberViewSet, basename='teammember') router.register('srule', SruleViewSet, basename='srule') +router.register("routemat", RouteMatViewSet, basename="routemat") urlpatterns = [ path(API_BASE_URL, include(router.urls)), ] diff --git a/apps/mtm/views.py b/apps/mtm/views.py index bea70e30..4e82c01d 100644 --- a/apps/mtm/views.py +++ b/apps/mtm/views.py @@ -6,14 +6,15 @@ from rest_framework.response import Response from rest_framework.exceptions import ParseError from apps.mtm.filters import GoalFilter, MaterialFilter, RouteFilter -from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route, TeamMember, RoutePack, Srule +from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route, TeamMember, RoutePack, Srule, RouteMat from apps.mtm.serializers import (GoalSerializer, MaterialSerializer, MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer, ShiftSerializer, TeamSerializer, ProcessSerializer, - RouteSerializer, TeamMemberSerializer, RoutePackSerializer, SruleSerializer) + RouteSerializer, TeamMemberSerializer, RoutePackSerializer, + SruleSerializer, RouteMatSerializer) 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 +from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin from rest_framework.serializers import Serializer from django.db import transaction from django.db.models import Q @@ -262,4 +263,10 @@ class SruleViewSet(CustomModelViewSet): for item in data: rule = item["rule"] item["rule_display"] = "->".join([teams_dict.get(x, '未知') for x in rule]) - return data \ No newline at end of file + return data + +class RouteMatViewSet(CustomListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet): + perms_map = {"get": "*", "post": "route.update", "delete": "route.update"} + queryset = RouteMat.objects.all() + serializer_class = RouteMatSerializer + filterset_fields = ['route', 'material'] \ No newline at end of file