From 8e5cbdc7562b1d75d900b63d53ae1a9006b07577 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期一, 08 七月 2024 13:43:36 +0800
Subject: [PATCH] Merge branch 'master' of http://47.103.154.90:83/r/IStation/shys/Web.Ch.V1.0

---
 customer_list/ch/static/config/route.js                                    |    9 
 src/api/dispatch/dispatch.ts                                               |   20 
 src/views/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue |  961 --------------------------
 src/projectCom/curve/runPoint/RunPointAnalysisCom.vue                      |  904 +++++++++++++++++++++++++
 customer_list/ch/static/config/globalConfig.js                             |    2 
 src/views/project/ch/efficiencyAnalysis/scheduling/SchedulingAnalysis.vue  |  200 +++++
 6 files changed, 1,158 insertions(+), 938 deletions(-)

diff --git a/customer_list/ch/static/config/globalConfig.js b/customer_list/ch/static/config/globalConfig.js
index 21a4027..5db7bad 100644
--- a/customer_list/ch/static/config/globalConfig.js
+++ b/customer_list/ch/static/config/globalConfig.js
@@ -7,7 +7,7 @@
 	ICPLicense: '娌狪CP澶�14049296鍙�-2',
 
 	WebApiUrl: {
-		MainUrl: 'http://101.133.133.173:97',
+		MainUrl: 'http://101.133.133.173:9010',
 		AuthUrl: 'http://47.100.245.85:8190/',
 	},
 	SoftWareInfo: {
diff --git a/customer_list/ch/static/config/route.js b/customer_list/ch/static/config/route.js
index b18239b..6f24694 100644
--- a/customer_list/ch/static/config/route.js
+++ b/customer_list/ch/static/config/route.js
@@ -8,6 +8,15 @@
 		component: '/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue',
 		redirect: null,
 	},
+	//璋冨害鍒嗘瀽
+	{
+		name: 'SchedulingAnalysis',
+		isKeepAlive: true,
+		isAffix: false,
+		path: '/efficiencyAnalysis/schedulingAnalysis',
+		component: '/project/ch/efficiencyAnalysis/scheduling/SchedulingAnalysis.vue',
+		redirect: null,
+	},
 	{ name: 'UserManage', isKeepAlive: true, isAffix: false, path: '/auth/userManage', component: '/auth/userManage/UserManage.vue' },
 	{ name: 'AccessLog', isKeepAlive: true, isAffix: false, path: '/auth/accessLog', component: '/auth/accessLog/AccessLog.vue' },
 	{
diff --git a/src/api/dispatch/dispatch.ts b/src/api/dispatch/dispatch.ts
new file mode 100644
index 0000000..060e875
--- /dev/null
+++ b/src/api/dispatch/dispatch.ts
@@ -0,0 +1,20 @@
+import request from '/@/utils/request';
+/**
+ * @summary 鑾峰彇宸︿晶娉电珯鏍�
+ */
+export const GetStationList = async () => {
+	return request({
+		url: '/ChenHang/Dispatch/GetStationList@V1.0',
+		method: 'GET',
+	});
+};
+/**
+ * @summary 璁$畻
+ */
+export const CalculateScheduling = (data) => {
+	return request({
+		url: '/ChenHang/Dispatch/Calculate@V1.0',
+		method: 'post',
+		data,
+	});
+};
\ No newline at end of file
diff --git a/src/projectCom/curve/runPoint/RunPointAnalysisCom.vue b/src/projectCom/curve/runPoint/RunPointAnalysisCom.vue
new file mode 100644
index 0000000..49ef813
--- /dev/null
+++ b/src/projectCom/curve/runPoint/RunPointAnalysisCom.vue
@@ -0,0 +1,904 @@
+<template>
+	<el-card class="flex-auto scroll-table-card" shadow="hover">
+		<el-tabs v-model="state.activeName" class="w100 h100">
+			<el-tab-pane label="鐑姏鍥�" name="heatMapPage" class="w100 h100">
+				<div class="box_right_title form_m1">
+					<span class="mr15">杩愯鍒嗘瀽</span>
+					<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm">
+						<el-form-item label="鏃ユ湡">
+							<el-date-picker
+								v-model="state.queryQHForm.themetime"
+								range-separator="~"
+								start-placeholder="寮�濮嬫棩鏈�"
+								end-placeholder="缁撴潫鏃ユ湡"
+								:disabled-date="disablesDate"
+								type="daterange"
+								:default-time="defaultTime"
+								clearable
+								value-format="YYYY-MM-DD"
+								@change="getDateTime"
+								size="small"
+							/>
+						</el-form-item>
+						<el-form-item>
+							<el-button class="ml10" @click="timeQuery()" size="small" type="primary">鏌ヨ</el-button>
+						</el-form-item>
+					</el-form>
+				</div>
+				<div class="setQHForm">
+					<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm" :rules="queryQHRules">
+						<el-form-item label="娴侀噺闂撮殧鍊�" prop="Qspace">
+							<el-input-number
+								v-model="state.queryQHForm.Qspace"
+								placeholder="娴侀噺闂撮殧鍊�"
+								autocomplete="off"
+								:controls="false"
+								style="width: 100px"
+								:min="1"
+								@input="flowIntervalValue"
+							></el-input-number>
+						</el-form-item>
+						<el-form-item label="鎵▼闂撮殧鍊�" prop="Hspace">
+							<el-input-number
+								v-model="state.queryQHForm.Hspace"
+								placeholder="鎵▼闂撮殧鍊�"
+								:controls="false"
+								style="width: 100px"
+								autocomplete="off"
+								@input="headIntervalValue"
+							></el-input-number>
+						</el-form-item>
+					</el-form>
+
+					<el-form :model="state.QHForm" :inline="true">
+						<el-form-item label="鏄剧ず鍊�" label-width="65px">
+							<el-switch v-model="state.QHForm.showValue" @change="isShowQHValue" />
+						</el-form-item>
+						<!-- @change="isShowTOrP" -->
+						<el-form-item label="鏃堕棿鎴栧姛鐜�" label-width="95px">
+							<el-switch v-model="state.QHForm.tOrP" @change="tOrPChange" />
+						</el-form-item>
+					</el-form>
+				</div>
+				<div style="display: flex; height: calc(100% - 120px)">
+					<div id="chartHeatmapBox" class="chart" style="width: calc(100% - 0px); height: calc(100% - 0px)"></div>
+				</div>
+			</el-tab-pane>
+			<el-tab-pane label="绮剧‘鏌ヨ" name="cacurateQueryPage">
+				<el-row :gutter="8" class="h100">
+					<el-col :span="20" :xs="24" class="flex-column h100">
+						<div>
+							<div class="box_right_title form_m1">
+								<span class="mr15">杩愯鍒嗘瀽</span>
+								<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm">
+									<el-form-item label="鏃ユ湡">
+										<el-date-picker
+											v-model="state.queryQHForm.themetime"
+											range-separator="~"
+											start-placeholder="寮�濮嬫棩鏈�"
+											end-placeholder="缁撴潫鏃ユ湡"
+											:disabled-date="disablesDate"
+											type="daterange"
+											:default-time="defaultTime"
+											clearable
+											value-format="YYYY-MM-DD"
+											@change="getDateTime"
+											size="small"
+										/>
+									</el-form-item>
+								</el-form>
+							</div>
+							<el-table
+								class="mt10"
+								ref="draggableTableRef"
+								border
+								row-key="ID"
+								:cell-style="{ textAlign: 'center' }"
+								:header-cell-style="{ textAlign: 'center' }"
+								:data="state.displayTableData"
+								style="width: 100%"
+								highlight-current-row
+								height="670"
+							>
+								<el-table-column type="index" label="搴忓彿" fixed="left" show-overflow-tooltip width="150" />
+								<el-table-column prop="Name" label="娉电粍鍚�" show-overflow-tooltip width="150"> </el-table-column>
+								<el-table-column prop="Qavg" label="娴侀噺" show-overflow-tooltip width="150" />
+								<el-table-column prop="Havg" width="150" label="鎵▼" show-overflow-tooltip />
+								<el-table-column prop="Pavg" width="150" label="鍔熺巼(kW)" show-overflow-tooltip />
+								<el-table-column label="杩愯鏃堕棿(h)" show-overflow-tooltip prop="Tsum" fixed="right"> </el-table-column>
+							</el-table>
+						</div>
+					</el-col>
+					<el-col :span="4" :xs="24" class="flex-column h100">
+						<div class="box_right_title">鍒嗘瀽鍙傛暟</div>
+						<div class="mt10">
+							<el-form label-width="45px" :model="state.analyzeForm" class="formLabel_size">
+								<div class="flex flex-space-between">
+									<el-form-item label="娴侀噺">
+										<el-input v-model="state.analyzeForm.Q" @input="verifiyInstant($event, 1)" class="analyseInput_left" />
+									</el-form-item>
+									<el-form-item label="鍋忓樊鍊�" label-width="56px">
+										<el-input
+											v-model="state.analyzeForm.deviationQValue"
+											@input="verifiyInstant($event, 2)"
+											class="analyseInput_right"
+										/>
+									</el-form-item>
+								</div>
+								<div class="flex flex-space-between">
+									<el-form-item label="鎵▼">
+										<el-input v-model="state.analyzeForm.H" @input="verifiyInstant($event, 3)" class="analyseInput_left" />
+									</el-form-item>
+									<el-form-item label="鍋忓樊鍊�" label-width="56px">
+										<el-input
+											v-model="state.analyzeForm.deviationHValue"
+											@input="verifiyInstant($event, 4)"
+											class="analyseInput_right"
+										/>
+									</el-form-item>
+								</div>
+							</el-form>
+						</div>
+						<div class="box_right_title mt10">鍋忓樊鑼冨洿</div>
+						<div class="mt10">
+							<el-form label-width="45px" :model="state.deviationForm">
+								<div class="flex flex-space-between">
+									<el-form-item label="娴侀噺">
+										<el-input v-model="state.deviationForm.QdStart" @input="verifiyInstant($event, 5)" class="deviationInput" />
+										<span style="color: #ccc; padding: 0px 4px"> 锝� </span>
+										<el-input v-model="state.deviationForm.QdEnd" @input="verifiyInstant($event, 6)" class="deviationInput" />
+									</el-form-item>
+								</div>
+								<div class="flex flex-space-between mt10">
+									<el-form-item label="鎵▼">
+										<el-input v-model="state.deviationForm.HdStart" @input="verifiyInstant($event, 7)" class="deviationInput" />
+										<span style="color: #ccc; padding: 0px 4px"> 锝� </span>
+										<el-input v-model="state.deviationForm.HdEnd" @input="verifiyInstant($event, 8)" class="deviationInput" />
+									</el-form-item>
+								</div>
+								<el-form-item>
+									<el-button class="ml10 mt10" type="primary" @click="getTableDetail()">鏌ヨ</el-button>
+								</el-form-item>
+							</el-form>
+						</div>
+					</el-col>
+				</el-row>
+			</el-tab-pane>
+		</el-tabs>
+	</el-card>
+	<el-dialog
+		:destroy-on-close="true"
+		v-model="state.heatmapDetailShow"
+		width="700px"
+		:close-on-click-modal="false"
+		@closed="closeDialog"
+		:title="state.dialogTitle"
+	>
+		<div style="display: flex; height: 400px; width: 100%">
+			<div id="chartPie" class="chart" style="width: calc(100% - 0px); height: calc(100% - 0px)"></div>
+		</div>
+
+		<el-table
+			ref="draggableTableRef"
+			border
+			:cell-style="{ textAlign: 'center' }"
+			:header-cell-style="{ textAlign: 'center' }"
+			:data="state.pieData"
+			style="width: 100%"
+			highlight-current-row
+		>
+			<el-table-column type="index" label="搴忓彿" show-overflow-tooltip width="70" />
+			<el-table-column prop="Name" label="娉电粍鍚�" show-overflow-tooltip width="130"> </el-table-column>
+			<el-table-column prop="Qavg" label="娴侀噺" show-overflow-tooltip width="110" />
+			<el-table-column prop="Havg" width="90" label="鎵▼" show-overflow-tooltip />
+			<el-table-column prop="Pavg" width="130" label="鍔熺巼(kW)" show-overflow-tooltip />
+			<el-table-column label="杩愯鏃堕棿(h)" show-overflow-tooltip prop="Tsum"> </el-table-column>
+		</el-table>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import * as echarts from 'echarts';
+import { ElMessage } from 'element-plus';
+import moment from 'moment';
+import type { FormRules } from 'vue';
+import { onActivated, onMounted, reactive, ref, shallowRef, toRefs } from 'vue';
+import { GetRectDetailListOfDayRange, GetRectListOfDayRange } from '/@/api/eta/runHeat';
+import { LOGIC_SITE_CODE } from '/@/constants';
+import { uniqueInArray } from '/@/utils/istation/common.js';
+import { verifyNumberComma } from '/@/utils/toolsValidate';
+const defaultTime = ref<[Date, Date]>([new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]);
+// 瀹氫箟鍙橀噺鍐呭
+const state = reactive({
+	chartData: [],
+	echartTitle: '',
+	queryQHForm: {
+		Qspace: 100,
+		Hspace: 1,
+		themetime: '',
+	} as any,
+	QHForm: {
+		showValue: false,
+		tOrP: true,
+	},
+	heatmapDetailShow: false, //鎵撳紑鐑姏鍥剧殑璇︾粏 锛堥粯璁ゅ叧闂級
+	dialogTitle: '娉电粍鍚堜俊鎭�', //璇︾粏鐨勫悕瀛�
+	pieData: [], //楗煎浘鏁版嵁婧�
+	activeName: 'heatMapPage', //榛樿閫変腑鐑姏鍥�
+	displayTableData: [], //绮剧‘鏌ヨ鏁版嵁
+	analyzeForm: {
+		deviationQValue: 50,
+		deviationHValue: 0.5,
+	} as any, //鍒嗘瀽鍙傛暟
+	deviationForm: {} as any, //鍋忓樊鑼冨洿
+	min: '',
+	max: '',
+	runTimeData: [],
+	minE: '',
+	maxE: '',
+	eData: [],
+});
+const m_chartHeatmapBox = shallowRef();
+const m_chartPie = shallowRef();
+const queryQHFormRef = ref();
+//#region ====================== 鍥捐〃浼犲弬 ======================
+const props = defineProps({
+	currentListID: String,
+	queryDisabled: {
+		type: Boolean,
+		default: false,
+	},
+	pumpTitle: String,
+});
+let { currentListID, queryDisabled, pumpTitle } = toRefs(props);
+//#endregion
+//#region ====================== 璁剧疆鏃堕棿浜嬩欢 ======================
+//榛樿鏃堕棿閫夋嫨鍓�7澶�/榛樿閫夋嫨褰撳ぉ
+const getdatatime = () => {
+	let sevenAgo = moment(new Date()).subtract(7, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss');
+	let today = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss');
+	return [sevenAgo, today];
+};
+//鑾峰彇鏃ユ湡鐨勬椂闂�
+const getDateTime = (val) => {
+	if (val == null) {
+		return ElMessage.warning('璇烽�夋嫨鏃堕棿');
+	}
+	state.queryQHForm.themetime[0] = val[0];
+	state.queryQHForm.themetime[1] = val[1];
+};
+// 鏃堕棿闄愬埗
+const disablesDate = (time) => {
+	return time.getTime() > new Date().getTime();
+};
+//鏌ヨ鏃堕棿
+const timeQuery = async () => {
+	if (!queryQHFormRef.value) return;
+	await queryQHFormRef.value.validate(async (valid, fields) => {
+		if (valid) {
+			getChartList();
+		} else {
+			return ElMessage.error('蹇呭~椤�!');
+		}
+	});
+};
+//#endregion
+//#region ====================== 琛ㄥ崟楠岃瘉 ======================
+const queryQHRules = reactive<FormRules>({
+	Qspace: [{ required: true, message: '鍙兘杈撳叆鏁板瓧', trigger: 'blur' }],
+	Hspace: [{ required: true, message: '鍙兘杈撳叆鏁板瓧', trigger: 'blur' }],
+});
+//#endregion
+//#region ====================== 鍥捐〃 鎵▼/鏁堢巼/init======================
+//閫氳繃 鏃ユ湡鏇茬嚎鑾峰彇鐑姏鍥惧浘琛ㄦ暟鎹�
+const getChartList = async () => {
+	await GetRectListOfDayRange({
+		ObjectType: LOGIC_SITE_CODE,
+		ObjectID: currentListID.value,
+		Qspace: state.queryQHForm.Qspace,
+		Hspace: state.queryQHForm.Hspace,
+		StartDay: state.queryQHForm.themetime[0],
+		EndDay: state.queryQHForm.themetime[1],
+	}).then((res) => {
+		let result = res.Data;
+		if (res.Code != 0) {
+			state.chartData = [];
+			m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
+			return;
+		}
+		if (res.Data == null || res.Data.length == 0) {
+			state.chartData = [];
+			m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
+			return ElMessage.warning('鏆傛棤鏁版嵁');
+		}
+		state.chartData = result || [];
+
+		setTimeout(() => {
+			//鍒濆鍖栧浘琛�
+			BuildchartHeatmapBox();
+		}, 100);
+	});
+};
+//  鍒濆鍖栨祦閲忔壃绋嬪浘琛�
+const BuildchartHeatmapBox = () => {
+	m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
+	if (state.chartData.length == 0) return;
+	//鍏堣幏鍙朌om涓婄殑瀹炰緥
+	let chartDom = echarts.getInstanceByDom(document.getElementById('chartHeatmapBox') as HTMLDivElement);
+	//鐒跺悗鍒ゆ柇瀹炰緥鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪锛屽氨鍒涘缓鏂板疄渚�
+	if (chartDom == null) {
+		chartDom = echarts.init(document.getElementById('chartHeatmapBox') as HTMLDivElement);
+	}
+	m_chartHeatmapBox.value = chartDom;
+	var xData = [];
+	var yData = [];
+	var runTimeData = [];
+	var eData = [];
+	for (var i = 0; i < state.chartData.length; i++) {
+		var node = state.chartData[i];
+		if (node.Tsum != 0) {
+			var x = parseFloat(((node.Qmax + node.Qmin) / 2).toFixed(4));
+			var y = parseFloat(((node.Hmax + node.Hmin) / 2).toFixed(4));
+			var time = parseFloat((node.Tsum / 60 / 60).toFixed(3));
+			x = node.Qmax;
+			y = node.Hmax;
+
+			xData.push(x);
+			yData.push(y);
+			node.Tsum = time;
+			runTimeData.push({ rect_data: node, value: [x.toString(), y.toString(), node.Tsum, node] });
+			eData.push({ rect_data: node, value: [x.toString(), y.toString(), node.Eavg, node] }); //Eavg 鏁堢巼
+		}
+	}
+	xData = uniqueInArray(xData); //鍘婚噸
+	yData = uniqueInArray(yData); //鍘婚噸
+	yData.sort(compareNumbers);
+	var max = 1;
+	var min = 0;
+	var maxE = 100;
+	var minE = 0;
+	if (state.chartData.length != 0) {
+		max = Math.max.apply(
+			Math,
+			state.chartData.map((item) => {
+				return item.Tsum;
+			})
+		); //鏁版嵁鐨勬渶澶у��
+		min = Math.min.apply(
+			Math,
+			state.chartData.map((item) => {
+				return item.Tsum;
+			})
+		); //鏁版嵁鐨勬渶灏忓��
+		maxE = Math.max.apply(
+			Math,
+			state.chartData.map((item) => {
+				return item.Eavg;
+			})
+		); //鏁堢巼鏁版嵁鐨勬渶澶у��
+		var minValE = [];
+		state.chartData.forEach((item) => {
+			if (item.Eavg != 0) {
+				minValE.push(item.Eavg);
+			}
+		});
+		minE = Math.min.apply(Math, minValE); //鏁堢巼鏁版嵁鐨勬渶灏忓��
+	}
+	// console.log(xData, yData, runTimeData);
+	//console.log(max,min)
+	runTimeData = runTimeData.map(function (item) {
+		return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2] || '-'] };
+		//return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2]] };
+	});
+
+	eData = eData.map(function (item) {
+		return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2] || '-'] };
+	});
+	var option = {
+		tooltip: {
+			//position: 'top'
+			formatter: function (p) {
+				//console.log(p.data)
+				if (!p.data) {
+					return '';
+				}
+				return (
+					p.data.rect_data.Qmin +
+					'-' +
+					p.data.rect_data.Qmax +
+					'</br>' +
+					p.marker +
+					'鏃堕棿: ' +
+					p.data.rect_data.Tsum +
+					'灏忔椂 &nbsp;&nbsp; 鏁堢巼: ' +
+					p.data.rect_data.Eavg +
+					'%'
+				);
+			},
+		},
+		animation: false,
+		grid: {
+			containLabel: true,
+			left: '80',
+			right: '80',
+			top: '70',
+			bottom: '15',
+		},
+		legend: {
+			data: ['鏁堢巼', '杩愯鏃堕棿'],
+		},
+		xAxis: {
+			name: '娴侀噺(m鲁)',
+			type: 'category', //category log
+			data: xData,
+			//boundaryGap:false,
+			splitArea: {
+				show: true,
+				interval: 0,
+			},
+			axisLabel: {
+				//formatter: function (value, index) {
+				//    console.log(value, index)
+				//    return value
+				//}
+			},
+			axisTick: {
+				alignWithLabel: true,
+			},
+			axisPointer: {
+				show: true,
+				type: 'shadow',
+			},
+		},
+		yAxis: {
+			name: '鎵▼(m)',
+			type: 'category',
+			data: yData,
+			splitArea: {
+				show: true,
+				interval: 0,
+			},
+			axisTick: {
+				alignWithLabel: true,
+			},
+			axisPointer: {
+				show: true,
+				type: 'shadow',
+			},
+		},
+		visualMap: [
+			{
+				min: min,
+				max: max,
+				calculable: true,
+				text: ['鏃堕棿:(灏忔椂)', ''],
+				textGap: 20,
+				realtime: false,
+				//orient:'horizontal',
+				top: 'middle',
+				inRange: {
+					color: ['#2ba2ee', '#f32cb7'], //['#2ba2ee', '#f32cb7'] //['#313695', '#a50026']
+				},
+				////color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
+			},
+		],
+		series: [
+			{
+				name: '杩愯鏃堕棿',
+				type: 'heatmap',
+				data: runTimeData,
+				label: {
+					show: false,
+				},
+				emphasis: {
+					itemStyle: {
+						shadowBlur: 10,
+						shadowColor: 'rgba(0, 0, 0, 0.5)',
+					},
+				},
+			},
+		],
+	};
+	// 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
+	m_chartHeatmapBox.value.setOption(option, true);
+	m_chartHeatmapBox.value.setOption({
+		visualMap: [
+			{
+				min: min,
+				max: max,
+				range: [min, max],
+			},
+		],
+	});
+	m_chartHeatmapBox.value.on('click', function (obj) {
+		let node = obj.data.rect_data;
+		let QAve = (node.Qmin + node.Qmax) / 2;
+		let HAve = (node.Hmin + node.Hmax) / 2;
+		state.deviationForm.QdStart = node.Qmin;
+		state.deviationForm.QdEnd = node.Qmax;
+		state.analyzeForm.Q = QAve;
+		state.deviationForm.HdStart = node.Hmin;
+		state.deviationForm.HdEnd = node.Hmax;
+		state.analyzeForm.H = HAve;
+		setChartTableDialog(node.Qmin, node.Qmax, node.Hmin, node.Hmax);
+	});
+	state.min = min;
+	state.max = max;
+	state.runTimeData = runTimeData;
+	state.minE = minE;
+	state.maxE = maxE;
+	state.eData = eData;
+	window.addEventListener('resize', selfAdaption);
+};
+const compareNumbers = (a, b) => {
+	return a - b; // 浠庡皬鍒板ぇ鎺掑簭
+};
+//鎵撳紑寮圭獥
+const setChartTableDialog = async (qLower, qUpper, hLower, hUpper) => {
+	state.heatmapDetailShow = true;
+	await GetRectDetailListOfDayRange({
+		ObjectType: LOGIC_SITE_CODE,
+		ObjectID: currentListID.value,
+		Qmin: qLower,
+		Qmax: qUpper,
+		Hmin: hLower,
+		Hmax: hUpper,
+		StartDay: state.queryQHForm.themetime[0],
+		EndDay: state.queryQHForm.themetime[1],
+	}).then((res) => {
+		let result = res.Data;
+		if (res.Code != 0) {
+			state.pieData = [];
+			m_chartPie.value && m_chartPie.value.clear();
+			return;
+		}
+		if (res.Data == null || res.Data.length == 0) {
+			state.pieData = [];
+			m_chartPie.value && m_chartPie.value.clear();
+			return ElMessage.warning('楗煎浘鏆傛棤鏁版嵁');
+		}
+		result.forEach((item) => (item.Tsum = (item.Tsum / 60 / 60).toFixed(2)));
+		state.pieData = result || [];
+		setTimeout(() => {
+			//鍒濆鍖栭ゼ鍥�
+			buildPieChartBox();
+		}, 100);
+	});
+};
+// 鍒濆鍖栭ゼ鍥�
+const buildPieChartBox = () => {
+	m_chartPie.value && m_chartPie.value.clear();
+	if (state.pieData.length == 0) return;
+	//鍏堣幏鍙朌om涓婄殑瀹炰緥
+	let chartDom = echarts.getInstanceByDom(document.getElementById('chartPie') as HTMLDivElement);
+	//鐒跺悗鍒ゆ柇瀹炰緥鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪锛屽氨鍒涘缓鏂板疄渚�
+	if (chartDom == null) {
+		chartDom = echarts.init(document.getElementById('chartPie') as HTMLDivElement);
+	}
+	m_chartPie.value = chartDom;
+	var seriesData = [];
+	for (var i = 0; i < state.pieData.length; i++) {
+		var item = state.pieData[i];
+		seriesData.push({ value: parseFloat(item.Tsum), name: item.Name });
+	}
+	let option = {
+		title: {
+			text: '',
+			subtext: '',
+			left: 'center',
+		},
+		tooltip: {
+			trigger: 'item',
+		},
+		legend: {
+			orient: 'vertical',
+			left: 'left',
+		},
+		series: [
+			{
+				name: '杩愯鏃堕棿',
+				type: 'pie',
+				radius: '50%',
+				data: seriesData,
+				label: {
+					show: true,
+					formatter: '{b}{a}锛歿c}灏忔椂',
+				},
+				emphasis: {
+					itemStyle: {
+						shadowBlur: 10,
+						shadowOffsetX: 0,
+						shadowColor: 'rgba(0, 0, 0, 0.5)',
+					},
+				},
+			},
+		],
+	};
+	m_chartPie.value.setOption(option, true);
+	m_chartPie.value && m_chartPie.value.resize();
+};
+//鍏抽棴寮圭獥
+const closeDialog = () => {
+	state.heatmapDetailShow = false;
+};
+//  鐑姏鍥捐嚜閫傚簲
+const selfAdaption = () => {
+	if (!m_chartHeatmapBox.value) return;
+	m_chartHeatmapBox.value.resize();
+};
+//  楗煎浘鑷�傚簲
+const selfPipeAdaption = () => {
+	if (!m_chartPie.value) return;
+	m_chartPie.value.resize();
+};
+//#endregion
+//#region ====================== 鏄惁鏄剧ず鍊�/鏃堕棿/鍔熺巼 ======================
+const isShowQHValue = () => {
+	if (state.QHForm.showValue) {
+		m_chartHeatmapBox.value &&
+			m_chartHeatmapBox.value.setOption({
+				series: [
+					{
+						label: {
+							show: true,
+							color: 'white',
+						},
+					},
+				],
+			});
+	} else {
+		m_chartHeatmapBox.value &&
+			m_chartHeatmapBox.value.setOption({
+				series: [
+					{
+						label: {
+							show: false,
+						},
+					},
+				],
+			});
+	}
+};
+const tOrPChange = (val) => {
+	state.QHForm.tOrP = val;
+	isShowTOrP();
+};
+const isShowTOrP = () => {
+	var isRunTime = true;
+	if (state.QHForm.tOrP) {
+		m_chartHeatmapBox.value.setOption({
+			visualMap: [
+				{
+					min: state.min,
+					max: state.max,
+					text: ['鏃堕棿:(灏忔椂)', ''],
+					range: [state.min, state.max],
+					inRange: {
+						color: ['#2ba2ee', '#f32cb7'],
+					},
+				},
+			],
+			series: [
+				{
+					name: '杩愯鏃堕棿',
+					data: state.runTimeData,
+				},
+			],
+		});
+		isRunTime = true;
+	} else {
+		m_chartHeatmapBox.value.setOption({
+			visualMap: [
+				{
+					min: state.minE,
+					max: state.maxE,
+					text: ['鏁堢巼:(%)', ''],
+					range: [state.minE, state.maxE],
+					inRange: {
+						color: ['#ccc', '#332cb7'],
+					},
+				},
+			],
+
+			series: [
+				{
+					name: '鏁堢巼',
+					data: state.eData,
+				},
+			],
+		});
+		isRunTime = false;
+	}
+};
+
+//#endregion
+//#region ====================== 鍒囨崲鎴愮簿纭煡璇� ======================
+//楠岃瘉鐨勬椂鍊欏彧鑳借緭鍏ユ暟瀛�
+const verifiyInstant = (val, type) => {
+	switch (type) {
+		case 1:
+			if (state.analyzeForm.Q == '') return;
+			state.analyzeForm.Q = verifyNumberComma(val);
+			let qLowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
+			let qUpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
+			state.deviationForm.QdStart = qLowerValue; //娴侀噺鍋忓樊鏈�灏忓��
+			state.deviationForm.QdEnd = qUpperValue; //娴侀噺鍋忓樊鏈�澶у��
+
+			break;
+		case 2:
+			if (state.analyzeForm.deviationQValue == '') return;
+			state.analyzeForm.deviationQValue = verifyNumberComma(val);
+			let q_LowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
+			let q_UpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
+			state.deviationForm.QdStart = q_LowerValue; //娴侀噺鍋忓樊鏈�灏忓��
+			state.deviationForm.QdEnd = q_UpperValue; //娴侀噺鍋忓樊鏈�澶у��
+
+			break;
+		case 3:
+			if (state.analyzeForm.H == '') return;
+			state.analyzeForm.H = verifyNumberComma(val);
+			let hLowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
+			let hUpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
+			state.deviationForm.HdStart = hLowerValue; //鎵▼鍋忓樊鏈�灏忓��
+			state.deviationForm.HdEnd = hUpperValue; //鎵▼鍋忓樊鏈�澶у��
+			break;
+		case 4:
+			if (state.analyzeForm.deviationHValue == '') return;
+			state.analyzeForm.deviationHValue = verifyNumberComma(val);
+			let h_LowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
+			let h_UpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
+			state.deviationForm.HdStart = h_LowerValue; //鎵▼鍋忓樊鏈�灏忓��
+			state.deviationForm.HdEnd = h_UpperValue; //鎵▼鍋忓樊鏈�澶у��
+			break;
+		case 5:
+			state.deviationForm.QdStart = verifyNumberComma(val);
+
+			break;
+		case 6:
+			state.deviationForm.QdEnd = verifyNumberComma(val);
+			break;
+		case 7:
+			state.deviationForm.HdStart = verifyNumberComma(val);
+
+			break;
+		case 8:
+			state.deviationForm.HdEnd = verifyNumberComma(val);
+			break;
+	}
+};
+//鐩戝惉娴侀噺闂撮殧鍊�
+const flowIntervalValue = (val) => {
+	// state.analyzeForm.Q = val;
+	var intervalValueFlow = state.queryQHForm.Qspace / 2; //娴侀噺闂撮殧鍊�
+	//灏嗘祦閲忛棿闅斿�煎疄鏃惰祴缁欐祦閲忓亸宸��
+	state.analyzeForm.deviationQValue = intervalValueFlow;
+	var qLowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
+	var qUpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
+	state.deviationForm.QdStart = qLowerValue; //娴侀噺鍋忓樊鏈�灏忓��
+	state.deviationForm.QdEnd = qUpperValue; //娴侀噺鍋忓樊鏈�澶у��
+};
+//鐩戝惉鎵▼闂撮殧鍊�
+const headIntervalValue = (val) => {
+	// state.analyzeForm.Q = val;
+	var intervalValueFlow = state.queryQHForm.Hspace / 2; //鎵▼闂撮殧鍊�
+	//灏嗘壃绋嬮棿闅斿�煎疄鏃惰祴缁欐壃绋嬪亸宸��
+	state.analyzeForm.deviationHValue = intervalValueFlow;
+	var hLowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
+	var hUpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
+	state.deviationForm.HdStart = hLowerValue; //鎵▼鍋忓樊鏈�灏忓��
+	state.deviationForm.HdEnd = hUpperValue; //鎵▼鍋忓樊鏈�澶у��
+};
+const getTableDetail = async () => {
+	var qLowerValue = state.deviationForm.QdStart; //娴侀噺鍋忓樊鏈�灏忓��
+	var qUpperValue = state.deviationForm.QdEnd; //娴侀噺鍋忓樊鏈�澶у��
+	var hLowerValue = state.deviationForm.HdStart; //鎵▼鍋忓樊鏈�灏忓��
+	var hUpperValue = state.deviationForm.HdEnd; //鎵▼鍋忓樊鏈�澶у��
+	if (qLowerValue > qUpperValue && hLowerValue > hUpperValue) {
+		return ElMessage.warning('娴侀噺銆佹壃绋嬪亸宸渶灏忓�间笉鑳藉ぇ浜庢渶澶у��');
+	} else if (qLowerValue > qUpperValue) {
+		return ElMessage.warning('娴侀噺鍋忓樊鏈�灏忓�间笉鑳藉ぇ浜庢渶澶у��');
+	} else if (hLowerValue > hUpperValue) {
+		return ElMessage.warning('鎵▼鍋忓樊鏈�灏忓�间笉鑳藉ぇ浜庢渶澶у��');
+	} else {
+		if (qLowerValue == null || qLowerValue == '') return ElMessage.warning('璇疯緭鍏ユ祦閲�');
+		if (qUpperValue == null || qUpperValue == '') return ElMessage.warning('璇疯緭鍏ユ祦閲�');
+		if (hLowerValue == null || hLowerValue == '') return ElMessage.warning('璇疯緭鍏ユ壃绋�');
+		if (hUpperValue == null || hUpperValue == '') return ElMessage.warning('璇疯緭鍏ユ壃绋�');
+		await GetRectDetailListOfDayRange({
+			ObjectType: LOGIC_SITE_CODE,
+			ObjectID: currentListID.value,
+			Qmin: qLowerValue,
+			Qmax: qUpperValue,
+			Hmin: hLowerValue,
+			Hmax: hUpperValue,
+			StartDay: state.queryQHForm.themetime[0],
+			EndDay: state.queryQHForm.themetime[1],
+		}).then((res) => {
+			let result = res.Data;
+			if (res.Code != 0) {
+				state.displayTableData = [];
+				return;
+			}
+			if (res.Data == null || res.Data.length == 0) {
+				state.displayTableData = [];
+				return ElMessage.warning('琛ㄦ牸鏆傛棤鏁版嵁');
+			}
+			result.forEach((item) => (item.Tsum = (item.Tsum / 60 / 60).toFixed(2)));
+			state.displayTableData = result || [];
+		});
+	}
+};
+//#endregion
+onMounted(() => {
+	let getSevenDate = getdatatime();
+	state.queryQHForm.themetime = getSevenDate;
+	window.addEventListener('resize', selfPipeAdaption);
+});
+onActivated(() => {
+	window.addEventListener('resize', selfPipeAdaption);
+});
+defineExpose({
+	getChartList,
+});
+</script>
+<style scoped lang="scss">
+:deep(.el-tabs__content) {
+	width: 100%;
+	height: calc(100% - 50px);
+}
+.box_right_title {
+	background: linear-gradient(90deg, #2d81d9, #0655b4);
+	color: #fff;
+	height: 30px;
+	line-height: 30px;
+	text-align: left;
+	border-radius: 7px;
+	padding-left: 10px;
+	display: flex;
+}
+.form_m1 {
+	:deep(.el-form-item__label) {
+		color: #ffffff !important;
+	}
+}
+.setQHForm {
+	width: 100%;
+	display: flex;
+	justify-content: flex-start;
+	align-items: center;
+	padding-top: 10px;
+}
+.analyseInput_left {
+	width: 68px;
+	height: 32px;
+	line-height: 32px;
+	// border: 1px solid #cccccc;
+	text-align: center;
+	color: #666;
+}
+.analyseInput_right {
+	width: 45px;
+	height: 32px;
+	line-height: 32px;
+	// border: 1px solid #cccccc;
+	text-align: center;
+	color: #666;
+}
+.deviationInput {
+	width: 68px;
+	height: 32px;
+	line-height: 32px;
+	// border: 1px solid #cccccc;
+	text-align: center;
+	color: #666;
+}
+.formLabel_size {
+	:deep(.el-form-item__label) {
+		font-size: 1rem !important;
+	}
+	:deep(.el-form-item--default) {
+		margin-bottom: 10px !important;
+		line-height: 36px;
+	}
+}
+</style>
diff --git a/src/views/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue b/src/views/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue
index e555f07..1963cf0 100644
--- a/src/views/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue
+++ b/src/views/project/ch/efficiencyAnalysis/curveAnalysis/RunPointAnalysis.vue
@@ -1,973 +1,60 @@
-杩愯鐐瑰垎鏋�
 <template>
+	<!-- 鎬ц兘鏇茬嚎 -->
 	<el-row :gutter="8" class="h100">
 		<el-col :span="4" :xs="24" class="h100">
 			<el-card shadow="hover" class="h100 left-tree-card" v-loading="treeLoading">
-				<LeftTreeByMgr
-					:treedata="listTreeData"
-					:showTitle="false"
-					:currentNodeKey="currentListID"
-					@click="handleClickNode"
-					:defaultProps="state.defaultProps"
-					defaultExpandAll
-					:folderIcon="(_, data) => data.LogicType !== LOGIC_SITE_CODE"
-				>
+				<LeftTreeByMgr :treedata="listTreeData" title-name="娉电珯鍒楄〃" :current-node-key="currentListID" @click="handleClickNode">
 				</LeftTreeByMgr>
 			</el-card>
 		</el-col>
 		<el-col :span="20" :xs="24" class="flex-column h100">
-			<el-card class="flex-auto scroll-table-card" shadow="hover">
-				<el-tabs v-model="state.activeName" class="w100 h100">
-					<el-tab-pane label="鐑姏鍥�" name="heatMapPage" class="w100 h100">
-						<div class="box_right_title form_m1">
-							<span class="mr15">杩愯鍒嗘瀽</span>
-							<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm">
-								<el-form-item label="鏃ユ湡">
-									<el-date-picker
-										v-model="state.queryQHForm.themetime"
-										range-separator="~"
-										start-placeholder="寮�濮嬫棩鏈�"
-										end-placeholder="缁撴潫鏃ユ湡"
-										:disabled-date="disablesDate"
-										type="daterange"
-										:default-time="defaultTime"
-										clearable
-										value-format="YYYY-MM-DD"
-										@change="getDateTime"
-										size="small"
-									/>
-								</el-form-item>
-								<el-form-item>
-									<el-button class="ml10" @click="timeQuery()" size="small" type="primary">鏌ヨ</el-button>
-								</el-form-item>
-							</el-form>
-						</div>
-						<div class="setQHForm">
-							<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm" :rules="queryQHRules">
-								<el-form-item label="娴侀噺闂撮殧鍊�" prop="Qspace">
-									<el-input-number
-										v-model="state.queryQHForm.Qspace"
-										placeholder="娴侀噺闂撮殧鍊�"
-										autocomplete="off"
-										:controls="false"
-										style="width: 100px"
-										:min="1"
-										@input="flowIntervalValue"
-									></el-input-number>
-								</el-form-item>
-								<el-form-item label="鎵▼闂撮殧鍊�" prop="Hspace">
-									<el-input-number
-										v-model="state.queryQHForm.Hspace"
-										placeholder="鎵▼闂撮殧鍊�"
-										:controls="false"
-										style="width: 100px"
-										autocomplete="off"
-										@input="headIntervalValue"
-									></el-input-number>
-								</el-form-item>
-							</el-form>
-
-							<el-form :model="state.QHForm" :inline="true">
-								<el-form-item label="鏄剧ず鍊�" label-width="65px">
-									<el-switch v-model="state.QHForm.showValue" @change="isShowQHValue" />
-								</el-form-item>
-								<!-- @change="isShowTOrP" -->
-								<el-form-item label="鏃堕棿鎴栧姛鐜�" label-width="95px">
-									<el-switch v-model="state.QHForm.tOrP" @change="tOrPChange" />
-								</el-form-item>
-							</el-form>
-						</div>
-						<div style="display: flex; height: calc(100% - 120px)">
-							<div id="chartHeatmapBox" class="chart" style="width: calc(100% - 0px); height: calc(100% - 0px)"></div>
-						</div>
-					</el-tab-pane>
-					<el-tab-pane label="绮剧‘鏌ヨ" name="cacurateQueryPage">
-						<el-row :gutter="8" class="h100">
-							<el-col :span="20" :xs="24" class="flex-column h100">
-								<div>
-									<div class="box_right_title form_m1">
-										<span class="mr15">杩愯鍒嗘瀽</span>
-										<el-form ref="queryQHFormRef" :inline="true" :model="state.queryQHForm">
-											<el-form-item label="鏃ユ湡">
-												<el-date-picker
-													v-model="state.queryQHForm.themetime"
-													range-separator="~"
-													start-placeholder="寮�濮嬫棩鏈�"
-													end-placeholder="缁撴潫鏃ユ湡"
-													:disabled-date="disablesDate"
-													type="daterange"
-													:default-time="defaultTime"
-													clearable
-													value-format="YYYY-MM-DD"
-													@change="getDateTime"
-													size="small"
-												/>
-											</el-form-item>
-										</el-form>
-									</div>
-									<el-table
-										class="mt10"
-										ref="draggableTableRef"
-										border
-										row-key="ID"
-										:cell-style="{ textAlign: 'center' }"
-										:header-cell-style="{ textAlign: 'center' }"
-										:data="state.displayTableData"
-										style="width: 100%"
-										highlight-current-row
-										height="670"
-									>
-										<el-table-column type="index" label="搴忓彿" fixed="left" show-overflow-tooltip width="150" />
-										<el-table-column prop="Name" label="娉电粍鍚�" show-overflow-tooltip width="150"> </el-table-column>
-										<el-table-column prop="Qavg" label="娴侀噺" show-overflow-tooltip width="150" />
-										<el-table-column prop="Havg" width="150" label="鎵▼" show-overflow-tooltip />
-										<el-table-column prop="Pavg" width="150" label="鍔熺巼(kW)" show-overflow-tooltip />
-										<el-table-column label="杩愯鏃堕棿(h)" show-overflow-tooltip prop="Tsum" fixed="right"> </el-table-column>
-									</el-table>
-								</div>
-							</el-col>
-							<el-col :span="4" :xs="24" class="flex-column h100">
-								<div class="box_right_title">鍒嗘瀽鍙傛暟</div>
-								<div class="mt10">
-									<el-form label-width="45px" :model="state.analyzeForm" class="formLabel_size">
-										<div class="flex flex-space-between">
-											<el-form-item label="娴侀噺">
-												<el-input v-model="state.analyzeForm.Q" @input="verifiyInstant($event, 1)" class="analyseInput_left" />
-											</el-form-item>
-											<el-form-item label="鍋忓樊鍊�" label-width="56px">
-												<el-input
-													v-model="state.analyzeForm.deviationQValue"
-													@input="verifiyInstant($event, 2)"
-													class="analyseInput_right"
-												/>
-											</el-form-item>
-										</div>
-										<div class="flex flex-space-between">
-											<el-form-item label="鎵▼">
-												<el-input v-model="state.analyzeForm.H" @input="verifiyInstant($event, 3)" class="analyseInput_left" />
-											</el-form-item>
-											<el-form-item label="鍋忓樊鍊�" label-width="56px">
-												<el-input
-													v-model="state.analyzeForm.deviationHValue"
-													@input="verifiyInstant($event, 4)"
-													class="analyseInput_right"
-												/>
-											</el-form-item>
-										</div>
-									</el-form>
-								</div>
-								<div class="box_right_title mt10">鍋忓樊鑼冨洿</div>
-								<div class="mt10">
-									<el-form label-width="45px" :model="state.deviationForm">
-										<div class="flex flex-space-between">
-											<el-form-item label="娴侀噺">
-												<el-input v-model="state.deviationForm.QdStart" @input="verifiyInstant($event, 5)" class="deviationInput" />
-												<span style="color: #ccc; padding: 0px 4px"> 锝� </span>
-												<el-input v-model="state.deviationForm.QdEnd" @input="verifiyInstant($event, 6)" class="deviationInput" />
-											</el-form-item>
-										</div>
-										<div class="flex flex-space-between mt10">
-											<el-form-item label="鎵▼">
-												<el-input v-model="state.deviationForm.HdStart" @input="verifiyInstant($event, 7)" class="deviationInput" />
-												<span style="color: #ccc; padding: 0px 4px"> 锝� </span>
-												<el-input v-model="state.deviationForm.HdEnd" @input="verifiyInstant($event, 8)" class="deviationInput" />
-											</el-form-item>
-										</div>
-										<el-form-item>
-											<el-button class="ml10 mt10" type="primary" @click="getTableDetail()">鏌ヨ</el-button>
-										</el-form-item>
-									</el-form>
-								</div>
-							</el-col>
-						</el-row>
-					</el-tab-pane>
-				</el-tabs>
-			</el-card>
+			<RunPointAnalysisCom ref="runPointAnalysisRef" :currentListID="currentListID" :pumpTitle="state.echartTitle" />
 		</el-col>
-		<el-dialog
-			:destroy-on-close="true"
-			v-model="state.heatmapDetailShow"
-			width="700px"
-			:close-on-click-modal="false"
-			@closed="closeDialog"
-			:title="state.dialogTitle"
-		>
-			<div style="display: flex; height: 400px; width: 100%">
-				<div id="chartPie" class="chart" style="width: calc(100% - 0px); height: calc(100% - 0px)"></div>
-			</div>
-
-			<el-table
-				ref="draggableTableRef"
-				border
-				:cell-style="{ textAlign: 'center' }"
-				:header-cell-style="{ textAlign: 'center' }"
-				:data="state.pieData"
-				style="width: 100%"
-				highlight-current-row
-			>
-				<el-table-column type="index" label="搴忓彿" show-overflow-tooltip width="70" />
-				<el-table-column prop="Name" label="娉电粍鍚�" show-overflow-tooltip width="130"> </el-table-column>
-				<el-table-column prop="Qavg" label="娴侀噺" show-overflow-tooltip width="110" />
-				<el-table-column prop="Havg" width="90" label="鎵▼" show-overflow-tooltip />
-				<el-table-column prop="Pavg" width="130" label="鍔熺巼(kW)" show-overflow-tooltip />
-				<el-table-column label="杩愯鏃堕棿(h)" show-overflow-tooltip prop="Tsum"> </el-table-column>
-			</el-table>
-		</el-dialog>
 	</el-row>
 </template>
 
 <script setup lang="ts">
-import * as echarts from 'echarts';
-import { ElMessage } from 'element-plus';
+import { computed, nextTick, onMounted, reactive, ref } from 'vue';
+import { GetStationList } from '/@/api/dispatch/dispatch';
 import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue';
-import type { FormRules } from 'vue';
-import { ref, onMounted, computed, reactive, shallowRef, onActivated } from 'vue';
-import { getDefaultLogicPolicyStd } from '/@/api/phm/logicPolicyStd';
-import { GetLogicTreeListByPolicyIDStd } from '/@/api/phm/logicTreeStd';
-import { getSite } from '/@/projectCom/components/manage/utils';
-import { uniqueInArray } from '/@/utils/istation/common.js';
-import { LOGIC_SITE_CODE } from '/@/constants';
-import { GetRectListOfDayRange, GetRectDetailListOfDayRange } from '/@/api/eta/runHeat';
-import moment from 'moment';
-import { verifyNumberComma } from '/@/utils/toolsValidate';
-const defaultTime = ref<[Date, Date]>([new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 2, 1, 23, 59, 59)]);
+import RunPointAnalysisCom from '/@/projectCom/curve/runPoint/RunPointAnalysisCom.vue';
 // 瀹氫箟鍙橀噺鍐呭
 const state = reactive({
-	chartData: [],
 	echartTitle: '',
-	queryQHForm: {
-		Qspace: 100,
-		Hspace: 1,
-		themetime: '',
-	} as any,
-	QHForm: {
-		showValue: false,
-		tOrP: true,
-	},
-	heatmapDetailShow: false, //鎵撳紑鐑姏鍥剧殑璇︾粏 锛堥粯璁ゅ叧闂級
-	dialogTitle: '娉电粍鍚堜俊鎭�', //璇︾粏鐨勫悕瀛�
-	pieData: [], //楗煎浘鏁版嵁婧�
-	defaultProps: {
-		id: 'LogicID',
-		label: 'Name',
-		children: 'Children',
-	}, //鏍戣妭鐐�
-	activeName: 'heatMapPage', //榛樿閫変腑鐑姏鍥�
-	displayTableData: [], //绮剧‘鏌ヨ鏁版嵁
-	analyzeForm: {
-		deviationQValue: 50,
-		deviationHValue: 0.5,
-	} as any, //鍒嗘瀽鍙傛暟
-	deviationForm: {} as any, //鍋忓樊鑼冨洿
-	min: '',
-	max: '',
-	runTimeData: [],
-	minE: '',
-	maxE: '',
-	eData: [],
 });
-const m_chartHeatmapBox = shallowRef();
-const m_chartPie = shallowRef();
-const queryQHFormRef = ref();
+const runPointAnalysisRef = ref();
 //#region ====================== 宸︿晶鏍戞暟鎹紝tree init ======================
+
 const treeLoading = ref(false);
 const listTreeData = ref([]);
 const currentTreeNode = ref(null);
-const currentListID = computed(() => currentTreeNode.value?.LogicID);
-const defaultSelectID = window.moduleConfig.comprehensive.logicSite.defaultSelectID; //榛樿閫変腑闀垮叴...娉电珯鐨処D
+const currentListID = computed(() => currentTreeNode.value?.ID);
 const handleClickNode = (data) => {
 	currentTreeNode.value = data;
-	if (data.LogicType !== LOGIC_SITE_CODE) {
-		m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
-		return ElMessage.warning('鏀嚎涓嶅彲閫�!');
-	}
-	window.moduleConfig.comprehensive.logicSite.defaultSelectID = data.LogicID;
-	state.echartTitle = data.Name;
-	timeQuery();
+	nextTick(() => {
+		runPointAnalysisRef.value.getChartList();
+	});
 };
 const getListTreeData = async () => {
 	treeLoading.value = true;
-	getDefaultLogicPolicyStd().then(async (data) => {
-		if (typeof data !== 'undefined') {
-			const res = await GetLogicTreeListByPolicyIDStd({
-				PolicyID: data.ID,
-			}).finally(() => {
-				treeLoading.value = false;
-			});
-
-			if (res?.Code === 0) {
-				const resData = (res.Data || []) as [];
-				listTreeData.value = resData;
-				const firstSelectTreeNode = getSite(
-					resData,
-					{ key: 'LogicType', value: LOGIC_SITE_CODE },
-					{
-						key: 'LogicID',
-						value: defaultSelectID,
-					}
-				);
-				if (firstSelectTreeNode) {
-					handleClickNode(firstSelectTreeNode);
-					state.echartTitle = firstSelectTreeNode.Name;
-				} else {
-					listTreeData.value = [];
-				}
-			} else {
-				ElMessage.error('鑾峰彇娉电珯鍒楄〃澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
-			}
+	const res = await GetStationList().finally(() => {
+		treeLoading.value = false;
+	});
+	if (res?.Code === 0) {
+		const resData = (res.Data || []) as [];
+		listTreeData.value = resData;
+		const firstListTreeNode = listTreeData.value[0];
+		if (firstListTreeNode) {
+			handleClickNode(firstListTreeNode);
 		} else {
-			listTreeData.value = [];
-		}
-	});
-};
-//#endregion
-//#region ====================== 璁剧疆鏃堕棿浜嬩欢 ======================
-//榛樿鏃堕棿閫夋嫨鍓�7澶�/榛樿閫夋嫨褰撳ぉ
-const getdatatime = () => {
-	let sevenAgo = moment(new Date()).subtract(7, 'days').startOf('day').format('YYYY-MM-DD HH:mm:ss');
-	let today = moment().endOf('day').format('YYYY-MM-DD HH:mm:ss');
-	return [sevenAgo, today];
-};
-//鑾峰彇鏃ユ湡鐨勬椂闂�
-const getDateTime = (val) => {
-	if (val == null) {
-		return ElMessage.warning('璇烽�夋嫨鏃堕棿');
-	}
-	state.queryQHForm.themetime[0] = val[0];
-	state.queryQHForm.themetime[1] = val[1];
-};
-// 鏃堕棿闄愬埗
-const disablesDate = (time) => {
-	return time.getTime() > new Date().getTime();
-};
-//鏌ヨ鏃堕棿
-const timeQuery = async () => {
-	if (!queryQHFormRef.value) return;
-	await queryQHFormRef.value.validate(async (valid, fields) => {
-		if (valid) {
-			getChartList();
-		} else {
-			return ElMessage.error('蹇呭~椤�!');
-		}
-	});
-};
-//#endregion
-//#region ====================== 琛ㄥ崟楠岃瘉 ======================
-const queryQHRules = reactive<FormRules>({
-	Qspace: [{ required: true, message: '鍙兘杈撳叆鏁板瓧', trigger: 'blur' }],
-	Hspace: [{ required: true, message: '鍙兘杈撳叆鏁板瓧', trigger: 'blur' }],
-});
-//#endregion
-//#region ====================== 鍥捐〃 鎵▼/鏁堢巼/init======================
-//閫氳繃 鏃ユ湡鏇茬嚎鑾峰彇鐑姏鍥惧浘琛ㄦ暟鎹�
-const getChartList = async () => {
-	await GetRectListOfDayRange({
-		ObjectType: LOGIC_SITE_CODE,
-		ObjectID: currentListID.value,
-		Qspace: state.queryQHForm.Qspace,
-		Hspace: state.queryQHForm.Hspace,
-		StartDay: state.queryQHForm.themetime[0],
-		EndDay: state.queryQHForm.themetime[1],
-	})
-		.then((res) => {
-			let result = res.Data;
-			if (res.Code != 0) {
-				state.chartData = [];
-				m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
-				return;
-			}
-			if (res.Data == null || res.Data.length == 0) {
-				state.chartData = [];
-				m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
-				return ElMessage.warning('鏆傛棤鏁版嵁');
-			}
-			state.chartData = result || [];
-
-			setTimeout(() => {
-				//鍒濆鍖栧浘琛�
-				BuildchartHeatmapBox();
-			}, 100);
-		})
-		.catch((err) => {
-			ElMessage.error('鑾峰彇鍥捐〃鏁版嵁澶辫触' + (err?.Message ? `锛�${JSON.stringify(err.Message)}` : ''));
-		});
-};
-//  鍒濆鍖栨祦閲忔壃绋嬪浘琛�
-const BuildchartHeatmapBox = () => {
-	m_chartHeatmapBox.value && m_chartHeatmapBox.value.clear();
-	if (state.chartData.length == 0) return;
-	//鍏堣幏鍙朌om涓婄殑瀹炰緥
-	let chartDom = echarts.getInstanceByDom(document.getElementById('chartHeatmapBox') as HTMLDivElement);
-	//鐒跺悗鍒ゆ柇瀹炰緥鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪锛屽氨鍒涘缓鏂板疄渚�
-	if (chartDom == null) {
-		chartDom = echarts.init(document.getElementById('chartHeatmapBox') as HTMLDivElement);
-	}
-	m_chartHeatmapBox.value = chartDom;
-	var xData = [];
-	var yData = [];
-	var runTimeData = [];
-	var eData = [];
-	for (var i = 0; i < state.chartData.length; i++) {
-		var node = state.chartData[i];
-		if (node.Tsum != 0) {
-			var x = parseFloat(((node.Qmax + node.Qmin) / 2).toFixed(4));
-			var y = parseFloat(((node.Hmax + node.Hmin) / 2).toFixed(4));
-			var time = parseFloat((node.Tsum / 60 / 60).toFixed(3));
-			x = node.Qmax;
-			y = node.Hmax;
-
-			xData.push(x);
-			yData.push(y);
-			node.Tsum = time;
-			runTimeData.push({ rect_data: node, value: [x.toString(), y.toString(), node.Tsum, node] });
-			eData.push({ rect_data: node, value: [x.toString(), y.toString(), node.Eavg, node] }); //Eavg 鏁堢巼
+			currentTreeNode.value = null;
 		}
 	}
-	xData = uniqueInArray(xData); //鍘婚噸
-	yData = uniqueInArray(yData); //鍘婚噸
-	yData.sort(compareNumbers);
-	var max = 1;
-	var min = 0;
-	var maxE = 100;
-	var minE = 0;
-	if (state.chartData.length != 0) {
-		max = Math.max.apply(
-			Math,
-			state.chartData.map((item) => {
-				return item.Tsum;
-			})
-		); //鏁版嵁鐨勬渶澶у��
-		min = Math.min.apply(
-			Math,
-			state.chartData.map((item) => {
-				return item.Tsum;
-			})
-		); //鏁版嵁鐨勬渶灏忓��
-		maxE = Math.max.apply(
-			Math,
-			state.chartData.map((item) => {
-				return item.Eavg;
-			})
-		); //鏁堢巼鏁版嵁鐨勬渶澶у��
-		var minValE = [];
-		state.chartData.forEach((item) => {
-			if (item.Eavg != 0) {
-				minValE.push(item.Eavg);
-			}
-		});
-		minE = Math.min.apply(Math, minValE); //鏁堢巼鏁版嵁鐨勬渶灏忓��
-	}
-	// console.log(xData, yData, runTimeData);
-	//console.log(max,min)
-	runTimeData = runTimeData.map(function (item) {
-		return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2] || '-'] };
-		//return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2]] };
-	});
-
-	eData = eData.map(function (item) {
-		return { rect_data: item.rect_data, value: [item.value[0], item.value[1], item.value[2] || '-'] };
-	});
-	var option = {
-		tooltip: {
-			//position: 'top'
-			formatter: function (p) {
-				//console.log(p.data)
-				if (!p.data) {
-					return '';
-				}
-				return (
-					p.data.rect_data.Qmin +
-					'-' +
-					p.data.rect_data.Qmax +
-					'</br>' +
-					p.marker +
-					'鏃堕棿: ' +
-					p.data.rect_data.Tsum +
-					'灏忔椂 &nbsp;&nbsp; 鏁堢巼: ' +
-					p.data.rect_data.Eavg +
-					'%'
-				);
-			},
-		},
-		animation: false,
-		grid: {
-			containLabel: true,
-			left: '80',
-			right: '80',
-			top: '70',
-			bottom: '15',
-		},
-		legend: {
-			data: ['鏁堢巼', '杩愯鏃堕棿'],
-		},
-		xAxis: {
-			name: '娴侀噺(m鲁)',
-			type: 'category', //category log
-			data: xData,
-			//boundaryGap:false,
-			splitArea: {
-				show: true,
-				interval: 0,
-			},
-			axisLabel: {
-				//formatter: function (value, index) {
-				//    console.log(value, index)
-				//    return value
-				//}
-			},
-			axisTick: {
-				alignWithLabel: true,
-			},
-			axisPointer: {
-				show: true,
-				type: 'shadow',
-			},
-		},
-		yAxis: {
-			name: '鎵▼(m)',
-			type: 'category',
-			data: yData,
-			splitArea: {
-				show: true,
-				interval: 0,
-			},
-			axisTick: {
-				alignWithLabel: true,
-			},
-			axisPointer: {
-				show: true,
-				type: 'shadow',
-			},
-		},
-		visualMap: [
-			{
-				min: min,
-				max: max,
-				calculable: true,
-				text: ['鏃堕棿:(灏忔椂)', ''],
-				textGap: 20,
-				realtime: false,
-				//orient:'horizontal',
-				top: 'middle',
-				inRange: {
-					color: ['#2ba2ee', '#f32cb7'], //['#2ba2ee', '#f32cb7'] //['#313695', '#a50026']
-				},
-				////color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
-			},
-		],
-		series: [
-			{
-				name: '杩愯鏃堕棿',
-				type: 'heatmap',
-				data: runTimeData,
-				label: {
-					show: false,
-				},
-				emphasis: {
-					itemStyle: {
-						shadowBlur: 10,
-						shadowColor: 'rgba(0, 0, 0, 0.5)',
-					},
-				},
-			},
-		],
-	};
-	// 浣跨敤鍒氭寚瀹氱殑閰嶇疆椤瑰拰鏁版嵁鏄剧ず鍥捐〃銆�
-	m_chartHeatmapBox.value.setOption(option, true);
-	m_chartHeatmapBox.value.setOption({
-		visualMap: [
-			{
-				min: min,
-				max: max,
-				range: [min, max],
-			},
-		],
-	});
-	m_chartHeatmapBox.value.on('click', function (obj) {
-		let node = obj.data.rect_data;
-		setChartTableDialog(node.Qmin, node.Qmax, node.Hmin, node.Hmax);
-	});
-	state.min = min;
-	state.max = max;
-	state.runTimeData = runTimeData;
-	state.minE = minE;
-	state.maxE = maxE;
-	state.eData = eData;
-	window.addEventListener('resize', selfAdaption);
-};
-const compareNumbers = (a, b) => {
-	return a - b; // 浠庡皬鍒板ぇ鎺掑簭
-};
-//鎵撳紑寮圭獥
-const setChartTableDialog = async (qLower, qUpper, hLower, hUpper) => {
-	state.heatmapDetailShow = true;
-	await GetRectDetailListOfDayRange({
-		ObjectType: LOGIC_SITE_CODE,
-		ObjectID: currentListID.value,
-		Qmin: qLower,
-		Qmax: qUpper,
-		Hmin: hLower,
-		Hmax: hUpper,
-		StartDay: state.queryQHForm.themetime[0],
-		EndDay: state.queryQHForm.themetime[1],
-	}).then((res) => {
-		let result = res.Data;
-		if (res.Code != 0) {
-			state.pieData = [];
-			m_chartPie.value && m_chartPie.value.clear();
-			return;
-		}
-		if (res.Data == null || res.Data.length == 0) {
-			state.pieData = [];
-			m_chartPie.value && m_chartPie.value.clear();
-			return ElMessage.warning('楗煎浘鏆傛棤鏁版嵁');
-		}
-		result.forEach((item) => (item.Tsum = (item.Tsum / 60 / 60).toFixed(2)));
-		state.pieData = result || [];
-		setTimeout(() => {
-			//鍒濆鍖栭ゼ鍥�
-			buildPieChartBox();
-		}, 100);
-	});
-};
-// 鍒濆鍖栭ゼ鍥�
-const buildPieChartBox = () => {
-	m_chartPie.value && m_chartPie.value.clear();
-	if (state.pieData.length == 0) return;
-	//鍏堣幏鍙朌om涓婄殑瀹炰緥
-	let chartDom = echarts.getInstanceByDom(document.getElementById('chartPie') as HTMLDivElement);
-	//鐒跺悗鍒ゆ柇瀹炰緥鏄惁瀛樺湪锛屽鏋滀笉瀛樺湪锛屽氨鍒涘缓鏂板疄渚�
-	if (chartDom == null) {
-		chartDom = echarts.init(document.getElementById('chartPie') as HTMLDivElement);
-	}
-	m_chartPie.value = chartDom;
-	var seriesData = [];
-	for (var i = 0; i < state.pieData.length; i++) {
-		var item = state.pieData[i];
-		seriesData.push({ value: parseFloat(item.Tsum), name: item.Name });
-	}
-	let option = {
-		title: {
-			text: '',
-			subtext: '',
-			left: 'center',
-		},
-		tooltip: {
-			trigger: 'item',
-		},
-		legend: {
-			orient: 'vertical',
-			left: 'left',
-		},
-		series: [
-			{
-				name: '杩愯鏃堕棿',
-				type: 'pie',
-				radius: '50%',
-				data: seriesData,
-				label: {
-					show: true,
-					formatter: '{b}{a}锛歿c}灏忔椂',
-				},
-				emphasis: {
-					itemStyle: {
-						shadowBlur: 10,
-						shadowOffsetX: 0,
-						shadowColor: 'rgba(0, 0, 0, 0.5)',
-					},
-				},
-			},
-		],
-	};
-	m_chartPie.value.setOption(option, true);
-	m_chartPie.value && m_chartPie.value.resize();
-};
-//鍏抽棴寮圭獥
-const closeDialog = () => {
-	state.heatmapDetailShow = false;
-};
-//  鐑姏鍥捐嚜閫傚簲
-const selfAdaption = () => {
-	if (!m_chartHeatmapBox.value) return;
-	m_chartHeatmapBox.value.resize();
-};
-//  楗煎浘鑷�傚簲
-const selfPipeAdaption = () => {
-	if (!m_chartPie.value) return;
-	m_chartPie.value.resize();
-};
-//#endregion
-//#region ====================== 鏄惁鏄剧ず鍊�/鏃堕棿/鍔熺巼 ======================
-const isShowQHValue = () => {
-	if (state.QHForm.showValue) {
-		m_chartHeatmapBox.value &&
-			m_chartHeatmapBox.value.setOption({
-				series: [
-					{
-						label: {
-							show: true,
-							color: 'white',
-						},
-					},
-				],
-			});
-	} else {
-		m_chartHeatmapBox.value &&
-			m_chartHeatmapBox.value.setOption({
-				series: [
-					{
-						label: {
-							show: false,
-						},
-					},
-				],
-			});
-	}
-};
-const tOrPChange = (val) => {
-	state.QHForm.tOrP = val;
-	isShowTOrP();
-};
-const isShowTOrP = () => {
-	var isRunTime = true;
-	if (state.QHForm.tOrP) {
-		m_chartHeatmapBox.value.setOption({
-			visualMap: [
-				{
-					min: state.min,
-					max: state.max,
-					text: ['鏃堕棿:(灏忔椂)', ''],
-					range: [state.min, state.max],
-					inRange: {
-						color: ['#2ba2ee', '#f32cb7'],
-					},
-				},
-			],
-			series: [
-				{
-					name: '杩愯鏃堕棿',
-					data: state.runTimeData,
-				},
-			],
-		});
-		isRunTime = true;
-	} else {
-		m_chartHeatmapBox.value.setOption({
-			visualMap: [
-				{
-					min: state.minE,
-					max: state.maxE,
-					text: ['鏁堢巼:(%)', ''],
-					range: [state.minE, state.maxE],
-					inRange: {
-						color: ['#ccc', '#332cb7'],
-					},
-				},
-			],
-
-			series: [
-				{
-					name: '鏁堢巼',
-					data: state.eData,
-				},
-			],
-		});
-		isRunTime = false;
-	}
 };
 
-//#endregion
-//#region ====================== 鍒囨崲鎴愮簿纭煡璇� ======================
-//楠岃瘉鐨勬椂鍊欏彧鑳借緭鍏ユ暟瀛�
-const verifiyInstant = (val, type) => {
-	switch (type) {
-		case 1:
-			if (state.analyzeForm.Q == '') return;
-			state.analyzeForm.Q = verifyNumberComma(val);
-			var qLowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
-			var qUpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
-			state.deviationForm.QdStart = qLowerValue; //娴侀噺鍋忓樊鏈�灏忓��
-			state.deviationForm.QdEnd = qUpperValue; //娴侀噺鍋忓樊鏈�澶у��
-
-			break;
-		case 2:
-			if (state.analyzeForm.deviationQValue == '') return;
-			state.analyzeForm.deviationQValue = verifyNumberComma(val);
-			var qLowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
-			var qUpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
-			state.deviationForm.QdStart = qLowerValue; //娴侀噺鍋忓樊鏈�灏忓��
-			state.deviationForm.QdEnd = qUpperValue; //娴侀噺鍋忓樊鏈�澶у��
-
-			break;
-		case 3:
-			if (state.analyzeForm.H == '') return;
-			state.analyzeForm.H = verifyNumberComma(val);
-			var hLowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
-			var hUpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
-			state.deviationForm.HdStart = hLowerValue; //鎵▼鍋忓樊鏈�灏忓��
-			state.deviationForm.HdEnd = hUpperValue; //鎵▼鍋忓樊鏈�澶у��
-			break;
-		case 4:
-			if (state.analyzeForm.deviationHValue == '') return;
-			state.analyzeForm.deviationHValue = verifyNumberComma(val);
-			var hLowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
-			var hUpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
-			state.deviationForm.HdStart = hLowerValue; //鎵▼鍋忓樊鏈�灏忓��
-			state.deviationForm.HdEnd = hUpperValue; //鎵▼鍋忓樊鏈�澶у��
-			break;
-		case 5:
-			state.deviationForm.QdStart = verifyNumberComma(val);
-
-			break;
-		case 6:
-			state.deviationForm.QdEnd = verifyNumberComma(val);
-			break;
-		case 7:
-			state.deviationForm.HdStart = verifyNumberComma(val);
-
-			break;
-		case 8:
-			state.deviationForm.HdEnd = verifyNumberComma(val);
-			break;
-	}
-};
-//鐩戝惉娴侀噺闂撮殧鍊�
-const flowIntervalValue = (val) => {
-	// state.analyzeForm.Q = val;
-	var intervalValueFlow = state.queryQHForm.Qspace / 2; //娴侀噺闂撮殧鍊�
-	//灏嗘祦閲忛棿闅斿�煎疄鏃惰祴缁欐祦閲忓亸宸��
-	state.analyzeForm.deviationQValue = intervalValueFlow;
-	var qLowerValue = parseFloat(state.analyzeForm.Q) - parseFloat(state.analyzeForm.deviationQValue);
-	var qUpperValue = parseFloat(state.analyzeForm.Q) + parseFloat(state.analyzeForm.deviationQValue);
-	state.deviationForm.QdStart = qLowerValue; //娴侀噺鍋忓樊鏈�灏忓��
-	state.deviationForm.QdEnd = qUpperValue; //娴侀噺鍋忓樊鏈�澶у��
-};
-//鐩戝惉鎵▼闂撮殧鍊�
-const headIntervalValue = (val) => {
-	// state.analyzeForm.Q = val;
-	var intervalValueFlow = state.queryQHForm.Hspace / 2; //鎵▼闂撮殧鍊�
-	//灏嗘壃绋嬮棿闅斿�煎疄鏃惰祴缁欐壃绋嬪亸宸��
-	state.analyzeForm.deviationHValue = intervalValueFlow;
-	var hLowerValue = parseFloat(state.analyzeForm.H) - parseFloat(state.analyzeForm.deviationHValue);
-	var hUpperValue = parseFloat(state.analyzeForm.H) + parseFloat(state.analyzeForm.deviationHValue);
-	state.deviationForm.HdStart = hLowerValue; //鎵▼鍋忓樊鏈�灏忓��
-	state.deviationForm.HdEnd = hUpperValue; //鎵▼鍋忓樊鏈�澶у��
-};
-const getTableDetail = async () => {
-	var qLowerValue = state.deviationForm.QdStart; //娴侀噺鍋忓樊鏈�灏忓��
-	var qUpperValue = state.deviationForm.QdEnd; //娴侀噺鍋忓樊鏈�澶у��
-	var hLowerValue = state.deviationForm.HdStart; //鎵▼鍋忓樊鏈�灏忓��
-	var hUpperValue = state.deviationForm.HdEnd; //鎵▼鍋忓樊鏈�澶у��
-	if (qLowerValue > qUpperValue && hLowerValue > hUpperValue) {
-		return ElMessage.warning('娴侀噺銆佹壃绋嬪亸宸渶灏忓�间笉鑳藉ぇ浜庢渶澶у��');
-	} else if (qLowerValue > qUpperValue) {
-		return ElMessage.warning('娴侀噺鍋忓樊鏈�灏忓�间笉鑳藉ぇ浜庢渶澶у��');
-	} else if (hLowerValue > hUpperValue) {
-		return ElMessage.warning('鎵▼鍋忓樊鏈�灏忓�间笉鑳藉ぇ浜庢渶澶у��');
-	} else {
-		if (qLowerValue == null || qLowerValue == '') return ElMessage.warning('璇疯緭鍏ユ祦閲�');
-		if (qUpperValue == null || qUpperValue == '') return ElMessage.warning('璇疯緭鍏ユ祦閲�');
-		if (hLowerValue == null || hLowerValue == '') return ElMessage.warning('璇疯緭鍏ユ壃绋�');
-		if (hUpperValue == null || hUpperValue == '') return ElMessage.warning('璇疯緭鍏ユ壃绋�');
-		await GetRectDetailListOfDayRange({
-			ObjectType: LOGIC_SITE_CODE,
-			ObjectID: currentListID.value,
-			Qmin: qLowerValue,
-			Qmax: qUpperValue,
-			Hmin: hLowerValue,
-			Hmax: hUpperValue,
-			StartDay: state.queryQHForm.themetime[0],
-			EndDay: state.queryQHForm.themetime[1],
-		})
-			.then((res) => {
-				let result = res.Data;
-				if (res.Code != 0) {
-					state.displayTableData = [];
-					return;
-				}
-				if (res.Data == null || res.Data.length == 0) {
-					state.displayTableData = [];
-					return ElMessage.warning('琛ㄦ牸鏆傛棤鏁版嵁');
-				}
-				result.forEach((item) => (item.Tsum = (item.Tsum / 60 / 60).toFixed(2)));
-				state.displayTableData = result || [];
-			})
-			.catch((err) => {
-				return ElMessage.error('鑾峰彇琛ㄦ牸鍒楄〃澶辫触' + (err?.Message ? `锛�${JSON.stringify(err.Message)}` : ''));
-			});
-	}
-};
 //#endregion
 onMounted(() => {
-	let getSevenDate = getdatatime();
-	state.queryQHForm.themetime = getSevenDate;
-	setTimeout(() => {
-		getListTreeData();
-	}, 100);
-	window.addEventListener('resize', selfPipeAdaption);
-});
-onActivated(() => {
-	window.addEventListener('resize', selfPipeAdaption);
+	getListTreeData();
 });
 </script>
-<style scoped lang="scss">
-:deep(.el-tabs__content) {
-	width: 100%;
-	height: calc(100% - 50px);
-}
-.box_right_title {
-	background: linear-gradient(90deg, #2d81d9, #0655b4);
-	color: #fff;
-	height: 30px;
-	line-height: 30px;
-	text-align: left;
-	border-radius: 7px;
-	padding-left: 10px;
-	display: flex;
-}
-.form_m1 {
-	:deep(.el-form-item__label) {
-		color: #ffffff !important;
-	}
-}
-.setQHForm {
-	width: 100%;
-	display: flex;
-	justify-content: flex-start;
-	align-items: center;
-	padding-top: 10px;
-}
-.analyseInput_left {
-	width: 68px;
-	height: 32px;
-	line-height: 32px;
-	// border: 1px solid #cccccc;
-	text-align: center;
-	color: #666;
-}
-.analyseInput_right {
-	width: 45px;
-	height: 32px;
-	line-height: 32px;
-	// border: 1px solid #cccccc;
-	text-align: center;
-	color: #666;
-}
-.deviationInput {
-	width: 68px;
-	height: 32px;
-	line-height: 32px;
-	// border: 1px solid #cccccc;
-	text-align: center;
-	color: #666;
-}
-.formLabel_size {
-	:deep(.el-form-item__label) {
-		font-size: 1rem !important;
-	}
-	:deep(.el-form-item--default) {
-		margin-bottom: 10px !important;
-		line-height: 36px;
-	}
-}
-</style>
+import { GetStationList } from '/@/api/dispatch/dispatch';
diff --git a/src/views/project/ch/efficiencyAnalysis/scheduling/SchedulingAnalysis.vue b/src/views/project/ch/efficiencyAnalysis/scheduling/SchedulingAnalysis.vue
new file mode 100644
index 0000000..5981a17
--- /dev/null
+++ b/src/views/project/ch/efficiencyAnalysis/scheduling/SchedulingAnalysis.vue
@@ -0,0 +1,200 @@
+<template>
+	<el-row :gutter="8" class="h100">
+		<el-col :span="4" :xs="24" class="h100">
+			<el-card shadow="hover" class="h100 left-tree-card" v-loading="treeLoading">
+				<LeftTreeByMgr :treedata="listTreeData" title-name="娉电珯鍒楄〃" :current-node-key="currentListID" @click="handleClickNode">
+				</LeftTreeByMgr>
+			</el-card>
+		</el-col>
+		<el-col :span="20" :xs="24" class="flex-column h100">
+			<el-card shadow="hover" :body-style="{ paddingBottom: '0' }">
+				<el-form :inline="true" :model="queryParams" label-width="120px" :rules="queryParamsRules">
+					<el-form-item label="杩涘彛姘翠綅" prop="WaterLevel">
+						<el-input v-model="queryParams.WaterLevel" style="width: 180px" clearable></el-input>
+					</el-form-item>
+					<el-form-item label="鐩爣娴侀噺(m鲁/h)" prop="TargetFlow">
+						<el-input v-model="queryParams.TargetFlow" style="width: 180px" clearable />
+					</el-form-item>
+					<el-form-item label="鐩爣鍘嬪姏(MPa)" prop="TargetPressure">
+						<el-input v-model="queryParams.TargetPressure" style="width: 180px" clearable />
+					</el-form-item>
+					<el-form-item>
+						<el-button icon="ele-Refresh" @click="resetQuery" type="primary">璋冨害 </el-button>
+					</el-form-item>
+				</el-form>
+			</el-card>
+			<el-card class="mt8" shadow="hover">
+				<div style="width: 100%; height: 100px" class="aside_main">
+					<el-form :inline="true" :model="pumpPanel" label-width="120px">
+						<div class="flex">
+							<el-form-item label="鎬绘祦閲�">
+								<el-input v-model="pumpPanel.TotalFlow" style="width: 180px" readonly></el-input>
+							</el-form-item>
+							<el-form-item label="鎬诲帇鍔�">
+								<el-input v-model="pumpPanel.TotalPressure" style="width: 180px" readonly />
+							</el-form-item>
+							<el-form-item label="鎬诲姛鐜�">
+								<el-input v-model="pumpPanel.TotalPower" style="width: 180px" readonly />
+							</el-form-item>
+							<el-form-item label="鎬绘晥鐜�">
+								<el-input v-model="pumpPanel.TotalEfficiency" style="width: 180px" readonly />
+							</el-form-item>
+						</div>
+						<div class="flex">
+							<el-form-item label="鎬诲崈鍚ㄨ兘鑰�">
+								<el-input v-model="pumpPanel.WP" style="width: 180px" readonly />
+							</el-form-item>
+							<el-form-item label="鎬诲崟浣嶈兘鑰�">
+								<el-input v-model="pumpPanel.UWP" style="width: 180px" readonly />
+							</el-form-item>
+							<el-form-item label="寮�娉靛彴鏁�">
+								<el-input v-model="pumpPanel.UWP" style="width: 180px" readonly />
+							</el-form-item>
+						</div>
+					</el-form>
+				</div>
+			</el-card>
+			<el-card class="flex-auto scroll-table-card" shadow="hover" style="margin-top: 8px">
+				<el-table
+					v-loading="tableLoading"
+					ref="draggableTableRef"
+					border
+					row-key="ID"
+					:row-class-name="isDragStatus ? 'cursor-move' : 'cursor-pointer'"
+					:cell-style="{ textAlign: 'center' }"
+					:header-cell-style="{ textAlign: 'center' }"
+					:data="tableData"
+					highlight-current-row
+					style="width: 100%"
+				>
+					<el-table-column prop="Name" label="鏈烘车" fixed="left" show-overflow-tooltip width="200" />
+					<el-table-column prop="Flow" label="娴侀噺(m鲁/h)" show-overflow-tooltip width="200" />
+					<el-table-column prop="Head" width="200" label="鎵▼(m)" show-overflow-tooltip />
+					<el-table-column prop="Power" width="140" label="鍔熺巼(kW/h)" show-overflow-tooltip />
+					<el-table-column prop="Efficiency" label="鏁堢巼(%)" show-overflow-tooltip />
+					<el-table-column prop="Frequency" label="棰戠巼(hz)" show-overflow-tooltip width="140" />
+					<el-table-column prop="Speed" width="140" label="杞��(rpm)" show-overflow-tooltip />
+					<el-table-column prop="Status" width="140" label="鐘舵��" show-overflow-tooltip>
+						<template #default="{ row }">
+							{{ row.Status == 0 ? '鍏�' : row.Status == 1 ? '寮�' : '/' }}
+						</template>
+					</el-table-column>
+				</el-table>
+			</el-card>
+		</el-col>
+	</el-row>
+</template>
+
+<script setup lang="ts">
+import { ElMessage } from 'element-plus';
+import { computed, onMounted, reactive, ref } from 'vue';
+import { CalculateScheduling, GetStationList } from '/@/api/dispatch/dispatch';
+import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue';
+//#region ====================== 宸︿晶鏍戞暟鎹紝tree init ======================
+const treeLoading = ref(false);
+const listTreeData = ref([]);
+const currentTreeNode = ref(null);
+const currentListID = computed(() => currentTreeNode.value?.ID);
+const handleClickNode = (data) => {
+	currentTreeNode.value = data;
+	getTableData();
+};
+const getListTreeData = async () => {
+	treeLoading.value = true;
+	const res = await GetStationList().finally(() => {
+		treeLoading.value = false;
+	});
+	if (res?.Code === 0) {
+		const resData = (res.Data || []) as [];
+		listTreeData.value = resData;
+		const firstListTreeNode = listTreeData.value[0];
+		if (firstListTreeNode) {
+			handleClickNode(firstListTreeNode);
+		} else {
+			tableData.value = [];
+			currentTreeNode.value = null;
+		}
+	}
+};
+//#endregion
+
+//#region ====================== 琛ㄦ牸鏁版嵁锛宼able init ======================
+const asideStatus = ref(false);
+const tableLoading = ref(false);
+const tableData = ref([]);
+const isDragStatus = ref(false);
+const getTableData = async () => {
+	tableLoading.value = true;
+	const res = await CalculateScheduling({
+		StationID: parseInt(currentListID.value),
+		...queryParams.value,
+	}).finally(() => {
+		tableLoading.value = false;
+	});
+	if (res?.Code === 0) {
+		const resData = (res.Data || []) as [];
+		tableData.value = resData?.Pumps;
+		let obj = resData?.Station;
+		pumpPanel.value.TotalEfficiency = obj?.TotalEfficiency || '';
+		pumpPanel.value.TotalFlow = obj?.TotalFlow || '';
+		pumpPanel.value.TotalPower = obj?.TotalPower || '';
+		pumpPanel.value.TotalPressure = obj?.TotalPressure || '';
+		pumpPanel.value.WP = obj?.WP || '';
+		pumpPanel.value.UWP = obj?.UWP || '';
+	} else {
+		ElMessage.error('鑾峰彇澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+	}
+};
+//璋冨害鏌ヨ
+const resetQuery = () => {
+	getTableData();
+};
+const queryParamsRules = reactive({
+	WaterLevel: [{ required: true, message: '蹇呭~椤�', trigger: 'blur' }],
+	TargetFlow: [
+		{
+			required: true,
+			message: '蹇呭~椤�',
+			trigger: 'blur',
+		},
+	],
+	TargetPressure: [
+		{
+			required: true,
+			message: '蹇呭~椤�',
+			trigger: 'blur',
+		},
+	],
+});
+//#endregion
+
+//#region ====================== 琛ㄦ牸鏌ヨ銆佹帓搴忥紝search form init ======================
+const queryParams = ref({
+	WaterLevel: 19.2,
+	TargetFlow: 23394,
+	TargetPressure: 0.3355,
+});
+//娉电珯淇℃伅闈㈡澘
+const pumpPanel = ref({
+	TotalFlow: '',
+	TotalPressure: '',
+	TotalPower: '',
+	TotalEfficiency: '',
+	WP: '',
+	UWP: '',
+});
+//#endregion
+
+onMounted(() => {
+	getListTreeData();
+});
+</script>
+<style scoped lang="scss">
+/* 渚ц竟鏍忔牱寮� */
+.aside_main {
+	height: 75px !important;
+	transition: width 0.3s;
+	box-sizing: border-box;
+	// box-shadow: inset 0px 0px 1px #3d3d3d;
+}
+</style>

--
Gitblit v1.9.3