|
@@ -3,7 +3,7 @@ import { computed, ref, watch } from 'vue'
|
|
|
import { Layer, Operate, Setting } from '@/utils/tdInstruction'
|
|
|
import { Hide, View as Elview } from '@element-plus/icons-vue'
|
|
|
import { getStation } from '@/utils/station'
|
|
|
-import { useRoute } from 'vue-router'
|
|
|
+import { useRoute, useRouter } from 'vue-router'
|
|
|
import { useAppStore } from '@/stores/app'
|
|
|
import { useBasinStore } from '@/stores/basin'
|
|
|
import { useChatStore } from '@/stores/chat'
|
|
@@ -22,15 +22,19 @@ import { generateTimeList, parseTime } from '@/utils/date'
|
|
|
import { useTimeScrollbarStore } from '@/stores/timeScrollbar'
|
|
|
import { extractList } from '@/utils/list'
|
|
|
import { formatd } from '@/utils/ruoyi'
|
|
|
-import router from '@/router'
|
|
|
import { useLegendStore } from '@/stores/legend'
|
|
|
|
|
|
+const emit = defineEmits(['wavesLevelChange'])
|
|
|
+
|
|
|
const route = useRoute()
|
|
|
+const router = useRouter()
|
|
|
const appStore = useAppStore()
|
|
|
const legendStore = useLegendStore()
|
|
|
const basinStore = useBasinStore()
|
|
|
const chatStore = useChatStore()
|
|
|
const stationStore = useStationStore()
|
|
|
+const timeScrollbarStore = useTimeScrollbarStore()
|
|
|
+
|
|
|
const showBtnList = ref([
|
|
|
'home',
|
|
|
'view',
|
|
@@ -83,7 +87,6 @@ const dikeState = computed({
|
|
|
get: () => basinStore.labelState['堤防'],
|
|
|
set: () => basinStore.setLabelState('堤防'),
|
|
|
})
|
|
|
-
|
|
|
// 模拟模式
|
|
|
const simulationMode = ref('无')
|
|
|
const typhoonList = ref([
|
|
@@ -117,8 +120,13 @@ const waterLevelMarks = ref({
|
|
|
},
|
|
|
4.39: '4.39m',
|
|
|
})
|
|
|
-
|
|
|
-function formatWaterLevelTooltip(val: number) {
|
|
|
+const wavesValue = ref('无')
|
|
|
+const wavesList = ref([
|
|
|
+ { label: '风速', value: 'Windy' },
|
|
|
+ { label: '温湿度', value: 'Humiture' },
|
|
|
+ { label: '无', value: '无' },
|
|
|
+])
|
|
|
+const formatWaterLevelTooltip = (val: number) => {
|
|
|
switch (simulationMode.value) {
|
|
|
case '水位':
|
|
|
return (val.toFixed(2) + ' m') as string
|
|
@@ -129,6 +137,7 @@ function formatWaterLevelTooltip(val: number) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/** 回到主页 */
|
|
|
function handleHome() {
|
|
|
appStore.changeCurrentLevel('TaiHuMain')
|
|
|
// 切换太湖流域视角
|
|
@@ -231,58 +240,41 @@ async function handleSimulationModeChange(mode) {
|
|
|
handleWaterLevelChange()
|
|
|
}
|
|
|
|
|
|
-function handleWaterLevelChange() {
|
|
|
- switch (simulationMode.value) {
|
|
|
- case '水位':
|
|
|
- Operate.setWaterLevel(route.params.stcd, waterLevel.value)
|
|
|
- break
|
|
|
- case '雨量':
|
|
|
- changeWeatherByRainfall(waterLevel.value)
|
|
|
- break
|
|
|
- case '波高':
|
|
|
- Operate.setWaterLevel(route.params.stcd, null, waterLevel.value)
|
|
|
- break
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * 台风切换
|
|
|
- * @param type
|
|
|
- */
|
|
|
+/** 台风切换 */
|
|
|
function handleTyphoonChange(type: any) {
|
|
|
- Setting.clearAll()
|
|
|
- if (type === '实时台风') {
|
|
|
- currentTyphoonValue.value = type
|
|
|
- Operate.realTimeTyphoon()
|
|
|
- } else if (type === '无') {
|
|
|
+ if (type === '无') {
|
|
|
Operate.deleteTyphoonTrack(currentTyphoonValue.value)
|
|
|
Operate.realTimeTyphoon(false)
|
|
|
currentTyphoonValue.value = ''
|
|
|
+ } else if (type === '实时台风') {
|
|
|
+ Setting.clearAll('typhoon')
|
|
|
+ currentTyphoonValue.value = type
|
|
|
+ // 切换台风视角
|
|
|
+ appStore.changeCurrentView('Globe')
|
|
|
+ Operate.realTimeTyphoon()
|
|
|
} else {
|
|
|
+ Setting.clearAll('typhoon')
|
|
|
currentTyphoonValue.value = type
|
|
|
+ // 切换台风视角
|
|
|
+ appStore.changeCurrentView('Globe')
|
|
|
Operate.addTyphoonTrack(type)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-const wavesValue = ref('无')
|
|
|
-const wavesList = ref([
|
|
|
- { label: '风速', value: 'Windy' },
|
|
|
- { label: '温湿度', value: 'Humiture' },
|
|
|
- { label: '无', value: '无' },
|
|
|
-])
|
|
|
-
|
|
|
+/** 风速/温湿度 展示 */
|
|
|
function handleWavesChange(type: string) {
|
|
|
+ console.log('waves_type', type)
|
|
|
if (type === '无') {
|
|
|
- const timeScrollbarStore = useTimeScrollbarStore()
|
|
|
- timeScrollbarStore.close()
|
|
|
Layer.closeTaihuForecast()
|
|
|
wavesValue.value = '无'
|
|
|
} else {
|
|
|
+ Setting.clearAll('waves')
|
|
|
+ // 切换太湖流域视角
|
|
|
+ appStore.changeCurrentView()
|
|
|
wavesValue.value = type
|
|
|
const dateString = formatd(new Date(), 'yyyyMMdd') // TODO "20250519"
|
|
|
|
|
|
const timeList = generateTimeList(dateString + '01', 3, 1)
|
|
|
- const timeScrollbarStore = useTimeScrollbarStore()
|
|
|
timeScrollbarStore.setTimeScrollbarShow(true)
|
|
|
timeScrollbarStore.setMax(timeList.length)
|
|
|
const timeObj = extractList(timeList, 4)
|
|
@@ -312,17 +304,34 @@ function handleWavesChange(type: string) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-bus.on('set-water-level', value => (waterLevel.value = value))
|
|
|
+/** 雷达展示 */
|
|
|
watch(
|
|
|
- () => waterLevel,
|
|
|
- () => handleWaterLevelChange(),
|
|
|
- { deep: true },
|
|
|
+ () => radarState.value,
|
|
|
+ value => {
|
|
|
+ if (value === '无') {
|
|
|
+ Operate.deleteRadar()
|
|
|
+ legendStore.closeLegend()
|
|
|
+ } else {
|
|
|
+ Setting.clearAll('radar')
|
|
|
+ Operate.addRadar(value)
|
|
|
+ if (['降雨预报雷达图', '降雨实况雷达图'].includes(value)) {
|
|
|
+ legendStore.showLegend('雷达')
|
|
|
+ } else {
|
|
|
+ legendStore.closeLegend()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ },
|
|
|
)
|
|
|
|
|
|
+/** 水下地形展示 */
|
|
|
watch(
|
|
|
() => underwaterState.value,
|
|
|
value => {
|
|
|
- Setting.clearAll()
|
|
|
+ Setting.clearAll('underwater')
|
|
|
+ if (value) {
|
|
|
+ // 切换太湖流域视角
|
|
|
+ appStore.changeCurrentView()
|
|
|
+ }
|
|
|
Layer.underWater(value)
|
|
|
if (value) {
|
|
|
legendStore.showLegend('水下地形')
|
|
@@ -332,30 +341,62 @@ watch(
|
|
|
},
|
|
|
)
|
|
|
|
|
|
+/** 清空所有时,重置状态 */
|
|
|
+bus.on('clearAll', type => {
|
|
|
+ // 清空图层
|
|
|
+ if (type !== 'radar') {
|
|
|
+ radarState.value = '无'
|
|
|
+ }
|
|
|
+ if (type !== 'simulationMode') {
|
|
|
+ simulationMode.value = '无'
|
|
|
+ }
|
|
|
+ if (type !== 'waves') {
|
|
|
+ wavesValue.value = '无'
|
|
|
+ }
|
|
|
+ if (type !== 'underwater') {
|
|
|
+ underwaterState.value = false
|
|
|
+ }
|
|
|
+ if (type !== 'typhoon') {
|
|
|
+ typhoonValue.value = '无'
|
|
|
+ currentTyphoonValue.value = ''
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+/** 设置水位 */
|
|
|
+bus.on('set-water-level', value => (waterLevel.value = value))
|
|
|
watch(
|
|
|
- () => radarState.value,
|
|
|
- value => {
|
|
|
- Setting.clearAll()
|
|
|
- if (value === '无') {
|
|
|
- Operate.deleteRadar()
|
|
|
- legendStore.closeLegend()
|
|
|
- } else {
|
|
|
- Operate.addRadar(value)
|
|
|
- if (['降雨预报雷达图', '降雨实况雷达图'].includes(value)) {
|
|
|
- legendStore.showLegend('雷达')
|
|
|
- } else {
|
|
|
- legendStore.closeLegend()
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
+ () => waterLevel,
|
|
|
+ () => handleWaterLevelChange(),
|
|
|
+ { deep: true },
|
|
|
)
|
|
|
|
|
|
-function handleWaves() {
|
|
|
+function handleWaterLevelChange() {
|
|
|
+ switch (simulationMode.value) {
|
|
|
+ case '水位':
|
|
|
+ Operate.setWaterLevel(route.params.stcd, waterLevel.value)
|
|
|
+ break
|
|
|
+ case '雨量':
|
|
|
+ changeWeatherByRainfall(waterLevel.value)
|
|
|
+ break
|
|
|
+ case '波高':
|
|
|
+ Operate.setWaterLevel(route.params.stcd, null, waterLevel.value)
|
|
|
+ break
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * 切换风浪关卡
|
|
|
+ */
|
|
|
+function handleWavesLevelChange() {
|
|
|
if (appStore.currentLevel === 'TaiHuMain') {
|
|
|
appStore.changeCurrentLevel('Demo')
|
|
|
- router.push('/waves')
|
|
|
+ if (['/index', '/'].includes(route.path)) {
|
|
|
+ router.push('/waves')
|
|
|
+ } else {
|
|
|
+ emit('wavesLevelChange')
|
|
|
+ }
|
|
|
} else {
|
|
|
- stationStore.setStnm('')
|
|
|
+ stationStore.setStnm(null)
|
|
|
appStore.changeCurrentLevel('TaiHuMain')
|
|
|
router.push('/')
|
|
|
}
|
|
@@ -391,7 +432,11 @@ watch(
|
|
|
</script>
|
|
|
<template>
|
|
|
<div class="right-btn-container">
|
|
|
- <div v-show="hasLevel" class="right-big-btn" @click="handleWaves()">
|
|
|
+ <div
|
|
|
+ v-show="hasLevel"
|
|
|
+ class="right-big-btn"
|
|
|
+ @click="handleWavesLevelChange()"
|
|
|
+ >
|
|
|
<img
|
|
|
:src="backgroundSrc"
|
|
|
alt=""
|
|
@@ -411,6 +456,7 @@ watch(
|
|
|
<img :src="walkSrc" alt="视角" />
|
|
|
</div>
|
|
|
</template>
|
|
|
+ <h4>视角切换</h4>
|
|
|
<el-button-group>
|
|
|
<el-button @click="appStore.changeCurrentView('太湖流域')"
|
|
|
>太湖流域
|
|
@@ -426,6 +472,7 @@ watch(
|
|
|
<img :src="flagSrc" alt="标签" />
|
|
|
</div>
|
|
|
</template>
|
|
|
+ <h4>标签展示</h4>
|
|
|
水文站 <el-switch
|
|
|
v-model="hydrologicStationState"
|
|
|
:active-action-icon="Elview"
|
|
@@ -446,6 +493,7 @@ watch(
|
|
|
<img :src="weatherSrc" alt="天气" />
|
|
|
</div>
|
|
|
</template>
|
|
|
+ <h4>天气</h4>
|
|
|
<el-button-group>
|
|
|
<el-button
|
|
|
v-for="item in ['晴', '小雨', '中雨', '大雨']"
|
|
@@ -459,18 +507,15 @@ watch(
|
|
|
|
|
|
<el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
<template #reference>
|
|
|
- <div v-show="showBtnList.includes('typhoon')" class="right-btn-item">
|
|
|
+ <div v-show="showBtnList.includes('radar')" class="right-btn-item">
|
|
|
<img :src="backgroundSrc" alt="" />
|
|
|
- <icon :data="typhoon" />
|
|
|
+ <icon :data="radar" />
|
|
|
</div>
|
|
|
</template>
|
|
|
- <el-radio-group
|
|
|
- v-model="typhoonValue"
|
|
|
- size="large"
|
|
|
- @change="handleTyphoonChange"
|
|
|
- >
|
|
|
+ <h4>雷达</h4>
|
|
|
+ <el-radio-group v-model="radarState" size="large">
|
|
|
<el-radio-button
|
|
|
- v-for="item in typhoonList"
|
|
|
+ v-for="item in radarList"
|
|
|
:key="item.value"
|
|
|
:label="item.label"
|
|
|
:value="item.value"
|
|
@@ -480,18 +525,19 @@ watch(
|
|
|
|
|
|
<el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
<template #reference>
|
|
|
- <div v-show="showBtnList.includes('radar')" class="right-btn-item">
|
|
|
+ <div v-show="showBtnList.includes('waves')" class="right-btn-item">
|
|
|
<img :src="backgroundSrc" alt="" />
|
|
|
- <icon :data="radar" />
|
|
|
+ <icon :data="waves" />
|
|
|
</div>
|
|
|
</template>
|
|
|
+ <h4>风速/温湿度</h4>
|
|
|
<el-radio-group
|
|
|
- v-model="radarState"
|
|
|
+ v-model="wavesValue"
|
|
|
size="large"
|
|
|
@change="handleWavesChange"
|
|
|
>
|
|
|
<el-radio-button
|
|
|
- v-for="item in radarList"
|
|
|
+ v-for="item in wavesList"
|
|
|
:key="item.value"
|
|
|
:label="item.label"
|
|
|
:value="item.value"
|
|
@@ -501,32 +547,19 @@ watch(
|
|
|
|
|
|
<el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
<template #reference>
|
|
|
- <div v-show="showBtnList.includes('underwater')" class="right-btn-item">
|
|
|
- <img :src="backgroundSrc" alt="" />
|
|
|
- <icon :data="underwater" />
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- 水下地形 <el-switch
|
|
|
- v-model="underwaterState"
|
|
|
- :active-action-icon="Elview"
|
|
|
- :inactive-action-icon="Hide"
|
|
|
- />
|
|
|
- </el-popover>
|
|
|
-
|
|
|
- <el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
- <template #reference>
|
|
|
- <div v-show="showBtnList.includes('waves')" class="right-btn-item">
|
|
|
+ <div v-show="showBtnList.includes('typhoon')" class="right-btn-item">
|
|
|
<img :src="backgroundSrc" alt="" />
|
|
|
- <icon :data="waves" />
|
|
|
+ <icon :data="typhoon" />
|
|
|
</div>
|
|
|
</template>
|
|
|
+ <h4>台风</h4>
|
|
|
<el-radio-group
|
|
|
- v-model="wavesValue"
|
|
|
+ v-model="typhoonValue"
|
|
|
size="large"
|
|
|
- @change="handleWavesChange"
|
|
|
+ @change="handleTyphoonChange"
|
|
|
>
|
|
|
<el-radio-button
|
|
|
- v-for="item in wavesList"
|
|
|
+ v-for="item in typhoonList"
|
|
|
:key="item.value"
|
|
|
:label="item.label"
|
|
|
:value="item.value"
|
|
@@ -534,6 +567,20 @@ watch(
|
|
|
</el-radio-group>
|
|
|
</el-popover>
|
|
|
|
|
|
+ <el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
+ <template #reference>
|
|
|
+ <div v-show="showBtnList.includes('underwater')" class="right-btn-item">
|
|
|
+ <img :src="backgroundSrc" alt="" />
|
|
|
+ <icon :data="underwater" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ 水下地形 <el-switch
|
|
|
+ v-model="underwaterState"
|
|
|
+ :active-action-icon="Elview"
|
|
|
+ :inactive-action-icon="Hide"
|
|
|
+ />
|
|
|
+ </el-popover>
|
|
|
+
|
|
|
<el-popover placement="left-start" trigger="hover" width="auto">
|
|
|
<template #reference>
|
|
|
<div v-show="showBtnList.includes('simulation')" class="right-btn-item">
|