cnas
This commit is contained in:
parent
77c776824d
commit
1661f3deeb
|
|
@ -7,6 +7,14 @@ export function getCMAList(query) {
|
||||||
params: query
|
params: query
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
export function getCNASList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/ability/cnas/',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function createCMA(data) {
|
export function createCMA(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/ability/cma/',
|
url: '/ability/cma/',
|
||||||
|
|
@ -34,4 +42,11 @@ export function importCMA(data) {
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data
|
data
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
export function importCNAS(data) {
|
||||||
|
return request({
|
||||||
|
url: `/ability/cnas/import/`,
|
||||||
|
method: 'post',
|
||||||
|
data
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
@ -41,7 +41,7 @@ Vue.prototype.openLoading = function() {
|
||||||
})
|
})
|
||||||
setTimeout(function () { // 设定定时器,超时5S后自动关闭遮罩层,避免请求失败时,遮罩层一直存在的问题
|
setTimeout(function () { // 设定定时器,超时5S后自动关闭遮罩层,避免请求失败时,遮罩层一直存在的问题
|
||||||
loading.close(); // 关闭遮罩层
|
loading.close(); // 关闭遮罩层
|
||||||
},20000)
|
},50000)
|
||||||
return loading;
|
return loading;
|
||||||
}
|
}
|
||||||
new Vue({
|
new Vue({
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ export const constantRoutes = [
|
||||||
path: 'cma',
|
path: 'cma',
|
||||||
name: 'CMA',
|
name: 'CMA',
|
||||||
component: () => import('@/views/ability/cma'),
|
component: () => import('@/views/ability/cma'),
|
||||||
meta: { title: 'CMA检测能力', icon: 'table' }
|
meta: { title: '检测能力', icon: 'table' }
|
||||||
}]
|
}]
|
||||||
}
|
}
|
||||||
// {
|
// {
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,7 @@ service.interceptors.response.use(
|
||||||
duration: 5 * 1000
|
duration: 5 * 1000
|
||||||
})
|
})
|
||||||
|
|
||||||
// return Promise.reject(new Error(res.error || '请求出错'))
|
return Promise.reject(new Error(res.msg || '请求出错'))
|
||||||
} else {
|
} else {
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@
|
||||||
>刷新重置</el-button>
|
>刷新重置</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div style="margin-top:10px">
|
<div style="margin-top:10px">
|
||||||
<el-button type="primary" icon="el-icon-plus" @click="handleAdd" v-if="checkPermission(['cma_create'])">新增</el-button>
|
<!-- <el-button type="primary" icon="el-icon-plus" @click="handleAdd" v-if="checkPermission(['cma_create'])">新增</el-button> -->
|
||||||
<el-popover
|
<el-popover
|
||||||
placement="top"
|
placement="top"
|
||||||
width="160"
|
width="160"
|
||||||
|
|
@ -43,7 +43,28 @@
|
||||||
</el-upload>
|
</el-upload>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<el-button slot="reference">导入能力</el-button>
|
<el-button slot="reference">导入CMA能力</el-button>
|
||||||
|
</el-popover>
|
||||||
|
<el-popover
|
||||||
|
placement="top"
|
||||||
|
width="160"
|
||||||
|
v-if="checkPermission(['ability_import'])"
|
||||||
|
v-model="popovervisible2"
|
||||||
|
>
|
||||||
|
<p>导入能力列表压缩包.</p>
|
||||||
|
<div style="text-align: left; margin: 0;">
|
||||||
|
<el-upload
|
||||||
|
:action="upUrl"
|
||||||
|
:on-success="handleUploadSuccess2"
|
||||||
|
accept=".rar"
|
||||||
|
:headers="upHeaders"
|
||||||
|
:show-file-list ="false"
|
||||||
|
>
|
||||||
|
<el-button size="small" type="primary" @click="popovervisible2 = false">上传导入</el-button>
|
||||||
|
</el-upload>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<el-button slot="reference">导入CNAS能力</el-button>
|
||||||
</el-popover>
|
</el-popover>
|
||||||
</div>
|
</div>
|
||||||
<el-table
|
<el-table
|
||||||
|
|
@ -54,7 +75,7 @@
|
||||||
fit
|
fit
|
||||||
stripe
|
stripe
|
||||||
highlight-current-row
|
highlight-current-row
|
||||||
max-height="600"
|
max-height="260"
|
||||||
>
|
>
|
||||||
<el-table-column type="index" width="50" />
|
<el-table-column type="index" width="50" />
|
||||||
<el-table-column align="center" label="大类名称">
|
<el-table-column align="center" label="大类名称">
|
||||||
|
|
@ -109,6 +130,60 @@
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<el-table
|
||||||
|
v-loading="listLoading2"
|
||||||
|
:data="cnasList.results"
|
||||||
|
style="width: 100%;margin-top:10px;"
|
||||||
|
border
|
||||||
|
fit
|
||||||
|
stripe
|
||||||
|
highlight-current-row
|
||||||
|
max-height="260"
|
||||||
|
>
|
||||||
|
<el-table-column type="index" width="50" />
|
||||||
|
<el-table-column align="header-center" label="类别名称">
|
||||||
|
<template slot-scope="scope">{{ scope.row.lbmc }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="项目名称">
|
||||||
|
<template slot-scope="scope">{{ scope.row.xmmc }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="标准名称">
|
||||||
|
<template slot-scope="scope">{{ scope.row.bzmc }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="标准编号">
|
||||||
|
<template slot-scope="scope">{{ scope.row.bzbh }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="header-center" label="所属中心">
|
||||||
|
<template slot-scope="scope">{{ scope.row.sszx }}</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column align="center" label="操作">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<el-button
|
||||||
|
:disabled="!checkPermission(['cnas_update'])"
|
||||||
|
type="primary"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-edit"
|
||||||
|
@click="handleEdit(scope)"
|
||||||
|
/>
|
||||||
|
<el-button
|
||||||
|
:disabled="!checkPermission(['cnas_delete'])"
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
icon="el-icon-delete"
|
||||||
|
@click="handleDelete(scope)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="cnasList.count>0"
|
||||||
|
:total="cnasList.count"
|
||||||
|
:page.sync="listQuery2.page"
|
||||||
|
:limit.sync="listQuery2.page_size"
|
||||||
|
@pagination="getList2"
|
||||||
|
/>
|
||||||
|
|
||||||
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'编辑':'新增'">
|
<el-dialog :visible.sync="dialogVisible" :title="dialogType==='edit'?'编辑':'新增'">
|
||||||
<el-form ref="Form" :model="cma" label-width="80px" label-position="right" >
|
<el-form ref="Form" :model="cma" label-width="80px" label-position="right" >
|
||||||
<el-form-item label="姓名" prop="name">
|
<el-form-item label="姓名" prop="name">
|
||||||
|
|
@ -126,7 +201,7 @@
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
import { getCMAList, createCMA, deleteCMA, updateCMA, importCMA } from "@/api/cma";
|
import { getCMAList, createCMA, deleteCMA, updateCMA, importCMA, getCNASList, importCNAS } from "@/api/cma";
|
||||||
import checkPermission from "@/utils/permission"
|
import checkPermission from "@/utils/permission"
|
||||||
import { upUrl, upHeaders } from "@/api/file"
|
import { upUrl, upHeaders } from "@/api/file"
|
||||||
import Pagination from "@/components/Pagination" // secondary package based on el-pagination
|
import Pagination from "@/components/Pagination" // secondary package based on el-pagination
|
||||||
|
|
@ -144,11 +219,16 @@ export default {
|
||||||
upHeaders: upHeaders(),
|
upHeaders: upHeaders(),
|
||||||
upUrl: upUrl(),
|
upUrl: upUrl(),
|
||||||
cmaList: {count:0},
|
cmaList: {count:0},
|
||||||
|
cnasList: {count:0},
|
||||||
listLoading: true,
|
listLoading: true,
|
||||||
listQuery: {
|
listQuery: {
|
||||||
page: 1,
|
page: 1,
|
||||||
page_size: 20
|
page_size: 20
|
||||||
},
|
},
|
||||||
|
listQuery2: {
|
||||||
|
page: 1,
|
||||||
|
page_size: 20
|
||||||
|
},
|
||||||
enabledOptions: [
|
enabledOptions: [
|
||||||
{ key: "true", display_name: "激活" },
|
{ key: "true", display_name: "激活" },
|
||||||
{ key: "false", display_name: "禁用" }
|
{ key: "false", display_name: "禁用" }
|
||||||
|
|
@ -156,33 +236,41 @@ export default {
|
||||||
dialogVisible: false,
|
dialogVisible: false,
|
||||||
dialogType: "new",
|
dialogType: "new",
|
||||||
popovervisible: false,
|
popovervisible: false,
|
||||||
|
popovervisible2: false,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {},
|
computed: {},
|
||||||
watch: {},
|
watch: {
|
||||||
|
},
|
||||||
created() {
|
created() {
|
||||||
this.getList()
|
this.getList()
|
||||||
|
this.getList2()
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
checkPermission,
|
checkPermission,
|
||||||
handleUploadSuccess(res, file) {
|
handleUploadSuccess(res, file) {
|
||||||
if (res.code >= 200) {
|
|
||||||
const loading = this.openLoading()
|
const loading = this.openLoading()
|
||||||
let data = {path:res.data.path}
|
let data = {path:res.data.path}
|
||||||
importCMA(data).then(res=>{
|
importCMA(data).then(res=>{
|
||||||
if(res.code >= 200){
|
|
||||||
this.$message({
|
this.$message({
|
||||||
message: '导入成功',
|
message: '导入成功',
|
||||||
type: 'success'
|
type: 'success'
|
||||||
})
|
})
|
||||||
loading.close()
|
loading.close()
|
||||||
this.resetFilter()
|
this.resetFilter()
|
||||||
}
|
}).catch(error=>{loading.close()})
|
||||||
|
},
|
||||||
|
handleUploadSuccess2(res, file) {
|
||||||
|
const loading = this.openLoading()
|
||||||
|
let data = {path:res.data.path}
|
||||||
|
importCNAS(data).then(res=>{
|
||||||
|
this.$message({
|
||||||
|
message: '导入成功',
|
||||||
|
type: 'success'
|
||||||
})
|
})
|
||||||
|
loading.close()
|
||||||
}else{
|
this.resetFilter()
|
||||||
this.$message.error("解析失败!");
|
}).catch(error=>{loading.close()})
|
||||||
}
|
|
||||||
},
|
},
|
||||||
getList() {
|
getList() {
|
||||||
this.listLoading = true;
|
this.listLoading = true;
|
||||||
|
|
@ -193,16 +281,33 @@ export default {
|
||||||
this.listLoading = false
|
this.listLoading = false
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
getList2() {
|
||||||
|
this.listLoading2 = true;
|
||||||
|
getCNASList(this.listQuery2).then(response => {
|
||||||
|
if (response.data) {
|
||||||
|
this.cnasList = response.data
|
||||||
|
}
|
||||||
|
this.listLoading2 = false
|
||||||
|
})
|
||||||
|
},
|
||||||
resetFilter() {
|
resetFilter() {
|
||||||
this.listQuery = {
|
this.listQuery = {
|
||||||
page: 1,
|
page: 1,
|
||||||
page_size: 20
|
page_size: 20
|
||||||
}
|
}
|
||||||
|
this.listQuery2 = {
|
||||||
|
page: 1,
|
||||||
|
page_size: 20
|
||||||
|
}
|
||||||
this.getList()
|
this.getList()
|
||||||
|
this.getList2()
|
||||||
},
|
},
|
||||||
handleFilter() {
|
handleFilter() {
|
||||||
this.listQuery.page = 1
|
this.listQuery.page = 1
|
||||||
this.getList()
|
this.getList()
|
||||||
|
this.listQuery2.page = 1
|
||||||
|
this.listQuery2.search = this.listQuery.search
|
||||||
|
this.getList2()
|
||||||
},
|
},
|
||||||
handleAdd() {
|
handleAdd() {
|
||||||
this.cma = Object.assign({}, defaultCMA)
|
this.cma = Object.assign({}, defaultCMA)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,31 @@
|
||||||
|
# Generated by Django 3.0.5 on 2020-06-08 07:04
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.utils.timezone
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ability', '0004_auto_20200602_1715'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='CNAS',
|
||||||
|
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='删除标记')),
|
||||||
|
('lbmc', models.CharField(blank=True, max_length=200, null=True, verbose_name='类别名称')),
|
||||||
|
('xmmc', models.CharField(blank=True, max_length=200, null=True, verbose_name='项目名称')),
|
||||||
|
('bzmc', models.CharField(blank=True, max_length=400, null=True, verbose_name='标准名称')),
|
||||||
|
('bzbh', models.CharField(blank=True, max_length=400, null=True, verbose_name='标准编号')),
|
||||||
|
('sszx', models.TextField(blank=True, null=True, verbose_name='所属中心')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -17,3 +17,13 @@ class CMA(BaseModel):
|
||||||
xzfw = models.TextField('限制范围',null=True,blank=True)
|
xzfw = models.TextField('限制范围',null=True,blank=True)
|
||||||
bz = models.TextField('备注',null=True,blank=True)
|
bz = models.TextField('备注',null=True,blank=True)
|
||||||
sszx = models.TextField('所属中心',null=True,blank=True)
|
sszx = models.TextField('所属中心',null=True,blank=True)
|
||||||
|
|
||||||
|
class CNAS(BaseModel):
|
||||||
|
"""
|
||||||
|
CNAS检测能力表
|
||||||
|
"""
|
||||||
|
lbmc = models.CharField('类别名称', max_length=200,null=True,blank=True)
|
||||||
|
xmmc = models.CharField('项目名称', max_length=200,null=True,blank=True)
|
||||||
|
bzmc = models.CharField('标准名称', max_length=400,null=True,blank=True)
|
||||||
|
bzbh = models.CharField('标准编号', max_length=400,null=True,blank=True)
|
||||||
|
sszx = models.TextField('所属中心',null=True,blank=True)
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
from .models import CMA
|
from .models import CMA, CNAS
|
||||||
|
|
||||||
class CMASerializer(serializers.ModelSerializer):
|
class CMASerializer(serializers.ModelSerializer):
|
||||||
"""
|
"""
|
||||||
|
|
@ -7,4 +7,12 @@ class CMASerializer(serializers.ModelSerializer):
|
||||||
"""
|
"""
|
||||||
class Meta:
|
class Meta:
|
||||||
model = CMA
|
model = CMA
|
||||||
|
fields = '__all__'
|
||||||
|
|
||||||
|
class CNASSerializer(serializers.ModelSerializer):
|
||||||
|
"""
|
||||||
|
CNAS能力表序列化
|
||||||
|
"""
|
||||||
|
class Meta:
|
||||||
|
model = CNAS
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
@ -1,9 +1,10 @@
|
||||||
from django.urls import path, include
|
from django.urls import path, include
|
||||||
from rest_framework import routers
|
from rest_framework import routers
|
||||||
from .views import CMAViewSet
|
from .views import CMAViewSet, CNASViewSet
|
||||||
|
|
||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register('cma', CMAViewSet, basename="cma")
|
router.register('cma', CMAViewSet, basename="cma")
|
||||||
|
router.register('cnas', CNASViewSet, basename="cnas")
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include(router.urls))
|
path('', include(router.urls))
|
||||||
]
|
]
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from rest_framework.viewsets import ModelViewSet
|
from rest_framework.viewsets import ModelViewSet
|
||||||
from .models import CMA
|
from .models import CMA, CNAS
|
||||||
from .serializers import CMASerializer
|
from .serializers import CMASerializer, CNASSerializer
|
||||||
from rest_framework.decorators import action
|
from rest_framework.decorators import action
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
|
|
@ -43,6 +43,40 @@ class CMAViewSet(ModelViewSet):
|
||||||
import_cma(f, os.path.join(root,f))
|
import_cma(f, os.path.join(root,f))
|
||||||
return Response(status = status.HTTP_200_OK)
|
return Response(status = status.HTTP_200_OK)
|
||||||
|
|
||||||
|
class CNASViewSet(ModelViewSet):
|
||||||
|
"""
|
||||||
|
CNAS检测能力:增删改查
|
||||||
|
"""
|
||||||
|
perms_map = {'get': '*', 'post': 'cnas_create',
|
||||||
|
'put': 'cnas_update', 'delete': 'cnas_delete'}
|
||||||
|
queryset = CNAS.objects.all()
|
||||||
|
serializer_class = CNASSerializer
|
||||||
|
search_fields = ['bzbh', 'bzmc', 'sszx', 'xmmc']
|
||||||
|
ordering_fields = ['bzmc']
|
||||||
|
ordering = 'bzmc'
|
||||||
|
|
||||||
|
@action(methods=['post'], detail=False, url_path='import', url_name='cnas_import', perms_map = {'post':'cnas_import'})
|
||||||
|
def cnas_import(self, request, pk=None):
|
||||||
|
"""
|
||||||
|
导入能力
|
||||||
|
"""
|
||||||
|
filepath = request.data['path']
|
||||||
|
fullpath = settings.BASE_DIR + filepath
|
||||||
|
import os
|
||||||
|
if fullpath.endswith('.rar'):
|
||||||
|
rar = rarfile.RarFile(fullpath)
|
||||||
|
fulldir = fullpath.replace('.rar','')
|
||||||
|
os.mkdir(fulldir)
|
||||||
|
os.chdir(fulldir)
|
||||||
|
rar.extractall()
|
||||||
|
rar.close()
|
||||||
|
CNAS.objects.all().delete()
|
||||||
|
for root, dirs, files in os.walk(fulldir):
|
||||||
|
for f in files:
|
||||||
|
if f.endswith('.xls'):
|
||||||
|
return Response('不支持旧xls格式', status = status.HTTP_400_BAD_REQUEST)
|
||||||
|
import_cnas(f, os.path.join(root,f))
|
||||||
|
return Response(status = status.HTTP_200_OK)
|
||||||
|
|
||||||
def import_cma(filename, path):
|
def import_cma(filename, path):
|
||||||
wb = load_workbook(path)
|
wb = load_workbook(path)
|
||||||
|
|
@ -66,4 +100,22 @@ def import_cma(filename, path):
|
||||||
print(data)
|
print(data)
|
||||||
datalist.append(CMA(**data))
|
datalist.append(CMA(**data))
|
||||||
i = i + 1
|
i = i + 1
|
||||||
CMA.objects.bulk_create(datalist)
|
CMA.objects.bulk_create(datalist)
|
||||||
|
|
||||||
|
def import_cnas(filename, path):
|
||||||
|
wb = load_workbook(path)
|
||||||
|
sheet = wb.get_sheet_by_name('检测能力范围')
|
||||||
|
datalist = []
|
||||||
|
sszx = filename.replace('.xlsx','').replace('检测能力范围(含能源之星)-','')
|
||||||
|
i = 3
|
||||||
|
while sheet['l'+str(i)].value:
|
||||||
|
data = {}
|
||||||
|
data['lbmc'] = sheet['b'+str(i)].value
|
||||||
|
data['xmmc'] = sheet['g'+str(i)].value
|
||||||
|
data['bzmc'] = sheet['l'+str(i)].value
|
||||||
|
data['bzbh'] = sheet['n'+str(i)].value
|
||||||
|
data['sszx'] = sszx
|
||||||
|
print(data)
|
||||||
|
datalist.append(CNAS(**data))
|
||||||
|
i = i + 1
|
||||||
|
CNAS.objects.bulk_create(datalist)
|
||||||
Binary file not shown.
|
|
@ -3,4 +3,4 @@ from rest_framework.pagination import PageNumberPagination
|
||||||
|
|
||||||
class MyPagination(PageNumberPagination):
|
class MyPagination(PageNumberPagination):
|
||||||
page_size = 10
|
page_size = 10
|
||||||
page_size_query_param = 'limit'
|
page_size_query_param = 'page_size'
|
||||||
Loading…
Reference in New Issue