diff --git a/client/.env.production b/client/.env.production index 48f348a..a6dc4c1 100644 --- a/client/.env.production +++ b/client/.env.production @@ -2,5 +2,5 @@ ENV = 'production' # base api -VUE_APP_BASE_API = 'http://116.63.176.211:8035' +VUE_APP_BASE_API = 'http://116.63.176.211:8036/api' diff --git a/client/src/api/qualification.js b/client/src/api/qualification.js new file mode 100644 index 0000000..52df95b --- /dev/null +++ b/client/src/api/qualification.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +export function getQualificationList(query) { + return request({ + url: '/ability/qualification/', + method: 'get', + params: query + }) +} +export function getQualificationGroup(query) { + return request({ + url: '/ability/qualification/group/', + method: 'get', + params: query + }) +} + +export function getCNASList(query) { + return request({ + url: '/ability/cnas/', + method: 'get', + params: query + }) +} + +export function createQualification(data) { + return request({ + url: '/ability/qualification/', + method: 'post', + data + }) +} +export function updateQualification(id, data) { + return request({ + url: `/ability/qualification/${id}/`, + method: 'put', + data + }) +} +export function deleteQualification(id) { + return request({ + url: `/ability/qualification/${id}/`, + method: 'delete' + }) +} + +export function importQualification(data) { + return request({ + url: `/ability/qualification/import/`, + method: 'post', + data + }) +} \ No newline at end of file diff --git a/client/src/router/index.js b/client/src/router/index.js index fb66366..687313c 100644 --- a/client/src/router/index.js +++ b/client/src/router/index.js @@ -54,11 +54,22 @@ export const constantRoutes = [ }] }, { - path: '/', + path: '/qualification', + component: Layout, + redirect: '/qualification', + children: [{ + path: '', + name: 'Qualification', + component: () => import('@/views/ability/qualification'), + meta: { title: '资质检索', icon: 'table' } + }] + }, + { + path: '/cma2', component: Layout, redirect: '/cma2', children: [{ - path: 'cma2', + path: '', name: 'CMA2', component: () => import('@/views/ability/cma2'), meta: { title: '检测能力(分子公司)', icon: 'table' } diff --git a/client/src/views/ability/cma.vue b/client/src/views/ability/cma.vue index 65e251b..1c47532 100644 --- a/client/src/views/ability/cma.vue +++ b/client/src/views/ability/cma.vue @@ -209,6 +209,13 @@ + diff --git a/client/src/views/login/index.vue b/client/src/views/login/index.vue index 5be3575..b680fab 100644 --- a/client/src/views/login/index.vue +++ b/client/src/views/login/index.vue @@ -3,7 +3,7 @@
-

系统登陆

+

CTC能力检索

diff --git a/server/apps/ability/migrations/0009_qualification.py b/server/apps/ability/migrations/0009_qualification.py new file mode 100644 index 0000000..b9e685a --- /dev/null +++ b/server/apps/ability/migrations/0009_qualification.py @@ -0,0 +1,31 @@ +# Generated by Django 3.0.7 on 2020-08-17 06:14 + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('ability', '0008_auto_20200705_1222'), + ] + + operations = [ + migrations.CreateModel( + name='Qualification', + 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='删除标记')), + ('sszx', models.TextField(blank=True, null=True, verbose_name='所属中心')), + ('cma', models.TextField(blank=True, null=True, verbose_name='cma资质')), + ('cnas', models.TextField(blank=True, null=True, verbose_name='cnas资质')), + ('other', models.TextField(blank=True, null=True, verbose_name='检验检测相关其它资质')), + ('service', models.TextField(blank=True, null=True, verbose_name='主要检验检测服务')), + ], + options={ + 'abstract': False, + }, + ), + ] diff --git a/server/apps/ability/migrations/0010_cma_glzz.py b/server/apps/ability/migrations/0010_cma_glzz.py new file mode 100644 index 0000000..ebc947f --- /dev/null +++ b/server/apps/ability/migrations/0010_cma_glzz.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.7 on 2020-08-17 07:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ability', '0009_qualification'), + ] + + operations = [ + migrations.AddField( + model_name='cma', + name='glzz', + field=models.TextField(blank=True, null=True, verbose_name='关联资质'), + ), + ] diff --git a/server/apps/ability/models.py b/server/apps/ability/models.py index 8ca19a1..2b258f0 100644 --- a/server/apps/ability/models.py +++ b/server/apps/ability/models.py @@ -23,6 +23,7 @@ class CMA(BaseModel): sszx = models.TextField('所属中心',null=True,blank=True) type = models.CharField('所属类型', max_length=50, choices=type_choices, default='center') + glzz = models.TextField('关联资质', null=True, blank=True) class CNAS(BaseModel): """ @@ -33,4 +34,11 @@ class CNAS(BaseModel): bzmc = models.CharField('标准名称', max_length=400,null=True,blank=True) bzbh = models.CharField('标准编号', max_length=400,null=True,blank=True) bztk = models.CharField('标准条款', max_length=400,null=True,blank=True) - sszx = models.TextField('所属中心',null=True,blank=True) \ No newline at end of file + sszx = models.TextField('所属中心',null=True,blank=True) + +class Qualification(BaseModel): + sszx = models.TextField('所属中心', null=True, blank=True) + cma = models.TextField('cma资质', null=True, blank=True) + cnas = models.TextField('cnas资质', null=True, blank=True) + other = models.TextField('检验检测相关其它资质', null=True, blank=True) + service = models.TextField('主要检验检测服务', null=True, blank=True) \ No newline at end of file diff --git a/server/apps/ability/serializers.py b/server/apps/ability/serializers.py index 3efb87f..f3721ce 100644 --- a/server/apps/ability/serializers.py +++ b/server/apps/ability/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import CMA, CNAS +from .models import * class CMASerializer(serializers.ModelSerializer): """ @@ -15,4 +15,12 @@ class CNASSerializer(serializers.ModelSerializer): """ class Meta: model = CNAS + fields = '__all__' + +class QualificationSerializer(serializers.ModelSerializer): + """ + 资质能力序列化 + """ + class Meta: + model = Qualification fields = '__all__' \ No newline at end of file diff --git a/server/apps/ability/urls.py b/server/apps/ability/urls.py index b3ad105..2fbd263 100644 --- a/server/apps/ability/urls.py +++ b/server/apps/ability/urls.py @@ -1,10 +1,11 @@ from django.urls import path, include from rest_framework import routers -from .views import CMAViewSet, CNASViewSet +from .views import CMAViewSet, CNASViewSet, QualificationViewSet router = routers.DefaultRouter() router.register('cma', CMAViewSet, basename="cma") router.register('cnas', CNASViewSet, basename="cnas") +router.register('qualification', QualificationViewSet, basename="qualification") urlpatterns = [ path('', include(router.urls)) ] \ No newline at end of file diff --git a/server/apps/ability/views.py b/server/apps/ability/views.py index 5d4b806..9fd66d4 100644 --- a/server/apps/ability/views.py +++ b/server/apps/ability/views.py @@ -1,7 +1,7 @@ from django.shortcuts import render from rest_framework.viewsets import ModelViewSet -from .models import CMA, CNAS -from .serializers import CMASerializer, CNASSerializer +from .models import * +from .serializers import * from rest_framework.decorators import action from django.conf import settings from rest_framework import status @@ -19,8 +19,8 @@ class CMAViewSet(ModelViewSet): 'put': 'cma_update', 'delete': 'cma_delete'} queryset = CMA.objects.all() serializer_class = CMASerializer - search_fields = ['bzbh', 'bzmc', 'sszx', 'xmmc'] - filterset_fields = ['sszx', 'type'] + search_fields = ['bzbh', 'bzmc', 'sszx', 'xmmc', 'glzz'] + filterset_fields = ['sszx', 'type', 'glzz'] ordering_fields = ['xmxh'] ordering = 'sszx' @@ -35,7 +35,8 @@ class CMAViewSet(ModelViewSet): group_by = request.query_params.get('group_by') group_by_data = list(queryset.values(group_by).annotate(count=Count(group_by)).order_by(group_by)) for i in group_by_data: - ret.append({'text':i[group_by]+'('+str(i['count'])+')','value':i[group_by]}) + if i[group_by] and i['count']: + ret.append({'text':i[group_by]+'('+ str(i['count']) +')','value':i[group_by]}) return Response(ret) @action(methods=['post'], detail=False, url_path='import', url_name='cma_import', perms_map = {'post':'cma_import'}) @@ -108,6 +109,33 @@ class CMAViewSet(ModelViewSet): import_cma2(f.encode('cp437').decode('gbk'), os.path.join(root,f)) return Response(status = status.HTTP_200_OK) +class QualificationViewSet(ModelViewSet): + """ + 资质能力:增删改查 + """ + perms_map = {'get': '*', 'post': 'qualificaiton_create', + 'put': 'qualification_update', 'delete': 'qualification_delete'} + queryset = Qualification.objects.all() + serializer_class = QualificationSerializer + search_fields = ['cma', 'cnas', 'sszx', 'other', 'service'] + # ordering_fields = ['sszx'] + ordering = 'sszx' + + @action(methods=['get'], detail=False,url_name='qualification_group_by', perms_map = {'*':'*'}) + def group(self, request, pk=None): + """ + 聚合查询列 + """ + queryset = self.filter_queryset(self.get_queryset()) + ret = [] + if request.query_params.get('group_by', None): + group_by = request.query_params.get('group_by') + group_by_data = list(queryset.values(group_by).annotate(count=Count(group_by)).order_by(group_by)) + for i in group_by_data: + if i[group_by] and i['count']: + ret.append({'text':i[group_by]+'('+ str(i['count']) +')','value':i[group_by]}) + return Response(ret) + class CNASViewSet(ModelViewSet): """ CNAS检测能力:增删改查 @@ -224,6 +252,7 @@ def import_cma2(filename, path): CMA.objects.filter(sszx=sszx, type='sub').delete() i = 3 max_row = sheet.max_row + print(max_row) while i