src/views/left/CitySim.vue
@@ -41,6 +41,7 @@
          v-if="simStore.selectTab == '行政区划仿真'"
        >
          <el-select
            @change="changeGeom"
            v-model="forms.geom"
            placeholder="Select"
            style="max-width: 600px"
@@ -49,7 +50,7 @@
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
              :value="item"
            />
          </el-select>
        </el-form-item>
@@ -58,6 +59,7 @@
          v-if="simStore.selectTab == '重点区域仿真'"
        >
          <el-select
            @change="changeGeom"
            v-model="forms.geom"
            placeholder="Select"
            style="max-width: 600px"
@@ -66,7 +68,7 @@
              v-for="item in options"
              :key="item.value"
              :label="item.label"
              :value="item.value"
              :value="item"
            />
          </el-select>
        </el-form-item>
@@ -80,9 +82,28 @@
            <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"
@@ -120,6 +141,8 @@
import { SimAPIStore } from "@/store/simAPI";
import { getRegionData } from "@/api/trApi";
import { storeToRefs } from "pinia";
import dayjs from "dayjs";
import { EventBus } from "@/eventBus"; // 引入事件总线
const simStore = SimAPIStore();
const { selectTab } = storeToRefs(simStore);
@@ -167,25 +190,48 @@
const forms = reactive({
  name: "",
  geom: "",
  rainfall: "",
  duration: "",
  intensity: "",
  rainfall: null,
  duration: null,
  intensity: null,
  fileList: [],
  type: 3,
  rainFallList: [],
  hours: null,
});
const flyHeight = ref(100000);
// 将选中区域传递给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.eares = "孙胡沟";
  forms.rainfall = "";
  forms.duration = "";
  forms.intensity = "";
  forms.rainfall = null;
  forms.duration = null;
  forms.intensity = null;
  forms.fileList = [];
  forms.rainFallList = [];
  forms.hours = null;
};
// 计算属性:获取上传文件的名称列表
@@ -223,14 +269,29 @@
// 解析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]);
@@ -255,42 +316,53 @@
  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;
};