| | |
| | | <template> |
| | | <div> |
| | | <PanelHeader title="工单执行效率分析" /> |
| | | <PanelHeader title="不合格产品排名" /> |
| | | <div class="main-panel panel-item-customers"> |
| | | <div class="main-panel-container"> |
| | | <div |
| | | style="color: white" |
| | | class="main-panel-box" |
| | | v-for="(item, index) in panelList" |
| | | :key="index" |
| | | > |
| | | <div style="flex: 1" class="main-panel-box-left">Top{{ index + 1 }}</div> |
| | | <div style="color: white" class="main-panel-box" v-for="(item, index) in panelList" :key="index"> |
| | | <!-- <div style="flex: 1" class="main-panel-box-left">{{ item.rank }}</div> --> |
| | | <div style="flex: 1" class="main-panel-box-left">{{ item.productName }}</div> |
| | | <div style="flex: 3" class="main-panel-box-right"> |
| | | <!-- <div class="main-panel-box-right-title">{{ item.productName }}</div> --> |
| | | <div class="main-panel-box-right-text"> |
| | | <span>总数量:{{ item.total }}</span> |
| | | <span>已完成:{{ item.finished }}</span> |
| | | <span>合格率:{{ item.qualifiedRate }}</span> |
| | | <span>合格率:{{ item.qualifiedRate }}%</span> |
| | | </div> |
| | | <div class="main-panel-box-right-progress"> |
| | | <el-progress :percentage="item.percentage" :format="format" /> |
| | |
| | | |
| | | <script setup> |
| | | import { ref, onMounted } from 'vue' |
| | | import { unqualifiedProductRanking } from '@/api/viewIndex.js' |
| | | import PanelHeader from './PanelHeader.vue' |
| | | const panelList = [ |
| | | { total: 100, finished: 100, qualifiedRate: 100, percentage: 100 }, // Top1 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 200, finished: 180, qualifiedRate: 90, percentage: 90 }, // Top2 |
| | | { total: 150, finished: 120, qualifiedRate: 80, percentage: 80 } // Top3 |
| | | ] |
| | | |
| | | const panelList = ref([]) |
| | | |
| | | const format = (percentage) => { |
| | | return `${percentage}%`; |
| | | return `${percentage}%` |
| | | } |
| | | |
| | | const fetchData = () => { |
| | | unqualifiedProductRanking() |
| | | .then((res) => { |
| | | if (res?.code === 200 && Array.isArray(res?.data)) { |
| | | const data = res.data |
| | | panelList.value = data.map((item, index) => { |
| | | const total = Number(item.totalCount) || 0 |
| | | const finished = Number(item.completedCount) || 0 |
| | | const passRate = Number(item.passRate) || 0 |
| | | |
| | | return { |
| | | rank: `Top${index + 1}`, |
| | | productName: item.productName || `产品${index + 1}`, |
| | | total: total.toFixed(2), |
| | | finished: finished.toFixed(2), |
| | | qualifiedRate: passRate.toFixed(2), |
| | | percentage: Math.min(100, Math.max(0, passRate)), // 确保百分比在0-100之间 |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | console.error('获取工单执行效率分析数据失败:', err) |
| | | }) |
| | | } |
| | | |
| | | onMounted(() => { |
| | | // fetchData() |
| | | fetchData() |
| | | }) |
| | | </script> |
| | | |
| | |
| | | flex-direction: row; |
| | | align-items: center; |
| | | height: 40px; |
| | | |
| | | .main-panel-box-left{ |
| | | background: red; |
| | | border-radius: 20px; |
| | |
| | | line-height: 32px; |
| | | margin: 0 20px; |
| | | } |
| | | |
| | | .main-panel-box-right{ |
| | | display: flex; |
| | | flex-direction: column; |
| | | flex: 1; |
| | | |
| | | .main-panel-box-right-title { |
| | | font-size: 14px; |
| | | font-weight: 600; |
| | | color: #ffffff; |
| | | margin-bottom: 6px; |
| | | } |
| | | |
| | | .main-panel-box-right-text{ |
| | | font-size: 12px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | padding-right: 60px; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .main-panel-box-right-progress{ |
| | | :deep(.el-progress__text){ |
| | | color: white !important; |
| | |
| | | } |
| | | } |
| | | } |
| | | |
| | | .main-panel-container { |
| | | display: flex; |
| | | flex-direction: column; |
| | | gap: 12px; |
| | | height: 100%; |
| | | overflow-y: auto; |
| | | } |
| | | |
| | | .main-panel { |
| | | display: flex; |
| | | flex-direction: column; |
| | |
| | | padding: 18px; |
| | | width: 100%; |
| | | height: 449px; |
| | | overflow: hidden; |
| | | } |
| | | </style> |