From 1c829f9177eab675b22be4d20ef2761ed1bbb423 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期二, 15 九月 2026 16:15:48 +0800
Subject: [PATCH] refactor(layout): 调整布局样式并优化轮播卡片组件

---
 src/views/reportAnalysis/qualityAnalysis/components/right-bottom.vue |  111 ++++++++++++++++++++++++-------------------------------
 1 files changed, 48 insertions(+), 63 deletions(-)

diff --git a/src/views/reportAnalysis/qualityAnalysis/components/right-bottom.vue b/src/views/reportAnalysis/qualityAnalysis/components/right-bottom.vue
index f4b0a0c..9a1014e 100644
--- a/src/views/reportAnalysis/qualityAnalysis/components/right-bottom.vue
+++ b/src/views/reportAnalysis/qualityAnalysis/components/right-bottom.vue
@@ -1,9 +1,8 @@
 <template>
-  <div>
+  <div class="panel-root">
     <PanelHeader title="涓嶅悎鏍兼鍝佸鐞嗗垎鏋�" />
     <div class="panel-item-customers">
-      <div class="pie-chart-wrapper" ref="pieWrapperRef">
-        <div class="pie-background" ref="pieBackgroundRef"></div>
+      <div class="pie-chart-wrapper">
         <Echarts ref="chart" :chartStyle="chartStyle" :legend="landLegend" :series="computedSeries"
           :tooltip="landTooltip" :color="landColors" :options="pieOptions" style="height: 100%" class="land-chart" />
       </div>
@@ -12,21 +11,19 @@
 </template>
 
 <script setup>
-import { ref, computed, onMounted, onBeforeUnmount } from 'vue'
+import { ref, computed, onMounted } from 'vue'
 import Echarts from '@/components/Echarts/echarts.vue'
 import PanelHeader from './PanelHeader.vue'
 import { unqualifiedProductProcessingAnalysis } from '@/api/viewIndex.js'
-import { useChartBackground } from '@/hooks/useChartBackground.js'
+import { BI, baseChartOptions, withTooltip } from '../theme.js'
 
-const pieWrapperRef = ref(null)
-const pieBackgroundRef = ref(null)
 const chart = ref(null)
 
 //  鏁版嵁鍒楄〃
 const dataList = ref([])
 
-//  棰滆壊鍒楄〃
-const landColors = ['#26FFCB', '#24CBFF', '#35FBF4', '#2651FF', '#D1E4F5', '#5782F7', '#2F67EF', '#82BAFF']
+//  棰滆壊鍒楄〃锛堝ぇ灞忕粺涓�搴忓垪鑹诧級
+const landColors = BI.series
 
 //  label 瀵屾枃鏈牱寮�
 const dotRich = landColors.reduce((acc, color, idx) => {
@@ -49,16 +46,16 @@
   top: '40%',
   orient: 'vertical',
   textStyle: {
-    color: '#fff',
+    color: BI.textStrong,
     rich: {
-      unit: { color: '#fff', fontSize: 12, padding: [0, 10, 0, 0] },
-      text: { width: 60, color: '#fff', fontSize: 12 },
+      unit: { color: BI.textStrong, fontSize: 12, padding: [0, 10, 0, 0] },
+      text: { width: 60, color: BI.textStrong, fontSize: 12 },
     }
   }
 })
 
 //  鎻愮ず妗嗛厤缃�
-const landTooltip = {
+const landTooltip = withTooltip({
   trigger: 'item',
   alwaysShowContent: false,
   position: function (pt) {
@@ -70,24 +67,33 @@
     const { name, value, rate } = params.data
     return `${name}<br/>鏁伴噺锛�${value}涓�<br/>鍗犳瘮锛�${rate}%`
   },
-}
+})
 
 //  浣跨敤璁$畻灞炴�у鐞� Series
 const computedSeries = computed(() => {
+  const isEmpty = dataList.value.length === 0
   return [
     {
       name: '涓嶅悎鏍兼鍝佸鐞嗗垎鏋�',
       type: 'pie',
       radius: ['35%', '55%'],
       center: ['50%', '50%'],
+      silent: isEmpty,
+      itemStyle: isEmpty
+        ? { color: 'rgba(74, 108, 240, 0.12)', borderWidth: 0 }
+        : {
+          borderColor: BI.sliceBorder,
+          borderWidth: 2,
+          borderRadius: 4,
+        },
       label: {
-        show: true,
+        show: !isEmpty,
         position: 'outside',
-        color: '#fff',
+        color: BI.textStrong,
         rich: {
           ...dotRich,
-          parent: { fontSize: 14, fontWeight: 600, color: '#fff', lineHeight: 20 },
-          child: { fontSize: 12, color: '#fff', lineHeight: 18 },
+          parent: { fontSize: 14, fontWeight: 600, color: BI.textStrong, lineHeight: 20 },
+          child: { fontSize: 12, color: BI.text, lineHeight: 18 },
         },
         formatter: function (params) {
           if (!params.data) return ''
@@ -96,11 +102,11 @@
         },
       },
       labelLine: {
-        show: true,
+        show: !isEmpty,
         length: 20,
-        lineStyle: { color: '#B8C8E0' },
+        lineStyle: { color: 'rgba(143, 163, 200, 0.4)' },
       },
-      data: dataList.value,
+      data: isEmpty ? [1] : dataList.value,
     },
     {
       // 鍐呭湀瑁呴グ
@@ -109,23 +115,14 @@
       center: ['50%', '50%'],
       silent: true,
       label: { show: false },
-      itemStyle: { color: 'rgba(0, 127, 255, 0.25)' },
+      itemStyle: { color: 'rgba(74, 108, 240, 0.22)' },
       data: [1],
     },
   ]
 })
 
-const chartStyle = { width: '100%', height: '126%' }
-const pieOptions = { backgroundColor: 'transparent' }
-
-//  鑳屾櫙澶勭悊閽╁瓙
-const { adjustBackgroundPosition, init: initBackground, cleanup: cleanupBackground } = useChartBackground({
-  wrapperRef: pieWrapperRef,
-  backgroundRef: pieBackgroundRef,
-  offsetX: '-51.5%',
-  offsetY: '-39%',
-  watchData: dataList
-})
+const chartStyle = { width: '100%', height: '100%' }
+const pieOptions = baseChartOptions
 
 const loadData = async () => {
   try {
@@ -134,14 +131,9 @@
       dataList.value = (res.data || []).map((it) => ({
         name: it.name,
         value: Number(it.value || 0),
-        rate: it.rate, 
+        rate: it.rate,
       }))
       landLegend.value.data = dataList.value.map((d) => d.name)
-
-      // 鏁版嵁鏇存柊鍚庡井璋冭儗鏅�
-      setTimeout(() => {
-        adjustBackgroundPosition()
-      }, 100)
     }
   } catch (e) {
     console.error('鑾峰彇鏁版嵁澶辫触:', e)
@@ -150,40 +142,33 @@
 
 onMounted(() => {
   loadData()
-  initBackground()
-})
-
-onBeforeUnmount(() => {
-  cleanupBackground()
 })
 </script>
 
 <style scoped>
+.panel-root {
+  flex: 1;
+  height: 100%;
+  min-height: 0;
+  display: flex;
+  flex-direction: column;
+}
+
 .panel-item-customers {
-  border: 1px solid #1a58b0;
+  border: 1px solid var(--bi-panel-border);
+  background: var(--bi-panel-bg);
+  border-radius: 8px;
   padding: 18px;
   width: 100%;
-  height: 449px;
+  box-sizing: border-box;
+  flex: 1;
+  min-height: 0;
 }
 
 .pie-chart-wrapper {
   position: relative;
   width: 100%;
-  height: 320px;
+  height: 100%;
+  min-height: 0;
 }
-
-.pie-background {
-  position: absolute;
-  width: 360px;
-  height: 360px;
-  background-image: url('@/assets/BI/鐜懓鍥捐竟妗�.png');
-  background-size: contain;
-  background-position: center;
-  background-repeat: no-repeat;
-  z-index: 1;
-  pointer-events: none;
-  left: 50%;
-  top: 50%;
-  transform: translate(-51.5%, -39%);
-}
-</style>
\ No newline at end of file
+</style>

--
Gitblit v1.9.3