ylj20011123 2900c384eb update
2025-10-29 10:02:45 +08:00

409 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="service-area-overview">
<!-- 标题 -->
<view class="section-title">服务区概况</view>
<!-- 服务区类型统计 - 第一行 -->
<view class="metrics-row">
<view class="metric-card full-width">
<text class="metric-value" style="color: #56BCE6;">{{ serviceData.ServerpartTotalCount || 0 }}</text>
<text class="metric-label">管理站点/</text>
</view>
</view>
<!-- 服务区类型统计 - 第二行 -->
<view class="metrics-row">
<view class="metric-card">
<text class="metric-value" style="color: #56BCE6;">{{ serviceData.serviceAllTotal || 0 }}</text>
<text class="metric-label">服务区/</text>
</view>
<view class="metric-card">
<text class="metric-value" style="color: #ef5a0d;">{{ serviceData.ParkingServiceCount || 0 }}</text>
<text class="metric-label">停车区/</text>
</view>
<view class="metric-card">
<text class="metric-value" style="color: #1aba80;">{{ serviceData.WaterStationCount || 0 }}</text>
<text class="metric-label">加水站/</text>
</view>
</view>
<!-- 服务区类型统计 - 第三行 -->
<view class="metrics-row">
<view class="metric-card">
<text class="metric-value" style="color: #f41a09;">{{ serviceData.ViewingDeckCount || 0 }}</text>
<text class="metric-label">观景台/</text>
</view>
<view class="metric-card">
<text class="metric-value" style="color: #b5ebf7;">{{ serviceData.RestAreaCount || 0 }}</text>
<text class="metric-label">休息区/</text>
</view>
<view class="metric-card">
<text class="metric-value" style="color: #757575;">{{ serviceData.ClosedCount || 0 }}</text>
<text class="metric-label">关停/</text>
</view>
</view>
<!-- 设备设施分布图 -->
<view class="chart-section">
<view class="chart-title">设备设施</view>
<view class="chart-container">
<QiunDataCharts type="column" :opts="facilityChartOpts" :chartData="facilityChartData" :canvas2d="true"
:inScrollView="true" canvasId="facilityChart" tooltipFormat="facilityChartData" />
</view>
</view>
<!-- 服务承载状态 -->
<view class="load-section">
<view class="section-title">服务承载</view>
<view class="load-cards">
<view class="load-card busy">
<view class="load-icon">🔥</view>
<view class="load-content">
<text class="load-title">繁忙</text>
<view class="load-value">
<text class="load-number">{{ loadData.busy }}</text>
<text class="load-unit"></text>
</view>
</view>
</view>
<view class="load-card idle">
<view class="load-icon">😊</view>
<view class="load-content">
<text class="load-title">空闲</text>
<view class="load-value">
<text class="load-number">{{ loadData.idle }}</text>
<text class="load-unit"></text>
</view>
</view>
</view>
</view>
</view>
<!-- 服务区类型分布饼图 -->
<view class="chart-section">
<view class="chart-title">服务区类型分布</view>
<view class="chart-container">
<QiunDataCharts type="pie" :opts="areaTypePieOpts" :chartData="areaTypePieData" :canvas2d="true"
:inScrollView="true" canvasId="areaTypePieChart" tooltipFormat="areaTypePieData" />
</view>
</view>
</view>
</template>
<script>
import QiunDataCharts from './qiun-data-charts/components/qiun-data-charts/qiun-data-charts.vue'
import request from "@/util/index.js";
export default {
components: {
QiunDataCharts
},
data() {
return {
serviceData: {
ServerpartTotalCount: 0, // 管理站点
serviceAllTotal: 0, // 服务区
ParkingServiceCount: 0, // 停车区
WaterStationCount: 0, // 加水站
ViewingDeckCount: 0, // 观景台
RestAreaCount: 0, // 休息区
ClosedCount: 0, // 关停
REFUELINGGUNTotal: 0, // 加油站
ChargingStationTotal: 0, // 充电桩
HASPILOTLOUNGETotal: 0, // 司机之家
NursingRoomTotal: 0, // 母婴室
URECOUNTTotal: 0, // 尿素
WaterCount: 0 // 加水
},
loadData: {
busy: 0,
idle: 0
}
}
},
computed: {
// 设备设施数据
facilityChartData() {
return {
categories: ['加油站', '充电桩', '司机之家', '母婴室', '尿素', '加水'],
series: [{
name: '设施数量',
data: [
this.serviceData.REFUELINGGUNTotal,
this.serviceData.ChargingStationTotal,
this.serviceData.HASPILOTLOUNGETotal,
this.serviceData.NursingRoomTotal,
this.serviceData.URECOUNTTotal,
this.serviceData.WaterCount
]
}]
}
},
// 设备设施图表配置
facilityChartOpts() {
return {
color: ['#1890FF', '#52C41A', '#FAAD14', '#F5222D', '#722ED1', '#13C2C2'],
padding: [15, 15, 15, 15],
dataLabel: true,
legend: {
show: false
},
xAxis: {
itemCount: 6,
scrollShow: false
},
yAxis: {
gridType: 'dash',
dashLength: 2,
data: [{ min: 0 }]
},
extra: {
column: {
type: 'group',
width: 10,
barBorderCircle: true
}
}
}
},
// 服务区类型饼图数据
areaTypePieData() {
return {
series: [{
data: [
{ name: '服务区', value: this.serviceData.serviceAllTotal },
{ name: '停车区', value: this.serviceData.ParkingServiceCount },
{ name: '加水站', value: this.serviceData.WaterStationCount },
{ name: '观景台', value: this.serviceData.ViewingDeckCount },
{ name: '休息区', value: this.serviceData.RestAreaCount },
{ name: '关停', value: this.serviceData.ClosedCount }
].filter(item => item.value > 0)
}]
}
},
// 服务区类型饼图配置
areaTypePieOpts() {
return {
padding: [15, 15, 15, 15],
dataLabel: false,
legend: {
show: true,
position: 'right',
float: 'center',
padding: 5,
margin: 10
},
extra: {
pie: {
activeOpacity: 0.5,
activeRadius: 10,
labelWidth: 0,
border: true,
borderWidth: 0, // 设置边框宽度为0消除扇形间隔
borderColor: '#FFFFFF' // 边框颜色设为白色
}
}
}
}
},
onReady() {
this.handleGetData()
},
methods: {
// 获取服务区数据
handleGetData() {
// 获取服务区基础设施汇总数据
this.handleGetServerpartServiceSummary()
// 获取服务区繁忙度数据
this.handleGetCurBusyRank()
},
// 获取服务区基础设施汇总数据
async handleGetServerpartServiceSummary() {
const req = {
ProvinceCode: "530000",
type: "encryption"
}
const data = await request.$apiPost('CommercialApi/BaseInfo/GetServerpartServiceSummary', req)
if (data && data.Result_Data) {
const resultData = data.Result_Data
this.serviceData = {
ServerpartTotalCount: resultData.ServerpartTotalCount || 0,
serviceAllTotal: resultData.ServerpartCount || 0,
ParkingServiceCount: resultData.ParkingServiceCount || 0,
WaterStationCount: resultData.WaterStationCount || 0,
ViewingDeckCount: resultData.ViewingDeckCount || 0,
RestAreaCount: resultData.RestAreaCount || 0,
ClosedCount: resultData.ClosedCountCount || 0,
REFUELINGGUNTotal: resultData.GasStationCount || 0,
ChargingStationTotal: resultData.ChargeStationCount || 0,
HASPILOTLOUNGETotal: resultData.DriverRoomCount || 0,
NursingRoomTotal: resultData.NursingRoomCount || 0,
URECOUNTTotal: resultData.UreaCount || 0,
WaterCount: resultData.WaterCount || 0
}
}
},
// 获取服务区繁忙度数据
async handleGetCurBusyRank() {
const req = {
ProvinceCode: '530000',
ServerpartId: "",
DataType: '1',
type: "encryption"
}
const busyData = await request.$apiPost('CommercialApi/BigData/GetCurBusyRank', req)
if (busyData && busyData.Result_Data && busyData.Result_Data.OtherData) {
const otherData = busyData.Result_Data.OtherData
this.loadData = {
busy: otherData.value || 0,
idle: otherData.data || 0
}
}
},
async handleUpdatePie() {
this.handleGetData()
}
}
}
</script>
<style scoped lang="less">
.section-title {
font-size: 30rpx;
font-weight: 600;
color: #333;
margin-bottom: 12rpx;
}
.metrics-row {
display: flex;
gap: 24rpx;
margin-bottom: 24rpx;
}
.metric-card {
flex: 1;
background: #fff;
border-radius: 16rpx;
padding: 16rpx;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
text-align: center;
}
.metric-card.full-width {
width: 100%;
}
.metric-value {
font-size: 28rpx;
font-weight: 600;
display: block;
}
.metric-label {
font-size: 24rpx;
color: #666;
}
.chart-section {
background: #fff;
border-radius: 16rpx;
padding: 24rpx 24rpx 0;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
margin-bottom: 32rpx;
}
.chart-title {
font-size: 28rpx;
font-weight: 600;
color: #333;
margin-bottom: 12rpx;
}
.chart-container {
width: 100%;
height: 400rpx;
margin-bottom: 20rpx;
}
.load-section {
margin-bottom: 24rpx;
}
.load-cards {
display: flex;
gap: 24rpx;
}
.load-card {
flex: 1;
background: #fff;
border-radius: 16rpx;
padding: 16rpx 24rpx;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
display: flex;
align-items: center;
gap: 24rpx;
}
.load-card.busy {
background: linear-gradient(135deg, #F87D75, #FF4D4F);
}
.load-card.idle {
background: linear-gradient(135deg, #75F8EE, #13C2C2);
}
.load-icon {
font-size: 48rpx;
width: 80rpx;
height: 80rpx;
background: rgba(255, 255, 255, 0.2);
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
}
.load-content {
flex: 1;
}
.load-title {
font-size: 24rpx;
color: #fff;
font-weight: 500;
margin-bottom: 8rpx;
display: block;
}
.load-value {
display: flex;
align-items: baseline;
gap: 8rpx;
}
.load-number {
font-size: 28rpx;
font-weight: 600;
color: #fff;
}
.load-unit {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.8);
}
</style>