From 10f334d1b36f8dad1edcd3b489c9eb6b8773d444 Mon Sep 17 00:00:00 2001 From: spring <2396852758@qq.com> Date: 星期一, 03 三月 2025 14:47:53 +0800 Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/lims-ruoyi-before into dev --- src/views/business/materialOrder/copperOrder.vue | 15 src/components/echarts/echarts.vue | 238 +++++++ src/views/business/materialOrder/customsInspection.vue | 18 src/layout/components/Navbar.vue | 13 src/views/statisticalCharts/itemInspectionAnalysis/index.vue | 535 ++++++++++++++++ src/components/echarts/DataComparison.vue | 507 +++++++++++++++ src/views/statisticalCharts/qualificationRateStatistics/index.vue | 448 +++++++++++++ src/views/business/productOrder/components/add.vue | 74 +- src/api/statisticalCharts/dataAnalysis.js | 73 ++ src/router/index.js | 11 src/views/structural/capabilityAndLaboratory/capability/index.vue | 4 11 files changed, 1,883 insertions(+), 53 deletions(-) diff --git a/src/api/statisticalCharts/dataAnalysis.js b/src/api/statisticalCharts/dataAnalysis.js new file mode 100644 index 0000000..0775c06 --- /dev/null +++ b/src/api/statisticalCharts/dataAnalysis.js @@ -0,0 +1,73 @@ +// 缁熻鍥捐〃 +import request from "@/utils/request"; + +//鍚堟牸鐜囩粺璁� +export function getRawPassRateByBarChart(query) { + return request({ + url: "/dataAnalysis/getRawPassRateByBarChart", + method: "get", + params: query, + }); +} +//鍘熸潗鏂欑粺璁� +export function getRawPassRateByCake(query) { + return request({ + url: "/dataAnalysis/getRawPassRateByCake", + method: "get", + params: query, + }); +} +//鏈湀妫�楠岀被鍨嬫暟閲� +export function getOrderTypeCookie() { + return request({ + url: "/dataAnalysis/getOrderTypeCookie", + method: "get", + }); +} +//鏈湀妫�楠岀被鍨嬫暟閲� +export function getRawUpMonth() { + return request({ + url: "/dataAnalysis/getRawUpMonth", + method: "get", + }); +} +//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽 +export function getRawProductAnalysis(query) { + return request({ + url: "/dataAnalysis/getRawProductAnalysis", + method: "post", + data: query, + }); +} +//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽鍚堟牸鐜� +export function getRawProductAnalysisRawPass(query) { + return request({ + url: "/dataAnalysis/getRawProductAnalysisRawPass", + method: "post", + data: query, + }); +} +//鏌ヨ鍘熸潗鏂欓」妫�鍒嗘瀽鍒楄〃 +export function getRawProductAnalysisAllList(query) { + return request({ + url: "/dataAnalysis/getRawProductAnalysisAllList", + method: "post", + data: query, + }); +} +//鏌ヨ妫�楠岄」 +export function getRawItemNames(query) { + return request({ + url: "/dataAnalysis/getRawItemNames", + method: "get", + params: query, + }); +} +//鏌ヨ鍘熸潗鏂欓」妫�鍜屽巶瀹舵暟鎹姣� +export function getRawSupplierCompare(query) { + return request({ + url: "/dataAnalysis/getRawSupplierCompare", + method: "post", + data: query, + }); +} diff --git a/src/components/echarts/DataComparison.vue b/src/components/echarts/DataComparison.vue new file mode 100644 index 0000000..b69b49d --- /dev/null +++ b/src/components/echarts/DataComparison.vue @@ -0,0 +1,507 @@ +<template> + <div> + <div> + <el-row class="title"> + <el-col :span="6" style="padding-left: 20px;text-align: left;">鏁版嵁鍒嗘瀽</el-col> + <el-col :span="18" style="text-align: right;"> + <el-button size="medium" @click="$emit('goBack')">杩斿洖</el-button> + </el-col> + </el-row> + </div> + <div class="container"> + <div> + <div style="padding: 0 0 10px 10px">濉啓鍘傚鏁版嵁</div> + <el-form ref="supplierForm" :model="supplierForm" :rules="rules" class="demo-ruleForm" label-width="40px"> + <el-row :gutter="20"> + <el-col :span="3"> + <el-form-item label="1锛�" prop="one"> + <el-input v-model="supplierForm.one" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="3"> + <el-form-item label="2锛�" prop="two"> + <el-input v-model="supplierForm.two" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="3"> + <el-form-item label="3锛�" prop="three"> + <el-input v-model="supplierForm.three" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="3"> + <el-form-item label="4锛�" prop="four"> + <el-input v-model="supplierForm.four" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="3"> + <el-form-item label="5锛�" prop="five"> + <el-input v-model="supplierForm.five" size="small"></el-input> + </el-form-item> + </el-col> + <el-col :span="4"> + <el-form-item> + <el-button size="small" type="primary" @click="submitForm()">鏁版嵁鍒嗘瀽</el-button> + <el-button size="small" @click="resetForm()">閲嶇疆</el-button> + </el-form-item> + </el-col> + </el-row> + </el-form> + </div> + <table :border='true' class="table"> + <tr> + <th class="thTitle"> </th> + <th class="thTitle">1</th> + <th class="thTitle">2</th> + <th class="thTitle">3</th> + <th class="thTitle">4</th> + <th class="thTitle">5</th> + <th class="thTitle">骞冲潎鍊�</th> + <th class="thTitle">鏍囧噯鍋忓樊</th> + <th class="thTitle">鐩稿鍋忓樊</th> + <th class="thTitle">骞冲潎鏍囧噯鍋忓樊</th> + </tr> + <tr> + <td class="thBack">鍘傚妫�娴嬫暟鎹�</td> + <td v-for="(item,index) in supplierData" :key="index" class="tdData">{{item}}</td> + </tr> + <tr> + <td class="thBack">妫�娴嬩腑蹇冩暟鎹�</td> + <td v-for="(item,index) in localData" :key="index" class="tdData">{{item}}</td> + </tr> + <tr> + <td class="thBack">缁濆鍋忓樊</td> + <td v-for="(item,index) in absoluteDeviation" :key="index" class="tdData">{{item}}</td> + </tr> + <tr> + <td class="thBack">骞冲潎鍊�</td> + <td v-for="(item,index) in average" :key="index" class="tdData">{{item}}</td> + </tr> + <tr> + <td class="thBack2">鍘傚</td> + </tr> + <tr> + <td class="thBack">UCL</td> + <td v-for="(item,index) in supplierULC" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'a' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">LCL</td> + <td v-for="(item,index) in supplierLCL" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'b' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">骞冲潎鍊�</td> + <td v-for="(item,index) in supplierAverage" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'c' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">鏋佸樊</td> + <td v-for="(item,index) in supplierRange" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'d' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack2">妫�娴嬩腑蹇�</td> + </tr> + <tr> + <td class="thBack">UCL</td> + <td v-for="(item,index) in localULC" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'e' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">LCL</td> + <td v-for="(item,index) in localLCL" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'f' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">骞冲潎鍊�</td> + <td v-for="(item,index) in localAverage" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'g' + index" class="tdData"></td> + </tr> + <tr> + <td class="thBack">鏋佸樊</td> + <td v-for="(item,index) in localRange" :key="index" class="tdData">{{item}}</td> + <td v-for="(item,index) in empty" :key="'h' + index" class="tdData"></td> + </tr> + </table> + <el-row> + <el-col :span="12"> + <div class="inspection-card"> + <div class="echartsTitle">妫�娴嬫暟鎹姣�</div> + <Echarts ref="chart" + :grid="grid" + :legend="legend" + :lineColors="lineColors" + :series="echartsSeries" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis" + style="height: 40vh;"></Echarts> + </div> + </el-col> + <el-col :span="12"> + <div class="inspection-card"> + <div class="echartsTitle">娴嬮噺鏁版嵁鏍囧噯宸姣�</div> + <Echarts ref="chart" + :barColors="barColors" + :chartStyle="chartStyle" + :grid="grid" + :legend="legend1" + :series="echartsSeries1" + :tooltip="tooltip" + :xAxis="xAxis1" + :yAxis="yAxis1" + style="height: 40vh;"></Echarts> + </div> + </el-col> + </el-row> + <el-row> + <el-col :span="12"> + <div class="inspection-card"> + <div class="echartsTitle">鍋忓樊鍒嗘瀽</div> + <Echarts ref="chart" + :grid="grid" + :legend="legend2" + :lineColors="lineColors" + :series="echartsSeries2" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis2" + style="height: 40vh;"></Echarts> + </div> + </el-col> + <el-col :span="12"> + <div class="inspection-card"> + <div class="echartsTitle">妫�娴嬩腑蹇冩暟鎹�</div> + <Echarts ref="chart" + :grid="grid" + :legend="legend" + :lineColors="lineColors" + :series="echartsSeries3" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis" + style="height: 40vh;"></Echarts> + </div> + </el-col> + </el-row> + </div> + </div> +</template> + +<script> +import Echarts from "./echarts.vue"; + +export default { + name: "DataComparison", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {Echarts}, + props: { + comparisonData : { + type: Object, + default: () => {} + }, + selectRow : { + type: Object, + default: () => {} + } + }, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + supplierForm: { + one: '', + two: '', + three: '', + four: '', + five: '', + }, + rules: { + one: [{ required: true, message: '蹇呭~', trigger: 'blur' }], + two: [{ required: true, message: '蹇呭~', trigger: 'blur' }], + three: [{ required: true, message: '蹇呭~', trigger: 'blur' }], + four: [{ required: true, message: '蹇呭~', trigger: 'blur' }], + five: [{ required: true, message: '蹇呭~', trigger: 'blur' }], + }, + comparisonData1: {}, + supplierData: [], // 鍘傚鏁版嵁 + localData: [], // 妫�娴嬩腑蹇冩娴嬫暟鎹� + absoluteDeviation: [], // 缁濆鍋忓樊 + average: [], // 骞冲潎鍊� + supplierULC: [], // 鍘傚UCL + supplierLCL: [], // 鍘傚LCL + supplierAverage: [], // 鍘傚骞冲潎鍊� + supplierRange: [], // 鍘傚鏋佸樊 + localULC: [], // 妫�娴嬩腑蹇僓CL + localLCL: [], // 妫�娴嬩腑蹇僉CL + localAverage: [], // 妫�娴嬩腑蹇冨钩鍧囧�� + localRange: [], // 妫�娴嬩腑蹇冩瀬宸� + manufacturerData: [], + manufacturer: [ + {value: '1.1'}, + {value: '2.2'}, + {value: '3.3'}, + {value: '4.4'}, + {value: '5.5'}, + ], + testCenter: [ + {value: '1.2'}, + {value: '2.33'}, + {value: '3.64'}, + {value: '4.3'}, + {value: '5.9'}, + ], + empty: [ + {data: '1'}, + {data: '2'}, + {data: '3'}, + {data: '4'}, + ], + lineColors: ['#ed7d31', '#409EFF'], + barColors: ['#ed7d31', '#409EFF', '#a5a5a5'], + chartStyle: { + width: '100%', + height: '96%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴� + }, + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + legend: { + data: ['鍘傚妫�娴嬫暟鎹�','妫�娴嬩腑蹇冩娴嬫暟鎹�'] + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + xAxis: [{ + type: 'category', + data: ['1', '2', '3', '4', '5'] + }], + yAxis: [{ + type: 'value' + }], + echartsSeries: [ + { + name: '鍘傚妫�娴嬫暟鎹�', + type: 'line', + label: { + show: true, + position: 'top', + }, + data: [] + }, + { + name: '妫�娴嬩腑蹇冩娴嬫暟鎹�', + type: 'line', + label: { + show: true, + position: 'top', + }, + data: [] + } + ], + xAxis1: [{ + type: 'category', + data: ['鍘傚', '妫�娴嬩腑蹇�'] + }], + legend1: { + data: ['UCL','LCL', '骞冲潎鍊�'] + }, + yAxis1: [ + { + type: 'value', + }, + ], + echartsSeries1: [ + { + name: 'UCL', + type: 'bar', + label: { + show: true, + position: 'top' + }, + data: [] + }, + { + name: 'LCL', + type: 'bar', + label: { + show: true, + position: 'top' + }, + data: [] + }, + { + name: '骞冲潎鍊�', + type: 'bar', + label: { + show: true, + position: 'top' + }, + data: [] + }, + ], + legend2: { + data: ['骞冲潎鍊�','缁濆鍋忓樊'] + }, + yAxis2: [{ + type: 'value', + min: 0, + max: 1, + }], + echartsSeries2: [ + { + name: '骞冲潎鍊�', + type: 'line', + label: { + show: true, + position: 'top', + formatter: (params) => Math.round(params.value * 1000) / 10 + '%' + }, + data: [], + }, + { + name: '缁濆鍋忓樊', + type: 'line', + label: { + show: true, + position: 'top', + formatter: (params) => Math.round(params.value * 1000) / 10 + '%' + }, + data: [], + } + ], + echartsSeries3: [ + { + name: '妫�娴嬩腑蹇冩娴嬫暟鎹�', + type: 'line', + data: [] + } + ], + } + }, + mounted() { + this.getInfo() + }, + // 鏂规硶闆嗗悎 + methods: { + getInfo () { + this.localData = this.comparisonData.localData === null ? ['', '', '', '', '','','', '', ''] : this.comparisonData.localData + this.localData = this.localData.map((number, index) => index === 7 ? `${Math.round(number * 100)}%` : number) + this.echartsSeries3[0].data = this.localData.slice(0, 5) + this.localULC = this.comparisonData.localULC + this.localLCL = this.comparisonData.localLCL + this.localAverage = this.comparisonData.localAverage + this.localRange = this.comparisonData.localRange + }, + getInfo1 () { + this.echartsSeries1[0].data = [] + this.supplierData = this.comparisonData1.supplierData === null ? ['', '', '', '', '','','', '', ''] : this.comparisonData1.supplierData + this.localData = this.comparisonData1.localData === null ? ['', '', '', '', '','','', '', ''] : this.comparisonData1.localData + this.localData = this.localData.map((number, index) => index === 7 ? `${Math.round(number * 100)}%` : number) + this.echartsSeries3[0].data = this.localData.slice(0, 5) + this.echartsSeries[0].data = this.supplierData + this.echartsSeries[1].data = this.localData + this.absoluteDeviation = this.comparisonData1.absoluteDeviation === null ? ['', '', '', '', '','','', '', ''] : this.comparisonData1.absoluteDeviation + this.echartsSeries2[1].data = this.absoluteDeviation + this.absoluteDeviation = this.absoluteDeviation.map(number => `${Math.round(number * 100)}%`) // 缁濆鍋忓樊鐧惧垎姣旇浆鎹� + this.average = this.comparisonData1.average === null ? ['', '', '', '', '','','', '', ''] : this.comparisonData1.average + this.echartsSeries2[0].data = this.average + this.average = this.average.map(number => `${Math.round(number * 100)}%`) // 骞冲潎鍊肩櫨鍒嗘瘮杞崲 + this.supplierULC = this.comparisonData1.supplierULC === null ? ['', '', '', '', ''] : this.comparisonData1.supplierULC + this.echartsSeries1[0].data.push(this.supplierULC[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.supplierLCL = this.comparisonData1.supplierLCL === null ? ['', '', '', '', ''] : this.comparisonData1.supplierLCL + this.echartsSeries1[1].data.push(this.supplierLCL[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.supplierAverage = this.comparisonData1.supplierAverage === null ? ['', '', '', '', ''] : this.comparisonData1.supplierAverage + this.echartsSeries1[2].data.push(this.supplierAverage[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.supplierRange = this.comparisonData1.supplierRange === null ? ['', '', '', '', ''] : this.comparisonData1.supplierRange + this.localULC = this.comparisonData1.localULC + this.echartsSeries1[0].data.push(this.localULC[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.localLCL = this.comparisonData1.localLCL + this.echartsSeries1[1].data.push(this.localLCL[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.localAverage = this.comparisonData1.localAverage + this.echartsSeries1[2].data.push(this.localAverage[0]) // 娴嬮噺鏁版嵁鏍囧噯宸姣旀煴鐘跺浘鏁版嵁 + this.localRange = this.comparisonData1.localRange + }, + submitForm () { + this.$refs['supplierForm'].validate((valid) => { + if (valid) { + const params = { + orderIds: this.selectRow.orderIds, + itemNames: this.selectRow.itemNames, + supplierDataList: Object.values(this.supplierForm) + } + this.$axios.post(this.$api.dataAnalysis.getRawSupplierCompare, params, { + headers: { + 'Content-Type': 'application/json' + }, + noQs: true + }).then(res => { + if (res.code === 201) { + return + } + this.comparisonData1 = res.data + this.getInfo1() + }) + } else { + console.log('error submit!!'); + return false; + } + }); + }, + resetForm () { + this.$refs['supplierForm'].resetFields(); + }, + }, +} +</script> + +<style scoped> +.title { + height: 60px; + line-height: 60px; +} +.container { + width: calc(100% - 20px); + height: calc(100vh - 170px); + background-color: #fff; + padding: 10px; + overflow-y: auto; +} +.table { + width: 100%; +} +.thTitle { + background-color: #e0eaf5; + padding: 6px 2px; +} +.thBack { + text-align: center; + background-color: #e0eaf5; + padding: 2px; +} +.thBack2 { + text-align: center; + background-color: #e4f2da; + padding: 2px; +} +.tdData { + padding: 4px; + text-align: center; + font-size: 13px; + width: 10%; +} +.inspection-card{ + width: 100%; + background: #FFFFFF; + margin-top: 10px; +} +.echartsTitle { + text-align: center; + padding-bottom: 10px; +} +</style> diff --git a/src/components/echarts/echarts.vue b/src/components/echarts/echarts.vue new file mode 100644 index 0000000..7b8e67c --- /dev/null +++ b/src/components/echarts/echarts.vue @@ -0,0 +1,238 @@ +<template> + <div> + <div id="id" ref="chart" :style="chartStyle"></div> + </div> +</template> + +<script> +import * as echarts from 'echarts' +import ResizeListener from 'element-resize-detector'; + +export default { + name: 'EChart', + props: { + options: { + type: Object, + default: () => ({}) + }, + chartStyle: { + type: Object, + default: () => ({ + height: '80%', + width: '100%' + }) + }, + dataset: { + type: Object, + default: () => {} + }, + xAxis: { + type: Array, + default: () => [] + }, + yAxis: { + type: Array, + default: () => [] + }, + series: { + type: Array, + default: () => [] + }, + grid: { + type: Object, + default: () => ({}) + }, + legend: { + type: Object, + default: () => ({}) + }, + tooltip: { + type: Object, + default: () => ({}) + }, + lineColors: { + type: Array, + default: () => ['#00BAFF', '#3DE7C9', '#CCEDF0', '#FFB71C', '#FF5A5A'] + }, + barColors: { + type: Array, + default: () => ['#ff8800', '#3DE7C9', '#CCEDF0', '#FFB71C', '#FF5A5A'] + }, + loadingOption: { + type: Object, + default: () => ({ + text: '鏁版嵁鍔犺浇涓�...', + color: '#00BAFF', + textColor: '#000', + maskColor: 'rgba(255, 255, 255, 0.8)', + zlevel: 0 + }) + } + }, + data() { + return { + chartInstance: null, + } + }, + watch: { + options: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + series: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + dataset: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + xAxis: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + yAxis: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + grid: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + legend: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + tooltip: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + lineColors: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + barColors: { + deep: true, + // immediate: true, + handler(val) { + this.$nextTick(() => { + this.renderChart() + }) + }, + }, + }, + mounted() { + this.chartInstance = echarts.init(this.$refs.chart) + this.renderChart() + window.addEventListener('resize', this.windowResizeListener); + }, + beforeDestroy() { + this.dispose() + }, + methods: { + /* 褰撶獥鍙g缉鏀炬椂锛宔chart鍔ㄦ�佽皟鏁磋嚜韬ぇ灏� */ + windowResizeListener() { + if (!this.chartInstance) return; + this.dispose() + this.chartInstance = echarts.init(this.$refs.chart) + this.renderChart() + this.chartInstance.resize(); + }, + renderChart() { + const option = { + backgroundColor: this.options.backgroundColor || '#fff', + xAxis: this.xAxis, + yAxis: this.yAxis, + dataset: this.dataset, + series: this.series, + grid: this.grid, + legend: this.legend, + tooltip: this.tooltip + } + // 鏍规嵁浼犲叆鐨勬暟鎹拰閰嶇疆鍙傛暟鐢熸垚鍥捐〃 + this.generateChart(option) + }, + + generateChart(option) { + // 閰嶇疆鎶樼嚎鍥惧拰鏌辩姸鍥剧殑鏍峰紡 + if (option.series && option.series.length > 0) { + option.series.forEach((s, index) => { + if (s.type === 'line') { + s.itemStyle = { + color: this.lineColors[index] || this.lineColors[0] + } + s.lineStyle = { + color: this.lineColors[index] || this.lineColors[0] + } + } else if (s.type === 'bar') { + s.itemStyle = { + color: this.barColors[index] || this.barColors[0] + } + } + }) + } + this.chartInstance.clear() + + // 娓叉煋鍥捐〃 + this.chartInstance.setOption(option) + }, + + dispose() { + if (this.chartInstance) { + window.removeEventListener('resize', this.chartInstance.resize);//閿�姣佸浘琛ㄧ洃鍚簨浠� + this.chartInstance.dispose() + this.chartInstance = null + } + } + }, +} +</script> + +<style scoped> +/* 鍦ㄨ繖閲屽彲浠ュ啓鏍峰紡锛屾瘮濡傝缃浘琛ㄥ鍣ㄧ殑瀹藉害鍜岄珮搴� */ +</style> diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index da89cf9..e9566ab 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -12,6 +12,16 @@ <div class="avatar-wrapper"> <img :src="avatar" class="user-avatar" /> <span class="userName">{{ nickName }}</span> + <el-dropdown class="avatar-container right-menu-item hover-effect" trigger="click"> + <div class="avatar-wrapper"> + <i class="el-icon-caret-bottom" /> + </div> + <el-dropdown-menu slot="dropdown"> + <router-link to="/user/profile"> + <el-dropdown-item>涓汉涓績</el-dropdown-item> + </router-link> + </el-dropdown-menu> + </el-dropdown> <img class="logoout" src="@/assets/images/logoout.png" @@ -211,9 +221,6 @@ } } - .avatar-container { - margin-right: 30px; - } } } </style> diff --git a/src/router/index.js b/src/router/index.js index f6b55c0..eb196f1 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -104,18 +104,19 @@ path: "customsInspection", component: () => import("@/views/business/materialOrder/customsInspection"), - name: "customsInspection", + name: "CustomsInspection", meta: { title: "鍘熸潗鏂欎笅鍗曡鎯�", activeMenu: "/business/materialOrder", + keepAlive: true }, }, { // 閾滄潗鏂欎笅鍗� path: "copperOrder", component: () => import("@/views/business/materialOrder/copperOrder"), - name: "copperOrder", - meta: { title: "閾滄潗鏂欎笅鍗�", activeMenu: "/business/materialOrder" }, + name: "CopperOrder", + meta: { title: "閾滄潗鏂欎笅鍗�", activeMenu: "/business/materialOrder",keepAlive: true }, }, ], }, @@ -131,8 +132,8 @@ path: "add", component: () => import("@/views/business/productOrder/components/add.vue"), - name: "add", - meta: { title: "鎴愬搧涓嬪崟璇︽儏", activeMenu: "/business/materialOrder" }, + name: "Add", + meta: { title: "鎴愬搧涓嬪崟璇︽儏", activeMenu: "/business/materialOrder",keepAlive: true }, }, ], }, diff --git a/src/views/business/materialOrder/copperOrder.vue b/src/views/business/materialOrder/copperOrder.vue index 47ef83b..1ca4a5f 100644 --- a/src/views/business/materialOrder/copperOrder.vue +++ b/src/views/business/materialOrder/copperOrder.vue @@ -421,6 +421,7 @@ } export default { + name: 'CopperOrder', components: {}, dicts: ['check_type', 'urgency_level'], data() { @@ -723,7 +724,7 @@ this.noNeedCheckLoad = false if (res.code == 201) return this.$message.success('宸叉彁浜�') - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.noNeedCheckLoad = false }) @@ -1165,7 +1166,7 @@ if (res.code == 201) return this.$message.success('宸叉彁浜�') this.bsm3Dia = false; - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.saveLoad = false }) @@ -1781,8 +1782,16 @@ }, goBack () { + if (this.active == 1) { + this.$router.go(-1) + } else { + this.closeOpenPage() + } + }, + closeOpenPage() { this.$router.go(-1) - } + this.$tab.closeOpenPage() + }, } } </script> diff --git a/src/views/business/materialOrder/customsInspection.vue b/src/views/business/materialOrder/customsInspection.vue index 79fc1b1..1f50604 100644 --- a/src/views/business/materialOrder/customsInspection.vue +++ b/src/views/business/materialOrder/customsInspection.vue @@ -388,7 +388,7 @@ width="32%"> <span>{{ dialogMessage }}</span> <span slot="footer" class="dialog-footer"> - <el-button type="primary" @click="goBack()">纭� 瀹�</el-button> + <el-button type="primary" @click="dialogVisible= false,closeOpenPage()">纭� 瀹�</el-button> </span> </el-dialog> <el-dialog @@ -633,7 +633,7 @@ this.standardMethodListId = null } }, - mounted() { + created() { this.active = this.$route.query.active this.orderType = this.$route.query.orderType this.currentId = this.$route.query.currentId @@ -1017,7 +1017,7 @@ if (res.code == 201) return this.noNeedCheckDia = false this.$message.success('宸叉彁浜�') - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.noNeedCheckLoad = false }) @@ -1069,7 +1069,7 @@ if (res.code == 201) return this.$message.success('宸叉彁浜�') this.bsm3Dia = false; - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.saveLoad = false }) @@ -1832,8 +1832,16 @@ return row[property] === value; }, goBack () { + if (this.active == 1) { + this.$router.go(-1) + } else { + this.closeOpenPage() + } + }, + closeOpenPage() { this.$router.go(-1) - } + this.$tab.closeOpenPage() + }, } } </script> diff --git a/src/views/business/productOrder/components/add.vue b/src/views/business/productOrder/components/add.vue index 93e2d2c..d3e19c0 100644 --- a/src/views/business/productOrder/components/add.vue +++ b/src/views/business/productOrder/components/add.vue @@ -50,10 +50,10 @@ </el-select> </el-form-item> <el-form-item label="鍒跺崟浜�:"> - <el-input v-model="addObj.custom" disabled size="small"></el-input> + <el-input v-model="addObj.custom" disabled size="small" clearable></el-input> </el-form-item> <el-form-item label="濮旀墭鍗曚綅:" prop="company"> - <el-input v-model="addObj.company" disabled placeholder="閫夋嫨濮旀墭鍗曚綅" size="small" style="width: 200px"> + <el-input v-model="addObj.company" disabled placeholder="閫夋嫨濮旀墭鍗曚綅" size="small" style="width: 208px"> <template slot="append"> <el-button slot="append" :disabled="active>1&&tabIndex!=4" icon="el-icon-search" @click="openCompanyList"></el-button> @@ -69,14 +69,14 @@ </el-select> </el-form-item> <el-form-item label="鏍峰搧鍚嶇О:" prop="sample"> - <el-input v-model="addObj.sample" disabled size="small" style="width: 178px"> + <el-input v-model="addObj.sample" disabled size="small" style="width: 208px"> <template slot="append"><el-button slot="append" :disabled="active>1&&tabIndex!=4" icon="el-icon-search" @click="selectStandardTree = true"></el-button></template> </el-input> </el-form-item> - <el-form-item label="鏍峰搧鏁伴噺:" prop="sampleNum"> + <el-form-item label="鏍峰搧鏁伴噺:" prop="sampleNum" style="margin-right: 0"> <el-input-number v-model="addObj.sampleNum" :disabled="active>1" :max="100" :min="1" :precision="0" - size="small" style="width: 65%;" @change="addStandardTree"></el-input-number> + size="small" @change="addStandardTree"></el-input-number> </el-form-item> <el-form-item label="鏍峰搧鐘舵��:" prop="sampleStatus"> <el-select v-model="addObj.sampleStatus" :disabled="active>1&&tabIndex!=4" size="small"> @@ -87,21 +87,9 @@ <el-input v-model="addObj.testQuantity" :disabled="active>1&&tabIndex!=4" clearable size="small"></el-input> </el-form-item> <el-form-item label="鏉ユ牱鏂瑰紡:" prop="formType"> - <el-select v-model="addObj.formType" :disabled="active>1&&tabIndex!=4" size="small"> + <el-select v-model="addObj.formType" :disabled="active>1&&tabIndex!=4" size="small" clearable> <el-option v-for="(a,ai) in dict.type.form_type" :key="ai" :label="a.label" :value="a.value"></el-option> </el-select> - </el-form-item> - <el-form-item label="鎶ュ憡鍙戦�佹柟寮�:"> - <el-radio-group v-model="addObj.send" :disabled="active>1&&tabIndex!=4"> - <el-radio :label="1">鑷彇</el-radio> - <el-radio :label="0">鍏朵粬</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="鏍峰搧澶勭悊鏂瑰紡:"> - <el-radio-group v-model="addObj.processing" :disabled="active>1&&tabIndex!=4"> - <el-radio :label="0">濮旀墭鍗曚綅鍙栧洖</el-radio> - <el-radio :label="1">瀹為獙瀹ゅ鐞�</el-radio> - </el-radio-group> </el-form-item> <el-form-item label="鐢熶骇鍗曚綅:" prop="production"> <el-input v-model="addObj.production" :disabled="active>1&&tabIndex!=4" clearable placeholder="璇疯緭鍏�" @@ -111,10 +99,22 @@ <el-input v-model="addObj.productionEn" :disabled="active>1&&tabIndex!=4" clearable placeholder="璇疯緭鍏�" size="small"></el-input> </el-form-item> + <el-form-item label="鏍峰搧澶勭悊鏂瑰紡:"> + <el-radio-group v-model="addObj.processing" :disabled="active>1&&tabIndex!=4" size="mini"> + <el-radio :label="0" border style="margin-right: 0">濮旀墭鍗曚綅鍙栧洖</el-radio> + <el-radio :label="1" border>瀹為獙瀹ゅ鐞�</el-radio> + </el-radio-group> + </el-form-item> <el-form-item label="鏄惁鐣欐牱:"> - <el-radio-group v-model="addObj.isLeave" :disabled="active>1&&tabIndex!=4"> - <el-radio :label="0">涓嶇暀鏍�</el-radio> - <el-radio :label="1">鐣欐牱</el-radio> + <el-radio-group v-model="addObj.isLeave" border :disabled="active>1&&tabIndex!=4" size="mini"> + <el-radio :label="0" border style="margin-right: 0">涓嶇暀鏍�</el-radio> + <el-radio :label="1" border>鐣欐牱</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="鎶ュ憡鍙戦�佹柟寮�:"> + <el-radio-group v-model="addObj.send" :disabled="active>1&&tabIndex!=4" size="mini"> + <el-radio :label="1" border style="margin-right: 0">鑷彇</el-radio> + <el-radio :label="0" border>鍏朵粬</el-radio> </el-radio-group> </el-form-item> <el-form-item label="濮旀墭浜�:"> @@ -125,7 +125,7 @@ </el-form-item> <el-form-item label="澶囨敞:"> <el-input v-model="addObj.remark" :autosize="{ minRows: 2, maxRows: 2}" :disabled="active>1&&tabIndex!=4" :placeholder="active>1 ? '' : '璇疯緭鍏�'" clearable - size="small" type="textarea"></el-input> + size="small" style="width: 100%" type="textarea"></el-input> </el-form-item> <el-form-item label="澶囨敞鑻辨枃:"> <el-input v-model="addObj.remarkEn" :autosize="{ minRows: 2, maxRows: 2}" :disabled="active>1&&tabIndex!=4" :placeholder="active>1 ? '' : '璇疯緭鍏�'" clearable @@ -176,10 +176,9 @@ </el-form-item> </el-form> </div> - <div style="display: flex;align-items: center"> + <div style="display: flex;align-items: center;margin-bottom: 10px"> <span style="width: 150px;font-size: 14px;text-align: right;">鐗规畩鏍囧噯锛�</span> - <el-input v-model="specialStandardMethod" :disabled="!isSpecial" clearable - size="small"></el-input> + <el-input v-model="specialStandardMethod" :disabled="!isSpecial" clearable size="small"></el-input> <el-button v-show="active==1" size="small" style="margin-left: 10px" type="primary" @click="editSpecial">缂栬緫</el-button> </div> @@ -432,7 +431,7 @@ </div> <span slot="footer" class="dialog-footer"> <el-row> - <el-button @click="issuedDialogVisible=false;goBack">鍙� 娑�</el-button> + <el-button @click="issuedDialogVisible=false;closeOpenPage">鍙� 娑�</el-button> <el-button :loading="upLoad" type="primary" @click="submitForm2">纭� 瀹�</el-button> </el-row> </span> @@ -560,6 +559,7 @@ import {selectCustomPageList} from "@/api/system/customer"; export default { + name: 'Add', components: { limsTable, cableConfig, @@ -1210,7 +1210,7 @@ this.saveLoad = false this.$message.success('宸叉彁浜�') this.bsm3Dia = false; - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.saveLoad = false }) @@ -1220,7 +1220,7 @@ this.saveLoad = false this.$message.success('宸叉彁浜�') this.bsm3Dia = false; - this.goBack() + this.closeOpenPage() }).catch(e=>{ this.saveLoad = false }) @@ -1283,7 +1283,7 @@ this.$message.success('鎻愪氦鎴愬姛') this.upLoad = false this.issuedDialogVisible = false - this.goBack() + this.closeOpenPage() }).catch(e => { this.$message.error('鎻愪氦澶辫触') this.upLoad = false @@ -1921,16 +1921,12 @@ state: 2, id: this.currentId, tell: this.tell - }, { - headers: { - 'Content-Type': 'application/json' - } }).then(res => { this.noLoading = false; this.tell = ''; this.$message.success('鎻愪氦鎴愬姛') this.issuedDialogVisible = false; - this.goBack() + this.closeOpenPage() }) }, filterHandler(value, row, column) { @@ -2143,8 +2139,16 @@ this.productList0.splice(index,1) }, goBack () { + if (this.active == 1) { + this.$router.go(-1) + } else { + this.closeOpenPage() + } + }, + closeOpenPage() { this.$router.go(-1) - } + this.$tab.closeOpenPage() + }, } } </script> diff --git a/src/views/statisticalCharts/itemInspectionAnalysis/index.vue b/src/views/statisticalCharts/itemInspectionAnalysis/index.vue new file mode 100644 index 0000000..29616cd --- /dev/null +++ b/src/views/statisticalCharts/itemInspectionAnalysis/index.vue @@ -0,0 +1,535 @@ +<template> + <div class="app-container"> + <div v-if="!isShowDataCom"> + <el-form ref="entity" size="small" :inline="true"> + <el-form-item style="width: 16%;"> + <el-date-picker + v-model="datePicker" + end-placeholder="缁撴潫鏃ユ湡" + format="yyyy-MM-dd" + placeholder="閫夋嫨鏃ユ湡" + range-separator="鑷�" + size="small" + start-placeholder="寮�濮嬫棩鏈�" + style="width: 100%;" + type="daterange" + value-format="yyyy-MM-dd"> + </el-date-picker> + </el-form-item> + <el-form-item label="鏍峰搧鍚嶇О" prop="sampleName"> + <el-input v-model="sampleName" clearable placeholder="璇疯緭鍏ユ牱鍝佸悕绉�" size="small"></el-input> + </el-form-item> + <el-form-item label="鍨嬪彿" prop="modelName"> + <el-input v-model="modelName" clearable placeholder="璇疯緭鍏ュ瀷鍙�" size="small"></el-input> + </el-form-item> + <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName"> + <el-input v-model="supplierName" clearable placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" size="small"></el-input> + </el-form-item> + <el-form-item label="妫�楠岄」鍚嶇О" prop="supplierName"> + <el-select v-model="itemNames" :loading="selectLoading" clearable multiple placeholder="璇烽�夋嫨" + size="small" style="width: 90%;" @focus="getItemList"> + <el-option + v-for="item in itemNamesList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button size="small" type="primary" @click="changeData">鏌ヨ</el-button> + </el-form-item> + </el-form> + </div> + <div v-if="!isShowDataCom" style="overflow-y: auto;height: calc(100% - 70px);overflow-x: hidden"> + <el-row> + <el-col :span="24"> + <div class="inspection-card"> + <div style="display: flex;align-items: center;margin-bottom: 10px;justify-content: space-between;"> + <div>鍘熸潗鏂欓」妫�鍒嗘瀽鍒楄〃</div> + <el-button size="small" type="primary" @click="openShowData">鏌ョ湅鏁版嵁鍒嗘瀽</el-button> + </div> + <lims-table :tableData="editTableData" :column="editColumn" + height="400" key="tableData" :isSelection="true" + :handleSelectionChange="handleSelectionChange" + :tableLoading="editLoading"></lims-table> + </div> + </el-col> + </el-row> + <el-row> + <el-col :span="6" style="padding-top: 14px"> + <div style="display: flex;margin-left: 10px;align-items: center"> + <span style="width: 100px">鍒嗙粍绫诲瀷锛�</span> + <el-select v-model="groupType" clearable placeholder="璇烽�夋嫨" + size="small" + style="width: 90%;" @change="getBarInfo"> + <el-option + v-for="item in groupTypeList" + :key="item.value" + :label="item.label" + :value="item.value"> + </el-option> + </el-select> + </div> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <div class="inspection-card"> + <div class="title">妫�楠岄」鏁版嵁瀵规瘮</div> + <Echarts ref="chart" + :chartStyle="chartStyle" + :dataset="dataset" + :grid="grid" + :options="echartsOptions" + :series="echartsSeries" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis" + style="height: 40vh;"></Echarts> + </div> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <div class="inspection-card"> + <div class="title">鍘熸潗鏂欓」妫�鍚堟牸鐜�</div> + <Echarts ref="chart" + :chartStyle="chartStyle" + :dataset="dataset1" + :grid="grid" + :options="echartsOptions1" + :series="echartsSeries1" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis1" + style="height: 40vh;"></Echarts> + </div> + </el-col> + </el-row> + </div> + <el-dialog :visible.sync="dataDialogVisible" title="鏁版嵁鏌ョ湅" width="80%"> + <div v-if="dataDialogVisible" style="height: 70vh;overflow-y: auto;"> + <lims-table :tableData="tableData" :column="column" + @pagination="pagination" key="tableData" + :page="page" :tableLoading="tableLoading"></lims-table> + </div> + </el-dialog> + <DataComparison v-if="isShowDataCom" :comparisonData="comparisonData" + :selectRow="selectRow" @goBack="goBack"></DataComparison> + </div> +</template> + +<script> +import Echarts from "@/components/echarts/echarts.vue"; +import DataComparison from '@/components/echarts/DataComparison.vue' +import limsTable from "@/components/Table/lims-table.vue"; +import { + getRawItemNames, + getRawProductAnalysis, + getRawProductAnalysisAllList, + getRawProductAnalysisRawPass, getRawSupplierCompare +} from "@/api/statisticalCharts/dataAnalysis"; +import {selectSampleAndProductByOrderId} from "@/api/business/rawMaterialOrder"; + +export default { + name: "ItemInspectionAnalysis", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {limsTable, Echarts, DataComparison}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + selectChangeRows: [], // 閫変腑鐨勬暟鎹� + groupTypeList: [ + {label: '鏍峰搧', value: '0'}, + {label: '鍚屼竴鍘傚, 鍚屼竴鍨嬪彿, 涓嶅悓鎵规', value: '1'}, + {label: '鍚屼竴鍨嬪彿, 涓嶅悓鍘傚', value: '2'}, + ], + itemNames: [], // 妫�楠岄」鍚嶇О + itemNamesList: [], + selectLoading: false, + datePicker: [], // 鏃堕棿 + groupType: '', // 鍒嗙粍 + beginDate: '', + endDate: '', + sampleName: '', // 鏍峰搧鍚嶇О + modelName: '', // 鍨嬪彿 + supplierName: '', // 渚涘簲鍟嗗悕绉� + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + echartsOptions: {}, + echartsOptions1: {}, + dataset: { + dimensions: [], + source: [], + }, + dataset1: { + dimensions: [], + source: [], + }, + xAxis: [{ type: 'category' }], + yAxis: [{}], + yAxis1: [{ + axisLabel: { + formatter: '{value} %' + } + }], + echartsSeries: [], + echartsSeries1: [], + tooltip: {}, + chartStyle: { + width: '100%', + height: '96%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴� + }, + editColumn: [ + { + label: '鎵瑰彿', + minWidth: '120px', + prop: 'updateBatchNo' + }, { + label: '濮旀墭缂栧彿', + minWidth: '120px', + prop: 'entrustCode' + }, { + label: '闆朵欢鍙�', + minWidth: '120px', + prop: 'partNo' + }, { + label: '闆朵欢鎻忚堪', + minWidth: '120px', + prop: 'partDesc' + }, { + label: '渚涘簲鍟嗗悕绉�', + minWidth: '120px', + prop: 'supplierName', + }, { + dataType: 'tag', + label: '妫�楠岀姸鎬�', + prop: 'inspectStatus', + minWidth: '120px', + formatData: (params) => { + if (params == 0) { + return '妫�楠屼腑' + } else if (params == 1) { + return '鍚堟牸' + } else if (params == 2) { + return '涓嶅悎鏍�' + } else if (params == 3) { + return '鏈笅鍗�' + } else if (params == 4) { + return '璁╂鏀捐' + } + }, + formatType: (params) => { + if (params == 1 || params == 4) { + return 'success' + } else if (params == 3) { + return 'warning' + } else if (params == 0 || params == 2) { + return 'danger' + } + } + }, { + label: '鏍峰搧鍚嶇О', + minWidth: '300px', + prop: 'sampleName' + }, { + label: '鏍峰搧鍨嬪彿', + minWidth: '300px', + prop: 'sampleModel' + },{ + label: '涓嬪彂鏃堕棿', + minWidth: '120px', + prop: 'sendTime' + },{ + label: '鎶佃揪鐨勯噰璐暟閲�', + minWidth: '130px', + prop: 'qtyArrived' + },{ + label: '鍗曚綅', + minWidth: '120px', + prop: 'buyUnitMeas' + }, + { + dataType: 'action', + width: '80px', + label: '鎿嶄綔', + fixed: 'right', + operation: [ + { + name: '鏁版嵁鏌ョ湅', + type: 'text', + clickFun: (row) => { + this.handleDataLook(row); + }, + }, + ] + } + ], + editTableData: [], + editLoading: false, + dataDialogVisible: false, + tableData: [], + tableLoading: false, + column: [ + {label: '鏍峰搧缂栧彿', prop: 'sampleCode'}, + {label: '鏍峰搧鍚嶇О', prop: 'sample'}, + {label: '妫�楠岄」鍒嗙被', prop: 'inspectionItemClass'}, + {label: '妫�楠岄」', prop: 'inspectionItem'}, + {label: '妫�楠屽瓙椤�', prop: 'inspectionItemSubclass'}, + {label: '鍗曚綅', prop: 'unit'}, + {label: '鏍峰搧鍨嬪彿', prop: 'model'}, + {label: '鏉′欢', prop: 'radius'}, + {label: '鐢电紗鏍囪瘑', prop: 'cableTag'}, + {label: '璇曢獙瑕佹眰', prop: 'tell'}, + {label: '妫�楠岀粨鏋�', prop: 'lastValue'}, + { + dataType: 'tag', + label: '缁撴灉鍒ゅ畾', + prop: 'insResult', + formatData: (params) => { + if (params == 1) { + return '鍚堟牸' + } else if (params == 0) { + return '涓嶅悎鏍�' + } else if (params == 3) { + return '涓嶅垽瀹�' + } else { + return null + } + }, + formatType: (params) => { + if (params == 1) { + return 'success' + } else if (params == 0) { + return 'danger' + } else if (params == 3) { + return '' + } else { + return null + } + } + } + ], + page: { + total:0, + size:10, + current:1 + }, + currentRow: {}, + isShowDataCom: false, + comparisonData: {}, + selectRow: {}, + } + }, + mounted() { + // this.getBar() + }, + // 鏂规硶闆嗗悎 + methods: { + getBarInfo (val) { + if (val === '1') { + if (!this.modelName || !this.supplierName) { + this.$message.warning('鍨嬪彿鎴栦緵搴斿晢涓嶈兘涓虹┖') + this.groupType = '' + return + } + } else if (val === '2') { + if (!this.modelName) { + this.$message.warning('鍨嬪彿涓嶈兘涓虹┖') + this.groupType = '' + return + } + if (this.supplierName) { + this.$message.warning('涓嶅彲閫変緵搴斿晢鍚嶇О') + this.groupType = '' + return + } + } + this.getBar() + this.getBar1() + }, + // 鑾峰彇鍚堟牸鐜囧浘琛ㄦ暟鎹� + getBar() { + this.echartsSeries = [] + const params = { + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + itemNames: this.itemNames, + groupType: this.groupType, + } + getRawProductAnalysis(params).then((res) => { + if (res.data === null) { + this.$message.warning('鏆傛棤鏁版嵁') + return + } + for (let i = 0; i < res.data.itemNames.length; i++) { + this.echartsSeries.push({type: 'line', label: { + show: true, + position: 'top' + },}) + } + this.dataset.dimensions = this.HaveJson(res.data.itemNames) + this.dataset.dimensions.unshift('product') + this.dataset.source = this.HaveJson(res.data.productList) + + }) + }, + getBar1() { + this.echartsSeries1 = [] + const params = { + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + itemNames: this.itemNames, + groupType: this.groupType, + } + getRawProductAnalysisRawPass(params).then((res) => { + if (res.data === null) { + this.$message.warning('鏆傛棤鏁版嵁') + return + } + for (let i = 0; i < res.data.itemNames.length; i++) { + this.echartsSeries1.push({type: 'line',tooltip: { + valueFormatter: function (value) { + return value + '%'; + } + },label: { + show: true, + position: 'top', + formatter: (params) => params.value[params.dimensionNames[params.encode.y[0]]] + '%' + },}) + } + this.dataset1.dimensions = this.HaveJson(res.data.itemNames) + this.dataset1.dimensions.unshift('product') + this.dataset1.source = this.HaveJson(res.data.productList) + + }) + }, + // 鏁版嵁鏌ョ湅 + handleDataLook(row) { + this.dataDialogVisible = true; + this.currentRow = row + this.refreshTable(row) + }, + // 鏌ヨ鍥炶皟 + refreshTable(row) { + selectSampleAndProductByOrderId({id: row.id}).then(res => { + this.tableLoading = false + if (res.code === 200) { + this.tableData = res.data.records + this.page.total = res.data.total + } + }).catch(err => { + this.tableLoading = false + }) + }, + pagination (page) { + this.page.size = page.limit + this.refreshTable(this.currentRow) + }, + changeData () { + if (this.datePicker !== null && this.datePicker.length > 0) { + this.beginDate = this.datePicker[0] + ' 00:00:00' + this.endDate = this.datePicker[1] + ' 23:59:59' + } else { + this.beginDate = '' + this.endDate = '' + } + this.getBar() + this.getBar1() + this.getTableData() + }, + getTableData () { + this.editLoading = true + const params = { + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + itemNames: this.itemNames, + } + getRawProductAnalysisAllList(params).then(res => { + this.editLoading = false + this.editTableData = res.data + }).catch(() => { + this.editLoading = false + }) + }, + // 鑾峰彇妫�楠岄」涓嬫媺妗� + getItemList () { + this.selectLoading = true + this.itemNamesList = [] + const params = { + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + } + getRawItemNames(params).then((res) => { + this.selectLoading = false + res.data.map(val => { + const obj = Object.assign({ + label: val, + value: val, + }) + this.itemNamesList.push(obj) + }) + }).catch(() => { + this.selectLoading = false + }) + }, + goBack () { + this.isShowDataCom = false + }, + openShowData () { + if (this.selectChangeRows.length !== 5) { + this.$message.warning('璇烽�夋嫨5鏉℃暟鎹�') + return + } + if (this.itemNames.length !== 1) { + this.$message.warning('鍙兘閫夋嫨1椤规楠岄」鍚嶇О') + return + } + let ids = [] + let itemNames = [] + this.selectChangeRows.forEach(item => { + ids.push(item.enterOrderId) + }) + this.itemNames.forEach(item => { + itemNames.push(item) + }) + const params = { + orderIds: ids, + itemNames: itemNames + } + getRawSupplierCompare(params).then(res => { + this.comparisonData = res.data + this.selectRow = params + this.isShowDataCom = true + }) + }, + handleSelectionChange (val) { + this.selectChangeRows = val + }, + }, +} +</script> + +<style scoped> +.inspection-card{ + width: 100%; + margin-top: 10px; +} +</style> diff --git a/src/views/statisticalCharts/qualificationRateStatistics/index.vue b/src/views/statisticalCharts/qualificationRateStatistics/index.vue new file mode 100644 index 0000000..4e8ae3c --- /dev/null +++ b/src/views/statisticalCharts/qualificationRateStatistics/index.vue @@ -0,0 +1,448 @@ +<template> + <div class="app-container"> + <el-row> + <el-col :span="4"> + <el-radio-group v-model="dateType" @change="changeDate"> + <el-radio-button label="1">鏈懆</el-radio-button> + <el-radio-button label="2">鏈湀</el-radio-button> + <el-radio-button label="3">浠婂勾</el-radio-button> + </el-radio-group> + </el-col> + <el-col :span="20"> + <el-form ref="entity" size="small" :inline="true"> + <el-form-item style="width: 20%;"> + <el-date-picker + v-model="datePicker" + end-placeholder="缁撴潫鏃ユ湡" + format="yyyy-MM-dd" + placeholder="閫夋嫨鏃ユ湡" + range-separator="鑷�" + size="small" + start-placeholder="寮�濮嬫棩鏈�" + type="daterange" + style="width: 100%;" + value-format="yyyy-MM-dd" + @change="changeDatePicker"> + </el-date-picker> + </el-form-item> + <el-form-item label="鏍峰搧鍚嶇О" prop="sampleName"> + <el-input v-model="sampleName" clearable placeholder="璇疯緭鍏ユ牱鍝佸悕绉�" size="small" @change="changeDate"></el-input> + </el-form-item> + <el-form-item label="鍨嬪彿" prop="modelName"> + <el-input v-model="modelName" clearable placeholder="璇疯緭鍏ュ瀷鍙�" size="small" @change="changeDate"></el-input> + </el-form-item> + <el-form-item label="渚涘簲鍟嗗悕绉�" prop="supplierName"> + <el-input v-model="supplierName" clearable placeholder="璇疯緭鍏ヤ緵搴斿晢鍚嶇О" size="small" @change="changeDate"></el-input> + </el-form-item> + </el-form> + </el-col> + </el-row> + <el-row :gutter="20"> + <el-col :span="8"> + <div class="pie-card"> + <div class="title">鍘熸潗鏂欏悎鏍肩巼</div> + <span class="data">{{passRate}}</span> + <Echarts ref="chart" + :legend="pieLegend" + :series="materialPieSeries" + :tooltip="pieTooltip" + style="height: 36vh;"></Echarts> + </div> + </el-col> + <el-col :span="8"> + <div class="pie-card"> + <div class="title"><span style="color: #F56C6C">鏈湀</span>妫�楠岀被鍨嬫暟閲�</div> + <Echarts ref="chart" + :chartStyle="chartStyle2" + :legend="pieLegend" + :series="materialPieSeries1" + :tooltip="pieTooltip" + style="height: 36vh;"></Echarts> + </div> + </el-col> + <el-col :span="8"> + <div class="pie-card"> + <div class="title">鍘熸潗鏂�<span style="color: #F56C6C">鏈湀</span>涓�<span style="color: #F56C6C">涓婃湀</span>鍚堟牸鐜囧姣�</div> + <Echarts ref="chart" + :barColors="barColors2" + :chartStyle="chartStyle" + :grid="grid" + :legend="barLegend" + :series="barSeries" + :tooltip="tooltip" + :xAxis="xAxis1" + :yAxis="yAxis1" + style="height: 36vh;"></Echarts> + </div> + </el-col> + </el-row> + <el-row> + <el-col :span="24"> + <div class="inspection-card"> + <div class="title">鍚堟牸鐜�</div> + <Echarts ref="chart" + :barColors="barColors" + :grid="grid" + :legend="legend" + :lineColors="lineColors" + :options="echartsOptions" + :series="echartsSeries" + :tooltip="tooltip" + :xAxis="xAxis" + :yAxis="yAxis" + style="height: 40vh;"></Echarts> + </div> + </el-col> + </el-row> + </div> +</template> + +<script> +import Echarts from "@/components/echarts/echarts.vue"; +import { + getOrderTypeCookie, + getRawPassRateByBarChart, + getRawPassRateByCake, + getRawUpMonth +} from "@/api/statisticalCharts/dataAnalysis"; + +export default { + name: "QualificationRateStatistics", + // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢� + components: {Echarts}, + data() { + // 杩欓噷瀛樻斁鏁版嵁 + return { + dateType: '1', + datePicker: [], + beginDate: '', + endDate: '', + sampleName: '', + modelName: '', + supplierName: '', + echartsOptions: { + title: { + text: '绀轰緥鍥捐〃', + left: 'center' + } + }, + xAxis: [ + { + type: 'category', + data: [], + axisPointer: { + type: 'shadow' + } + } + ], + yAxis: [ + { + type: 'value', + name: '鎬绘暟', + min: 0, + }, + { + type: 'value', + name: '鍚堟牸鐜�', + min: 0, + max: 100, + axisLabel: { + formatter: '{value} %' + } + } + ], + echartsSeries: [ + { + name: '鎬绘暟', + type: 'bar', + data: [], + label: { + show: true, + position: 'top' + }, + }, + { + name: '鍚堟牸鐜�', + type: 'line', + smooth: true, + tooltip: { + valueFormatter: function (value) { + return value + ' %'; + } + }, + label: { + show: true, + position: 'top', + formatter: function (value) { + return value.value + ' %'; + }, + distance: 14 + }, + yAxisIndex: 1, + data: [] + }, + ], + grid: { + left: '3%', + right: '4%', + bottom: '3%', + containLabel: true + }, + legend: { + data: ['鎬绘暟','鍚堟牸鐜�'] + }, + tooltip: { + trigger: 'axis', + axisPointer: { + type: 'shadow' + } + }, + lineColors: ['#409EFF'], + barColors: ['#E6A23C'], + barColors2: ['#adde8b'], + pieTooltip: { + trigger: 'item' + }, + pieLegend: { + orient: 'vertical', + right: 20, + top: 'middle', + }, + materialPieSeries: [ + { + name: 'Access From', + type: 'pie', + radius: ['40%', '70%'], + right: '22%', + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 5, + borderColor: '#fff', + borderWidth: 2 + }, + label: { + alignTo: 'edge', + formatter: '{name|{b}}\n{time|{c}}', + edgeDistance: 10, + lineHeight: 15, + rich: { + time: { + fontSize: 10, + color: '#999' + } + }, + }, + labelLine: { + length: 20, + length2: 40, + }, + data: [ + { value: 0, name: '涓嶅悎鏍兼暟閲�' }, + { value: 0, name: '鍚堟牸鏁伴噺' }, + ] + } + ], + materialPieSeries1: [ + { + name: 'Access From', + type: 'pie', + radius: ['40%', '70%'], + right: '22%', + avoidLabelOverlap: false, + itemStyle: { + borderRadius: 5, + borderColor: '#fff', + borderWidth: 2 + }, + label: { + alignTo: 'edge', + formatter: '{name|{b}}\n{time|{c}}', + edgeDistance: 10, + lineHeight: 15, + rich: { + time: { + fontSize: 10, + color: '#999' + } + }, + }, + labelLine: { + length: 20, + length2: 50, + }, + data: [ + { value: 0, name: '濮旀墭妫�楠�' }, + { value: 0, name: '杩涘巶妫�楠�' }, + { value: 0, name: '瀛e害妫�楠�' }, + { value: 0, name: '鎶芥牱' }, + ] + } + ], + barLegend: {}, + chartStyle: { + width: '90%', + height: '100%', + }, + chartStyle2: { + width: '90%', + height: '80%', + }, + xAxis1: [ + { + type: 'value', + min: 0, + max: 100, + axisLabel: { + formatter: '{value} %' + } + } + ], + yAxis1: [ + { + type: 'category', + data: [] + } + ], + barSeries: [ + { + type: 'bar', + data: [], + tooltip: { + valueFormatter: function (value) { + return value + ' %'; + } + }, + label: { + show: true, + formatter: (params) => Math.round(params.value * 100) / 100 + '%' + } + }, + ], + tableData: [], + passRate: '', + sum: '', + } + }, + mounted() { + this.getBar() + this.getRawPass() + this.getOrderType() + this.getPassRateCom() + }, + // 鏂规硶闆嗗悎 + methods: { + // 鑾峰彇鍚堟牸鐜囧浘琛ㄦ暟鎹� + getBar() { + const params = { + dateType: this.dateType, + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + } + getRawPassRateByBarChart(params).then((res) => { + let lineData = [] + let barData = [] + let xAxis = [] + res.data.forEach(item => { + barData.push(item.sum) + lineData.push(item.passRate) + xAxis.push(item.searchTime) + }) + this.echartsSeries[0].data = barData + this.echartsSeries[1].data = lineData + this.yAxis[0].max = Math.ceil(Math.max.apply(null, barData) / 50) * 50 + this.yAxis[0].interval = this.yAxis[0].max / 5 + this.xAxis[0].data = xAxis + }) + }, + // 鑾峰彇鍘熸潗鏂欏悎鏍肩巼鍥捐〃鏁版嵁 + getRawPass() { + const params = { + dateType: this.dateType, + beginDate: this.beginDate, + endDate: this.endDate, + sampleName: this.sampleName, + modelName: this.modelName, + supplierName: this.supplierName, + } + getRawPassRateByCake(params).then((res) => { + this.materialPieSeries[0].data[0].value = res.data.unQualified + this.materialPieSeries[0].data[1].value = res.data.qualified + this.passRate = res.data.passRate + '%' + }) + }, + // 鑾峰彇鏈湀妫�楠岀被鍨嬫暟閲� + getOrderType() { + getOrderTypeCookie().then((res) => { + if (res.code === 201) return + this.materialPieSeries1[0].data[0].value = res.data.customer // 濮旀墭 + this.materialPieSeries1[0].data[1].value = res.data.enter // 杩涘巶 + this.materialPieSeries1[0].data[2].value = res.data.quarterly // 瀛e害 + this.materialPieSeries1[0].data[3].value = res.data.spotCheck // 鎶芥牱 + }) + }, + // 鏈湀涓庝笂鏈堝悎鏍肩巼瀵规瘮 + getPassRateCom() { + getRawUpMonth().then((res) => { + let month = [] + let barData = [] + res.data.forEach(item => { + month.push(item.month) + barData.push(item.passRate) + }) + this.yAxis1[0].data = month + this.barSeries[0].data = barData + }) + }, + changeDate () { + this.getBar() + this.getRawPass() + // this.getOrderType() + // this.getPassRateCom() + }, + changeDatePicker (val) { + if (val) { + this.beginDate = val[0] + ' 00:00:00' + this.endDate = val[1] + ' 23:59:59' + } else { + this.beginDate = '' + this.endDate = '' + } + this.getBar() + this.getRawPass() + // this.getOrderType() + // this.getPassRateCom() + }, + }, +} +</script> + +<style scoped> +.title { + padding: 10px 0 0 20px; +} +.table { + padding: 0 10px 10px; +} +.pie-card { + width: 100%; + background: #FFFFFF; + margin-top: 10px; + position: relative; +} +.data { + position: absolute; + font-size: 20px; + transform: translate(-50%); + left: 40%; + top: 42%; + z-index: 1; +} +.inspection-card{ + width: 100%; + background: #FFFFFF; + margin-top: 10px; +} +</style> diff --git a/src/views/structural/capabilityAndLaboratory/capability/index.vue b/src/views/structural/capabilityAndLaboratory/capability/index.vue index 1bb6202..11d2981 100644 --- a/src/views/structural/capabilityAndLaboratory/capability/index.vue +++ b/src/views/structural/capabilityAndLaboratory/capability/index.vue @@ -385,8 +385,8 @@ this.$refs.upload.clearFiles() this.uploadDia = false this.uploading = false - if (response.code === 201) { - this.$message.error(response.message) + if (response.code !== 200) { + this.$message.error(response.msg) return } this.$message.success('涓婁紶鎴愬姛') -- Gitblit v1.9.3