diff --git a/frontend/src/api/mapModal/index.ts b/frontend/src/api/mapModal/index.ts
index 7a092cdd..9afcc47c 100644
--- a/frontend/src/api/mapModal/index.ts
+++ b/frontend/src/api/mapModal/index.ts
@@ -62,14 +62,22 @@ export function getMonitorData(data: any) {
data
});
}
-// 生态流量 -限制范围查询
-export function getEngLimit(data: any) {
+// 监测数据 - 水温
+export function getMonitorDataWaterTemp(data: any) {
return request({
- url: '/eq/data/getEngLimit',
+ url: '/api/wmp-env-server/sw/alongDetail/qgc/GetKendoListCust',
method: 'post',
data
});
}
+// 监测数据 - 水温 - 查询显示 综合/等温
+export function getMonitorDataWaterTempPowerStation(params: any) {
+ return request({
+ url: '/api/wmp-env-server/sw/wtrv/getIoWtrvFlag',
+ method: 'get',
+ params
+ });
+}
// 生态流量 - 限制范围查询 - 日
export function getEngLimitDay(data: any) {
return request({
@@ -78,3 +86,11 @@ export function getEngLimitDay(data: any) {
data
});
}
+// 生态流量 - 限制范围查询 - 月
+export function getEngLimit(data: any) {
+ return request({
+ url: '/eq/interval/qgc/month/GetKendoListCust',
+ method: 'post',
+ data
+ });
+}
diff --git a/frontend/src/components/BasicTable/index.vue b/frontend/src/components/BasicTable/index.vue
index 5cccb4ed..823b91c6 100644
--- a/frontend/src/components/BasicTable/index.vue
+++ b/frontend/src/components/BasicTable/index.vue
@@ -11,6 +11,10 @@
:row-key="rowKey"
@change="handleTableChange"
>
+
+
+
+
diff --git a/frontend/src/components/MapModal/components/BasicInfo.vue b/frontend/src/components/MapModal/components/BasicInfo.vue
index 2f359d46..0f9c2b51 100644
--- a/frontend/src/components/MapModal/components/BasicInfo.vue
+++ b/frontend/src/components/MapModal/components/BasicInfo.vue
@@ -152,7 +152,7 @@ const columnsConfig = ref([
columns: BasicColumns
},
{
- type: 'wt_point',
+ type: 'WT',
columns: wtPointColumns
},
{
diff --git a/frontend/src/components/MapModal/components/MonitorInfo.vue b/frontend/src/components/MapModal/components/MonitorInfo.vue
index 1b23e4af..ccd7b7cf 100644
--- a/frontend/src/components/MapModal/components/MonitorInfo.vue
+++ b/frontend/src/components/MapModal/components/MonitorInfo.vue
@@ -1,7 +1,7 @@
-
+
@@ -17,40 +17,105 @@
查询
+
+ 导出
+
+
-
-
-
+
+
-
+
+
+
+
+
+ >
+
+
+
+
+
+ {{ summaryRow.label }}
+
+
+ {{ summaryRow.cells[col.dataIndex]?.value ?? '-' }}
+
+
+
+
+
+
+
+
+
-
-
+
+
diff --git a/frontend/src/components/MapModal/components/charts/PowerStationChart.vue b/frontend/src/components/MapModal/components/charts/PowerStationChart.vue
new file mode 100644
index 00000000..e9c7067e
--- /dev/null
+++ b/frontend/src/components/MapModal/components/charts/PowerStationChart.vue
@@ -0,0 +1,315 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/MapModal/components/charts/WaterTempChart.vue b/frontend/src/components/MapModal/components/charts/WaterTempChart.vue
new file mode 100644
index 00000000..7a031031
--- /dev/null
+++ b/frontend/src/components/MapModal/components/charts/WaterTempChart.vue
@@ -0,0 +1,505 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/components/MapModal/components/composables/useWaterTempTable.ts b/frontend/src/components/MapModal/components/composables/useWaterTempTable.ts
new file mode 100644
index 00000000..e9334696
--- /dev/null
+++ b/frontend/src/components/MapModal/components/composables/useWaterTempTable.ts
@@ -0,0 +1,399 @@
+import { ref, computed } from 'vue';
+import dayjs from 'dayjs';
+
+/**
+ * 水温表格相关逻辑(Checkbox、表格列、合计行)
+ */
+export function useWaterTempTable(chartData: any[], activeTabKey: any) {
+ const selectedColumns = ref([]);
+
+ // ==================== Checkbox 配置 ====================
+ const checkBoxOptions = [
+ { label: '综合分析', value: 'summary' },
+ { label: '等深水温', value: 'deep' }
+ ];
+
+ const showSummaryCheckbox = ref(false); // ioWtrv
+ const showDeepCheckbox = ref(false); // hasRstcdWtvt
+ const isDataEmpty = computed(
+ () => !Array.isArray(chartData.value) || chartData.value.length === 0
+ );
+
+ // 根据 powerStationRes 数据 + 互斥逻辑 动态过滤 checkbox 选项
+ const filteredCheckBoxOptions = computed(() => {
+ if (activeTabKey.value !== 'swjc.tabs.jcsj') return [];
+ if (isDataEmpty.value) return [];
+
+ const selected = selectedColumns.value;
+ const hasSelected = selected.length > 0;
+ const selectedValue = selected[0];
+
+ return checkBoxOptions.filter(opt => {
+ if (opt.value === 'summary' && !showSummaryCheckbox.value) return false;
+ if (opt.value === 'deep' && !showDeepCheckbox.value) return false;
+ if (hasSelected) {
+ return opt.value === selectedValue;
+ }
+ return true;
+ });
+ });
+
+ const isDeepMode = computed(() => selectedColumns.value.includes('deep'));
+ const isSummaryMode = computed(() =>
+ selectedColumns.value.includes('summary')
+ );
+
+ const currentChartMode = computed(() => {
+ if (isSummaryMode.value) return 'summary';
+ if (isDeepMode.value) return 'deep';
+ return 'base';
+ });
+
+ // Checkbox 变化处理
+ const handleCheckboxChange = (values: any[], fetchData: () => void) => {
+ const hasSummary = values.includes('summary');
+ const hasDeep = values.includes('deep');
+
+ if (hasSummary && hasDeep) {
+ selectedColumns.value = [values[values.length - 1]];
+ } else {
+ selectedColumns.value = values;
+ }
+
+ fetchData();
+ };
+
+ // ==================== 表格列配置 ====================
+ const baseWaterTempColumns = [
+ {
+ title: '时间',
+ dataIndex: 'tm',
+ fixed: 'left',
+ customRender: ({ text }: any) =>
+ text ? dayjs(text).format('YYYY-MM-DD HH:mm') : '-'
+ },
+ {
+ title: '水温(°C)',
+ dataIndex: 'wt',
+ summary: true,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(1) : '-'
+ }
+ ];
+
+ const deepModeExtraColumns = [
+ {
+ title: '等温水深(m)',
+ dataIndex: 'deep_wt',
+ summary: true,
+ customRender: ({ record }: any) => {
+ const val = record?.wtvtDataVo?.wthg;
+ return val !== undefined && val !== null ? Number(val).toFixed(2) : '-';
+ }
+ },
+ {
+ title: '垂向水温(℃)',
+ dataIndex: 'vert_wt',
+ summary: true,
+ customRender: ({ record }: any) => {
+ const val = record?.wtvtDataVo?.vwt;
+ return val !== undefined && val !== null ? Number(val).toFixed(1) : '-';
+ }
+ }
+ ];
+
+ const summaryModeColumns = [
+ {
+ title: '时间',
+ dataIndex: 'tm',
+ width: 130,
+ fixed: 'left',
+ customRender: ({ text }: any) =>
+ text ? dayjs(text).format('YYYY-MM-DD HH:mm') : '-'
+ },
+ {
+ title: '出库水温(℃)',
+ dataIndex: 'wt',
+ summary: true,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(1) : '-'
+ },
+ {
+ title: '入库水温(℃)',
+ dataIndex: 'iwt_wt',
+ summary: true,
+ customRender: ({ record }: any) =>
+ record?.iwtDataVo?.wt !== undefined && record?.iwtDataVo?.wt !== null
+ ? Number(record.iwtDataVo.wt).toFixed(1)
+ : '-'
+ },
+ {
+ title: '天然水温(°C)',
+ dataIndex: 'natureTmp',
+ summary: true,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(1) : '-'
+ },
+ {
+ title: '气温(℃)',
+ dataIndex: 'tmp_at',
+ summary: true,
+ width: 80,
+ customRender: ({ record }: any) =>
+ record?.tmpDataVo?.at !== undefined && record?.tmpDataVo?.at !== null
+ ? Number(record.tmpDataVo.at).toFixed(1)
+ : '-'
+ },
+ {
+ title: '出库流量(m³/s)',
+ dataIndex: 'hydropw_qo',
+ summary: true,
+ width: 120,
+ customRender: ({ record }: any) =>
+ record?.hydropwDataVo?.qo !== undefined &&
+ record?.hydropwDataVo?.qo !== null
+ ? Number(record.hydropwDataVo.qo).toFixed(3)
+ : '-'
+ },
+ {
+ title: '入库流量(m³/s)',
+ dataIndex: 'hydropw_qi',
+ summary: true,
+ width: 120,
+ customRender: ({ record }: any) =>
+ record?.hydropwDataVo?.qi !== undefined &&
+ record?.hydropwDataVo?.qi !== null
+ ? Number(record.hydropwDataVo.qi).toFixed(3)
+ : '-'
+ }
+ ];
+
+ const tableColumnsConfig: Record = {
+ 'dzxq.tabs.jcsj': [
+ {
+ title: '时间',
+ dataIndex: 'tm',
+ width: 180,
+ fixed: 'left',
+ customRender: ({ text }: any) =>
+ text ? dayjs(text).format('YYYY-MM-DD HH:mm:ss') : '-'
+ },
+ {
+ title: '坝上水位(m)',
+ dataIndex: 'rz',
+ width: 130,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(2) : '-'
+ },
+ {
+ title: '坝下水位(m)',
+ dataIndex: 'dz',
+ width: 130,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(2) : '-'
+ },
+ {
+ title: '入库流量(m³/s)',
+ dataIndex: 'qi',
+ width: 130,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Math.round(Number(text)) : '-'
+ },
+ {
+ title: '出库流量(m³/s)',
+ dataIndex: 'qo',
+ width: 130,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text) : '-'
+ },
+ {
+ title: '生态流量(m³/s)',
+ dataIndex: 'qec',
+ width: 130,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(1) : '-'
+ },
+ {
+ title: '生态流量限值(m³/s)',
+ dataIndex: 'qecLimit',
+ width: 150,
+ customRender: ({ text }: any) =>
+ text !== undefined && text !== null ? Number(text).toFixed(1) : '-'
+ }
+ ],
+ 'swjc.tabs.jcsj': []
+ };
+
+ const swjcColumns = computed(() => {
+ if (isSummaryMode.value) {
+ return summaryModeColumns;
+ }
+ if (isDeepMode.value) {
+ return [...baseWaterTempColumns, ...deepModeExtraColumns];
+ }
+ return baseWaterTempColumns;
+ });
+
+ const currentColumns = computed(() => {
+ if (activeTabKey.value === 'swjc.tabs.jcsj') {
+ return swjcColumns.value;
+ }
+ return (
+ tableColumnsConfig[activeTabKey.value] ||
+ tableColumnsConfig['dzxq.tabs.jcsj']
+ );
+ });
+
+ const tableScrollX = computed(() => {
+ const columns = currentColumns.value;
+ const totalWidth = columns.reduce(
+ (sum: number, col: any) => sum + (col.width || 100),
+ 0
+ );
+ return totalWidth > 600 ? totalWidth : undefined;
+ });
+
+ // ==================== 合计行配置 ====================
+ const dataPathMap: Record = {
+ wt: 'wt',
+ iwt_wt: 'iwtDataVo.wt',
+ natureTmp: 'natureTmp',
+ tmp_at: 'tmpDataVo.at',
+ hydropw_qo: 'hydropwDataVo.qo',
+ hydropw_qi: 'hydropwDataVo.qi',
+ deep_wt: 'wtvtDataVo.wthg',
+ vert_wt: 'wtvtDataVo.vwt'
+ };
+
+ const summaryColumns = computed(() => {
+ if (activeTabKey.value !== 'swjc.tabs.jcsj') return [];
+ const cols = currentColumns.value
+ .filter((col: any) => col.summary === true)
+ .map((col: any, idx: number) => ({
+ ...col,
+ summaryIndex: idx + 1
+ }));
+ return cols;
+ });
+
+ const getNestedValue = (obj: any, path: string) => {
+ if (!path || !obj) return undefined;
+ return path.split('.').reduce((acc, key) => acc?.[key], obj);
+ };
+
+ const calcSummary = (dataIndex: string, type: 'max' | 'min' | 'avg') => {
+ const data = Array.isArray(chartData.value) ? chartData.value : [];
+ if (!data || data.length === 0) return null;
+
+ const dataPath = dataPathMap[dataIndex] || dataIndex;
+ const values = data
+ .map((r: any) => {
+ const val = getNestedValue(r, dataPath);
+ return val !== null && val !== undefined && val !== '-'
+ ? Number(val)
+ : NaN;
+ })
+ .filter((v: number) => !isNaN(v));
+
+ if (values.length === 0) return null;
+
+ if (type === 'max') return Math.max(...values);
+ if (type === 'min') return Math.min(...values);
+ return values.reduce((s, v) => s + v, 0) / values.length;
+ };
+
+ const getSummaryTime = (dataIndex: string, type: 'max' | 'min') => {
+ const data = Array.isArray(chartData.value) ? chartData.value : [];
+ if (!data || data.length === 0) return '';
+
+ const dataPath = dataPathMap[dataIndex] || dataIndex;
+ const records = data.filter((r: any) => {
+ const val = getNestedValue(r, dataPath);
+ return val !== null && val !== undefined && val !== '-';
+ });
+ if (records.length === 0) return '';
+
+ const target = Math[type](
+ ...records.map((r: any) => Number(getNestedValue(r, dataPath)))
+ );
+ const record = records.find(
+ (r: any) => Number(getNestedValue(r, dataPath)) === target
+ );
+ return record?.tm ? dayjs(record.tm).format('YYYY-MM-DD HH:mm:ss') : '';
+ };
+
+ const formatSummaryValue = (dataIndex: string, value: number | null) => {
+ if (value === null) return '-';
+ if (dataIndex.includes('qo') || dataIndex.includes('qi')) {
+ return Number(value).toFixed(3);
+ }
+ if (dataIndex === 'deep_wt') {
+ return Number(value).toFixed(2);
+ }
+ return Number(value).toFixed(1);
+ };
+
+ const summaryRows = computed(() => {
+ if (activeTabKey.value !== 'swjc.tabs.jcsj') return [];
+ if (isDataEmpty.value) return [];
+
+ const rows = [
+ {
+ label: '最大值',
+ showTime: true,
+ cells: {} as Record
+ },
+ {
+ label: '最小值',
+ showTime: true,
+ cells: {} as Record
+ },
+ {
+ label: '平均值',
+ showTime: false,
+ cells: {} as Record
+ }
+ ];
+
+ summaryColumns.value.forEach((col: any) => {
+ const dataIndex = col.dataIndex;
+ const maxVal = calcSummary(dataIndex, 'max');
+ const minVal = calcSummary(dataIndex, 'min');
+ const avgVal = calcSummary(dataIndex, 'avg');
+
+ rows[0].cells[dataIndex] = {
+ value: formatSummaryValue(dataIndex, maxVal),
+ time: maxVal !== null ? getSummaryTime(dataIndex, 'max') : ''
+ };
+ rows[1].cells[dataIndex] = {
+ value: formatSummaryValue(dataIndex, minVal),
+ time: minVal !== null ? getSummaryTime(dataIndex, 'min') : ''
+ };
+ rows[2].cells[dataIndex] = {
+ value: formatSummaryValue(dataIndex, avgVal),
+ time: ''
+ };
+ });
+
+ return rows;
+ });
+
+ return {
+ // state
+ selectedColumns,
+ showSummaryCheckbox,
+ showDeepCheckbox,
+ isDataEmpty,
+ // computed
+ filteredCheckBoxOptions,
+ isDeepMode,
+ isSummaryMode,
+ currentChartMode,
+ currentColumns,
+ tableScrollX,
+ summaryColumns,
+ summaryRows,
+ // methods
+ handleCheckboxChange
+ };
+}
diff --git a/frontend/src/modules/qixidibaohugongzuokaizhanQK/qixidiheduanjianceqingkuangEJ/index.vue b/frontend/src/modules/qixidibaohugongzuokaizhanQK/qixidiheduanjianceqingkuangEJ/index.vue
index bb17a347..21e1760d 100644
--- a/frontend/src/modules/qixidibaohugongzuokaizhanQK/qixidiheduanjianceqingkuangEJ/index.vue
+++ b/frontend/src/modules/qixidibaohugongzuokaizhanQK/qixidiheduanjianceqingkuangEJ/index.vue
@@ -1,237 +1,244 @@
-