From bb4e98349106bb1d8f9ee093001bff1428fd0ebc Mon Sep 17 00:00:00 2001
From: yyb <995253665@qq.com>
Date: 星期五, 03 四月 2026 13:09:22 +0800
Subject: [PATCH] PSI数据分析:移除”中心顶部"功能,更新"中心中心“布局以及数据获取逻辑

---
 /dev/null                                                             |  137 ----------------------
 src/views/reportAnalysis/PSIDataAnalysis/components/center-center.vue |  189 ++++++++++++++++--------------
 src/views/reportAnalysis/PSIDataAnalysis/index.vue                    |    4 
 3 files changed, 102 insertions(+), 228 deletions(-)

diff --git a/src/views/reportAnalysis/PSIDataAnalysis/components/center-center.vue b/src/views/reportAnalysis/PSIDataAnalysis/components/center-center.vue
index 0f3ec84..9a4852e 100644
--- a/src/views/reportAnalysis/PSIDataAnalysis/components/center-center.vue
+++ b/src/views/reportAnalysis/PSIDataAnalysis/components/center-center.vue
@@ -1,84 +1,52 @@
 <template>
-  <div>
-    <!-- 璁惧缁熻 -->
-    <div class="equipment-stats">
-      <div class="equipment-header">
-        <img
-          src="@/assets/BI/shujutongjiicon@2x.png"
-          alt="鍥炬爣"
-          class="equipment-icon"
-        />
-        <span class="equipment-title">浜у搧鍛ㄨ浆澶╂暟</span>
+  <div class="kpi-stack">
+    <div class="stats-cards">
+      <div
+        v-for="item in statItems"
+        :key="item.name"
+        class="stat-card"
+      >
+        <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
+        <div class="card-content">
+          <span class="card-label">{{ item.name }}</span>
+          <span class="card-value">{{ item.value }}</span>
+          <div class="card-compare" :class="compareClass(Number(item.rate))">
+            <span>鍚屾瘮</span>
+            <span class="compare-value">{{ formatPercent(item.rate) }}</span>
+            <span class="compare-icon">{{ Number(item.rate) >= 0 ? '鈫�' : '鈫�' }}</span>
+          </div>
+        </div>
       </div>
-      <Echarts
-        ref="chart"
-        :chartStyle="chartStyle"
-        :grid="grid"
-        :legend="barLegend"
-        :series="barSeries1"
-        :tooltip="tooltip"
-        :xAxis="xAxis1"
-        :yAxis="yAxis1"
-        :options="{ backgroundColor: 'transparent', textStyle: { color: '#B8C8E0' } }"
-        style="height: 260px"
-      />
     </div>
   </div>
 </template>
 
 <script setup>
 import { ref, onMounted } from 'vue'
-import Echarts from '@/components/Echarts/echarts.vue'
-import { productTurnoverDays } from '@/api/viewIndex.js'
+import { salesPurchaseStorageProductCount } from '@/api/viewIndex.js'
 
-const chartStyle = { width: '100%', height: '100%' }
-const grid = { left: '3%', right: '4%', bottom: '3%', top: '4%', containLabel: true }
-const barLegend = { show: false, textStyle: { color: '#B8C8E0' }, data: ['鍛ㄨ浆澶╂暟'] }
-const barSeries1 = ref([
-  {
-    name: '鍛ㄨ浆澶╂暟',
-    type: 'bar',
-    barGap: 0,
-    barWidth: 30,
-    emphasis: { focus: 'series' },
-    itemStyle: {
-      color: {
-        type: 'linear',
-        x: 0, y: 1, x2: 0, y2: 0,
-        colorStops: [
-          { offset: 0, color: 'rgba(0,164,237,0)' },
-          { offset: 1, color: '#4EE4FF' },
-        ],
-      },
-    },
-    data: [],
-  },
-])
-const tooltip = {
-  trigger: 'axis',
-  axisPointer: { type: 'shadow' },
-  formatter(params) {
-    let result = params[0].axisValueLabel + '<br/>'
-    params.forEach((item) => {
-      result += `<div>${item.marker} ${item.seriesName}: ${item.value} 澶�</div>`
-    })
-    return result
-  },
+const statItems = ref([])
+
+const formatPercent = (val) => {
+  const num = Number(val) || 0
+  return `${num.toFixed(2)}%`
 }
-const xAxis1 = ref([{ type: 'category', axisTick: { show: false }, axisLabel: { color: '#B8C8E0' }, data: [] }])
-const yAxis1 = [{ type: 'value', axisLabel: { color: '#B8C8E0' } }]
+
+const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down')
 
 const fetchData = () => {
-  productTurnoverDays()
+  salesPurchaseStorageProductCount()
     .then((res) => {
       if (res.code === 200 && Array.isArray(res.data)) {
-        const list = res.data
-        xAxis1.value[0].data = list.map((d) => d.name)
-        barSeries1.value[0].data = list.map((d) => Number(d.value) || 0)
+        statItems.value = res.data.map((item) => ({
+          name: item.name,
+          value: item.value,
+          rate: item.rate,
+        }))
       }
     })
     .catch((err) => {
-      console.error('鑾峰彇浜у搧鍛ㄨ浆澶╂暟澶辫触:', err)
+      console.error('鑾峰彇閿�鍞�/閲囪喘/鍌ㄥ瓨浜у搧鏁板け璐�:', err)
     })
 }
 
@@ -88,42 +56,87 @@
 </script>
 
 <style scoped>
-.equipment-stats {
-  border: 1px solid #1a58b0;
-  padding: 0 18px 18px;
+.kpi-stack {
+  flex-shrink: 0;
+}
+
+.stats-cards {
   display: flex;
   flex-direction: column;
-  gap: 16px;
+  gap: 30px;
 }
 
-.equipment-header {
-  font-weight: 500;
-  font-size: 21px;
+.stat-card {
   display: flex;
-  border-bottom: 1px solid;
-  border-image: linear-gradient(
-      270deg,
-      rgba(0, 126, 255, 0) 0%,
-      rgba(0, 126, 255, 0.4549) 35%,
-      #007eff 78%,
-      #007eff 100%
-    )
-    1;
-  padding-bottom: 2px;
+  align-items: center;
+  background-image: url('@/assets/BI/border@2x.png');
+  background-size: 100% 100%;
+  background-position: center;
+  background-repeat: no-repeat;
+  height: 142px;
+  width: 100%;
+  box-sizing: border-box;
 }
 
-.equipment-title {
+.card-icon {
+  width: 100px;
+  height: 100px;
+  margin: 20px 20px 0 10px;
+  flex-shrink: 0;
+}
+
+.card-content {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+  min-width: 0;
+}
+
+.card-value {
   font-weight: 500;
-  font-size: 18px;
-  background: linear-gradient(360deg, #056dff 0%, #43e8fc 100%);
+  font-size: 40px;
+  background: linear-gradient(360deg, #008bfd 0%, #ffffff 100%);
   -webkit-background-clip: text;
   -webkit-text-fill-color: transparent;
   background-clip: text;
-  line-height: 50px;
 }
 
-.equipment-icon {
-  width: 50px;
-  height: 50px;
+.card-label {
+  font-weight: 400;
+  font-size: 19px;
+  color: rgba(208, 231, 255, 0.7);
+}
+
+.card-compare {
+  display: flex;
+  align-items: center;
+  gap: 6px;
+  font-size: 15px;
+  color: #d0e7ff;
+}
+
+.card-compare > span:first-child {
+  font-size: 13px;
+  opacity: 0.8;
+}
+
+.compare-value {
+  font-weight: 600;
+}
+
+.compare-icon {
+  font-size: 14px;
+  position: relative;
+  top: -1px;
+}
+
+.compare-up .compare-value,
+.compare-up .compare-icon {
+  color: #00c853;
+}
+
+.compare-down .compare-value,
+.compare-down .compare-icon {
+  color: #ff5252;
 }
 </style>
diff --git a/src/views/reportAnalysis/PSIDataAnalysis/components/center-top.vue b/src/views/reportAnalysis/PSIDataAnalysis/components/center-top.vue
deleted file mode 100644
index 0937b32..0000000
--- a/src/views/reportAnalysis/PSIDataAnalysis/components/center-top.vue
+++ /dev/null
@@ -1,137 +0,0 @@
-<template>
-  <div>
-    <!-- 椤堕儴缁熻鍗$墖 -->
-    <div class="stats-cards">
-      <div
-        v-for="item in statItems"
-        :key="item.name"
-        class="stat-card"
-      >
-        <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
-        <div class="card-content">
-          <span class="card-label">{{ item.name }}</span>
-          <span class="card-value">{{ item.value }}</span>
-          <div class="card-compare" :class="compareClass(Number(item.rate))">
-            <span>鍚屾瘮</span>
-            <span class="compare-value">{{ formatPercent(item.rate) }}</span>
-            <span class="compare-icon">{{ Number(item.rate) >= 0 ? '鈫�' : '鈫�' }}</span>
-          </div>
-        </div>
-      </div>
-    </div>
-
-  </div>
-</template>
-
-<script setup>
-import { ref, onMounted } from 'vue'
-import { salesPurchaseStorageProductCount } from '@/api/viewIndex.js'
-
-const statItems = ref([])
-
-const formatPercent = (val) => {
-  const num = Number(val) || 0
-  return `${num.toFixed(2)}%`
-}
-
-const compareClass = (val) => (val >= 0 ? 'compare-up' : 'compare-down')
-
-const fetchData = () => {
-  salesPurchaseStorageProductCount()
-    .then((res) => {
-      if (res.code === 200 && Array.isArray(res.data)) {
-        statItems.value = res.data.map((item) => ({
-          name: item.name,
-          value: item.value,
-          rate: item.rate,
-        }))
-      }
-    })
-    .catch((err) => {
-      console.error('鑾峰彇閿�鍞�/閲囪喘/鍌ㄥ瓨浜у搧鏁板け璐�:', err)
-    })
-}
-
-onMounted(() => {
-  fetchData()
-})
-</script>
-
-<style scoped>
-.stats-cards {
-  display: flex;
-  gap: 30px;
-}
-
-.stat-card {
-  flex: 1;
-  display: flex;
-  align-items: center;
-  background-image: url('@/assets/BI/border@2x.png');
-  background-size: 100% 100%;
-  background-position: center;
-  background-repeat: no-repeat;
-  height: 142px;
-}
-
-.card-icon {
-  width: 100px;
-  height: 100px;
-  margin: 20px 20px 0 10px;
-}
-
-.card-content {
-  display: flex;
-  flex-direction: column;
-  gap: 10px;
-}
-
-.card-value {
-  font-weight: 500;
-  font-size: 40px;
-  background: linear-gradient(360deg, #008bfd 0%, #ffffff 100%);
-  -webkit-background-clip: text;
-  -webkit-text-fill-color: transparent;
-  background-clip: text;
-}
-
-.card-label {
-  font-weight: 400;
-  font-size: 19px;
-  color: rgba(208, 231, 255, 0.7);
-}
-
-.card-compare {
-  display: flex;
-  align-items: center;
-  gap: 6px;
-  font-size: 15px;
-  color: #d0e7ff;
-}
-
-.card-compare > span:first-child {
-  font-size: 13px;
-  opacity: 0.8;
-}
-
-.compare-value {
-  font-weight: 600;
-}
-
-.compare-icon {
-  font-size: 14px;
-  position: relative;
-  top: -1px; /* 杞诲井涓婄Щ锛岃绠ご涓庢枃瀛楀瀭鐩村眳涓榻� */
-}
-
-.compare-up .compare-value,
-.compare-up .compare-icon {
-  color: #00c853;
-}
-
-.compare-down .compare-value,
-.compare-down .compare-icon {
-  color: #ff5252;
-}
-
-</style>
diff --git a/src/views/reportAnalysis/PSIDataAnalysis/index.vue b/src/views/reportAnalysis/PSIDataAnalysis/index.vue
index 065b59d..66d9c33 100644
--- a/src/views/reportAnalysis/PSIDataAnalysis/index.vue
+++ b/src/views/reportAnalysis/PSIDataAnalysis/index.vue
@@ -27,8 +27,7 @@
 
       <!-- 涓棿鍖哄煙 -->
       <div class="center-panel">
-        <CenterTop />
-        <CenterCenter/>
+        <CenterCenter />
         <CenterBottom />
       </div>
 
@@ -51,7 +50,6 @@
 import RightBottom from '../dataDashboard/components/basic/right-bottom.vue'
 import useUserStore from '@/store/modules/user'
 import LeftTop from './components/left-top.vue'
-import CenterTop from './components/center-top.vue'
 import CenterBottom from './components/center-bottom.vue'
 
 // 鍏ㄥ睆鐩稿叧鐘舵��

--
Gitblit v1.9.3