feat: 增加routemat表

This commit is contained in:
caoqianming 2025-01-07 09:50:44 +08:00
parent 3efeb746dc
commit f8c72a1487
5 changed files with 65 additions and 7 deletions

View File

@ -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='关联辅助物料'),
),
]

View File

@ -235,6 +235,8 @@ class Route(CommonADModel):
div_number = models.PositiveSmallIntegerField('切分数量', default=1, blank=True) div_number = models.PositiveSmallIntegerField('切分数量', default=1, blank=True)
hour_work = models.FloatField('工时', null=True, blank=True) hour_work = models.FloatField('工时', null=True, blank=True)
batch_bind = models.BooleanField('是否绑定批次', default=True) batch_bind = models.BooleanField('是否绑定批次', default=True)
materials = models.ManyToManyField(Material, verbose_name='关联辅助物料', related_name="route_materials",
through="mtm.routemat", blank=True)
@staticmethod @staticmethod
def get_routes(material: Material): def get_routes(material: Material):
@ -252,3 +254,7 @@ class Route(CommonADModel):
if not rq.filter(is_count_utask=True).exists(): if not rq.filter(is_count_utask=True).exists():
raise ParseError('未指定统计步骤') raise ParseError('未指定统计步骤')
return rq 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)

View File

@ -1,5 +1,6 @@
from apps.utils.serializers import CustomModelSerializer 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 apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT
from rest_framework import serializers from rest_framework import serializers
from rest_framework.exceptions import ValidationError, ParseError from rest_framework.exceptions import ValidationError, ParseError
@ -280,3 +281,12 @@ class SruleSerializer(CustomModelSerializer):
class MgroupDaysSerializer(serializers.Serializer): class MgroupDaysSerializer(serializers.Serializer):
mgroup = serializers.CharField(label="工段ID") mgroup = serializers.CharField(label="工段ID")
now = serializers.DateTimeField(label="当前时间", required=False) 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

View File

@ -3,7 +3,7 @@ from rest_framework.routers import DefaultRouter
from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet, from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet,
GoalViewSet, ProcessViewSet, RouteViewSet, TeamMemberViewSet, GoalViewSet, ProcessViewSet, RouteViewSet, TeamMemberViewSet,
RoutePackViewSet, SruleViewSet) RoutePackViewSet, SruleViewSet, RouteMatViewSet)
API_BASE_URL = 'api/mtm/' API_BASE_URL = 'api/mtm/'
HTML_BASE_URL = 'mtm/' HTML_BASE_URL = 'mtm/'
@ -19,6 +19,7 @@ router.register('routepack', RoutePackViewSet, basename='routepack')
router.register('route', RouteViewSet, basename='route') router.register('route', RouteViewSet, basename='route')
router.register('teammember', TeamMemberViewSet, basename='teammember') router.register('teammember', TeamMemberViewSet, basename='teammember')
router.register('srule', SruleViewSet, basename='srule') router.register('srule', SruleViewSet, basename='srule')
router.register("routemat", RouteMatViewSet, basename="routemat")
urlpatterns = [ urlpatterns = [
path(API_BASE_URL, include(router.urls)), path(API_BASE_URL, include(router.urls)),
] ]

View File

@ -6,14 +6,15 @@ from rest_framework.response import Response
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from apps.mtm.filters import GoalFilter, MaterialFilter, RouteFilter 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, from apps.mtm.serializers import (GoalSerializer, MaterialSerializer,
MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer, MgroupGoalYearSerializer, MgroupSerializer, MgroupDaysSerializer,
ShiftSerializer, TeamSerializer, ProcessSerializer, 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.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 from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin, CustomListModelMixin
from rest_framework.serializers import Serializer from rest_framework.serializers import Serializer
from django.db import transaction from django.db import transaction
from django.db.models import Q from django.db.models import Q
@ -263,3 +264,9 @@ class SruleViewSet(CustomModelViewSet):
rule = item["rule"] rule = item["rule"]
item["rule_display"] = "->".join([teams_dict.get(x, '未知') for x in rule]) item["rule_display"] = "->".join([teams_dict.get(x, '未知') for x in rule])
return data 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']