From b06665e8c149df1273bf190313190bfa3de722e8 Mon Sep 17 00:00:00 2001
From: gerson <1405270578@qq.com>
Date: 星期六, 27 七月 2024 12:31:15 +0800
Subject: [PATCH] 監測點擊出曲綫

---
 src/api/ai/chat.ts                                                                              |   13 ++++
 src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSet.vue                |   54 +++++++++++------
 src/utils/types.ts                                                                              |    8 ++
 src/components/chat/chatComponents/summaryCom/components/deviceLastValue/DeviceLastValueCom.vue |   14 ++++
 src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSetDialog.vue          |   75 +++++++++++++++++++++++++
 src/components/chat/chatComponents/summaryCom/components/deviceLastValue/MonitorContent.vue     |    4 +
 6 files changed, 148 insertions(+), 20 deletions(-)

diff --git a/src/api/ai/chat.ts b/src/api/ai/chat.ts
index 0db2c88..4fe194f 100644
--- a/src/api/ai/chat.ts
+++ b/src/api/ai/chat.ts
@@ -331,3 +331,16 @@
 		},
 	});
 };
+
+
+
+export const queryScadaTimeValues = async (params, req: any = request) => {
+	return req({
+		url: 'data/query_scada_time_values',
+		method: 'POST',
+		data: params,
+		headers: {
+			'Content-Type': 'application/x-www-form-urlencoded',
+		},
+	});
+};
diff --git a/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/DeviceLastValueCom.vue b/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/DeviceLastValueCom.vue
index 8ded22a..0ea0bf1 100644
--- a/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/DeviceLastValueCom.vue
+++ b/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/DeviceLastValueCom.vue
@@ -53,6 +53,7 @@
 							:title="firstRow.title"
 							:type="firstRow.id"
 							:values="rowChunk"
+							@itemClick="valueClick"
 						/>
 					</div>
 					<!-- 鍓╀綑琛� -->
@@ -64,6 +65,7 @@
 						:title="row.title"
 						:type="row.id"
 						:values="rowChunk"
+						@itemClick="valueClick"
 					/>
 				</div>
 			</div>
@@ -78,6 +80,7 @@
 				@current-change="handleCurrentChange"
 			/>
 		</div>
+		<RecordSetDialog v-model="chartDlgIsShow" :otype="chartDlgMapRow?.OTYPE" :oname="chartDlgMapRow?.ONAME"/>
 	</div>
 </template>
 
@@ -100,6 +103,7 @@
 	THIN_BORDER_WIDTH,
 } from './constants';
 import type { Monitor, MonitorValue } from './types';
+import RecordSetDialog from '../recordSet/RecordSetDialog.vue';
 
 const props = defineProps(chatComProps) as {
 	data: Monitor;
@@ -259,6 +263,16 @@
 	return chunkResult;
 });
 
+//#region ====================== 鐐瑰嚮鐪嬫洸绾� ======================
+
+const chartDlgIsShow = ref(false);
+const chartDlgMapRow = ref(null);
+const valueClick = (item) => {
+	chartDlgMapRow.value = item;
+	chartDlgIsShow.value = true;
+};
+//#endregion
+
 // 璁$畻鏈�澶у垪鏁�
 // (x-1)* cellWidth + rowHeaderCellContentWidth.value+thickBorderWidth*(x-1)+thickBorderWidth*2 <= width;
 
diff --git a/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/MonitorContent.vue b/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/MonitorContent.vue
index 59589b1..abb685b 100644
--- a/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/MonitorContent.vue
+++ b/src/components/chat/chatComponents/summaryCom/components/deviceLastValue/MonitorContent.vue
@@ -24,7 +24,7 @@
 				height: `${CELL_HEIGHT}px`,
 			}"
 		>
-			<span class="cursor-pointer" @mouseover="valueMouseOver($event, item)" @mouseleave="valueMouseLeave">
+			<span class="cursor-pointer" @mouseover="valueMouseOver($event, item)" @mouseleave="valueMouseLeave" @click="emit('itemClick',item,item[type])">
 				{{ item[type] }}
 			</span>
 		</div>
@@ -64,6 +64,8 @@
 import { reactive, type PropType } from 'vue';
 import { BORDER_COLOR, CELL_HEIGHT, CONTENT_CELL_CLASS, ROW_HEADER_CELL_CLASS, THICK_BORDER_WIDTH } from './constants';
 import type { MonitorValue } from './types';
+
+const emit = defineEmits(['itemClick'])
 const props = defineProps({
 	/** @description 鏍囬 */
 	title: {
diff --git a/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSet.vue b/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSet.vue
index 11067e0..660a252 100644
--- a/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSet.vue
+++ b/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSet.vue
@@ -1,23 +1,29 @@
 <template>
 	<div class="w-full">
-		<div class="flex mb-4 flex-wrap" v-if="visibleParams && visibleParams.length > 0">
+		<div class="flex mb-4 flex-wrap">
 			<!-- TimeRange v-model 璺� @change 涓殑鍊间細涓嶄竴鏍凤紝浠change 涓负鍑� -->
-			<component
-				class="flex-0 m-1"
-				v-model="paramsValueList[index].value"
-				v-for="(item, index) in visibleParams as any"
-				:key="item.id"
-				:id="item.id"
-				:is="recordSetMapCom[item.type]"
-				:data="item"
-				:originData="originData"
-				@change="(val) => handleQueryChange(val, item)"
-				:disabled="chartLoading"
-			></component>
+			<template v-if="visibleParams && visibleParams.length > 0">
+				<component
+					class="flex-0 m-1"
+					v-model="paramsValueList[index].value"
+					v-for="(item, index) in visibleParams as any"
+					:key="item.id"
+					:id="item.id"
+					:is="recordSetMapCom[item.type]"
+					:data="item"
+					:originData="originData"
+					@change="(val) => handleQueryChange(val, item)"
+					:disabled="chartLoading"
+				></component>
+			</template>
+			<slot>
+				
+			</slot>
+
 			<YRange v-model="yRange" @input="yRangeInput" />
 			<el-checkbox class="m-1" v-model="isMultiCompare" label="澶氭棩瀵规瘮" @change="multiCompareChange"></el-checkbox>
 		</div>
-		<div class="h-[20rem]" v-resize="chartContainerResize" v-loading="chartLoading">
+		<div :style="{ height: chartHeight }" v-resize="chartContainerResize" v-loading="chartLoading">
 			<div ref="chartRef"></div>
 		</div>
 	</div>
@@ -60,6 +66,10 @@
 	summaryIndex: {
 		type: Number,
 	},
+	chartHeight: {
+		type: String,
+		default: '20rem',
+	},
 }) as {
 	data: RecordSet;
 };
@@ -89,7 +99,7 @@
 			} else {
 				newList.push(current);
 			}
-		}else{
+		} else {
 			newList.push(current);
 		}
 	}
@@ -192,6 +202,9 @@
 
 const drawChart = () => {
 	const data = props.data;
+	if (!data || !data.cols || !data.values) {
+		return;
+	}
 	preData = data;
 	const xType = 'time';
 	timeIndex = data.cols.findIndex((item) => item.type === 'time');
@@ -244,10 +257,9 @@
 	let res = null;
 
 	try {
-		if(item.type===RecordSetParamsType.TimeRange){
-			changeMap.set(item.range[0].id,val[0]),
-			changeMap.set(item.range[1].id,val[1])
-		}else{
+		if (item.type === RecordSetParamsType.TimeRange) {
+			changeMap.set(item.range[0].id, val[0]), changeMap.set(item.range[1].id, val[1]);
+		} else {
 			changeMap.set(item.id, val);
 		}
 		const paramsObj = {};
@@ -393,5 +405,9 @@
 	}
 };
 //#endregion
+
+defineExpose({
+	drawChart,
+});
 </script>
 <style scoped lang="scss"></style>
diff --git a/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSetDialog.vue b/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSetDialog.vue
new file mode 100644
index 0000000..6f21cbb
--- /dev/null
+++ b/src/components/chat/chatComponents/summaryCom/components/recordSet/RecordSetDialog.vue
@@ -0,0 +1,75 @@
+<template>
+	<el-dialog :destroy-on-close="true" v-model="isShow" draggable :close-on-click-modal="false" :title="chartValues?.title">
+		<RecordSet chartHeight="30rem" ref="recordSetRef" :data="chartValues">
+			<TimeRange class="flex-0 m-1" @change="timeRangeChange" />
+			<List class="flex-0 m-1" v-model="stepTime" :data="listData" @change="selectStepChange" />
+		</RecordSet>
+	</el-dialog>
+</template>
+
+<script setup lang="ts">
+import { ref, watch } from 'vue';
+import RecordSet from './RecordSet.vue';
+import { queryScadaTimeValues } from '/@/api/ai/chat';
+import { useCompRef } from '/@/utils/types';
+import { getRecentDateRange } from '/@/utils/util';
+import { formatDate } from '/@/utils/formatTime';
+import TimeRange from './components/TimeRange.vue';
+import List from './components/List.vue';
+
+const props = defineProps(['otype', 'oname']);
+
+const isShow = defineModel({
+	type: Boolean,
+});
+
+const recordSetRef = useCompRef(RecordSet);
+
+const listData = {
+	list: [
+		{ title: '5鍒嗛挓', value: '5 minutes' },
+		{ title: '10鍒嗛挓', value: '10 minutes' },
+		{ title: '鍗婂皬鏃�', value: '30 minutes' },
+		{ title: '1灏忔椂', value: '1 hours' },
+		{ title: '1澶�', value: '1 days' },
+	],
+	type: 'list',
+	title: '鏃堕暱',
+	value: '5 minutes',
+} as any;
+
+const queryRange = ref<string[]>(null);
+const timeRangeChange = (val) => {
+	queryRange.value = val;
+	setChartData(queryRange.value);
+};
+
+const selectStepChange = (val) => {
+	setChartData(queryRange.value);
+};
+const stepTime = ref('5 minutes');
+const chartValues = ref(null);
+const setChartData = async (timeRange: string[]) => {
+	const res = await queryScadaTimeValues({
+		otype: props.otype,
+		oname: props.oname,
+		start_time: timeRange[0],
+		end_time: timeRange[1],
+		step_time: stepTime.value,
+	});
+	chartValues.value = res.values;
+	recordSetRef.value.drawChart();
+};
+
+watch(
+	() => isShow.value,
+	(val) => {
+		if (!val) {
+			return;
+		}
+		queryRange.value = getRecentDateRange(1).map((item) => formatDate(item));
+		setChartData(queryRange.value);
+	}
+);
+</script>
+<style scoped lang="scss"></style>
diff --git a/src/utils/types.ts b/src/utils/types.ts
index c041822..ffbf5b9 100644
--- a/src/utils/types.ts
+++ b/src/utils/types.ts
@@ -1,4 +1,5 @@
 import { isNil } from 'lodash-unified';
+import { ref } from 'vue';
 
 export const isUndefined = (val: any): val is undefined => val === undefined;
 export const isBoolean = (val: any): val is boolean => typeof val === 'boolean';
@@ -9,3 +10,10 @@
 };
 
 export const isFilledArray = (val: any) => Array.isArray(val) && val.length > 0;
+/**
+ *
+ * @param _comp 缁勪欢鏋勯�犲嚱鏁�
+ * @returns 缁勪欢 ref
+ * @example const formRef = useCompRef(ElForm);
+ */
+export const useCompRef = <T extends abstract new (...args: any) => any>(_comp: T) => ref<InstanceType<T>>();
\ No newline at end of file

--
Gitblit v1.9.3