feat: 增加teammember字段

This commit is contained in:
caoqianming 2023-11-20 11:40:58 +08:00
parent 058e9ce5c3
commit 5e3d88b84a
5 changed files with 111 additions and 10 deletions

View File

@ -0,0 +1,49 @@
# Generated by Django 3.2.12 on 2023-11-20 03:39
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('system', '0002_myschedule'),
('mtm', '0024_auto_20231116_1416'),
]
operations = [
migrations.AddField(
model_name='mgroup',
name='shift_rule',
field=models.CharField(default='默认', max_length=10, verbose_name='班次规则'),
),
migrations.AddField(
model_name='shift',
name='belong_dept',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='shift_belong_dept', to='system.dept', verbose_name='所属部门'),
),
migrations.AddField(
model_name='shift',
name='rule',
field=models.CharField(default='默认', max_length=10, verbose_name='所属规则'),
),
migrations.CreateModel(
name='TeamMember',
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='删除标记')),
('mgroup', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.mgroup', verbose_name='所在工段')),
('post', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='system.post', verbose_name='岗位')),
('team', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mtm.team', verbose_name='关联班组')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='成员')),
],
options={
'abstract': False,
},
),
]

View File

@ -75,10 +75,11 @@ class Material(CommonAModel):
return f'{self.name}-{self.model}-{self.specification}'
class Shift(CommonAModel):
class Shift(CommonBModel):
"""班次
"""
name = models.CharField('名称', max_length=50)
rule = models.CharField('所属规则', max_length=10, default='默认')
start_time_o = models.TimeField('开始时间')
end_time_o = models.TimeField('结束时间')
@ -87,7 +88,7 @@ class Shift(CommonAModel):
class Team(CommonBModel):
"""班组
"""班组, belong_dept为所属车间
"""
name = models.CharField('名称', max_length=50)
leader = models.ForeignKey(
@ -101,6 +102,7 @@ class Mgroup(CommonBModel):
name = models.CharField('名称', max_length=50)
cate = models.CharField(
'分类', max_length=50, default='section', help_text='section/other') # section是工段
shift_rule = models.CharField('班次规则', max_length=10, default='默认')
process = models.ForeignKey(
Process, verbose_name='工序', on_delete=models.SET_NULL, null=True, blank=True)
product = models.ForeignKey(
@ -118,6 +120,17 @@ class Mgroup(CommonBModel):
ordering = ['sort', '-create_time']
class TeamMember(BaseModel):
team = models.ForeignKey(Team, verbose_name='关联班组',
on_delete=models.CASCADE)
user = models.ForeignKey(
'system.user', verbose_name='成员', on_delete=models.CASCADE)
mgroup = models.ForeignKey(
Mgroup, verbose_name='所在工段', on_delete=models.CASCADE)
post = models.ForeignKey('system.post', verbose_name='岗位',
on_delete=models.SET_NULL, null=True, blank=True)
class Goal(CommonADModel):
"""目标
"""

View File

@ -1,9 +1,9 @@
from apps.utils.serializers import CustomModelSerializer
from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route
from apps.utils.constants import EXCLUDE_FIELDS
from apps.mtm.models import Shift, Material, Mgroup, Team, Goal, Process, Route, TeamMember
from apps.utils.constants import EXCLUDE_FIELDS, EXCLUDE_FIELDS_BASE, EXCLUDE_FIELDS_DEPT
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from apps.system.models import Dept
from rest_framework.exceptions import ValidationError, ParseError
from apps.system.models import Dept, UserPost
from django.db import transaction
@ -44,6 +44,29 @@ class MgroupSerializer(CustomModelSerializer):
read_only_fields = EXCLUDE_FIELDS
class TeamMemberSerializer(CustomModelSerializer):
user_name = serializers.CharField(source='user.name', read_only=True)
mgroup_name = serializers.CharField(source='mgroup.name', read_only=True)
post_name = serializers.CharField(source='post.name', read_only=True)
class Meta:
model = Team
fields = '__all__'
read_only_fields = EXCLUDE_FIELDS_BASE
def validate(self, attrs):
user = attrs['user']
post = attrs.get('post', None)
if post is None:
userpost = UserPost.objects.filter(
dept=attrs['mgroup'].belong_dept, user=user).first()
if userpost:
attrs['post'] = userpost.post
else:
raise ParseError(f'{user.name}未配置岗位')
return super().validate(attrs)
class TeamSerializer(CustomModelSerializer):
belong_dept = serializers.PrimaryKeyRelatedField(
label="所属部门", queryset=Dept.objects.all(), required=True)

View File

@ -1,7 +1,8 @@
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet, GoalViewSet, ProcessViewSet, RouteViewSet)
from apps.mtm.views import (MgroupViewSet, ShiftViewSet, TeamViewSet, MaterialViewSet,
GoalViewSet, ProcessViewSet, RouteViewSet, TeamMemberViewSet)
API_BASE_URL = 'api/mtm/'
HTML_BASE_URL = 'mtm/'
@ -14,6 +15,7 @@ router.register('shift', ShiftViewSet, basename='shift')
router.register('goal', GoalViewSet, basename='goal')
router.register('process', ProcessViewSet, basename='process')
router.register('route', RouteViewSet, basename='route')
router.register('teammember', TeamMemberViewSet, basename='teammember')
urlpatterns = [
path(API_BASE_URL, include(router.urls)),
]
]

View File

@ -5,12 +5,13 @@ 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
from apps.mtm.models import Goal, Material, Mgroup, Shift, Team, Process, Route, TeamMember
from apps.mtm.serializers import (GoalSerializer, MaterialSerializer,
MgroupGoalYearSerializer, MgroupSerializer,
ShiftSerializer, TeamSerializer, ProcessSerializer, RouteSerializer)
ShiftSerializer, TeamSerializer, ProcessSerializer, RouteSerializer, TeamMemberSerializer)
from apps.mtm.services import get_mgroup_goals
from apps.utils.viewsets import CustomGenericViewSet, CustomModelViewSet
from apps.utils.mixins import BulkCreateModelMixin, BulkDestroyModelMixin
# Create your views here.
@ -68,6 +69,19 @@ class TeamViewSet(CustomModelViewSet):
search_fields = ['name']
class TeamMemberViewSet(ListModelMixin, BulkCreateModelMixin, BulkDestroyModelMixin, CustomGenericViewSet):
"""
list: 班组成员
班组成员
"""
perms_map = {'get': '*', 'post': 'team.update', 'delete': 'team.delete'}
queryset = TeamMember.objects.all()
serializer_class = TeamMemberSerializer
select_related_fields = ['mgroup', 'post', 'team', 'user']
filterset_fields = ['mgroup', 'post', 'team']
class GoalViewSet(CustomModelViewSet):
"""
list: 目标