diff --git a/client/src/api/laboratory.js b/client/src/api/laboratory.js new file mode 100644 index 0000000..f2dafa4 --- /dev/null +++ b/client/src/api/laboratory.js @@ -0,0 +1,73 @@ +import request from '@/utils/request' + +export function getDetectOrgList(query) { + return request({ + url: '/laboratory/detectorg/', + method: 'get', + params: query + }) +} +export function getDetectOrg(id) { + return request({ + url: `/laboratory/detectorg/${id}/`, + method: 'get' + }) +} +export function createDetectOrg(data) { + return request({ + url: '/laboratory/detectorg/', + method: 'post', + data + }) +} + +export function updateDetectOrg(id, data) { + return request({ + url: `/laboratory/detectorg/${id}/`, + method: 'put', + data + }) +} + +export function deleteDetectOrg(id) { + return request({ + url: `/laboratory/detectorg/${id}/`, + method: 'delete' + }) +} + +export function getDetectOrgNoticeList(query) { + return request({ + url: '/laboratory/detectorgnotice/', + method: 'get', + params: query + }) +} +export function getDetectOrgNotice(id) { + return request({ + url: `/laboratory/detectorgnotice/${id}/`, + method: 'get' + }) +} +export function createDetectOrgNotice(data) { + return request({ + url: '/laboratory/detectorgnotice/', + method: 'post', + data + }) +} + +export function updateDetectOrgNotice(id, data) { + return request({ + url: `/laboratory/detectorgnotice/${id}/`, + method: 'put', + data + }) +} + +export function deleteDetectOrgNotice(id) { + return request({ + url: `/laboratory/detectorgnotice/${id}/`, + method: 'delete' + }) +} diff --git a/client/src/router/index.js b/client/src/router/index.js index 77fb73f..cd62237 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -235,6 +235,29 @@ export const asyncRoutes = [ }, ] }, + { + path: '/detectorg', + component: Layout, + redirect: '/detectorg/detectorg', + name: 'detectorg', + meta: { title: '实验室管理', icon: 'example' }, + children: [ + + { + path: 'detectorg', + name: 'DetectOrg', + component: () => import('@/views/detectorg/detectorg'), + meta: { title: '实验室信息', icon: 'example', perms: ['detectorg_manage'] } + }, + { + path: 'detectorgnotice', + name: 'DetectOrgNotice', + component: () => import('@/views/detectorg/detectorgnotice'), + meta: { title: '实验室通知公告', icon: 'example', perms: ['detectorg_manage'] } + }, + + ] + }, { path: '/system', component: Layout, diff --git a/client/src/views/detectorg/detectorg.vue b/client/src/views/detectorg/detectorg.vue new file mode 100644 index 0000000..23dcbc8 --- /dev/null +++ b/client/src/views/detectorg/detectorg.vue @@ -0,0 +1,269 @@ + + diff --git a/client/src/views/detectorg/detectorgnotice.vue b/client/src/views/detectorg/detectorgnotice.vue new file mode 100644 index 0000000..757b615 --- /dev/null +++ b/client/src/views/detectorg/detectorgnotice.vue @@ -0,0 +1,335 @@ + + diff --git a/client/src/views/employee/trainupdate.vue b/client/src/views/employee/trainupdate.vue index 1eaea28..07c95c3 100644 --- a/client/src/views/employee/trainupdate.vue +++ b/client/src/views/employee/trainupdate.vue @@ -55,7 +55,7 @@ - + 选择 diff --git a/client/src/views/employee/userselet.vue b/client/src/views/employee/userselet.vue index 68d910d..6883129 100644 --- a/client/src/views/employee/userselet.vue +++ b/client/src/views/employee/userselet.vue @@ -166,7 +166,7 @@ methods: { , handleOrgClick(obj, node, vue) { this.listQuery.page = 1; - this.listQuery.dept = obj.id; + this.listQuery.user__dept = obj.id; this.getStaffList(); }, getStaffList() { diff --git a/server/apps/laboratory/migrations/0001_initial.py b/server/apps/laboratory/migrations/0001_initial.py new file mode 100644 index 0000000..da4c9e2 --- /dev/null +++ b/server/apps/laboratory/migrations/0001_initial.py @@ -0,0 +1,45 @@ +# Generated by Django 3.0.5 on 2020-08-10 06:57 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('system', '0028_auto_20200807_1018'), + ] + + operations = [ + migrations.CreateModel( + name='DetectOrg', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('code', models.CharField(max_length=100, unique=True, verbose_name='实验室编号')), + ('name', models.CharField(blank=True, max_length=200, null=True, unique=True, verbose_name='实验室名称')), + ('address', models.CharField(blank=True, max_length=500, null=True, verbose_name='通讯地址')), + ('contactman', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人')), + ('contactmanmoblie', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人手机')), + ('ontactManTel', models.CharField(blank=True, max_length=50, null=True, verbose_name='联系人电话')), + ('loginname', models.CharField(blank=True, max_length=50, null=True, verbose_name='登录名')), + ('password', models.CharField(blank=True, max_length=50, null=True, verbose_name='登录密码')), + ('note', models.CharField(blank=True, max_length=200, null=True, verbose_name='备注')), + ('iszy', models.BooleanField(default=True, verbose_name='是否自有')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorg_belong_dept', to='system.Organization', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorg_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorg_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '实验室信息', + 'verbose_name_plural': '实验室信息', + }, + ), + ] diff --git a/server/apps/laboratory/migrations/0002_auto_20200811_1024.py b/server/apps/laboratory/migrations/0002_auto_20200811_1024.py new file mode 100644 index 0000000..261ae34 --- /dev/null +++ b/server/apps/laboratory/migrations/0002_auto_20200811_1024.py @@ -0,0 +1,23 @@ +# Generated by Django 3.0.5 on 2020-08-11 02:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('laboratory', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='detectorg', + name='code', + field=models.CharField(max_length=100, verbose_name='实验室编号'), + ), + migrations.AlterField( + model_name='detectorg', + name='name', + field=models.CharField(blank=True, max_length=200, null=True, verbose_name='实验室名称'), + ), + ] diff --git a/server/apps/laboratory/migrations/0003_detectorgnotice.py b/server/apps/laboratory/migrations/0003_detectorgnotice.py new file mode 100644 index 0000000..41c9046 --- /dev/null +++ b/server/apps/laboratory/migrations/0003_detectorgnotice.py @@ -0,0 +1,41 @@ +# Generated by Django 3.0.5 on 2020-08-12 00:59 + +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 = [ + ('system', '0028_auto_20200807_1018'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('laboratory', '0002_auto_20200811_1024'), + ] + + operations = [ + migrations.CreateModel( + name='DetectOrgNotice', + fields=[ + ('id', models.AutoField(auto_created=True, 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='删除标记')), + ('name', models.CharField(blank=True, max_length=500, null=True, verbose_name='公告标题')), + ('publishdate', models.DateField(verbose_name='发布时间')), + ('ismportant', models.BooleanField(default=True, verbose_name='是否重要公告')), + ('note', models.CharField(blank=True, max_length=6000, null=True, verbose_name='公告内容')), + ('isalluser', models.BooleanField(default=True, verbose_name='是否通知全员')), + ('path', models.CharField(blank=True, max_length=1000, null=True, verbose_name='文件地址')), + ('belong_dept', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorgnotice_belong_dept', to='system.Organization', verbose_name='所属部门')), + ('create_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorgnotice_create_by', to=settings.AUTH_USER_MODEL, verbose_name='创建人')), + ('dettonotice', models.ManyToManyField(blank=True, related_name='detectorgnotice_dettonotice', to='laboratory.DetectOrg', verbose_name='选择的实验室')), + ('update_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='detectorgnotice_update_by', to=settings.AUTH_USER_MODEL, verbose_name='最后编辑人')), + ], + options={ + 'verbose_name': '实验室通知公告', + 'verbose_name_plural': '实验室通知公告', + }, + ), + ] diff --git a/server/apps/laboratory/migrations/0004_auto_20200812_1516.py b/server/apps/laboratory/migrations/0004_auto_20200812_1516.py new file mode 100644 index 0000000..4b13de4 --- /dev/null +++ b/server/apps/laboratory/migrations/0004_auto_20200812_1516.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.5 on 2020-08-12 07:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('laboratory', '0003_detectorgnotice'), + ] + + operations = [ + migrations.AlterField( + model_name='detectorgnotice', + name='publishdate', + field=models.DateTimeField(verbose_name='发布时间'), + ), + ] diff --git a/server/apps/laboratory/models.py b/server/apps/laboratory/models.py index f5d8266..2ea5c56 100644 --- a/server/apps/laboratory/models.py +++ b/server/apps/laboratory/models.py @@ -6,8 +6,8 @@ import uuid # Create your models here. class DetectOrg(CommonBModel): - code = models.CharField('实验室编号',unique=True, max_length=100) - name = models.CharField('实验室名称',null=True,unique=True, blank=True,max_length=200) + code = models.CharField('实验室编号', max_length=100) + name = models.CharField('实验室名称',null=True, blank=True,max_length=200) address = models.CharField('通讯地址',null=True, blank=True,max_length=500) contactman = models.CharField('联系人',null=True, blank=True,max_length=50) contactmanmoblie = models.CharField('联系人手机',null=True, blank=True,max_length=50) @@ -22,4 +22,19 @@ class DetectOrg(CommonBModel): def __str__(self): return self.name +class DetectOrgNotice(CommonBModel): + + name = models.CharField('公告标题',null=True, blank=True,max_length=500) + publishdate = models.DateTimeField('发布时间') + ismportant = models.BooleanField('是否重要公告', default=True) + note = models.CharField('公告内容',null=True, blank=True,max_length=6000) + isalluser = models.BooleanField('是否通知全员', default=True) + path = models.CharField('文件地址', max_length=1000, null=True, blank=True) + dettonotice = models.ManyToManyField(DetectOrg, blank=True, verbose_name='选择的实验室', related_name= 'detectorgnotice_dettonotice') + class Meta: + verbose_name = '实验室通知公告' + verbose_name_plural = verbose_name + + def __str__(self): + return self.name diff --git a/server/apps/laboratory/serializers.py b/server/apps/laboratory/serializers.py index 665aced..8109a72 100644 --- a/server/apps/laboratory/serializers.py +++ b/server/apps/laboratory/serializers.py @@ -1,6 +1,6 @@ from rest_framework import serializers -from .models import DetectOrg +from .models import DetectOrg,DetectOrgNotice from apps.system.serializers import DictSerializer @@ -8,6 +8,12 @@ class DetectOrgSerializer(serializers.ModelSerializer): class Meta: model = DetectOrg fields = '__all__' - - - \ No newline at end of file +class DetectOrgNoticeSerializer(serializers.ModelSerializer): + class Meta: + model = DetectOrgNotice + fields = '__all__' +class DetectOrgNoticListSerializer(serializers.ModelSerializer): + dettonotice = DetectOrgSerializer(many=True) + class Meta: + model = DetectOrgNotice + fields = ['id','name','publishdate','ismportant','note','dettonotice','path'] diff --git a/server/apps/laboratory/urls.py b/server/apps/laboratory/urls.py index 7954688..038a0e2 100644 --- a/server/apps/laboratory/urls.py +++ b/server/apps/laboratory/urls.py @@ -1,9 +1,10 @@ from django.urls import path, include -from .views import DetectOrgViewSet +from .views import DetectOrgViewSet,DetectOrgNoticeViewSet from rest_framework import routers router = routers.DefaultRouter() -router.register('detectorg', DetectOrgViewSet, basename="enterprise") +router.register('detectorg', DetectOrgViewSet, basename="detectorg") +router.register('detectorgnotice', DetectOrgNoticeViewSet, basename="detectorgnotice") urlpatterns = [ path('', include(router.urls)) diff --git a/server/apps/laboratory/views.py b/server/apps/laboratory/views.py index 36ef520..aed05a7 100644 --- a/server/apps/laboratory/views.py +++ b/server/apps/laboratory/views.py @@ -1,9 +1,9 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet -from .models import DetectOrg +from .models import DetectOrg,DetectOrgNotice from utils.queryset import get_child_queryset2 -from .serializers import DetectOrgSerializer +from .serializers import DetectOrgSerializer,DetectOrgNoticeSerializer,DetectOrgNoticListSerializer from apps.system.permission_data import RbacFilterSet from apps.system.mixins import CreateUpdateCustomMixin, OptimizationMixin # Create your views here. @@ -13,6 +13,18 @@ class DetectOrgViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet) 'put': 'DetectOrg_update', 'delete': 'DetectOrg_delete'} queryset = DetectOrg.objects serializer_class = DetectOrgSerializer - search_fields = ['name','query_code', 'code'] + search_fields = ['name', 'code'] ordering = ['-create_time'] +class DetectOrgNoticeViewSet(CreateUpdateCustomMixin, OptimizationMixin, ModelViewSet): + perms_map = {'get': '*', 'post': 'DetectOrgNotice_create', + 'put': 'DetectOrgNotice_update', 'delete': 'DetectOrgNotice_delete'} + queryset = DetectOrgNotice.objects + serializer_class = DetectOrgNoticeSerializer + search_fields = ['name'] + ordering = ['-create_time'] + def get_serializer_class(self): + # 根据请求类型动态变更serializer + if self.action == 'list': + return DetectOrgNoticListSerializer + return DetectOrgNoticeSerializer diff --git a/server/server/settings.py b/server/server/settings.py index 29989cc..b7c853e 100644 --- a/server/server/settings.py +++ b/server/server/settings.py @@ -48,7 +48,8 @@ INSTALLED_APPS = [ 'apps.crm', 'apps.certset', 'apps.employee', - 'apps.project' + 'apps.project', + 'apps.laboratory' ] MIDDLEWARE = [ diff --git a/server/server/urls.py b/server/server/urls.py index 0f91123..35ecda9 100644 --- a/server/server/urls.py +++ b/server/server/urls.py @@ -36,6 +36,7 @@ urlpatterns = [ path('crm/', include('apps.crm.urls')), path('employee/', include('apps.employee.urls')), path('project/', include('apps.project.urls')), + path('laboratory/', include('apps.laboratory.urls')), path('docs/', include_docs_urls(title="接口文档", authentication_classes=[], permission_classes=[])), path('signature/', GenSignature.as_view(), name='gen_signature'),