From 9c3190cad6443b8e4d8f3d3ff3eb3507170cf7ab Mon Sep 17 00:00:00 2001 From: caoqianming Date: Mon, 15 Mar 2021 14:20:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E4=B8=8A=E6=8A=A5=E8=AE=B0?= =?UTF-8?q?=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/api/task.js | 8 ++ client/src/main.js | 4 +- client/src/router/index.js | 16 ++- client/src/styles/index.scss | 16 +-- client/src/views/supervision/task.vue | 11 +- client/src/views/supervision/taskdo.vue | 122 ++++++++++++++++++ client/src/views/supervision/taskinit.vue | 65 ++++++++++ .../migrations/0007_auto_20210315_1412.py | 43 ++++++ server/apps/supervision/serializers.py | 15 ++- server/apps/supervision/views.py | 28 ++++ server/apps/system/serializers.py | 10 ++ server/apps/system/views.py | 1 + 12 files changed, 313 insertions(+), 26 deletions(-) create mode 100644 client/src/views/supervision/taskinit.vue create mode 100644 server/apps/supervision/migrations/0007_auto_20210315_1412.py diff --git a/client/src/api/task.js b/client/src/api/task.js index 0b3e702..f59f436 100644 --- a/client/src/api/task.js +++ b/client/src/api/task.js @@ -40,3 +40,11 @@ export function deletetask(id, data) { }) } +export function inittask(id, data) { + return request({ + url: `/supervision/task/${id}/init/`, + method: 'post', + data + }) +} + diff --git a/client/src/main.js b/client/src/main.js index 6021d6d..42a48f8 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -33,10 +33,10 @@ if (process.env.NODE_ENV === 'production') { Vue.use(ElementUI, { size: 'medium' }) Vue.config.productionTip = false -Vue.prototype.openLoading = function() { +Vue.prototype.openLoading = function(msg) { const loading = this.$loading({ // 声明一个loading对象 lock: true, // 是否锁屏 - text: '正在加载...', // 加载动画的文字 + text: msg, // 加载动画的文字 body: true, }) setTimeout(function () { // 设定定时器,超时5S后自动关闭遮罩层,避免请求失败时,遮罩层一直存在的问题 diff --git a/client/src/router/index.js b/client/src/router/index.js index d114a99..ebd52db 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -110,7 +110,7 @@ export const asyncRoutes = [ { path: '/supervision', component: Layout, - redirect: '/supervision/content', + redirect: '/supervision/task', name:'Supervision', meta: { title: '日常监督', icon: 'table', perms: ['supervision_manage'] }, children: [ @@ -122,10 +122,18 @@ export const asyncRoutes = [ }, { path: 'task', - name: 'STask', + name: 'Task', component: () => import('@/views/supervision/task.vue'), - meta: { title: '报送任务', icon: 'guide', perms: ['task_manage'] } - }] + meta: { title: '报送任务', icon: 'guide', perms: ['task_view'] } + }, + { + path: 'taskdo/:id', + name: 'Taskdo', + component: () => import('@/views/supervision/taskdo.vue'), + meta: { title: '报送任务执行', perms: ['task_view'] }, + hidden: true + }, + ] }, { diff --git a/client/src/styles/index.scss b/client/src/styles/index.scss index 5a9eff0..884d326 100644 --- a/client/src/styles/index.scss +++ b/client/src/styles/index.scss @@ -75,6 +75,7 @@ div:focus { border-radius: 0px; overflow: hidden; } + .el-card__body { padding: 6px; } @@ -90,18 +91,14 @@ div:focus { .el-dialog__body { padding: 8px 12px; } -// .el-form-item--medium .el-form-item__label { -// line-height: 16px; -// } + .el-form--label-top .el-form-item__label { line-height: 16px; } .el-button+.el-button { margin-left: 1px; } -.el-button { - border-radius: 0px; -} + .el-table--medium td,   .el-table--medium th { @@ -111,9 +108,4 @@ div:focus { margin-bottom: 16px; } -.el-card__body { - padding: 10px; -} -.el-card__header { - padding: 10px; -} + diff --git a/client/src/views/supervision/task.vue b/client/src/views/supervision/task.vue index 145f371..a5570ee 100644 --- a/client/src/views/supervision/task.vue +++ b/client/src/views/supervision/task.vue @@ -76,8 +76,8 @@ type="primary" :disabled="!checkPermission(['task_view'])" size="small" - @click="handleDetail(scope)" - >详情 + @click="handleDo(scope)" + >执行 { console.error(err); }); - }, - handleDetail(scope){ - }, async confirm(form) { this.$refs[form].validate((valid) => { @@ -253,6 +253,7 @@ export default { if (res.code >= 200) { this.getList(); this.dialogVisible = false; + this.$router.push({name: "Taskdo", params: { id: res.data.id }, }) this.$message.success("成功"); } }); diff --git a/client/src/views/supervision/taskdo.vue b/client/src/views/supervision/taskdo.vue index e69de29..5e45535 100644 --- a/client/src/views/supervision/taskdo.vue +++ b/client/src/views/supervision/taskdo.vue @@ -0,0 +1,122 @@ + + + \ No newline at end of file diff --git a/client/src/views/supervision/taskinit.vue b/client/src/views/supervision/taskinit.vue new file mode 100644 index 0000000..55277a0 --- /dev/null +++ b/client/src/views/supervision/taskinit.vue @@ -0,0 +1,65 @@ + + + \ No newline at end of file diff --git a/server/apps/supervision/migrations/0007_auto_20210315_1412.py b/server/apps/supervision/migrations/0007_auto_20210315_1412.py new file mode 100644 index 0000000..dd2a8e0 --- /dev/null +++ b/server/apps/supervision/migrations/0007_auto_20210315_1412.py @@ -0,0 +1,43 @@ +# Generated by Django 3.0.5 on 2021-03-15 06:12 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('system', '0008_auto_20210311_0919'), + ('supervision', '0006_auto_20210312_1440'), + ] + + operations = [ + migrations.RemoveField( + model_name='record', + name='belong_to', + ), + migrations.RemoveField( + model_name='task', + name='belong_to', + ), + migrations.AddField( + model_name='record', + name='belong_dept', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='record_belong_dept', to='system.Organization', verbose_name='所属部门'), + ), + migrations.AddField( + model_name='record', + name='up_date', + field=models.DateField(blank=True, null=True, verbose_name='上报时间'), + ), + migrations.AddField( + model_name='task', + name='belong_dept', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='task_belong_dept', to='system.Organization', verbose_name='所属部门'), + ), + migrations.AlterField( + model_name='task', + name='is_self', + field=models.BooleanField(default=False, verbose_name='是否主动报送'), + ), + ] diff --git a/server/apps/supervision/serializers.py b/server/apps/supervision/serializers.py index ff2c429..ddca03b 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -1,6 +1,7 @@ +from django.db.models.base import Model from rest_framework import serializers from .models import * -from apps.system.serializers import OrganizationSerializer +from apps.system.serializers import OrganizationSimpleSerializer, UserSimpleSerializer class ContentSerializer(serializers.ModelSerializer): type_ = serializers.SerializerMethodField() @@ -23,9 +24,17 @@ class ContentSerializer(serializers.ModelSerializer): class TaskCreateUpdateSerializer(serializers.ModelSerializer): class Meta: model = Task - fields = ['name', 'end_date', 'note'] + fields = ['name', 'end_date', 'note', 'id'] class TaskListSerializer(serializers.ModelSerializer): class Meta: model = Task - fields = ['name', 'is_self', 'end_date', 'note', 'complete_rate', 'state'] \ No newline at end of file + fields = ['name', 'is_self', 'end_date', 'note', 'complete_rate', 'state', 'id'] + + +class TaksDetailSerializer(serializers.ModelSerializer): + create_by_ = UserSimpleSerializer(source='create_by', read_only = True) + belong_dept_ = OrganizationSimpleSerializer(source='belong_dept', read_only=True) + class Meta: + model = Task + fields = '__all__' \ No newline at end of file diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index fa9e169..8752b3a 100644 --- a/server/apps/supervision/views.py +++ b/server/apps/supervision/views.py @@ -36,6 +36,8 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): 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'}) @@ -47,4 +49,30 @@ class TaskViewSet(CreateUpdateCustomMixin, ModelViewSet): serializer.is_valid(raise_exception=True) 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): + """ + 初始化任务,生成记录 + """ + obj = self.get_object() + depts = request.data['depts'] + contents = request.data['contents'] + if depts and contents: + record_list = [] + for m in depts: + for n in contents: + data={} + data['content'] = Content.objects.get(pk=n) + data['belong_dept'] = Organization.objects.get(pk=m) + data['task'] = obj + data['end_date'] = obj.end_date + data['create_by'] = request.user + record_list.append(Record(**data)) + Record.objects.bulk_create(record_list) + obj.state = '执行中' + obj.save() + return Response(status=status.HTTP_200_OK) + return Response('单位或清单不能为空', status=status.HTTP_400_BAD_REQUEST) + \ No newline at end of file diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py index ee6cdf5..d8e3294 100644 --- a/server/apps/system/serializers.py +++ b/server/apps/system/serializers.py @@ -134,3 +134,13 @@ class UserCreateSerializer(serializers.ModelSerializer): if User.objects.filter(phone=phone): raise serializers.ValidationError('手机号已经被注册') return phone + +class UserSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = User + fields = ['id', 'name', 'username'] + +class OrganizationSimpleSerializer(serializers.ModelSerializer): + class Meta: + model = Organization + fields = ['id', 'name'] diff --git a/server/apps/system/views.py b/server/apps/system/views.py index 7701b31..b218405 100644 --- a/server/apps/system/views.py +++ b/server/apps/system/views.py @@ -198,6 +198,7 @@ class OrganizationViewSet(PageOrNot,ModelViewSet): serializer_class = OrganizationSerializer pagination_class = None search_fields = ['name'] + filterset_fields = ['pid','name'] ordering_fields = ['sort'] ordering = ['sort', 'pk']