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)
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)

View File

@ -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)
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,
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)),
]

View File

@ -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
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']