bonus-ui/src/views/home/components/provincial/Top2.vue

433 lines
16 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>
<div>
<div class="top-btns">
<div class="btn" :class="{ active: btnIndex == 1 }" @click="handleBtn(1)">总价值数</div>
<div class="btn" :class="{ active: btnIndex == 2 }" @click="handleBtn(2)">在库装备数</div>
<div class="btn" :class="{ active: btnIndex == 3 }" @click="handleBtn(3)">机械化率</div>
</div>
<div class="map-box">
<div class="echarts" id="mapChart"></div>
</div>
</div>
</template>
<script>
import { getUnitEquipmentConfigurationApi, getEquipmentNumberApi, getMechanizationRateApi } from '@/api/wsScreen'
import * as echarts from 'echarts'
import 'echarts-gl'
let mapImg = require('./Map/assets/img/anhui.png')
import labelBg from './Map/assets/img/value-bg.png'
let mapJson = require('./Map/ah.json')
export default {
data() {
return {
btnIndex: 1,
cityData: [],
}
},
created() {
this.getInfo()
},
methods: {
handleBtn(index) {
if (this.btnIndex == index) return
this.btnIndex = index
this.cityData = []
this.getInfo()
},
async getInfo() {
try {
let res = null
if (this.btnIndex == 1) {
res = await getUnitEquipmentConfigurationApi()
if (!res.data) return
res.data = res.data.filter((item) => item.location)
this.cityData = res.data.map((item) => {
let value = item.location.split(',')
value.push(item.totalValue)
// console.log('🚀 ~ getInfo ~ value:', value)
return {
...item,
value,
}
})
} else if (this.btnIndex == 2) {
res = await getEquipmentNumberApi()
if (!res.data) return
res.data = res.data.filter((item) => item.location)
this.cityData = res.data.map((item) => {
let value = item.location.split(',')
value.push(item.num)
// console.log('🚀 ~ getInfo ~ value:', value)
return {
...item,
value,
deptName: item.name,
}
})
} else if (this.btnIndex == 3) {
res = await getMechanizationRateApi()
}
this.$nextTick(() => {
console.log('🚀 ~ 地图数据 ~ this.cityData:', this.cityData)
this.initChart()
})
console.log('🚀 ~ 地图数据 ~ res:', res)
} catch (error) {
console.log('🚀 ~ 地图数据 ~ error:', error)
// this.initChart()
}
},
initChart(jsonData = mapJson) {
// 模拟数据
let arr = this.cityData.map((item) => {
return {
...item,
name: item.cityName,
}
})
echarts.registerMap('ah', jsonData)
const charEle = document.getElementById('mapChart')
const myChart = echarts.init(charEle)
// let tooltip = gzjhTooltip(arr)
const option = {
tooltip: {
show: true,
backgroundColor: 'rgba(0,0,0,0)',
borderWidth: 0,
padding: 0, // 👈 关键 1干掉外壳内边距
extraCssText: 'box-shadow:none;border-radius:0;', // 👈 关键 2干掉阴影 & 圆角
formatter: function (e) {
let n = e.name
let res = ''
arr.forEach((data) => {
// console.log('🚀 ~ 提示数据 ~ data:', data)
if (data.cityName === n) {
res =
"<div style='width: 260px;height: 285px; background: url(" +
require('./Map/assets/img/dialog.png') +
") no-repeat;background-size:100% 100%;'>" +
"<div style='width: 260px;height: 34px;display: flex;align-items: center;text-shadow:0px 3px 6px #001441; padding-left: 30px;font-family: DS-TITLE;color:#FFF;font-size:22px;padding-top: 10px;'>" +
data.deptAbbreviation +
'</div>' +
"<div style='margin-top:10px;margin-bottom:5px;width: 260px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>装备价值:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666; font-size: 18px'>" +
data.totalValue +
" <span style='color:#666;font-size:14px'> 万元</span>" +
'</div>' +
'</div>' +
"<div style='width: 260px;margin-top:10px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>装备数量:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666'; font-size: 18px>" +
data.totalEquipmentQuantity +
"<span style='color:#666;font-size:14px'> 台</span>" +
'</div>' +
'</div>' +
"<div style='width: 260px;margin-top:10px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>配置率:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666'; font-size: 18px>" +
data.configRate +
"<span style='color:#666;font-size:14px'> %</span>" +
'</div>' +
'</div>' +
"<div style='width: 260px;margin-top:10px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>线路数量:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666'; font-size: 18px>" +
data.lineNum +
"<span style='color:#666;font-size:14px'> 台</span>" +
'</div>' +
'</div>' +
"<div style='width: 260px;margin-top:10px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>变电数量:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666'; font-size: 18px>" +
data.substationNum +
"<span style='color:#666;font-size:14px'> 台</span>" +
'</div>' +
'</div>' +
"<div style='width: 260px;margin-top:10px;height: 25px;display: flex;align-items:center;font-family:Source Han Sans CN;font-size: 16px;color: #666;background: url(" +
") no-repeat;background-size:100%;margin-left:20px'>" +
'<div>电缆数量:' +
'</div>' +
"<div style='font-family: OPPOSans;margin-left: 10px;color: #666'; font-size: 18px>" +
data.cableNum +
"<span style='color:#666;font-size:14px'> 台</span>" +
'</div>' +
'</div>' +
'</div>'
}
})
return res
},
},
geo3D: {
map: 'ah',
zoom: 1,
roam: false,
label: { show: false },
itemStyle: {
opacity: 0, //.01 // important!
},
emphasis: {
disabled: true,
},
regionHeight: 0,
shading: 'lambert',
viewControl: {
zoomSensitivity: false,
rotateSensitivity: 0,
projection: 'orthographic',
autoRotate: false,
autoRotateAfterStill: 1,
orthographicSize: 100,
minAlpha: 20, // 上下旋转的最小 alpha 值。即视角能旋转到达最上面的角度。[ default: 5 ]
maxAlpha: 90, // 上下旋转的最大 alpha 值。即视角能旋转到达最下面的角度。[ default: 90 ]
minBeta: -360, // 左右旋转的最小 beta 值。即视角能旋转到达最左的角度。[ default: -80 ]
maxBeta: 360, // 左右旋转的最大 beta 值。即视角能旋转到达最右的角度。[ default: 80 ]
animation: false, // 是否开启动画。[ default: true ]
animationDurationUpdate: 1000, // 过渡动画的时长。[ default: 1000 ]
animationEasingUpdate: 'cubicInOut', // 过渡动画的缓动效果。[ default: cubicInOut ]
},
light: {
//光照阴影
main: {
color: '#02fce7', //光照颜色
intensity: 0.5, //光照强度
shadow: true, //是否显示阴影
shadowQuality: 'ultra', //阴影质量 ultra //阴影亮度
alpha: 30,
beta: 90,
},
ambient: {
color: '#fff',
intensity: 1,
},
},
zlevel: -8,
},
// 要显示的散点数据
series: [
{
left: 0,
top: 6,
bottom: 22,
type: 'map3D',
map: 'ah',
roam: false,
data: arr,
itemStyle: {
// color: "#4b6f52",
color: 'transparent',
borderWidth: 2,
borderColor: '#b8cad1',
opacity: 1,
},
emphasis: {
disabled: false, // 👈 一定要打开
label: {
show: false,
color: '#fff',
},
itemStyle: {
color: 'rgba(44, 186, 178, 0.45)', // 👈 青绿色半透明背景
borderColor: '#2cbab2', // 👈 高亮描边
borderWidth: 2,
},
},
regionHeight: 0,
shading: 'lambert',
viewControl: {
zoomSensitivity: false,
rotateSensitivity: 0,
projection: 'orthographic',
autoRotate: false,
autoRotateAfterStill: 1,
orthographicSize: 92,
animation: false, // 是否开启动画。[ default: true ]
animationDurationUpdate: 1000, // 过渡动画的时长。[ default: 1000 ]
animationEasingUpdate: 'cubicInOut', // 过渡动画的缓动效果。[ default: cubicInOut ]
},
label: {
show: true,
color: '#FFF',
position: 'top',
fontSize: 12,
fontWeight: '600',
},
light: {
//光照阴影
main: {
color: 'rgb(14,70,82)', //光照颜色
intensity: 0.1, //光照强度
shadow: true, //是否显示阴影
shadowQuality: 'ultra', //阴影质量 ultra //阴影亮度
alpha: 30,
beta: 90,
},
ambient: {
color: '#fff',
intensity: 1,
},
},
zlevel: 1,
zoom: 1,
scaleLimit: {
// 限制缩放的比例
min: 1, // 最小缩放比例
max: 1, // 最大缩放比例
},
},
{
type: 'scatter3D',
data: arr,
symbol: 'circle',
symbolSize: 11,
coordinateSystem: 'geo3D',
tooltip: { show: false },
label: {
show: false,
// position: 'top', // 先指定一个基准位置(如 'top'
// offset: [0, -10], // 向上偏移 10pxx 方向 0y 方向 -10
// triggerEvent: true,
// formatter: (params) => {
// // console.log('🚀 ~ initChart ~ params:', params)
// const val = params.data.value || []
// let unit = ''
// if (this.btnIndex === 1) unit = '万元'
// else if (this.btnIndex === 2) unit = '台'
// else if (this.btnIndex === 3) unit = '%'
// return val.length
// ? `{val|${val[2]} ${unit}}\n{name|${params.data.deptAbbreviation}}`
// : `{name|${params.data.deptAbbreviation}}`
// },
// rich: {
// val: {
// backgroundColor: { image: labelBg },
// height: 28,
// minWidth: 70,
// lineHeight: 28,
// padding: [0, 10],
// align: 'center',
// verticalAlign: 'middle',
// color: '#fff',
// fontSize: 23,
// },
// name: {
// color: '#fff',
// fontFamily: 'DS-TITLE',
// fontSize: 21,
// padding: [6, 0, 0, 0],
// },
// },
},
itemStyle: {
color: 'rgba(217, 94, 0, 1)',
},
zlevel: 1,
},
],
graphic: {
elements: [
{
type: 'image',
style: {
image: mapImg, // 图片的 URL
width: 456, // 图片宽度
height: 440, // 图片高度
// 位置根据实际需求调整
x: 0,
y: 0,
},
left: 'center',
top: 'center',
},
],
},
}
myChart.setOption(option)
// 监听地图绑定双击事件(双击进入地图下一级)
myChart.on('click', (params) => {
console.log('🚀 ~ 点击 ~ params-->:', params)
console.log('🚀 ~ initChart ~ params.data-->>:', params.data)
if (!params.data) return
this.$router.push({
path: '/equipment/manage/equipment-ledger',
query: {
parentId: params.data.parentId,
deptId: params.data.deptId,
},
})
if (params.seriesType === 'map3D' && params.data) {
let city =
params.data.deptName == '安徽送变电工程有限公司' ? '安徽送变电' : params.data.name.replace(/市$/, '')
console.log('🚀 ~ initChart ~ this.$router:', this.$router)
// this.$router.push({
// path: '/screen/cityScreen',
// query: {
// cityName: city,
// },
// })
// window.open(`${window.location.origin}/screen/cityScreen?cityName=${city}`, '_blank')
}
})
myChart.on('mouseover', (params) => {
// console.log('🚀 ~ 移入 ~ params:', params)
})
myChart.on('mouseout', () => {
// this.selectedCity = null
})
return myChart
},
},
}
</script>
<style lang="scss" scoped>
.top-btns {
display: flex;
align-items: center;
.btn {
margin-right: 24px;
height: 30px;
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: bold;
font-size: 16px;
cursor: pointer;
}
.active {
color: #2cbab2;
border-bottom: 2px solid #2cbab2;
}
}
.map-box {
width: 100%;
height: 440px;
display: flex;
align-items: center;
justify-content: center;
}
.echarts {
width: 100%;
height: 100%;
}
</style>