¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="capacity-scope"> |
| | | <div> |
| | | <el-form :model="queryParams" ref="queryForm" size="small" :inline="true"> |
| | | <el-form-item label="èµè´¨åç§°" prop="nickName"> |
| | | <el-select v-model="queryParams.name" placeholder="éæ©èµè´¨åç§°" size="small" @change="refreshTable()"> |
| | | <el-option v-for="dict in dict.type.qualification_name" :key="dict.value" :label="dict.label" :value="dict.value"> |
| | | {{ dict.label }} |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" icon="el-icon-search" size="mini" @click="refreshTable">æ¥ è¯¢</el-button> |
| | | <el-button icon="el-icon-refresh" size="mini" @click="refresh">é ç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | | <div> |
| | | <el-row class="title"> |
| | | <el-col :span="12" style="text-align: left"> |
| | | <el-radio-group v-model="radio" @input="selectorSwitch" size="medium" fill="#409EFF"> |
| | | <el-radio-button :label="0">èµè´¨æç»</el-radio-button> |
| | | <el-radio-button :label="1">èµè´¨æ»è§</el-radio-button> |
| | | </el-radio-group> |
| | | </el-col> |
| | | <el-col :span="12" style="text-align: right;" v-if="radio===0"> |
| | | <el-button size="small" type="primary" @click="openAdd">èµè´¨æ´æ°</el-button> |
| | | <el-button size="small" icon="el-icon-delete" @click="handleDel">å é¤</el-button> |
| | | </el-col> |
| | | </el-row> |
| | | </div> |
| | | <div v-if="radio===0"> |
| | | <lims-table :tableData="tableData" :column="column" |
| | | :isSelection="true" :handleSelectionChange="handleSelectionChange" |
| | | :page="page" :tableLoading="tableLoading"></lims-table> |
| | | </div> |
| | | <div class="table" v-if="radio===1" v-loading="pageLoading" @scroll="scrollFn"> |
| | | <el-row :gutter="16"> |
| | | <el-col :span="6" v-for="(m,i) in list" :key="i" :xs="24" :sm="12" :md="8" :lg="6" :xl="6" style="margin-bottom: 16px;"> |
| | | <div class="table-item"> |
| | | <el-image style="width: 102px;height: 102px;margin-right: 20px;border-radius: 16px;" :src="process.env.VUE_APP_BASE_API+'/img/'+m.imageUrl"> |
| | | <div slot="error" class="image-error" style="width: 100px; |
| | | height: 100px; |
| | | border-radius: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | border: 1px solid #EEEEEE;"> |
| | | <i class="el-icon-picture-outline" style="font-size:30px;color:#666666;"></i> |
| | | </div> |
| | | </el-image> |
| | | <div class="table-item-right" style="flex: 1;font-size: 12px;color: #666666;"> |
| | | <p style="line-height: 26px;">èµè´¨åç§°ï¼<span style="color: #3A7BFA;">{{ m.name }}</span></p> |
| | | <p style="line-height: 26px;">é¢åæ¶é´ï¼{{m.recentlyTime}}</p> |
| | | <p style="line-height: 26px;">å°ææ¶é´ï¼{{m.expireTime}}</p> |
| | | <p> |
| | | <span>ç¶æï¼</span> |
| | | <el-tag :type="m.state===0?'danger':'success'" size="small">{{ m.state===0?'失æ':'ææ' }}</el-tag> |
| | | </p> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <div v-if="list.length<1&&!pageLoading&&!isLoding" style="color:#909399;font-size:14px;text-align: center;margin-top:200px" >ææ æ°æ®</div> |
| | | <div v-if="list.length>0"> |
| | | <el-button v-if="isLoding" type="text" style="display: flex; margin: 0 auto; color: #909399"> |
| | | <i class="el-icon-loading" style="font-size:20px"></i> |
| | | </el-button> |
| | | <el-button type="text" v-if="finishLoding" style="display: flex; margin: 0 auto; color: #909399">å·²ç»æ²¡ææ´å¤å¦~</el-button> |
| | | </div> |
| | | </div> |
| | | <el-dialog title="èµè´¨æ´æ°" :visible.sync="qualificationsConnectVisible" width="400px"> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px"><span class="required-span">* </span>èµè´¨åç§°ï¼</div> |
| | | <div class="search_input"> |
| | | <el-select v-model="formData.name" placeholder="è¯·éæ©" style="width: 100%;" size="small" clearable> |
| | | <el-option |
| | | v-for="item in qualificationsList" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value"> |
| | | </el-option> |
| | | </el-select> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px"><span class="required-span">* </span>èµè´¨ç¼ç ï¼</div> |
| | | <div class="search_input"> |
| | | <el-input |
| | | size="small" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | v-model="formData.code"></el-input> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px"><span class="required-span">* </span>é¢åæºæï¼</div> |
| | | <div class="search_input"> |
| | | <el-input |
| | | size="small" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | v-model="formData.organization"></el-input> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px">èµè´¨è¯´æï¼</div> |
| | | <div class="search_input"> |
| | | <el-input |
| | | size="small" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | v-model="formData.explanation"></el-input> |
| | | </div> |
| | | </div> |
| | | |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px"><span class="required-span">* </span>é¢åæ¶é´ï¼</div> |
| | | <div class="search_input"> |
| | | <el-date-picker style="width:100%" v-model="formData.dateOfIssuance" |
| | | type="datetime" |
| | | size="small" |
| | | format="yyyy-MM-dd HH:mm:ss" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | placeholder="éæ©æ¥æ"> |
| | | </el-date-picker> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px"><span class="required-span">* </span>å°ææ¶é´ï¼</div> |
| | | <div class="search_input"> |
| | | <el-date-picker style="width:100%" v-model="formData.expireTime" |
| | | type="datetime" |
| | | size="small" |
| | | format="yyyy-MM-dd HH:mm:ss" |
| | | value-format="yyyy-MM-dd HH:mm:ss" |
| | | clearable |
| | | placeholder="éæ©æ¥æ"> |
| | | </el-date-picker> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px">èµè´¨å¾çï¼</div> |
| | | <div class="search_input"> |
| | | <el-upload |
| | | ref="upload" |
| | | :action="action" |
| | | :on-success="m=>handleSuccessUpImg(m,'imageUrl')" |
| | | accept='image/jpg,image/jpeg,image/png' |
| | | :multiple="false" |
| | | :limit="1" |
| | | :headers="headers" :on-change="beforeUpload" |
| | | :on-error="onError"> |
| | | <el-button slot="trigger" size="small" type="primary">éåå¾ç</el-button> |
| | | </el-upload> |
| | | </div> |
| | | </div> |
| | | <div class="search_thing" style="margin-bottom: 16px;"> |
| | | <div class="search_label" style="width:120px">èµè´¨éä»¶ï¼</div> |
| | | <div class="search_input"> |
| | | <el-upload |
| | | ref="upload1" |
| | | :action="action" |
| | | :on-success="m=>handleSuccessUpImg(m,'fileUrl')" |
| | | accept='image/jpg,image/jpeg,image/png,application/pdf,.doc,.docx' :headers="headers" :multiple="false" :limit="1" :on-change="beforeUpload1" |
| | | :on-error="onError1"> |
| | | <el-button slot="trigger" size="small" type="primary">éåæä»¶</el-button> |
| | | </el-upload> |
| | | </div> |
| | | </div> |
| | | <span slot="footer" class="dialog-footer"> |
| | | <el-button @click="qualificationsConnectVisible = false">å æ¶</el-button> |
| | | <el-button type="primary" @click="confirmQualifications" :loading="loading">ç¡® å®</el-button> |
| | | </span> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import limsTable from "@/components/Table/lims-table.vue"; |
| | | import {addCertificationDetail, delCertificationDetail, getCertificationDetail} from "@/api/structural/laboratory"; |
| | | |
| | | export default { |
| | | components: { |
| | | limsTable |
| | | }, |
| | | dicts: ['qualification_name'], |
| | | data() { |
| | | return { |
| | | radio: 0, |
| | | queryParams: { |
| | | name: '' |
| | | }, |
| | | tableData: [], |
| | | selection: [], |
| | | column: [ |
| | | {label: 'èµè´¨åç§°', prop: 'name'}, |
| | | {label: 'èµè´¨ç¼ç ', prop: 'code'}, |
| | | {label: 'é¢åæºæ', prop: 'organization'}, |
| | | {label: 'èµè´¨è¯´æ', prop: 'explanation'}, |
| | | {label: '馿¬¡é¢åæ¶é´', prop: 'firstIssuanceDate'}, |
| | | {label: 'æè¿é¢åæ¶é´', prop: 'latestIssuanceDate'}, |
| | | {label: 'å°æé¢åæ¶é´', prop: 'expireTime'}, |
| | | { |
| | | dataType: 'action', |
| | | fixed: 'right', |
| | | label: 'æä½', |
| | | operation: [ |
| | | { |
| | | name: 'éä»¶ä¸è½½', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | this.handleDownLoad(row); |
| | | }, |
| | | }, |
| | | ] |
| | | } |
| | | ], |
| | | page: { |
| | | total:0, |
| | | size:10, |
| | | current:0 |
| | | }, |
| | | tableLoading: false, |
| | | qualificationsList:[], |
| | | qualificationsConnectVisible:false, |
| | | formData:{}, |
| | | loading:false, |
| | | pageLoading:false, |
| | | isLoding: false, // å è½½ä¸ï¼loading徿 ,é»è®¤ä¸ºtrue |
| | | finishLoding: false, // å è½½å®æï¼æ¾ç¤ºå·²ç»æ²¡ææ´å¤äº |
| | | currentPage: 1, // å½å页 |
| | | pageSize: 16, // ä¸é¡µ16æ¡ |
| | | total: '', |
| | | list:[], |
| | | } |
| | | }, |
| | | computed: { |
| | | headers() { |
| | | return { |
| | | 'token': sessionStorage.getItem('token') |
| | | } |
| | | }, |
| | | action() { |
| | | return '' |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.refreshTable() |
| | | }, |
| | | methods: { |
| | | selectorSwitch(radio) { |
| | | if(radio === '1'){ |
| | | this.list = []; |
| | | this.refreshTable(); |
| | | } |
| | | }, |
| | | refreshTable() { |
| | | if (this.radio === '0') { |
| | | getCertificationDetail({...this.page,...this.queryParams,}).then(res => { |
| | | this.tableLoading = false |
| | | if (res.code === 200) { |
| | | this.tableData = res.data |
| | | this.page.total = res.total |
| | | } |
| | | }).catch(err => { |
| | | this.tableLoading = false |
| | | }) |
| | | } else { |
| | | if(this.currentPage>1){ |
| | | this.isLoding = true |
| | | }else{ |
| | | this.pageLoading = true |
| | | } |
| | | if(this.list.length===0){ |
| | | window.addEventListener("scroll", this.throttle(this.scrollFn, 20000)); |
| | | } |
| | | getCertificationDetail({ |
| | | page: { |
| | | current: this.currentPage, |
| | | size: this.pageSize |
| | | }, |
| | | entity: this.queryParams |
| | | }).then(res => { |
| | | if(res.code===200){ |
| | | this.total = res.data.body.total |
| | | let list = res.data.body.records; |
| | | if(list.length===0){ |
| | | this.finishLoding = true; |
| | | }else{ |
| | | if(list.length<this.pageSize){ |
| | | this.finishLoding = true; |
| | | } |
| | | this.list = this.list.concat(list) |
| | | if(this.total===this.list.length){ |
| | | this.finishLoding = true; |
| | | } |
| | | } |
| | | } |
| | | this.pageLoading = false |
| | | this.isLoding = false; |
| | | }).catch(err => { |
| | | this.pageLoading = false |
| | | this.isLoding = false; |
| | | }) |
| | | } |
| | | }, |
| | | // éç½® |
| | | refresh() { |
| | | this.queryParams.name = '' |
| | | this.page.size = 10 |
| | | this.page.current = 1 |
| | | this.refreshTable() |
| | | }, |
| | | // è¡¨æ ¼å¤é |
| | | handleSelectionChange (selection) { |
| | | this.selection = selection; |
| | | }, |
| | | // èµè´¨æç»æ¹éå é¤ |
| | | handleDel(){ |
| | | if (this.selection.length===0) { |
| | | this.$message.warning('è¯·éæ©è³å°ä¸æ¡æ°æ®') |
| | | return |
| | | } |
| | | const delIds = [] |
| | | this.selection.forEach(item => { |
| | | delIds.push(item.id) |
| | | }) |
| | | delCertificationDetail(delIds).then(res => { |
| | | if (res.code !== 200) return |
| | | this.refreshTable(); |
| | | this.$message.success('å 餿å') |
| | | }) |
| | | }, |
| | | // èµè´¨æç»éä»¶ä¸è½½ |
| | | handleDownLoad(row){ |
| | | // let url = row.fileUrl; |
| | | // const link = document.createElement('a'); |
| | | // link.href = this.javaApi + '/img/'+ url; |
| | | // document.body.appendChild(link); |
| | | // link.target = '_blank'; |
| | | // link.click(); |
| | | const url = process.env.VUE_APP_BASE_API + '/img/'+ row.fileUrl |
| | | this.$download.saveAs(url, row.fileUrl); |
| | | }, |
| | | openAdd() { |
| | | this.qualificationsConnectVisible = true; |
| | | this.$nextTick(()=>{ |
| | | this.$refs.upload.clearFiles() |
| | | this.$refs.upload1.clearFiles() |
| | | }) |
| | | this.formData = {}; |
| | | }, |
| | | handleSuccessUpImg(response,name) { |
| | | if (response.code === 200) { |
| | | this.formData[name] = response.data.url; |
| | | } |
| | | }, |
| | | beforeUpload(file) { |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('ä¸ä¼ æä»¶ä¸è¶
è¿10M'); |
| | | this.$refs.upload.clearFiles() |
| | | return false; |
| | | } else { |
| | | return true; |
| | | } |
| | | }, |
| | | onError(err, file, fileList) { |
| | | this.$message.error('ä¸ä¼ 失败') |
| | | this.$refs.upload.clearFiles() |
| | | }, |
| | | beforeUpload1(file) { |
| | | if (file.size > 1024 * 1024 * 10) { |
| | | this.$message.error('ä¸ä¼ æä»¶ä¸è¶
è¿10M'); |
| | | this.$refs.upload1.clearFiles() |
| | | return false; |
| | | } else { |
| | | return true; |
| | | } |
| | | }, |
| | | onError1(err, file, fileList) { |
| | | this.$message.error('ä¸ä¼ 失败') |
| | | this.$refs.upload1.clearFiles() |
| | | }, |
| | | confirmQualifications(){ |
| | | if(!this.formData.name){ |
| | | this.$message.error('æªå¡«åèµè´¨åç§°'); |
| | | return |
| | | } |
| | | if(!this.formData.code){ |
| | | this.$message.error('æªå¡«åèµè´¨ç¼ç '); |
| | | return |
| | | } |
| | | if(!this.formData.organization){ |
| | | this.$message.error('æªå¡«åé¢åæºæ'); |
| | | return |
| | | } |
| | | if(!this.formData.expireTime){ |
| | | this.$message.error('æªå¡«åå°æé¢åæ¶é´'); |
| | | return |
| | | } |
| | | if(!this.formData.imageUrl){ |
| | | this.$message.error('æªä¸ä¼ èµè´¨å¾ç'); |
| | | return |
| | | } |
| | | if(!this.formData.fileUrl){ |
| | | this.$message.error('æªä¸ä¼ èµè´¨éä»¶'); |
| | | return |
| | | } |
| | | this.loading = true; |
| | | addCertificationDetail({...this.formData}).then(res => { |
| | | this.loading = false |
| | | if (res.code === 201) return |
| | | this.$message.success('å·²æäº¤') |
| | | this.refreshTable('page') |
| | | this.qualificationsConnectVisible = false |
| | | }) |
| | | }, |
| | | // æ»å¨è§¦åºå è½½ |
| | | scrollFn() { |
| | | let clientHeight = document.documentElement.clientHeight - 18; //å¯è§åºå |
| | | let scrollHeight = document.body.scrollHeight; // æ»å¨ææ¡£é«åº¦ |
| | | let scrollTop = parseInt(document.documentElement.scrollTop); // å·²æ»å¨çé«åº¦ |
| | | let height = 300; |
| | | if (scrollTop + clientHeight >= scrollHeight - height && scrollHeight !== 0) { |
| | | if (!this.finishLoding&&this.currentPage*this.pageSize<this.total) { |
| | | this.currentPage = this.currentPage + 1; |
| | | this.refreshTable(); |
| | | } |
| | | } else { |
| | | return false; |
| | | } |
| | | }, |
| | | throttle(fn, wait) { |
| | | // å°è£
彿°è¿è¡èæµ |
| | | var timer = null; |
| | | return function () { |
| | | var context = this; |
| | | var args = arguments; |
| | | if (!timer) { |
| | | timer = setTimeout(function () { |
| | | fn.apply(context, args); |
| | | timer = null; |
| | | }, wait); |
| | | } |
| | | }; |
| | | }, |
| | | }, |
| | | destroyed() { |
| | | window.removeEventListener("scroll", this.throttle(), false); |
| | | }, |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .title { |
| | | height: 40px; |
| | | line-height: 40px; |
| | | margin-bottom: 10px; |
| | | } |
| | | </style> |