From e1b782bbac430d8e01d43d5f610a46e4a29f661e Mon Sep 17 00:00:00 2001
From: pyt <626651354@qq.com>
Date: 星期二, 20 五月 2025 21:39:41 +0800
Subject: [PATCH] feat

---
 H5/pages/statistics/index.vue | 2025 ++++++++++++++++++++++++++++++++++-------------------------
 1 files changed, 1,167 insertions(+), 858 deletions(-)

diff --git a/H5/pages/statistics/index.vue b/H5/pages/statistics/index.vue
index 7fe4597..2774d7d 100644
--- a/H5/pages/statistics/index.vue
+++ b/H5/pages/statistics/index.vue
@@ -1,179 +1,166 @@
- <template>
- 	<view class="content">
- 		<view v-if="userInfo.isAdmin == 1" class="flex a-center pl-31 pr-31 fs-31 color1 pt-38">
- 			<text class="mr-15">查看范围:</text>
- 			<view 
- 				class="h-77 flex a-center j-between flex1 pl-31 pr-23 border1 br-15 bgColor1" :class="!address && 'color2'">
-				<view @click.top="selectPopup=true" class="flex1">
-					{{ address || '全部' }}
-				</view>
-				<u-icon class="shrink0" v-if="address" @click="clearAddress" name="close-circle"></u-icon>
- 				<image v-else src="/static/down@2x.png" mode="aspectFill" class="w-31 h-31 shrink0"></image>
- 			</view>
- 		</view>
- 		<view class="fs-35 font-bold pt-38 ml-27">
- 			处理满意率
- 		</view>
- 		<view class="ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19 pb-35">
- 			<view class="mt-19 flex1">
- 				<view class="flex a-center">
- 					<view class="w-12 h-12 br-6 border3"></view>
- 					<view class="fs-23 ml-15 color3">
- 						总体满意率
- 					</view>
- 				</view>
- 				<view class="fs-46 ml-27 mt-12 font-bold">
- 					77%
- 				</view>
- 			</view>
- 			<view class="flex1 flex j-between ml-50">
- 				<view class="fs-23 mt-42 txt-center">
- 					<view class="color6">
- 						本月
- 					</view>
- 					<view class="fs-27 font-bold color5 mt-2">
- 						88%
- 					</view>
- 				</view>
- 				<view class="fs-23 mt-44">
- 					<view class="color6">
- 						同比上月
- 					</view>
- 					<view class="txt-aligin-r color4 font-bold mt-4">
- 						+12%
- 					</view>
- 				</view>
- 			</view>
- 		</view>
- 		<view class="fs-35 font-bold mt-38 ml-27">
- 			诉求单统计
- 		</view>
- 		<view class="flex j-between a-center pl-29 pr-29 mt-27">
- 			<view class="pl-19 pr-21 shadow1 border2 pt-19 pb-42 flex1 br-15">
- 				<view class="flex a-center">
- 					<view class="w-12 h-12 br-6 border3"></view>
- 					<view class="fs-23 ml-15 color3">
- 						诉求单量总计
- 					</view>
- 				</view>
- 				<view class="fs-46 mt-12 font-bold ml-27">
- 					448451
- 				</view>
- 				<view class="flex j-between mt-21">
- 					<view class="fs-23">
- 						<view class="">
- 							本月
- 						</view>
- 						<view class="fs-27 font-bold color3 mt-2">
- 							4448
- 						</view>
- 					</view>
- 					<view class="fs-23">
- 						<view class="">
- 							同比上月
- 						</view>
- 						<view class="font-bold color8 txt-aligin-r mt-4">
- 							-12%
- 						</view>
- 					</view>
- 				</view>
- 			</view>
- 			<view class="pl-19 pr-21 shadow1 border2 pt-19 pb-42 flex1 ml-31 br-15">
- 				<view class="flex a-center">
- 					<view class="w-12 h-12 br-6 border3"></view>
- 					<view class="fs-23 ml-15 color3">
- 						平均处理时间(天)
- 					</view>
- 				</view>
- 				<view class="fs-46 mt-12 font-bold ml-27">
- 					3.2
- 				</view>
- 				<view class="flex j-between mt-21">
- 					<view class="fs-23">
- 						<view class="">
- 							本月
- 						</view>
- 						<view class="fs-27 font-bold color3 mt-2">
- 							2.2
- 						</view>
- 					</view>
- 					<view class="fs-23">
- 						<view class="">
- 							同比上月
- 						</view>
- 						<view class="font-bold color4 txt-aligin-r mt-4">
- 							+12%
- 						</view>
- 					</view>
- 				</view>
- 			</view>
- 		</view>
- 		<view class="flex mt-27 gap25 pl-29 pr-29">
- 			<view class="flex1 h-154 bgColor2 border4 shadow2 br-19 txt-center">
- 				<view class="mt-37 fs-35 color4 font-bold">
- 					4521
- 				</view>
- 				<view class="fs-23 mt-8 color3">
- 					正在办理
- 				</view>
- 			</view>
- 			<view class="flex1 h-154 bgColor3 border4 shadow2 br-19 txt-center">
- 				<view class="mt-37 fs-35 color9 font-bold">
- 					321
- 				</view>
- 				<view class="fs-23 mt-8 color3">
- 					审核中
- 				</view>
- 			</view>
- 			<view class="flex1 h-154 bgColor4 border4 shadow2 br-19 txt-center">
- 				<view class="mt-37 fs-35 color10 font-bold">
- 					6850
- 				</view>
- 				<view class="fs-23 mt-8 color3">
- 					延期办理
- 				</view>
- 			</view>
- 			<view class="flex1 h-154 bgColor5 border4 shadow2 br-19 txt-center">
- 				<view class="mt-37 fs-35 color11 font-bold">
- 					8451
- 				</view>
- 				<view class="fs-23 mt-8 color3">
- 					已办结
- 				</view>
- 			</view>
- 		</view>
- 		<view class="pb-35 ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19">
- 			<view class="mt-19 flex1">
- 				<view class="flex a-center">
- 					<view class="w-12 h-12 br-6 border3"></view>
- 					<view class="fs-23 ml-15 color3">
- 						超时办理
- 					</view>
- 				</view>
- 				<view class="fs-46 ml-27 mt-12 font-bold">
- 					6850
- 				</view>
- 			</view>
- 			<view class="flex1 flex j-between ml-50">
- 				<view class="fs-23 mt-42 txt-center">
- 					<view class="color6">
- 						本月
- 					</view>
- 					<view class="fs-27 font-bold color5 mt-2">
- 						4448
- 					</view>
- 				</view>
- 				<view class="fs-23 mt-44">
- 					<view class="color6">
- 						同比上月
- 					</view>
- 					<view class="txt-aligin-r color4 font-bold mt-4">
- 						+12%
- 					</view>
- 				</view>
- 			</view>
- 		</view>
- 		<view class="pb-35 ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19">
+<template>
+  <view class="content">
+    <view
+      v-if="userInfo.isAdmin == 1"
+      class="flex a-center pl-31 pr-31 fs-31 color1 pt-38"
+    >
+      <text class="mr-15">查看范围:</text>
+      <view
+        class="h-77 flex a-center j-between flex1 pl-31 pr-23 border1 br-15 bgColor1"
+        :class="!address && 'color2'"
+      >
+        <view @click.top="selectPopup = true" class="flex1">
+          {{ address || "全部" }}
+        </view>
+        <u-icon
+          class="shrink0"
+          v-if="address"
+          @click="clearAddress"
+          name="close-circle"
+        ></u-icon>
+        <image
+          v-else
+          src="/static/down@2x.png"
+          mode="aspectFill"
+          class="w-31 h-31 shrink0"
+        ></image>
+      </view>
+    </view>
+    <view class="fs-35 font-bold pt-38 ml-27"> 处理满意率 </view>
+    <view
+      class="ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19 pb-35"
+    >
+      <view class="mt-19 flex1">
+        <view class="flex a-center">
+          <view class="w-12 h-12 br-6 border3"></view>
+          <view class="fs-23 ml-15 color3"> 总体满意率 </view>
+        </view>
+        <view class="fs-46 ml-27 mt-12 font-bold">
+          {{ statisticsData.satisfaction.total }}%
+        </view>
+      </view>
+      <view class="flex1 flex j-between ml-50">
+        <view class="fs-23 mt-42 txt-center">
+          <view class="color6"> 本月 </view>
+          <view class="fs-27 font-bold color5 mt-2">
+            {{ statisticsData.satisfaction.month }}%
+          </view>
+        </view>
+        <view class="fs-23 mt-44">
+          <view class="color6"> 同比上月 </view>
+          <view class="txt-aligin-r color4 font-bold mt-4">
+            {{ statisticsData.satisfaction.compare > 0 ? "+" : ""
+            }}{{ statisticsData.satisfaction.compare }}%
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="fs-35 font-bold mt-38 ml-27"> 诉求单统计 </view>
+    <view class="flex j-between a-center pl-29 pr-29 mt-27">
+      <view class="pl-19 pr-21 shadow1 border2 pt-19 pb-42 flex1 br-15">
+        <view class="flex a-center">
+          <view class="w-12 h-12 br-6 border3"></view>
+          <view class="fs-23 ml-15 color3"> 诉求单量总计 </view>
+        </view>
+        <view class="fs-46 mt-12 font-bold ml-27">
+          {{ statisticsData.demands.total }}
+        </view>
+        <view class="flex j-between mt-21">
+          <view class="fs-23">
+            <view class=""> 本月 </view>
+            <view class="fs-27 font-bold color3 mt-2">
+              {{ statisticsData.demands.month }}
+            </view>
+          </view>
+          <view class="fs-23">
+            <view class=""> 同比上月 </view>
+            <view class="font-bold color8 txt-aligin-r mt-4">
+              {{ statisticsData.demands.compare > 0 ? "+" : ""
+              }}{{ statisticsData.demands.compare }}
+            </view>
+          </view>
+        </view>
+      </view>
+      <view class="pl-19 pr-21 shadow1 border2 pt-19 pb-42 flex1 ml-31 br-15">
+        <view class="flex a-center">
+          <view class="w-12 h-12 br-6 border3"></view>
+          <view class="fs-23 ml-15 color3"> 平均处理时间(天) </view>
+        </view>
+        <view class="fs-46 mt-12 font-bold ml-27">
+          {{ statisticsData.processTime.total }}
+        </view>
+        <view class="flex j-between mt-21">
+          <view class="fs-23">
+            <view class=""> 本月 </view>
+            <view class="fs-27 font-bold color3 mt-2">
+              {{ statisticsData.processTime.month }}
+            </view>
+          </view>
+          <view class="fs-23">
+            <view class=""> 同比上月 </view>
+            <view class="font-bold color4 txt-aligin-r mt-4">
+              {{ statisticsData.processTime.compare > 0 ? "+" : ""
+              }}{{ statisticsData.processTime.compare }}
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="flex mt-27 gap25 pl-29 pr-29">
+      <view class="flex1 h-154 bgColor2 border4 shadow2 br-19 txt-center">
+        <view class="mt-37 fs-35 color4 font-bold">
+          {{ statisticsData.status.processing }}
+        </view>
+        <view class="fs-23 mt-8 color3"> 正在办理 </view>
+      </view>
+      <view class="flex1 h-154 bgColor3 border4 shadow2 br-19 txt-center">
+        <view class="mt-37 fs-35 color9 font-bold">
+          {{ statisticsData.status.reviewing }}
+        </view>
+        <view class="fs-23 mt-8 color3"> 审核中 </view>
+      </view>
+      <view class="flex1 h-154 bgColor4 border4 shadow2 br-19 txt-center">
+        <view class="mt-37 fs-35 color10 font-bold">
+          {{ statisticsData.status.delayed }}
+        </view>
+        <view class="fs-23 mt-8 color3"> 延期办理 </view>
+      </view>
+      <view class="flex1 h-154 bgColor5 border4 shadow2 br-19 txt-center">
+        <view class="mt-37 fs-35 color11 font-bold">
+          {{ statisticsData.status.completed }}
+        </view>
+        <view class="fs-23 mt-8 color3"> 已办结 </view>
+      </view>
+    </view>
+    <view
+      class="pb-35 ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19"
+    >
+      <view class="mt-19 flex1">
+        <view class="flex a-center">
+          <view class="w-12 h-12 br-6 border3"></view>
+          <view class="fs-23 ml-15 color3"> 超时办理 </view>
+        </view>
+        <view class="fs-46 ml-27 mt-12 font-bold">
+          {{ statisticsData.overtime.total }}
+        </view>
+      </view>
+      <view class="flex1 flex j-between ml-50">
+        <view class="fs-23 mt-42 txt-center">
+          <view class="color6"> 本月 </view>
+          <view class="fs-27 font-bold color5 mt-2">
+            {{ statisticsData.overtime.month }}
+          </view>
+        </view>
+        <view class="fs-23 mt-44">
+          <view class="color6"> 同比上月 </view>
+          <view class="txt-aligin-r color4 font-bold mt-4">
+            {{ statisticsData.overtime.compare > 0 ? "+" : ""
+            }}{{ statisticsData.overtime.compare }}
+          </view>
+        </view>
+      </view>
+    </view>
+    <!-- <view class="pb-35 ml-29 mr-29 border2 br-15 mt-27 shadow1 flex j-between pl-19 pr-19">
  			<view class="mt-19 flex1">
  				<view class="flex a-center">
  					<view class="w-12 h-12 br-6 border3"></view>
@@ -203,685 +190,1007 @@
  					</view>
  				</view>
  			</view>
- 		</view>
- 		<view class="mt-27 shadow1 border2 ml-29 mr-29 pt-31 br-15" style="height: 511rpx;">
- 			<view class="flex mlr-o tabs mb-40">
- 				<view v-for="(item, index) in tabs" :key="index"
- 					:class="['tab-item', currentTab === index ? 'active' : '']" @click="handleTabClick(index)">
- 					{{item}}
- 				</view>
- 			</view>
- 			<view ref="chartRef" id="chart" style="width: 100%; height: 405rpx;"></view>
- 		</view>
- 		<view class="fs-35 font-bold mt-38 ml-27">
- 			问题类型排名
- 		</view>
- 		<view class="ml-29 mr-29 mt-27 shadow1 pt-31 border2 pl-38 pr-38 br-15">
- 			<uni-data-select v-model="value1" :localdata="range"></uni-data-select>
- 			<view class="fs-23">
- 				<view class="flex a-center mb-38">
- 					<view class="w-130 color3">
- 						教育
- 					</view>
- 					<u-line-progress :percentage="95" inactiveColor="#EEEEEE"
- 						:activeColor="'linear-gradient(270deg, #FF4934 0%, #FF8064 100%)'" height="38rpx">
- 						<text class="u-percentage-slot pr-19 fs-23">248</text>
- 					</u-line-progress>
- 				</view>
- 				<view class="flex a-center mb-38">
- 					<view class="w-130 color3">
- 						就业
- 					</view>
- 					<u-line-progress :percentage="75" inactiveColor="#EEEEEE"
- 						:activeColor="'linear-gradient(270deg, #FEA834 0%, #FFD364 100%)'" height="38rpx">
- 						<text class="u-percentage-slot pr-19 fs-23">200</text>
- 					</u-line-progress>
- 				</view>
- 				<view class="flex a-center mb-38">
- 					<view class="w-130 color3">
- 						医疗
- 					</view>
- 					<u-line-progress :percentage="55" inactiveColor="#EEEEEE"
- 						:activeColor="'linear-gradient(270deg, #02BAC0 0%, #05DEE1 100%)'" height="38rpx">
- 						<text class="u-percentage-slot pr-19 fs-23">174</text>
- 					</u-line-progress>
- 				</view>
- 				<view class="flex a-center mb-38">
- 					<view class="w-130 color3">
- 						住房
- 					</view>
- 					<u-line-progress :percentage="35" inactiveColor="#EEEEEE"
- 						:activeColor="'linear-gradient(270deg, #4791FF 0%, #7DC4FF 100%)'" height="38rpx">
- 						<text class="u-percentage-slot pr-19 fs-23">132</text>
- 					</u-line-progress>
- 				</view>
- 				<view class="flex a-center mb-38">
- 					<view class="w-130 color3">
- 						养老
- 					</view>
- 					<u-line-progress :percentage="15" inactiveColor="#EEEEEE"
- 						:activeColor="'linear-gradient(270deg, #4791FF 0%, #7DC4FF 100%)'" height="38rpx">
- 						<text class="u-percentage-slot pr-19 fs-23">89</text>
- 					</u-line-progress>
- 				</view>
- 			</view>
- 		</view>
- 		<view class="fs-35 font-bold mt-38 ml-27">
- 			评价占比
- 		</view>
- 		<view class="ml-29 mr-29 mt-27 shadow1 border2 br-15" style="height: 417rpx;">
- 			<view class="flex pl-38 pr-38">
- 				<view ref="rateChartRef" id="rateChart" style="width: 288rpx; height: 417rpx;"></view>
- 				<view style="width: 46rpx;"></view>
- 				<view class="flex1 pt-54">
- 					<view class="mb-27">
- 						<view class="flex a-center j-between mb-13">
- 							<text class="fs-23">非常满意</text>
- 							<text class="fs-23 color12">45%</text>
- 						</view>
- 						<view class="progress-bar">
- 							<view class="progress-inner very-satisfied" style="width: 45%;"></view>
- 						</view>
- 					</view>
- 					<view class="mb-27">
- 						<view class="flex a-center j-between mb-13">
- 							<text class="fs-23">满意</text>
- 							<text class="fs-23 color12">20%</text>
- 						</view>
- 						<view class="progress-bar">
- 							<view class="progress-inner satisfied" style="width: 20%;"></view>
- 						</view>
- 					</view>
- 					<view class="mb-27">
- 						<view class="flex a-center j-between mb-13">
- 							<text class="fs-23">一般</text>
- 							<text class="fs-23 color12">30%</text>
- 						</view>
- 						<view class="progress-bar">
- 							<view class="progress-inner normal" style="width: 30%;"></view>
- 						</view>
- 					</view>
- 					<view class="mb-27">
- 						<view class="flex a-center j-between mb-13">
- 							<text class="fs-23">不满意</text>
- 							<text class="fs-23 color12">5%</text>
- 						</view>
- 						<view class="progress-bar">
- 							<view class="progress-inner unsatisfied" style="width: 5%;"></view>
- 						</view>
- 					</view>
- 				</view>
- 			</view>
- 		</view>
- 		<view class="h-40 safe-b"></view>
- 		<!-- 选择服务社区 -->
- 		<u-popup :show="selectPopup" round="16rpx" @close="selectPopup = false" :safe-area-inset-bottom="false"
- 			@open="openSelectPopup">
- 			<view class="relative pb-40">
- 				<image @tap.stop="selectPopup = false" src="@/static/closeImg.png" class="w-35 h-35 absolute"
- 					style="right: 31rpx;top: 46rpx;" />
- 				<view class="txt-center pt-38 pb-40 fs-35 lh-48 font-bold">请选择服务社区</view>
- 				<view class="flex a-center j-between txt-center py-10 fs-27 font-bold bgColor1">
- 					<view class="flex1">区县</view>
- 					<view class="flex1">街道</view>
- 					<view class="flex1">社区</view>
- 				</view>
- 				<view class="mb-20">
- 					<picker-view :value="value" @change="bindChange" class="picker-view" immediate-change>
- 						<picker-view-column>
- 							<view class="item" v-for="(item, index) in county" :key="index">
- 								{{ item.name }}
- 							</view>
- 						</picker-view-column>
- 						<picker-view-column>
- 							<view class="item" v-for="(item, index) in street" :key="index">
- 								{{ item.name }}
- 							</view>
- 						</picker-view-column>
- 						<picker-view-column>
- 							<view class="item" v-for="(item, index) in community" :key="index">
- 								{{ item.name }}
- 							</view>
- 						</picker-view-column>
- 					</picker-view>
- 				</view>
- 				<view class="submitBtn" @click="chooseCommunity">确认</view>
- 			</view>
- 		</u-popup>
- 	</view>
- </template>
- 
- <script>
- 	import * as echarts from 'echarts';
- 	import {
- 		getRegionTree
- 	} from './service.js'
- 	export default {
- 		data() {
- 			return {
-				userInfo: {},
- 				address: '',
- 				value: [0, 0, 0],
- 				confirmValue: [0, 0, 0],
- 				county: [], //区县
- 				street: [], //街道
- 				community: [], //社区
- 				value1: 0,
- 				selectPopup: false,
- 				range: [{
- 						value: 0,
- 						text: "排名前五"
- 					},
- 					{
- 						value: 1,
- 						text: "排名前十"
- 					},
- 					{
- 						value: 2,
- 						text: "所有排名"
- 					},
- 				],
- 				chart: null,
- 				rateChart: null,
- 				tabs: ['近7天', '近15天', '近30天'],
- 				currentTab: 0,
- 				chartData: {
- 					dates: [
- 						'2025\n04.17',
- 						'2025\n04.18',
- 						'2025\n04.19',
- 						'2025\n04.20',
- 						'2025\n04.21',
- 						'2025\n04.22',
- 						'2025\n04.23'
- 					],
- 					demands: [80, 170, 240, 70, 130, 90, 160],
- 					completed: [40, 130, 200, 30, 90, 50, 110]
- 				},
- 				rateData: [{
- 						value: 45,
- 						name: '非常满意',
- 						itemStyle: {
- 							color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
- 									offset: 0,
- 									color: '#FF8064'
- 								},
- 								{
- 									offset: 1,
- 									color: '#FF4934'
- 								}
- 							])
- 						}
- 					},
- 					{
- 						value: 20,
- 						name: '满意',
- 						itemStyle: {
- 							color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
- 									offset: 0,
- 									color: '#05DEE1'
- 								},
- 								{
- 									offset: 1,
- 									color: '#02BAC0'
- 								}
- 							])
- 						}
- 					},
- 					{
- 						value: 30,
- 						name: '一般',
- 						itemStyle: {
- 							color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
- 									offset: 0,
- 									color: '#7DC4FF'
- 								},
- 								{
- 									offset: 1,
- 									color: '#4791FF'
- 								}
- 							])
- 						}
- 					},
- 					{
- 						value: 5,
- 						name: '不满意',
- 						itemStyle: {
- 							color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [{
- 									offset: 0,
- 									color: '#FFD364'
- 								},
- 								{
- 									offset: 1,
- 									color: '#FEA834'
- 								}
- 							])
- 						}
- 					}
- 				]
- 			}
- 		},
- 		onLoad() {
-			this.userInfo = uni.getStorageSync('userInfo')
- 			getRegionTree().then(res => {
- 				this.county = res.data
- 			})
- 		},
- 		mounted() {
- 			this.$nextTick(() => {
- 				this.initChart()
- 				this.initRateChart()
- 			})
- 		},
- 		methods: {
-			clearAddress() {
-			    this.address = '';
-			    this.value = [0, 0, 0];
-			    this.confirmValue = [0, 0, 0];
-			    this.street = [];
-			    this.community = [];
-			},
- 			//选择服务社区
- 			chooseCommunity() {
- 				let districts = this.county[this.value[0]].name
- 				let street = this.street[this.value[1]].name
- 				let community = this.community[this.value[2]].name
- 
- 				this.address = `${districts}-${street}-${community}`;
- 
- 				this.confirmValue = this.value
- 				this.selectPopup = false
- 			},
- 			// 切换社区
- 			bindChange(e, index) {
- 				if (e.detail.value[0] != this.value[0]) {
- 					e.detail.value[1] = 0
- 					e.detail.value[2] = 0
- 				}
- 				if (e.detail.value[1] != this.value[1]) {
- 					e.detail.value[2] = 0
- 				}
- 				this.value = e.detail.value
- 				this.street = this.county[this.value[0]].children
- 				this.community = this.street[this.value[1]].children
- 			},
- 			openSelectPopup() {
- 				this.value = this.confirmValue
- 				this.street = this.county[this.value[0]].children
- 				this.community = this.street[this.value[1]].children
- 			},
- 			handleTabClick(index) {
- 				this.currentTab = index
- 				// 这里可以根据不同的 tab 加载不同时间段的数据
- 				// this.loadChartData(index)
- 			},
- 			initChart() {
- 				// 在 H5 端使用 document.getElementById
- 				// 在小程序端使用 this.$refs.chartRef
- 				const chartDom = document.getElementById('chart') || this.$refs.chartRef;
- 				this.chart = echarts.init(chartDom);
- 				this.updateChart();
- 			},
- 			updateChart() {
- 				const option = {
- 					color: ['#FF7B7B', '#FFB75B'],
- 					tooltip: {
- 						trigger: 'axis',
- 						axisPointer: {
- 							type: 'shadow'
- 						}
- 					},
- 					legend: {
- 						data: ['诉求单量', '诉求办结数'],
- 						bottom: '0',
- 						itemGap: uni.upx2px(60),
- 						selectedMode: true
- 					},
- 					grid: {
- 						left: '3%',
- 						right: '4%',
- 						bottom: '15%',
- 						top: '3%',
- 						containLabel: true
- 					},
- 					xAxis: {
- 						type: 'category',
- 						data: this.chartData.dates,
- 						axisLine: {
- 							lineStyle: {
- 								color: '#E5E5E5'
- 							}
- 						},
- 						axisTick: {
- 							show: false
- 						},
- 						axisLabel: {
- 							color: '#888888',
- 							fontSize: uni.upx2px(19),
- 							lineHeight: uni.upx2px(23),
- 							formatter: function(value) {
- 								return value.split('\\n').join('\n')
- 							}
- 						}
- 					},
- 					yAxis: {
- 						type: 'value',
- 						splitLine: {
- 							lineStyle: {
- 								type: 'dashed',
- 								color: '#fff'
- 							}
- 						},
- 						axisLine: {
- 							show: false
- 						},
- 						axisTick: {
- 							show: false
- 						}
- 					},
- 					series: [{
- 							name: '诉求单量',
- 							type: 'bar',
- 							barWidth: uni.upx2px(38),
- 							itemStyle: {
- 								borderRadius: [20, 20, 20, 20],
- 								color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [{
- 										offset: 0,
- 										color: '#FF807E'
- 									},
- 									{
- 										offset: 1,
- 										color: '#FF4948'
- 									}
- 								])
- 							},
- 							data: this.chartData.demands
- 						},
- 						{
- 							name: '诉求办结数',
- 							type: 'line',
- 							smooth: true,
- 							symbol: 'circle',
- 							symbolSize: 8,
- 							itemStyle: {
- 								color: '#FFB75B',
- 								borderWidth: 2,
- 								borderColor: '#fff',
- 								shadowColor: '#FB9A0E',
- 								shadowBlur: 8,
- 								shadowOffsetY: 4
- 							},
- 							lineStyle: {
- 								width: 2,
- 								curveness: 0.3
- 							},
- 							data: this.chartData.completed
- 						}
- 					]
- 				};
- 				this.chart && this.chart.setOption(option);
- 			},
- 			initRateChart() {
- 				const chartDom = document.getElementById('rateChart') || this.$refs.rateChartRef;
- 				this.rateChart = echarts.init(chartDom);
- 				this.updateRateChart();
- 			},
- 			updateRateChart() {
- 				const option = {
- 					tooltip: {
- 						trigger: 'item',
- 						confine: true,
- 						// formatter: '{b}: {c}%',
- 						backgroundColor: 'rgba(255, 255, 255, 0.9)',
- 						borderColor: '#FFE0E0',
- 						borderWidth: 1,
- 						textStyle: {
- 							color: '#666666',
- 							fontSize: 12
- 						},
- 						padding: [8, 12]
- 					},
- 					series: [{
- 						name: '评价占比',
- 						type: 'pie',
- 						radius: ['55%', '100%'],
- 						center: ['50%', '50%'],
- 						avoidLabelOverlap: false,
- 						label: {
- 							show: false
- 						},
- 						labelLine: {
- 							show: false
- 						},
- 						emphasis: {
- 							scale: false,
- 							scaleSize: 0
- 						},
- 						data: this.rateData
- 					}]
- 				};
- 				this.rateChart && this.rateChart.setOption(option);
- 			}
- 		}
- 	}
- </script>
- 
- <style scoped lang="scss">
- 	/deep/.uni-select {
- 		width: 231rpx;
- 		height: 65rpx;
- 		margin: 0 auto;
- 		margin-bottom: 38rpx;
- 		font-size: 27rpx;
- 		color: #797F81;
- 		border-color: #E5E5E5;
- 		border-radius: 33rpx;
- 		padding: 0 31rpx 0 40rpx;
- 
- 		.uni-select__input-text {
- 			color: #797F81;
- 		}
- 	}
- 
- 	.content {
- 		background: linear-gradient(180deg, #FFDCDB 0%, rgba(255, 255, 255, 0) 100rpx, #fff 100%);
- 	}
- 
- 	.gap25 {
- 		gap: 25rpx;
- 	}
- 
- 	.tabs {
- 		width: 412rpx;
- 		background-color: #FFF1F1;
- 		border-radius: 30rpx;
- 		height: 65rpx;
- 		line-height: 65rpx;
- 		font-size: 27rpx;
- 		position: relative;
- 		overflow: hidden;
- 	}
- 
- 	.tab-item {
- 		color: #797F81;
- 		flex: 1;
- 		text-align: center;
- 		font-weight: 400;
- 		height: 54rpx;
- 		line-height: 54rpx;
- 		border-radius: 27rpx;
- 		margin: 6rpx;
- 		position: relative;
- 		z-index: 1;
- 		transform: translateZ(0);
- 		transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- 
- 		&.active {
- 			background-color: #fff;
- 			color: #FF4948;
- 			font-weight: 600;
- 			box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
- 			transform: scale(1.02);
- 		}
- 	}
- 
- 	.chart-wrapper {
- 		background: #fff;
- 		border-radius: 20rpx;
- 		padding: 20rpx;
- 	}
- 
- 	.color1 {
- 		color: #666565;
- 	}
- 
- 	.color2 {
- 		color: #C1C1C1;
- 	}
- 
- 	.color3 {
- 		color: #666666;
- 	}
- 
- 	.color4 {
- 		color: #FF4948;
- 	}
- 
- 	.color5 {
- 		color: #696969;
- 	}
- 
- 	.color6 {
- 		color: #A4A4A4;
- 	}
- 
- 	.color7 {
- 		color: #A7A7A7;
- 	}
- 
- 	.color8 {
- 		color: #0FB269;
- 	}
- 
- 	.color9 {
- 		color: #FF5600;
- 	}
- 
- 	.color10 {
- 		color: #161998;
- 	}
- 
- 	.color11 {
- 		color: #08AD60;
- 	}
- 
- 	.color12 {
- 		color: #9C9C9E;
- 	}
- 
- 	.bgColor1 {
- 		background-color: #fff;
- 	}
- 
- 	.bgColor2 {
- 		background-color: #FFF1F4;
- 	}
- 
- 	.bgColor3 {
- 		background-color: #FFF8F4;
- 	}
- 
- 	.bgColor4 {
- 		background-color: #F4F5FF;
- 	}
- 
- 	.bgColor5 {
- 		background-color: #F1FFF8;
- 	}
- 
- 	.border1 {
- 		border: 2rpx solid #D9D9D9;
- 	}
- 
- 	.border2 {
- 		border: 2rpx solid #FFE0E0;
- 	}
- 
- 	.border3 {
- 		border: 4rpx solid #FF4948;
- 		box-sizing: border-box;
- 		box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(255, 73, 72, 0.5);
- 	}
- 
- 	.border4 {
- 		border: 2rpx solid #FFFFFF;
- 	}
- 
- 	.shadow1 {
- 		box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
- 	}
- 
- 	.shadow2 {
- 		box-shadow: 0rpx 0rpx 15rpx 0rpx rgba(0, 0, 0, 0.1);
- 	}
- 
- 	.progress-bar {
- 		width: 100%;
- 		height: 8rpx;
- 		background: #EEEEEE;
- 		border-radius: 4rpx;
- 		overflow: hidden;
- 	}
- 
- 	.progress-inner {
- 		height: 100%;
- 		border-radius: 4rpx;
- 		transition: width 0.3s ease-in-out;
- 
- 		&.very-satisfied {
- 			background: linear-gradient(270deg, #FF8064 0%, #FF4934 100%);
- 		}
- 
- 		&.satisfied {
- 			background: linear-gradient(270deg, #05DEE1 0%, #02BAC0 100%);
- 		}
- 
- 		&.normal {
- 			background: linear-gradient(270deg, #7DC4FF 0%, #4791FF 100%);
- 		}
- 
- 		&.unsatisfied {
- 			background: linear-gradient(270deg, #FFD364 0%, #FEA834 100%);
- 		}
- 	}
- 
- 	.picker-view {
- 		height: 460rpx;
- 		font-size: 35rpx;
- 	}
- 
- 	/deep/.picker-view {
- 		margin: 0 auto;
- 
- 		.item {
- 			text-align: center;
- 			font-family: PingFangSC, PingFang SC;
- 			font-weight: 600;
- 			font-size: 36rpx;
- 			color: #333333;
- 			line-height: 50rpx;
- 		}
- 	}
- 
- 	.submitBtn {
- 		width: calc(100% - 62rpx);
- 		margin: 0 31rpx;
- 		line-height: 96rpx;
- 		text-align: center;
- 		background: linear-gradient(270deg, #FC8D55 0%, #FF4948 100%);
- 		border-radius: 48rpx;
- 		font-weight: 600;
- 		font-size: 35rpx;
- 		color: #fff;
- 	}
- </style>
\ No newline at end of file
+ 		</view> -->
+    <view
+      class="mt-27 shadow1 border2 ml-29 mr-29 pt-31 br-15"
+      style="height: 511rpx"
+    >
+      <view class="flex mlr-o tabs mb-40">
+        <view
+          v-for="(item, index) in tabs"
+          :key="index"
+          :class="['tab-item', currentTab === index ? 'active' : '']"
+          @click="handleTabClick(index)"
+        >
+          {{ item }}
+        </view>
+      </view>
+      <view
+        ref="chartRef"
+        id="chart"
+        style="width: 100%; height: 405rpx"
+      ></view>
+    </view>
+    <view class="fs-35 font-bold mt-38 ml-27"> 问题类型排名 </view>
+    <view class="ml-29 mr-29 mt-27 shadow1 pt-31 border2 pl-38 pr-38 br-15">
+      <uni-data-select v-model="value1" :localdata="range"></uni-data-select>
+      <view class="fs-23">
+        <view class="flex a-center mb-38" v-for="(item, idx) in typeRankList" :key="idx">
+          <view class="w-130 color3">{{ item.typeName }}</view>
+          <u-line-progress
+            :percentage="item.percent"
+            inactiveColor="#EEEEEE"
+            :activeColor="item.gradientColor"
+            height="38rpx"
+          >
+            <text class="u-percentage-slot pr-19 fs-23">{{ item.count }}</text>
+          </u-line-progress>
+        </view>
+      </view>
+    </view>
+    <view class="fs-35 font-bold mt-38 ml-27"> 评价占比 </view>
+    <view
+      class="ml-29 mr-29 mt-27 shadow1 border2 br-15"
+      style="height: 417rpx"
+    >
+      <view class="flex pl-38 pr-38">
+        <view
+          ref="rateChartRef"
+          id="rateChart"
+          style="width: 288rpx; height: 417rpx"
+        ></view>
+        <view style="width: 46rpx"></view>
+        <view class="flex1 pt-54">
+          <view class="mb-27">
+            <view class="flex a-center j-between mb-13">
+              <text class="fs-23">非常满意</text>
+              <text class="fs-23 color12">45%</text>
+            </view>
+            <view class="progress-bar">
+              <view
+                class="progress-inner very-satisfied"
+                style="width: 45%"
+              ></view>
+            </view>
+          </view>
+          <view class="mb-27">
+            <view class="flex a-center j-between mb-13">
+              <text class="fs-23">满意</text>
+              <text class="fs-23 color12">20%</text>
+            </view>
+            <view class="progress-bar">
+              <view class="progress-inner satisfied" style="width: 20%"></view>
+            </view>
+          </view>
+          <view class="mb-27">
+            <view class="flex a-center j-between mb-13">
+              <text class="fs-23">一般</text>
+              <text class="fs-23 color12">30%</text>
+            </view>
+            <view class="progress-bar">
+              <view class="progress-inner normal" style="width: 30%"></view>
+            </view>
+          </view>
+          <view class="mb-27">
+            <view class="flex a-center j-between mb-13">
+              <text class="fs-23">不满意</text>
+              <text class="fs-23 color12">5%</text>
+            </view>
+            <view class="progress-bar">
+              <view class="progress-inner unsatisfied" style="width: 5%"></view>
+            </view>
+          </view>
+        </view>
+      </view>
+    </view>
+    <view class="h-40 safe-b"></view>
+    <!-- 选择服务社区 -->
+    <u-popup
+      :show="selectPopup"
+      round="16rpx"
+      @close="selectPopup = false"
+      :safe-area-inset-bottom="false"
+      @open="openSelectPopup"
+    >
+      <view class="relative pb-40">
+        <image
+          @tap.stop="selectPopup = false"
+          src="@/static/closeImg.png"
+          class="w-35 h-35 absolute"
+          style="right: 31rpx; top: 46rpx"
+        />
+        <view class="txt-center pt-38 pb-40 fs-35 lh-48 font-bold"
+          >请选择服务社区</view
+        >
+        <view
+          class="flex a-center j-between txt-center py-10 fs-27 font-bold bgColor1"
+        >
+          <view v-if="hasTier(2)" class="flex1">区县</view>
+          <view v-if="hasTier(3)" class="flex1">街道</view>
+          <view v-if="hasTier(4)" class="flex1">社区</view>
+        </view>
+        <view class="mb-20">
+          <picker-view
+            :value="value"
+            @change="bindChange"
+            class="picker-view"
+            immediate-change
+          >
+            <picker-view-column v-if="hasTier(2)">
+              <view
+                class="item"
+                v-for="(item, index) in regionTree"
+                :key="index"
+              >
+                {{ item.name }}
+              </view>
+            </picker-view-column>
+            <picker-view-column v-if="hasTier(3)">
+              <view
+                class="item"
+                v-for="(item, index) in getStreets()"
+                :key="index"
+              >
+                {{ item.name }}
+              </view>
+            </picker-view-column>
+            <picker-view-column v-if="hasTier(4)">
+              <view
+                class="item"
+                v-for="(item, index) in getCommunities()"
+                :key="index"
+              >
+                {{ item.name }}
+              </view>
+            </picker-view-column>
+          </picker-view>
+        </view>
+        <view class="submitBtn" @click="chooseCommunity">确认</view>
+      </view>
+    </u-popup>
+  </view>
+</template>
+
+<script>
+import * as echarts from "echarts";
+import {
+  getRegionTree,
+  getStaticsPartOne,
+  getStaticsPartTwo,
+  getStaticsPartThree,
+} from "./service.js";
+export default {
+  data() {
+    return {
+      userInfo: {},
+      address: "",
+      value: [0, 0, 0],
+      confirmValue: [0, 0, 0],
+      regionTree: [], // 区域树数据
+      value1: 0,
+      selectPopup: false,
+      range: [
+        {
+          value: 0,
+          text: "排名前五",
+        },
+        {
+          value: 1,
+          text: "排名前十",
+        },
+        {
+          value: 2,
+          text: "所有排名",
+        },
+      ],
+      chart: null,
+      rateChart: null,
+      tabs: ["近7天", "近15天", "近30天"],
+      currentTab: 0,
+      chartData: {
+        dates: [
+          "2025\n04.17",
+          "2025\n04.18",
+          "2025\n04.19",
+          "2025\n04.20",
+          "2025\n04.21",
+          "2025\n04.22",
+          "2025\n04.23",
+        ],
+        demands: [80, 170, 240, 70, 130, 90, 160],
+        completed: [40, 130, 200, 30, 90, 50, 110],
+      },
+      rateData: [
+        {
+          value: 45,
+          name: "非常满意",
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
+              {
+                offset: 0,
+                color: "#FF8064",
+              },
+              {
+                offset: 1,
+                color: "#FF4934",
+              },
+            ]),
+          },
+        },
+        {
+          value: 20,
+          name: "满意",
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
+              {
+                offset: 0,
+                color: "#05DEE1",
+              },
+              {
+                offset: 1,
+                color: "#02BAC0",
+              },
+            ]),
+          },
+        },
+        {
+          value: 30,
+          name: "一般",
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
+              {
+                offset: 0,
+                color: "#7DC4FF",
+              },
+              {
+                offset: 1,
+                color: "#4791FF",
+              },
+            ]),
+          },
+        },
+        {
+          value: 5,
+          name: "不满意",
+          itemStyle: {
+            color: new echarts.graphic.LinearGradient(1, 0, 0, 0, [
+              {
+                offset: 0,
+                color: "#FFD364",
+              },
+              {
+                offset: 1,
+                color: "#FEA834",
+              },
+            ]),
+          },
+        },
+      ],
+      statisticsData: {
+        satisfaction: {
+          total: 0,
+          month: 0,
+          compare: 0,
+        },
+        demands: {
+          total: 0,
+          month: 0,
+          compare: 0,
+        },
+        processTime: {
+          total: 0,
+          month: 0,
+          compare: 0,
+        },
+        status: {
+          processing: 0,
+          reviewing: 0,
+          delayed: 0,
+          completed: 0,
+        },
+        overtime: {
+          total: 0,
+          month: 0,
+          compare: 0,
+        },
+        completionRate: {
+          total: 0,
+          month: 0,
+          compare: 0,
+        },
+      },
+      currentAreaId: '',
+      currentTier: -1,
+      typeRankList: [],
+    };
+  },
+  onLoad() {
+    this.userInfo = uni.getStorageSync("userInfo");
+    this.initRegionData();
+  },
+  mounted() {
+    this.$nextTick(() => {
+      this.initChart();
+      this.initRateChart();
+    });
+  },
+  methods: {
+    clearAddress() {
+      this.address = "";
+      this.value = [0, 0, 0];
+      this.confirmValue = [0, 0, 0];
+      this.currentAreaId = '';
+      this.currentTier = -1;
+      this.getStatisticsData("", -1);
+      this.getChartData(1);
+      this.getTypeRankData();
+    },
+    //初始化区域数据
+    initRegionData() {
+      getRegionTree().then((res) => {
+        if (res.code === 200) {
+          this.regionTree = [{name: '全部', id: 'all', tier: 2, children: []}, ...(res.data || [])];
+          this.value = [0, 0, 0];
+          this.confirmValue = [0, 0, 0];
+          this.address = "全部";
+          this.currentAreaId = '';
+          this.currentTier = -1;
+          this.getStatisticsData("", -1);
+          this.getChartData(1);
+          this.getTypeRankData();
+        }
+      });
+    },
+    // 获取当前选中的区域对象
+    getSelectedRegion() {
+      // 区县
+      const county = this.regionTree[this.value[0]];
+      if (!county || county.id === "all") return { id: "", tier: -1 };
+      // 有街道
+      const streets =
+        county.children && county.children.filter((c) => c && c.tier === 3);
+      if (streets && streets.length) {
+        const street = streets[this.value[1] - 1]; // -1 因为有"全部"选项
+        if (!street || this.value[1] === 0 || street.id === "all")
+          return { id: county.id, tier: county.tier };
+        const communities =
+          street.children && street.children.filter((c) => c && c.tier === 4);
+        if (communities && communities.length) {
+          const community = communities[this.value[2] - 1];
+          if (!community || this.value[2] === 0 || community.id === "all")
+            return { id: street.id, tier: street.tier };
+          return { id: community.id, tier: community.tier };
+        }
+        return { id: street.id, tier: street.tier };
+      }
+      // 区县下直接有社区
+      const communities =
+        county.children && county.children.filter((c) => c && c.tier === 4);
+      if (communities && communities.length) {
+        const community = communities[this.value[1] - 1];
+        if (!community || this.value[1] === 0 || community.id === "all")
+          return { id: county.id, tier: county.tier };
+        return { id: community.id, tier: community.tier };
+      }
+      // 只选了区县
+      return { id: county.id, tier: county.tier };
+    },
+    // 根据value设置地址显示
+    setAddressByValue() {
+      const names = [];
+      const county = this.regionTree[this.value[0]];
+      if (!county) {
+        this.address = "全部";
+        return;
+      }
+
+      // 如果选中区县的全部
+      if (county.id === "all") {
+        this.address = "全部";
+        return;
+      }
+
+      names.push(county.name);
+
+      // 检查是否有街道
+      const streets =
+        county.children && county.children.filter((c) => c && c.tier === 3);
+      if (streets && streets.length) {
+        const street = streets[this.value[1] - 1]; // -1 因为有"全部"选项
+        if (street && street.id !== "all") {
+          names.push(street.name);
+
+          // 检查街道下是否有社区
+          const communities =
+            street.children && street.children.filter((c) => c && c.tier === 4);
+          if (communities && communities.length) {
+            const community = communities[this.value[2] - 1];
+            if (community && community.id !== "all") {
+              names.push(community.name);
+            }
+          }
+        }
+      } else {
+        // 区县下直接有社区
+        const communities =
+          county.children && county.children.filter((c) => c && c.tier === 4);
+        if (communities && communities.length) {
+          const community = communities[this.value[1] - 1];
+          if (community && community.id !== "all") {
+            names.push(community.name);
+          }
+        }
+      }
+
+      this.address = names.join("-");
+    },
+    //选择服务社区
+    chooseCommunity() {
+      this.confirmValue = [...this.value];
+      this.setAddressByValue();
+      const { id, tier } = this.getSelectedRegion();
+      this.currentAreaId = id;
+      this.currentTier = tier;
+      this.selectPopup = false;
+      this.getStatisticsData(id, tier);
+      this.getChartData(this.currentTab + 1);
+      this.getTypeRankData();
+    },
+    // 切换社区
+    bindChange(e) {
+      const newValue = e.detail.value;
+      // 级联重置逻辑
+      if (newValue[0] !== this.value[0]) {
+        newValue[1] = 0;
+        newValue[2] = 0;
+      } else if (newValue[1] !== this.value[1]) {
+        newValue[2] = 0;
+      }
+      this.value = newValue;
+    },
+    openSelectPopup() {
+      this.value = this.confirmValue;
+    },
+    handleTabClick(index) {
+      this.currentTab = index;
+      this.getChartData(index + 1);
+    },
+    initChart() {
+      // 在 H5 端使用 document.getElementById
+      // 在小程序端使用 this.$refs.chartRef
+      const chartDom = document.getElementById("chart") || this.$refs.chartRef;
+      this.chart = echarts.init(chartDom);
+      this.updateChart();
+    },
+    updateChart() {
+      const option = {
+        color: ["#FF7B7B", "#FFB75B"],
+        tooltip: {
+          trigger: "axis",
+          axisPointer: {
+            type: "shadow",
+          },
+        },
+        legend: {
+          data: ["诉求单量", "诉求办结数"],
+          bottom: "0",
+          itemGap: uni.upx2px(60),
+          selectedMode: true,
+        },
+        grid: {
+          left: "3%",
+          right: "4%",
+          bottom: "15%",
+          top: "3%",
+          containLabel: true,
+        },
+        xAxis: {
+          type: "category",
+          data: this.chartData.dates,
+          axisLine: {
+            lineStyle: {
+              color: "#E5E5E5",
+            },
+          },
+          axisTick: {
+            show: false,
+          },
+          axisLabel: {
+            color: "#888888",
+            fontSize: uni.upx2px(19),
+            lineHeight: uni.upx2px(23),
+            formatter: function (value) {
+              return value.split("\\n").join("\n");
+            },
+          },
+        },
+        yAxis: {
+          type: "value",
+          splitLine: {
+            lineStyle: {
+              type: "dashed",
+              color: "#fff",
+            },
+          },
+          axisLine: {
+            show: false,
+          },
+          axisTick: {
+            show: false,
+          },
+        },
+        series: [
+          {
+            name: "诉求单量",
+            type: "bar",
+            barWidth: uni.upx2px(38),
+            itemStyle: {
+              borderRadius: [20, 20, 20, 20],
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                {
+                  offset: 0,
+                  color: "#FF807E",
+                },
+                {
+                  offset: 1,
+                  color: "#FF4948",
+                },
+              ]),
+            },
+            data: this.chartData.demands,
+          },
+          {
+            name: "诉求办结数",
+            type: "line",
+            smooth: true,
+            symbol: "circle",
+            symbolSize: 8,
+            itemStyle: {
+              color: "#FFB75B",
+              borderWidth: 2,
+              borderColor: "#fff",
+              shadowColor: "#FB9A0E",
+              shadowBlur: 8,
+              shadowOffsetY: 4,
+            },
+            lineStyle: {
+              width: 2,
+              curveness: 0.3,
+            },
+            data: this.chartData.completed,
+          },
+        ],
+      };
+      this.chart && this.chart.setOption(option);
+    },
+    initRateChart() {
+      const chartDom =
+        document.getElementById("rateChart") || this.$refs.rateChartRef;
+      this.rateChart = echarts.init(chartDom);
+      this.updateRateChart();
+    },
+    updateRateChart() {
+      const option = {
+        tooltip: {
+          trigger: "item",
+          confine: true,
+          // formatter: '{b}: {c}%',
+          backgroundColor: "rgba(255, 255, 255, 0.9)",
+          borderColor: "#FFE0E0",
+          borderWidth: 1,
+          textStyle: {
+            color: "#666666",
+            fontSize: 12,
+          },
+          padding: [8, 12],
+        },
+        series: [
+          {
+            name: "评价占比",
+            type: "pie",
+            radius: ["55%", "100%"],
+            center: ["50%", "50%"],
+            avoidLabelOverlap: false,
+            label: {
+              show: false,
+            },
+            labelLine: {
+              show: false,
+            },
+            emphasis: {
+              scale: false,
+              scaleSize: 0,
+            },
+            data: this.rateData,
+          },
+        ],
+      };
+      this.rateChart && this.rateChart.setOption(option);
+    },
+    // 添加获取统计数据的方法
+    async getStatisticsData(areaId = "", tier = -1) {
+      try {
+        const res = await getStaticsPartOne({
+          areaId,
+          tier,
+        });
+        if (res.code === 200) {
+          this.statisticsData = {
+            satisfaction: {
+              total: res.data.satisfactionRate ?? 0,
+              month: res.data.thisMonthSatisfactionRate ?? 0,
+              compare: res.data.lastMonthCompareSatisfactionRate ?? 0,
+            },
+            demands: {
+              total: res.data.allTotal ?? 0,
+              month: res.data.thisMonthTotal ?? 0,
+              compare: res.data.lastMonthCompareTotal ?? 0,
+            },
+            processTime: {
+              total: res.data.averageTime ?? 0,
+              month: res.data.thisMonthAverageTime ?? 0,
+              compare: res.data.lastMonthCompareAverageTime ?? 0,
+            },
+            status: {
+              processing: res.data.nowTransactTotal ?? 0,
+              reviewing: res.data.auditTransactTotal ?? 0,
+              delayed: res.data.postponeTransactTotal ?? 0,
+              completed: res.data.completeTransactTotal ?? 0,
+            },
+            overtime: {
+              total: res.data.overtimeTransactTotal ?? 0,
+              month: res.data.thisMonthOvertimeTransactTotal ?? 0,
+              compare: res.data.lastMonthOvertimeTransactCompareTotal ?? 0,
+            },
+            completionRate: {
+              total: 0,
+              month: 0,
+              compare: 0,
+            },
+          };
+          // 更新图表数据
+          this.updateChart();
+          this.updateRateChart();
+        }
+      } catch (error) {
+        console.error("获取统计数据失败:", error);
+      }
+    },
+    hasTier(tier) {
+      // tier=2: 区县始终有
+      if (tier === 2) return true;
+      // tier=3: 当前区县children里有tier=3
+      if (tier === 3) {
+        const county = this.regionTree[this.value[0]];
+        return (
+          county &&
+          Array.isArray(county.children) &&
+          county.children.some((c) => c && c.tier === 3)
+        );
+      }
+      // tier=4: 当前区县children里有tier=4,或街道children里有tier=4
+      if (tier === 4) {
+        const county = this.regionTree[this.value[0]];
+        if (!county || !Array.isArray(county.children)) return false;
+        // 区县下直接有社区
+        if (county.children.some((c) => c && c.tier === 4)) return true;
+        // 区县下有街道,街道下有社区
+        const street = county.children[this.value[1]];
+        return (
+          street &&
+          Array.isArray(street.children) &&
+          street.children.some((c) => c && c.tier === 4)
+        );
+      }
+      return false;
+    },
+    getStreets() {
+      const county = this.regionTree[this.value[0]];
+      if (!county || !Array.isArray(county.children)) return [];
+      // 只返回tier=3的
+      const streets = county.children.filter((c) => c && c.tier === 3);
+      return streets.length
+        ? [{ name: "全部", id: "all", tier: 3, children: [] }, ...streets]
+        : [];
+    },
+    getCommunities() {
+      const county = this.regionTree[this.value[0]];
+      if (!county || !Array.isArray(county.children)) return [];
+      // 区县下直接有社区
+      const communities = county.children.filter((c) => c && c.tier === 4);
+      if (communities.length)
+        return [{ name: "全部", id: "all", tier: 4 }, ...communities];
+      // 区县下有街道,街道下有社区
+      const street = county.children[this.value[1]];
+      if (street && Array.isArray(street.children)) {
+        const comms = street.children.filter((c) => c && c.tier === 4);
+        if (comms.length)
+          return [{ name: "全部", id: "all", tier: 4 }, ...comms];
+      }
+      return [];
+    },
+    async getChartData(timeType = 1) {
+      try {
+        const res = await getStaticsPartTwo({
+          areaId: this.currentAreaId,
+          tier: this.currentTier,
+          timeType
+        });
+        if (res.code === 200 && res.data) {
+          // 转换数据格式
+          const dates = res.data.map(item => item.time.replace(/-/g, '\n').replace(/\n(\d{2})$/, '.$1'));
+          const demands = res.data.map(item => item.allTotal);
+          const completed = res.data.map(item => item.completeTotal);
+          this.chartData = {
+            dates,
+            demands,
+            completed
+          };
+          this.updateChart();
+        }
+      } catch (e) {
+        console.error('获取图表数据失败', e);
+      }
+    },
+    async getTypeRankData() {
+      let rank;
+      if (this.value1 === 0) rank = 5;
+      else if (this.value1 === 1) rank = 10;
+      // value1 === 2 时不传rank
+      const params = {
+        areaId: this.currentAreaId,
+        tier: this.currentTier
+      };
+      if (rank) params.rank = rank;
+      try {
+        const res = await getStaticsPartThree(params);
+		console.log(JSON.stringify(res.data));
+		
+        if (res.code === 200 && Array.isArray(res.data)) {
+          // 计算最大值
+          const max = Math.max(...res.data.map(item => item.allTotal), 1);
+          // 处理数据,增加percent字段
+          this.typeRankList = res.data.map((item, idx) => ({
+            typeName: item.name,
+            count: item.allTotal,
+            percent: Math.round(item.allTotal / max * 100),
+            gradientColor: 'linear-gradient(270deg, #FF4934 0%, #FF8064 100%)'
+          }));
+        }
+      } catch (e) {
+        console.error('获取问题类型排名失败', e);
+      }
+    },
+  },
+  watch: {
+    value1() {
+      this.getTypeRankData();
+    }
+  },
+};
+</script>
+
+<style scoped lang="scss">
+/deep/.uni-select {
+  width: 231rpx;
+  height: 65rpx;
+  margin: 0 auto;
+  margin-bottom: 38rpx;
+  font-size: 27rpx;
+  color: #797f81;
+  border-color: #e5e5e5;
+  border-radius: 33rpx;
+  padding: 0 31rpx 0 40rpx;
+
+  .uni-select__input-text {
+    color: #797f81;
+  }
+}
+
+.content {
+  background: linear-gradient(
+    180deg,
+    #ffdcdb 0%,
+    rgba(255, 255, 255, 0) 100rpx,
+    #fff 100%
+  );
+}
+
+.gap25 {
+  gap: 25rpx;
+}
+
+.tabs {
+  width: 412rpx;
+  background-color: #fff1f1;
+  border-radius: 30rpx;
+  height: 65rpx;
+  line-height: 65rpx;
+  font-size: 27rpx;
+  position: relative;
+  overflow: hidden;
+}
+
+.tab-item {
+  color: #797f81;
+  flex: 1;
+  text-align: center;
+  font-weight: 400;
+  height: 54rpx;
+  line-height: 54rpx;
+  border-radius: 27rpx;
+  margin: 6rpx;
+  position: relative;
+  z-index: 1;
+  transform: translateZ(0);
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+
+  &.active {
+    background-color: #fff;
+    color: #ff4948;
+    font-weight: 600;
+    box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
+    transform: scale(1.02);
+  }
+}
+
+.chart-wrapper {
+  background: #fff;
+  border-radius: 20rpx;
+  padding: 20rpx;
+}
+
+.color1 {
+  color: #666565;
+}
+
+.color2 {
+  color: #c1c1c1;
+}
+
+.color3 {
+  color: #666666;
+}
+
+.color4 {
+  color: #ff4948;
+}
+
+.color5 {
+  color: #696969;
+}
+
+.color6 {
+  color: #a4a4a4;
+}
+
+.color7 {
+  color: #a7a7a7;
+}
+
+.color8 {
+  color: #0fb269;
+}
+
+.color9 {
+  color: #ff5600;
+}
+
+.color10 {
+  color: #161998;
+}
+
+.color11 {
+  color: #08ad60;
+}
+
+.color12 {
+  color: #9c9c9e;
+}
+
+.bgColor1 {
+  background-color: #fff;
+}
+
+.bgColor2 {
+  background-color: #fff1f4;
+}
+
+.bgColor3 {
+  background-color: #fff8f4;
+}
+
+.bgColor4 {
+  background-color: #f4f5ff;
+}
+
+.bgColor5 {
+  background-color: #f1fff8;
+}
+
+.border1 {
+  border: 2rpx solid #d9d9d9;
+}
+
+.border2 {
+  border: 2rpx solid #ffe0e0;
+}
+
+.border3 {
+  border: 4rpx solid #ff4948;
+  box-sizing: border-box;
+  box-shadow: 0rpx 4rpx 8rpx 0rpx rgba(255, 73, 72, 0.5);
+}
+
+.border4 {
+  border: 2rpx solid #ffffff;
+}
+
+.shadow1 {
+  box-shadow: 0rpx 0rpx 27rpx 0rpx rgba(0, 0, 0, 0.1);
+}
+
+.shadow2 {
+  box-shadow: 0rpx 0rpx 15rpx 0rpx rgba(0, 0, 0, 0.1);
+}
+
+.progress-bar {
+  width: 100%;
+  height: 8rpx;
+  background: #eeeeee;
+  border-radius: 4rpx;
+  overflow: hidden;
+}
+
+.progress-inner {
+  height: 100%;
+  border-radius: 4rpx;
+  transition: width 0.3s ease-in-out;
+
+  &.very-satisfied {
+    background: linear-gradient(270deg, #ff8064 0%, #ff4934 100%);
+  }
+
+  &.satisfied {
+    background: linear-gradient(270deg, #05dee1 0%, #02bac0 100%);
+  }
+
+  &.normal {
+    background: linear-gradient(270deg, #7dc4ff 0%, #4791ff 100%);
+  }
+
+  &.unsatisfied {
+    background: linear-gradient(270deg, #ffd364 0%, #fea834 100%);
+  }
+}
+
+.picker-view {
+  height: 460rpx;
+  font-size: 35rpx;
+}
+
+/deep/.picker-view {
+  margin: 0 auto;
+
+  .item {
+    text-align: center;
+    font-family: PingFangSC, PingFang SC;
+    font-weight: 600;
+    font-size: 36rpx;
+    color: #333333;
+    line-height: 50rpx;
+  }
+}
+
+.submitBtn {
+  width: calc(100% - 62rpx);
+  margin: 0 31rpx;
+  line-height: 96rpx;
+  text-align: center;
+  background: linear-gradient(270deg, #fc8d55 0%, #ff4948 100%);
+  border-radius: 48rpx;
+  font-weight: 600;
+  font-size: 35rpx;
+  color: #fff;
+}
+</style>

--
Gitblit v1.7.1