| | |
| | | <div class="box-content"> |
| | | <div class="box-content-item"> |
| | | <div class="box-content-item-title">总参与户数(户)</div> |
| | | <div class="box-content-item-value">87695</div> |
| | | <div class="box-content-item-value">{{ data.selfBuyResponse.householdNum || 0 }}</div> |
| | | </div> |
| | | <div class="box-content-item" style="margin-left: 35px;"> |
| | | <div class="box-content-item-title">总参与人数(人)</div> |
| | | <div class="box-content-item-value">876995</div> |
| | | <div class="box-content-item-value">{{ data.selfBuyResponse.personNum || 0 }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div v-for="(item, index) in rankingList" :key="index" class="ranking-item"> |
| | | <div class="ranking-item-content"> |
| | | <span class="rank" :class="'rank-' + (index + 1)">{{ index + 1 }}</span> |
| | | <span class="name">{{ item.name }}</span> |
| | | <span class="name">{{ item.street }}</span> |
| | | <div class="value"> |
| | | <div class="value-text"> |
| | | 环比 |
| | | <span class="value-text-value" :class="{ 'positive': item.growth > 0, 'negative': item.growth < 0 }"> |
| | | {{ item.growth > 0 ? '+' : '' }}{{ item.growth }}% |
| | | <span class="value-text-value" |
| | | :class="{ 'positive': item.latestBatchHouseholdCount < item.secondLatestBatchHouseholdCount, 'negative': item.latestBatchHouseholdCount > item.secondLatestBatchHouseholdCount }"> |
| | | {{ item.growth > 0 ? '+' : '' }}{{ item.householdNumRate }} |
| | | </span> |
| | | </div> |
| | | {{ item.value }} |
| | | {{ item.householdNum }}人 |
| | | </div> |
| | | </div> |
| | | <div class="progress-bar"> |
| | |
| | | <script> |
| | | export default { |
| | | name: 'LeftPanel', |
| | | components: { |
| | | props: { |
| | | data: { |
| | | type: Object, |
| | | default: () => ({}) |
| | | }, |
| | | }, |
| | | data() { |
| | | return { |
| | | totalHouseholds: 87695, |
| | | totalPeople: 876995, |
| | | rankingList: [ |
| | | { name: '崇州街道', percentage: 0, value: '999户', growth: 43.2 }, |
| | | { name: '羊马乡', percentage: 0, value: '999户', growth: -12.5 }, |
| | | { name: '万家镇', percentage: 0, value: '999户', growth: 8.3 }, |
| | | { name: '崇阳街道', percentage: 0, value: '999户', growth: -5.2 }, |
| | | { name: '白头镇', percentage: 0, value: '999户', growth: 15.7 }, |
| | | { name: '金鸡乡', percentage: 0, value: '999户', growth: -3.8 }, |
| | | { name: '西江镇', percentage: 0, value: '999户', growth: 22.1 }, |
| | | { name: '观胜镇', percentage: 0, value: '999户', growth: -7.4 } |
| | | ], |
| | | finalPercentages: [ |
| | | 50, 85, 80, 75, 70, 65, 60, 55 |
| | | ], |
| | | |
| | | totalHouseholds: 0, |
| | | totalPeople: 0, |
| | | rankingList: [], |
| | | lineOption: { |
| | | tooltip: { |
| | | trigger: 'axis', |
| | |
| | | grid: { |
| | | top: '20%', |
| | | left: '3%', |
| | | right: '4%', |
| | | right: '6%', |
| | | bottom: '3%', |
| | | containLabel: true |
| | | }, |
| | | xAxis: { |
| | | type: 'category', |
| | | boundaryGap: false, |
| | | data: ['1月', '2月', '3月', '4月', '5月', '6月'], |
| | | data: [], |
| | | axisLine: { |
| | | show: true, |
| | | lineStyle: { |
| | |
| | | show: false |
| | | }, |
| | | axisLabel: { |
| | | color: '#495F88', |
| | | fontSize: 12 |
| | | color: '#fff', |
| | | fontSize: 12, |
| | | // rotate: 30, // 标签倾斜角度 |
| | | } |
| | | }, |
| | | yAxis: { |
| | | type: 'value', |
| | | name: '单位:次', |
| | | nameTextStyle: { |
| | | color: '#495F88', |
| | | color: '#fff', |
| | | fontSize: 12, |
| | | }, |
| | | splitLine: { |
| | |
| | | show: false |
| | | }, |
| | | axisLabel: { |
| | | color: '#495F88', |
| | | color: '#fff', |
| | | fontSize: 12 |
| | | } |
| | | }, |
| | |
| | | name: '安置面积异常', |
| | | type: 'line', |
| | | smooth: true, |
| | | symbol: 'none', |
| | | symbol: 'circle', |
| | | itemStyle: { |
| | | color: '#FEDB65' |
| | | }, |
| | |
| | | lineStyle: { |
| | | width: 4, |
| | | color: { |
| | | type: 'linear', |
| | | x: 0, |
| | | y: 0, |
| | | x2: 1, |
| | | y2: 0, |
| | | colorStops: [{ |
| | | offset: 0, |
| | | color: '#AE5112' // 0% 处的颜色 |
| | | }, { |
| | | offset: 0.3, |
| | | color: '#FEDB65' // 50% 处的颜色 |
| | | }, { |
| | | offset: 0.7, |
| | | color: '#FEDB65' // 50% 处的颜色 |
| | | }, { |
| | | offset: 1, |
| | | color: '#AE5112' // 100% 处的颜色 |
| | | }] |
| | | type: 'linear', |
| | | x: 0, |
| | | y: 0, |
| | | x2: 1, |
| | | y2: 0, |
| | | colorStops: [{ |
| | | offset: 0, |
| | | color: '#AE5112' // 0% 处的颜色 |
| | | }, { |
| | | offset: 0.3, |
| | | color: '#FEDB65' // 50% 处的颜色 |
| | | }, { |
| | | offset: 0.7, |
| | | color: '#FEDB65' // 50% 处的颜色 |
| | | }, { |
| | | offset: 1, |
| | | color: '#AE5112' // 100% 处的颜色 |
| | | }] |
| | | } |
| | | }, |
| | | data: [150, 180, 230, 280, 260, 100] |
| | | data: [] |
| | | }, |
| | | { |
| | | name: '补偿金额异常', |
| | | type: 'line', |
| | | smooth: true, |
| | | symbol: 'none', |
| | | symbol: 'circle', |
| | | itemStyle: { |
| | | color: '#00F2EF' |
| | | color: '#00F2EF' |
| | | }, |
| | | areaStyle: { |
| | | opacity: 0.8, |
| | |
| | | lineStyle: { |
| | | width: 4, |
| | | color: { |
| | | type: 'linear', |
| | | x: 0, |
| | | y: 0, |
| | | x2: 1, |
| | | y2: 0, |
| | | colorStops: [{ |
| | | offset: 0, |
| | | color: '#0E5FFF' // 0% 处的颜色 |
| | | }, { |
| | | offset: 0.3, |
| | | color: '#00F2EF' // 50% 处的颜色 |
| | | }, { |
| | | offset: 0.7, |
| | | color: '#00F2EF' // 50% 处的颜色 |
| | | }, { |
| | | offset: 1, |
| | | color: '#0E5FFF' // 100% 处的颜色 |
| | | }] |
| | | type: 'linear', |
| | | x: 0, |
| | | y: 0, |
| | | x2: 1, |
| | | y2: 0, |
| | | colorStops: [{ |
| | | offset: 0, |
| | | color: '#0E5FFF' // 0% 处的颜色 |
| | | }, { |
| | | offset: 0.3, |
| | | color: '#00F2EF' // 50% 处的颜色 |
| | | }, { |
| | | offset: 0.7, |
| | | color: '#00F2EF' // 50% 处的颜色 |
| | | }, { |
| | | offset: 1, |
| | | color: '#0E5FFF' // 100% 处的颜色 |
| | | }] |
| | | } |
| | | }, |
| | | data: [200, 250, 380, 450, 380, 300] |
| | | data: [] |
| | | } |
| | | ] |
| | | } |
| | | }; |
| | | }, |
| | | mounted() { |
| | | // 使用 setTimeout 确保 DOM 已经渲染 |
| | | setTimeout(() => { |
| | | this.animateProgressBars(); |
| | | }, 100); |
| | | watch: { |
| | | data: { |
| | | handler(newVal, oldVal) { |
| | | if (newVal) { |
| | | this.rankingList = newVal.streetResponses |
| | | this.$nextTick(() => { |
| | | this.animateProgressBars(); |
| | | this.updateChartData(this.data.importErrorResponses); |
| | | }); |
| | | } |
| | | }, |
| | | deep: true, |
| | | immediate: true |
| | | } |
| | | }, |
| | | methods: { |
| | | animateProgressBars() { |
| | | this.rankingList = this.rankingList.map((item, index) => ({ |
| | | ...item, |
| | | percentage: this.finalPercentages[index] |
| | | })); |
| | | let count = 0 |
| | | this.rankingList.map(item => { |
| | | count += item.householdNum; |
| | | }); |
| | | |
| | | this.rankingList = this.rankingList.map((item, index) => { |
| | | item.percentage = (item.householdNum / count) * 100; |
| | | return item |
| | | }); |
| | | }, |
| | | updateChartData(apiData) { |
| | | this.lineOption.xAxis.data = apiData.map(item => item.month); |
| | | this.lineOption.series[0].data = apiData.map(item => item.areaErrorCount); |
| | | this.lineOption.series[1].data = apiData.map(item => item.moneyErrorCount); |
| | | } |
| | | } |
| | | }; |
| | |
| | | height: 196px; |
| | | background: url('@/assets/left-top-bg.png') no-repeat center center; |
| | | background-size: 100% 100%; |
| | | |
| | | .box-content { |
| | | display: flex; |
| | | justify-content: center; |
| | | margin-top: 30px; |
| | | height: 100%; |
| | | |
| | | .box-content-item-title { |
| | | width: 178px; |
| | | height: 38px; |
| | |
| | | background: url('@/assets/left/top-number-header.png') no-repeat center center; |
| | | background-size: 100% 100%; |
| | | } |
| | | |
| | | .box-content-item-value { |
| | | width: 178px; |
| | | height: 64px; |
| | |
| | | } |
| | | |
| | | .ranking-list { |
| | | height: 400px; |
| | | margin-top: 30px; |
| | | overflow: auto; |
| | | /* 隐藏滚动条 */ |
| | | scrollbar-width: none; |
| | | /* Firefox */ |
| | | -ms-overflow-style: none; |
| | | |
| | | /* IE 和 Edge */ |
| | | &::-webkit-scrollbar { |
| | | display: none; |
| | | /* Chrome, Safari 和 Opera */ |
| | | } |
| | | } |
| | | |
| | | .ranking-item { |
| | |
| | | height: 22px; |
| | | line-height: 22px; |
| | | padding-left: 2px; |
| | | |
| | | |
| | | &.rank-1 { |
| | | color: #E9B701; |
| | | background: url('@/assets/left/one.png') no-repeat center center; |
| | | background-size: 100% 100%; |
| | | } |
| | | |
| | | |
| | | &.rank-2 { |
| | | color: #0ED1A3; |
| | | background: url('@/assets/left/two.png') no-repeat center center; |
| | | background-size: 100% 100%; |
| | | } |
| | | |
| | | |
| | | &.rank-3 { |
| | | color: #0EBFDA; |
| | | background: url('@/assets/left/three.png') no-repeat center center; |
| | | background-size: 100% 100%; |
| | | } |
| | | |
| | | |
| | | &:not(.rank-1):not(.rank-2):not(.rank-3) { |
| | | color: #0089FF; |
| | | background: linear-gradient( 270deg, rgba(0,137,255,0) 0%, rgba(0,137,255,0.4) 100%); |
| | | background: linear-gradient(270deg, rgba(0, 137, 255, 0) 0%, rgba(0, 137, 255, 0.4) 100%); |
| | | } |
| | | } |
| | | |
| | |
| | | font-size: 15px; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | text-align: end; |
| | | width: 175px; |
| | | |
| | | .value-text { |
| | | color: #C0CFDC; |
| | | font-size: 12px; |
| | | width: 130px; |
| | | |
| | | .value-text-value { |
| | | margin-left: 12px; |
| | | |
| | | &.positive { |
| | | color: #FEDB65; |
| | | } |
| | | |
| | | &.negative { |
| | | color: #66FFFF; |
| | | } |
| | |
| | | width: 0; |
| | | transition: width 1.5s cubic-bezier(0.4, 0, 0.2, 1); |
| | | position: relative; |
| | | |
| | | |
| | | .progress-icon { |
| | | position: absolute; |
| | | right: -8px; |
| | |
| | | background-repeat: no-repeat; |
| | | background-position: center; |
| | | } |
| | | |
| | | |
| | | &.rank-1 { |
| | | background: linear-gradient(90deg, #2A1802 0%, #C86A01 49%, #E5D704 100%); |
| | | |
| | | .progress-icon { |
| | | background-image: url('@/assets/left/progress-one.png'); |
| | | } |
| | | } |
| | | |
| | | |
| | | &.rank-2 { |
| | | background: linear-gradient(270deg, #0ED1A3 0%, #03493E 100%); |
| | | |
| | | .progress-icon { |
| | | background-image: url('@/assets/left/progress-two.png'); |
| | | } |
| | | } |
| | | |
| | | |
| | | &.rank-3 { |
| | | background: linear-gradient(90deg, #104461 0%, #0EB2DA 100%); |
| | | |
| | | .progress-icon { |
| | | background-image: url('@/assets/left/progress-three.png'); |
| | | } |
| | | } |
| | | |
| | | |
| | | &:not(.rank-1):not(.rank-2):not(.rank-3) { |
| | | background: linear-gradient(90deg, #03142C 0%, #057BFF 49%, #05DBFF 100%); |
| | | |
| | | .progress-icon { |
| | | background-image: url('@/assets/left/progress-four.png'); |
| | | } |