hejianhao
2025-03-24 4223c358f1ad9ffa4fcbc8fb0e350dc5bf342b51
src/components/datascreen/RightPanel.vue
@@ -2,129 +2,678 @@
  <div class="right-panel">
    <!-- 右侧第一块 -->
    <div class="panel-item top-panel-item">
      <div class="box-title">本月进度值比</div>
      <div class="circle-progress">
        <v-chart class="chart" :option="circleOption" autoresize />
      <div class="box-title">安置房类型占比</div>
      <div class="house-type-content">
        <div class="cityGreenLand-charts" ref="cityGreenLandCharts"></div>
        <div class="right-content">
          <div class="table-header">
            <div class="header-item">数量</div>
            <div class="header-item">面积</div>
            <div class="header-item">占比</div>
          </div>
          <div class="data-list">
            <div
              class="data-item"
              :class="{ activeItem: item.name === currentType.name }"
              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-value" :style="{ color: item.color }">
                {{ item.value }}
              </div>
              <div class="item-area" :style="{ color: item.color }">
                {{ item.area }}
              </div>
              <div class="item-percent" :style="{ color: item.color }">
                {{ item.percent }}
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!-- 右侧第二块 -->
    <div class="panel-item middle-panel-item">
      <div class="box-title">各季度进度值统计</div>
      <div class="bar-chart">
        <v-chart class="chart" :option="barOption" autoresize />
      <div class="box-title">本月应补偿占比</div>
      <div class="compensation-content">
        <div class="circle-chart">
          <div
            ref="compensationCharts"
            id="compensationCharts"
            style="width: 100%; height: 100%"
          ></div>
          <div class="compensation-list">
            <div class="compensation-center">
              <div class="total-value">{{ (total*1).toFixed(2) }}</div>
              <div class="total-name">总额(万元)</div>
            </div>
            <div class="compensation-item">
              <div
                class="compensation-item-name"
                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-dot" :style="{ background: item.color }"></div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!-- 右侧第三块 -->
    <div class="panel-item bottom-panel-item">
      <div class="box-title">安置房类型分布</div>
      <div class="box-title">各季度应补偿金额</div>
      <div class="pie-chart">
        <v-chart class="chart" :option="typeDistOption" autoresize />
        <v-chart class="chart" :option="barOption" autoresize />
      </div>
    </div>
  </div>
</template>
<script>
import * as echarts from "echarts";
import "echarts-gl";
export default {
  name: 'RightPanel',
  props: {
    data: {
      type: Object,
      default: () => { }
    }
  },
  data() {
    return {
      circleOption: {
        series: [{
          type: 'pie',
          radius: ['75%', '80%'],
          label: {
            show: false
          },
          data: [
            {
              value: 78.8,
              name: '完成率',
              itemStyle: {
                color: '#00ffff'
              }
            },
            {
              value: 21.2,
              name: '剩余',
              itemStyle: {
                color: 'rgba(0,255,255,0.2)'
              }
            }
          ]
        }]
    const houseTypeData = [
      {
        name: "新建商品住房",
        value: 321,
        area: 35344,
        percent: "56.8%",
        color: "#00ffff",
      },
      barOption: {
      {
        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],
      total: null,
      barOption: {},
      twoEcharts: [
        {
          name: "首付款",
          value: 78.8,
          color: "#00ffff",
        },
        {
          name: "季度款",
          value: 78.8,
          color: "#34D160",
        },
        {
          name: "过渡补贴",
          value: 78.8,
          color: "#F8B551",
        },
      ],
      typeDistOption: {
        tooltip: {
          trigger: 'axis'
          trigger: "item",
        },
        series: [
          {
            type: "pie",
            radius: ["65%", "80%"],
            label: {
              show: false,
            },
            data: [
              { value: 40, name: "商品房" },
              { value: 30, name: "安置房" },
              { value: 30, name: "其他" },
            ],
            itemStyle: {
              color: function (params) {
                const colorList = ["#00ffff", "#7cb9e8", "rgba(0,255,255,0.5)"];
                return colorList[params.dataIndex];
              },
            },
          },
        ],
      },
    };
  },
  mounted() {
    this.$nextTick(() => {
      this.init();
      this.initCompensationOption(this.twoEcharts);
      this.initBarChart();
    });
  },
  methods: {
    changeCurrentType(type) {
      this.currentType = type;
    },
    initBarChart() {
      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('-', '/'));
          return dateA - dateB;
        });
      const maxValue = Math.max(...sortedData.map(item => item[1]));
      const yAxisMax = Math.ceil(maxValue / 100) * 100;
      this.barOption = {
        tooltip: {
          trigger: 'axis',
          formatter: function(params) {
            const dataParams = params[1];
            // 获取当前柱子的颜色(取渐变色的起始色)
            let color;
            if (dataParams.dataIndex === 0) {
              color = '#FFEF00';
            } else if (dataParams.dataIndex === 1) {
              color = '#00FFC3';
            } else if (dataParams.dataIndex === 2) {
              color = '#00DBFF';
            } else {
              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',
          borderWidth: 1,
          textStyle: {
            color: '#333333',
            fontSize: 14
          },
          padding: [8, 12]
        },
        grid: {
          top: '10%',
          left: '3%',
          right: '4%',
          bottom: '3%',
          containLabel: true
        },
        xAxis: {
          type: 'category',
          data: ['2023年4月', '2023年5月', '2023年7月', '2023年10月'],
          data: sortedData.map(item => item[0]),
          axisLine: {
            lineStyle: {
              color: '#7cb9e8'
              color: 'rgba(30, 44, 88, 1)'
            }
          },
          axisTick: {
            show: false
          },
          axisLabel: {
            color: '#7cb9e8'
            color: '#ffffff',
            fontSize: 12
          }
        },
        yAxis: {
          type: 'value',
          axisLine: {
            lineStyle: {
              color: '#7cb9e8'
            }
          },
          max: yAxisMax,
          splitNumber: 4,
          axisLabel: {
            color: '#7cb9e8'
            color: 'rgba(88, 115, 150, 1)',
            fontSize: 12
          },
          splitLine: {
            lineStyle: {
              color: 'rgba(124,185,232,0.1)'
              color: 'rgba(30, 44, 88, 1)'
            }
          }
        },
        series: [{
          data: [120, 200, 150, 80],
          type: 'bar',
          itemStyle: {
            color: '#00ffff'
          }
        }]
      },
      typeDistOption: {
        tooltip: {
          trigger: 'item'
        },
        series: [{
          type: 'pie',
          radius: ['65%', '80%'],
          label: {
            show: false
        series: [
          {
            type: 'bar',
            barWidth: '30%',
            z: 1,
            data: Array(sortedData.length).fill(yAxisMax),
            itemStyle: {
              color: 'rgba(0, 255, 255, 0.1)'
            }
          },
          data: [
            { value: 40, name: '商品房' },
            { value: 30, name: '安置房' },
            { value: 30, name: '其他' }
          ],
          itemStyle: {
            color: function(params) {
              const colorList = ['#00ffff', '#7cb9e8', 'rgba(0,255,255,0.5)'];
              return colorList[params.dataIndex];
            }
          {
            type: 'pictorialBar',
            symbol: 'roundRect',
            symbolSize: [20, 6],
            symbolRepeat: 'fixed',
            symbolMargin: 1,
            symbolClip: true,
            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' }
                ])
              }
            }))
          }
        }]
        ]
      };
    },
    init() {
      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];
      // 传入数据生成 option
      let optionsData = [];
      for (let i = 0; i < xData.length; i++) {
        optionsData.push({
          name: xData[i],
          value: yData[i],
          itemStyle: {
            color: colors[i],
          },
        });
      }
    };
  }
      const series = this.getPie3D(optionsData, 0.55);
      series.push({
        name: "pie2d",
        type: "pie",
        labelLine: {
          show: false,
          length: 60,
          length2: 60,
        },
        startAngle: -50,
        clockwise: false,
        radius: ["0", "0"],
        center: ["50%", "50%"],
        data: optionsData,
        itemStyle: {
          opacity: 0,
        },
      });
      let option = {
        animation: true,
        labelLine: {
          show: false,
        },
        xAxis3D: {
          min: -1,
          max: 1,
        },
        yAxis3D: {
          min: -1,
          max: 1,
        },
        zAxis3D: {
          min: -1,
          max: 1,
        },
        grid3D: {
          show: false,
          boxHeight: 0.5,
          bottom: "50%",
          viewControl: {
            distance: 280,
            alpha: 30,
            beta: 40,
            zoom: 40,
            rotateSensitivity: 0,
            zoomSensitivity: 0,
            panSensitivity: 0,
            autoRotate: false,
          },
        },
        series: series,
      };
      myChart.setOption(option);
      window.addEventListener("resize", () => {
        myChart.resize();
      });
    },
    getParametricEquation(
      startRatio,
      endRatio,
      isSelected,
      isHovered,
      k,
      height
    ) {
      let midRatio = (startRatio + endRatio) / 2;
      let startRadian = startRatio * Math.PI * 2;
      let endRadian = endRatio * Math.PI * 2;
      let midRadian = midRatio * Math.PI * 2;
      if (startRatio === 0 && endRatio === 1) {
        isSelected = false;
      }
      k = typeof k !== "undefined" ? k : 1 / 3;
      let offsetX = isSelected ? Math.cos(midRadian) * 0.1 : 0;
      let offsetY = isSelected ? Math.sin(midRadian) * 0.1 : 0;
      let hoverRate = isHovered ? 1.05 : 1;
      return {
        u: {
          min: -Math.PI,
          max: Math.PI * 3,
          step: Math.PI / 32,
        },
        v: {
          min: 0,
          max: Math.PI * 2,
          step: Math.PI / 20,
        },
        x: function (u, v) {
          if (u < startRadian) {
            return (
              offsetX +
              Math.cos(startRadian) * (1 + Math.cos(v) * k) * hoverRate
            );
          }
          if (u > endRadian) {
            return (
              offsetX + Math.cos(endRadian) * (1 + Math.cos(v) * k) * hoverRate
            );
          }
          return offsetX + Math.cos(u) * (1 + Math.cos(v) * k) * hoverRate;
        },
        y: function (u, v) {
          if (u < startRadian) {
            return (
              offsetY +
              Math.sin(startRadian) * (1 + Math.cos(v) * k) * hoverRate
            );
          }
          if (u > endRadian) {
            return (
              offsetY + Math.sin(endRadian) * (1 + Math.cos(v) * k) * hoverRate
            );
          }
          return offsetY + Math.sin(u) * (1 + Math.cos(v) * k) * hoverRate;
        },
        z: function (u, v) {
          if (u < -Math.PI * 0.5) {
            return Math.sin(u);
          }
          if (u > Math.PI * 2.5) {
            return Math.sin(u);
          }
          return Math.sin(v) > 0 ? 2 * height : -1;
        },
      };
    },
    getPie3D(pieData, internalDiameterRatio) {
      let series = [];
      let sumValue = 0;
      let startValue = 0;
      let endValue = 0;
      let k =
        typeof internalDiameterRatio !== "undefined"
          ? (1 - internalDiameterRatio) / (1 + internalDiameterRatio)
          : 1 / 3;
      for (let i = 0; i < pieData.length; i++) {
        sumValue += pieData[i].value;
        let seriesItem = {
          name:
            typeof pieData[i].name === "undefined"
              ? `series${i}`
              : pieData[i].name,
          type: "surface",
          parametric: true,
          wireframe: {
            show: false,
          },
          pieData: pieData[i],
          pieStatus: {
            selected: false,
            hovered: false,
            k: k,
          },
        };
        if (typeof pieData[i].itemStyle != "undefined") {
          let itemStyle = {};
          typeof pieData[i].itemStyle.color != "undefined"
            ? (itemStyle.color = pieData[i].itemStyle.color)
            : null;
          typeof pieData[i].itemStyle.opacity != "undefined"
            ? (itemStyle.opacity = pieData[i].itemStyle.opacity)
            : null;
          seriesItem.itemStyle = itemStyle;
        }
        series.push(seriesItem);
      }
      for (let i = 0; i < series.length; i++) {
        endValue = startValue + series[i].pieData.value;
        series[i].pieData.startRatio = startValue / sumValue;
        series[i].pieData.endRatio = endValue / sumValue;
        series[i].parametricEquation = this.getParametricEquation(
          series[i].pieData.startRatio,
          series[i].pieData.endRatio,
          false,
          false,
          k,
          series[i].pieData.value
        );
        startValue = endValue;
      }
      series.push({
        name: "mouseoutSeries",
        type: "surface",
        parametric: true,
        wireframe: {
          show: false,
        },
        itemStyle: {
          opacity: 0,
          color: "#f0f",
        },
        parametricEquation: {
          u: {
            min: 0,
            max: Math.PI * 2,
            step: Math.PI / 20,
          },
          v: {
            min: 0,
            max: Math.PI,
            step: Math.PI / 20,
          },
          x: function (u, v) {
            return ((Math.sin(v) * Math.sin(u) + Math.sin(u)) / Math.PI) * 2;
          },
          y: function (u, v) {
            return ((Math.sin(v) * Math.cos(u) + Math.cos(u)) / Math.PI) * 2;
          },
          z: function (u, v) {
            return Math.cos(v) > 0 ? 0 : -20;
          },
        },
      });
      series.push({
        name: "mouseoutSeries",
        type: "surface",
        parametric: true,
        wireframe: {
          show: false,
        },
        itemStyle: {
          opacity: 0.1,
          color: "#0ff",
        },
        parametricEquation: {
          u: {
            min: 0,
            max: Math.PI * 2,
            step: Math.PI / 20,
          },
          v: {
            min: 0,
            max: Math.PI,
            step: Math.PI / 20,
          },
          x: function (u, v) {
            return ((Math.sin(v) * Math.sin(u) + Math.sin(u)) / Math.PI) * 2;
          },
          y: function (u, v) {
            return ((Math.sin(v) * Math.cos(u) + Math.cos(u)) / Math.PI) * 2;
          },
          z: function (u, v) {
            return Math.cos(v) > 0 ? -15 : -30;
          },
        },
      });
      return series;
    },
    initCompensationOption(data) {
      const chartDom = this.$refs.compensationCharts;
      if (!chartDom) return;
      const chartCompensation = echarts.init(chartDom);
      let option = {
        polar: {
          radius: [50, "70%"],
          center: ["50%", "40%"],
        },
        grid: {
          left: "10%",
          bottom: "40%",
          width: "80%",
          height: "100%",
        },
        angleAxis: {
          max: 7,
          startAngle: 75,
          show: false,
          axisTick: {
            show: false,
          },
          axisLine: { show: false },
          minorSplitLine: { show: false },
        },
        radiusAxis: {
          type: "category",
          show: false,
          data: [],
          axisTick: {
            show: false,
          },
        },
        tooltip: { show: false },
        series: {
          type: "bar",
          barMaxWidth: "11px",
          showBackground: true,
          roundCap: true,
          backgroundStyle: {
            color: "rgba(255, 255, 255, 0.1)",
          },
          data: [],
          coordinateSystem: "polar",
        },
      };
      let max = 0;
      let total = 0;
      let arr = [];
      for (let i = 0; i < data.length; i++) {
        max = Math.max(max, data[i].value);
        total += data[i].value;
        arr.push({
          value: data[i].value,
          itemStyle: { color: data[i].color },
        });
      }
      this.total = total;
      option.angleAxis.max = total;
      option.radiusAxis.data = data.map((item) => item.name);
      option.series.data = arr;
      chartCompensation.setOption(option);
      window.addEventListener("resize", () => {
        chartCompensation.resize();
      });
    },
  },
};
</script>
<style lang="less" scoped>
.water-eval-container {
  width: 100%;
  height: 100%;
}
.cityGreenLand-charts {
  width: 170px;
  height: 100%;
}
.right-panel {
  position: absolute;
  top: 111px;
@@ -138,35 +687,363 @@
  .top-panel-item {
    height: 268px;
    background: url('@/assets/right-top-bg.png') no-repeat center center;
    background: url("@/assets/right-middle-bg.png") no-repeat center center;
    background-size: 100% 100%;
  }
  .middle-panel-item {
    margin-top: 21px;
    height: 303px;
    background: url('@/assets/right-middle-bg.png') no-repeat center center;
    background: url("@/assets/right-middle-bg.png") no-repeat center center;
    background-size: 100% 100%;
  }
  .bottom-panel-item {
    margin-top: 21px;
    height: 335px;
    background: url('@/assets/right-bottom-bg.png') no-repeat center center;
    background: url("@/assets/right-bottom-bg.png") no-repeat center center;
    background-size: 100% 100%;
  }
  .box-title {
    font-size: 14px;
    color: #19ECFF;
    color: #19ecff;
    text-align: center;
    padding-top: 9px;
    line-height: 21px;
  }
  .house-type-content {
    height: calc(100% - 30px);
    display: flex;
    padding: 10px 13px;
    .pie-chart {
      position: relative;
      width: 45%;
      height: 100%;
      display: flex;
      align-items: center;
      &::after {
        content: "";
        position: absolute;
        bottom: 15%;
        left: 50%;
        transform: translateX(-50%);
        width: 60%;
        height: 10px;
        background: radial-gradient(
          ellipse at center,
          rgba(0, 255, 255, 0.3) 0%,
          rgba(0, 0, 0, 0) 70%
        );
        border-radius: 50%;
        filter: blur(3px);
        z-index: 0;
      }
      .center-text {
        position: absolute;
        left: 40%;
        top: 50%;
        transform: translate(-50%, -50%);
        text-align: center;
        z-index: 2;
        padding: 10px 15px;
        border-radius: 4px;
        background: rgba(0, 0, 0, 0.2);
        backdrop-filter: blur(2px);
        .percent {
          display: block;
          font-size: 28px;
          color: #fff;
          font-weight: bold;
        }
        .type {
          display: block;
          font-size: 14px;
          color: #19ecff;
          margin-top: 5px;
        }
      }
    }
    .type-list {
      flex: 1;
      margin-left: 30px;
      display: flex;
      flex-direction: column;
      justify-content: space-around;
      .type-item {
        display: grid;
        grid-template-columns: auto 1fr 1fr 1fr;
        gap: 15px;
        align-items: center;
        cursor: pointer;
        padding: 5px 10px;
        transition: all 0.3s;
        position: relative;
        &:hover {
          background: rgba(25, 236, 255, 0.1);
          border-radius: 4px;
        }
        &::before {
          content: "";
          position: absolute;
          left: 0;
          right: 0;
          bottom: -5px;
          height: 1px;
          background: linear-gradient(
            90deg,
            transparent,
            rgba(25, 236, 255, 0.2),
            transparent
          );
        }
        .dot {
          width: 8px;
          height: 8px;
          border-radius: 50%;
          margin-right: 8px;
          box-shadow: 0 0 5px rgba(255, 255, 255, 0.3);
        }
        .name {
          color: #fff;
          font-size: 14px;
        }
        .value {
          color: #00ffff;
          font-size: 14px;
          text-align: center;
        }
        .area {
          color: #00ffff;
          font-size: 14px;
          text-align: center;
        }
        .percent {
          color: #00ffff;
          font-size: 14px;
          text-align: right;
        }
      }
    }
    .right-content {
      flex: 1;
      height: 100%;
      overflow: hidden;
      display: flex;
      flex-direction: column;
      padding-top: 27px;
      .table-header {
        display: flex;
        align-items: center;
        padding: 0 19px 0px 118px;
        margin-bottom: 8px;
        .header-item {
          color: #b6d9fc;
          font-weight: 400;
          font-size: 10px;
          text-align: center;
          &:nth-child(1) {
            width: 60px;
          }
          &:nth-child(2) {
            width: 80px;
          }
          &:nth-child(3) {
            width: 60px;
            text-align: right;
          }
        }
      }
      .data-list {
        flex: 1;
        overflow-y: auto;
        // padding-right: 10px;
        &::-webkit-scrollbar {
          display: none;
        }
        .data-item {
          display: flex;
          align-items: center;
          padding: 5px 7px 5px 4px;
          position: relative;
          margin-bottom: 21px;
          cursor: pointer;
          &:not(:last-child)::after {
            content: "";
            position: absolute;
            left: 0;
            right: 0;
            bottom: 0;
            height: 1px;
            background: linear-gradient(
              90deg,
              transparent,
              rgba(25, 236, 255, 0.2),
              transparent
            );
          }
          .item-dot {
            width: 8px;
            height: 8px;
            flex-shrink: 0;
            border-radius: 50%;
            margin-right: 3px;
            box-shadow: 0 0 5px rgba(255, 255, 255, 0.3);
          }
          .item-name {
            font-family: 'pangmenzhengdao';
            width: 100px;
            color: #fff;
            font-weight: 500;
            font-size: 12px;
            white-space: nowrap;
            overflow: hidden;
            text-overflow: ellipsis;
          }
          .item-value {
            width: 60px;
            color: #00ffff;
            font-size: 12px;
            text-align: center;
          }
          .item-area {
            width: 80px;
            color: #00ffff;
            font-size: 12px;
            text-align: center;
          }
          .item-percent {
            width: 60px;
            color: #00ffff;
            font-size: 12px;
            text-align: right;
          }
        }
        .activeItem {
          box-sizing: border-box;
          background: rgba(105, 192, 255, 0.12);
          border-radius: 4px;
          border: 1px solid rgba(105, 192, 255, 0.29);
        }
      }
    }
  }
  .chart {
    width: 100%;
    height: calc(100% - 35px);
    height: 100%;
  }
  .middle-panel-item {
    .compensation-content {
      height: calc(100% - 30px);
      display: flex;
      flex-direction: column;
      align-items: center;
      padding: 20px;
      .circle-chart {
        width: 100%;
        height: 260px;
        position: relative;
      }
      .compensation-list {
        position: absolute;
        bottom: 0;
        left: 0;
        width: 100%;
        height: 100%;
        display: flex;
        flex-direction: column;
        margin-top: 20px;
        padding: 0 40px 0px 40px;
        .compensation-center {
          display: flex;
          flex: 1;
          justify-content: center;
          align-items: center;
          flex-direction: column;
          .total-value {
            font-family: PangMenZhengDao;
            font-size: 28px;
            color: #ffffff;
            margin-bottom: 11px;
          }
          .total-name {
            font-family: SourceHanSansCN, SourceHanSansCN;
            font-weight: 400;
            font-size: 12px;
            color: rgba(255, 255, 255, 1);
          }
        }
        .compensation-item {
          width: 100%;
          height: 45px;
          display: flex;
          justify-content: space-between;
          align-items: center;
          .compensation-item-name {
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            .item-name {
              font-size: 16px;
              color: #ffffff;
              margin-bottom: 5px;
              font-family: "pangmenzhengdao";
            }
            .item-value {
              font-weight: 400;
              font-size: 12px;
              color: #ffffff;
              margin-bottom: 2px;
            }
            .item-dot {
              width: 8px;
              height: 8px;
              border-radius: 50%;
            }
          }
        }
      }
    }
  }
}
</style>
.pie-chart {
  height: calc(100% - 35px);
}
</style>