| | |
| | | <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> |
| | |
| | | <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> |
| | |
| | | ></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"> |
| | |
| | | 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> |
| | |
| | | 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", |
| | |
| | | }, |
| | | mounted() { |
| | | this.$nextTick(() => { |
| | | this.init(); |
| | | this.initCompensationOption(this.twoEcharts); |
| | | this.init(this.data.placementTypeResponses); |
| | | this.initCompensationOption(this.data.monthCompensationResponses); |
| | | this.initBarChart(); |
| | | }); |
| | | }, |
| | |
| | | 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++) { |
| | |
| | | }, |
| | | grid3D: { |
| | | show: false, |
| | | boxHeight: 0.5, |
| | | boxHeight: 1, |
| | | bottom: "50%", |
| | | viewControl: { |
| | | distance: 280, |
| | |
| | | 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; //柱状体高度 |
| | | }, |
| | | }; |
| | | }, |
| | |
| | | show: false, |
| | | }, |
| | | itemStyle: { |
| | | opacity: 0.1, |
| | | opacity: 0.05, |
| | | color: "#0ff", |
| | | }, |
| | | parametricEquation: { |
| | |
| | | }); |
| | | 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; |
| | | |
| | |
| | | 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); |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | .item-name { |
| | | font-family: 'pangmenzhengdao'; |
| | | font-family: "pangmenzhengdao"; |
| | | width: 100px; |
| | | color: #fff; |
| | | font-weight: 500; |