From 0bb7dffa90bfa3bd5ad04b75da9c31d21347c668 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期一, 13 一月 2025 17:06:02 +0800
Subject: [PATCH] 用户管理页面调整

---
 src/views/project/yw/systemManage/metricMgr/MetricMgr.vue |  440 +++++++++++++++++++++++-------------------------------
 1 files changed, 185 insertions(+), 255 deletions(-)

diff --git a/src/views/project/yw/systemManage/metricMgr/MetricMgr.vue b/src/views/project/yw/systemManage/metricMgr/MetricMgr.vue
index 6c224d2..bbcc896 100644
--- a/src/views/project/yw/systemManage/metricMgr/MetricMgr.vue
+++ b/src/views/project/yw/systemManage/metricMgr/MetricMgr.vue
@@ -3,52 +3,46 @@
 		<template #header>
 			<el-form ref="queryFormRef" :inline="true" :model="queryParams">
 				<el-form-item label="鍚嶇О" prop="title">
-					<el-input v-model="queryParams.title" style="width: 226.4px" placeholder="鍚嶇О" clearable />
+					<el-input v-model="queryParams.title" style="width: 226.4px" placeholder="鎸囨爣鍚嶇О" clearable @input="selectTitleChange" />
 				</el-form-item>
-				<el-form-item label="涓婚鍩�" prop="themeDomainID">
+				<el-form-item label="涓婚鍩�" prop="metrics_group">
 					<el-tree-select
 						filterable
-						style="width: 256.4px"
-						v-model="queryParams.themeDomainID"
-						:data="listTreeData"
+						style="width: 206.4px"
 						:props="{
-							id: 'id',
-							label: 'name',
+							id: 'group_id',
+							label: 'group_name',
 							children: 'Children',
 						}"
-						multiple
-						node-key="id"
-						:clearable="true"
-						:accordion="true"
-						:expandNode="false"
-						default-expand-all
-						:check-strictly="true"
+						v-model="queryParams.metrics_group"
+						node-key="group_id"
+						clearable
+						defaultExpandAll
+						:data="listTreeData"
 						placeholder="璇烽�夋嫨涓婚鍩�"
-						@change="selectThemeChange"
+						check-strictly
+						@change="selectMetricsChange"
 					>
 					</el-tree-select>
 				</el-form-item>
-				<el-form-item label="鏁忔劅搴�" prop="sensitivity">
-					<el-select v-model="queryParams.sensitivity" style="width: 226.4px" clearable>
+				<el-form-item label="閲嶈鎬�" prop="metrics_important">
+					<el-select v-model="queryParams.metrics_important" style="width: 186.4px" clearable @change="selectImportantChange">
 						<el-option
-							v-for="item in Object.keys(eMetric_Ops)"
+							v-for="item in Object.keys(eMetrics_Ops)"
 							:key="item"
 							:value="parseInt(item)"
-							:label="eMetric_Ops[item]"
+							:label="eMetrics_Ops[item]"
 						></el-option>
 					</el-select>
 				</el-form-item>
 				<el-form-item>
-					<el-button type="primary" icon="ele-Search" @click="handleQueryTable"> 鏌ヨ </el-button>
 					<el-button icon="ele-Refresh" @click="resetQuery">閲嶇疆 </el-button>
-					<!-- <el-button icon="ele-Plus" @click="openOptDlg()"> 娣诲姞 </el-button> -->
 				</el-form-item>
 			</el-form>
 		</template>
 		<template #main>
 			<div class="h-full" ref="chatDragContainerRef">
 				<el-table
-					:span-method="objectSpanMethod"
 					v-loading="tableLoading"
 					ref="draggableTableRef"
 					class="h100"
@@ -56,232 +50,180 @@
 					:row-class-name="isDragStatus ? 'cursor-move' : 'cursor-pointer'"
 					:data="displayTableData"
 					highlight-current-row
-					:headerCellStyle="{ backgroundColor: 'var(--el-table-header-bg-color)' }"
+					:headerCellStyle="{ backgroundColor: 'var(--el-table-header-bg-color)', textAlign: 'center' }"
 				>
-					<el-table-column prop="title" label="鍚嶇О" width="120" fixed="left" show-overflow-tooltip> </el-table-column>
-					<el-table-column prop="full_name" label="鍏ㄧО" width="170" show-overflow-tooltip> </el-table-column>
-					<el-table-column prop="metric_define" label="瀹氫箟" show-overflow-tooltip> </el-table-column>
-					<el-table-column prop="calcu_method" label="璁$畻鏂规硶" width="120" show-overflow-tooltip> </el-table-column>
-
-					<el-table-column label="缁村害" prop="dimension" show-overflow-tooltip>
-						<el-table-column label="鍚嶇О" width="100" prop="dimension.title" show-overflow-tooltip> </el-table-column>
-						<el-table-column label="绫诲瀷" width="95" prop="dimension.type" show-overflow-tooltip> </el-table-column>
+					<el-table-column type="index" label="搴忓彿" width="55" fixed="left" align="center"></el-table-column>
+					<el-table-column prop="id" label="鎸囨爣缂栧彿" width="225" fixed="left"></el-table-column>
+					<el-table-column prop="title" label="鎸囨爣鍚嶇О" width="150" fixed="left" show-overflow-tooltip>
+						<template #default="scope">
+							<div class="text-[#1677ff]" @click="handleClickTitleRow(scope.row)">{{ scope.row.title }}</div>
+						</template>
+					</el-table-column>
+					<el-table-column prop="full_name" label="鎸囨爣鍏ㄧО" show-overflow-tooltip width="280"> </el-table-column>
+					<el-table-column label="閲嶈鎬�" prop="metrics_important" show-overflow-tooltip width="80" align="center">
+						<template #default="scope">
+							<el-tag
+								size="small"
+								:style="{
+									backgroundColor: eMetrics_Ops_Color[scope.row.metrics_important].bgColor,
+									color: eMetrics_Ops_Color[scope.row.metrics_important].fontColor,
+									borderColor: eMetrics_Ops_Color[scope.row.metrics_important].borderColor,
+								}"
+								>{{ eMetrics_Ops[scope.row.metrics_important] }}</el-tag
+							>
+						</template>
 					</el-table-column>
 
+					<el-table-column prop="metrics_group" label="涓婚鍩�" width="130" show-overflow-tooltip>
+						<template #default="scope">
+							{{ themeDomainMap[scope.row.metrics_group]?.group_name }}
+						</template>
+					</el-table-column>
+					<el-table-column prop="metrics_unit" label="鍗曚綅" width="70" show-overflow-tooltip> </el-table-column>
+
+					<el-table-column prop="metrics_define" width="180" label="鎸囨爣瀹氫箟" show-overflow-tooltip> </el-table-column>
+					<el-table-column prop="calcu_method" label="鎸囨爣璁$畻鍏紡" width="180" show-overflow-tooltip> </el-table-column>
+					<el-table-column prop="metrics_type" label="绫诲埆" show-overflow-tooltip width="120" align="center"> </el-table-column>
 					<el-table-column label="鎿嶄綔" width="80" fixed="right" show-overflow-tooltip>
 						<template #default="scope">
 							<div class="space-x-3 items-center flex">
-								<!-- <el-tooltip effect="dark" content="缂栬緫" placement="top">
-									<i class="ywifont ywicon-bianji !text-[15px] text-blue-400 cursor-pointer" @click="openOptDlg(scope.row)"></i>
-								</el-tooltip>
-								<el-tooltip effect="dark" content="鍒犻櫎" placement="top">
+								<!-- <el-tooltip
+									effect="dark"
+									:content="scope.row.published === SupervisorPublished.Y ? '鍙栨秷鍙戝竷' : '鍙戝竷'"
+									placement="top"
+								>
 									<i
-										class="ywifont ywicon-shanchu !text-[17px] text-red-400 cursor-pointer"
+										class="ywifont !text-[20px] cursor-pointer"
+										:class="[
+											scope.row.published === SupervisorPublished.Y ? 'ywicon-quxiaofabu text-red-400' : 'ywicon-fabu text-blue-400',
+										]"
 										@click="
-											() => {
-												deleteCurrentRow(scope.row, '椤甸潰', metricApi.deleteSupervisor, () => {
-													const foundIndex = tableData.findIndex((item) => item === scope.row);
-													foundIndex > -1 && tableData.splice(foundIndex, 1);
-												});
-											}
+											publishStatusChange(
+												scope.row.published === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y,
+												scope.row.id,
+												scope.$index
+											)
 										"
 									></i>
 								</el-tooltip> -->
-								<el-tooltip effect="dark" content="鍙戝竷" placement="top">
-									<el-tooltip
-										effect="dark"
-										:content="scope.row.published === SupervisorPublished.Y ? '鍙栨秷鍙戝竷' : '鍙戝竷'"
-										placement="top"
-									>
-										<i
-											class="ywifont !text-[20px] cursor-pointer"
-											:class="[
-												scope.row.published === SupervisorPublished.Y ? 'ywicon-quxiaofabu text-red-400' : 'ywicon-fabu text-blue-400',
-											]"
-											@click="
-												publishStatusChange(
-													scope.row.published === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y,
-													scope.row.id,
-													scope.$index
-												)
-											"
-										></i>
-									</el-tooltip>
+								<el-tooltip effect="dark" content="瀵硅瘽娴嬭瘯" placement="top">
+									<i class="ywifont ywicon-ceshi !text-[20px] text-blue-400 cursor-pointer" @click="openChatTest(scope.row)"></i>
 								</el-tooltip>
 							</div>
 						</template>
 					</el-table-column>
 				</el-table>
+				<div
+					v-if="chatTestIsShow"
+					ref="draggableChatRef"
+					:style="style"
+					class="fixed z-50 w-[700px] h-[800px] flex flex-col bg-[rgb(239,244,253)] right-0 bottom-0 rounded-lg"
+				>
+					<div ref="chatDragHandlerRef" class="flex-0">
+						<div class="flex items-center justify-between py-2 px-4">
+							<div class="font-bold cursor-move">
+								WI姘村姟鏅鸿兘绠″鈥斺�斻�恵{ chatTestMapRow?.title }}銆戞祴璇�
+								<!-- <img src="/static/images/logo/logo-mini.svg" width="10" height="10" /> -->
+							</div>
+							<i class="ywifont ywicon-guanbi font-[10px] font-bold cursor-pointer" @click="closeChatTest"></i>
+						</div>
+					</div>
+					<Chat ref="chatRef" class="flex-auto px-2" :questionApi="questionAi"> </Chat>
+				</div>
 			</div>
 		</template>
-
-		<!-- <OptDlg v-model="optDlgIsShow" :item="optDlgMapRow" @insert="insertOpt" @update="updateOpt" :groupId="currentListID"></OptDlg> -->
-		<!-- <MetricPrompt v-model="infoDlgIsShow" :metricItem="infoDlgMapRow"></MetricPrompt>
-		<MetricName v-model="metricNameIsShow" :metricItem="metricNameMapRow"></MetricName> -->
 	</HMContainer>
 </template>
 
 <script setup lang="ts">
-import _ from 'lodash';
-import { computed, onMounted, ref } from 'vue';
-import { SupervisorPublished } from '../../lowCode/sqlAmis/types';
-import * as metricApi from '/@/api/metric';
+import { useDraggable } from '@vueuse/core';
+import type { CancelTokenSource } from 'axios';
+import axios from 'axios';
+import { debounce } from 'lodash';
+import { computed, nextTick, onMounted, ref } from 'vue';
+import { useRouter } from 'vue-router';
+import type { SupervisorPublished } from '../../lowCode/sqlAmis/types';
+import * as agentGroupApi from '/@/api/ai/agentGroup';
+import * as metricApi from '/@/api/metrics';
+import Chat from '/@/components/chat/Chat.vue';
 import HMContainer from '/@/components/layout/HMContainer.vue';
 import { usePageDisplay } from '/@/hooks/usePageDisplay';
 import { useQueryTable } from '/@/hooks/useQueryTable';
-import { convertListToTree } from '/@/utils/util';
-import { eMetric_Ops } from '/@/views/types/metric';
-// 闇�瑕佸悎骞跺崟鍏冩牸鐨� prop
-const GROUP_PROP = ['title', 'full_name', 'metric_define', 'calcu_method'];
-const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
-	if (GROUP_PROP.includes(column.property)) {
-		return {
-			rowspan: row.rowspan,
-			colspan: 1,
-		};
-	}
-};
+import { useCompRef } from '/@/utils/types';
+import { convertListToTree, getItemMap } from '/@/utils/util';
+import { OptClassificationMap, classificationEnum, eMetrics_Ops, eMetrics_Ops_Color } from '/@/views/types/metrics';
+const router = useRouter();
 
-const parseData = (data: any[]) => {
-	const finalData = (data ?? []).reduce((pre, cur) => {
-		const dimensions = cur.dimensions;
-		pre.push(
-			...dimensions.map((item, index) => ({
-				..._.omit(cur, 'dimensions'),
-				id: cur.id + '_dimension_' + item.id,
-				dimension: item,
-				rowspan: index === 0 ? dimensions.length : undefined,
-			}))
-		);
-		return pre;
-	}, []);
-	return finalData;
-};
 //#region ====================== 琛ㄦ牸鏁版嵁锛宼able init ======================
 const tableLoading = ref(false);
 const tableData = ref([]);
 const isDragStatus = ref(false);
 const getTableData = async () => {
 	const res = await metricApi.getMetricNameListByPost();
-
-	tableData.value = parseData(res?.values ?? []);
+	const data = res?.values ?? [];
+	tableData.value = data;
 };
 //#endregion
 
 //#region ====================== 琛ㄦ牸鏌ヨ銆佹帓搴忥紝search form init ======================
-const themeDomainData = ref([
-	{
-		createdBy: 'admin',
-		updatedBy: 'admin',
-		createdAt: '2024-10-08T02:03:38.901+00:00',
-		updatedAt: '2024-10-08T02:03:38.901+00:00',
-		id: 1,
-		name: '瓒呴煶鏁�',
-		bizName: 'supersonic',
-		description: null,
-		status: 1,
-		typeEnum: null,
-		sensitiveLevel: 0,
-		parentId: 0,
-		fullPath: 'supersonic/',
-		viewers: ['admin', 'tom'],
-		viewOrgs: [],
-		admins: ['admin', 'jack'],
-		adminOrgs: [],
-		isOpen: 0,
-		hasEditPermission: true,
-		hasModel: false,
-	},
-	{
-		createdBy: 'admin',
-		updatedBy: 'admin',
-		createdAt: '2024-10-08T02:03:38.913+00:00',
-		updatedAt: '2024-10-08T02:03:38.913+00:00',
-		id: 2,
-		name: '鍩嬬偣妯″瀷闆�',
-		bizName: 'visit_info',
-		description: null,
-		status: 1,
-		typeEnum: null,
-		sensitiveLevel: 0,
-		parentId: 1,
-		fullPath: 'supersonic/visit_info/',
-		viewers: [],
-		viewOrgs: [],
-		admins: [],
-		adminOrgs: [],
-		isOpen: 0,
-		hasEditPermission: true,
-		hasModel: true,
-	},
-	{
-		createdBy: 'admin',
-		updatedBy: 'admin',
-		createdAt: '2024-10-08T02:03:52.593+00:00',
-		updatedAt: '2024-10-08T02:03:52.593+00:00',
-		id: 3,
-		name: '鑹轰汉搴�',
-		bizName: 'singer',
-		description: null,
-		status: 1,
-		typeEnum: null,
-		sensitiveLevel: 0,
-		parentId: 0,
-		fullPath: 'singer/',
-		viewers: ['admin', 'tom', 'jack'],
-		viewOrgs: ['1'],
-		admins: ['admin', 'alice'],
-		adminOrgs: [],
-		isOpen: 0,
-		hasEditPermission: true,
-		hasModel: false,
-	},
-	{
-		createdBy: 'admin',
-		updatedBy: 'admin',
-		createdAt: '2024-10-08T02:03:52.594+00:00',
-		updatedAt: '2024-10-08T02:03:52.594+00:00',
-		id: 4,
-		name: '鏍囩妯″瀷闆�',
-		bizName: 'singer_info',
-		description: null,
-		status: 1,
-		typeEnum: null,
-		sensitiveLevel: 0,
-		parentId: 3,
-		fullPath: 'singer/singer_info/',
-		viewers: [],
-		viewOrgs: [],
-		admins: [],
-		adminOrgs: [],
-		isOpen: 0,
-		hasEditPermission: true,
-		hasModel: true,
-	},
-]); // 涓婚鍩熸暟鎹�
-const listTreeData = computed(() => {
-	return convertListToTree(themeDomainData.value, {
-		ID: 'id',
-		Children: 'Children',
-		ParentID: 'parentId',
-	});
-});
-const selectThemeChange = async (value: string) => {
-	return;
-	const res = await metricApi.getThemeDomainByPost({
-		equipmentLocationID: value,
-	});
-	themeDomainData.value = res.values;
+const themeDomainData = ref([]); // 涓婚鍩熸暟鎹�
+const initThemeDomainData = async () => {
+	const res = await agentGroupApi.getSceneGroupTreeByPost();
+	themeDomainData.value = res.groups || [];
 };
+
+const themeDomainMap = computed(() => {
+	return getItemMap(themeDomainData.value, 'group_id');
+});
+const listTreeData = computed(() => {
+	const byParentData = convertListToTree(themeDomainData.value, {
+		ID: 'group_id',
+		Children: 'Children',
+		ParentID: 'p_group_id',
+	});
+	const result = [];
+	byParentData.forEach((item) => {
+		if (
+			item.group_type != OptClassificationMap[classificationEnum.Office] &&
+			item.group_type != OptClassificationMap[classificationEnum.Knowledge]
+		) {
+			result.push(item);
+		}
+	});
+	return result;
+});
+const debounceQuery = debounce(() => handleQueryTable(), 500);
+//鎸夋寚鏍囧悕绉版煡璇�
+const selectTitleChange = (val) => {
+	debounceQuery();
+};
+//鎸変富棰樺煙鏌ヨ
+const selectMetricsChange = (val) => {
+	queryParams.value.metrics_group = val;
+	handleQueryTable();
+};
+//鎸夐噸瑕佹�ф煡璇�
+const selectImportantChange = (val) => {
+	queryParams.value.metrics_important = val;
+	handleQueryTable();
+};
+
 const queryParams = ref({
 	title: '',
-	// themeDomainID: null,
-	sensitivity: '',
+	metrics_group: '',
+	metrics_important: '',
 });
 const { resetQuery, handleQueryTable, displayTableData } = useQueryTable(tableData, queryParams, () => {
 	displayTableData.value = tableData.value;
 });
-
+const handleClickTitleRow = (row: any) => {
+	router.push({
+		name: 'MetricDetail',
+		query: {
+			id: row.id,
+		},
+	});
+};
 //#endregion
 
 //#region ====================== 鏌ヨ蹇嵎閿� ======================
@@ -300,70 +242,58 @@
 	}
 );
 //#endregion
-
-//#region ====================== 娣诲姞淇敼鎿嶄綔 ======================
-const optDlgIsShow = ref(false);
-const optDlgMapRow = ref(null);
-const openOptDlg = (row?: any) => {
-	optDlgMapRow.value = row;
-	optDlgIsShow.value = true;
+//#region ====================== 鎿嶄綔鎸夐挳  娴嬭瘯 ======================
+const publishStatusChange = async (status: SupervisorPublished, id: number, index: number) => {};
+const chatRef = useCompRef(Chat);
+const chatTestMapRow = ref(null);
+const chatTestIsShow = ref(false);
+const openChatTest = (row) => {
+	chatTestMapRow.value = row;
+	chatTestIsShow.value = true;
+	nextTick(() => {
+		chatRef.value.clear();
+		// setTimeout(() => {
+		// 	chatRef.value.autoSend(row.title);
+		// }, 30);
+	});
 };
 
-const updateOpt = (formValue) => {
-	const foundIndex = tableData.value.findIndex((item) => item.id === formValue.id);
-	if (foundIndex > -1) {
-		tableData.value[foundIndex] = {
-			...tableData.value[foundIndex],
-			...formValue,
-		};
-	}
+const closeChatTest = () => {
+	chatTestMapRow.value = null;
+	chatTestIsShow.value = false;
 };
 
-const insertOpt = (newData) => {
-	tableData.value.unshift({ ...newData, published: SupervisorPublished.N });
-};
-//#endregion
+const draggableChatRef = ref<HTMLElement | null>(null);
+const chatDragHandlerRef = ref<HTMLDivElement>(null);
+const chatDragContainerRef = ref<HTMLDivElement>(null);
 
-const updatePublishedById = (id: string, published: SupervisorPublished) => {
-	const row = tableData.value.find((item) => item.id === id);
-	if (row) {
-		row.published = published;
-	}
-};
-//#region ====================== 鏀瑰彉鍙戝竷鐘舵�� ======================
-const publishStatusChange = async (published: SupervisorPublished, id, index) => {
-	return;
-	const res = await updatePublishStatus(
+// `style` will be a helper computed for `left: ?px; top: ?px;`
+const { x, y, style } = useDraggable(draggableChatRef, {
+	handle: chatDragHandlerRef,
+	initialValue: {
+		x: document.body.clientWidth / 2 - 350,
+		y: document.body.clientHeight / 2 - 400,
+	},
+});
+
+const questionAi = async (text, sourceObj: { source: CancelTokenSource }) => {
+	const currentSource = axios.CancelToken.source();
+	sourceObj.source = currentSource;
+	const res = await metricApi.checkMetricAgentValidateByPost(
 		{
-			id: id,
-			publish: published,
+			agent_id: chatTestMapRow.value.id,
+			question: text,
 		},
 		{
 			loading: false,
+			cancelToken: currentSource.token,
 		}
 	);
-	const origin = published === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y;
-	const final = res.publish ?? origin;
-	if (final === origin) {
-		ElMessage.warning('鎿嶄綔澶辫触' + (res.fail_msg ? `锛�${res.fail_msg}` : ''));
-		return;
-	}
-
-	tableData.value[index].published = final;
-
-	published === SupervisorPublished.Y ? ElMessage.success('鍙戝竷鎴愬姛') : ElMessage.info('宸插彇娑堝彂甯�');
+	return res;
 };
 //#endregion
-
-//#region ====================== 鏇存柊鍙戝竷鐘舵�� ======================
-// useUpdateData({
-// 	event: 'supervisor.publish',
-// 	updateFun({ id, published }) {
-// 		updatePublishedById(id, published);
-// 	},
-// });
-//#endregion
 onMounted(() => {
+	initThemeDomainData();
 	getTableData();
 });
 </script>

--
Gitblit v1.9.3