From 66032f62b4a3b6a649fc02b392ae41278399b58b Mon Sep 17 00:00:00 2001 From: wangjuncheng <1> Date: 星期二, 08 七月 2025 15:23:19 +0800 Subject: [PATCH] 添加打印加坝数据代码, 但调用被注释 --- src/views/left/CitySim.vue | 349 ++++++++++++++++++++++++++++++---------------------------- 1 files changed, 181 insertions(+), 168 deletions(-) diff --git a/src/views/left/CitySim.vue b/src/views/left/CitySim.vue index 27af36b..a4de983 100644 --- a/src/views/left/CitySim.vue +++ b/src/views/left/CitySim.vue @@ -1,10 +1,6 @@ <template> <div style="width: 100%; height: 100%"> - <div - class="left-top" - v-if="simStore.selectTab == '琛屾斂鍖哄垝浠跨湡'" - style="margin-top: 0px" - > + <div class="left-top" v-if="simStore.selectTab == '琛屾斂鍖哄垝浠跨湡'" style="margin-top: 0px"> 琛屾斂鍖哄垝浠跨湡锛�30m绮惧害锛� </div> <div class="left-top" v-if="simStore.selectTab == '閲嶇偣鍖哄煙浠跨湡'"> @@ -15,134 +11,56 @@ </div> <div class="forms" :class="{ 'no-background': !showBackground }"> - <el-form - :rules="rules" - :model="forms" - label-width="auto" - style="max-width: 600px" - > + <el-form :rules="rules" :model="forms" label-width="auto" style="max-width: 600px"> <el-form-item label="鏂规鍚嶇О:"> - <el-input - v-model="forms.name" - style="max-width: 600px" - placeholder="璇疯緭鍏ユ柟妗堝悕绉�" - > + <el-input v-model="forms.name" style="max-width: 600px" placeholder="璇疯緭鍏ユ柟妗堝悕绉�"> </el-input> </el-form-item> <el-form-item label="涓婁紶鍙傛暟"> - <el-upload - :on-remove="handleRemove" - v-model:file-list="forms.fileList" - class="upload-demo" - :auto-upload="false" - :multiple="false" - :on-change="handleFileChange" - :limit="1" - :on-exceed="handleExceed" - :before-upload="beforeUpload" - accept=".xlsx,.xls,.csv" - > + <el-upload :on-remove="handleRemove" v-model:file-list="forms.fileList" class="upload-demo" + :auto-upload="false" :multiple="false" :on-change="handleFileChange" :limit="1" :on-exceed="handleExceed" + :before-upload="beforeUpload" accept=".xlsx,.xls,.csv"> <el-button type="primary">鐐瑰嚮涓婁紶闄嶉洦鏁版嵁</el-button> <template #append>mm/h</template> </el-upload> </el-form-item> <el-form-item label="闆ㄥ己鍗曚綅" v-if="forms.fileList.length !== 0"> - <el-select - v-model="forms.intensityUnit" - placeholder="璇烽�夋嫨闆ㄥ己鍗曚綅" - style="max-width: 600px" - :disabled="!!forms.intensityUnit" - > - <el-option - v-for="item in intensityOptions" - :key="item.value" - :label="item.label" - :value="item.value" - /> + <el-select v-model="forms.intensityUnit" placeholder="璇烽�夋嫨闆ㄥ己鍗曚綅" style="max-width: 600px" + :disabled="!!forms.intensityUnit"> + <el-option v-for="item in intensityOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> </el-form-item> - <el-form-item - label="琛屾斂鍖哄煙:" - v-if="simStore.selectTab == '琛屾斂鍖哄垝浠跨湡'" - > - <el-select - @change="changeGeom" - v-model="forms.geom" - placeholder="璇烽�夋嫨妯℃嫙鍖哄煙" - style="max-width: 600px" - > - <el-option - v-for="item in options" - :key="item.value" - :label="item.label" - :value="item" - /> + <el-form-item label="琛屾斂鍖哄煙:" v-if="simStore.selectTab == '琛屾斂鍖哄垝浠跨湡'"> + <el-select @change="changeGeom" v-model="forms.geom" placeholder="璇烽�夋嫨妯℃嫙鍖哄煙" style="max-width: 600px"> + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item" /> </el-select> </el-form-item> - <el-form-item - label="閲嶇偣鍖哄煙:" - v-if="simStore.selectTab == '閲嶇偣鍖哄煙浠跨湡'" - > - <el-select - @change="changeGeom" - v-model="forms.geom" - placeholder="璇烽�夋嫨妯℃嫙鍖哄煙" - style="max-width: 600px" - > - <el-option - v-for="item in options" - :key="item.value" - :label="item.label" - :value="item" - /> + <el-form-item label="閲嶇偣鍖哄煙:" v-if="simStore.selectTab == '閲嶇偣鍖哄煙浠跨湡'"> + <el-select @change="changeGeom" v-model="forms.geom" placeholder="璇烽�夋嫨妯℃嫙鍖哄煙" style="max-width: 600px"> + <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item" /> </el-select> </el-form-item> <el-form-item label="闄嶉洦閲�:"> - <el-input - v-model="forms.rainfall" - style="max-width: 600px" - placeholder="璇疯緭鍏ラ檷闆ㄩ噺" - > + <el-input v-model="forms.rainfall" style="max-width: 600px" placeholder="璇疯緭鍏ラ檷闆ㄩ噺"> <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="璇烽�夋嫨寮�濮嬫椂闂�" - /> - <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-date-picker v-if="forms.fileList.length !== 0" v-model="forms.hours" type="datetime" + placeholder="璇烽�夋嫨寮�濮嬫椂闂�" /> + <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="璇疯緭鍏ラ檷闆ㄦ椂闀�" - > + <el-input disabled v-model="forms.duration" style="max-width: 600px" placeholder="璇疯緭鍏ラ檷闆ㄦ椂闀�"> <template #append>h</template> </el-input> </el-form-item> <el-form-item label="闄嶉洦寮哄害:"> - <el-input - v-model="forms.intensity" - style="max-width: 600px" - placeholder="璇疯緭鍏ラ檷闆ㄥ己搴�" - > + <el-input v-model="forms.intensity" style="max-width: 600px" placeholder="璇疯緭鍏ラ檷闆ㄥ己搴�"> <template #append>mm/h</template> </el-input> </el-form-item> @@ -186,7 +104,7 @@ const intensityOptions = ref([ { value: "mm/h", label: "mm/h" }, { value: "mm/5min", label: "mm/5min" }, - { value: "mm/1min", label: "mm/1min" }, + { value: "mm/min", label: "mm/min" }, ]); // 瀹氫箟涓�涓柟娉曪紝鐢ㄤ簬鏍规嵁 type 鑾峰彇鍖哄煙鏁版嵁 @@ -277,9 +195,11 @@ forms.geom = props.selectedArea; } await simStore.addSimCheme(forms); + // 鎵撳嵃鎷︽尅鍧濇墍闇�瑕佺殑鏁版嵁 + // printDamEntities(); resetForm(); // 鍙湁鍦ㄤ繚瀛樻垚鍔熷悗鎵嶉噸缃〃鍗� EventBus.emit("close-selectArea"); - } catch (error) {} + } catch (error) { } }; // 閲嶇疆琛ㄥ崟 @@ -447,15 +367,16 @@ /** * 鏁版嵁澶勭悊涓诲嚱鏁� + * @param {Array} data - 瑙f瀽鍚庣殑鍘熷鏁版嵁鏁扮粍锛屾瘡涓厓绱犳槸涓�涓璞� */ const processData = (data) => { - // 妫�鏌ョ┖鏁版嵁 + // 妫�鏌ユ槸鍚︿负绌烘暟鎹� if (data.length === 0) { ElMessage.warning("鏂囦欢鍐呭涓虹┖锛�"); return; } - // 鍖归厤瀛楁鍚� + // 鍖归厤鍒楀悕锛堜緥濡傗�滄椂闂粹�濄�佲�滃皬鏃堕洦寮衡�濓級 const columns = matchColumns(data[0]); // 鏍¢獙蹇呰瀛楁鏄惁瀛樺湪 @@ -475,22 +396,18 @@ return; } - // 鏃堕棿鍒楁牎楠屾槸鍚﹀崌搴� + // 鏍¢獙鏃堕棿鍒楁槸鍚﹀崌搴忔帓鍒� if (!isTimeColumnSorted(data, columns.time)) { ElMessage.error("鏃堕棿鍒楀繀椤绘寜鍗囧簭鎺掑垪锛�"); forms.fileList = []; return; } - // 鎻愬彇鍗曚綅 - forms.intensityUnit = extractUnitFromHeader(columns.intensity); + // 鎻愬彇鍗曚綅锛堝 mm/h锛夛紝鑻ユ病鏈夊垯璁句负绌哄瓧绗︿覆 + forms.intensityUnit = extractUnitFromHeader(columns.intensity) || ""; - if (!forms.intensityUnit) { - forms.intensityUnit = ""; - } - - // 杞崲 key 鍚嶅苟杞崲鏁板�肩被鍨� - forms.rainFallList = data.map((row) => ({ + // 灏嗗師濮嬫暟鎹浆鎹负缁熶竴缁撴瀯鐨勫璞℃暟缁� + const rawRainFallList = data.map((row) => ({ time: row[columns.time], intensity: parseFloat(row[columns.intensity]), total: columns.totalRainfall @@ -498,21 +415,44 @@ : undefined, })); - console.log(forms.rainFallList, "瑙f瀽鍚庣殑闄嶉洦鏁版嵁"); + // 鏇存柊 forms.rainFallList锛屽彲鐢ㄤ簬鍥捐〃鏄剧ず绛夌敤閫� + forms.rainFallList = rawRainFallList; - // 璁$畻缁熻淇℃伅 - const firstTime = parseDateTime(data[0][columns.time]); - const lastTime = parseDateTime(data[data.length - 1][columns.time]); + + // 鍒ゆ柇鏄惁涓烘暣灏忔椂鏁版嵁锛堝嵆鐩搁偦鏃堕棿闂撮殧鏄惁涓烘暣灏忔椂锛� + const isHourlyData = checkIfHourlyData(rawRainFallList); + + let hourlyRainfallList = []; + + if (!isHourlyData) { + // 濡傛灉涓嶆槸鏁村皬鏃舵暟鎹紝鎸夊皬鏃惰繘琛岃仛鍚堝鐞� + hourlyRainfallList = aggregateToHourlyRainfall(rawRainFallList); + console.log(hourlyRainfallList, "淇鍚庣殑灏忔椂闆ㄥ己"); + } else { + // 濡傛灉鏄暣灏忔椂鏁版嵁锛岀洿鎺ヤ娇鐢ㄥ師濮嬮洦寮哄�� + hourlyRainfallList = rawRainFallList.map((item) => ({ + time: item.time, + intensity: item.intensity, + })); + } + + // 璁$畻璧峰鏃堕棿鍜岀粨鏉熸椂闂达紙姣鏁帮級 + const firstTime = parseDateTime(hourlyRainfallList[0]?.time); + const lastTime = parseDateTime( + hourlyRainfallList[hourlyRainfallList.length - 1]?.time + ); + + // 璁$畻鎸佺画鏃堕棿锛堝崟浣嶏細灏忔椂锛� const durationSeconds = Math.floor((lastTime - firstTime) / 1000); - forms.duration = (durationSeconds / 3600).toFixed(2); // 灏忔椂 + forms.duration = (durationSeconds / 3600).toFixed(2); // 鍗曚綅锛氬皬鏃� + // 鎵惧嚭鏈�澶у皬鏃堕洦寮� const maxIntensity = Math.max( - ...data - .map((row) => parseFloat(row[columns.intensity])) - .filter((v) => !isNaN(v)) + ...hourlyRainfallList.map((item) => item.intensity).filter((v) => !isNaN(v)) ).toFixed(2); forms.intensity = maxIntensity; + // 鑻ユ湁鎬婚檷闆ㄩ噺鍒楋紝鍙栧嚭鏈�鍚庝竴涓�间綔涓烘�婚檷闆ㄩ噺 if (columns.totalRainfall) { const lastTotal = parseFloat(data[data.length - 1][columns.totalRainfall]); forms.rainfall = isNaN(lastTotal) ? 0 : lastTotal.toFixed(2); @@ -521,56 +461,80 @@ } }; -// // 澶勭悊鏁版嵁 -// const processData = (data) => { -// // 1. 妫�鏌ユ暟鎹槸鍚︿负绌� -// if (data.length === 0) { -// ElMessage.warning("鏂囦欢鍐呭涓虹┖锛�"); -// return; -// } +/** + * 妫�鏌ユ暟鎹槸鍚︿负鏁村皬鏃惰褰� + * @param {Array} rainList - 鍘熷闄嶉洦鏁版嵁鍒楄〃锛屾瘡涓厓绱犲寘鍚� time 鍜� intensity + * @returns {boolean} - 鏄惁涓烘暣灏忔椂鏁版嵁 + */ +function checkIfHourlyData(rainList) { + if (rainList.length < 2) return true; // 鍙湁涓�涓偣锛岄粯璁よ涓烘暣灏忔椂鏁版嵁 -// // 2. 鑾峰彇琛ㄥご锛堢涓�鍒楁槸鏃堕棿鍒楋級 -// const tableColumns = Object.keys(data[0]); -// const timeColumn = tableColumns[0]; // 鍋囪绗竴鍒楁槸鏃堕棿 + for (let i = 1; i < rainList.length; i++) { + // 瑙f瀽涓や釜鐩搁偦鏃堕棿鐐� + const time1 = parseDateTime(rainList[i - 1].time); + const time2 = parseDateTime(rainList[i].time); -// // 3. 鏍¢獙鏃堕棿鍒楁槸鍚︽寜鍗囧簭鎺掑垪 -// if (!isTimeColumnSorted(data, timeColumn)) { -// ElMessage.error("鏃堕棿鍒楀繀椤绘寜鍗囧簭鎺掑垪锛�"); -// forms.fileList = []; -// return; // 缁堟澶勭悊 -// } + // 璁$畻鏃堕棿宸紙鍒嗛挓锛� + const diffMinutes = Math.abs(time2 - time1) / (1000 * 60); -// 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') + // 濡傛灉鏃堕棿宸笉鏄暣灏忔椂锛堜笉鑳借60鏁撮櫎锛夛紝鍒欎笉鏄暣灏忔椂鏁版嵁 + if (diffMinutes % 60 !== 0) { + return false; + } + } -// // 4. 濡傛灉鏍¢獙閫氳繃锛岀户缁鐞嗘暟鎹� -// forms.rainFallList = transformKeys(data); -// console.log(forms.rainFallList, "data"); + return true; +} -// // 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; +/** + * 灏嗕换鎰忔椂闂寸矑搴︾殑闆ㄥ己鏁版嵁锛屾寜灏忔椂鑱氬悎涓衡�滃皬鏃堕洦寮衡�� + * @param {Array} rainList - 鍘熷鏁版嵁鍒楄〃锛屾瘡涓厓绱犲寘鍚� time 鍜� intensity + * @returns {Array} - 鎸夊皬鏃跺垎缁勭殑鑱氬悎缁撴灉 + */ +function aggregateToHourlyRainfall(rainList) { + const grouped = {}; // 鐢ㄤ簬涓存椂瀛樺偍姣忎釜灏忔椂鐨勬暟鎹� -// const lastValue = data[data.length - 1][tableColumns[2]]; -// forms.rainfall = lastValue; + for (const item of rainList) { + // 瑙f瀽鏃堕棿瀛楃涓蹭负鏃堕棿鎴� + const timestamp = parseDateTime(item.time); -// }; + // 濡傛灉瑙f瀽澶辫触锛岃烦杩囧綋鍓嶉」 + if (isNaN(timestamp)) { + console.warn("鏃犳晥鐨勬椂闂存牸寮忥紝宸茶烦杩�", item.time); + continue; + } + // 灏嗘椂闂存埑杞负 Date 瀵硅薄浠ヤ究鎿嶄綔鏃ユ湡 + const dt = new Date(timestamp); + + // 鏋勯�犲勾鏈堟棩+灏忔椂閿紙濡傦細"2024-08-25 14"锛� + const year = String(dt.getFullYear()).padStart(4, "0"); + const month = String(dt.getMonth() + 1).padStart(2, "0"); // 娉ㄦ剰鏈堜唤浠�0寮�濮� + const date = String(dt.getDate()).padStart(2, "0"); + const hour = String(dt.getHours()).padStart(2, "0"); + + const hourKey = `${year}-${month}-${date} ${hour}`; + + // 鍒濆鍖栬灏忔椂鐨勮仛鍚堝璞� + if (!grouped[hourKey]) { + grouped[hourKey] = { + time: `${hourKey}:00:00`, // 鏍囧噯鍖栦负鏁寸偣鏃堕棿 + intensity: 0, + }; + } + + // 绱姞璇ュ皬鏃跺唴鎵�鏈夐洦寮哄�� + grouped[hourKey].intensity += item.intensity; + } + + // 灏嗚仛鍚堢粨鏋滆浆涓烘暟缁勫苟淇濈暀涓や綅灏忔暟 + const result = Object.values(grouped).map((item) => ({ + time: item.time, + intensity: Number(item.intensity.toFixed(2)), + })); + + return result; +} /** * 瑙f瀽鏃ユ湡鏃堕棿瀛楃涓叉垨Excel鏁板瓧鏃ユ湡锛岃繑鍥炴椂闂存埑锛堟绉掓暟锛� * @param {string|number} dateString - 鏃ユ湡瀛楃涓叉垨Excel鏁板瓧鏃ユ湡 @@ -681,6 +645,52 @@ // ElMessage.error("鍚姩妯℃嫙澶辫触锛岃绋嶅悗鍐嶈瘯"); } } +// ========================================鎷︽尅鍧�=============================================================== +// 鑾峰彇鎷︽尅鍧濇暟鎹� +function printDamEntities() { + const entities = viewer.entities.values; + const damDataList = []; + + for (let i = 0; i < entities.length; i++) { + const entity = entities[i]; + + if (entity.name && (entity.name === '鏍忔。鍧�1' || entity.name === '鏍忔。鍧�2')) { + damDataList.push({ + name: entity.name, + position: entity.position?._value, + heading: entity.heading?._value ?? entity.heading, + pitch: entity.pitch?._value ?? entity.pitch, + roll: entity.roll?._value ?? entity.roll, + modelScale: entity.model?.scale?._value ?? entity.model?.scale + }); + } + } + if (damDataList.length > 0) { + console.log("銆愭爮妗e潩瀹炰綋鏁版嵁鍒楄〃銆戯細", damDataList); + deleteDamEntitiesAfterDelay(); + } else { + console.log("鏈壘鍒颁换浣曞悕涓� '鏍忔。鍧�1' 鎴� '鏍忔。鍧�2' 鐨勫疄浣�"); + } +} +// 淇濆瓨鏂规鍚庡畾鏃舵竻闄ゆ柊寤虹殑鎷︽尅鍧濇暟鎹� +function deleteDamEntitiesAfterDelay() { + setTimeout(() => { + const entities = Array.from(viewer.entities.values); + const damsToDelete = entities.filter( + entity => entity.name === '鏍忔。鍧�1' || entity.name === '鏍忔。鍧�2' + ); + + damsToDelete.forEach(entity => { + viewer.entities.remove(entity); + }); + + if (damsToDelete.length > 0) { + console.log(`銆愬凡鍒犻櫎銆戝叡 ${damsToDelete.length} 涓爮妗e潩瀹炰綋`); + } else { + console.log("鏈壘鍒颁换浣曞彲鍒犻櫎鐨勬爮妗e潩瀹炰綋"); + } + }, 5000); +} </script> <style lang="less" scoped> @@ -698,14 +708,17 @@ margin-top: 0px; background-image: none; } + /deep/ .el-input-group__append, .el-input-group__prepend { background-color: #084b42; color: #fff; } + /deep/ .el-form-item__label { color: #61f7d4 !important; } + /deep/ .el-upload-list__item-file-name { white-space: normal; } -- Gitblit v1.9.3