From fd1fe5d153b69ffe4439307077acf23fa9a5f63d Mon Sep 17 00:00:00 2001
From: guonan <guonan201020@163.com>
Date: 星期一, 23 六月 2025 14:19:05 +0800
Subject: [PATCH] 修改文件上传部分

---
 src/store/simAPI.js        |    2 
 src/views/left/CitySim.vue |  238 ++++++++++++++++++++++++++++++++++++++++++++++++----------
 2 files changed, 196 insertions(+), 44 deletions(-)

diff --git a/src/store/simAPI.js b/src/store/simAPI.js
index 061ddca..04db0b6 100644
--- a/src/store/simAPI.js
+++ b/src/store/simAPI.js
@@ -40,7 +40,7 @@
                 return false
             }
 
-            if (!forms.rainfall || !forms.intensity || !forms.duration) {
+            if (!forms.rainfall || !forms.intensity || !forms.duration || !forms.intensityUnit) {
                 ElMessage.warning('璇风‘淇濊〃鍗曞潎宸插~鍐�')
                 return false
             }
diff --git a/src/views/left/CitySim.vue b/src/views/left/CitySim.vue
index 44762bc..27af36b 100644
--- a/src/views/left/CitySim.vue
+++ b/src/views/left/CitySim.vue
@@ -31,6 +31,7 @@
         </el-form-item>
         <el-form-item label="涓婁紶鍙傛暟">
           <el-upload
+            :on-remove="handleRemove"
             v-model:file-list="forms.fileList"
             class="upload-demo"
             :auto-upload="false"
@@ -48,8 +49,9 @@
         <el-form-item label="闆ㄥ己鍗曚綅" v-if="forms.fileList.length !== 0">
           <el-select
             v-model="forms.intensityUnit"
-            placeholder="Select"
+            placeholder="璇烽�夋嫨闆ㄥ己鍗曚綅"
             style="max-width: 600px"
+            :disabled="!!forms.intensityUnit"
           >
             <el-option
               v-for="item in intensityOptions"
@@ -328,7 +330,6 @@
 // 瑙f瀽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, {
@@ -337,14 +338,6 @@
   });
 
   processData(jsonData);
-};
-
-const transformKeys = (data) => {
-  return data.map((item) => ({
-    time: item["鏃堕棿"], // "鏃堕棿" 鈫� "time"
-    intensity: parseFloat(item["灏忔椂闆ㄥ己mm/h"]), // 杞负娴偣鏁�
-    total: parseFloat(item["绱闆ㄩ噺"]), // 杞负娴偣鏁�
-  }));
 };
 
 /**
@@ -379,58 +372,204 @@
   if (!header) return "";
 
   // 鐩存帴鍖归厤 "mm/h"銆�"m/s" 绛夊父瑙佸崟浣�
-  const unitRegex = /(mm\/h|m\/s|mm|鈩億%|hPa|km\/h)/; // 鏍规嵁闇�瑕佹墿灞�
+  const unitRegex = /(mm\/h|mm\/1min|mm\/5min|mm\/15min)/; // 鏍规嵁闇�瑕佹墿灞�
   const match = header.match(unitRegex);
   return match ? match[0] : "";
 };
 
-// 澶勭悊鏁版嵁
+const transformKeys = (data) => {
+  return data.map((item) => ({
+    time: item["鏃堕棿"], // "鏃堕棿" 鈫� "time"
+    intensity: parseFloat(item["灏忔椂闆ㄥ己"]), // 杞负娴偣鏁�
+    total: parseFloat(item["绱闆ㄩ噺"]), // 杞负娴偣鏁�
+  }));
+};
+
+// 鍙厤缃殑瀛楁鍚嶅尮閰嶈鍒�
+const COLUMN_MATCH_RULES = {
+  time: ["鏃堕棿", "time", "datetime", "date"],
+  intensity: [
+    "闆ㄥ己",
+    "灏忔椂闆ㄥ己",
+    "rain_intensity",
+    "rain_rate",
+    "hour_rain",
+    "闄嶉洦寮哄害",
+  ],
+  totalRainfall: [
+    "绱闆ㄩ噺",
+    "鎬婚洦閲�",
+    "total_rain",
+    "cumulative_rainfall",
+    "闄嶉洦鎬婚噺",
+  ],
+};
+
+/**
+ * 鑷姩鍖归厤瀛楁鍚�
+ * @param {Object} headers - 琛ㄥご瀵硅薄锛堢涓�琛岋級
+ * @returns {{time: string, intensity: string, totalRainfall: string}}
+ */
+function matchColumns(headers) {
+  const matched = {
+    time: null,
+    intensity: null,
+    totalRainfall: null,
+  };
+
+  for (const header of Object.keys(headers)) {
+    const cleanHeader = header.trim();
+
+    if (
+      !matched.time &&
+      COLUMN_MATCH_RULES.time.some((k) => cleanHeader.includes(k))
+    ) {
+      matched.time = header;
+    }
+
+    if (
+      !matched.intensity &&
+      COLUMN_MATCH_RULES.intensity.some((k) => cleanHeader.includes(k))
+    ) {
+      matched.intensity = header;
+    }
+
+    if (
+      !matched.totalRainfall &&
+      COLUMN_MATCH_RULES.totalRainfall.some((k) => cleanHeader.includes(k))
+    ) {
+      matched.totalRainfall = header;
+    }
+  }
+
+  return matched;
+}
+
+/**
+ * 鏁版嵁澶勭悊涓诲嚱鏁�
+ */
 const processData = (data) => {
-  // 1. 妫�鏌ユ暟鎹槸鍚︿负绌�
+  // 妫�鏌ョ┖鏁版嵁
   if (data.length === 0) {
     ElMessage.warning("鏂囦欢鍐呭涓虹┖锛�");
     return;
   }
 
-  // 2. 鑾峰彇琛ㄥご锛堢涓�鍒楁槸鏃堕棿鍒楋級
-  const tableColumns = Object.keys(data[0]);
-  const timeColumn = tableColumns[0]; // 鍋囪绗竴鍒楁槸鏃堕棿
+  // 鍖归厤瀛楁鍚�
+  const columns = matchColumns(data[0]);
 
-  // 3. 鏍¢獙鏃堕棿鍒楁槸鍚︽寜鍗囧簭鎺掑垪
-  if (!isTimeColumnSorted(data, timeColumn)) {
-    ElMessage.error("鏃堕棿鍒楀繀椤绘寜鍗囧簭鎺掑垪锛�");
+  // 鏍¢獙蹇呰瀛楁鏄惁瀛樺湪
+  if (!columns.time) {
+    ElMessage.error(
+      "鏈壘鍒版湁鏁堢殑鏃堕棿鍒楋紝璇锋鏌ュ垪鍚嶆槸鍚︿负鈥滄椂闂粹�濇垨鍏朵粬鏀寔鐨勬牸寮�"
+    );
     forms.fileList = [];
-    return; // 缁堟澶勭悊
+    return;
   }
 
-  const intensityColumn = tableColumns[1]; // 闆ㄥ己鍒楋紙濡� "灏忔椂闆ㄥ己(mm/h)"锛�
-  console.log(intensityColumn, "intensityColumnintensityColumnintensityColumn");
-  // 3. 鎻愬彇绗簩鍒楃殑鍗曚綅锛堝 "(mm/h)" 鈫� "mm/h"锛�
-  const intensityUnit = extractUnitFromHeader(intensityColumn);
-  forms.intensityUnit = intensityUnit; // 瀛樺偍鍗曚綅锛堝彲閫夛級
+  if (!columns.intensity) {
+    ElMessage.error(
+      "鏈壘鍒版湁鏁堢殑闆ㄥ己鍒楋紝璇锋鏌ュ垪鍚嶆槸鍚︿负鈥滃皬鏃堕洦寮衡�濇垨鍏朵粬鏀寔鐨勬牸寮�"
+    );
+    forms.fileList = [];
+    return;
+  }
 
-  // 4. 濡傛灉鏍¢獙閫氳繃锛岀户缁鐞嗘暟鎹�
-  forms.rainFallList = transformKeys(data);
-  console.log(forms.rainFallList, "data");
+  // 鏃堕棿鍒楁牎楠屾槸鍚﹀崌搴�
+  if (!isTimeColumnSorted(data, columns.time)) {
+    ElMessage.error("鏃堕棿鍒楀繀椤绘寜鍗囧簭鎺掑垪锛�");
+    forms.fileList = [];
+    return;
+  }
 
-  // 5. 璁$畻闄嶉洦鏃堕暱銆佹渶澶ч洦寮恒�佺疮璁¢洦閲忥紙鍘熼�昏緫锛�
-  const firstTime = parseDateTime(data[0][timeColumn]);
-  const lastTime = parseDateTime(data[data.length - 1][timeColumn]);
-  const timeDuration = Math.floor((lastTime - firstTime) / 1000);
-  console.log(firstTime,lastTime,timeDuration,'aaaaaaaaaaaaaaaaaaaaaaaaaaaa')
-  forms.duration = (timeDuration / 3600).toFixed(2);
+  // 鎻愬彇鍗曚綅
+  forms.intensityUnit = extractUnitFromHeader(columns.intensity);
 
-  const maxValue = Math.max(
-    ...data.map((row) => {
-      const value = parseFloat(row[tableColumns[1]]);
-      return isNaN(value) ? -Infinity : value;
-    })
+  if (!forms.intensityUnit) {
+    forms.intensityUnit = "";
+  }
+
+  // 杞崲 key 鍚嶅苟杞崲鏁板�肩被鍨�
+  forms.rainFallList = data.map((row) => ({
+    time: row[columns.time],
+    intensity: parseFloat(row[columns.intensity]),
+    total: columns.totalRainfall
+      ? parseFloat(row[columns.totalRainfall])
+      : undefined,
+  }));
+
+  console.log(forms.rainFallList, "瑙f瀽鍚庣殑闄嶉洦鏁版嵁");
+
+  // 璁$畻缁熻淇℃伅
+  const firstTime = parseDateTime(data[0][columns.time]);
+  const lastTime = parseDateTime(data[data.length - 1][columns.time]);
+  const durationSeconds = Math.floor((lastTime - firstTime) / 1000);
+  forms.duration = (durationSeconds / 3600).toFixed(2); // 灏忔椂
+
+  const maxIntensity = Math.max(
+    ...data
+      .map((row) => parseFloat(row[columns.intensity]))
+      .filter((v) => !isNaN(v))
   ).toFixed(2);
-  forms.intensity = maxValue;
+  forms.intensity = maxIntensity;
 
-  const lastValue = data[data.length - 1][tableColumns[2]];
-  forms.rainfall = lastValue;
+  if (columns.totalRainfall) {
+    const lastTotal = parseFloat(data[data.length - 1][columns.totalRainfall]);
+    forms.rainfall = isNaN(lastTotal) ? 0 : lastTotal.toFixed(2);
+  } else {
+    forms.rainfall = 0;
+  }
 };
+
+// // 澶勭悊鏁版嵁
+// const processData = (data) => {
+//   // 1. 妫�鏌ユ暟鎹槸鍚︿负绌�
+//   if (data.length === 0) {
+//     ElMessage.warning("鏂囦欢鍐呭涓虹┖锛�");
+//     return;
+//   }
+
+//   // 2. 鑾峰彇琛ㄥご锛堢涓�鍒楁槸鏃堕棿鍒楋級
+//   const tableColumns = Object.keys(data[0]);
+//   const timeColumn = tableColumns[0]; // 鍋囪绗竴鍒楁槸鏃堕棿
+
+//   // 3. 鏍¢獙鏃堕棿鍒楁槸鍚︽寜鍗囧簭鎺掑垪
+//   if (!isTimeColumnSorted(data, timeColumn)) {
+//     ElMessage.error("鏃堕棿鍒楀繀椤绘寜鍗囧簭鎺掑垪锛�");
+//     forms.fileList = [];
+//     return; // 缁堟澶勭悊
+//   }
+
+//   const intensityColumn = tableColumns[1]; // 闆ㄥ己鍒楋紙濡� "灏忔椂闆ㄥ己(mm/h)"锛�
+//   // console.log(intensityColumn, "intensityColumnintensityColumnintensityColumn");
+//   // 3. 鎻愬彇绗簩鍒楃殑鍗曚綅锛堝 "(mm/h)" 鈫� "mm/h"锛�
+//   const intensityUnit = extractUnitFromHeader(intensityColumn);
+//   forms.intensityUnit = intensityUnit; // 瀛樺偍鍗曚綅锛堝彲閫夛級
+//   console.log(forms.intensityUnit,'aaaaaaaaaaaaaaaaaaaaa')
+
+//   // 4. 濡傛灉鏍¢獙閫氳繃锛岀户缁鐞嗘暟鎹�
+//   forms.rainFallList = transformKeys(data);
+//   console.log(forms.rainFallList, "data");
+
+//   // 5. 璁$畻闄嶉洦鏃堕暱銆侀洦寮恒�佺疮璁¢洦閲忥紙鍘熼�昏緫锛�
+//   const firstTime = parseDateTime(data[0][timeColumn]);
+//   const lastTime = parseDateTime(data[data.length - 1][timeColumn]);
+//   const timeDuration = Math.floor((lastTime - firstTime) / 1000);
+//   // 闄嶉洦鏃堕暱
+//   forms.duration = (timeDuration / 3600).toFixed(2);
+//   // 闄嶉洦寮哄害
+//   const maxValue = Math.max(
+//     ...data.map((row) => {
+//       const value = parseFloat(row[tableColumns[1]]);
+//       return isNaN(value) ? -Infinity : value;
+//     })
+//   ).toFixed(2);
+//   forms.intensity = maxValue;
+
+//   const lastValue = data[data.length - 1][tableColumns[2]];
+//   forms.rainfall = lastValue;
+
+// };
 
 /**
  * 瑙f瀽鏃ユ湡鏃堕棿瀛楃涓叉垨Excel鏁板瓧鏃ユ湡锛岃繑鍥炴椂闂存埑锛堟绉掓暟锛�
@@ -487,6 +626,16 @@
   ElMessage.warning("姣忔鍙兘涓婁紶涓�涓枃浠�");
 };
 
+const handleRemove = () => {
+  forms.rainfall = null;
+  forms.duration = null;
+  forms.intensity = null;
+  forms.fileList = [];
+  forms.rainFallList = [];
+  forms.hours = null;
+  forms.intensityUnit = "";
+};
+
 const beforeUpload = (file) => {
   const isExcel = file.name.endsWith(".xlsx") || file.name.endsWith(".xls");
   const isCSV = file.name.endsWith(".csv");
@@ -518,7 +667,7 @@
     // 鍏抽棴閫夋嫨鍖哄煙绐楀彛銆佸垵濮嬪寲瑙嗗浘骞跺紑濮嬫ā鎷�
     EventBus.emit("close-selectArea");
     simStore.shouldPoll = true;
-    
+
     // 鏆傛椂涓嶅湪姝ゅ寮�濮嬫ā鎷燂紝妯℃嫙閮藉湪鏂规鍒楄〃涓繘琛屾ā鎷�
     // initeWaterPrimitiveView();
     // startSimulate();
@@ -557,4 +706,7 @@
 /deep/ .el-form-item__label {
   color: #61f7d4 !important;
 }
+/deep/ .el-upload-list__item-file-name {
+  white-space: normal;
+}
 </style>

--
Gitblit v1.9.3