| | |
| | | <el-row :gutter="20"> |
| | | <!-- åç±»å宿æ°é --> |
| | | <el-col :span="9"> |
| | | <el-card class="chart-card" |
| | | shadow="hover"> |
| | | <el-card class="chart-card" shadow="hover"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <div class="chart-title-line"></div> |
| | |
| | | <div class="top-container"> |
| | | <div class="typeNum"> |
| | | <div class="typeNum-left"> |
| | | <img src="~@/assets/images/chartCard.svg" |
| | | alt="å¾è¡¨" |
| | | <img src="~@/assets/images/chartCard.svg" alt="å¾è¡¨" |
| | | style="width: 40px; height: 40px; object-fit: contain;"> |
| | | <div class="typeNum-left-text">åææ</div> |
| | | </div> |
| | |
| | | <div class="typeNum-right"> |
| | | <div class="typeNum-right-top"> |
| | | <div class="typeNum-right-top-name">æ»æ°é</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(0, 'totalCount') }} <span |
| | | class="unit">个</span></div> |
| | | </div> |
| | | <div class="typeNum-right-bottom"> |
| | | <div class="typeNum-right-top-name">已宿æ°</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(0, 'completedCount') }} <span |
| | | class="unit">个</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="typeNum"> |
| | | <div class="typeNum-left"> |
| | | <img src="~@/assets/images/chartCard2.svg" |
| | | alt="å¾è¡¨" |
| | | <img src="~@/assets/images/chartCard2.svg" alt="å¾è¡¨" |
| | | style="width: 40px; height: 40px; object-fit: contain;"> |
| | | <div class="typeNum-left-text" |
| | | style="color: #5EB334;">åæå</div> |
| | | <div class="typeNum-left-text" style="color: #5EB334;">åæå</div> |
| | | </div> |
| | | <div class="typeNum-center"> |
| | | <div class="typeNum-leftLine2">-</div> |
| | |
| | | <div class="typeNum-right"> |
| | | <div class="typeNum-right-top"> |
| | | <div class="typeNum-right-top-name">æ»æ°é</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'totalCount') }} <span |
| | | class="unit">个</span></div> |
| | | </div> |
| | | <div class="typeNum-right-bottom"> |
| | | <div class="typeNum-right-top-name">已宿æ°</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(1, 'completedCount') }} <span |
| | | class="unit">个</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="typeNum"> |
| | | <div class="typeNum-left"> |
| | | <img src="~@/assets/images/chartCard3.svg" |
| | | alt="å¾è¡¨" |
| | | <img src="~@/assets/images/chartCard3.svg" alt="å¾è¡¨" |
| | | style="width: 40px; height: 40px; object-fit: contain;"> |
| | | <div class="typeNum-left-text" |
| | | style="color: #8000FF;">æå</div> |
| | | <div class="typeNum-left-text" style="color: #8000FF;">æå</div> |
| | | </div> |
| | | <div class="typeNum-center"> |
| | | <div class="typeNum-leftLine3">-</div> |
| | |
| | | <div class="typeNum-right"> |
| | | <div class="typeNum-right-top"> |
| | | <div class="typeNum-right-top-name">æ»æ°é</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(2, 'totalCount') }} <span |
| | | class="unit">个</span></div> |
| | | </div> |
| | | <div class="typeNum-right-bottom"> |
| | | <div class="typeNum-right-top-name">已宿æ°</div> |
| | | <div class="typeNum-right-top-text">2099 <span class="unit">个</span></div> |
| | | <div class="typeNum-right-top-text">{{ getInspectStatValue(2, 'completedCount') }} <span |
| | | class="unit">个</span> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </el-col> |
| | | <!-- è´¨æ£åæ ¼ç --> |
| | | <el-col :span="15"> |
| | | <el-card class="chart-card" |
| | | shadow="hover"> |
| | | <el-card class="chart-card" shadow="hover"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <div class="chart-title-line"></div> |
| | |
| | | <div class="top-container flex-center"> |
| | | <div class="quality-card blue-card"> |
| | | <div class="quality-card-title"> |
| | | <img src="~@/assets/images/chartCard.svg" |
| | | alt="åææ" |
| | | <img src="~@/assets/images/chartCard.svg" alt="åææ" |
| | | style="width: 24px; height: 24px; margin-right: 8px;"> |
| | | åææåæ ¼ç |
| | | </div> |
| | |
| | | <div> |
| | | <div class="quality-item-label blue-label">宿ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(0, 'completionRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="materialCompletionChart"></div> |
| | | <div class="quality-item-chart" ref="materialCompletionChart"></div> |
| | | </div> |
| | | <div class="quality-item"> |
| | | <div> |
| | | <div class="quality-item-label green-label">åæ ¼ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(0, 'passRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="materialQualityChart"></div> |
| | | <div class="quality-item-chart" ref="materialQualityChart"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="quality-card green-card"> |
| | | <div class="quality-card-title"> |
| | | <img src="~@/assets/images/chartCard2.svg" |
| | | alt="åæå" |
| | | <img src="~@/assets/images/chartCard2.svg" alt="åæå" |
| | | style="width: 24px; height: 24px; margin-right: 8px;"> |
| | | åæååæ ¼ç |
| | | </div> |
| | |
| | | <div> |
| | | <div class="quality-item-label blue-label">宿ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(1, 'completionRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="semiCompletionChart"></div> |
| | | <div class="quality-item-chart" ref="semiCompletionChart"></div> |
| | | </div> |
| | | <div class="quality-item"> |
| | | <div> |
| | | <div class="quality-item-label green-label">åæ ¼ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(1, 'passRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="semiQualityChart"></div> |
| | | <div class="quality-item-chart" ref="semiQualityChart"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="quality-card purple-card"> |
| | | <div class="quality-card-title"> |
| | | <img src="~@/assets/images/chartCard3.svg" |
| | | alt="æå" |
| | | <img src="~@/assets/images/chartCard3.svg" alt="æå" |
| | | style="width: 24px; height: 24px; margin-right: 8px;"> |
| | | æååæ ¼ç |
| | | </div> |
| | |
| | | <div> |
| | | <div class="quality-item-label blue-label">宿ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(2, 'completionRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="finalCompletionChart"></div> |
| | | <div class="quality-item-chart" ref="finalCompletionChart"></div> |
| | | </div> |
| | | <div class="quality-item"> |
| | | <div> |
| | | <div class="quality-item-label green-label">åæ ¼ç</div> |
| | | <div class="quality-item-tip">å æ¯</div> |
| | | <div class="quality-item-value">80%</div> |
| | | <div class="quality-item-value">{{ getPassRateStatValue(2, 'passRate') }}</div> |
| | | </div> |
| | | <div class="quality-item-chart" |
| | | ref="finalQualityChart"></div> |
| | | <div class="quality-item-chart" ref="finalQualityChart"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <el-row :gutter="20"> |
| | | <!-- è´¨æ£åæ ¼ç --> |
| | | <el-col :span="24"> |
| | | <el-card class="chart-card" |
| | | shadow="hover"> |
| | | <el-card class="chart-card" shadow="hover"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <div class="chart-title-line"></div> |
| | |
| | | </template> |
| | | <div class="chart-container-line"> |
| | | <div class="container-line-left"> |
| | | <div style="height: 100%; width: 100%;" |
| | | ref="usageChartRef"> |
| | | <div style="height: 100%; width: 100%;" ref="usageChartRef"> |
| | | </div> |
| | | </div> |
| | | <div class="container-line-right"> |
| | | <div style="height: 80%; width: 100%;" |
| | | ref="inspectionChartRef"> |
| | | <div style="height: 80%; width: 100%;" ref="inspectionChartRef"> |
| | | </div> |
| | | <div class="container-line-right-bottom"> |
| | | <div class="inspection-chart-box"> |
| | | <div class="chart-box-title">åæææ½æ£æ°</div> |
| | | <div class="chart-box-num">600</div> |
| | | <div class="chart-box-title">åæææ»æ°</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(0, 'totalCount') }}</div> |
| | | </div> |
| | | <div class="inspection-chart-box"> |
| | | <div class="chart-box-title">åæåæ½æ£æ°</div> |
| | | <div class="chart-box-num">200</div> |
| | | <div class="chart-box-title">åæåæ»æ°</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(1, 'totalCount') }}</div> |
| | | </div> |
| | | <div class="inspection-chart-box"> |
| | | <div class="chart-box-title">æåæ½æ£æ°</div> |
| | | <div class="chart-box-num">200</div> |
| | | <div class="chart-box-title">æåæ»æ°</div> |
| | | <div class="chart-box-num">{{ getYearlyStatValue(2, 'totalCount') }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | class="chart-container"></div> --> |
| | | <div class="yearchange"> |
| | | <div style="margin-right: 8px;font-size: 14px;">年份:</div> |
| | | <el-date-picker v-model="value3" |
| | | size="mini" |
| | | :clearable="false" |
| | | style="width: 60px;" |
| | | type="year" |
| | | :disabled-date="disabledDate" |
| | | placeholder=""> |
| | | <el-date-picker v-model="value3" size="mini" :clearable="false" style="width: 60px;" type="year" |
| | | :disabled-date="disabledDate" placeholder=""> |
| | | </el-date-picker> |
| | | </div> |
| | | </el-card> |
| | |
| | | <el-row :gutter="20"> |
| | | <!-- æ ·åè¿åº¦å¾è¡¨ --> |
| | | <el-col :span="12"> |
| | | <el-card class="chart-card" |
| | | shadow="hover"> |
| | | <el-card class="chart-card" shadow="hover"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <div class="chart-title-line"></div> |
| | | <span>è´¨é宿æç»</span> |
| | | </div> |
| | | </template> |
| | | <div ref="equipmentChartRef" |
| | | class="chart-container"></div> |
| | | <div ref="equipmentChartRef" class="chart-container"></div> |
| | | </el-card> |
| | | </el-col> |
| | | <!-- 设å¤ä½¿ç¨å¾è¡¨ --> |
| | | <el-col :span="12"> |
| | | <el-card class="chart-card" |
| | | shadow="hover"> |
| | | <el-card class="chart-card" shadow="hover"> |
| | | <template #header> |
| | | <div class="card-header"> |
| | | <div class="chart-title-line"></div> |
| | |
| | | <div class="container-line2-left"> |
| | | <div class="info-box"> |
| | | <div class="info-box-header">项ç®åå¸</div> |
| | | <div class="info-line"> |
| | | <div class="info-icon" |
| | | style="background-color: #165DFF"></div> |
| | | <div class="info-line-title">ç©çæ§è½</div> |
| | | <div class="info-line-value1">30%</div> |
| | | <div class="info-line-value2">300</div> |
| | | </div> |
| | | <div class="info-line"> |
| | | <div class="info-icon" |
| | | style="background-color: #14C9C9;"></div> |
| | | <div class="info-line-title">ç©çæ§è½</div> |
| | | <div class="info-line-value1">30%</div> |
| | | <div class="info-line-value2">300</div> |
| | | </div> |
| | | <div class="info-line"> |
| | | <div class="info-icon" |
| | | style="background-color: #F7BA1E;"></div> |
| | | <div class="info-line-title">ç©çæ§è½</div> |
| | | <div class="info-line-value1">30%</div> |
| | | <div class="info-line-value2">300</div> |
| | | </div> |
| | | <div class="info-line"> |
| | | <div class="info-icon" |
| | | style="background-color: #722ED1;"></div> |
| | | <div class="info-line-title">ç©çæ§è½</div> |
| | | <div class="info-line-value1">30%</div> |
| | | <div class="info-line-value2">300</div> |
| | | </div> |
| | | <div class="info-line"> |
| | | <div class="info-icon" |
| | | style="background-color: #3491FA;"></div> |
| | | <div class="info-line-title">ç©çæ§è½</div> |
| | | <div class="info-line-value1">30%</div> |
| | | <div class="info-line-value2">300</div> |
| | | <div class="info-line" v-for="(item, index) in topParametersData.list" :key="index"> |
| | | <div class="info-icon" :style="{ backgroundColor: getParameterColor(index) }"></div> |
| | | <div class="info-line-title">{{ item.name }}</div> |
| | | <div class="info-line-value1">{{ item.percentage }}%</div> |
| | | <div class="info-line-value2">{{ item.count }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div ref="sampleChartRef" |
| | | style="height: 100%; width: 50%;" |
| | | class="chart-container"></div> |
| | | <div ref="sampleChartRef" style="height: 100%; width: 50%;" class="chart-container"></div> |
| | | </div> |
| | | <!-- Tab éæ©å¨ --> |
| | | <div class="tab-selector"> |
| | | <div class="tab-item" |
| | | :class="{ active: activeTab === 'raw' }" |
| | | @click="activeTab = 'raw'">åææ</div> |
| | | <div class="tab-item" |
| | | :class="{ active: activeTab === 'semi' }" |
| | | @click="activeTab = 'semi'">åæå</div> |
| | | <div class="tab-item" |
| | | :class="{ active: activeTab === 'final' }" |
| | | @click="activeTab = 'final'">æå</div> |
| | | <div class="tab-item" :class="{ active: activeTab === 'raw' }" @click="activeTab = 'raw'">åææ</div> |
| | | <div class="tab-item" :class="{ active: activeTab === 'semi' }" @click="activeTab = 'semi'">åæå</div> |
| | | <div class="tab-item" :class="{ active: activeTab === 'final' }" @click="activeTab = 'final'">æå</div> |
| | | </div> |
| | | </el-card> |
| | | </el-col> |
| | |
| | | |
| | | <script setup> |
| | | import { ref, reactive, onMounted, nextTick } from "vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import { ElMessage } from "element-plus"; |
| | | import * as echarts from "echarts"; |
| | | import { Box, Tools, Document, ShoppingCart } from "@element-plus/icons-vue"; |
| | | import { getInspectStatistics, getPassRateStatistics, getMonthlyPassRateStatistics, getYearlyPassRateStatistics, getMonthlyCompletionDetails, getTopParameters } from "@/api/reportAnalysis/qualityReport"; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const filterForm = reactive({ |
| | |
| | | reportType: "sample", |
| | | }); |
| | | |
| | | const statistics = reactive({ |
| | | totalSamples: 1250, |
| | | activeEquipment: 45, |
| | | completedInspections: 890, |
| | | totalUsage: 2340, |
| | | }); |
| | | const inspectStatisticsData = ref([]); |
| | | const passRateStatisticsData = ref([]); |
| | | const monthlyPassRateData = ref([]); |
| | | const yearlyPassRateData = ref([]); |
| | | const monthlyCompletionDetailsData = ref([]); |
| | | const topParametersData = ref({ totalCount: 0, list: [] }); |
| | | const activeTab = ref("raw"); |
| | | |
| | | const getParameterColor = (index) => { |
| | | const colors = ['#165DFF', '#14C9C9', '#F7BA1E', '#722ED1', '#3491FA', '#FF7D00', '#F53F3F']; |
| | | return colors[index % colors.length]; |
| | | }; |
| | | |
| | | const getYearlyStatValue = (type, field) => { |
| | | const stat = yearlyPassRateData.value.find(item => item.inspectType === type); |
| | | return stat ? stat[field] : 0; |
| | | }; |
| | | |
| | | const getInspectStatValue = (type, field) => { |
| | | const stat = inspectStatisticsData.value.find(item => item.inspectType === type); |
| | | return stat ? stat[field] : 0; |
| | | }; |
| | | |
| | | const getPassRateStatValue = (type, field) => { |
| | | const stat = passRateStatisticsData.value.find(item => item.inspectType === type); |
| | | if (stat) { |
| | | if (field === 'completionRate' || field === 'passRate') { |
| | | return stat[field] ? Number(stat[field]).toFixed(0) + '%' : '0%'; |
| | | } |
| | | return stat[field]; |
| | | } |
| | | return field === 'completionRate' || field === 'passRate' ? '0%' : 0; |
| | | }; |
| | | |
| | | const fetchInspectStatisticsData = async () => { |
| | | try { |
| | | const res = await getInspectStatistics(); |
| | | if (res.code === 200) { |
| | | inspectStatisticsData.value = res.data; |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch inspect statistics:", error); |
| | | } |
| | | }; |
| | | |
| | | const fetchPassRateStatisticsData = async () => { |
| | | try { |
| | | const res = await getPassRateStatistics(); |
| | | if (res.code === 200) { |
| | | passRateStatisticsData.value = res.data; |
| | | // æ°æ®è·ååéæ°åå§åå¾è¡¨ |
| | | initAllQualityCharts(); |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch pass rate statistics:", error); |
| | | } |
| | | }; |
| | | |
| | | const fetchMonthlyPassRateData = async () => { |
| | | try { |
| | | const year = value3.value.getFullYear().toString(); |
| | | const res = await getMonthlyPassRateStatistics(year); |
| | | if (res.code === 200) { |
| | | monthlyPassRateData.value = res.data; |
| | | initUsageChart(); |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch monthly pass rate statistics:", error); |
| | | } |
| | | }; |
| | | |
| | | const fetchYearlyPassRateData = async () => { |
| | | try { |
| | | const year = value3.value.getFullYear().toString(); |
| | | const res = await getYearlyPassRateStatistics(year); |
| | | if (res.code === 200) { |
| | | yearlyPassRateData.value = res.data; |
| | | initInspectionChart(); |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch yearly pass rate statistics:", error); |
| | | } |
| | | }; |
| | | |
| | | const fetchMonthlyCompletionDetailsData = async () => { |
| | | try { |
| | | const year = value3.value.getFullYear().toString(); |
| | | const res = await getMonthlyCompletionDetails(year); |
| | | if (res.code === 200) { |
| | | monthlyCompletionDetailsData.value = res.data; |
| | | initEquipmentChart(); |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch monthly completion details:", error); |
| | | } |
| | | }; |
| | | |
| | | const fetchTopParametersData = async () => { |
| | | try { |
| | | const typeMap = { raw: 0, semi: 1, final: 2 }; |
| | | const res = await getTopParameters(typeMap[activeTab.value]); |
| | | if (res.code === 200) { |
| | | topParametersData.value = res.data; |
| | | initSampleChart(); |
| | | } |
| | | } catch (error) { |
| | | console.error("Failed to fetch top parameters:", error); |
| | | } |
| | | }; |
| | | |
| | | const tableData = ref([]); |
| | | const tableLoading = ref(false); |
| | |
| | | return time.getFullYear() > currentYear; |
| | | }; |
| | | |
| | | // Tab éæ©å¨å½åæ¿æ´»é¡¹ |
| | | const activeTab = ref("raw"); |
| | | // çå¬å¹´ä»½åå |
| | | import { watch } from "vue"; |
| | | watch(value3, () => { |
| | | fetchMonthlyPassRateData(); |
| | | fetchYearlyPassRateData(); |
| | | fetchMonthlyCompletionDetailsData(); |
| | | }); |
| | | |
| | | watch(activeTab, () => { |
| | | fetchTopParametersData(); |
| | | }); |
| | | |
| | | |
| | | // å¾è¡¨å¼ç¨ |
| | | const sampleChartRef = ref(null); |
| | |
| | | let finalCompletionChartInstance = null; |
| | | let finalQualityChartInstance = null; |
| | | |
| | | // åå§åæ°æ® |
| | | const initData = () => { |
| | | // 模æè¡¨æ ¼æ°æ® |
| | | tableData.value = [ |
| | | { |
| | | id: "SP001", |
| | | name: "æ ·åA-001", |
| | | type: "é屿æ", |
| | | status: "æ£æµä¸", |
| | | progress: 75, |
| | | createTime: "2025-01-15 09:30:00", |
| | | updateTime: "2025-01-20 14:20:00", |
| | | }, |
| | | { |
| | | id: "SP002", |
| | | name: "æ ·åB-002", |
| | | type: "塿å¶å", |
| | | status: "已宿", |
| | | progress: 100, |
| | | createTime: "2025-01-10 10:15:00", |
| | | updateTime: "2025-01-18 16:45:00", |
| | | }, |
| | | { |
| | | id: "SP003", |
| | | name: "æ ·åC-003", |
| | | type: "çµåå
ä»¶", |
| | | status: "å¾
æ£æµ", |
| | | progress: 0, |
| | | createTime: "2025-01-22 08:45:00", |
| | | updateTime: "2025-01-22 08:45:00", |
| | | }, |
| | | { |
| | | id: "EQ001", |
| | | name: "æ£æµè®¾å¤A", |
| | | type: "åææ", |
| | | status: "使ç¨ä¸", |
| | | progress: 60, |
| | | createTime: "2025-01-05 14:20:00", |
| | | updateTime: "2025-01-20 11:30:00", |
| | | }, |
| | | { |
| | | id: "EQ002", |
| | | name: "æ£æµè®¾å¤B", |
| | | type: "åæå", |
| | | status: "空é²", |
| | | progress: 0, |
| | | createTime: "2025-01-08 16:10:00", |
| | | updateTime: "2025-01-19 09:15:00", |
| | | }, |
| | | ]; |
| | | |
| | | pagination.total = tableData.value.length; |
| | | }; |
| | | |
| | | // åå§åæ ·åè¿åº¦å¾è¡¨ |
| | | const initSampleChart = () => { |
| | | if (sampleChartRef.value) { |
| | |
| | | // }, |
| | | series: [ |
| | | { |
| | | name: "æ ·åç¶æ", |
| | | name: "æ£æµé¡¹ç®", |
| | | type: "pie", |
| | | radius: ["40%", "80%"], |
| | | avoidLabelOverlap: false, |
| | |
| | | labelLine: { |
| | | show: false, |
| | | }, |
| | | data: [ |
| | | { value: 450, name: "已宿" }, |
| | | { value: 320, name: "æ£æµä¸" }, |
| | | { value: 280, name: "å¾
æ£æµ" }, |
| | | { value: 200, name: "å·²æå" }, |
| | | ], |
| | | data: topParametersData.value.list.map((item, index) => ({ |
| | | value: item.count, |
| | | name: item.name, |
| | | itemStyle: { color: getParameterColor(index) } |
| | | })), |
| | | }, |
| | | ], |
| | | }; |
| | |
| | | name: "åææ", |
| | | type: "bar", |
| | | barWidth: "15%", |
| | | data: [85, 75, 80, 85, 90, 88, 92, 87, 89, 91, 93, 95], |
| | | data: monthlyCompletionDetailsData.value.map(item => item.rawMaterialCount), |
| | | itemStyle: { |
| | | color: "#409EFF", |
| | | }, |
| | |
| | | type: "bar", |
| | | barWidth: "15%", |
| | | |
| | | data: [60, 65, 70, 68, 72, 75, 78, 80, 79, 82, 84, 85], |
| | | data: monthlyCompletionDetailsData.value.map(item => item.processCount), |
| | | itemStyle: { |
| | | color: "#67C23A", |
| | | }, |
| | |
| | | type: "bar", |
| | | barWidth: "15%", |
| | | |
| | | data: [75, 78, 80, 82, 85, 83, 86, 88, 87, 89, 90, 92], |
| | | data: monthlyCompletionDetailsData.value.map(item => item.outgoingCount), |
| | | itemStyle: { |
| | | color: "#E6A23C", |
| | | }, |
| | |
| | | series: [ |
| | | { |
| | | type: "pie", |
| | | radius: "80%", |
| | | radius: "70%", |
| | | data: [ |
| | | { value: 335, name: "åææ", itemStyle: { color: "#1890FF" } }, |
| | | { value: 310, name: "åæå", itemStyle: { color: "#F7BA1E" } }, |
| | | { value: 234, name: "æå", itemStyle: { color: "#14C9C9" } }, |
| | | { value: getYearlyStatValue(0, 'totalCount'), name: "åææ", itemStyle: { color: "#1890FF" } }, |
| | | { value: getYearlyStatValue(1, 'totalCount'), name: "åæå", itemStyle: { color: "#F7BA1E" } }, |
| | | { value: getYearlyStatValue(2, 'totalCount'), name: "æå", itemStyle: { color: "#14C9C9" } }, |
| | | ], |
| | | label: { |
| | | show: true, |
| | | formatter: '{b}: {c}' |
| | | }, |
| | | emphasis: { |
| | | itemStyle: { |
| | | shadowBlur: 10, |
| | |
| | | { |
| | | name: "åææ", // ç³»ååç§° |
| | | type: "line", // å¾è¡¨ç±»å为æçº¿å¾ |
| | | stack: "Total", // å å åç§° |
| | | symbol: "none", |
| | | // stack: "Total", // å å åç§° |
| | | symbol: "circle", |
| | | itemStyle: { |
| | | color: "#1890FF", // è®¾ç½®è¿æ¡çº¿çé¢è² |
| | | }, |
| | | data: [120, 132, 101, 134, 90, 230, 210, 182, 191, 234, 290, 330], // é¢ç¨æ¬¡æ°æ°æ® |
| | | data: monthlyPassRateData.value.map(item => item.rawMaterial.passRate), |
| | | }, |
| | | { |
| | | name: "åæå", // ç³»ååç§° |
| | | type: "line", // å¾è¡¨ç±»å为æçº¿å¾ |
| | | stack: "Total", // å å åç§° |
| | | symbol: "none", |
| | | // stack: "Total", // å å åç§° |
| | | symbol: "circle", |
| | | itemStyle: { |
| | | color: "#F7BA1E", // è®¾ç½®è¿æ¡çº¿çé¢è² |
| | | }, |
| | | data: [110, 125, 95, 128, 85, 220, 200, 175, 185, 225, 280, 320], // å½è¿æ¬¡æ°æ°æ® |
| | | data: monthlyPassRateData.value.map(item => item.process.passRate), |
| | | }, |
| | | { |
| | | name: "æå", // ç³»ååç§° |
| | | type: "line", // å¾è¡¨ç±»å为æçº¿å¾ |
| | | stack: "Total", // å å åç§° |
| | | symbol: "none", |
| | | // stack: "Total", // å å åç§° |
| | | symbol: "circle", |
| | | itemStyle: { |
| | | color: "#14C9C9", // è®¾ç½®è¿æ¡çº¿çé¢è² |
| | | }, |
| | | data: [110, 125, 95, 128, 85, 220, 200, 175, 185, 225, 280, 320], // å½è¿æ¬¡æ°æ°æ® |
| | | data: monthlyPassRateData.value.map(item => item.outgoing.passRate), |
| | | }, |
| | | ], |
| | | }; |
| | |
| | | }; |
| | | |
| | | // åå§åè´¨æ£åæ ¼çå¾è¡¨ |
| | | const initQualityChart = (chartRef, color) => { |
| | | const initQualityChart = (chartRef, color, value = 0.8) => { |
| | | if (chartRef.value) { |
| | | const chart = echarts.init(chartRef.value); |
| | | let chart = echarts.getInstanceByDom(chartRef.value); |
| | | if (!chart) { |
| | | chart = echarts.init(chartRef.value); |
| | | } |
| | | const numericValue = typeof value === 'string' ? parseFloat(value) / 100 : value / 100; |
| | | const option = { |
| | | series: [ |
| | | { |
| | |
| | | show: false, |
| | | }, |
| | | data: [ |
| | | { value: 0.8, itemStyle: { color: color } }, |
| | | { value: 0.2, itemStyle: { color: "#f5f5f5" } }, |
| | | { value: numericValue, itemStyle: { color: color } }, |
| | | { value: 1 - numericValue, itemStyle: { color: "#f5f5f5" } }, |
| | | ], |
| | | }, |
| | | ], |
| | |
| | | const initAllQualityCharts = () => { |
| | | materialCompletionChartInstance = initQualityChart( |
| | | materialCompletionChart, |
| | | "#1890ff" |
| | | "#1890ff", |
| | | getPassRateStatValue(0, 'completionRate') |
| | | ); |
| | | materialQualityChartInstance = initQualityChart( |
| | | materialQualityChart, |
| | | "#52c41a" |
| | | "#52c41a", |
| | | getPassRateStatValue(0, 'passRate') |
| | | ); |
| | | semiCompletionChartInstance = initQualityChart( |
| | | semiCompletionChart, |
| | | "#1890ff" |
| | | "#1890ff", |
| | | getPassRateStatValue(1, 'completionRate') |
| | | ); |
| | | semiQualityChartInstance = initQualityChart(semiQualityChart, "#52c41a"); |
| | | semiQualityChartInstance = initQualityChart( |
| | | semiQualityChart, |
| | | "#52c41a", |
| | | getPassRateStatValue(1, 'passRate') |
| | | ); |
| | | finalCompletionChartInstance = initQualityChart( |
| | | finalCompletionChart, |
| | | "#1890ff" |
| | | "#1890ff", |
| | | getPassRateStatValue(2, 'completionRate') |
| | | ); |
| | | finalQualityChartInstance = initQualityChart(finalQualityChart, "#722ed1"); |
| | | finalQualityChartInstance = initQualityChart( |
| | | finalQualityChart, |
| | | "#722ed1", |
| | | getPassRateStatValue(2, 'passRate') |
| | | ); |
| | | }; |
| | | |
| | | // äºä»¶å¤ç彿° |
| | |
| | | |
| | | // çå½å¨æ |
| | | onMounted(() => { |
| | | initData(); |
| | | fetchInspectStatisticsData(); |
| | | fetchPassRateStatisticsData(); |
| | | fetchMonthlyPassRateData(); |
| | | fetchYearlyPassRateData(); |
| | | fetchMonthlyCompletionDetailsData(); |
| | | fetchTopParametersData(); |
| | | nextTick(() => { |
| | | initSampleChart(); |
| | | initEquipmentChart(); |
| | |
| | | .chart-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .container-line-right-bottom { |
| | | height: 20%; |
| | | width: 100%; |
| | |
| | | align-items: center; |
| | | /* background-color: #5b3f3f; */ |
| | | } |
| | | |
| | | .card-header { |
| | | display: flex; |
| | | justify-content: flex-start; |
| | |
| | | font-style: normal; |
| | | text-transform: none; |
| | | } |
| | | |
| | | .chart-title-line { |
| | | width: 6px; |
| | | height: 22px; |
| | |
| | | height: 250px; |
| | | width: 100%; |
| | | } |
| | | |
| | | .chart-container-line { |
| | | height: 250px; |
| | | width: 100%; |
| | |
| | | color: #fff; |
| | | background-color: #409eff; |
| | | } |
| | | |
| | | .container-line-left { |
| | | height: 100%; |
| | | width: 66%; |
| | | } |
| | | |
| | | .container-line-right { |
| | | height: 100%; |
| | | width: 34%; |
| | | } |
| | | |
| | | .container-line2-left { |
| | | height: 100%; |
| | | width: 50%; |
| | | } |
| | | |
| | | .info-box { |
| | | width: 92%; |
| | | margin-left: 4%; |
| | |
| | | align-items: center; |
| | | justify-content: space-around; |
| | | } |
| | | |
| | | .info-box-header { |
| | | width: 100%; |
| | | margin-left: 20px; |
| | |
| | | padding-left: 20px; |
| | | align-items: center; |
| | | } |
| | | |
| | | .info-icon { |
| | | width: 7px; |
| | | height: 7px; |
| | | border-radius: 50%; |
| | | margin-right: 8px; |
| | | } |
| | | |
| | | .info-line-title { |
| | | font-size: 12px; |
| | | color: #4e5969; |
| | | flex: 1; |
| | | } |
| | | |
| | | .info-line-value1 { |
| | | font-size: 12px; |
| | | color: #3d3d3d; |
| | |
| | | font-weight: 500; |
| | | margin-right: 15%; |
| | | } |
| | | |
| | | .info-line-value2 { |
| | | font-size: 12px; |
| | | color: #3d3d3d; |
| | |
| | | font-weight: 500; |
| | | margin-right: 10%; |
| | | } |
| | | |
| | | .top-container { |
| | | height: 130px; |
| | | width: 100%; |
| | | display: flex; |
| | | } |
| | | |
| | | .typeNum { |
| | | height: 100%; |
| | | width: 33.33%; |
| | |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .typeNum-left { |
| | | font-size: 12px; |
| | | color: #909399; |
| | |
| | | align-items: center; |
| | | justify-content: center; |
| | | } |
| | | |
| | | .typeNum-left-text { |
| | | font-size: 12px; |
| | | color: #3491fa; |
| | | font-weight: 500; |
| | | margin-top: 5px; |
| | | } |
| | | |
| | | .table-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | |
| | | .typeNum-center { |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | margin-left: 10px; |
| | | } |
| | | |
| | | .typeNum-leftLine { |
| | | color: #3491fa; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .typeNum-rightLine { |
| | | border-top: 1px solid #3491fa; |
| | | border-left: 1px solid #3491fa; |
| | |
| | | height: 80px; |
| | | width: 8px; |
| | | } |
| | | |
| | | .typeNum-leftLine2 { |
| | | color: #5eb334; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .typeNum-rightLine2 { |
| | | border-top: 1px solid #3491fa; |
| | | border-left: 1px solid #5eb334; |
| | |
| | | height: 80px; |
| | | width: 8px; |
| | | } |
| | | |
| | | .typeNum-leftLine3 { |
| | | color: #8000ff; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .typeNum-rightLine3 { |
| | | border-top: 1px solid #8000ff; |
| | | border-left: 1px solid #8000ff; |
| | |
| | | height: 80px; |
| | | width: 8px; |
| | | } |
| | | |
| | | .typeNum-right { |
| | | margin-left: 10px; |
| | | display: flex; |
| | |
| | | height: 90%; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | .typeNum-right-top-name { |
| | | font-weight: 400; |
| | | font-size: 12px; |
| | | color: #3d3d3d; |
| | | } |
| | | |
| | | .typeNum-right-top-text { |
| | | font-weight: 400; |
| | | font-size: 16px; |
| | | color: rgba(0, 0, 0, 0.85); |
| | | margin-top: 5px; |
| | | } |
| | | |
| | | .unit { |
| | | font-size: 12px; |
| | | color: #3d3d3d; |
| | | } |
| | | |
| | | .inspection-chart-box { |
| | | height: 50px; |
| | | width: 30%; |
| | |
| | | border-radius: 8px; |
| | | padding-left: 15px; |
| | | } |
| | | |
| | | .chart-box-title { |
| | | font-size: 12px; |
| | | color: #4e5969; |
| | | margin-top: 5px; |
| | | } |
| | | |
| | | .unit { |
| | | font-size: 12px; |
| | | color: #3d3d3d; |
| | | } |
| | | |
| | | .chart-box-num { |
| | | font-size: 18px; |
| | | color: #000; |
| | | margin-top: 5px; |
| | | font-weight: 500; |
| | | } |
| | | |
| | | /* è´¨æ£åæ ¼çå¡çæ ·å¼ */ |
| | | .top-containeråæ ¼ç { |
| | | height: 130px; |
| | |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | } |
| | | |
| | | .flex-center { |
| | | justify-content: space-evenly; |
| | | } |
| | | |
| | | .quality-card { |
| | | /* flex: 1; */ |
| | | width: 32%; |
| | |
| | | color: #666666; |
| | | margin-bottom: 3px; |
| | | } |
| | | |
| | | .blue-label { |
| | | color: #1890ff; |
| | | } |
| | | |
| | | .green-label { |
| | | color: #52c41a; |
| | | } |
| | |
| | | height: 60px; |
| | | margin-left: 10px; |
| | | } |
| | | |
| | | /* .flex-center { |
| | | justify-content: space-evenly; |
| | | } */ |
| | |
| | | margin-top: 20px; |
| | | text-align: right; |
| | | } |
| | | |
| | | .yearchange { |
| | | position: absolute; |
| | | right: 40px; |
| | |
| | | :deep(.el-tag) { |
| | | margin: 0; |
| | | } |
| | | |
| | | :deep(.el-input__prefix) { |
| | | display: none !important; |
| | | } |