|
@@ -87,7 +87,13 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<VideoMonitor />
|
|
<VideoMonitor />
|
|
- <CloseCommand v-model="closeCommandState.show" :title="closeCommandState.title" :event-id="eventId" @update:model-value="fetchEventDetail" />
|
|
|
|
|
|
+ <CloseCommand
|
|
|
|
+ v-model="closeCommandState.show"
|
|
|
|
+ :title="closeCommandState.title"
|
|
|
|
+ :flag="flag"
|
|
|
|
+ :event-id="eventId"
|
|
|
|
+ @update:model-value="fetchEventDetail"
|
|
|
|
+ />
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<script lang="ts" setup name="LeftSection">
|
|
<script lang="ts" setup name="LeftSection">
|
|
@@ -95,18 +101,57 @@ import { getEventDetail, getWeather } from '@/api/duty/eventing';
|
|
import VideoMonitor from '@/views/emergencyCommandMap/LeftSection/VideoMonitor.vue';
|
|
import VideoMonitor from '@/views/emergencyCommandMap/LeftSection/VideoMonitor.vue';
|
|
import { ref, onMounted, onUnmounted, computed } from 'vue';
|
|
import { ref, onMounted, onUnmounted, computed } from 'vue';
|
|
import CloseCommand from './CloseCommand.vue';
|
|
import CloseCommand from './CloseCommand.vue';
|
|
|
|
+
|
|
const route = useRoute();
|
|
const route = useRoute();
|
|
const router = useRouter();
|
|
const router = useRouter();
|
|
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
-const { mm_event_type, mm_event_level, mm_event_state, region } = toRefs<any>(
|
|
|
|
- proxy?.useDict('mm_event_type', 'mm_event_level', 'mm_event_state', 'region')
|
|
|
|
-);
|
|
|
|
|
|
+
|
|
|
|
+const eventId = ref('');
|
|
|
|
+
|
|
|
|
+// 天气相关数据
|
|
const weatherDescription = ref('');
|
|
const weatherDescription = ref('');
|
|
const temperature = ref('');
|
|
const temperature = ref('');
|
|
const humidity = ref('');
|
|
const humidity = ref('');
|
|
const windDirection = ref('');
|
|
const windDirection = ref('');
|
|
const windLevel = ref('');
|
|
const windLevel = ref('');
|
|
const rainfall = ref('');
|
|
const rainfall = ref('');
|
|
|
|
+
|
|
|
|
+// 灾害事件数据
|
|
|
|
+const eventData = ref({
|
|
|
|
+ event_title: '',
|
|
|
|
+ event_type: '',
|
|
|
|
+ event_level: '',
|
|
|
|
+ address: '',
|
|
|
|
+ event_status: '',
|
|
|
|
+ event_source: '',
|
|
|
|
+ event_time: '',
|
|
|
|
+ report_time: ''
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+// 灾害信息卡片中的持续时间
|
|
|
|
+const duration = computed(() => {
|
|
|
|
+ if (isNaN(elapsedTime.value) || elapsedTime.value < 0) {
|
|
|
|
+ return { days: 0, hours: 0, minutes: 0, seconds: 0 };
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const totalSeconds = Math.floor(elapsedTime.value / 1000);
|
|
|
|
+ const days = Math.floor(totalSeconds / (24 * 3600));
|
|
|
|
+ const hours = Math.floor((totalSeconds % (24 * 3600)) / 3600);
|
|
|
|
+ const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
|
|
+ const seconds = totalSeconds % 60;
|
|
|
|
+
|
|
|
|
+ return { days, hours, minutes, seconds };
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const closeCommandState = reactive({
|
|
|
|
+ show: false,
|
|
|
|
+ title: '',
|
|
|
|
+ flag: false, // 默认为 false
|
|
|
|
+ eventId: ''
|
|
|
|
+});
|
|
|
|
+
|
|
|
|
+const elapsedTime = ref(0);
|
|
|
|
+let intervalId = null;
|
|
|
|
+
|
|
// 获取天气数据
|
|
// 获取天气数据
|
|
async function fetchWeatherData() {
|
|
async function fetchWeatherData() {
|
|
try {
|
|
try {
|
|
@@ -124,6 +169,7 @@ async function fetchWeatherData() {
|
|
console.error('Failed to fetch weather data:', error);
|
|
console.error('Failed to fetch weather data:', error);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+
|
|
// 根据风向角度获取风向名称
|
|
// 根据风向角度获取风向名称
|
|
function getWindDirection(angle) {
|
|
function getWindDirection(angle) {
|
|
const directions = [
|
|
const directions = [
|
|
@@ -151,112 +197,34 @@ function getWindDirection(angle) {
|
|
const index = Math.floor(((angle + 11.25) % 360) / 22.5);
|
|
const index = Math.floor(((angle + 11.25) % 360) / 22.5);
|
|
return directions[index];
|
|
return directions[index];
|
|
}
|
|
}
|
|
-let eventId = ref('');
|
|
|
|
-// 事件信息
|
|
|
|
-const eventData = ref({
|
|
|
|
- event_title: '',
|
|
|
|
- event_type: '',
|
|
|
|
- event_level: '',
|
|
|
|
- address: '',
|
|
|
|
- event_status: '',
|
|
|
|
- event_source: '',
|
|
|
|
- event_time: '',
|
|
|
|
- report_time: ''
|
|
|
|
-});
|
|
|
|
-const fetchEventDetail = () => {
|
|
|
|
|
|
+
|
|
|
|
+const fetchEventDetail = (id: string) => {
|
|
console.log('fetchEventDetail');
|
|
console.log('fetchEventDetail');
|
|
- if (eventId.value) {
|
|
|
|
- // 如果有eventId,则正常获取事件详情
|
|
|
|
- getEventDetail({ event_id: eventId.value }).then((res) => {
|
|
|
|
|
|
+ if (id && id !== eventData.value.event_id) {
|
|
|
|
+ // 如果有 id,则正常获取事件详情
|
|
|
|
+ getEventDetail({ event_id: id }).then((res) => {
|
|
eventData.value = res.data;
|
|
eventData.value = res.data;
|
|
// 初始化响应时间
|
|
// 初始化响应时间
|
|
updateTime();
|
|
updateTime();
|
|
});
|
|
});
|
|
- } else {
|
|
|
|
- // 如果没有eventId,则从URL中获取address,并设置到eventData.address
|
|
|
|
- eventData.value.address = route.query.address as string;
|
|
|
|
- // 设置一个默认的事件时间,即当前时间
|
|
|
|
- eventData.value.event_time = new Date().toISOString();
|
|
|
|
- updateTime();
|
|
|
|
}
|
|
}
|
|
};
|
|
};
|
|
-// 综合值守
|
|
|
|
-const comprehensiveDutyState = ref({
|
|
|
|
- time1: '',
|
|
|
|
- time2: '',
|
|
|
|
- classLeader: '',
|
|
|
|
- deputyShiftPerson: '',
|
|
|
|
- mainShiftPerson: '',
|
|
|
|
- backupPerson: ''
|
|
|
|
-});
|
|
|
|
-//结束指挥弹窗
|
|
|
|
-const closeCommandState = reactive({
|
|
|
|
- show: false,
|
|
|
|
- title: ''
|
|
|
|
-});
|
|
|
|
|
|
+
|
|
const closeCommand = () => {
|
|
const closeCommand = () => {
|
|
console.log('CloseCommand');
|
|
console.log('CloseCommand');
|
|
closeCommandState.title = '结束指挥';
|
|
closeCommandState.title = '结束指挥';
|
|
|
|
+ closeCommandState.eventId = eventId.value;
|
|
closeCommandState.show = true;
|
|
closeCommandState.show = true;
|
|
};
|
|
};
|
|
-// 分析研判
|
|
|
|
-const analyzeJudge = ref({});
|
|
|
|
-
|
|
|
|
-const initData = () => {
|
|
|
|
- // 事件信息
|
|
|
|
- eventData.value = {
|
|
|
|
- event_title: '',
|
|
|
|
- type: '',
|
|
|
|
- grade: '',
|
|
|
|
- address: '',
|
|
|
|
- status: '',
|
|
|
|
- unit: '',
|
|
|
|
- time: '',
|
|
|
|
- event_time: ''
|
|
|
|
- };
|
|
|
|
- // 分析研判
|
|
|
|
- analyzeJudge.value = [
|
|
|
|
- {
|
|
|
|
- label: '基础数据',
|
|
|
|
- children: [
|
|
|
|
- { icon: 'user', label: '人口', data: 200, unit: '万人' },
|
|
|
|
- { icon: 'user', label: '人口密度', data: 23, unit: '人/km²' }
|
|
|
|
- ]
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- label: '协同应急',
|
|
|
|
- children: [
|
|
|
|
- { icon: 'user', label: '专家', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '救援队伍', data: 10, unit: '支' },
|
|
|
|
- { icon: 'user', label: '通信机构', data: 10, unit: '所' },
|
|
|
|
- { icon: 'user', label: '医疗机构', data: 10, unit: '间' },
|
|
|
|
- { icon: 'user', label: '救援车辆', data: 10, unit: '辆' }
|
|
|
|
- ]
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- label: '重点场所',
|
|
|
|
- children: [
|
|
|
|
- { icon: 'user', label: '救助站', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '应急庇护场所', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '人防工程', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '水利工程', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '物资仓库', data: 10, unit: '个' }
|
|
|
|
- ]
|
|
|
|
- },
|
|
|
|
- {
|
|
|
|
- label: '重点防护场所',
|
|
|
|
- children: [
|
|
|
|
- { icon: 'user', label: '高危企业', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '加油站', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '学校', data: 10, unit: '个' },
|
|
|
|
- { icon: 'user', label: '养老院', data: 10, unit: '个' }
|
|
|
|
- ]
|
|
|
|
- }
|
|
|
|
- ];
|
|
|
|
-};
|
|
|
|
-const elapsedTime = ref(0);
|
|
|
|
-let intervalId = null;
|
|
|
|
-
|
|
|
|
|
|
+// 当关闭对话框时,不重置 eventId
|
|
|
|
+watch(closeCommandState.show, (newVal) => {
|
|
|
|
+ if (!newVal) {
|
|
|
|
+ // 对话框关闭时,保持 eventId 的状态
|
|
|
|
+ eventId.value = closeCommandState.eventId;
|
|
|
|
+ // 保持 eventData 的状态
|
|
|
|
+ fetchEventDetail(eventId.value);
|
|
|
|
+ }
|
|
|
|
+});
|
|
const updateTime = () => {
|
|
const updateTime = () => {
|
|
if (eventData.value.event_time && typeof eventData.value.event_time === 'string') {
|
|
if (eventData.value.event_time && typeof eventData.value.event_time === 'string') {
|
|
const eventTime = new Date(eventData.value.event_time);
|
|
const eventTime = new Date(eventData.value.event_time);
|
|
@@ -266,32 +234,22 @@ const updateTime = () => {
|
|
console.error('Invalid date format:', eventData.value.event_time);
|
|
console.error('Invalid date format:', eventData.value.event_time);
|
|
}
|
|
}
|
|
} else {
|
|
} else {
|
|
- // 如果没有event_time,则重置响应时间为0
|
|
|
|
|
|
+ // 如果没有 event_time,则重置响应时间为 0
|
|
elapsedTime.value = 0;
|
|
elapsedTime.value = 0;
|
|
}
|
|
}
|
|
};
|
|
};
|
|
|
|
|
|
-const duration = computed(() => {
|
|
|
|
- if (isNaN(elapsedTime.value) || elapsedTime.value < 0) {
|
|
|
|
- return { days: 0, hours: 0, minutes: 0, seconds: 0 };
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- const totalSeconds = Math.floor(elapsedTime.value / 1000);
|
|
|
|
- const days = Math.floor(totalSeconds / (24 * 3600));
|
|
|
|
- const hours = Math.floor((totalSeconds % (24 * 3600)) / 3600);
|
|
|
|
- const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
|
|
- const seconds = totalSeconds % 60;
|
|
|
|
-
|
|
|
|
- return { days, hours, minutes, seconds };
|
|
|
|
-});
|
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
- initData();
|
|
|
|
- // setInterval(updateDuration, 800);
|
|
|
|
- eventId.value = route.query.event_id as string;
|
|
|
|
- fetchEventDetail();
|
|
|
|
|
|
+ // 从 URL 参数中获取 tempEventId 或 event_id
|
|
|
|
+ const flag = !!route.query.event_id;
|
|
|
|
+ eventId.value = flag ? route.query.event_id : route.query.tempEventId;
|
|
|
|
+ closeCommandState.flag = flag; // 将 flag 赋值给 closeCommandState
|
|
|
|
+ fetchEventDetail(eventId.value);
|
|
|
|
+
|
|
fetchWeatherData();
|
|
fetchWeatherData();
|
|
intervalId = setInterval(updateTime, 1000);
|
|
intervalId = setInterval(updateTime, 1000);
|
|
});
|
|
});
|
|
|
|
+
|
|
onUnmounted(() => {
|
|
onUnmounted(() => {
|
|
if (intervalId) {
|
|
if (intervalId) {
|
|
clearInterval(intervalId);
|
|
clearInterval(intervalId);
|
|
@@ -369,7 +327,7 @@ onUnmounted(() => {
|
|
.rainfall {
|
|
.rainfall {
|
|
width: 135px;
|
|
width: 135px;
|
|
height: 109px;
|
|
height: 109px;
|
|
- background: url('@/assets/images/emergencyCommandMap/weather/humidity.png') no-repeat;
|
|
|
|
|
|
+ background: url('@/assets/images/emergencyCommandMap/weather/rainfall.png') no-repeat;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|