diff --git a/client/src/api/task.js b/client/src/api/task.js index dc8eec0..f59f436 100644 --- a/client/src/api/task.js +++ b/client/src/api/task.js @@ -1,9 +1,7 @@ import request from '@/utils/request' - - -export function getTaskList(query) { +export function gettasklist(query) { return request({ url: '/supervision/task/', method: 'get', @@ -11,14 +9,14 @@ export function getTaskList(query) { }) } -export function getTask(id) { +export function gettask(id) { return request({ url: `/supervision/task/${id}/`, method: 'get' }) } -export function createTask(data) { +export function createtask(data) { return request({ url: '/supervision/task/', method: 'post', @@ -26,7 +24,7 @@ export function createTask(data) { }) } -export function updateTask(id, data) { +export function updatetask(id, data) { return request({ url: `/supervision/task/${id}/`, method: 'put', @@ -34,7 +32,7 @@ export function updateTask(id, data) { }) } -export function deleteTask(id, data) { +export function deletetask(id, data) { return request({ url: `/supervision/task/${id}/`, method: 'delete', @@ -42,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 a4aa91f..e82c31b 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: [ @@ -118,13 +118,13 @@ export const asyncRoutes = [ path: 'content', name: 'Content', component: () => import('@/views/supervision/content.vue'), - meta: { title: '资料清单', icon: 'documentation', perms: ['content_manage'] } + meta: { title: '材料清单', icon: 'documentation', perms: ['content_manage'] } }, { 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: 'record', @@ -139,6 +139,14 @@ export const asyncRoutes = [ component: () => import('@/views/supervision/report.vue'), meta: { title: '材料报送', icon: 'guide', perms: ['report_manage'] } } + , + { + 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/content.vue b/client/src/views/supervision/content.vue index d8a4dd6..00c4d0f 100644 --- a/client/src/views/supervision/content.vue +++ b/client/src/views/supervision/content.vue @@ -1,10 +1,10 @@ @@ -99,31 +98,6 @@ - \ 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 82aee5d..136b10a 100644 --- a/server/apps/supervision/serializers.py +++ b/server/apps/supervision/serializers.py @@ -1,6 +1,8 @@ +from django.db.models.base import Model from rest_framework import serializers from .models import * -from apps.system.serializers import OrganizationSerializer,FileListSerializer +from apps.system.serializers import OrganizationSerializer,FileListSerializer,UserSimpleSerializer,OrganizationSimpleSerializer + class ContentSerializer(serializers.ModelSerializer): type_ = serializers.SerializerMethodField() @@ -27,12 +29,12 @@ class ContentListSerializer(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'] + fields = ['name', 'is_self', 'end_date', 'note', 'complete_rate', 'state', 'id'] class RecordSerializer(serializers.ModelSerializer): files_ = FileListSerializer(source='files', many=True, read_only=True) task_ = TaskListSerializer(source='task') @@ -42,5 +44,9 @@ class RecordSerializer(serializers.ModelSerializer): fields = ('id', 'up_date', 'up_user', 'end_date', 'state', 'is_yes', 'note', 'noteb','content','content_','task_','task', 'files', 'files_') - - \ No newline at end of file +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__' diff --git a/server/apps/supervision/views.py b/server/apps/supervision/views.py index 2d481a5..d9039b7 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'}) def createself(self, request): @@ -46,6 +48,32 @@ 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) class RecordViewSet(CreateUpdateCustomMixin,ModelViewSet): perms_map = {'get': '*', 'post': 'record_create', 'put': 'record_update', 'delete': 'record_delete'} @@ -53,3 +81,5 @@ class RecordViewSet(CreateUpdateCustomMixin,ModelViewSet): serializer_class = RecordSerializer search_fields = ['name'] ordering = ['-create_time'] + + diff --git a/server/apps/system/serializers.py b/server/apps/system/serializers.py index 7e869f2..b4ae652 100644 --- a/server/apps/system/serializers.py +++ b/server/apps/system/serializers.py @@ -138,3 +138,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']