Merge branch 'feature-station-renpy'

This commit is contained in:
任珮宇 2023-09-21 18:39:34 +08:00
commit 71ee6027b2
6 changed files with 267 additions and 27 deletions

View File

@ -83,6 +83,6 @@ export default {
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.custom-chart { .custom-chart {
height: 100% !important; // height: 100% !important;
} }
</style> </style>

View File

@ -28,6 +28,14 @@ export default {
type: Array, type: Array,
required: true required: true
}, },
currList: {
type: Array,
required: true
},
orgList: {
type: Array,
required: true
},
markerType: { markerType: {
type: Number, type: Number,
default: 1 default: 1
@ -151,23 +159,32 @@ export default {
// //
initRipples() { initRipples() {
this.list this.currList
.filter( // .filter(
stationInfo => // stationInfo =>
stationInfo.stationType !== MarkerType.NuclearFacility && stationInfo.stationType !== MarkerType.NRL // stationInfo.stationType !== MarkerType.NuclearFacility && stationInfo.stationType !== MarkerType.NRL
) // )
.forEach(stationInfo => { .forEach(stationInfo => {
this.map.addOverlay(this.getRipple(stationInfo)) this.map.addOverlay(this.getRipple(stationInfo))
}) })
}, },
getRipple({ lon, lat, stationId, stationType }) { getRipple({ lon, lat, stationId, stationType, quality }) {
const rippleDiv = document.createElement('div') const rippleDiv = document.createElement('div')
rippleDiv.className = 'custom-ripple' rippleDiv.className = 'custom-ripple'
if (quality == "excellent") {
rippleDiv.innerHTML = ` <div class="inner-ripple-1"></div> rippleDiv.innerHTML = ` <div class="inner-ripple-excellent-1"></div>
<div class="inner-ripple-2"></div> <div class="inner-ripple-excellent-2"></div>
` `
} else if (quality == "good") {
rippleDiv.innerHTML = ` <div class="inner-ripple-good-1"></div>
<div class="inner-ripple-good-2"></div>
`
} else if(quality == "bad"){
rippleDiv.innerHTML = ` <div class="inner-ripple-bad-1"></div>
<div class="inner-ripple-bad-2"></div>
`
}
return new Overlay({ return new Overlay({
position: fromLonLat([lon, lat]), position: fromLonLat([lon, lat]),
@ -209,7 +226,10 @@ export default {
result.lon = decimalToDms(result.lon || result.longitude) result.lon = decimalToDms(result.lon || result.longitude)
result.lat = decimalToDms(result.lat || result.latitude, false) result.lat = decimalToDms(result.lat || result.latitude, false)
this.currStationInfo = result let params = this.currList.find(item => {
return item.stationId === result.stationId
}) || {}
this.currStationInfo = { ...result, ...params }
} else { } else {
this.$message.error(message) this.$message.error(message)
} }
@ -234,6 +254,20 @@ export default {
if (this.markerType == 2) { if (this.markerType == 2) {
this.initCircles() this.initCircles()
} }
},
currList: {
handler(newVal, oldVal) {
this.orgList.forEach(item => {
var layer = this.map.getOverlays().getArray().find(layer=> {
return layer.id === `ripple_${item.stationType}_${item.stationId}`;
});
if (layer) {
this.map.removeOverlay(layer);
}
})
this.initRipples()
},
deep:true
} }
} }
} }
@ -266,6 +300,7 @@ export default {
line-height: 30px; line-height: 30px;
border-bottom: 1px solid #0a544e; border-bottom: 1px solid #0a544e;
margin-bottom: 0; margin-bottom: 0;
color: rgb(187, 138, 18);
} }
} }
@ -301,7 +336,7 @@ export default {
@duration: 1.8s; @duration: 1.8s;
@delay: 0.9s; @delay: 0.9s;
.inner-ripple-1 { .inner-ripple-excellent-1 {
position: absolute; position: absolute;
top: 0; top: 0;
width: 100%; width: 100%;
@ -311,7 +346,7 @@ export default {
animation: rippleEffect @duration linear 0s infinite; animation: rippleEffect @duration linear 0s infinite;
} }
.inner-ripple-2 { .inner-ripple-excellent-2 {
position: absolute; position: absolute;
top: 0; top: 0;
width: 100%; width: 100%;
@ -321,6 +356,46 @@ export default {
background-image: radial-gradient(circle, transparent 10%, rgba(15, 148, 28, 0.2) 30%, rgba(15, 148, 28, 0.5) 60%); background-image: radial-gradient(circle, transparent 10%, rgba(15, 148, 28, 0.2) 30%, rgba(15, 148, 28, 0.5) 60%);
animation: rippleEffect @duration linear @delay infinite; animation: rippleEffect @duration linear @delay infinite;
} }
.inner-ripple-good-1 {
position: absolute;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background-image: radial-gradient(circle, transparent 10%, rgba(187, 138, 18, 0.2) 30%, rgba(187, 138, 18, 0.5) 60%);
animation: rippleEffect @duration linear 0s infinite;
}
.inner-ripple-good-2 {
position: absolute;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
transform: scale(0);
background-image: radial-gradient(circle, transparent 10%, rgba(187, 138, 18, 0.2) 30%, rgba(187, 138, 18, 0.5) 60%);
animation: rippleEffect @duration linear @delay infinite;
}
.inner-ripple-bad-1 {
position: absolute;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
background-image: radial-gradient(circle, transparent 10%, rgba(165, 58, 35, 0.2) 30%, rgba(165, 58, 35, 0.5) 60%);
animation: rippleEffect @duration linear 0s infinite;
}
.inner-ripple-bad-2 {
position: absolute;
top: 0;
width: 100%;
height: 100%;
border-radius: 50%;
transform: scale(0);
background-image: radial-gradient(circle, transparent 10%, rgba(165, 58, 35, 0.2) 30%, rgba(165, 58, 35, 0.5) 60%);
animation: rippleEffect @duration linear @delay infinite;
}
} }
@keyframes rippleEffect { @keyframes rippleEffect {

View File

@ -18,15 +18,15 @@
</div> </div>
<div> <div>
<img <img
v-if="active == 1" v-if="active == 1 && showPane"
src="@/assets/images/station-operation/station-operate-active.png" src="@/assets/images/station-operation/station-operate-active.png"
@click="showPane = !showPane" @click="handleHide"
/> />
<img v-else src="@/assets/images/station-operation/station-operate.png" @click="onPaneChange(1)" /> <img v-else src="@/assets/images/station-operation/station-operate.png" @click="onPaneChange(1)" />
</div> </div>
<div> <div>
<img <img
v-if="active == 2" v-if="active == 2 && showPane"
src="@/assets/images/station-operation/filter-station-active.png" src="@/assets/images/station-operation/filter-station-active.png"
@click="showPane = !showPane" @click="showPane = !showPane"
/> />
@ -233,9 +233,10 @@
<!-- 右侧图表展示栏 --> <!-- 右侧图表展示栏 -->
<div class="data-receive-status-chart" :class="{ 'on-screen': !leftPaneShow }"> <div class="data-receive-status-chart" :class="{ 'on-screen': !leftPaneShow }">
<template v-if="showChart"> <template v-if="showChart">
<RealTimeDataChart ref="realtimeChartRef" :list="statusList" :scale-settings="initialDataRecieveSettings" /> <RealTimeDataChart ref="realtimeChartRef" :spinning="spinLoading" :list="statusList" :scale-settings="initialDataRecieveSettings" />
<resize-observer @notify="handleResize" /> <resize-observer @notify="handleResize" />
</template> </template>
<div v-show="maskVisi" style="z-index: 1;position: absolute;top: 0;left: 0;width:100%;height: 100%;background: rgba(0, 0, 0, .45);"></div>
</div> </div>
<!-- 右侧图表展示栏结束 --> <!-- 右侧图表展示栏结束 -->
</div> </div>
@ -419,7 +420,9 @@ export default {
markerList: [], // marker markerList: [], // marker
showPane: true showPane: true,
spinLoading: false,
maskVisi: false
} }
}, },
created() { created() {
@ -468,6 +471,7 @@ export default {
// //
onPaneChange(active) { onPaneChange(active) {
this.showPane = true
this.active = active this.active = active
const source = this.circleLayer.getSource() const source = this.circleLayer.getSource()
source.clear() // source.clear() //
@ -483,6 +487,12 @@ export default {
} }
}, },
handleHide() {
this.showPane = !this.showPane
this.emitDrawCircle(1)
this.emitFilter()
},
// Filter Marker // Filter Marker
emitFilter() { emitFilter() {
const filterType = this.filterList.filter(item => item.checked).map(item => item.type) const filterType = this.filterList.filter(item => item.checked).map(item => item.type)
@ -719,6 +729,8 @@ export default {
// //
async getDataRecieveStatusList() { async getDataRecieveStatusList() {
this.maskVisi = true
this.spinLoading = true
try { try {
this.isGettingStatusList = true this.isGettingStatusList = true
const { success, result, message } = await getAction( const { success, result, message } = await getAction(
@ -727,6 +739,8 @@ export default {
userId: this.$store.getters.userInfo.id userId: this.$store.getters.userInfo.id
} }
) )
this.maskVisi = false
this.spinLoading = false
if (success) { if (success) {
const statusList = [] const statusList = []
result.forEach(item => { result.forEach(item => {
@ -745,6 +759,8 @@ export default {
this.$message.error(message) this.$message.error(message)
} }
} catch (error) { } catch (error) {
this.maskVisi = false
this.spinLoading = false
console.error(error) console.error(error)
} finally { } finally {
this.isGettingStatusList = false this.isGettingStatusList = false
@ -1157,8 +1173,7 @@ export default {
right: 15px; right: 15px;
width: calc(100% - 270px); width: calc(100% - 270px);
height: 100%; height: 100%;
overflow: auto; padding: 0 0 10px 15px;
padding: 0 15px 10px;
border: 1px solid @borderColor; border: 1px solid @borderColor;
transition: width 0.3s cubic-bezier(0.075, 0.82, 0.165, 1); transition: width 0.3s cubic-bezier(0.075, 0.82, 0.165, 1);

View File

@ -1,5 +1,5 @@
<template> <template>
<div> <div style="width: 100%;height: 100%;overflow: auto;padding-top: 76px;">
<!-- 图例 --> <!-- 图例 -->
<div class="legend"> <div class="legend">
<div <div
@ -15,6 +15,7 @@
</div> </div>
<!-- 图例结束 --> <!-- 图例结束 -->
<custom-chart ref="customChartRef" :option="option" :height="list.length * 295"></custom-chart> <custom-chart ref="customChartRef" :option="option" :height="list.length * 295"></custom-chart>
<a-spin style="z-index: 11;position: absolute;top: 45%;left: 48%;" :spinning="spinning" />
</div> </div>
</template> </template>
@ -79,6 +80,9 @@ export default {
title: { title: {
type: String type: String
}, },
spinning: {
type: Boolean
},
list: { list: {
type: Array, type: Array,
default: () => [] default: () => []
@ -295,9 +299,16 @@ export default {
<style lang="less" scoped> <style lang="less" scoped>
.legend { .legend {
margin: 32px 0; width: 100%;
padding: 25px 0;
display: flex; display: flex;
justify-content: center; justify-content: center;
position: absolute;
top: 0;
left: 50%;
transform: translateX(-50%);
background: #022024;
z-index: 11;
&-item { &-item {
color: #ade6ee; color: #ade6ee;

View File

@ -116,6 +116,24 @@ export default {
}, { }, {
label: 'TYPE', label: 'TYPE',
key: 'type' key: 'type'
}, {
label: 'USED',
key: 'used'
}, {
label: 'PHD',
key: 'phd'
}, {
label: 'PHDF',
key: 'phdf'
}, {
label: 'MET',
key: 'met'
}, {
label: 'SOH',
key: 'soh'
}, {
label: 'PHDF+MET+SOH',
key: 'phdMetSoh'
}], }],
[MarkerType.ImsRnStationG]: [{ [MarkerType.ImsRnStationG]: [{
label: 'COUNTRYCODE', label: 'COUNTRYCODE',
@ -153,6 +171,24 @@ export default {
}, { }, {
label: 'TYPE', label: 'TYPE',
key: 'type' key: 'type'
}, {
label: 'USED',
key: 'used'
}, {
label: 'PHD',
key: 'phd'
}, {
label: 'PHDF',
key: 'phdf'
}, {
label: 'MET',
key: 'met'
}, {
label: 'SOH',
key: 'soh'
}, {
label: 'PHDF+MET+SOH',
key: 'phdMetSoh'
}], }],
[MarkerType.NRL]: [{ [MarkerType.NRL]: [{
label: 'COUNTRYCODE', label: 'COUNTRYCODE',

View File

@ -144,7 +144,14 @@
ref="mapRef" ref="mapRef"
token="AAPK2b935e8bbf564ef581ca3c6fcaa5f2a71ZH84cPqqFvyz3KplFRHP8HyAwJJkh6cnpcQ-qkWh5aiyDQsGJbsXglGx0QM2cPm" token="AAPK2b935e8bbf564ef581ca3c6fcaa5f2a71ZH84cPqqFvyz3KplFRHP8HyAwJJkh6cnpcQ-qkWh5aiyDQsGJbsXglGx0QM2cPm"
> >
<MapMarker :list="markerList" :marker-type="markerType" :radius="circleRadius" @markerClick="onMarkerClick" /> <MapMarker
:list="markerList"
:currList="upDateStationList"
:orgList="orgStationList"
:marker-type="markerType"
:radius="circleRadius"
@markerClick="onMarkerClick"
/>
<MapPane <MapPane
ref="mapPane" ref="mapPane"
:treeData="treeData" :treeData="treeData"
@ -164,7 +171,7 @@ import DataListItem from './components/DataListItem.vue'
import ScrollContainer from '@/components/ScrollContainer/index.vue' import ScrollContainer from '@/components/ScrollContainer/index.vue'
import { getAction } from '../../api/manage' import { getAction } from '../../api/manage'
import { cloneDeep } from 'lodash' import { cloneDeep } from 'lodash'
const key= "updateList"
export default { export default {
components: { components: {
Map, Map,
@ -173,6 +180,19 @@ export default {
ScrollContainer, ScrollContainer,
DataListItem DataListItem
}, },
watch: {
"$route": {
handler:function(val,oldVal) {
if (val.name!=="station-operation") {
this.$message.destroy()
clearInterval(this.timer);
this.timer = null
}
},
deep:true,
immediate:true
}
},
data() { data() {
return { return {
activeKey: '1', activeKey: '1',
@ -183,6 +203,9 @@ export default {
dataList: [], // All Data dataList: [], // All Data
followedDataList: [], // followedDataList: [], //
markerList: [], // markerList: [], //
markerList_clone: [], //
upDateStationList: [], //
orgStationList: [], //
markerType: 1, // markerType: 1, //
circleRadius: 0, circleRadius: 0,
@ -201,7 +224,9 @@ export default {
stationTypeList: [], stationTypeList: [],
treeData: [] // treeData: [], //
timer: null,
updataFilterType: []
} }
}, },
created() { created() {
@ -210,6 +235,10 @@ export default {
this.getStationTypeList() this.getStationTypeList()
this.getStationTree() this.getStationTree()
}, },
beforeDestroy () {
clearInterval(this.timer);
this.timer = null
},
methods: { methods: {
// //
async getStationList() { async getStationList() {
@ -219,7 +248,13 @@ export default {
this.originalDataList = res // this.originalDataList = res //
this.dataList = cloneDeep(res) this.dataList = cloneDeep(res)
this.markerList = cloneDeep(res) this.markerList = cloneDeep(res)
this.markerList_clone = cloneDeep(res)
this.getDataProvisionEfficiency(this.markerList_clone,"one")
this.timer = setInterval(() => {
setTimeout(() => {
this.getDataProvisionEfficiency(this.markerList_clone)
}, 0);
}, 15000);
this.$nextTick(() => { this.$nextTick(() => {
this.$refs.scrollContainerRef.checkScrollEnd() this.$refs.scrollContainerRef.checkScrollEnd()
}) })
@ -230,6 +265,55 @@ export default {
} }
}, },
//
async getDataProvisionEfficiency(arr, str) {
if (str && this.$route.path=="/station-operation") {
this.$message.loading({ content: 'Loading station data, please wait...', key, duration: 0 })
}
getAction('/stationOperation/getDataProvisionEfficiency').then(res => {
if (res.success) {
this.$message.destroy()
if (str && this.$route.path == "/station-operation") {
this.$message.success({ content: 'Loaded!', key, duration: 2 })
}
res.result.forEach(item => {
arr.forEach(el => {
if (parseInt(item.id) == el.stationId&&el.stationType!="Nuclear Facility"&&el.stationType!="NRL") {
item.stationType = el.stationType
item.stationId = el.stationId
}
})
})
this.orgStationList = res.result
if (this.updataFilterType.length>0) {
this.upDateStationList = this.orgStationList.filter(item => this.updataFilterType.includes(item.stationType))
} else {
this.upDateStationList = res.result
}
if (this.markerList.length > 0) {
let curList = []
this.markerList.forEach(item => {
if (item.stationType!="Nuclear Facility" && item.stationType!="NRL") {
this.orgStationList.forEach(el => {
if (parseInt(el.id) == item.stationId) {
curList.push(el)
}
})
}
})
this.upDateStationList=curList
} else {
this.upDateStationList=[]
}
} else {
this.$message.warning("This operation fails. Contact your system administrator")
}
}).catch(error => {
this.$message.destroy()
console.error(error)
})
},
// //
async getFollowedStationList() { async getFollowedStationList() {
try { try {
@ -360,6 +444,23 @@ export default {
// marker // marker
onChangeMarker(markerList) { onChangeMarker(markerList) {
this.markerList = markerList this.markerList = markerList
let curList = []
if (markerList.length>0) {
markerList.forEach(item => {
if (item.stationType!="Nuclear Facility" && item.stationType!="NRL") {
this.orgStationList.forEach(el => {
if (parseInt(el.id) == item.stationId) {
el.stationType = item.stationType
el.stationId = item.stationId
curList.push(el)
}
})
}
})
this.upDateStationList=curList
} else {
this.upDateStationList=[]
}
}, },
// //
@ -372,6 +473,7 @@ export default {
* 根据类型筛选地图上的marker列表 * 根据类型筛选地图上的marker列表
*/ */
onFilterMarker({ filterType, filterDataQuality }) { onFilterMarker({ filterType, filterDataQuality }) {
this.updataFilterType = filterType
console.log( console.log(
'%c [ filterType, filterDataQuality ]-343', '%c [ filterType, filterDataQuality ]-343',
'font-size:13px; background:pink; color:#bf2c9f;', 'font-size:13px; background:pink; color:#bf2c9f;',
@ -379,6 +481,7 @@ export default {
filterDataQuality filterDataQuality
) )
this.markerList = this.originalDataList.filter(item => filterType.includes(item.stationType)) this.markerList = this.originalDataList.filter(item => filterType.includes(item.stationType))
this.upDateStationList = this.orgStationList.filter(item => filterType.includes(item.stationType))
}, },
// //