From caba724b7025dd8801ed590bed3d8d56579d6a8c Mon Sep 17 00:00:00 2001 From: licp <lichunping@guanfang.com.cn> Date: 星期四, 18 四月 2024 17:14:45 +0800 Subject: [PATCH] 完成实验室资质页面编写 --- src/components/tool/echart.vue | 6 src/components/tool/value-table.vue | 27 + src/components/view/b4-daily-business-statistics.vue | 42 +- src/components/view/a5-laboratory-qualifications.vue | 573 +++++++++++++++++++++++++++++++++++ static/js/menu.js | 2 src/util/date.js | 3 src/components/view/a6-device-management.vue | 2 src/util/echarts.js | 20 src/components/view/b4-inspection-item-statistics.vue | 46 +- src/assets/api/controller.js | 12 src/components/view/index-index.vue | 188 +++++++++-- 11 files changed, 820 insertions(+), 101 deletions(-) diff --git a/src/assets/api/controller.js b/src/assets/api/controller.js index 299a7d9..14fc76e 100644 --- a/src/assets/api/controller.js +++ b/src/assets/api/controller.js @@ -19,6 +19,7 @@ warehouse, department, report, + certification, } } @@ -218,4 +219,15 @@ const report = { businessStatisticsByDay: "/report/businessStatisticsByDay", //姣忔棩涓氬姟缁熻 + calendarWorkByWeek: "/report/calendarWorkByWeek", //棣栭〉-->鏃ュ巻浠诲姟鍥� + addSchedule: "/report/addSchedule", //棣栭〉-->娣诲姞鏃ョ▼ + ScheduleByMe: "/report/ScheduleByMe", //棣栭〉-->鎴戠殑鏃ョ▼ } +const certification = { + getCertificationDetail:"/certification/getCertificationDetail",//鏌ヨ璧勮川鏄庣粏鍒楄〃 + addCertificationDetail:"/certification/addCertificationDetail",//娣诲姞璧勮川鏄庣粏鍒楄〃 + delCertificationDetail:"certification/delCertificationDetail",//鍒犻櫎璧勮川鏄庣粏鍒楄〃 +} + + + diff --git a/src/components/tool/echart.vue b/src/components/tool/echart.vue index f9b5300..a9bbaf8 100644 --- a/src/components/tool/echart.vue +++ b/src/components/tool/echart.vue @@ -34,7 +34,9 @@ deep: true, // immediate: true, handler(val) { - this.init(); + this.$nextTick(() => { + this.init(); + }) }, }, }, @@ -107,6 +109,6 @@ <style scoped> .echart_size{ width: 100%; - height: 500px; + height: 100%; } </style> diff --git a/src/components/tool/value-table.vue b/src/components/tool/value-table.vue index 418d4e2..8448999 100644 --- a/src/components/tool/value-table.vue +++ b/src/components/tool/value-table.vue @@ -1063,7 +1063,32 @@ }, handleCascader(e,label){ this.upData[label] = e; - } + }, + // 鎵归噺鍒犻櫎 + batchDelete(){ + if(this.multipleSelection&&this.multipleSelection.length>0){ + // this.delUrl + this.$confirm('鏄惁鍒犻櫎閫変腑鐨勬暟鎹�?', "璀﹀憡", { + confirmButtonText: "纭畾", + cancelButtonText: "鍙栨秷", + type: "warning" + }).then(() => { + this.$axios.post(this.delUrl, { + id: this.multipleSelection.map(item => item.id).join(',') + }).then(res => { + if (res.code === 201) { + return + } + this.$message.success('鍒犻櫎鎴愬姛') + this.selectList() + }).catch(e => { + this.$message.error('鍒犻櫎澶辫触') + }) + }).catch(() => {}) + }else{ + this.$message.error('璇烽�夋嫨瑕佸垹闄ょ殑鏁版嵁') + } + }, } } </script> diff --git a/src/components/view/a5-laboratory-qualifications.vue b/src/components/view/a5-laboratory-qualifications.vue new file mode 100644 index 0000000..9e3d802 --- /dev/null +++ b/src/components/view/a5-laboratory-qualifications.vue @@ -0,0 +1,573 @@ +<style scoped> + .title { + height: 60px; + line-height: 60px; + } + + .bodys { + height: 100%; + } + + .search { + background-color: #fff; + height: 80px; + display: flex; + align-items: center; + } + + .search_thing { + width: 350px; + display: flex; + align-items: center; + } + + .search_label { + width: 110px; + font-size: 14px; + text-align: right; + } + + .search_input { + width: calc(100% - 110px); + } + + .table { + margin-top: 10px; + background-color: #fff; + width: calc(100% - 40px); + height: calc(100% - 60px - 80px - 10px - 40px); + padding: 20px; + } + .table-item{ + border-radius: 8px 8px 8px 8px; + box-shadow: 4px 4px 8px 0px rgba(51,51,51,0.04); + border: 1px solid #EEEEEE; + box-sizing: border-box; + padding: 14px 12px; + display: flex; + align-items: center; + justify-content: space-between; + } +</style> + +<template> + <div class="capacity-scope"> + <div> + <el-row class="title"> + <el-col :span="12"> + <el-radio-group v-model="radio" @input="selectorSwitch" size="medium" fill="#3A7BFA"> + <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="medium" type="primary" @click="openAdd" v-if="addPower">鏂板</el-button> + <el-button size="medium" icon="el-icon-delete" @click="handleDel" v-if="delPower">鍒犻櫎</el-button> + </el-col> + </el-row> + </div> + <div v-if="radio==0" class="bodys"> + <div class="search"> + <div class="search_thing"> + <div class="search_label">璧勮川鍚嶇О锛�</div> + <div class="search_input"> + <el-select v-model="itemParameterData.entity.name" placeholder="閫夋嫨璧勮川鍚嶇О" size="small" @change="refreshTable()"> + <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="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </div> + <div class="table"> + <ValueTable ref="itemParameterTable" :url="$api.certification.getCertificationDetail" + :componentData="itemParameterData" :delUrl="$api.certification.delCertificationDetail" :key="upIndex" /> + </div> + </div> + <div class="bodys"> + <div class="search" v-if="radio==1"> + <div class="search_thing"> + <div class="search_label">璧勮川鍚嶇О锛�</div> + <div class="search_input"> + <el-select v-model="entity.name" placeholder="閫夋嫨璧勮川鍚嶇О" size="small"> + <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="padding-left: 30px;"> + <el-button size="small" @click="refresh()">閲� 缃�</el-button> + <el-button size="small" type="primary" @click="refreshTable()">鏌� 璇�</el-button> + </div> + </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="javaApi+'/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: 30px;">璧勮川鍚嶇О锛�<span style="color: #3A7BFA;">{{ m.name }}</span></p> + <p style="line-height: 30px;">鏈夋晥鏃堕棿锛歿{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> + </div> + <el-dialog title="璧勮川鏇存柊" :visible.sync="qualificationsConnectVisible" width="400px"> + <div class="search_thing" style="margin-bottom: 16px;"> + <div class="search_label" style="width:120px">璧勮川鍚嶇О锛�</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">璧勮川缂栫爜锛�</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">棰佸彂鏈烘瀯锛�</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">棣栨棰佸彂鏃堕棿锛�</div> + <div class="search_input"> + <el-date-picker style="width:100%" v-model="formData.firstTime" + 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-date-picker style="width:100%" v-model="formData.recentlyTime" + 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-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 ValueTable from '../tool/value-table.vue' + export default { + components: { + ValueTable + }, + data() { + return { + radio: '0', + itemParameterData: { + entity: { + name: null, + orderBy: { + field: 'id', + order: 'asc' + } + }, + isIndex: false, + showSelect: true, + select: true, + row: 2, + do: [{ + id: '', + font: '闄勪欢涓嬭浇', + type: 'text', + method: 'handleDownLoad', + field: [] + }], + tagField: { + state: { + select: [ + { + value: 0, + label: '澶辨晥', + type: 'danger' + },{ + value: 1, + label: '鏈夋晥', + type: 'success' + } + ] + }, + }, + selectField: { + inspectionItemType: { + select: [] + }, + }, + requiredAdd: [], + requiredUp: [] + }, + itemParameterEntityCopy: {}, + upIndex: 0, + addPower: true, + delPower:true, + select: 0, + qualificationsList:[], + qualificationsConnectVisible:false, + formData:{}, + loading:false, + pageLoading:false, + isLoding: false, // 鍔犺浇涓紝loading鍥炬爣,榛樿涓簍rue + finishLoding: false, // 鍔犺浇瀹屾垚锛屾樉绀哄凡缁忔病鏈夋洿澶氫簡 + entity:{ + name: null, + orderBy: {field: "id", order: "asc"} + }, + currentPage: 1, // 褰撳墠椤� + pageSize: 16, // 涓�椤�16鏉� + total: '', + list:[], + } + }, + computed: { + headers() { + return { + 'token': sessionStorage.getItem('token') + } + }, + action() { + return this.javaApi + this.$api.deviceScope.uploadFile + } + }, + mounted() { + this.itemParameterEntityCopy = this.HaveJson(this.itemParameterData.entity) + this.selectEnumByCategory() + this.getPower('0') + }, + methods: { + selectorSwitch(radio) { + if(radio === '1'){ + this.list = []; + this.refreshTable(); + } + }, + refreshTable() { + if (this.radio === '0') { + this.$refs['itemParameterTable'].selectList() + } 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)); + } + this.$axios.post(this.$api.certification.getCertificationDetail,{ + page: { + current: this.currentPage, + size: this.pageSize + }, + entity: this.entity + }, { + headers: { + 'Content-Type': 'application/json' + } + }).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; + }) + } + }, + refresh() { + if(this.radio === '0'){ + this.itemParameterData.entity = this.HaveJson(this.itemParameterEntityCopy) + this.upIndex++ + }else{ + this.finishLoding = false; + this.currentPage= 1; + this.list=[]; + this.entity={ + name: null, + orderBy: {field: "id", order: "asc"} + }; + this.refreshTable() + } + }, + openAdd() { + // this.$refs.itemParameterTable.openAddDia(this.$api.certification.addCertificationDetail); + this.qualificationsConnectVisible = true; + this.$nextTick(()=>{ + this.$refs.upload.clearFiles() + this.$refs.upload1.clearFiles() + }) + this.formData = {}; + }, + selectEnumByCategory() { + this.$axios.post(this.$api.enums.selectEnumByCategory, { + category: "璧勮川鍚嶇О" + }).then(res => { + // this.itemParameterData.selectField.inspectionItemType.select = res.data + this.qualificationsList = res.data + }) + }, + handleDel(){ + this.$refs.itemParameterTable.batchDelete(); + }, + handleDownLoad(row){ + let url = row.fileUrl; + const link = document.createElement('a'); + link.href = this.javaApi + '/img/'+ url; + document.body.appendChild(link); + link.click(); + }, + 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; + this.$axios.post(this.$api.certification.addCertificationDetail, { + ...this.formData + }, { + headers: { + 'Content-Type': 'application/json' + } + }).then(res => { + this.loading = false + if (res.code == 201) return + this.$message.success('宸叉彁浜�') + this.refreshTable() + this.qualificationsConnectVisible = false + }) + }, + // 鏉冮檺鍒嗛厤 + getPower(radio) { + let power = JSON.parse(sessionStorage.getItem('power')) + let add = false + let del = false + for (var i = 0; i < power.length; i++) { + if (power[i].menuMethod == 'delCertificationDetail') { + del = true + } + if (power[i].menuMethod == 'addCertificationDetail') { + add = true + } + } + this.addPower = add + this.delPower = del + }, + // 婊氬姩瑙﹀簳鍔犺浇 + 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> diff --git a/src/components/view/a6-device-management.vue b/src/components/view/a6-device-management.vue index 5c3d15d..9c54d17 100644 --- a/src/components/view/a6-device-management.vue +++ b/src/components/view/a6-device-management.vue @@ -386,7 +386,7 @@ <el-upload :action="action" :on-success="handleSuccessUpImg2" :show-file-list="false" accept='image/jpg,image/jpeg,image/png' :headers="headers" :on-change="beforeUpload" :on-error="onError" ref='upload'> - <el-button type="text" style="height:30px;paddingTop:8px">涓婁紶</el-button> + <el-button type="text" style="height:30px;padding-top:8px">涓婁紶</el-button> </el-upload> </div> </el-form-item> diff --git a/src/components/view/b4-daily-business-statistics.vue b/src/components/view/b4-daily-business-statistics.vue index 743edf6..01a9951 100644 --- a/src/components/view/b4-daily-business-statistics.vue +++ b/src/components/view/b4-daily-business-statistics.vue @@ -1,9 +1,9 @@ <template> <div class="daily-main" v-loading="loading"> <div class="daily-content" style="height:100%"> - <p style="font-size: 16px;padding:19.5px 0px">姣忔棩涓氬姟缁熻</p> + <!-- <p style="font-size: 16px;padding:19.5px 0px">姣忔棩涓氬姟缁熻</p> --> <el-row :gutter="20"> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩浠诲姟鎺ユ敹</h4> @@ -17,7 +17,7 @@ <img src="../../../static/img/daliy-0.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩浠诲姟瀹屾垚</h4> @@ -31,7 +31,7 @@ <img src="../../../static/img/daliy-1.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩浠诲姟鍓╀綑</h4> @@ -45,7 +45,7 @@ <img src="../../../static/img/daliy-2.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩妫�娴嬭垂鐢�</h4> @@ -59,7 +59,7 @@ <img src="../../../static/img/daliy-3.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩妫�娴嬪伐鏃�</h4> @@ -73,7 +73,7 @@ <img src="../../../static/img/daliy-4.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="daily-card daily-head"> <div class="daily-head-left"> <h4>浠婃棩妫�娴嬩汉鍛�</h4> @@ -88,17 +88,17 @@ </div> </el-col> </el-row> - <el-row :gutter="20"> - <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 30px;"> - <div class="daily-card chart-box"> + <el-row :gutter="20" style="height: calc(100% - 170px);"> + <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px;height: 100%;"> + <div class="daily-card chart-box" style="height: 100%;"> <h4>杩�10鏃ヤ换鍔℃帴鏀堕噺</h4> - <echart-module :id="'daily-left'" :config="chartConfig0" :datas="chartData0"></echart-module> + <echart-module :id="'daily-left'" :config="chartConfig0" :datas="chartData0" style="height: calc(100% - 32px);"></echart-module> </div> </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 30px;"> - <div class="daily-card chart-box"> + <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px;height: 100%;"> + <div class="daily-card chart-box" style="height: 100%;"> <h4>杩�10鏃ュ疄闄呭畬鎴愪换鍔′笌鎺ユ敹浠诲姟瀵规瘮</h4> - <echart-module :id="'daily-right'" :config="chartConfig1" :datas="chartData1"></echart-module> + <echart-module :id="'daily-right'" :config="chartConfig1" :datas="chartData1" style="height: calc(100% - 32px);"></echart-module> </div> </el-col> </el-row> @@ -114,7 +114,7 @@ data(){ return{ chartConfig0:{ - height: '435px', + height: '', isLoading:false, type:'line' }, @@ -128,7 +128,7 @@ ] }, chartConfig1:{ - height: '435px', + height: '', isLoading:false, type:'bar' }, @@ -190,6 +190,10 @@ overflow-y: auto; overflow-x: hidden; } +.daily-content{ + padding: 20px 0; + box-sizing: border-box; +} .daily-card{ width: 100%; background: #FFFFFF; @@ -209,7 +213,7 @@ color: #202224; font-size: 16px; font-weight: 400; - margin-bottom: 20px; + margin-bottom: 16px; opacity: 0.8; } @@ -218,7 +222,7 @@ font-weight: bold; font-size: 28px; display: inline-block; - margin-bottom: 30px; + margin-bottom: 16px; } .daily-head-left .daily-head-left-info{ @@ -236,7 +240,7 @@ } .chart-box{ - padding: 30px 24px; + padding: 16px 24px; box-sizing: border-box; } diff --git a/src/components/view/b4-inspection-item-statistics.vue b/src/components/view/b4-inspection-item-statistics.vue index 6eb1a49..53f6155 100644 --- a/src/components/view/b4-inspection-item-statistics.vue +++ b/src/components/view/b4-inspection-item-statistics.vue @@ -1,9 +1,9 @@ <template> <div class="inspection-main"> <div class="inspection-content" style="height:100%"> - <p style="font-size: 16px;padding:19.5px 0px">妫�娴嬮」鐩粺璁�</p> + <!-- <p style="font-size: 16px;padding:19.5px 0px">妫�娴嬮」鐩粺璁�</p> --> <el-row :gutter="20"> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head"> <div class="inspection-head-left"> <h4>浠婃棩椤圭洰鎺ユ敹</h4> @@ -17,7 +17,7 @@ <img src="../../../static/img/daliy-0.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head"> <div class="inspection-head-left"> <h4>浠婃棩椤圭洰瀹屾垚</h4> @@ -31,7 +31,7 @@ <img src="../../../static/img/daliy-1.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head"> <div class="inspection-head-left"> <h4>浠婃棩椤圭洰鍓╀綑</h4> @@ -45,36 +45,36 @@ <img src="../../../static/img/daliy-2.svg" alt="" srcset=""> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;"> <h4 style="margin-bottom: 5px;">浠婃棩椤圭洰鍚堟牸鐜�</h4> <echart-module :id="'inspection-qualified'" :config="chartConfig2" :datas="chartData2" style="align-self: center;"></echart-module> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;"> <h4 style="margin-bottom: 5px;">浠婃棩椤圭洰瀹屾垚鐜�</h4> <echart-module :id="'inspection-complete'" :config="chartConfig3" :datas="chartData3" style="align-self: center;"></echart-module> </div> </el-col> - <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 30px;"> + <el-col :xs="12" :sm="8" :md="6" :lg="4" :xl="4" style="margin-bottom: 16px;"> <div class="inspection-card inspection-head" style="flex-direction: column;padding-bottom: 5px;"> <h4 style="margin-bottom: 5px;">浠婃棩椤圭洰寤舵湡鐜�</h4> <echart-module :id="'inspection-extension'" :config="chartConfig4" :datas="chartData4" style="align-self: center;"></echart-module> </div> </el-col> </el-row> - <el-row :gutter="20"> - <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 30px;"> - <div class="inspection-card chart-box"> + <el-row :gutter="20" style="height: calc(100% - 170px);"> + <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px; height: 100%;"> + <div class="inspection-card chart-box" style="height: 100%;"> <h4>杩�10鏃ラ」鐩帴鏀堕噺</h4> - <echart-module :id="'inspection-left'" :config="chartConfig0" :datas="chartData0"></echart-module> + <echart-module :id="'inspection-left'" :config="chartConfig0" :datas="chartData0" style="height: calc(100% - 32px);"></echart-module> </div> </el-col> - <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 30px;"> - <div class="inspection-card chart-box"> + <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" style="margin-bottom: 16px;height: 100%;"> + <div class="inspection-card chart-box" style="height: 100%;"> <h4>杩�10鏃ュ疄闄呭畬鎴愰」鐩笌鎺ユ敹椤圭洰瀵规瘮</h4> - <echart-module :id="'inspection-right'" :config="chartConfig1" :datas="chartData1"></echart-module> + <echart-module :id="'inspection-right'" :config="chartConfig1" :datas="chartData1" style="height: calc(100% - 32px);"></echart-module> </div> </el-col> </el-row> @@ -90,7 +90,7 @@ data(){ return{ chartConfig0:{ - height: '435px', + height: '', isLoading:true, type:'line' }, @@ -104,7 +104,7 @@ ] }, chartConfig1:{ - height: '435px', + height: '', isLoading:true, type:'bar' }, @@ -122,7 +122,7 @@ ] }, chartConfig2:{ - height: '118px', + height: '103px', width:'140px', isLoading:true, type:'pie' @@ -143,7 +143,7 @@ ] }, chartConfig3:{ - height: '118px', + height: '103px', width:'140px', isLoading:true, type:'pie' @@ -164,7 +164,7 @@ ] }, chartConfig4:{ - height: '118px', + height: '103px', width:'140px', isLoading:true, type:'pie' @@ -195,6 +195,10 @@ overflow-y: auto; overflow-x: hidden; } + .inspection-content{ + padding: 20px 0; + box-sizing: border-box; + } .inspection-card{ width: 100%; background: #FFFFFF; @@ -223,7 +227,7 @@ font-weight: bold; font-size: 28px; display: inline-block; - margin-bottom: 30px; + margin-bottom: 16px; } .inspection-head-left .inspection-head-left-info{ @@ -242,7 +246,7 @@ } .chart-box{ - padding: 30px 24px; + padding: 16px 24px; box-sizing: border-box; } diff --git a/src/components/view/index-index.vue b/src/components/view/index-index.vue index 4743c4e..63d5312 100644 --- a/src/components/view/index-index.vue +++ b/src/components/view/index-index.vue @@ -3,7 +3,7 @@ width: 100%; height: calc(100% - 50px); overflow-y: auto; - padding: 25px 0; + padding: 25px 0 10px; } .left-1 { @@ -52,7 +52,7 @@ } .right-1{ - padding: 14px 10px 4px; + padding: 10px 10px 4px; display: flex; align-items: center; justify-content: space-between; @@ -72,7 +72,7 @@ } .right-2{ - padding: 13px 20px; + padding: 13px 14px 8px; margin-bottom: 16px; } @@ -129,21 +129,19 @@ .list2-item{ line-height: 22px; display: flex; - margin-bottom: 13px; + margin-bottom: 12px; font-size: 14px; - } - .right-3{ } .right-3-tab{ display: flex; align-items: center; - margin-bottom: 16px; + margin-bottom: 12px; } .tab-item{ width: 50%; box-sizing: border-box; text-align: center; - padding: 16px 0; + padding: 14px 0; font-size: 20px; background: #F5F7FB; color: #333333; @@ -153,7 +151,10 @@ color: #FF3838; } .right-3-list{ - padding: 0 12px 16px; + padding: 0 12px 8px; + box-sizing: border-box; + height: 390px; + overflow-y: auto; } .list3-item{ padding: 6px 4px; @@ -175,12 +176,11 @@ font-size: 14px; } .left-2{ - display: flex; - align-items: flex-start; - margin-bottom: 16px; + display: grid; + grid-template-columns: repeat(7, 1fr); + height: 777px; } .left-2-item{ - width: 14.1%; border-right: 1px solid #F1F1F1; } .left-2-item:nth-last-child(1){ @@ -203,7 +203,7 @@ .left-item-body{ box-sizing: border-box; padding: 5px; - max-height: 711px; + height: 693px; overflow-y: auto; } .body-item{ @@ -211,6 +211,15 @@ border-radius: 16px; overflow: hidden; margin-bottom: 8px; + } + .body-item.color0{ + background: #70A090; + } + .body-item.color1{ + background: #EBD476; + } + .body-item.color2{ + background: #FF3838; } .body-item>div{ height: calc(100% - 16px); @@ -246,21 +255,17 @@ </div> </div> </div> - <div class="left-2 card"> - <div class="left-2-item" v-for="(item,index) in 7" :key="index"> + <div class="left-2 card" v-loading="workLoading"> + <div class="left-2-item" v-for="(item,index) in workDay" :key="index"> <div class="left-item-title"> - <span style="font-size: 18px;">25</span> - <span style="font-size: 14px;color: #999999;">鏄熸湡鍥�</span> + <span style="font-size: 18px;">{{ item }}</span> + <span style="font-size: 14px;color: #999999;">{{ weekdays[index] }}</span> </div> <div class="left-item-body"> - <div class="body-item" v-for="(m,i) in 8" :key="i"> + <div class="body-item" v-for="(m,i) in workList[index]" :key="i" :class="{color0:m.type==0,color1:m.type==1,color2:m.type==2}"> <div> - <span style="font-size: 12px;margin-bottom: 17px;">濮旀墭璁㈠崟WT20230101 -001妫�娴�</span> - <el-image style="height: 24px;width: 24px;border-radius: 50%;"> - <div slot="error" class="image-slot"> - <i class="el-icon-picture-outline"></i> - </div> - </el-image> + <span style="font-size: 12px;margin-bottom: 17px;">{{ m.text }}</span> + <span style="display: inline-block;height: 24px;width: 24px;border-radius: 50%;line-height: 24px;text-align: center;background: #C0C4CC;color: #fff;">{{ m.name.charAt(0) }}</span> </div> </div> </div> @@ -331,13 +336,14 @@ </template> </el-calendar> </div> - <div class="right-2-list" style="width: 49%;"> - <div class="list2-item" v-for="(m,i) in 5" :key="i"> - <span>14:00</span> - <el-tooltip style="margin-left: 10px;" effect="dark" content="鍙傚姞LIMS绯荤粺鍩硅浼氳锛屽苟绛句笂绾夸笂绾夸笂绾夸笂绾夸笂绾夸笂绾�" placement="top"> - <p class="ellipsis-multiline" >鍙傚姞LIMS绯荤粺鍩硅浼氳锛屽苟绛句笂绾夸笂绾夸笂绾夸笂绾夸笂绾夸笂绾�</p> + <div class="right-2-list" style="width: 49%;height: 286px;" v-loading="scheduleLoading"> + <div class="list2-item" v-for="(m,i) in listScheduleByMe" :key="i"> + <span>{{ m.scheduleTimes }}</span> + <el-tooltip style="margin-left: 10px;" effect="dark" :content="m.text" placement="top"> + <p class="ellipsis-multiline" >{{ m.text }}</p> </el-tooltip> </div> + <span style="color:rgb(153, 153, 153);font-size: 12px;text-align: center;margin: 120px 0;display: inline-block;width: 100%;" v-if="listScheduleByMe.length==0">鏆傛棤</span> </div> </div> </div> @@ -353,7 +359,7 @@ <p>璁惧鍒版湡鎻愰啋</p> </div> <div class="list3-item-info"> - <p>缂栧彿<span style="color:#3A7BFA;"> SB20240101-001 </span>鐨勮澶囧皢浜�2023-09-09 11:11:11杩囨湡</p> + <p style="width: 73%;-webkit-line-clamp: 1;" class="ellipsis-multiline">缂栧彿<span style="color:#3A7BFA;"> SB20240101-001 </span>鐨勮澶囧皢浜�2023-09-09 11:11:11杩囨湡</p> <p>2023-09-09 09:09:09</p> </div> </div> @@ -372,14 +378,14 @@ type="datetime" placeholder="閫夋嫨鏃ユ湡鏃堕棿" size="small" - style="width:100%"> + value-format="yyyy-MM-dd HH:mm:ss" style="width: 100%;" format="yyyy-MM-dd HH:mm:ss"> </el-date-picker> </div> </el-col> <el-col class="search_thing" :span="22"> <div class="search_label">鍐呭锛�</div> <div class="search_input"> - <el-input v-model="query.content" size="small" placeholder="璇疯緭鍏ュ唴瀹�"></el-input> + <el-input v-model="query.text" size="small" placeholder="璇疯緭鍏ュ唴瀹�"></el-input> </div> </el-col> </el-row> @@ -395,6 +401,9 @@ </template> <script> + import { + getYearAndMonthAndDays + } from '../../util/date' export default { data() { return { @@ -405,18 +414,31 @@ dialogVisible:false, query:{ time:'', - content:'' + text:'' }, - loading:false + loading:false, + workLoading:false, + workList:[], + workDay:[], + weekdays:[], + listScheduleByMe:[], + scheduleLoading:false, } }, + watch:{ + calendarValue(val){ + this.getScheduleByMe() + } + }, mounted() { this.user = JSON.parse(localStorage.getItem('user')) this.nowTime() - // this.getDataList() setInterval(() => { this.nowTime() }, 1000) + this.init(); + this.weekdays = this.getWeekdaysForNextWeek() + this.getScheduleByMe() }, methods: { nowTime() { @@ -444,11 +466,6 @@ m = "0" + m; } this.now = y + "-" + m + "-" + d + " " + h + ":" + min + ":" + s; - }, - getDataList() { - this.$axios.get(this.$api.dataReporting.getDataList).then(res => { - this.data = res.data - }) }, nextMonth(value) { let year = this.calendarValue.getFullYear();// 褰撳墠骞翠唤 @@ -510,7 +527,7 @@ this.dialogVisible = false; this.query = { time:'', - content:'' + text:'' } }, submit(){ @@ -518,11 +535,94 @@ this.$message.error('鏃堕棿鏈~鍐�') return } - if(!this.query.content){ + if(!this.query.text){ this.$message.error('鍐呭鏈~鍐�') return } - } + this.loading = true; + this.$axios.post(this.$api.report.addSchedule, this.query).then(res => { + this.loading = false; + if (res.code == 201) { + this.$message.error('鎿嶄綔澶辫触') + return + } + this.$message.success('淇濆瓨鎴愬姛') + this.handleCancel() + this.getScheduleByMe() + }) + }, + init(){ + this.workLoading = true; + this.$axios.get(this.$api.report.calendarWorkByWeek).then(res => { + if (res.code == 201) return + this.workLoading = false; + this.workList = []; + for(let i=0;i<7;i++){ + this.workList.push(res.data[`work${i}`]) + } + this.workDay = res.data.weekDays.map(m=>{ + return m[2] + }) + }) + }, + getWeekdaysForNextWeek() { + let weekdays = []; + for (let i = 0; i < 7; i++) { + let date = new Date(); + date.setDate(date.getDate() + i); // 浠婂ぉ涔嬪悗鐨勬棩瀛� + let day = date.getDay(); // 0-6 浠h〃鏄熸湡鏃ュ埌鏄熸湡鍏� + weekdays.push(day); + } + weekdays = weekdays.map(m=>{ + let day ='' + switch (m) { + case 0: + day = '鏄熸湡澶�' + break; + case 1: + day = '鏄熸湡涓�' + break; + case 2: + day = '鏄熸湡浜�' + break; + case 3: + day = '鏄熸湡涓�' + break; + case 4: + day = '鏄熸湡鍥�' + break; + case 5: + day = '鏄熸湡浜�' + break; + case 6: + day = '鏄熸湡鍏�' + break; + } + return day + }) + return weekdays; + }, + getScheduleByMe(){ + this.scheduleLoading = true; + this.$axios.post(this.$api.report.ScheduleByMe, { + date:getYearAndMonthAndDays(this.calendarValue) + }).then(res => { + this.loading = false; + this.scheduleLoading = false; + if (res.code == 201) { + return + } + this.listScheduleByMe = res.data.map(m=>{ + if(m.scheduleTime){ + let time = m.scheduleTime.split(' ')[1].split(':') + m.scheduleTimes = time[0] + ':' + time[1] + }else{ + m.scheduleTimes = '' + } + return m + }) + }) + }, } } </script> diff --git a/src/util/date.js b/src/util/date.js index 427486b..03629d0 100644 --- a/src/util/date.js +++ b/src/util/date.js @@ -1,8 +1,7 @@ /** * 鑾峰彇骞存湀鏃� */ -export function getYearAndMonthAndDays() { - const date = new Date() +export function getYearAndMonthAndDays(date=new Date()) { let year = date.getFullYear() let month = date.getMonth() + 1 if (month < 10) { diff --git a/src/util/echarts.js b/src/util/echarts.js index b653849..e2ce7bd 100644 --- a/src/util/echarts.js +++ b/src/util/echarts.js @@ -30,16 +30,16 @@ }, }, grid: { - top: '5%', - left: '7%', + top: '25px', + left: '40px', right: '3%', - bottom: '7%', + bottom: '40px', // containLabel: true }, legend: { show: true, orient: 'horizontal', - y:-5, + y:-2, right:15, itemWidth: 12, itemHeight: 12, @@ -84,7 +84,7 @@ }, axisLabel: { color: 'rgba(43,48,52, 0.4)', - margin: 30, + margin: 20, }, axisTick: { show: false, @@ -139,10 +139,10 @@ }, }, grid: { - top: '5%', - left: '7%', - right: '2%', - bottom: '7%', + top: '25px', + left: '40px', + right: '3%', + bottom: '40px', // containLabel: true }, xAxis: [{ @@ -180,7 +180,7 @@ }, axisLabel: { color: 'rgba(43,48,52, 0.4)', - margin: 30, + margin: 20, }, axisTick: { show: false, diff --git a/static/js/menu.js b/static/js/menu.js index d34f6ff..4f17007 100644 --- a/static/js/menu.js +++ b/static/js/menu.js @@ -232,7 +232,7 @@ }, { v: "瀹為獙瀹よ祫璐�", i: "font icon-erjidaohang", - u: "", + u: "a5-laboratory-qualifications", g: "C鑳藉姏鑼冨洿鍜岃祫璐�", p: "" }, { -- Gitblit v1.9.3