| | |
| | | v-if="simStore.selectTab == '行政区划仿真'" |
| | | > |
| | | <el-select |
| | | v-model="forms.eare" |
| | | @change="changeGeom" |
| | | v-model="forms.geom" |
| | | placeholder="Select" |
| | | style="max-width: 600px" |
| | | > |
| | | <el-option |
| | | v-for="item in cityOptions" |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | :value="item" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | v-if="simStore.selectTab == '重点区域仿真'" |
| | | > |
| | | <el-select |
| | | v-model="forms.eares" |
| | | @change="changeGeom" |
| | | v-model="forms.geom" |
| | | placeholder="Select" |
| | | style="max-width: 600px" |
| | | > |
| | | <el-option |
| | | v-for="item in earesOptions" |
| | | v-for="item in options" |
| | | :key="item.value" |
| | | :label="item.label" |
| | | :value="item.value" |
| | | :value="item" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | |
| | | <template #append>mm</template> |
| | | </el-input> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="选择时间:"> |
| | | <el-date-picker |
| | | v-if="forms.fileList.length !== 0" |
| | | v-model="forms.hours" |
| | | type="datetime" |
| | | placeholder="Select date and time" |
| | | /> |
| | | <el-date-picker |
| | | v-if="forms.fileList.length == 0" |
| | | 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" |
| | | style="max-width: 600px" |
| | | placeholder="Please input" |
| | |
| | | import { initeWaterPrimitiveView } from "@/utils/water"; |
| | | import { SimAPIStore } from "@/store/simAPI"; |
| | | import { getRegionData } from "@/api/trApi"; |
| | | import { storeToRefs } from "pinia"; |
| | | import dayjs from "dayjs"; |
| | | import { EventBus } from "@/eventBus"; // 引入事件总线 |
| | | |
| | | const cityOptions = reactive([]); |
| | | const simStore = SimAPIStore(); |
| | | const { selectTab } = storeToRefs(simStore); |
| | | |
| | | onMounted(() => { |
| | | getRegionData({ type: 1 }).then((res) => { |
| | | console.log(res, "res"); |
| | | const options = reactive([]); |
| | | |
| | | // 定义一个方法,用于根据 type 获取区域数据 |
| | | const fetchRegionData = (type) => { |
| | | getRegionData({ type: type }).then((res) => { |
| | | // 使用响应式数组的方法更新内容 |
| | | cityOptions.splice( |
| | | options.splice( |
| | | 0, |
| | | cityOptions.length, |
| | | options.length, |
| | | ...res.data.map((item) => ({ |
| | | value: item.geom, |
| | | label: item.name, |
| | | })) |
| | | ); |
| | | }); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | fetchRegionData(1); |
| | | }); |
| | | |
| | | const simStore = SimAPIStore(); |
| | | // 监听 selectTab 的变化 |
| | | watch(selectTab, (newVal) => { |
| | | let type; |
| | | switch (newVal) { |
| | | case "行政区划仿真": |
| | | type = 1; |
| | | break; |
| | | case "重点区域仿真": |
| | | type = 2; |
| | | break; |
| | | default: |
| | | type = 1; // 默认值 |
| | | } |
| | | fetchRegionData(type); |
| | | }); |
| | | |
| | | // 注入父组件提供的方法 |
| | | const { startSimulate, endSimulate } = inject("simulateActions"); |
| | | // 表单数据 |
| | | const forms = reactive({ |
| | | name: "", |
| | | eare: "北京市", |
| | | eares: "孙胡沟", |
| | | rainfall: "", |
| | | duration: "", |
| | | intensity: "", |
| | | geom: "", |
| | | rainfall: null, |
| | | duration: null, |
| | | intensity: null, |
| | | fileList: [], |
| | | type: 3, |
| | | rainFallList: [], |
| | | hours: null, |
| | | }); |
| | | |
| | | const earesOptions = [ |
| | | { value: "孙胡沟", label: "孙胡沟" }, |
| | | { value: "鱼水洞后沟", label: "鱼水洞后沟" }, |
| | | { value: "于家西沟", label: "于家西沟" }, |
| | | { value: "北河沟", label: "北河沟" }, |
| | | { value: "龙泉峪村", label: "龙泉峪村" }, |
| | | ]; |
| | | const flyHeight = ref(100000); |
| | | |
| | | // 计算属性:获取对话框标题 |
| | | const dialogTitle = computed(() => { |
| | | return simStore.selectTab === "行政区划仿真" |
| | | ? "行政区划仿真" |
| | | : "重点区域仿真"; |
| | | }); |
| | | // 将选中区域传递给gisView文件,做标红flyTo显示 |
| | | const changeGeom = (val) => { |
| | | if (selectTab.value == "行政区划仿真") { |
| | | flyHeight.value = 100000; |
| | | } else { |
| | | flyHeight.value = 5000; |
| | | } |
| | | EventBus.emit("select-geom", { geom: val.value, flyHeight: flyHeight.value }); |
| | | }; |
| | | |
| | | const { calculateHoursDifference } = inject("calculateHours"); |
| | | |
| | | const change = (val) => { |
| | | forms.duration = calculateHoursDifference(val); |
| | | }; |
| | | |
| | | const addSimCheme = async () => { |
| | | await simStore.addSimCheme(forms); |
| | | resetForm(); |
| | | EventBus.emit("close-selectArea"); |
| | | }; |
| | | |
| | | // 重置表单 |
| | | const resetForm = () => { |
| | | forms.geom = ""; |
| | | forms.rainfall = null; |
| | | forms.duration = null; |
| | | forms.intensity = null; |
| | | forms.fileList = []; |
| | | forms.rainFallList = []; |
| | | forms.hours = null; |
| | | }; |
| | | |
| | | // 计算属性:获取上传文件的名称列表 |
| | | const uploadedFilesText = computed(() => { |
| | | return forms.fileList.map((file) => file.name).join(", ") || "无"; |
| | | }); |
| | | |
| | | const addSimCheme = async () => { |
| | | await simStore.addSimCheme(forms); |
| | | }; |
| | | |
| | | // 重置表单 |
| | | const resetForm = () => { |
| | | forms.eare = "北京市"; |
| | | forms.eares = "孙胡沟"; |
| | | forms.rainfall = ""; |
| | | forms.duration = ""; |
| | | forms.intensity = ""; |
| | | forms.fileList = []; |
| | | }; |
| | | |
| | | // 文件变化时触发解析 |
| | | const handleFileChange = (file) => { |
| | |
| | | // 解析Excel文件 |
| | | const parseExcel = (data) => { |
| | | const workbook = XLSX.read(data, { type: "array" }); |
| | | console.log(workbook, "wokr"); |
| | | const firstSheetName = workbook.SheetNames[0]; |
| | | const worksheet = workbook.Sheets[firstSheetName]; |
| | | const jsonData = XLSX.utils.sheet_to_json(worksheet); |
| | | const jsonData = XLSX.utils.sheet_to_json(worksheet, { |
| | | raw: false, // 使用格式化字符串而不是原始值 |
| | | dateNF: "yyyy-mm-dd hh:mm:ss", // 指定日期格式 |
| | | }); |
| | | |
| | | processData(jsonData); |
| | | }; |
| | | |
| | | const transformKeys = (data) => { |
| | | return data.map((item) => ({ |
| | | time: item["时间"], // "时间" → "time" |
| | | intensity: parseFloat(item["小时雨强mm/h"]), // 转为浮点数 |
| | | total: parseFloat(item["累计雨量"]), // 转为浮点数 |
| | | })); |
| | | }; |
| | | |
| | | // 处理数据 |
| | | const processData = (data) => { |
| | | forms.rainFallList = transformKeys(data); |
| | | console.log(forms.rainFallList, "data"); |
| | | if (data.length === 0) return; |
| | | |
| | | const tableColumns = Object.keys(data[0]); |
| | |
| | | forms.rainfall = lastValue; // 更新降雨量 |
| | | }; |
| | | |
| | | // 解析日期时间 |
| | | /** |
| | | * 解析日期时间字符串或Excel数字日期,返回时间戳(毫秒数) |
| | | * @param {string|number} dateString - 日期字符串或Excel数字日期 |
| | | * @returns {number} 时间戳(毫秒数),解析失败返回 NaN |
| | | */ |
| | | const parseDateTime = (dateString) => { |
| | | // 1. 处理 Excel 数字日期(如 45136.91666666666),但是此处我在Excel解析时间的时候已经转换了,所以这个暂时无用 |
| | | if (typeof dateString === "number") { |
| | | // 使用 XLSX 工具解析 Excel 日期编码 |
| | | const parsedDate = XLSX.SSF.parse_date_code(dateString); |
| | | if (parsedDate) { |
| | | // 转换为 JavaScript Date 对象并返回时间戳 |
| | | return new Date( |
| | | parsedDate.y, |
| | | parsedDate.m - 1, |
| | | parsedDate.d, |
| | | parsedDate.H || 0, |
| | | parsedDate.M || 0, |
| | | parsedDate.S || 0 |
| | | ).getTime(); |
| | | parsedDate.y, // 年 |
| | | parsedDate.m - 1, // 月(Excel 中 1-12,JS 中 0-11) |
| | | parsedDate.d, // 日 |
| | | parsedDate.H || 0, // 时(可能不存在,默认为 0) |
| | | parsedDate.M || 0, // 分(可能不存在,默认为 0) |
| | | parsedDate.S || 0 // 秒(可能不存在,默认为 0) |
| | | ).getTime(); // 返回时间戳 |
| | | } |
| | | } |
| | | |
| | | // 2. 尝试直接解析日期字符串(如 "2023-07-30T16:00:00"),现在使用的是这个 |
| | | const parsedDate = new Date(dateString); |
| | | if (!isNaN(parsedDate.getTime())) { |
| | | return parsedDate.getTime(); |
| | | return parsedDate.getTime(); // 返回有效时间戳 |
| | | } |
| | | |
| | | const parts = dateString.split(/[/\s:]/); |
| | | // 3. 处理自定义格式的日期字符串(如 "2023/07/30 16:00:00") |
| | | const parts = dateString.split(/[/\s:]/); // 按 `/`、空格、`:` 分割 |
| | | if (parts.length >= 6) { |
| | | const year = parseInt(parts[0], 10); |
| | | const month = parseInt(parts[1], 10) - 1; |
| | | const day = parseInt(parts[2], 10); |
| | | const hour = parseInt(parts[3], 10) || 0; |
| | | const minute = parseInt(parts[4], 10) || 0; |
| | | const second = parseInt(parts[5], 10) || 0; |
| | | const year = parseInt(parts[0], 10); // 年 |
| | | const month = parseInt(parts[1], 10) - 1; // 月(转换为 JS 的 0-11) |
| | | const day = parseInt(parts[2], 10); // 日 |
| | | const hour = parseInt(parts[3], 10) || 0; // 时(默认 0) |
| | | const minute = parseInt(parts[4], 10) || 0; // 分(默认 0) |
| | | const second = parseInt(parts[5], 10) || 0; // 秒(默认 0) |
| | | |
| | | // 构造 Date 对象并返回时间戳 |
| | | const date = new Date(year, month, day, hour, minute, second); |
| | | if (!isNaN(date.getTime())) { |
| | | return date.getTime(); |
| | | } |
| | | } |
| | | |
| | | // 4. 解析失败时警告并返回 NaN |
| | | console.warn(`无法解析日期: ${dateString}`); |
| | | return NaN; |
| | | }; |