diff --git a/client/src/api/task.js b/client/src/api/task.js index f59f436..0b3ac3a 100644 --- a/client/src/api/task.js +++ b/client/src/api/task.js @@ -48,3 +48,17 @@ export function inittask(id, data) { }) } + +export function gettaskcontents(id) { + return request({ + url: `/supervision/task/${id}/contents/`, + method: 'get' + }) +} + +export function gettaskdepts(id) { + return request({ + url: `/supervision/task/${id}/depts/`, + method: 'get' + }) +} \ No newline at end of file diff --git a/client/src/views/supervision/task.vue b/client/src/views/supervision/task.vue index a5570ee..bd71def 100644 --- a/client/src/views/supervision/task.vue +++ b/client/src/views/supervision/task.vue @@ -69,7 +69,6 @@ align="center" label="操作" width="220px" - fixed="right" > \ No newline at end of file diff --git a/server/apps/supervision/migrations/0008_auto_20210316_0827.py b/server/apps/supervision/migrations/0008_auto_20210316_0827.py new file mode 100644 index 0000000..27cc541 --- /dev/null +++ b/server/apps/supervision/migrations/0008_auto_20210316_0827.py @@ -0,0 +1,40 @@ +# Generated by Django 3.0.5 on 2021-03-16 00:27 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('supervision', '0007_auto_20210315_1412'), + ] + + operations = [ + migrations.RemoveField( + model_name='task', + name='is_self', + ), + migrations.AddField( + model_name='record', + name='is_self', + field=models.BooleanField(default=False, verbose_name='是否主动报送'), + ), + migrations.AlterField( + model_name='record', + name='content', + field=models.ForeignKey(on_delete=django.db.models.deletion.DO_NOTHING, related_name='record_content', to='supervision.Content', verbose_name='材料内容'), + ), + migrations.AlterField( + model_name='record', + name='task', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_task', to='supervision.Task', verbose_name='关联任务'), + ), + migrations.AlterField( + model_name='record', + name='up_user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_up_user', to=settings.AUTH_USER_MODEL, verbose_name='上报人'), + ), + ] diff --git a/server/apps/supervision/models.py b/server/apps/supervision/models.py index fae4c5a..b831fcd 100644 --- a/server/apps/supervision/models.py +++ b/server/apps/supervision/models.py @@ -27,7 +27,6 @@ class Task(CommonBModel): ('已完成', '已完成'), ) name = models.CharField('名称', max_length=100) - is_self = models.BooleanField('是否主动报送', default=False) end_date = models.DateField('截止时间', null=True, blank=True) note = models.TextField('任务备注', null=True, blank=True) complete_rate = models.IntegerField('完成度', default=0) @@ -49,10 +48,11 @@ class Record(CommonBModel): ('已确认', '已确认'), ('待整改', '待整改') ) - content = models.ForeignKey(Content, verbose_name='材料内容', on_delete=models.DO_NOTHING) - task = models.ForeignKey(Task, verbose_name='关联任务', null=True, blank=True, on_delete=models.SET_NULL) + content = models.ForeignKey(Content, verbose_name='材料内容', on_delete=models.DO_NOTHING, related_name='record_content') + task = models.ForeignKey(Task, verbose_name='关联任务', null=True, blank=True, on_delete=models.SET_NULL, related_name='record_task') + is_self = models.BooleanField('是否主动报送', default=False) up_date = models.DateField('上报时间', null=True, blank=True) - up_user = models.ForeignKey(User, verbose_name='上报人', null=True, blank=True,on_delete=models.SET_NULL) + up_user = models.ForeignKey(User, verbose_name='上报人', null=True, blank=True,on_delete=models.SET_NULL, related_name='record_up_user') end_date = models.DateField('截止时间', null=True, blank=True) state = models.CharField('记录状态', max_length=50, choices=state_choices, default='待上报') is_yes = models.BooleanField('是否适用', default=True) diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index 3f38eb4..2c1abd8 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -24,7 +24,7 @@ class ContentSerializer(serializers.ModelSerializer): class ContentListSerializer(serializers.ModelSerializer): class Meta: model = Content - fields = ['name', 'desc'] + fields = ['name', 'desc', 'id'] class TaskCreateUpdateSerializer(serializers.ModelSerializer): class Meta: diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index c8e1978..dbb5440 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -10,6 +10,7 @@ from rest_framework.response import Response from apps.system.models import Organization from django.db.models import Count from utils.pagination import PageOrNot +from apps.system.mixins import OptimizationMixin from apps.system.mixins import CreateUpdateCustomMixin # Create your views here. @@ -33,12 +34,14 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): queryset = Task.objects.all() search_fields = ['name'] ordering = ['-create_time'] + def get_serializer_class(self): if self.action in ['create', 'update']: return TaskCreateUpdateSerializer elif self.action == 'retrieve': return TaksDetailSerializer return TaskListSerializer + @action(methods=['post'], detail=False, perms_map = {'post':'task_createself'}) def createself(self, request): """ @@ -49,7 +52,6 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): serializer.save(is_self=True, create_by=request.user, belong_dept=request.user.dept) return Response(serializer.data, status=status.HTTP_201_CREATED) - @action(methods=['post'], detail=True, perms_map = {'post':'task_init'}) def init(self, request, *args, **kwargs): """ @@ -74,15 +76,31 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): obj.save() return Response(status=status.HTTP_200_OK) return Response('单位或清单不能为空', status=status.HTTP_400_BAD_REQUEST) -class RecordViewSet(CreateUpdateCustomMixin,ModelViewSet): - perms_map = {'get': '*'} + + @action(methods=['get'], detail=True, perms_map = {'get':'*'}) + def contents(self, request, *args, **kwargs): + """ + 聚合 + """ + obj = self.get_object() + serializer = ContentListSerializer(obj.contents.distinct(), many=True) + return Response(serializer.data) + + @action(methods=['get'], detail=True, perms_map = {'get':'*'}) + def depts(self, request, *args, **kwargs): + """ + 聚合 + """ + obj = self.get_object() + serializer = OrganizationSimpleSerializer(obj.depts.distinct(), many=True) + return Response(serializer.data) + +class RecordViewSet(OptimizationMixin,PageOrNot, CreateUpdateCustomMixin, ModelViewSet): + perms_map = {'get': '*', 'post': 'record_create', + 'put': 'record_update', 'delete': 'record_delete'} queryset = Record.objects.all() serializer_class = RecordSerializer search_fields = ['content','task','up_date','state'] ordering = ['-create_time'] - def get_queryset(self): - queryset = self.queryset - if hasattr(self.get_serializer_class(), 'setup_eager_loading'): - queryset = self.get_serializer_class().setup_eager_loading(queryset) # 性能优化 - return queryset + filterset_fields = ['content', 'belong_dept']