<template>
|
<div class="history-simulation">
|
<div class="left-top">
|
<span>预测模拟</span>
|
<span class="clickable-text" @click="toggleDetails">{{
|
isCollapsed ? "展开" : "收起"
|
}}</span>
|
</div>
|
<el-form
|
:class="{ hidden: isCollapsed }"
|
:model="forms"
|
class="details"
|
label-width="auto"
|
style="max-width: 600px"
|
>
|
<el-form-item label="预测数据:">
|
<el-select
|
v-model="forms.prediction"
|
placeholder="请选择"
|
popper-class="mySelectStyle"
|
>
|
<el-option
|
v-for="item in ForecastData"
|
:key="item.id"
|
:label="item.name"
|
:value="item.name"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="降雨数据:" v-show="forms.prediction == '降雨场次'">
|
<el-select
|
v-model="forms.showRainFall"
|
placeholder="请选择"
|
popper-class="mySelectStyle"
|
>
|
<el-option
|
v-for="item in rainFall"
|
:key="item.rainfallId"
|
:label="item.rainfallName"
|
:value="item.rainfallName"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="方案名称:">
|
<el-input
|
v-model="forms.schemeName"
|
type="text"
|
placeholder="请输入"
|
></el-input>
|
</el-form-item>
|
<el-form-item label="降雨雨量:">
|
<el-input v-model="forms.rainfall" type="number" placeholder="请输入">
|
<template #append>mm</template></el-input
|
>
|
</el-form-item>
|
<el-form-item label="降雨强度:">
|
<el-input
|
v-model="forms.rainfallIntensity"
|
type="number"
|
placeholder="请输入"
|
>
|
<template #append>mm/h</template></el-input
|
>
|
</el-form-item>
|
<el-form-item label="降雨模式:">
|
<el-select
|
v-model="forms.mode"
|
placeholder="请选择"
|
popper-class="mySelectStyle"
|
>
|
<el-option
|
v-for="item in RainfallPatterns"
|
:key="item.id"
|
:label="item.name"
|
:value="item.name"
|
></el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item label="选择时间:">
|
<el-date-picker
|
v-model="forms.hours"
|
type="datetimerange"
|
start-placeholder="开始时间"
|
end-placeholder="结束时间"
|
format="YYYY-MM-DD HH:mm:ss"
|
date-format="YYYY/MM/DD ddd"
|
time-format="A hh:mm:ss"
|
@change="change"
|
/>
|
</el-form-item>
|
<el-form-item label="预计时长:">
|
<el-input
|
disabled
|
v-model="forms.duration"
|
type="number"
|
placeholder="请输入"
|
><template #append>h</template></el-input
|
>
|
</el-form-item>
|
</el-form>
|
<div class="buttons">
|
<el-button type="primary" @click="openPlan">打开方案</el-button>
|
<el-button type="primary" @click="openSaveDialog">保存方案</el-button>
|
<el-button type="success" @click="startPlay">开始模拟</el-button>
|
</div>
|
</div>
|
</template>
|
<script setup>
|
import { ref, computed, inject, reactive, watch, onMounted } from "vue";
|
import { ElMessage } from "element-plus";
|
import { initeWaterPrimitiveView } from "@/utils/water";
|
import { useSimStore } from "@/store/simulation.js"; // 引入 Store
|
import { SimAPIStore } from "@/store/simAPI";
|
import { getRainfallData } from "@/api/hpApi";
|
|
onMounted(() => {
|
getRain();
|
});
|
|
// 获取 Store 实例
|
const simStore = SimAPIStore();
|
|
// 注入模拟操作方法
|
const { startSimulate, endSimulate } = inject("simulateActions");
|
|
function startPlay() {
|
console.log("开始模拟按钮被点击");
|
console.log("当前选中的区域:", props.selectedArea);
|
initeWaterPrimitiveView();
|
startSimulate();
|
}
|
|
// 定义 Props
|
const props = defineProps({
|
selectedArea: {
|
type: String,
|
required: true,
|
},
|
});
|
|
// 数据绑定
|
const isCollapsed = ref(false); // 控制展开/收起状态
|
const saveDialogVisible = ref(false); // 控制保存方案对话框的显示状态
|
|
// 预测数据选项
|
const ForecastData = [
|
{ id: "1", name: "降雨场次" },
|
{ id: "2", name: "气象数据" },
|
{ id: "3", name: "逐小时预报数据" },
|
{ id: "4", name: "自定义参数" },
|
];
|
|
// 降雨模式选项
|
const RainfallPatterns = [
|
{ id: "1", name: "正态分布" },
|
{ id: "2", name: "平均分布" },
|
{ id: "3", name: "波动平均分布" },
|
{ id: "4", name: "持续上升" },
|
];
|
|
const forms = reactive({
|
rainfall: 50,
|
schemeName: "",
|
rainfallIntensity: 70,
|
duration: null,
|
prediction: "降雨场次",
|
mode: "正态分布",
|
showRainFall: "",
|
hours: null,
|
});
|
|
// 降雨场次选择
|
const rainFall = ref({});
|
|
const getRain = () => {
|
getRainfallData().then((res) => {
|
rainFall.value = res.data.pageData;
|
console.log(res.data, "res");
|
});
|
};
|
|
// 切换详情显示
|
const toggleDetails = () => {
|
isCollapsed.value = !isCollapsed.value;
|
};
|
|
const { calculateHoursDifference } = inject("calculateHours");
|
|
const change = (val) => {
|
forms.duration = calculateHoursDifference(val);
|
};
|
|
// 打开保存方案对话框
|
const openSaveDialog = async () => {
|
const params = {
|
name: forms.schemeName,
|
geom: props.selectedArea,
|
type: 1,
|
rainfall: forms.rainfall,
|
duration: forms.duration,
|
intensity: forms.rainfallIntensity,
|
mode: forms.mode,
|
prediction: forms.prediction,
|
};
|
await simStore.addSimCheme(params);
|
};
|
|
// 打开方案
|
const openPlan = () => {
|
// getRain();
|
console.log("打开方案按钮被点击");
|
};
|
</script>
|
|
<style lang="less" scoped>
|
.history-simulation {
|
margin-bottom: 20px;
|
}
|
|
.details {
|
width: 100%;
|
height: 100%;
|
padding: 0px 10px 0px 0px;
|
box-sizing: border-box;
|
width: 100%;
|
height: 100%;
|
}
|
|
.hidden {
|
height: 0;
|
opacity: 0;
|
}
|
|
.buttons {
|
margin-top: 10px;
|
margin-right: 10px;
|
display: flex;
|
gap: 10px;
|
}
|
.el-button {
|
flex: 1;
|
}
|
.input-item {
|
display: flex;
|
align-items: center;
|
}
|
|
label {
|
text-align: left;
|
white-space: nowrap;
|
margin-right: 10px;
|
}
|
|
.el-input {
|
flex: 4;
|
}
|
|
span {
|
flex: 1;
|
text-align: left;
|
}
|
|
.el-select {
|
flex: 4;
|
text-align: left;
|
margin-bottom: 10px;
|
}
|
|
.clickable-text {
|
margin-left: 160px;
|
cursor: pointer;
|
font-size: 14px;
|
color: #61f7d4;
|
}
|
|
/* 自定义 Dialog 的 z-index */
|
.custom-dialog {
|
z-index: 3000 !important; /* 确保对话框覆盖其他元素 */
|
}
|
/deep/ .el-input-group__append,
|
.el-input-group__prepend {
|
background-color: #084b42;
|
color: #fff;
|
}
|
/deep/ .el-form-item__label {
|
color: #61f7d4 !important;
|
}
|
/deep/ .el-select {
|
margin-bottom: 0px !important;
|
}
|
/deep/ .el-form-item {
|
margin-top: 10px;
|
}
|
</style>
|