From 78e2641ff81d172115279915d74f4271ea49a35e Mon Sep 17 00:00:00 2001
From: yangyin <1850366751@qq.com>
Date: 星期四, 29 八月 2024 15:40:44 +0800
Subject: [PATCH] feat: 新增数据列表

---
 src/api/login/UserMenuData.ts            |    2 
 src/views/types/catalog/index.ts         |   21 +
 src/views/project/yw/knowledge/Graph.vue |  624 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 643 insertions(+), 4 deletions(-)

diff --git a/src/api/login/UserMenuData.ts b/src/api/login/UserMenuData.ts
index 08bf401..aea0155 100644
--- a/src/api/login/UserMenuData.ts
+++ b/src/api/login/UserMenuData.ts
@@ -72,7 +72,7 @@
 				Path: '/knowledge/graph',
 				Permission: '',
 				Icon: 'ywifont ywicon-a-appround15',
-				IsIframe: true,
+				IsIframe: false,
 				IsHide: false,
 				Weight: 0,
 				SortCode: 2,
diff --git a/src/views/project/yw/knowledge/Graph.vue b/src/views/project/yw/knowledge/Graph.vue
index 3c10d20..9f88f3a 100644
--- a/src/views/project/yw/knowledge/Graph.vue
+++ b/src/views/project/yw/knowledge/Graph.vue
@@ -1,4 +1,622 @@
-<template><div>123</div></template>
+<template>
+	<AHMContainer type="card">
+		<template #aside>
+			<!-- 鐩綍鏍� -->
+			<LeftTreeByMgr
+				v-loading="treeLoading"
+				ref="leftTreeRef"
+				:treedata="listTreeData"
+				title-name="绫荤洰绠$悊"
+				:show-more-operate="true"
+				:show-add="true"
+				:folderIcon="() => false"
+				:current-node-key="currentListID"
+				:expand-on-click-node="false"
+				:default-expand-all="true"
+				:tooltip="(_, data) => data.Code"
+				@click="handleClickNode"
+				:customDropdown="true"
+				@tree-add="openOperateFormulaGroupDialog"
+			>
+				<template #customDropdown="{ data, node }">
+					<el-dropdown-menu>
+						<el-dropdown-item>
+							<el-button
+								@click.stop="() => openOperateFormulaGroupDialog(data)"
+								link
+								type="primary"
+								icon="ele-Edit"
+								style="cursor: pointer"
+							>
+								缂栬緫
+							</el-button>
+						</el-dropdown-item>
+						<el-dropdown-item>
+							<el-button
+								link
+								type="danger"
+								@click.stop="() => deleteCurrentFormulaGroup(data)"
+								icon="ele-Delete"
+								style="cursor: pointer"
+							>
+								鍒犻櫎
+							</el-button>
+						</el-dropdown-item>
+						<el-dropdown-item>
+							<el-button @click.stop="() => openParentDlg(data)" link type="primary" icon="ele-Menu" style="cursor: pointer">
+								鐖剁骇
+							</el-button>
+						</el-dropdown-item>
+					</el-dropdown-menu>
+				</template>
+			</LeftTreeByMgr>
+		</template>
+		<template #header>
+			<!-- 鏌ヨ銆侀噸缃�佹帓搴忋�佸鍔犺〃鍗� -->
+			<el-form :inline="true" :model="formulaQueryParams">
+				<el-form-item label="鍚嶇О" prop="Name">
+					<el-input v-model="formulaQueryParams.Name" style="width: 226.4px" placeholder="鏂囦欢鍚嶇О" clearable></el-input>
+				</el-form-item>
+				<el-form-item prop="Code">
+					<el-select v-model="formulaQueryParams.Code" autocomplete="off" style="width: 226.4px" clearable>
+						<el-option v-for="item in Object.keys(analyzeMap)" :key="item" :value="parseInt(item)" :label="analyzeMap[item]">
+						</el-option>
+					</el-select>
+				</el-form-item>
 
-<script setup lang="ts"></script>
-<style scoped lang="scss"></style>
+				<el-form-item>
+					<el-button type="primary" icon="ele-Search"> 鏌ヨ </el-button>
+					<el-button icon="ele-Refresh">閲嶇疆 </el-button>
+					<el-button icon="ele-Plus" @click="openOperateFormulaDialog()"> 瀵煎叆鏁版嵁 </el-button>
+				</el-form-item>
+			</el-form></template
+		>
+		<template #main
+			><!-- 鏁版嵁灞曠ず琛ㄦ牸 -->
+			<div class="flex-auto flex-column h-full">
+				<el-table
+					v-loading="formulaTableLoading"
+					ref="draggableFormulaTableRef"
+					border
+					row-key="ID"
+					class="flex-auto"
+					:row-class-name="isFormulaTableDrag ? 'cursor-move' : 'cursor-pointer'"
+					:cell-style="{ textAlign: 'center' }"
+					:header-cell-style="{ textAlign: 'center' }"
+					:data="categoryTableData"
+					highlight-current-row
+				>
+					<el-table-column prop="Name" width="220" label="鏂囦欢鍚嶇О" fixed="left" show-overflow-tooltip />
+					<el-table-column prop="Code" width="300" label="鏂囦欢鏍煎紡" show-overflow-tooltip />
+					<el-table-column prop="FormatType" label="鏂囦欢澶у皬" width="120" show-overflow-tooltip> </el-table-column>
+					<el-table-column prop="MeasureTypes" width="120" label="鐘舵��" show-overflow-tooltip> </el-table-column>
+					<el-table-column prop="CronTypes" label="涓婁紶鏃堕棿" show-overflow-tooltip> </el-table-column>
+					<el-table-column label="鎿嶄綔" width="220" fixed="right" show-overflow-tooltip>
+						<template #default="scope">
+							<el-button icon="ele-Edit" size="small" text type="primary" @click="openOperateFormulaDialog(scope.row)">
+								璇︽儏</el-button
+							>
+							<el-button icon="ele-Delete" size="small" text type="danger" @click="deleteCurrentFormulaRow(scope.row)">
+								鍒犻櫎
+							</el-button>
+						</template>
+					</el-table-column>
+				</el-table>
+				<div class="flex-0">
+					<el-pagination
+						v-model:currentPage="state.tableParams.PageIndex"
+						v-model:page-size="state.tableParams.PageSize"
+						:total="state.tableTotal"
+						:page-sizes="[10, 20, 50, 100]"
+						background
+						@size-change="handleSizeChange"
+						style="margin-bottom: 20px"
+						@current-change="handleCurrentChange"
+						layout="total, sizes, prev, pager, next, jumper"
+					/>
+				</div>
+			</div>
+		</template>
+		<!-- 澧炲姞銆佷慨鏀规暟鎹璇濇 -->
+		<el-dialog
+			:destroy-on-close="true"
+			v-model="formulaGroupDialogIsShow"
+			width="400"
+			:close-on-click-modal="false"
+			@closed="closeFormulaGroupDialog"
+		>
+			<template #header>
+				<div style="color: #fff">
+					<SvgIcon
+						:name="formulaGroupDialogHeaderIcon"
+						:size="16"
+						style="margin-right: 3px; display: inline; vertical-align: middle"
+					/>
+					<span> {{ formulaGroupDialogTitle }} </span>
+				</div>
+			</template>
+
+			<el-form
+				:model="formulaGroupDialogFormValue"
+				ref="formulaGroupDialogFormRef"
+				:rules="formulaGroupDialogFormRules"
+				label-width="55"
+			>
+				<el-form-item label="鐖剁骇" v-if="!isEditFormulaGroupDialog" prop="ParentID">
+					<el-tree-select
+						default-expand-all
+						filterable
+						style="width: 100%"
+						v-model="formulaGroupDialogFormValue.ParentID"
+						:props="{
+							id: 'ID',
+							label: 'Name',
+							children: 'Children',
+						}"
+						:data="listTreeData"
+						node-key="ID"
+						:clearable="true"
+						:accordion="true"
+						:expandNode="false"
+						:check-strictly="true"
+						placeholder="璇烽�夋嫨鐖剁骇"
+					>
+					</el-tree-select>
+				</el-form-item>
+				<el-form-item label="鍚嶇О" prop="Name">
+					<el-input placeholder="璇疯緭鍏ュ悕绉�" v-model="formulaGroupDialogFormValue.Name"></el-input>
+				</el-form-item>
+				<el-form-item label="缂栫爜" prop="Code">
+					<el-input placeholder="璇疯緭鍏ョ紪鐮�" v-model="formulaGroupDialogFormValue.Code"></el-input>
+				</el-form-item>
+
+				<el-form-item label="璇存槑" prop="Description">
+					<el-input placeholder="璇疯緭鍏ヨ鏄�" v-model="formulaGroupDialogFormValue.Description" type="textarea" :rows="3" />
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<div>
+					<el-button @click="closeFormulaGroupDialog">鍙� 娑�</el-button>
+					<el-button type="primary" @click="submitFormulaGroupFormValue">纭� 瀹�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+
+		<!-- 澧炲姞銆佷慨鏀规暟鎹璇濇 -->
+		<el-dialog
+			:destroy-on-close="true"
+			v-model="formulaDialogIsShow"
+			width="530"
+			:close-on-click-modal="false"
+			@closed="closeFormulaDialog"
+		>
+			<template #header>
+				<div style="color: #fff">
+					<SvgIcon :name="formulaDialogHeaderIcon" :size="16" style="margin-right: 3px; display: inline; vertical-align: middle" />
+					<span> {{ formulaDialogTitle }} </span>
+				</div>
+			</template>
+
+			<el-form :model="formulaDialogFormValue" ref="formulaDialogFormRef" :rules="formulaDialogFormRules" label-width="78">
+				<el-form-item label="鍚嶇О" prop="Name">
+					<el-input placeholder="璇疯緭鍏ュ悕绉�" v-model="formulaDialogFormValue.Name"></el-input>
+				</el-form-item>
+				<el-form-item label="缂栫爜" prop="Code">
+					<el-input placeholder="璇疯緭鍏ュ敮涓�缂栫爜" v-model="formulaDialogFormValue.Code"></el-input>
+				</el-form-item>
+				<el-form-item label="璇存槑" prop="Description">
+					<el-input placeholder="璇疯緭鍏ヨ鏄�" v-model="formulaDialogFormValue.Description" type="textarea" :rows="3" />
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<div>
+					<el-button @click="closeFormulaDialog">鍙� 娑�</el-button>
+					<el-button type="primary" @click="submitFormulaFormValue">纭� 瀹�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+		<el-dialog
+			:destroy-on-close="true"
+			v-model="updateModuleDlgIsShow"
+			width="400"
+			:close-on-click-modal="false"
+			@closed="closeUpdateModuleDlg"
+		>
+			<template #header>
+				<div style="color: #fff">
+					<span> {{ updateModuleTitle }} </span>
+				</div>
+			</template>
+
+			<el-form :model="updateModuleFormValue" ref="updateModuleFormRef" :rules="updateModuleFormRules" label-width="60">
+				<el-form-item label="鍒嗙粍" prop="GroupID">
+					<el-tree-select
+						filterable
+						class="w100"
+						v-model="updateModuleFormValue.GroupID"
+						:props="{
+							id: 'ID',
+							label: 'Name',
+							children: 'Children',
+						}"
+						:data="updateModuleOptions"
+						node-key="ID"
+						:clearable="true"
+						:accordion="false"
+						:expandNode="false"
+						:check-strictly="true"
+					>
+					</el-tree-select>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<div>
+					<el-button @click="closeUpdateModuleDlg">鍙� 娑�</el-button>
+					<el-button type="primary" @click="submitUpdateModule">纭� 瀹�</el-button>
+				</div>
+			</template>
+		</el-dialog>
+	</AHMContainer>
+</template>
+
+<script setup lang="ts">
+import type { AxiosRequestConfig, AxiosResponse } from 'axios';
+import type { FormInstance, FormRules } from 'element-plus';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import type { PropType } from 'vue';
+import { computed, nextTick, onMounted, reactive, ref } from 'vue';
+import AHMContainer from '/@/components/layout/AHMContainer.vue';
+import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue';
+import { deepClone } from '/@/utils/other';
+import { convertListToTree } from '/@/utils/util';
+import { analyzeMap } from '/@/views/types/catalog/index';
+const props = defineProps({
+	request: {
+		type: Function as PropType<(config: AxiosRequestConfig<any>) => Promise<AxiosResponse<any, any>>>,
+	},
+});
+const state = reactive({
+	tableParams: {
+		PageIndex: 1,
+		PageSize: 10,
+	},
+	tableTotal: 0,
+});
+//#region ====================== 宸︿晶鏍戞暟鎹紝tree init ======================
+const leftTreeRef = ref(null);
+const treeLoading = ref(false);
+const listTreeData = ref([]);
+const currentTreeNode = ref(null);
+const currentListID = computed(() => currentTreeNode.value?.ID);
+const handleClickNode = (data) => {
+	nextTick(() => {
+		leftTreeRef.value?.treeRef.setCurrentKey(data.ID);
+	});
+	currentTreeNode.value = data;
+	getCategoryTableData();
+};
+const getListTreeData = async (selectFirst = false) => {
+	return;
+	treeLoading.value = true;
+	const res = await GetAll(props.request).finally(() => {
+		treeLoading.value = false;
+	});
+	if (res?.Code === 0) {
+		const resData = (res.Data || []) as [];
+		listTreeData.value = convertListToTree(resData);
+		if (selectFirst) {
+			const firstListTreeNode = listTreeData.value[0];
+			if (firstListTreeNode) {
+				handleClickNode(firstListTreeNode);
+			} else {
+				categoryTableData.value = [];
+			}
+		} else {
+			currentTreeNode.value && handleClickNode(currentTreeNode.value);
+		}
+	} else {
+		ElMessage.error('鑾峰彇鍏紡缁勫け璐�' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+	}
+};
+//#endregion
+//#region ====================== 鑾峰彇銆佸垹闄よ〃鏍兼暟鎹� ======================
+const formulaTableLoading = ref(false);
+const categoryTableData = ref([]);
+const isFormulaTableDrag = ref(false);
+const getCategoryTableData = async () => {
+	formulaTableLoading.value = true;
+	const res = await GetByGroupID({ GroupID: currentListID.value }, props.request).finally(() => {
+		formulaTableLoading.value = false;
+	});
+	if (res?.Code === 0) {
+		const resData = (res.Data || []) as [];
+		categoryTableData.value = resData;
+	} else {
+		ElMessage.error('鑾峰彇鍏紡澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+	}
+};
+const deleteCurrentFormulaRow = (row: any) => {
+	ElMessageBox.confirm(`纭畾鍒犻櫎鍏紡锛氥��${row.Name}銆�?`, '鎻愮ず', {
+		confirmButtonText: '纭畾',
+		cancelButtonText: '鍙栨秷',
+		type: 'warning',
+	}).then(async () => {
+		const res = await TableDelete(
+			{
+				ID: row.ID,
+			},
+			props.request
+		);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				ElMessage.success('鍒犻櫎鍏紡鎴愬姛');
+				getCategoryTableData();
+			} else {
+				ElMessage.error('鍒犻櫎鍏紡澶辫触');
+			}
+		} else {
+			ElMessage.error('鍒犻櫎鍏紡澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	});
+};
+//鏁版嵁鍒楄〃椤甸潰鍒嗛〉
+
+const handleSizeChange = (val) => {
+	state.tableParams.PageSize = val;
+	getCategoryTableData();
+};
+const handleCurrentChange = (val) => {
+	state.tableParams.PageIndex = val;
+	getCategoryTableData();
+};
+//#endregion
+
+//#endregion
+
+//#region ====================== 鎼滅储琛ㄦ牸锛屽琛ㄦ牸鎺掑簭 ======================
+const formulaQueryParams = ref({
+	Name: '',
+	Code: '',
+});
+//#endregion
+
+//#region ====================== 澧炲姞銆佷慨鏀硅〃鏍艰褰曟搷浣�, dialog init======================
+const isEditFormulaDialog = ref(false);
+const formulaDialogTitle = computed(() => {
+	return isEditFormulaDialog.value ? '淇敼鍏紡' : '娣诲姞鍏紡';
+});
+const formulaDialogHeaderIcon = computed(() => {
+	return isEditFormulaDialog.value ? 'ele-Edit' : 'ele-Plus';
+});
+const formulaDialogFormValue = ref(null);
+const formulaDialogIsShow = ref(false);
+const formulaDialogFormRef = ref<FormInstance>(null);
+const formulaInitialCode = ref('');
+
+const formulaDialogFormRules = ref<FormRules>({
+	Name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
+	FormatType: [{ required: true, message: '璇烽�夋嫨杩斿洖绫诲瀷', trigger: 'change' }],
+});
+const openOperateFormulaDialog = (row?) => {
+	if (row) {
+		isEditFormulaDialog.value = true;
+		const { ID, Name, FormatType, MeasureTypes, CronTypes, SourceTypes, Code, Description } = row;
+		formulaInitialCode.value = Code;
+		formulaDialogFormValue.value = deepClone({ ID, Name, FormatType, MeasureTypes, CronTypes, SourceTypes, Code, Description });
+	} else {
+		isEditFormulaDialog.value = false;
+		formulaInitialCode.value = '';
+
+		formulaDialogFormValue.value = {
+			GroupID: currentListID.value,
+			FormatType: null,
+			MeasureTypes: [],
+			CronTypes: [],
+			SourceTypes: [],
+			Name: '',
+			Code: '',
+			Description: '',
+		};
+	}
+	formulaDialogIsShow.value = true;
+};
+
+const closeFormulaDialog = () => {
+	formulaDialogIsShow.value = false;
+	formulaDialogFormRef.value.clearValidate();
+};
+
+const submitFormulaFormValue = async () => {
+	const valid = await formulaDialogFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+
+	if (isEditFormulaDialog.value) {
+		const res = await TableUpdate(formulaDialogFormValue.value, props.request);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				getCategoryTableData();
+				closeFormulaDialog();
+				ElMessage.success('淇敼鍏紡鎴愬姛');
+			} else {
+				ElMessage.error('淇敼鍏紡澶辫触');
+			}
+		} else {
+			ElMessage.error('淇敼鍏紡澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	} else {
+		const res = await TableInsert(formulaDialogFormValue.value, props.request);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				getCategoryTableData();
+				closeFormulaDialog();
+				ElMessage.success('娣诲姞鍏紡鎴愬姛');
+			} else {
+				ElMessage.error('娣诲姞鍏紡澶辫触');
+			}
+		} else {
+			ElMessage.error('娣诲姞鍏紡澶辫触' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	}
+};
+//#endregion
+
+//#region ====================== 鍒犻櫎宸︿晶鏍戝叕寮忕粍鏁版嵁 ======================
+
+const deleteCurrentFormulaGroup = (row: any) => {
+	ElMessageBox.confirm(`纭畾鍒犻櫎鍏紡缁勶細銆�${row.Name}銆�?`, '鎻愮ず', {
+		confirmButtonText: '纭畾',
+		cancelButtonText: '鍙栨秷',
+		type: 'warning',
+	}).then(async () => {
+		const res = await DeleteGroupGetByID(
+			{
+				ID: row.ID,
+			},
+			props.request
+		);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				ElMessage.success('鍒犻櫎鍏紡缁勬垚鍔�');
+				getListTreeData(true);
+			} else {
+				ElMessage.error('鍒犻櫎鍏紡缁勫け璐�');
+			}
+		} else {
+			ElMessage.error('鍒犻櫎鍏紡缁勫け璐�' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	});
+};
+//#endregion
+
+//#region ====================== 澧炲姞銆佸垹闄ゅ叕寮忕粍鎿嶄綔, dialog init======================
+const isEditFormulaGroupDialog = ref(false);
+const formulaGroupDialogTitle = computed(() => {
+	return isEditFormulaGroupDialog.value ? '淇敼鍏紡缁�' : '娣诲姞鍏紡缁�';
+});
+const formulaGroupDialogHeaderIcon = computed(() => {
+	return isEditFormulaGroupDialog.value ? 'ele-Edit' : 'ele-Plus';
+});
+const formulaGroupDialogFormValue = ref(null);
+const formulaGroupDialogIsShow = ref(false);
+
+const formulaGroupDialogFormRef = ref<FormInstance>(null);
+
+const formulaGroupDialogFormRules = ref<FormRules>({
+	Name: [{ required: true, message: '璇疯緭鍏ュ悕绉�', trigger: 'blur' }],
+});
+const openOperateFormulaGroupDialog = (data?) => {
+	if (data) {
+		isEditFormulaGroupDialog.value = true;
+		const { ID, Name, Code, Description } = data;
+		formulaGroupDialogFormValue.value = deepClone({ ID, Name, Code, Description });
+	} else {
+		isEditFormulaGroupDialog.value = false;
+		formulaGroupDialogFormValue.value = { Name: '', ParentID: '', Code: '', Description: '' };
+	}
+	formulaGroupDialogIsShow.value = true;
+};
+
+const closeFormulaGroupDialog = () => {
+	formulaGroupDialogIsShow.value = false;
+	formulaGroupDialogFormRef.value.clearValidate();
+};
+
+const submitFormulaGroupFormValue = async () => {
+	const valid = await formulaGroupDialogFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+
+	if (isEditFormulaGroupDialog.value) {
+		const res = await UpdateGroupGetByID(formulaGroupDialogFormValue.value, props.request);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				getListTreeData();
+				closeFormulaGroupDialog();
+				ElMessage.success('淇敼鍏紡缁勬垚鍔�');
+			} else {
+				ElMessage.error('淇敼鍏紡缁勫け璐�');
+			}
+		} else {
+			ElMessage.error('淇敼鍏紡缁勫け璐�' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	} else {
+		const res = await InsertGroup(
+			{ ...formulaGroupDialogFormValue.value, ParentID: formulaGroupDialogFormValue.value.ParentID || '0' },
+			props.request
+		);
+		if (res?.Code === 0) {
+			if (res.Data) {
+				getListTreeData();
+				closeFormulaGroupDialog();
+				ElMessage.success('娣诲姞鍏紡缁勬垚鍔�');
+			} else {
+				ElMessage.error('娣诲姞鍏紡缁勫け璐�');
+			}
+		} else {
+			ElMessage.error('娣诲姞鍏紡缁勫け璐�' + (res?.Message ? `锛�${JSON.stringify(res.Message)}` : ''));
+		}
+	}
+};
+//#endregion
+
+//#region ====================== 淇敼鐖剁骇 ======================
+const parentDlgIsShow = ref(false);
+const parentDlgMapRow = ref(null);
+const openParentDlg = (row?) => {
+	parentDlgMapRow.value = row;
+	parentDlgIsShow.value = true;
+};
+const submitParentForm = (res) => {
+	getListTreeData();
+};
+//#endregion
+
+//#region ====================== updateModuleDlg ======================
+const updateModuleDlgIsShow = ref(false);
+const updateModuleMapRow = ref(null);
+const updateModuleFormRef = ref(null);
+const updateModuleTitle = computed(() => `銆�${updateModuleMapRow.value?.Name}銆戔�斺�� 淇敼鎵�灞炲垎缁刞);
+const updateModuleFormRules = ref<FormRules>({
+	GroupID: [{ required: true, message: '璇烽�夋嫨鍒嗙粍', trigger: 'change' }],
+});
+
+const updateModuleOptions = computed(() => {
+	return listTreeData.value;
+});
+const updateModuleFormValue = ref(null);
+
+const closeUpdateModuleDlg = () => {
+	updateModuleDlgIsShow.value = false;
+	updateModuleFormRef.value.clearValidate();
+};
+
+const submitUpdateModule = async () => {
+	const valid = await updateModuleFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+	if (updateModuleFormValue.value.GroupID === currentListID.value) {
+		ElMessage.info('鏈慨鏀�');
+		return;
+	}
+	const res = await UpdateFormulaGroupID(updateModuleFormValue.value);
+
+	if (res?.Data) {
+		ElMessage.success('淇敼鎴愬姛锛�');
+		getCategoryTableData();
+		closeUpdateModuleDlg();
+	} else {
+		ElMessage.error('淇敼澶辫触');
+	}
+};
+
+//#endregion
+
+//#region ====================== 鎸傝浇鏃惰幏鍙栧垵濮嬫暟鎹� ======================
+onMounted(() => {
+	getListTreeData(true);
+});
+//#endregion
+</script>
+<style scoped lang="scss">
+:deep(.el-card__body) {
+	padding-bottom: unset;
+}
+</style>
diff --git a/src/views/types/catalog/index.ts b/src/views/types/catalog/index.ts
new file mode 100644
index 0000000..7f3e631
--- /dev/null
+++ b/src/views/types/catalog/index.ts
@@ -0,0 +1,21 @@
+export enum AnalyzeWay {
+	All = 0,
+	PendingAnalysis = 1,
+	AnalyzingInProgress = 2,
+	ImportCompleted = 3,
+	AnalysisFailed = 4,
+	Deleting = 5,
+	ImportingInProgress = 6,
+	ImportFailed = 7,
+}
+
+export const analyzeMap = {
+	[AnalyzeWay.All]: '鍏ㄩ儴',
+	[AnalyzeWay.PendingAnalysis]: '寰呰В鏋�',
+	[AnalyzeWay.AnalyzingInProgress]: '瑙f瀽涓�',
+	[AnalyzeWay.ImportCompleted]: '瀵煎叆瀹屾垚',
+	[AnalyzeWay.AnalysisFailed]: '瑙f瀽澶辫触',
+	[AnalyzeWay.Deleting]: '鍒犻櫎涓�',
+	[AnalyzeWay.ImportingInProgress]: '瀵煎叆涓�',
+	[AnalyzeWay.ImportFailed]: '瀵煎叆澶辫触',
+} as const;

--
Gitblit v1.9.3