From 8d83544ff6e123df4facf40c446e7d9bf4a522b6 Mon Sep 17 00:00:00 2001
From: wujingjing <gersonwu@qq.com>
Date: 星期二, 31 十二月 2024 18:07:54 +0800
Subject: [PATCH] 序号

---
 src/views/project/yw/dataManage/knowledge/AddKnowledge.vue |  655 ++++++++++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 577 insertions(+), 78 deletions(-)

diff --git a/src/views/project/yw/dataManage/knowledge/AddKnowledge.vue b/src/views/project/yw/dataManage/knowledge/AddKnowledge.vue
index cd627f8..d89123c 100644
--- a/src/views/project/yw/dataManage/knowledge/AddKnowledge.vue
+++ b/src/views/project/yw/dataManage/knowledge/AddKnowledge.vue
@@ -1,99 +1,249 @@
 <template>
-	<div class="h100 overflow-y-auto p-[16px]">
-		<div class="mb-[10px] flex items-center">
-			<el-button style="margin-left: 8px; width: 40px" text @click="handleExitFlow">
+	<div class="flex flex-col h100">
+		<div class="mb-[10px] flex flex-shrink-0 items-center">
+			<el-button style="margin-left: 8px; width: 40px" link @click="handleExitFlow">
 				<el-icon style="font-size: 24px !important">
 					<ArrowLeft />
 				</el-icon>
 			</el-button>
 			<span class="text-[24px] text-[#26244c] font-[700]">{{ state.detailTitle }}</span>
 		</div>
-		<div class="relative">
-			<div class="relative transition-[opacity 0.3s]">
-				<div class="set-form-height">
-					<div class="flex flex-col">
-						<el-divider content-position="left"><span class="text-[18px]">鐭ヨ瘑搴撳熀纭�淇℃伅</span></el-divider>
-						<el-form :model="state.categoryForm" label-width="120px" label-position="left">
-							<el-form-item label="鐭ヨ瘑搴撳悕绉�:">
-								<el-input
-									v-model="state.categoryForm.ImportCategory"
-									style="width: 532px"
-									maxlength="20"
-									placeholder="璇疯緭鍏ョ煡璇嗗簱鍚嶇О"
-									show-word-limit
-									type="text"
-								/>
-							</el-form-item>
-							<el-form-item label="鐭ヨ瘑搴撴弿杩�:">
-								<el-input
-									v-model="state.categoryForm.CategoryType"
-									maxlength="1000"
-									style="width: 532px"
-									placeholder="璇疯緭鍏ョ煡璇嗗簱鎻忚堪銆傚鐭ヨ瘑搴撳寘鍚殑鍐呭鍜屾暟鎹殑鐢ㄩ�旇繘琛屾弿杩般��"
-									show-word-limit
-									:rows="5"
-									type="textarea"
-								/>
-							</el-form-item>
-							<el-form-item label="鏁版嵁绫诲瀷:">
-								<div v-for="(item, index) in state.dataTypeList" :key="index">
-									<div
-										class="bg-[#f6f5ff] border-[1px] border-solid border-[#0062be] py-[12px] w-[215px] px-[16px] rounded-lg cursor-pointer"
-									>
-										<el-radio v-model="state.categoryForm.dataType" size="large">
-											<span class="font-[700] text[14px]">{{ item.Name }}</span>
-										</el-radio>
-
-										<el-tooltip :content="item.DemoDesc" placement="top" effect="light" popper-class="set_tooltip_demo">
-											<div class="text-[#878aab] text-[12px] mx-0 mt-[2px] mb-0 set-desc">
-												{{ item.DemoDesc }}
-											</div>
-										</el-tooltip>
-									</div>
+		<div class="set-form-height" v-show="!state.showKnowledgeForm">
+			<el-form
+				:model="state.knowledgeForm"
+				label-width="120px"
+				label-position="left"
+				ref="knowledgeFormRef"
+				:rules="knowledgeFormRules"
+			>
+				<el-divider content-position="left"><span class="text-[18px] font-[500]">鐭ヨ瘑搴撳熀纭�淇℃伅</span></el-divider>
+				<el-form-item label="鐭ヨ瘑搴撳悕绉�:" prop="title">
+					<el-input
+						v-model="state.knowledgeForm.title"
+						style="width: 532px"
+						maxlength="20"
+						placeholder="璇疯緭鍏ョ煡璇嗗簱鍚嶇О"
+						show-word-limit
+						type="text"
+					/>
+				</el-form-item>
+				<el-form-item label="鐭ヨ瘑搴撴弿杩�:" prop="prompt">
+					<el-input
+						v-model="state.knowledgeForm.prompt"
+						maxlength="1000"
+						style="width: 532px"
+						placeholder="璇疯緭鍏ョ煡璇嗗簱鎻忚堪銆傚鐭ヨ瘑搴撳寘鍚殑鍐呭鍜屾暟鎹殑鐢ㄩ�旇繘琛屾弿杩般��"
+						show-word-limit
+						:rows="5"
+						type="textarea"
+					/>
+				</el-form-item>
+				<el-form-item label="绱㈠紩鍒嗘暟:" prop="scope">
+					<el-input v-model="state.knowledgeForm.scope" style="width: 532px" />
+				</el-form-item>
+				<el-form-item label="鏁版嵁绫诲瀷:">
+					<div v-for="(item, index) in state.dataTypeList" :key="index">
+						<div
+							class="bg-[#fff] border-[1px] border-solid border-[#d8d9e6] py-[12px] w-[215px] mr-[10px] px-[16px] rounded-lg cursor-pointer"
+							:class="{ activeColor: state.knowledgeForm.dataType === item.ID }"
+							@click="activeDataType(item.ID)"
+						>
+							<div class="flex items-center">
+								<div class="data_left">
+									<img :src="item.ImageURL" class="w-[40px] h-[40px] mr-[10px]" />
 								</div>
-							</el-form-item>
-							<!-- <el-form-item label="閰嶇疆妯″紡:">
-								<div
-									class="bg-[#f6f5ff] border-[1px] border-solid border-[#0062be] py-[12px] w-[215px] px-[16px] rounded-lg cursor-pointer"
-								>
-									<el-radio-group v-model="state.categoryForm.configurationMode">
-										<el-radio value="1" size="large">
-											<span class="font-[700] text[14px]">鏂囨。鏅鸿兘瑙f瀽</span>
-										</el-radio>
-									</el-radio-group>
-									<el-tooltip :content="state.demoDesc" placement="top" effect="light" popper-class="set_tooltip_demo">
+								<div class="data_right">
+									<el-radio v-model="state.knowledgeForm.dataType" size="large" :label="item.ID">
+										<span class="font-[500] text[16px]">{{ item.Name }}</span>
+									</el-radio>
+
+									<el-tooltip :content="item.DemoDesc" placement="top" effect="light" popper-class="set_tooltip_demo">
 										<div class="text-[#878aab] text-[12px] mx-0 mt-[2px] mb-0 set-desc">
-											{{ state.demoDesc }}
+											{{ item.DemoDesc }}
 										</div>
 									</el-tooltip>
 								</div>
-							</el-form-item> -->
-						</el-form>
+							</div>
+						</div>
+					</div>
+				</el-form-item>
+				<el-divider content-position="left"><span class="text-[18px]">鐭ヨ瘑搴撻厤缃�</span></el-divider>
+				<el-form-item label="閰嶇疆妯″紡:">
+					<div class="flex-auto flex flex-col">
+						<div class="flex">
+							<div v-for="(item, index) in state.configurationList" :key="index">
+								<div
+									class="bg-[#fff] border-[1px] border-solid border-[#d8d9e6] py-[12px] w-[215px] mr-[10px] px-[16px] rounded-lg cursor-pointer"
+									:class="{ activeColor: state.knowledgeForm.configurationMode === item.ID }"
+									@click="activeConfigurationType(item.ID)"
+								>
+									<div class="flex items-center">
+										<div class="data_left">
+											<img :src="item.ImageURL" class="w-[40px] h-[40px] mr-[10px]" />
+										</div>
+										<div class="data_right">
+											<el-radio v-model="state.knowledgeForm.configurationMode" size="large" :label="item.ID">
+												<span class="font-[500] text[16px]">{{ item.Name }}</span>
+											</el-radio>
 
-						<div class="set-form-footer">
-							<el-button type="primary" @click="onSubmit">涓嬩竴姝�</el-button>
-							<el-button>鍙栨秷</el-button>
+											<el-tooltip :content="item.DemoDesc" placement="top" effect="light" popper-class="set_tooltip_demo">
+												<div class="text-[#878aab] text-[12px] mx-0 mt-[2px] mb-0 set-desc">
+													{{ item.DemoDesc }}
+												</div>
+											</el-tooltip>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+						<!-- <div class="set_model_desc">
+							<div v-for="(item, index) in state.modeList" :key="index">
+								<div class="flex items-center mb-[16px]">
+									<div class="relative w-[148px] text-[14px] text-[#26244c]">{{ item.Name }}</div>
+									<div class="text-[14px] text-[#26244c]" :class="`min-w-[${item.NameFnWidthStyle}]`">{{ item.NameFn }}</div>
+									<div v-show="item.ID == 3">
+										<div class="min-w-[148px] text-[14px] text-[#26244c]">{{ item.NameOrder }}</div>
+									</div>
+								</div>
+							</div>
+						</div> -->
+					</div>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="set-form-height" v-show="state.showKnowledgeForm">
+			<el-form
+				:model="state.knowledgeFile"
+				label-width="120px"
+				label-position="left"
+				class="h100"
+				ref="knowledgeFileRef"
+				:rules="knowledgeFormRules"
+			>
+				<el-divider content-position="left"><span class="text-[18px] font-[500]">閫夋嫨鏂囦欢</span></el-divider>
+				<div class="flex items-start gap-[16px] max-h-[686px] min-h-[360px] set-file-height">
+					<div class="min-h-[360px] h100 set_file_left">
+						<div class="font-[500] mb-2">璇烽�夋嫨鏂囨。</div>
+						<div class="left_content">
+							<div class="file_menu">
+								<LeftTreeByMgr
+									title-name="绫荤洰"
+									ref="leftTreeRef"
+									:treedata="state.knowledgeBaseData"
+									:current-node-key="currentListID"
+									:defaultProps="{
+										id: 'group_id',
+										label: 'group_name',
+										children: 'Children',
+									}"
+									defaultExpandAll
+									@click="handleClickNode"
+								>
+								</LeftTreeByMgr>
+							</div>
+							<div class="file_table">
+								<el-table
+									:data="state.fileData"
+									border
+									@select="handleSelectItem"
+									highlight-current-row
+									ref="multipleTableRef"
+									@select-all="
+										(selection) => {
+											handleSelectAll(selection, state.fileData);
+										}
+									"
+								>
+									<el-table-column type="selection" width="55" />
+									<el-table-column prop="name" label="鏂囦欢鍚嶇О" />
+								</el-table>
+							</div>
+						</div>
+					</div>
+					<div class="set_file_right">
+						<div class="h100">
+							<div class="font-[500] mb-[12px]">宸查�夋枃妗{ multipleSelection.length }}/50涓�</div>
+							<div class="selected_file">
+								<div v-for="(item, index) in multipleSelection" :key="index" class="set_file_item">
+									<span class="set_file_name">{{ item.name }}</span>
+									<span class="ywifont ywicon-guanbi set_file_close" @click="handleRemoveItem(item)"></span>
+								</div>
+							</div>
 						</div>
 					</div>
 				</div>
+				<el-divider content-position="left"><span class="text-[18px]">鏁版嵁澶勭悊</span></el-divider>
+				<el-form-item label="鏂囨。鍒囧垎chunk:">
+					<div class="flex-auto flex flex-col">
+						<div class="flex">
+							<div v-for="(item, index) in state.segmentationList" :key="index">
+								<div
+									class="bg-[#fff] border-[1px] border-solid border-[#d8d9e6] py-[12px] w-[215px] mr-[10px] px-[16px] rounded-lg cursor-pointer"
+									:class="{ activeColor: state.knowledgeForm.segmentationMode === item.ID }"
+									@click="activeDataProcessType(item.ID)"
+								>
+									<div class="flex items-center">
+										<div class="data_left">
+											<img :src="item.ImageURL" class="w-[40px] h-[40px] mr-[10px]" />
+										</div>
+										<div class="data_right">
+											<el-radio v-model="state.knowledgeForm.segmentationMode" size="large" :label="item.ID">
+												<span class="font-[500] text[16px]">{{ item.Name }}</span>
+											</el-radio>
+
+											<el-tooltip :content="item.DemoDesc" placement="top" effect="light" popper-class="set_tooltip_demo">
+												<div class="text-[#878aab] text-[12px] mx-0 mt-[2px] mb-0 set-desc">
+													{{ item.DemoDesc }}
+												</div>
+											</el-tooltip>
+										</div>
+									</div>
+								</div>
+							</div>
+						</div>
+					</div>
+				</el-form-item>
+			</el-form>
+		</div>
+		<div class="set-form-footer">
+			<div v-show="!state.showKnowledgeForm">
+				<el-button type="primary" @click="nextKnowledge">涓嬩竴姝�</el-button>
 			</div>
+			<div v-show="state.showKnowledgeForm">
+				<el-button @click="importCompleted" type="primary">瀵煎叆瀹屾垚</el-button>
+				<el-button @click="backKnowledge" v-show="state.showKnowledgeForm">涓婁竴姝�</el-button>
+			</div>
+			<el-button @click="handleExitFlow">鍙栨秷</el-button>
 		</div>
 	</div>
 </template>
 
 <script setup lang="ts">
-import type { UploadUserFile } from 'element-plus';
-import { reactive, ref } from 'vue';
-import { useRouter } from 'vue-router';
+import { ElMessage, type FormRules } from 'element-plus';
+import moment from 'moment';
+import { computed, nextTick, onMounted, reactive, ref } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import { add_docvector_file, add_docvector_name } from '/@/api/knowledge/docvector';
+import { get_knowledge_group_list, list_knowledge_file } from '/@/api/knowledge/group';
+import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue';
+import mittBus from '/@/utils/mitt';
+import { verifiyNumberInteger } from '/@/utils/toolsValidate';
+import { convertListToTree } from '/@/utils/util';
+import { OptClassificationMap, classificationEnum } from '/@/views/types/metrics';
+const route = useRoute();
 // 瀹氫箟鍙橀噺鍐呭
 const state = reactive({
+	soliderValue: 0,
 	detailTitle: '鍒涘缓鐭ヨ瘑搴�',
-	categoryForm: {
-		ImportCategory: '',
-		CategoryType: '鏈湴绫荤洰',
-		dataType: '1',
-		configurationMode: '1',
+	knowledgeForm: {
+		title: '',
+		prompt: '',
+		scope: null,
+		dataType: 1,
+		configurationMode: 1,
+		segmentationMode: 1,
 	},
+	knowledgeFile: {},
 	dataTypeList: [
 		{
 			ID: 1,
@@ -107,27 +257,294 @@
 			ImageURL: 'static/images/knowledge/data_type_2.png',
 			DemoDesc: '閫夋嫨鏁版嵁绠$悊鍔熻兘涓凡鍒涘缓鐨勬暟鎹〃',
 		},
+	], //鏁版嵁绫诲瀷
+	configurationList: [
+		{
+			ID: 1,
+			Name: '鎺ㄨ崘閰嶇疆',
+			ImageURL: 'static/images/knowledge/data_type_3.png',
+			DemoDesc: '鐧剧偧鎺ㄨ崘閰嶇疆锛屽湪鏁堟灉銆佹帹鐞嗘垚鏈�佹绱㈡椂寤剁瓑鏂归潰鐨勬渶浣冲疄璺�',
+		},
+		{
+			ID: 3,
+			Name: '鑷畾涔�',
+			ImageURL: 'static/images/knowledge/data_type_4.png',
+			DemoDesc: '瀹屽叏寮�鏀剧殑绂荤嚎鐭ヨ瘑搴撻厤缃紝鎸夌収妫�绱㈤渶姹傝嚜鐢遍厤缃紝鑾峰緱鎺ㄧ悊鏁堟灉鍜屾椂寤舵柟闈㈢殑涓嶅悓浣撻獙',
+		},
+	], //閰嶇疆妯″紡
+	segmentationList: [
+		{
+			ID: 1,
+			Name: '鏅鸿兘鍒囧垎',
+			ImageURL: 'static/images/knowledge/data_type_3.png',
+			DemoDesc: '鍦ㄩ�氱敤鏂囨。涓婄殑鏈�浼榗hunk鍒囧垎鏂规硶锛岀粡杩囪瘎娴嬪彲鍦ㄥ鏁版枃妗d笂鑾峰緱鏈�浣崇殑妫�绱㈡晥鏋�',
+		},
+		{
+			ID: 3,
+			Name: '鑷畾涔夊垏鍒�',
+			ImageURL: 'static/images/knowledge/data_type_4.png',
+			DemoDesc: '瀹屽叏寮�鏀剧殑chunk鍒囧垎閰嶇疆锛屾寜鐓у疄闄呮枃妗f儏鍐佃嚜鐢遍厤缃紝閫氳繃璋冭瘯鑾峰緱鏇村ソ鐨勬绱㈡晥鏋�',
+		},
 	],
+	modeList: [
+		{
+			ID: 1,
+			Name: '澶氳疆瀵硅瘽鏀瑰啓',
+			NameFn: '寮�鍚�',
+			NameOrder: null,
+			NameFnWidthStyle: '380px',
+		},
+		{
+			ID: 2,
+			Name: 'Embedding妯″瀷',
+			NameFn: '瀹樻柟鍚戦噺',
+			NameOrder: null,
+			NameFnWidthStyle: '380px',
+		},
+		{
+			ID: 3,
+			Name: '鎺掑簭閰嶇疆',
+			NameFn: 'Rank妯″瀷',
+			NameOrder: '瀹樻柟鎺掑簭',
+			NameFnWidthStyle: '148px',
+		},
+		{
+			ID: 4,
+			Name: '',
+			NameFn: '鐩镐技搴﹂槇鍊�',
+			NameOrder: null,
+			NameFnWidthStyle: '148px',
+		},
+	],
+	showKnowledgeForm: false,
+	knowledgeBaseData: [], //鐭ヨ瘑搴撶被鐩�
+	fileData: [], //鏂囦欢鏁版嵁婧�
+	isCreateIndex: false, //鏄惁璋冪敤鍒涘缓鐨勭储寮曠殑瀛楁
+	knowlg_id: '',
+	groupKnow_id: null,
 });
-const fileList = ref<UploadUserFile[]>([]);
+//楠岃瘉scope瀛楁鍙兘杈撳叆姝f暣鏁�
+const validateNumber = (rule, value, callback) => {
+	if (value < 31) {
+		callback(new Error('璇疯緭鍏ュぇ浜�30鐨勬鏁存暟'));
+	} else {
+		state.knowledgeForm.scope = verifiyNumberInteger(value);
+		callback();
+	}
+};
+const knowledgeFormRules = reactive<FormRules>({
+	title: [
+		{
+			required: true,
+			message: '蹇呭~椤�',
+			trigger: 'blur',
+		},
+	],
+	prompt: [
+		{
+			required: true,
+			message: '蹇呭~椤�',
+			trigger: 'blur',
+		},
+	],
+	scope: [{ validator: validateNumber, trigger: 'blur' }],
+});
+const knowledgeFormRef = ref();
 const router = useRouter();
+
+//#region ====================== 鐭ヨ瘑搴撹〃鍗曟搷浣� ======================
 //杩斿洖
 const handleExitFlow = () => {
 	//鏄惁鏄剧ず杩斿洖
 	router.back();
+	//娓呯┖琛ㄥ崟
+	knowledgeFormRef.value.resetFields();
+	state.showKnowledgeForm = false;
+	state.isCreateIndex = false;
 };
-//纭
-const onSubmit = () => {};
+//閫夋嫨鏁版嵁绫诲瀷
+const activeDataType = (id: number) => {
+	state.knowledgeForm.dataType = id;
+};
+//閫夋嫨閰嶇疆妯″紡
+const activeConfigurationType = (id: number) => {
+	state.knowledgeForm.configurationMode = id;
+};
+//閫夋嫨鏁版嵁鏂囨。鍒囧垎
+const activeDataProcessType = (id: number) => {
+	state.knowledgeForm.segmentationMode = id;
+};
+//涓嬩竴姝�
+const nextKnowledge = async () => {
+	const valid = await knowledgeFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+	state.showKnowledgeForm = true;
+	if (!state.isCreateIndex) {
+		emptyKnowledgeBase();
+		state.isCreateIndex = true;
+	}
+};
+const backKnowledge = () => {
+	state.showKnowledgeForm = false;
+	state.isCreateIndex = true;
+};
+
+//#endregion
+//#region ====================== 绌虹煡璇嗗簱鐨勫垱寤� ======================
+
+//鍒涘缓涓�涓┖鐭ヨ瘑搴�
+const emptyKnowledgeBase = async () => {
+	const valid = await knowledgeFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+	var currentTime = moment().format('YYYY-MM-DD HH:mm:ss');
+	const res = await add_docvector_name({
+		title: state.knowledgeForm.title,
+		prompt: state.knowledgeForm.prompt,
+		scope: state.knowledgeForm.scope,
+		group_id: state.groupKnow_id,
+	});
+	if (res.json_ok) {
+		state.knowlg_id = res.knowlg_id;
+		let obj = {
+			id: state.knowlg_id,
+			group_id: state.groupKnow_id,
+			title: state.knowledgeForm.title,
+			prompt: state.knowledgeForm.prompt,
+			publish: 'N',
+			create_time: currentTime,
+			user_name: '',
+			scope: state.knowledgeForm.scope,
+		};
+		mittBus.emit('addEmptyKnowledge', obj);
+		getFileTreeData(true);
+		state.isCreateIndex = false;
+	}
+};
+//瀵煎叆瀹屾垚
+const importCompleted = async () => {
+	var currentTime = moment().format('YYYY-MM-DD HH:mm:ss');
+	// 涓婁紶鏂囦欢
+	if (multipleSelection.value.length == 0) return ElMessage.warning('璇峰厛閫夋嫨鏂囦欢');
+	const file_id = multipleSelection.value.map((v) => v.id).join(',');
+	const res = await add_docvector_file({
+		knowlg_id: state.knowlg_id,
+		file_id: file_id,
+	});
+	if (res.json_ok) {
+		let obj = {
+			id: state.knowlg_id,
+			group_id: state.groupKnow_id,
+			title: state.knowledgeForm.title,
+			prompt: state.knowledgeForm.prompt,
+			publish: 'N',
+			create_time: currentTime,
+			user_name: '',
+			scope: state.knowledgeForm.scope,
+		};
+		mittBus.emit('updateKnowledgeBaseObj', obj);
+		router.push({ name: 'Knowledge' });
+		//娓呯┖琛ㄥ崟
+		knowledgeFormRef.value.resetFields();
+		state.showKnowledgeForm = false;
+		state.isCreateIndex = false;
+	}
+};
+//#endregion
+//#region ====================== 鐭ヨ瘑搴撴枃浠朵笂浼� ==========
+const currentTreeNode = ref(null);
+const leftTreeRef = ref(null);
+const currentListID = computed(() => currentTreeNode.value?.group_id);
+//鑾峰彇鏂囦欢鍒楄〃
+const getFileTreeData = async (selectFirst = false) => {
+	const res = await get_knowledge_group_list();
+	if (res?.json_ok) {
+		const resData = (res.groups || []) as [];
+		const byParentData = convertListToTree(resData, {
+			ID: 'group_id',
+			Children: 'Children',
+			ParentID: 'p_group_id',
+		});
+		const result = [];
+		byParentData.forEach((item) => {
+			if (item.group_type == OptClassificationMap[classificationEnum.Knowledge]) {
+				result.push(item);
+			}
+		});
+		state.knowledgeBaseData = result;
+		if (selectFirst) {
+			const firstListTreeNode = state.knowledgeBaseData[0];
+			if (firstListTreeNode) {
+				handleClickNode(firstListTreeNode);
+			} else {
+				state.fileData = [];
+				multipleSelection.value = [];
+			}
+		} else {
+			currentTreeNode.value && handleClickNode(currentTreeNode.value);
+		}
+	}
+};
+const handleClickNode = (data: any) => {
+	multipleSelection.value = [];
+	nextTick(() => {
+		leftTreeRef.value?.treeRef.setCurrentKey(data.group_id);
+	});
+	currentTreeNode.value = data;
+	getFileTableData();
+};
+//鑾峰彇鏂囦欢琛ㄦ牸鍒楄〃
+const getFileTableData = async () => {
+	const res = await list_knowledge_file({
+		group_id: currentListID.value,
+	}).finally(() => {});
+	if (res?.json_ok) {
+		const resData = (res.values || []) as [];
+		state.fileData = resData;
+	} else {
+		ElMessage.error('鑾峰彇鏂囨。鍒楄〃澶辫触' + (res?.json_msg ? `锛�${JSON.stringify(res.json_msg)}` : ''));
+	}
+};
+let multipleSelection = ref([]);
+const multipleTableRef = ref(null);
+//琛ㄦ牸鍗曢�夊拰澶氶��
+const handleSelectAll = (selection: any[], pageSelectionData: any[]) => {
+	let checked = selection.length ? true : false; // selection涓虹┖鏁扮粍鏃朵唬琛ㄥ彇娑堝叏閫�
+	if (checked) {
+		let mIds = multipleSelection.value.map((v) => v.id);
+		let filterData = pageSelectionData.filter((v) => {
+			// 绛涢�夊嚭闈為噸澶嶉」
+			return !mIds.includes(v.id);
+		});
+		multipleSelection.value = multipleSelection.value.concat(filterData);
+	} else {
+		let pIds = pageSelectionData.map((v) => v.id);
+		multipleSelection.value = multipleSelection.value.filter((v) => !pIds.includes(v.id));
+	}
+};
+
+const handleSelectItem = (selection: any[], row) => {
+	multipleSelection.value = selection;
+};
+// 绉婚櫎宸查�夋枃浠�
+const handleRemoveItem = (item) => {
+	multipleSelection.value = multipleSelection.value.filter((v) => v.id !== item.id);
+	multipleTableRef.value.toggleRowSelection(item, false);
+};
+//#endregion
+onMounted(() => {
+	const group_id = route.query.group_id;
+	state.groupKnow_id = group_id;
+});
 </script>
 <style scoped lang="scss">
 .set-form-height {
-	height: calc(100% - 62px);
 	background: #fff;
-	border-radius: 16px 16px 0 0;
+	border-radius: 12px 12px 0 0;
 	flex: 1;
-	margin: 0 24px 64px;
+	margin: 0 24px;
 	overflow-y: auto;
-	padding: 20px;
+	padding: 20px 16px;
+	height: 100%;
 }
 .set-desc {
 	-webkit-line-clamp: 2;
@@ -149,10 +566,92 @@
 	gap: 8px;
 	height: 64px;
 	padding-left: 24px;
-	position: fixed;
+	// position: fixed;
 	width: 100%;
 	left: 220px;
 }
+
+.activeColor {
+	border-color: #0062be;
+	background-color: #f6f5ff;
+}
+.set_model_desc {
+	background: #f7f8fe;
+	border-radius: 8px;
+	margin-top: 12px;
+	padding: 16px 24px;
+}
+.set-file-height {
+	height: calc(100% - 48px);
+}
+.set_file_left {
+	border: 1px solid #e7e8ee;
+	border-radius: 12px;
+	flex: 1;
+	padding: 12px 16px 16px;
+	box-sizing: border-box;
+	.left_content {
+		align-items: flex-start;
+		display: flex;
+		gap: 12px;
+		height: calc(100% - 29px);
+		.file_menu {
+			flex-shrink: 0;
+			height: 100%;
+			overflow-y: auto;
+			border: 1px solid #e7e8ee;
+			border-radius: 6px;
+			max-height: 627px;
+			padding: 20px;
+			width: 280px;
+		}
+		.file_table {
+			flex-shrink: 0;
+			height: 100%;
+			overflow-y: auto;
+			border-radius: 8px 8px 0 0;
+			flex: 1;
+		}
+	}
+}
+.set_file_right {
+	border: 1px solid #e7e8ee;
+	border-radius: 6px;
+	flex-shrink: 0;
+	height: 100%;
+	padding: 12px 16px 16px;
+	width: 417px;
+	min-height: 360px;
+}
+.selected_file {
+	max-height: calc(100% - 36px);
+	overflow-y: auto;
+	box-sizing: border-box;
+	.set_file_item {
+		align-items: center;
+		background: linear-gradient(0deg, #f7f8fe, #f7f8fe), #fff;
+		border-radius: 8px;
+		display: flex;
+		font-size: 12px;
+		gap: 8px;
+		height: 40px;
+		justify-content: space-between;
+		padding: 0 16px;
+		margin-bottom: 9px;
+		.set_file_name {
+			max-width: calc(100% - 22px);
+		}
+		.set_file_close {
+			color: #878aab;
+			cursor: pointer;
+			flex-shrink: 0;
+			font-size: 14px;
+			align-items: center;
+			display: inline-flex;
+			justify-content: center;
+		}
+	}
+}
 </style>
 <style>
 .set_tooltip_demo {

--
Gitblit v1.9.3