bonus-ui/src/views/screen/cityScreen/components/countryMap/index.vue

530 lines
17 KiB
Vue
Raw Normal View History

2025-10-29 16:56:49 +08:00
<template>
2025-10-29 17:19:25 +08:00
<div class="centerTopPage">
<div class="top-btns">
<div class="btn" :class="{ active: btnIndex == 1 }" @click="">装备总数</div>
2025-10-29 16:56:49 +08:00
</div>
2025-10-29 17:19:25 +08:00
<div class="store-equip"
>仓库装备<span class="cont">{{ warehouseEquipmentNum }}</span> </div
>
<div class="out-city-equip">{{ outCityEquipmentNum }}</div>
<div class="mapBox">
<div id="mapEcharts"></div>
2025-10-29 16:56:49 +08:00
</div>
</div>
</template>
<script>
import * as echarts from 'echarts'
import { mapDataApi } from '@/api/screen/cityScreen'
2025-10-29 17:19:25 +08:00
import anhui from '@/utils/mapJson/anhui.json'
import hefeiJson from '@/utils/mapJson/hefei.json'
import wuhuJson from '@/utils/mapJson/wuhu.json'
import bengbuJson from '@/utils/mapJson/bengbu.json'
import maanshanJson from '@/utils/mapJson/maanshan.json'
import huaibeiJson from '@/utils/mapJson/huaibei.json'
import huainanJson from '@/utils/mapJson/huainan.json'
import tonglingJson from '@/utils/mapJson/tongling.json'
import anqingJson from '@/utils/mapJson/anqing.json'
import huangshanJson from '@/utils/mapJson/huangshan.json'
import chuzhouJson from '@/utils/mapJson/chuzhou.json'
import fuyangJson from '@/utils/mapJson/fuyang.json'
import suzhouJson from '@/utils/mapJson/suzhou.json'
import liuanJson from '@/utils/mapJson/liuan.json'
import bozhouJson from '@/utils/mapJson/bozhou.json'
import chizhouJson from '@/utils/mapJson/chizhou.json'
import xuanchenJson from '@/utils/mapJson/xuanchen.json'
2025-10-29 16:56:49 +08:00
export default {
2025-10-29 17:19:25 +08:00
name: 'centerTopPage',
2025-10-29 16:56:49 +08:00
props: {
sendHeight: {
type: String,
default: '100%',
},
sendMapColor: {
type: String,
2025-10-29 17:19:25 +08:00
default: '#17A1F1',
2025-10-29 16:56:49 +08:00
},
sendGeo: {
type: Array,
default: null,
},
sendNumber: {
type: Number,
},
showLine: {
type: Boolean,
default: false,
},
sendProjSpin: {
type: Array | Object,
},
},
data() {
return {
2025-10-29 17:19:25 +08:00
type: 1,
zoom: 1,
zoom2: 1,
2025-10-29 16:56:49 +08:00
mapEcharts: null,
2025-10-29 17:19:25 +08:00
mapEcharts2: null,
2025-10-29 16:56:49 +08:00
mapJson: null,
2025-10-29 17:19:25 +08:00
pointArea: this.sendProjSpin,
pointAll: [],
companyList: [],
companyAreaList: [],
isCity: 0,
cityCount: [],
gozoom: 1,
2025-10-29 16:56:49 +08:00
geoVal: [],
cityName: '合肥',
btnIndex: 1,
2025-10-29 17:19:25 +08:00
warehouseEquipmentNum: null, // 仓库装备数
outCityEquipmentNum: null, // 市外装备数
2025-10-29 16:56:49 +08:00
}
},
2025-10-29 17:19:25 +08:00
created() {},
mounted() {
console.log('🚀 ~ mounted ~ .cityName:', this.$router.currentRoute.query.cityName)
2025-10-29 16:56:49 +08:00
this.cityName = this.$router.currentRoute.query.cityName || '合肥'
2025-10-29 17:19:25 +08:00
this.getCityJson()
2025-10-29 16:56:49 +08:00
},
methods: {
2025-10-29 17:19:25 +08:00
getCityJson() {
if (this.cityName.indexOf('合肥') > -1) {
this.mapJson = hefeiJson
} else if (this.cityName.indexOf('芜湖') > -1) {
this.mapJson = wuhuJson
} else if (this.cityName.indexOf('蚌埠') > -1) {
this.mapJson = bengbuJson
} else if (this.cityName.indexOf('淮南') > -1) {
this.mapJson = huainanJson
} else if (this.cityName.indexOf('马鞍山') > -1) {
this.mapJson = maanshanJson
} else if (this.cityName.indexOf('淮北') > -1) {
this.mapJson = huaibeiJson
} else if (this.cityName.indexOf('铜陵') > -1) {
this.mapJson = tonglingJson
} else if (this.cityName.indexOf('安庆') > -1) {
this.mapJson = anqingJson
} else if (this.cityName.indexOf('黄山') > -1) {
this.mapJson = huangshanJson
} else if (this.cityName.indexOf('滁州') > -1) {
this.mapJson = chuzhouJson
} else if (this.cityName.indexOf('阜阳') > -1) {
this.mapJson = fuyangJson
} else if (this.cityName.indexOf('宿州') > -1) {
this.mapJson = suzhouJson
} else if (this.cityName.indexOf('六安') > -1) {
this.mapJson = liuanJson
} else if (this.cityName.indexOf('亳州') > -1) {
this.mapJson = bozhouJson
} else if (this.cityName.indexOf('池州') > -1) {
this.mapJson = chizhouJson
} else if (this.cityName.indexOf('宣城') > -1) {
this.mapJson = xuanchenJson
} else if (this.cityName.indexOf('安徽送变电') > -1) {
this.mapJson = anhui
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
console.log(this.mapJson)
this.getMapData()
2025-10-29 16:56:49 +08:00
},
2025-10-29 17:19:25 +08:00
getMapData() {
// 获取地区中心坐标
var mapFeatures = this.mapJson.features.map((item) => {
let obj = {
name: item.properties.name,
value: item.properties.center,
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
return obj
})
console.log(mapFeatures)
let param = { companyId: sessionStorage.getItem('companyId'), city: this.cityName }
mapDataApi(param).then((response) => {
console.log(response, 'mapDataApi--> 大屏地图数据')
// response.data.proList.forEach(item=>{
// let obj = Object.assign({},item)
// obj.name = item.county;
// let index = mapFeatures.findIndex(v=>v.name==item.county)
// if(index>-1){
// obj.value = mapFeatures[index].value
// }
// this.geoVal.push(obj)
// })
this.warehouseEquipmentNum = response.data.warehouseEquipmentNum
this.outCityEquipmentNum = response.data.outCityEquipmentNum
if (response.data.proList.length > 0) {
this.geoVal = response.data.proList.map((item) => {
return {
...item,
value: [item.lon, item.lat],
}
})
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
this.getInitData()
})
2025-10-29 16:56:49 +08:00
},
2025-10-29 17:19:25 +08:00
getInitData() {
2025-10-29 16:56:49 +08:00
this.mapEcharts = echarts.init(document.getElementById('mapEcharts'))
2025-10-29 17:19:25 +08:00
echarts.registerMap('dishi', this.mapJson)
this.setMapOption()
2025-10-29 16:56:49 +08:00
},
2025-10-29 17:19:25 +08:00
setMapOption() {
2025-10-29 16:56:49 +08:00
this.mapEcharts.clear()
2025-10-29 17:19:25 +08:00
console.log(this.geoVal)
let that = this
let imgUrl = require('../../../../../assets/cityScreen/mapBg2.png')
let echartOption = {
2025-10-29 16:56:49 +08:00
geo: [
{
2025-10-29 17:19:25 +08:00
show: true,
map: 'dishi',
type: 'map',
aspectScale: 1,
2025-11-24 18:26:32 +08:00
zoom: 1,
2025-10-29 17:19:25 +08:00
roam: false, // 是否允许缩放
animationDurationUpdate: 0,
2025-11-24 18:26:32 +08:00
layoutSize: '60%',
2025-10-29 17:19:25 +08:00
layoutCenter: ['50%', '56%'],
2025-10-29 16:56:49 +08:00
itemStyle: {
2025-10-29 17:19:25 +08:00
normal: {
label: {
show: false,
},
areaColor: this.sendMapColor, //地图颜色
2025-11-24 18:26:32 +08:00
opacity: 0.5,
borderColor: '#7ef638', //地图边框颜色
2025-10-29 17:19:25 +08:00
borderWidth: 1, //地图边框宽度
shadowColor: 'none',
shadowBlur: 10,
color: '#fff',
// 设置扇形的阴影
2025-10-29 16:56:49 +08:00
},
2025-10-29 17:19:25 +08:00
emphasis: {
//选中省份的颜色
areaColor: '#061E3D',
label: {
show: true,
2025-10-29 16:56:49 +08:00
},
},
2025-10-29 17:19:25 +08:00
},
label: {
normal: {
show: false,
fontSize: 12,
fontWeight: 500,
color: 'rgba(255,255,255,0.5)',
},
emphasis: {
2025-10-29 16:56:49 +08:00
show: true,
2025-10-29 17:19:25 +08:00
areaColor: '#061E3D',
color: '#fff',
2025-10-29 16:56:49 +08:00
},
},
2025-10-29 17:19:25 +08:00
zlevel: 1,
regions: null,
tooltip: {
2025-10-29 16:56:49 +08:00
show: false,
},
2025-10-29 17:19:25 +08:00
},
{
map: 'dishi',
aspectScale: 1,
roam: false, // 是否允许缩放
animationDurationUpdate: 0,
2025-11-24 18:26:32 +08:00
zoom: 1,
layoutSize: '60%',
2025-10-29 17:19:25 +08:00
layoutCenter: ['50%', '58%'],
itemStyle: {
areaColor: '#5785AE',
borderColor: '#5785AE',
borderWidth: 1,
2025-11-24 18:26:32 +08:00
opacity: 0.5,
2025-10-29 17:19:25 +08:00
color: '#fff',
},
zlevel: -1,
silent: true,
2025-10-29 16:56:49 +08:00
tooltip: {
show: false,
},
},
],
2025-10-29 17:19:25 +08:00
visualMap: {
show: false,
top: 'top',
min: 0,
max: 2,
seriesIndex: 0,
calculable: true,
inRange: {
color: ['#998f74', '#04a4f6', '#00943e', '#dae07b', '#b62022'],
},
},
tooltip: {},
2025-10-29 16:56:49 +08:00
series: [
{
type: 'scatter',
coordinateSystem: 'geo',
zlevel: 10,
symbol: 'circle',
2025-10-29 17:19:25 +08:00
symbolSize: 15,
colorBy: null,
2025-10-29 16:56:49 +08:00
itemStyle: {
2025-10-29 17:19:25 +08:00
color: '#409EFF',
2025-10-29 16:56:49 +08:00
},
label: {
show: true,
position: 'top',
2025-10-29 17:19:25 +08:00
formatter: function (params) {
// 第一行装备数量,第二行工程名称
return `{equip|${params.data.useNum}}\n{proj|${params.data.projectName}}`
2025-10-29 16:56:49 +08:00
},
rich: {
equip: {
2025-10-29 17:19:25 +08:00
color: '#fff',
2025-10-29 16:56:49 +08:00
fontSize: 14,
fontWeight: 'bold',
2025-10-29 17:19:25 +08:00
align: 'center',
verticalAlign: 'middle',
backgroundColor: '#409EFF', // 蓝色背景
borderRadius: 10, // 圆角(如果宽高相等就是圆形)
padding: [2, 6], // 内边距控制大小
lineHeight: 20, // 高度
2025-10-29 16:56:49 +08:00
},
proj: {
2025-10-29 17:19:25 +08:00
color: '#fff',
fontSize: 12,
2025-10-29 16:56:49 +08:00
lineHeight: 16,
},
},
},
data: this.geoVal,
},
],
}
2025-10-29 17:19:25 +08:00
this.mapEcharts.setOption(echartOption)
this.mapEcharts.on('click', function (params) {
if (params.componentSubType === 'scatter') {
// console.log(params)
let option = that.mapEcharts.getOption() //获得option对象
// 点击变黄
option.series[0].data.forEach((item) => {
if (params.data.name !== item.name) {
if (item.isActive) {
item.isActive = false
}
} else {
item.isActive = true
}
})
that.mapEcharts.setOption(option)
that.$emit('closeMap', { value: params.data })
2025-10-29 16:56:49 +08:00
}
})
},
},
}
</script>
<style lang="scss" scoped>
2025-10-29 17:19:25 +08:00
.centerTopPage {
2025-10-29 16:56:49 +08:00
width: 100%;
2025-10-29 17:19:25 +08:00
//height: var(--send-height);
2025-10-29 16:56:49 +08:00
height: 100%;
2025-10-29 17:19:25 +08:00
// background:palegoldenrod;
margin-bottom: 2%;
padding: 0 10px;
2025-10-29 16:56:49 +08:00
position: relative;
2025-10-29 17:19:25 +08:00
box-sizing: border-box;
.iconMap {
display: block !important;
visibility: visible !important;
opacity: 1;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.buttonTop {
width: 100%;
display: flex;
justify-content: flex-start;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.buttom1 {
width: 110px;
height: 32px;
text-align: center;
line-height: 32px;
border-radius: 4px;
color: #55f3fb;
// background: url(../../assets/img/checked.png) no-repeat center;
background-size: 110px 32px;
margin-right: 12px;
2025-10-29 16:56:49 +08:00
cursor: pointer;
2025-10-29 17:19:25 +08:00
}
.buttom1.on {
color: #0095ff;
// background: url(../../assets/img/checked_on.png) no-repeat center;
background-size: 110px 32px;
}
.mapBox {
2025-11-20 14:42:38 +08:00
margin-top: -90px;
2025-10-29 17:19:25 +08:00
width: 100%;
height: 97%;
display: flex;
position: relative;
2025-11-20 14:42:38 +08:00
// 放大1.2倍
transform: scale(1.3);
2025-10-29 17:19:25 +08:00
#mapEcharts {
2025-11-24 18:26:32 +08:00
width: 90%;
height: 90%;
2025-10-29 17:19:25 +08:00
}
#mapEcharts2 {
width: 100%;
height: 100%;
}
z-index: 1000;
}
.label-box {
position: absolute;
bottom: 0px;
left: 40px;
// background: url('../../assets/img/home/labelBg.png') no-repeat;
background-size: 100% 100%;
padding: 10px 15px;
.item {
2025-10-29 16:56:49 +08:00
font-size: 14px;
2025-10-29 17:19:25 +08:00
line-height: 22px;
color: #fff;
position: relative;
padding-left: 15px;
font-size: 16px;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.item:before {
content: '';
width: 10px;
height: 10px;
background: #06bbf2;
2025-10-29 16:56:49 +08:00
position: absolute;
2025-10-29 17:19:25 +08:00
top: 6px;
left: 0px;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor1:before {
background: #06bbf2;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor2:before {
background: #2df0fe;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor3:before {
background: #10e0a5;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor4:before {
background: #dcef4e;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor5:before {
background: #f48413;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.itemColor6:before {
background: #fc5403;
2025-10-29 16:56:49 +08:00
}
}
}
2025-10-29 17:19:25 +08:00
</style>
2025-10-29 16:56:49 +08:00
2025-10-29 17:19:25 +08:00
<style lang="scss" scoped>
.top-btns {
margin-top: 60px;
display: flex;
justify-content: center;
/* position: absolute;
top: 10px; */
.btn:not(:last-child) {
margin-right: 80px;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.btn {
font-size: 15px;
text-align: center;
padding: 6px 15px;
font-family: DS-TITLE;
color: #ccc;
background-image: url('../../../wsScreen/img/btn.png');
background-size: 100% 100%;
cursor: pointer;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.active {
background-image: url('../../../wsScreen/img/btn-active.png');
background-size: 100% 100%;
2025-10-29 16:56:49 +08:00
}
}
2025-10-29 17:19:25 +08:00
.store-equip {
position: absolute;
top: 30px;
left: 50px;
width: 116px;
height: 75px;
color: #ccc;
font-size: 11px;
padding-top: 4px;
background: url('../../../../../assets/cityScreen/mapBg1.png');
background-size: 100% 100%;
text-align: center;
.cont {
color: #fff;
font-size: 16px;
2025-10-29 16:56:49 +08:00
}
}
2025-10-29 17:19:25 +08:00
.out-city-equip {
position: absolute;
top: 366px;
2025-11-20 14:42:38 +08:00
right: 55px;
2025-10-29 17:19:25 +08:00
width: 40px;
height: 52px;
color: #fff;
font-size: 16px;
background: url('../../../../../assets/cityScreen/position.png');
background-size: 100% 100%;
text-align: center;
display: flex;
align-items: center;
justify-content: center;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.scrollTooltip::-webkit-scrollbar {
width: 10px;
height: 10px;
2025-10-29 16:56:49 +08:00
}
2025-10-29 17:19:25 +08:00
.scrollTooltip::-webkit-scrollbar-thumb {
background-color: #1653a6;
border-radius: 10px;
-webkit-box-shadow: inset 1px 1px 0 #1653a6;
}
.itemColor {
position: relative;
padding-left: 15px;
line-height: 22px;
}
.itemColor:before {
content: '';
width: 10px;
height: 10px;
background: #06bbf2;
position: absolute;
top: 6px;
left: 0px;
}
.itemColor1:before {
background: #06bbf2;
}
.itemColor2:before {
background: #2df0fe;
}
.itemColor3:before {
background: #10e0a5;
}
.itemColor4:before {
background: #dcef4e;
}
.itemColor5:before {
background: #f48413;
}
.itemColor6:before {
background: #fc5403;
2025-10-29 16:56:49 +08:00
}
</style>