From d12e110b3d95298172a4ca3d1123638b67b835c6 Mon Sep 17 00:00:00 2001
From: yangyin <1850366751@qq.com>
Date: 星期一, 11 十一月 2024 16:32:53 +0800
Subject: [PATCH] 新增部门管理

---
 src/api/login/UserMenuData.ts                                     |   15 ++
 src/views/project/yw/systemManage/departmentMgr/DepartmentMgr.vue |  150 +++++++++++++++++++++++++
 src/api/department/index.ts                                       |   30 +++++
 customer_list/yw/static/config/route.js                           |    8 +
 src/views/project/yw/systemManage/departmentMgr/optDlg/OptDlg.vue |  129 +++++++++++++++++++++
 5 files changed, 332 insertions(+), 0 deletions(-)

diff --git a/customer_list/yw/static/config/route.js b/customer_list/yw/static/config/route.js
index 8670816..a781642 100644
--- a/customer_list/yw/static/config/route.js
+++ b/customer_list/yw/static/config/route.js
@@ -27,6 +27,14 @@
 		path: '/authCenter/userMgr',
 		component: '/project/yw/systemManage/userMgr/UserMgr.vue',
 	},
+	//閮ㄩ棬绠$悊
+	{
+		name: 'DepartmentMgr',
+		isKeepAlive: true,
+		isAffix: false,
+		path: '/authCenter/departmentMgr',
+		component: '/project/yw/systemManage/departmentMgr/DepartmentMgr.vue',
+	},
 	{
 		name: 'AccessLog',
 		isKeepAlive: true,
diff --git a/src/api/department/index.ts b/src/api/department/index.ts
new file mode 100644
index 0000000..a8c8f11
--- /dev/null
+++ b/src/api/department/index.ts
@@ -0,0 +1,30 @@
+import request from '/@/utils/request';
+
+/**
+ * @description 娣诲姞閮ㄩ棬淇℃伅
+ **/
+export const add_department_info = (params) =>
+	request({
+		url: `/admin/department/add_department_info`,
+		method: 'post',
+		params: {},
+		data: params,
+	});
+/**
+ * @description 鍒犻櫎閮ㄩ棬淇℃伅
+ **/
+export const delete_department = (params) =>
+	request({
+		url: `/admin/department/delete_department`,
+		method: 'post',
+		params: {},
+		data: params,
+	});
+/**
+ * @description 鑾峰彇閮ㄩ棬淇℃伅
+ **/
+export const get_department_list = () =>
+	request({
+		url: `/admin/department/get_department_list`,
+		method: 'post',
+	});
diff --git a/src/api/login/UserMenuData.ts b/src/api/login/UserMenuData.ts
index 55d3d73..ae37c1b 100644
--- a/src/api/login/UserMenuData.ts
+++ b/src/api/login/UserMenuData.ts
@@ -426,6 +426,21 @@
 			{
 				Children: [],
 				ID: '333-3',
+				ParentID: '1742436890822447205',
+				Type: 2,
+				Name: '閮ㄩ棬绠$悊',
+				Path: '/authCenter/departmentMgr',
+				Permission: '',
+				Icon: 'ywifont ywicon-jiegou',
+				IsIframe: false,
+				IsHide: false,
+				Weight: 0,
+				SortCode: 2,
+				Description: '',
+			},
+			{
+				Children: [],
+				ID: '333-4',
 				ParentID: '1742436890822447105',
 				Type: 2,
 				Name: '鎿嶄綔鏃ュ織',
diff --git a/src/views/project/yw/systemManage/departmentMgr/DepartmentMgr.vue b/src/views/project/yw/systemManage/departmentMgr/DepartmentMgr.vue
new file mode 100644
index 0000000..d93d5e0
--- /dev/null
+++ b/src/views/project/yw/systemManage/departmentMgr/DepartmentMgr.vue
@@ -0,0 +1,150 @@
+<template>
+	<HMContainer type="card">
+		<template #header>
+			<el-form ref="queryFormRef" :inline="true" :model="queryParams">
+				<el-form-item label="鍚嶇О" prop="name">
+					<el-input v-model="queryParams.name" style="width: 226.4px" placeholder="鍚嶇О" clearable @input="debounceQueryTable" />
+				</el-form-item>
+
+				<el-form-item>
+					<el-button icon="ele-Plus" @click="openOptDlg()" type="primary"> 娣诲姞 </el-button>
+				</el-form-item>
+			</el-form>
+		</template>
+		<template #main>
+			<div class="h-full" ref="chatDragContainerRef">
+				<el-table
+					v-loading="tableLoading"
+					ref="draggableTableRef"
+					class="h100"
+					row-key="id"
+					:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
+					:header-cell-style="{ textAlign: 'center' }"
+					border
+					:cell-style="tableCellCenterExceptColumn()"
+					:row-class-name="isDragStatus ? 'cursor-move' : 'cursor-pointer'"
+					:data="displayTableData"
+					highlight-current-row
+				>
+					<el-table-column label="閮ㄩ棬鍚嶇О" prop="name" show-overflow-tooltip fixed="left"> </el-table-column>
+					<el-table-column label="鍒涘缓浜�" prop="create_user" width="190" show-overflow-tooltip> </el-table-column>
+					<el-table-column label="鍒涘缓鏃堕棿" prop="create_time" show-overflow-tooltip> </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-shanchu !text-[17px] text-red-400 cursor-pointer" @click="deleteCurrentRow(scope.row)"></i>
+								</el-tooltip>
+							</div>
+						</template>
+					</el-table-column>
+				</el-table>
+			</div>
+		</template>
+		<OptDlg
+			v-model="optDlgIsShow"
+			:item="optDlgMapRow"
+			@insert="insertOpt"
+			@update="updateOpt"
+			:departmentTreeList="tableTreeData"
+		></OptDlg>
+	</HMContainer>
+</template>
+
+<script setup lang="ts">
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { computed, onMounted, ref } from 'vue';
+import OptDlg from './optDlg/OptDlg.vue';
+import * as departmentApi from '/@/api/department/index';
+import HMContainer from '/@/components/layout/HMContainer.vue';
+import { usePageDisplay } from '/@/hooks/usePageDisplay';
+import { useQueryTable } from '/@/hooks/useQueryTable';
+import { convertListToTree, debounce, tableCellCenterExceptColumn } from '/@/utils/util';
+//#region ====================== 琛ㄦ牸鏁版嵁锛宼able init ======================
+const tableLoading = ref(false);
+const tableData = ref([]);
+const isDragStatus = ref(false);
+const tableTreeData = computed(() =>
+	convertListToTree(tableData.value, {
+		ID: 'id',
+		ParentID: 'parent_id',
+		Children: 'children',
+	})
+);
+const getTableData = async () => {
+	const res = await departmentApi.get_department_list();
+	tableData.value = (res?.values ?? []).map((item) => ({
+		create_time: item.create_time?.slice(0, 10),
+		id: item.id,
+		parent_id: item.parent_id,
+		name: item.name,
+		create_user: item.create_user,
+	}));
+};
+//#endregion
+//#region ====================== 琛ㄦ牸鏌ヨ銆佹帓搴忥紝search form init ======================
+const queryParams = ref({
+	name: '',
+});
+const { resetQuery, handleQueryTable, displayTableData } = useQueryTable(tableTreeData, queryParams, () => {
+	displayTableData.value = tableTreeData.value;
+});
+const debounceQueryTable = debounce(handleQueryTable, 400);
+//#endregion
+//#region ====================== 鏌ヨ蹇嵎閿� ======================
+const queryFormRef = ref(null);
+const pressEnterSearch = (ev: KeyboardEvent) => {
+	if (ev.key === 'Enter') {
+		handleQueryTable();
+	}
+};
+usePageDisplay(
+	() => {
+		queryFormRef.value?.$el?.addEventListener('keypress', pressEnterSearch);
+	},
+	() => {
+		queryFormRef.value?.$el?.removeEventListener('keypress', pressEnterSearch);
+	}
+);
+//#endregion
+//#region ====================== 娣诲姞淇敼鎿嶄綔 ======================
+const optDlgIsShow = ref(false);
+const optDlgMapRow = ref(null);
+const openOptDlg = (row?: any) => {
+	optDlgMapRow.value = row;
+	optDlgIsShow.value = true;
+};
+const updateOpt = (formValue) => {
+	const foundIndex = tableData.value.findIndex((item) => item.id === formValue.id);
+	if (foundIndex > -1) {
+		tableData.value[foundIndex] = {
+			...tableData.value[foundIndex],
+			...formValue,
+		};
+	}
+};
+const insertOpt = () => {
+	getTableData();
+};
+//#endregion
+
+const deleteCurrentRow = (row: any) => {
+	ElMessageBox.confirm(`纭畾鍒犻櫎鐢ㄦ埛锛氥��${row.name}銆�?`, '鎻愮ず', {
+		confirmButtonText: '纭畾',
+		cancelButtonText: '鍙栨秷',
+		type: 'warning',
+	}).then(async () => {
+		const res = await departmentApi.delete_department({
+			id: row.id,
+		});
+		const foundIndex = tableData.value.findIndex((item) => item === row);
+		foundIndex > -1 && tableData.value.splice(foundIndex, 1);
+		ElMessage.success('鍒犻櫎鐢ㄦ埛鎴愬姛');
+	});
+};
+//#endregion
+onMounted(async () => {
+	getTableData();
+});
+</script>
+<style scoped lang="scss"></style>
diff --git a/src/views/project/yw/systemManage/departmentMgr/optDlg/OptDlg.vue b/src/views/project/yw/systemManage/departmentMgr/optDlg/OptDlg.vue
new file mode 100644
index 0000000..b6166fb
--- /dev/null
+++ b/src/views/project/yw/systemManage/departmentMgr/optDlg/OptDlg.vue
@@ -0,0 +1,129 @@
+<template>
+	<ywDialog
+		v-model="dialogIsShow"
+		:headerIcon="dialogHeaderIcon"
+		:title="dialogTitle"
+		width="380"
+		@dlgClosed="closeDialog"
+		@submit="submitFormValue"
+	>
+		<el-form :model="dialogFormValue" ref="dialogFormRef" :rules="dialogFormRules" label-width="80">
+			<el-row :gutter="35">
+				<el-col :span="24" class="mb20">
+					<el-form-item label="閮ㄩ棬鍚嶇О" prop="name">
+						<el-input v-model="dialogFormValue.name"></el-input>
+					</el-form-item>
+				</el-col>
+				<el-col :span="24" class="mb20"
+					><el-form-item label="鐖剁骇" prop="parent_id" auto-complete="new-password">
+						<el-tree-select
+							filterable
+							style="width: 100%"
+							v-model="dialogFormValue.parent_id"
+							:props="{
+								id: 'id',
+								label: 'name',
+								children: 'children',
+							}"
+							:data="tableTreeData"
+							node-key="id"
+							:clearable="true"
+							:accordion="true"
+							:expandNode="false"
+							:check-strictly="true"
+							placeholder="璇烽�夋嫨鐖剁骇"
+						>
+						</el-tree-select>
+					</el-form-item>
+				</el-col>
+			</el-row>
+		</el-form>
+	</ywDialog>
+</template>
+
+<script setup lang="ts">
+import type { FormInstance, FormRules } from 'element-plus';
+import { ElMessage } from 'element-plus';
+import { computed, ref, toRefs, watch } from 'vue';
+import * as departmentApi from '/@/api/department/index';
+import ywDialog from '/@/components/dialog/yw-dialog.vue';
+import { formatDate } from '/@/utils/formatTime';
+import { deepClone } from '/@/utils/other';
+const props = defineProps(['item', 'departmentTreeList']);
+const { departmentTreeList } = toRefs(props);
+const emit = defineEmits(['update', 'insert']);
+//#region ====================== 澧炲姞銆佷慨鏀硅褰曟搷浣�, dialog init======================
+const isEditDialog = ref(false);
+const dialogTitle = computed(() => {
+	return isEditDialog.value ? `淇敼閮ㄩ棬銆�${props.item?.name}銆慲 : `娣诲姞閮ㄩ棬`;
+});
+const dialogHeaderIcon = computed(() => {
+	return isEditDialog.value ? 'ele-Edit' : 'ele-Plus';
+});
+const dialogFormValue = ref(null);
+const dialogIsShow = defineModel({
+	type: Boolean,
+});
+const dialogFormRef = ref<FormInstance>(null);
+const dialogFormRules = ref<FormRules>({
+	name: [{ required: true, message: '璇疯緭鍏ラ儴闂ㄥ悕绉�', trigger: 'blur' }],
+});
+const openOperateDialog = (row?) => {
+	if (row) {
+		isEditDialog.value = true;
+		const { id, parent_id, name, create_user, create_time } = row;
+		dialogFormValue.value = deepClone({ id, parent_id, name, create_user, create_time });
+	} else {
+		isEditDialog.value = false;
+		dialogFormValue.value = {
+			name: '',
+			parent_id: '',
+		};
+	}
+};
+const closeDialog = () => {
+	dialogIsShow.value = false;
+	dialogFormRef.value.clearValidate();
+};
+
+const submitFormValue = async () => {
+	const valid = await dialogFormRef.value.validate().catch(() => {});
+	if (!valid) return;
+	const updateTime = formatDate(new Date());
+
+	if (isEditDialog.value) {
+		return;
+		const res = await departmentApi.updateUserInfoByPost(dialogFormValue.value);
+		emit('update', { ...dialogFormValue.value });
+
+		closeDialog();
+		ElMessage.success('淇敼閮ㄩ棬鎴愬姛');
+	} else {
+		dialogFormValue.value.parent_id = dialogFormValue.value.parent_id || '0';
+		const res = await departmentApi.add_department_info(dialogFormValue.value);
+		emit('insert');
+		// tableData.value.push(newData);
+		closeDialog();
+		ElMessage.success('娣诲姞閮ㄩ棬鎴愬姛');
+	}
+};
+
+//#endregion
+
+watch(
+	() => dialogIsShow.value,
+	(val) => {
+		if (!val) return;
+		openOperateDialog(props.item);
+	}
+);
+const tableTreeData = ref([]);
+watch(
+	() => departmentTreeList.value,
+	(val) => {
+		if (!val) return;
+		tableTreeData.value = val;
+	}
+);
+</script>
+<style scoped lang="scss"></style>

--
Gitblit v1.9.3