src/api/experiment/passRateStatistics.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/laboratory/measure.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/layout/components/Sidebar/Logo.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/experiment/passRateStatistics/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/laboratory/measure/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/experiment/passRateStatistics.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ import request from '@/utils/request' export function getSupplierList(params) { return request({ url: '/qualificationRate/getSupplierList', method: 'get', params }) } /** * æ ·ååæ ¼ç * @param {} params * @returns */ export function getTestSampleStatistics(params) { return request({ url: '/qualificationRate/getTestSampleStatistics', method: 'get', params }) } /** * ä¾åºååæ ¼ç * @param {} params * @returns */ export function getSupplierNoPassStatistics(params) { return request({ url: '/qualificationRate/getSupplierNoPassStatistics', method: 'get', params }) } /** * 项ç®åæ ¼ç * @param {} params * @returns */ export function getNoPassProjectStatistics(params) { return request({ url: '/qualificationRate/getNoPassProjectStatistics', method: 'get', params }) } src/api/laboratory/measure.js
@@ -52,3 +52,11 @@ data }) } //ä¿®æ¹è®¡é export function updateMetricalInformationInfo(data) { return request({ url: '/metrical-information/updateMetricalInformationInfo', method: 'post', data }) } src/layout/components/Sidebar/Logo.vue
@@ -46,7 +46,7 @@ width: 100%; height: 50px; line-height: 50px; background: #fff; background: #f8f8f8; text-align: center; overflow: hidden; src/views/experiment/passRateStatistics/index.vue
@@ -2,52 +2,48 @@ <div class="content-main"> <div class="top-bar"> <el-form ref="form" :inline="true" :rules="rules" :model="searchData" label-position="top"> <el-form-item label="æ£æµæ¥æ:" class="sermargin" prop="date"> <el-date-picker v-model="searchData.date" type="daterange" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ£éªç±»å:" class="sermargin" prop="type"> <el-select v-model="searchData.type" placeholder="å ¨é¨"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="ç©æåç»:"> <el-button type="primary" icon="el-icon-plus" class="chooseMaterialBtn" >éæ©ç©æåç»</el-button> </el-form-item> <div class="rightBtn"> <el-form-item> <el-button type="primary" plain size="mini">æ¸ ç©º</el-button> <el-button type="primary" @click="search" size="mini">æ¥è¯¢</el-button> </el-form-item> </div> </el-form> <el-form-item label="æ£æµæ¥æ:" class="sermargin" prop="date"> <el-date-picker v-model="searchData.date" type="daterange" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ"> </el-date-picker> </el-form-item> <el-form-item label="æ£éªç±»å:" class="sermargin" prop="type"> <el-select v-model="searchData.type" placeholder="å ¨é¨"> <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <el-form-item label="ä¾åºå:"> <el-select v-model="searchData.supplier" placeholder="å ¨é¨"> <el-option v-for="item in supplier" :key="item.value" :label="item.label" :value="item.value"> </el-option> </el-select> </el-form-item> <div class="rightBtn"> <el-form-item> <el-button type="primary" plain size="mini">æ¸ ç©º</el-button> <el-button type="primary" @click="search" size="mini">æ¥è¯¢</el-button> </el-form-item> </div> </el-form> </div> <div class="top-bar-copy"></div> <div class="chart-content"> <div class="qualified-wrapper"> <div style="margin-left: 20px;padding:20px 0px;font-size:18px">æ£æµæ¹æ¬¡åæ ¼çç»è®¡</div> <div style="margin-left: 20px;padding:20px 0px;font-size:18px">æ£æµæ ·ååæ ¼çç»è®¡</div> <div class="qualified" ref="qualified"></div> </div> <div class="unqualified"> <div class="firstBox-wrapper" > <div style="margin-left: 20px;padding:20px 0px;font-size:18px">ä¾åºåä¸åæ ¼æ¬¡æ°ç»è®¡</div> <div class="firstBox" ref="unqualified_provider"></div> </div> <div class="secondBox-wrapper" > <div class="firstBox-wrapper"> <div style="margin-left: 20px;padding:20px 0px;font-size:18px">ä¾åºåä¸åæ ¼æ¬¡æ°ç»è®¡</div> <div class="firstBox" ref="unqualified_provider"></div> </div> <div class="secondBox-wrapper"> <div class="secondBox_header"> <div style="font-size:18px">ä¸åæ ¼é¡¹ç®ç»è®¡</div> <el-radio-group v-model="type"> <el-radio-button v-for="item in radiooptions" :key="item.value" :label="item.value" >{{ item.label }}</el-radio-button> <el-radio-button v-for="item in radiooptions" :key="item.value" :label="item.value">{{ item.label }}</el-radio-button> </el-radio-group> </div> <div class="secondBox" ref="unqualified_project"></div> @@ -55,14 +51,14 @@ </div> </div> <div class="bottom"> <el-button type="primary" size="mini" >æ°æ®å¯¼åº</el-button> <el-button type="primary" size="mini">æ°æ®å¯¼åº</el-button> </div> </div> </template> <script> // æ·»å æ»å¨çå¬äºä»¶ window.addEventListener('scroll', function() { window.addEventListener('scroll', function () { var topBar = document.querySelector('.top-bar'); var scrollTop = window.pageYOffset || document.documentElement.scrollTop; @@ -74,25 +70,32 @@ }) import * as echarts from 'echarts' import { getSupplierList,getTestSampleStatistics,getSupplierNoPassStatistics,getNoPassProjectStatistics } from '@/api/experiment/passRateStatistics'; import { dateFormat } from '../../../utils/dateUtil' export default { data(){ data() { return { searchData:{ supplier: [], searchData: { date: [], type: 0, group: '' type: null, supplier: null }, options:[ options: [ { label: 'éè´å ¥åº', label: 'åææ', value: 0 }, { label: 'xxxx', label: 'æå', value: 1 }, { label: 'å§æå', value: 2 } ], radiooptions:[ radiooptions: [ { label: 'ç¯å½¢é¥¼å¾', value: 0 @@ -104,12 +107,15 @@ ], type: 0, rules: { date: [{required: true, message: '请è¾å ¥è´¦å·', trigger: 'blur'}], type: [{required: true, message: '请è¾å ¥åå', trigger: 'blur'}] // date: [{ required: true, message: '请è¾å ¥è´¦å·', trigger: 'blur' }], // type: [{ required: true, message: '请è¾å ¥åå', trigger: 'blur' }] } } }, mounted() { this.getSupplierList() this.getTestSampleStatistics() this.getSupplierNoPassStatistics() const chartDom_qualified = this.$refs.qualified; const chartDom_unqualified_provider = this.$refs.unqualified_provider; const chartDom_unqualified_project = this.$refs.unqualified_project; @@ -118,6 +124,9 @@ const myChart2 = echarts.init(chartDom_unqualified_provider); const myChart3 = echarts.init(chartDom_unqualified_project); /** * æ£æµåæ ¼çç»è®¡ */ const option_qualified = { tooltip: { trigger: 'axis', @@ -164,15 +173,18 @@ } ] }; const option_unqualified1 ={ /** * ä¾åºå */ const option_unqualified1 = { tooltip: { trigger: 'axis', axisPointer: { // åæ è½´æç¤ºå¨ï¼åæ è½´è§¦åææ type: 'shadow' // é»è®¤ä¸ºç´çº¿ï¼å¯é为ï¼'line' | 'shadow' }, formatter: function(params) { formatter: function (params) { let tooltip = params[0].name + '<br/>'; params.forEach(function(item) { params.forEach(function (item) { tooltip += item.marker + ' ' + item.seriesName + ': ' + item.value.toFixed(2) + '%<br/>'; // å°æ°æ®ä¿ç两ä½å°æ°å¹¶è½¬ä¸ºç¾åæ¯å½¢å¼ }); return tooltip; @@ -185,13 +197,13 @@ data: ['ä¾åºå1', 'ä¾åºå2', 'ä¾åºå3', 'ä¾åºå4'] }, yAxis: [ { type: 'value', axisLabel: { formatter: '{value}%' } { type: 'value', axisLabel: { formatter: '{value}%' } ], } ], series: [ { name: 'åæ ¼æ°é', @@ -207,6 +219,9 @@ } ] }; /** * ä¸åæ ¼é¡¹ç® */ const option_unqualified2 = { legend: { orient: 'vertical', @@ -246,25 +261,54 @@ myChart1.setOption(option_qualified); myChart2.setOption(option_unqualified1); if(this.type === 0){ if (this.type === 0) { myChart3.setOption(option_unqualified2); } if(this.type === 1){ if (this.type === 1) { myChart3.setOption(option_unqualified2); } }, methods: { search() { this.getTestSampleStatistics() }, dateHandle(){ let data=JSON.parse(JSON.stringify(this.searchData)) if(this.searchData.date.length!=0&&this.searchData.date !=[]){ data.beginDate=dateFormat(this.searchData.date[0]) data.endDate=dateFormat(this.searchData.date[1]) } data.date=null return data }, async getSupplierList() { let res = await getSupplierList() res.data.forEach(item => { this.supplier.push({ label: item.supplier, value: item.supplier }) }) }, getTestSampleStatistics(){ let param= this.dateHandle() let res =getTestSampleStatistics(param) }, getSupplierNoPassStatistics(){ let param= this.dateHandle() getSupplierNoPassStatistics(param) } } } </script> <style lang="scss" scoped> .content-main{ height:100%; .content-main { height: 100%; width: 100%; .top-bar{ .top-bar { position: absolute; width: 99%; top: 0; left:0; left: 0; z-index: 999; margin-top: 5px; margin-left: 9.5px; @@ -272,79 +316,95 @@ display: flex; justify-content: space-between; padding: 5px 24px 0px 24px; transition: position 0.3s ease; .el-form{ transition: position 0.3s ease; .el-form { width: 100%; .chooseMaterialBtn{ .chooseMaterialBtn { background-color: #fff; border-color: rgba(192,196,204,0.5); border-color: rgba(192, 196, 204, 0.5); color: gray; width: 220px; } } .sermargin{ .sermargin { margin-right: 60px; } .rightBtn{ display:flex; justify-content:end; .rightBtn { display: flex; justify-content: end; margin-right: 20px; margin-top: -40px; margin-bottom: -10px; } } .top-bar.fixed { position: fixed; top: 0.45rem; left: 0.52rem; width:93.8%; width: 93.8%; } .top-bar-copy{ .top-bar-copy { width: 100%; height: 12vh; } .chart-content{ .chart-content { margin: 0px -15px; margin-bottom: 60px; .qualified-wrapper{ .qualified-wrapper { // margin-top: 14vh; background-color: #fff; width: 100%; height:50vh; height: 50vh; } .qualified{ .qualified { width: 100%; height: 400px; } .unqualified{ .unqualified { margin-top: 10px; height: 50vh; display:flex; display: flex; justify-content: space-between; .firstBox-wrapper{ .firstBox-wrapper { background-color: #fff; width:49%; .firstBox{ width: 49%; .firstBox { width: 100%; height: 40vh; } } .secondBox-wrapper{ background-color:#fff; width:49%; .secondBox_header{ display:flex; .secondBox-wrapper { background-color: #fff; width: 49%; .secondBox_header { display: flex; justify-content: space-between; margin: 20px 20px; } .secondBox{ .secondBox { width: 100%; height: 40vh; } } } } .bottom{ .bottom { position: fixed; width: 95%; bottom: 0rem !important; @@ -352,7 +412,7 @@ margin: 0px -15px; padding: 20px 40px; z-index: 999; display:flex; display: flex; justify-content: end; background-color: #fff; } src/views/laboratory/measure/index.vue
@@ -205,67 +205,68 @@ </el-col> </div> <el-dialog class="measureForm" title="计é" :visible.sync="dialogVisible"> <el-form label-position="top" ref="upmeasureForm" :model="measureUpInfo"> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="æ£å®æææ" prop="date" :rules="[{ required: true, message: 'è¯·éæ©æ£å®æææ', trigger: 'change' }]"> <el-date-picker v-model="measureUpInfo.date" type="daterange" range-separator="è³" start-placeholder="å¼å§æ¥æ" end-placeholder="ç»ææ¥æ" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="ä¸ç¡®å®åº¦" prop="uncertainty" :rules="[{ required: true, message: '请填åä¸ç¡®å®åº¦', trigger: 'blur' }]"> <el-input placeholder="请填åä¸ç¡®å®åº¦" v-model="measureUpInfo.uncertainty" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç»æ" prop="result" :rules="[{ required: true, message: 'è¯·éæ©ç»æ', trigger: 'change' }]"> <el-select v-model="measureUpInfo.result" clearable filterable :allow-create="true" placeholder="è¯·éæ©ç»æ" style="width:100%"> <el-option v-for="item in result" :key="item.id" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="æ§è½ææ "> <el-input v-model="measureUpInfo.performanceIndex" type="textarea" :rows="2" placeholder="请è¾å ¥å 容" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="夿³¨"> <el-input v-model="measureUpInfo.remarks" type="textarea" :rows="2" placeholder="请è¾å ¥å 容" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label=""> <el-upload class="upload-demo" action="#" :on-change="handleUpload" :auto-upload="false"> <el-button size="small" type="primary">ç¹å»ä¸ä¼ </el-button> </el-upload> </el-form-item> </el-col> </el-row> </el-form> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="addMeasure">ç¡® å®</el-button> <el-form label-position="top" ref="upmeasureForm" :model="measureUpInfo"> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="æ£å®æææ" prop="date" :rules="[{ required: true, message: 'è¯·éæ©æ£å®æææ', trigger: 'change' }]"> <el-date-picker v-model="measureUpInfo.date" type="date" placeholder="éæ©æ¥æ"> </el-date-picker> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="ä¸ç¡®å®åº¦" prop="uncertainty" :rules="[{ required: true, message: '请填åä¸ç¡®å®åº¦', trigger: 'blur' }]"> <el-input placeholder="请填åä¸ç¡®å®åº¦" v-model="measureUpInfo.uncertainty" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç»æ" prop="result" :rules="[{ required: true, message: 'è¯·éæ©ç»æ', trigger: 'change' }]"> <el-select v-model="measureUpInfo.result" clearable filterable :allow-create="true" placeholder="è¯·éæ©ç»æ" style="width:100%"> <el-option v-for="item in result" :key="item.id" :label="item.label" :value="item.value" /> </el-select> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="æ§è½ææ "> <el-input v-model="measureUpInfo.performanceIndex" type="textarea" :rows="2" placeholder="请è¾å ¥å 容" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label="夿³¨"> <el-input v-model="measureUpInfo.remarks" type="textarea" :rows="2" placeholder="请è¾å ¥å 容" /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="24"> <el-form-item label=""> <el-upload class="upload-demo" action="#" :on-change="handleUploadupdated" :auto-upload="false"> <el-button size="small" type="primary">ç¹å»ä¸ä¼ </el-button> </el-upload> </el-form-item> </el-col> </el-row> </el-form> <span slot="footer" class="dialog-footer"> <el-button type="primary" @click="upMeasure">ç¡® å®</el-button> <el-button @click="dialogVisible=false">å æ¶</el-button> </span> </el-dialog> <el-button @click="dialogVisible = false">å æ¶</el-button> </span> </el-dialog> </div> </div> </template> <script> import { getPlanPageList, getStandingPageList, getPlanMeasureInstrument, limitGetPlanMeasureRequest } from '@/api/laboratory/measure' import { getPlanPageList, getStandingPageList, getPlanMeasureInstrument, limitGetPlanMeasureRequest, updateMetricalInformationInfo } from '@/api/laboratory/measure' import { default as Add } from "./Add.vue"; export default { components: { @@ -275,13 +276,16 @@ return { dialogVisible: false, tableIndex: null, measureUpInfo:{ measureUpInfo: { id: null, code: null, result: null, date: null, uncertainty: null, performanceIndex: null, remarks: null, file: null file: null, termValidity: null }, result: [{ label: 'åæ ¼', @@ -335,15 +339,35 @@ // this.getPlanPageList() }, methods: { upResult(){ this.measureData[this.tableIndex].result=this.resultUp upResult() { this.measureData[this.tableIndex].result = this.resultUp }, async upMeasure() { let res = await updateMetricalInformationInfo(this.measureUpInfo) if (res) { this.$message({ message: 'æä½æåï¼', type: 'success' }); this.limitGetPlanMeasureInstrument() this.dialogVisible = false } }, handleUploadupdated() { }, measureUp(scope) { console.log(scope); this.dialogVisible = true this.tableIndex=scope.$index this.measureUpInfo.result=scope.row.result this.tableIndex = scope.$index this.measureUpInfo.result = scope.row.result this.measureUpInfo.code = scope.row.code this.measureUpInfo.date = scope.row.endDate this.measureUpInfo.id = scope.row.imId this.measureUpInfo.uncertainty = scope.row.uncertainty this.measureUpInfo.performanceIndex = scope.row.performanceIndex this.measureUpInfo.remarks = scope.row.remarks this.measureUpInfo.termValidity = scope.row.termValidity }, measureAdd() { let add = this.$refs.add.add() @@ -357,7 +381,6 @@ } }, async handleSizeChangePlan(num) { console.log(num); this.pageSizePlan = num await this.limitGetPlanMeasureInstrument() }, @@ -376,7 +399,6 @@ currentPage: this.currentPagePlan, pageSize: this.pageSizePlan } console.log(param); let res = await limitGetPlanMeasureRequest(param) this.totalPlan = res.data.taotal this.measureData = res.data.list @@ -390,7 +412,6 @@ }, async getPlanAndInfoAndIns(id) { let res = await getPlanMeasureInstrument({ "id": id, "currentPage": this.currentPagePlan, "pageSize": this.pageSize }); console.log(res); for (const key in res.data.list) { this.planInfo[key] = res.data.list[key] } @@ -411,7 +432,6 @@ }, blurSearch() { if (this.radioValue === 1) { console.log("计å"); } }, handleClose() { @@ -430,7 +450,6 @@ currentPage: this.currentPage, pageSize: this.pageSize, code: this.searchData.code, name: this.searchData.name, unit: this.searchData.measureunit } console.log(param); const res = await getStandingPageList(param) this.measureLedgerTable = res.data.records this.total = res.data.total @@ -478,7 +497,6 @@ currentPage: this.currentPage, pageSize: this.pageSize, code: this.searchData.code, name: this.searchData.name, unit: this.searchData.measureunit } console.log(param); const res = await getPlanPageList(param) res.data.list.forEach(item => { item.palanDate = item.beginTime + " ~ " + item.endTime @@ -487,7 +505,6 @@ this.total = res.data.total }, async lookMeasurement(code) { console.log(code); }, } }