From abfc074c35e8bd66ec0641173bfd703051ca701a Mon Sep 17 00:00:00 2001
From: 13404089107 <puwei@sinata.cn>
Date: 星期一, 07 四月 2025 17:00:51 +0800
Subject: [PATCH] fix

---
 src/components/datascreen/RightPanel.vue |  330 ++++++++++++++++++++++++++++++++----------------------
 1 files changed, 193 insertions(+), 137 deletions(-)

diff --git a/src/components/datascreen/RightPanel.vue b/src/components/datascreen/RightPanel.vue
index e1b01d6..fb38b0b 100644
--- a/src/components/datascreen/RightPanel.vue
+++ b/src/components/datascreen/RightPanel.vue
@@ -4,7 +4,16 @@
     <div class="panel-item top-panel-item">
       <div class="box-title">安置房类型占比</div>
       <div class="house-type-content">
-        <div class="cityGreenLand-charts" ref="cityGreenLandCharts"></div>
+        <div class="relative">
+          <div class="cityGreenLand-charts" ref="cityGreenLandCharts"></div>
+          <div class="chartBg"></div>
+          <div class="chart-content">
+            <div class="chart-num">{{ currentType.rate }}</div>
+            <div class="chart-title">{{ currentType.type }}</div>
+          </div>
+          <div class="chart-black"></div>
+        </div>
+
         <div class="right-content">
           <div class="table-header">
             <div class="header-item">数量</div>
@@ -14,21 +23,21 @@
           <div class="data-list">
             <div
               class="data-item"
-              :class="{ activeItem: item.name === currentType.name }"
+              :class="{ activeItem: item.type === currentType.type }"
               v-for="(item, index) in houseTypeData"
               :key="index"
               @click="changeCurrentType(item)"
             >
               <div class="item-dot" :style="{ background: item.color }"></div>
-              <div class="item-name">{{ item.name }}</div>
+              <div class="item-name">{{ item.type }}</div>
               <div class="item-value" :style="{ color: item.color }">
-                {{ item.value }}
+                {{ item.total }}
               </div>
               <div class="item-area" :style="{ color: item.color }">
                 {{ item.area }}
               </div>
               <div class="item-percent" :style="{ color: item.color }">
-                {{ item.percent }}
+                {{ item.rate }}
               </div>
             </div>
           </div>
@@ -48,7 +57,7 @@
           ></div>
           <div class="compensation-list">
             <div class="compensation-center">
-              <div class="total-value">{{ (total*1).toFixed(2) }}</div>
+              <div class="total-value">{{ (total * 1).toFixed(2) }}</div>
               <div class="total-name">总额(万元)</div>
             </div>
             <div class="compensation-item">
@@ -57,8 +66,8 @@
                 v-for="item in twoEcharts"
                 :key="item.name"
               >
-                <div class="item-name">{{ item.value }}%</div>
-                <div class="item-value">{{ item.name }}</div>
+                <div class="item-name">{{ item.amountRate }}</div>
+                <div class="item-value">{{ item.type }}</div>
                 <div class="item-dot" :style="{ background: item.color }"></div>
               </div>
             </div>
@@ -82,67 +91,20 @@
 import "echarts-gl";
 
 export default {
-  name: 'RightPanel',
+  name: "RightPanel",
   props: {
     data: {
       type: Object,
-      default: () => { }
-    }
+      default: () => {},
+    },
   },
   data() {
-    const houseTypeData = [
-      {
-        name: "新建商品住房",
-        value: 321,
-        area: 35344,
-        percent: "56.8%",
-        color: "#00ffff",
-      },
-      {
-        name: "商业用房",
-        value: 321,
-        area: 35344,
-        percent: "34.5%",
-        color: "#34D160",
-      },
-      {
-        name: "停车位",
-        value: 321,
-        area: 35344,
-        percent: "56.8%",
-        color: "#F8B551",
-      },
-      {
-        name: "二手住房",
-        value: 321,
-        area: 35344,
-        percent: "56.8%",
-        color: "#BF40BF",
-      },
-    ];
-
     return {
-      houseTypeData,
-      currentType: houseTypeData[0],
+      houseTypeData: [],
+      currentType: {},
       total: null,
       barOption: {},
-      twoEcharts: [
-        {
-          name: "首付款",
-          value: 78.8,
-          color: "#00ffff",
-        },
-        {
-          name: "季度款",
-          value: 78.8,
-          color: "#34D160",
-        },
-        {
-          name: "过渡补贴",
-          value: 78.8,
-          color: "#F8B551",
-        },
-      ],
+      twoEcharts: [],
       typeDistOption: {
         tooltip: {
           trigger: "item",
@@ -172,8 +134,8 @@
   },
   mounted() {
     this.$nextTick(() => {
-      this.init();
-      this.initCompensationOption(this.twoEcharts);
+      this.init(this.data.placementTypeResponses);
+      this.initCompensationOption(this.data.monthCompensationResponses);
       this.initBarChart();
     });
   },
@@ -182,135 +144,156 @@
       this.currentType = type;
     },
     initBarChart() {
-      if (!this.data.quarterPayResponses || !this.data.quarterPayResponses[0]) return;
+      if (!this.data.quarterPayResponses || !this.data.quarterPayResponses[0])
+        return;
 
-      const sortedData = Object.entries(this.data.quarterPayResponses[0])
-        .sort((a, b) => {
-          const dateA = new Date(a[0].replace('-', '/'));
-          const dateB = new Date(b[0].replace('-', '/'));
+      const sortedData = Object.entries(this.data.quarterPayResponses[0]).sort(
+        (a, b) => {
+          const dateA = new Date(a[0].replace("-", "/"));
+          const dateB = new Date(b[0].replace("-", "/"));
           return dateA - dateB;
-        });
+        }
+      );
 
-      const maxValue = Math.max(...sortedData.map(item => item[1]));
+      const maxValue = Math.max(...sortedData.map((item) => item[1]));
       const yAxisMax = Math.ceil(maxValue / 100) * 100;
 
       this.barOption = {
         tooltip: {
-          trigger: 'axis',
-          formatter: function(params) {
+          trigger: "axis",
+          formatter: function (params) {
             const dataParams = params[1];
             // 获取当前柱子的颜色(取渐变色的起始色)
             let color;
             if (dataParams.dataIndex === 0) {
-              color = '#FFEF00';
+              color = "#FFEF00";
             } else if (dataParams.dataIndex === 1) {
-              color = '#00FFC3';
+              color = "#00FFC3";
             } else if (dataParams.dataIndex === 2) {
-              color = '#00DBFF';
+              color = "#00DBFF";
             } else {
-              color = '#057BFF';
+              color = "#057BFF";
             }
             return `${dataParams.name}<br/><span style="display:inline-block;width:8px;height:8px;border-radius:50%;background-color:${color};margin-right:6px;"></span>${dataParams.value}`;
           },
-          backgroundColor: '#ffffff',
+          backgroundColor: "#ffffff",
           borderWidth: 1,
           textStyle: {
-            color: '#333333',
-            fontSize: 14
+            color: "#333333",
+            fontSize: 14,
           },
-          padding: [8, 12]
+          padding: [8, 12],
         },
         grid: {
-          top: '10%',
-          left: '3%',
-          right: '4%',
-          bottom: '3%',
-          containLabel: true
+          top: "10%",
+          left: "3%",
+          right: "4%",
+          bottom: "3%",
+          containLabel: true,
         },
         xAxis: {
-          type: 'category',
-          data: sortedData.map(item => item[0]),
+          type: "category",
+          data: sortedData.map((item) => item[0]),
           axisLine: {
             lineStyle: {
-              color: 'rgba(30, 44, 88, 1)'
-            }
+              color: "rgba(30, 44, 88, 1)",
+            },
           },
           axisTick: {
-            show: false
+            show: false,
           },
           axisLabel: {
-            color: '#ffffff',
-            fontSize: 12
-          }
+            color: "#ffffff",
+            fontSize: 12,
+          },
         },
         yAxis: {
-          type: 'value',
+          type: "value",
           max: yAxisMax,
           splitNumber: 4,
           axisLabel: {
-            color: 'rgba(88, 115, 150, 1)',
-            fontSize: 12
+            color: "rgba(88, 115, 150, 1)",
+            fontSize: 12,
           },
           splitLine: {
             lineStyle: {
-              color: 'rgba(30, 44, 88, 1)'
-            }
-          }
+              color: "rgba(30, 44, 88, 1)",
+            },
+          },
         },
         series: [
           {
-            type: 'bar',
-            barWidth: '30%',
+            type: "bar",
+            barWidth: "30%",
             z: 1,
             data: Array(sortedData.length).fill(yAxisMax),
             itemStyle: {
-              color: 'rgba(0, 255, 255, 0.1)'
-            }
+              color: "rgba(0, 255, 255, 0.1)",
+            },
           },
           {
-            type: 'pictorialBar',
-            symbol: 'roundRect',
+            type: "pictorialBar",
+            symbol: "roundRect",
             symbolSize: [20, 6],
-            symbolRepeat: 'fixed',
+            symbolRepeat: "fixed",
             symbolMargin: 1,
             symbolClip: true,
-            symbolPosition: 'start',
+            symbolPosition: "start",
             symbolOffset: [0, 0],
             symbolBoundingData: yAxisMax,
             z: 2,
             data: sortedData.map((item, index) => ({
               value: item[1],
               itemStyle: {
-                color: index === 0 ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                  { offset: 0, color: '#FFEF00' },
-                  { offset: 0.5, color: '#C86A01' },
-                  { offset: 1, color: '#402303' }
-                ]) : index === 1 ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                  { offset: 0, color: '#00FFC3' },
-                  { offset: 1, color: '#008570' }
-                ]) : index === 2 ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                  { offset: 0, color: '#00DBFF' },
-                  { offset: 1, color: '#0093A8' }
-                ]) : new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
-                  { offset: 0, color: '#05DBFF' },
-                  { offset: 0.5, color: '#057BFF' },
-                  { offset: 1, color: '#030E3F' }
-                ])
-              }
-            }))
-          }
-        ]
+                color:
+                  index === 0
+                    ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                        { offset: 0, color: "#FFEF00" },
+                        { offset: 0.5, color: "#C86A01" },
+                        { offset: 1, color: "#402303" },
+                      ])
+                    : index === 1
+                    ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                        { offset: 0, color: "#00FFC3" },
+                        { offset: 1, color: "#008570" },
+                      ])
+                    : index === 2
+                    ? new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                        { offset: 0, color: "#00DBFF" },
+                        { offset: 1, color: "#0093A8" },
+                      ])
+                    : new this.$echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                        { offset: 0, color: "#05DBFF" },
+                        { offset: 0.5, color: "#057BFF" },
+                        { offset: 1, color: "#030E3F" },
+                      ]),
+              },
+            })),
+          },
+        ],
       };
     },
-    init() {
+    init(data) {
+      if (!data || data.length == 0) {
+        this.houseTypeData = [];
+        this.currentType = {};
+        return;
+      }
       const chartDom = this.$refs.cityGreenLandCharts;
       if (!chartDom) return;
 
       const myChart = echarts.init(chartDom);
 
       let colors = ["#286DF7ee", "#04F7FDee", "#E23AA9ee", "#FFC852ee"];
-      let xData = ["第一产业", "第二产业", "第三产业", "城乡居民生活用电"];
-      let yData = [25, 25, 25, 25];
+      this.houseTypeData = data.map((item, index) => {
+        return {
+          ...item,
+          color: colors[index],
+        };
+      });
+      this.currentType = this.houseTypeData[0];
+      let xData = data.map((item) => item.type);
+      let yData = data.map((item) => item.total);
       // 传入数据生成 option
       let optionsData = [];
       for (let i = 0; i < xData.length; i++) {
@@ -362,7 +345,7 @@
         },
         grid3D: {
           show: false,
-          boxHeight: 0.5,
+          boxHeight: 1,
           bottom: "50%",
           viewControl: {
             distance: 280,
@@ -455,7 +438,7 @@
           if (u > Math.PI * 2.5) {
             return Math.sin(u);
           }
-          return Math.sin(v) > 0 ? 2 * height : -1;
+          return Math.sin(v) > 0 ? 27 : -1; //柱状体高度
         },
       };
     },
@@ -560,7 +543,7 @@
           show: false,
         },
         itemStyle: {
-          opacity: 0.1,
+          opacity: 0.05,
           color: "#0ff",
         },
         parametricEquation: {
@@ -587,8 +570,30 @@
       });
       return series;
     },
+    // 随机颜色
+    getRandomColor() {
+      const letters = "0123456789ABCDEF";
+      let color = "#";
+      for (let i = 0; i < 6; i++) {
+        color += letters[Math.floor(Math.random() * 16)];
+      }
+      return color;
+    },
 
     initCompensationOption(data) {
+      if (!data || !data.length) {
+        this.twoEcharts = [];
+        return;
+      }
+      let list = ["#00ffff", "#34D160", "#F8B551"];
+      data = data.map((item, index) => {
+        return {
+          ...item,
+          color: list[index],
+        };
+      });
+      this.twoEcharts = data || [];
+
       const chartDom = this.$refs.compensationCharts;
       if (!chartDom) return;
 
@@ -641,16 +646,16 @@
       let total = 0;
       let arr = [];
       for (let i = 0; i < data.length; i++) {
-        max = Math.max(max, data[i].value);
-        total += data[i].value;
+        max = Math.max(max, data[i].amount);
+        total += data[i].amount;
         arr.push({
-          value: data[i].value,
+          value: data[i].amount,
           itemStyle: { color: data[i].color },
         });
       }
       this.total = total;
       option.angleAxis.max = total;
-      option.radiusAxis.data = data.map((item) => item.name);
+      option.radiusAxis.data = data.map((item) => item.type);
       option.series.data = arr;
 
       chartCompensation.setOption(option);
@@ -717,6 +722,57 @@
     height: calc(100% - 30px);
     display: flex;
     padding: 10px 13px;
+    .relative {
+      position: relative;
+
+      .chartBg {
+        position: absolute;
+        width: 100%;
+        height: 58%;
+        top: 56px;
+        left: 0px;
+        background: url("@/assets/echartsBg.png") no-repeat center center;
+        background-size: 100% 100%;
+      }
+      .chart-content {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        top: 0px;
+        left: 0px;
+        z-index: 99;
+        text-align: center;
+        display: flex;
+        justify-content: center;
+        flex-direction: column;
+        align-items: center;
+        .chart-num {
+          height: 20px;
+          font-family: "pangmenzhengdao";
+          font-size: 20px;
+          color: #ffffff;
+          text-shadow: 0px 2px 4px #40a9ff;
+        }
+        .chart-title {
+          font-family: PingFangSC, PingFang SC;
+          font-weight: 400;
+          font-size: 14px;
+          color: #ffffff;
+          margin-top: 23px;
+          margin-bottom: 60px;
+        }
+      }
+      .chart-black {
+        position: absolute;
+    left: 55px;
+    top: 86px;
+    height: 12%;
+    width: 35%;
+    background: rgba(0, 0, 0, 0.5);
+    border-radius: 28px / 10px;
+    padding-top: 17px;
+      }
+    }
 
     .pie-chart {
       position: relative;
@@ -918,7 +974,7 @@
           }
 
           .item-name {
-            font-family: 'pangmenzhengdao';
+            font-family: "pangmenzhengdao";
             width: 100px;
             color: #fff;
             font-weight: 500;

--
Gitblit v1.7.1