From 4cd8a5eb7d58e711e37e43bb332e332159687324 Mon Sep 17 00:00:00 2001 From: wangjuncheng <1> Date: 星期二, 24 六月 2025 16:48:01 +0800 Subject: [PATCH] Merge branch 'master' of http://103.135.160.14:9034/r/NslWeb --- 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