From 7ed5f33e7bd9ca26fb41700e518234b973841921 Mon Sep 17 00:00:00 2001 From: AprilWind <2100166581@qq.com> Date: 星期三, 24 四月 2024 22:30:52 +0800 Subject: [PATCH] !107 add 新增岗位编码与部门编码 并将岗位放到部门下 * add 新增获取岗位选择框列表 * update 岗位查询树表和单表相互undefined * update 岗位查询增加单部门查询 * update 优化类别编码与后台一致性 * add 新增岗位部门树以及类别编码 * add 部门增加类别代码 --- src/views/system/dept/index.vue | 11 + src/views/system/post/index.vue | 298 +++++++++++++++++++++++++++++++++---------------- src/api/system/dept/types.ts | 3 src/api/system/post/types.ts | 8 + src/api/system/post/index.ts | 9 + 5 files changed, 232 insertions(+), 97 deletions(-) diff --git a/src/api/system/dept/types.ts b/src/api/system/dept/types.ts index 867dbde..494745c 100644 --- a/src/api/system/dept/types.ts +++ b/src/api/system/dept/types.ts @@ -3,6 +3,7 @@ */ export interface DeptQuery extends PageQuery { deptName?: string; + deptCategory?: string; status?: number; } @@ -16,6 +17,7 @@ children: DeptVO[]; deptId: number | string; deptName: string; + deptCategory: string; orderNum: number; leader: string; phone: string; @@ -35,6 +37,7 @@ children?: DeptForm[]; deptId?: number | string; deptName?: string; + deptCategory?: string; orderNum?: number; leader?: string; phone?: string; diff --git a/src/api/system/post/index.ts b/src/api/system/post/index.ts index 3e523ab..1b565a8 100644 --- a/src/api/system/post/index.ts +++ b/src/api/system/post/index.ts @@ -19,6 +19,15 @@ }); } +// 鑾峰彇宀椾綅閫夋嫨妗嗗垪琛� +export function optionselect(query: PostQuery): AxiosPromise<PostVO[]> { + return request({ + url: '/system/post/optionselect', + method: 'get', + params: query + }); +} + // 鏂板宀椾綅 export function addPost(data: PostForm) { return request({ diff --git a/src/api/system/post/types.ts b/src/api/system/post/types.ts index 84e6786..45a0540 100644 --- a/src/api/system/post/types.ts +++ b/src/api/system/post/types.ts @@ -1,7 +1,10 @@ export interface PostVO extends BaseEntity { postId: number | string; + deptId: number | string; postCode: string; postName: string; + postCategory: string; + deptName: string; postSort: number; status: string; remark: string; @@ -9,15 +12,20 @@ export interface PostForm { postId: number | string | undefined; + deptId: number | string | undefined; postCode: string; postName: string; + postCategory: string; postSort: number; status: string; remark: string; } export interface PostQuery extends PageQuery { + deptId: number | string; + belongDeptId: number | string; postCode: string; postName: string; + postCategory: string; status: string; } diff --git a/src/views/system/dept/index.vue b/src/views/system/dept/index.vue index 30942df..71aeff1 100644 --- a/src/views/system/dept/index.vue +++ b/src/views/system/dept/index.vue @@ -7,6 +7,9 @@ <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName"> <el-input v-model="queryParams.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" clearable @keyup.enter="handleQuery" /> </el-form-item> + <el-form-item label="绫诲埆缂栫爜" prop="deptCategory"> + <el-input v-model="queryParams.deptCategory" placeholder="璇疯緭鍏ョ被鍒紪鐮�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> <el-form-item label="鐘舵��" prop="status"> <el-select v-model="queryParams.status" placeholder="閮ㄩ棬鐘舵��" clearable > <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> @@ -43,6 +46,7 @@ :default-expand-all="isExpandAll" > <el-table-column prop="deptName" label="閮ㄩ棬鍚嶇О" width="260"></el-table-column> + <el-table-column prop="deptCategory" align="center" label="绫诲埆缂栫爜" width="200"></el-table-column> <el-table-column prop="orderNum" align="center" label="鎺掑簭" width="200"></el-table-column> <el-table-column prop="status" align="center" label="鐘舵��" width="100"> <template #default="scope"> @@ -88,6 +92,11 @@ <el-col :span="12"> <el-form-item label="閮ㄩ棬鍚嶇О" prop="deptName"> <el-input v-model="form.deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" /> + </el-form-item> + </el-col> + <el-col :span="12"> + <el-form-item label="绫诲埆缂栫爜" prop="deptCategory"> + <el-input v-model="form.deptCategory" placeholder="璇疯緭鍏ョ被鍒紪鐮�" /> </el-form-item> </el-col> <el-col :span="12"> @@ -166,6 +175,7 @@ deptId: undefined, parentId: undefined, deptName: undefined, + deptCategory: undefined, orderNum: 0, leader: undefined, phone: undefined, @@ -178,6 +188,7 @@ pageNum: 1, pageSize: 10, deptName: undefined, + deptCategory: undefined, status: undefined }, rules: { diff --git a/src/views/system/post/index.vue b/src/views/system/post/index.vue index 172c386..87ccf92 100644 --- a/src/views/system/post/index.vue +++ b/src/views/system/post/index.vue @@ -1,114 +1,166 @@ <template> <div class="p-2"> - <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> - <div v-show="showSearch" class="mb-[10px]"> + <el-row :gutter="20"> + <!-- 閮ㄩ棬鏍� --> + <el-col :lg="4" :xs="24" style=""> <el-card shadow="hover"> - <el-form ref="queryFormRef" :model="queryParams" :inline="true"> - <el-form-item label="宀椾綅缂栫爜" prop="postCode"> - <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable @keyup.enter="handleQuery" /> - </el-form-item> + <el-input v-model="deptName" placeholder="璇疯緭鍏ラ儴闂ㄥ悕绉�" prefix-icon="Search" clearable /> + <el-tree + ref="deptTreeRef" + class="mt-2" + node-key="id" + :data="deptOptions" + :props="{ label: 'label', children: 'children' }" + :expand-on-click-node="false" + :filter-node-method="filterNode" + highlight-current + default-expand-all + @node-click="handleNodeClick" + /> + </el-card> + </el-col> + <el-col :lg="20" :xs="24"> + <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> + <div v-show="showSearch" class="mb-[10px]"> + <el-card shadow="hover"> + <el-form ref="queryFormRef" :model="queryParams" :inline="true"> + <el-form-item label="宀椾綅缂栫爜" prop="postCode"> + <el-input v-model="queryParams.postCode" placeholder="璇疯緭鍏ュ矖浣嶇紪鐮�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="绫诲埆缂栫爜" prop="postCategory"> + <el-input v-model="queryParams.postCategory" placeholder="璇疯緭鍏ョ被鍒紪鐮�" clearable style="width: 200px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="宀椾綅鍚嶇О" prop="postName"> + <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="閮ㄩ棬" prop="deptId"> + <el-tree-select + v-model="queryParams.deptId" + :data="deptOptions" + :props="{ value: 'id', label: 'label', children: 'children' }" + value-key="id" + placeholder="璇烽�夋嫨閮ㄩ棬" + check-strictly/> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable> + <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + </el-card> + </div> + </transition> + <el-card shadow="hover"> + <template #header> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> + 鍒犻櫎 + </el-button> + </el-col> + <el-col :span="1.5"> + <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> + </el-col> + <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> + </el-row> + </template> + <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column v-if="false" label="宀椾綅缂栧彿" align="center" prop="postId" /> + <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" /> + <el-table-column label="绫诲埆缂栫爜" align="center" prop="postCategory" /> + <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" /> + <el-table-column label="閮ㄩ棬" align="center" prop="deptName" /> + <el-table-column label="鎺掑簭" align="center" prop="postSort" /> + <el-table-column label="鐘舵��" align="center" prop="status"> + <template #default="scope"> + <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> + </template> + </el-table-column> + <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180"> + <template #default="scope"> + <span>{{ parseTime(scope.row.createTime) }}</span> + </template> + </el-table-column> + <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-tooltip content="淇敼" placement="top"> + <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> + </el-tooltip> + <el-tooltip content="鍒犻櫎" placement="top"> + <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> + </el-tooltip> + </template> + </el-table-column> + </el-table> + + <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> + </el-card> + + <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 --> + <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> + <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> <el-form-item label="宀椾綅鍚嶇О" prop="postName"> - <el-input v-model="queryParams.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" clearable @keyup.enter="handleQuery" /> + <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" /> </el-form-item> - <el-form-item label="鐘舵��" prop="status"> - <el-select v-model="queryParams.status" placeholder="宀椾綅鐘舵��" clearable> - <el-option v-for="dict in sys_normal_disable" :key="dict.value" :label="dict.label" :value="dict.value" /> - </el-select> + <el-col> + <el-form-item label="閮ㄩ棬" prop="deptId"> + <el-tree-select + v-model="form.deptId" + :data="deptOptions" + :props="{ value: 'id', label: 'label', children: 'children' }" + value-key="id" + placeholder="璇烽�夋嫨閮ㄩ棬" + check-strictly + /> + </el-form-item> + </el-col> + <el-form-item label="宀椾綅缂栫爜" prop="postCode"> + <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" /> </el-form-item> - <el-form-item> - <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> - <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + <el-form-item label="绫诲埆缂栫爜" prop="postCategory"> + <el-input v-model="form.postCategory" placeholder="璇疯緭鍏ョ被鍒紪鐮�" /> + </el-form-item> + <el-form-item label="宀椾綅椤哄簭" prop="postSort"> + <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> + </el-form-item> + <el-form-item label="宀椾綅鐘舵��" prop="status"> + <el-radio-group v-model="form.status"> + <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> + </el-radio-group> + </el-form-item> + <el-form-item label="澶囨敞" prop="remark"> + <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" /> </el-form-item> </el-form> - </el-card> - </div> - </transition> - <el-card shadow="hover"> - <template #header> - <el-row :gutter="10" class="mb8"> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:add']" type="primary" plain icon="Plus" @click="handleAdd">鏂板</el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:edit']" type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()">淇敼</el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()"> - 鍒犻櫎 - </el-button> - </el-col> - <el-col :span="1.5"> - <el-button v-hasPermi="['system:post:export']" type="warning" plain icon="Download" @click="handleExport">瀵煎嚭</el-button> - </el-col> - <right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar> - </el-row> - </template> - - <el-table v-loading="loading" :data="postList" @selection-change="handleSelectionChange"> - <el-table-column type="selection" width="55" align="center" /> - <el-table-column v-if="false" label="宀椾綅缂栧彿" align="center" prop="postId" /> - <el-table-column label="宀椾綅缂栫爜" align="center" prop="postCode" /> - <el-table-column label="宀椾綅鍚嶇О" align="center" prop="postName" /> - <el-table-column label="宀椾綅鎺掑簭" align="center" prop="postSort" /> - <el-table-column label="鐘舵��" align="center" prop="status"> - <template #default="scope"> - <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> </template> - </el-table-column> - <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" width="180"> - <template #default="scope"> - <span>{{ parseTime(scope.row.createTime) }}</span> - </template> - </el-table-column> - <el-table-column label="鎿嶄綔" width="180" align="center" class-name="small-padding fixed-width"> - <template #default="scope"> - <el-tooltip content="淇敼" placement="top"> - <el-button v-hasPermi="['system:post:edit']" link type="primary" icon="Edit" @click="handleUpdate(scope.row)"></el-button> - </el-tooltip> - <el-tooltip content="鍒犻櫎" placement="top"> - <el-button v-hasPermi="['system:post:remove']" link type="primary" icon="Delete" @click="handleDelete(scope.row)"></el-button> - </el-tooltip> - </template> - </el-table-column> - </el-table> - - <pagination v-show="total > 0" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" :total="total" @pagination="getList" /> - </el-card> - - <!-- 娣诲姞鎴栦慨鏀瑰矖浣嶅璇濇 --> - <el-dialog v-model="dialog.visible" :title="dialog.title" width="500px" append-to-body> - <el-form ref="postFormRef" :model="form" :rules="rules" label-width="80px"> - <el-form-item label="宀椾綅鍚嶇О" prop="postName"> - <el-input v-model="form.postName" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" /> - </el-form-item> - <el-form-item label="宀椾綅缂栫爜" prop="postCode"> - <el-input v-model="form.postCode" placeholder="璇疯緭鍏ョ紪鐮佸悕绉�" /> - </el-form-item> - <el-form-item label="宀椾綅椤哄簭" prop="postSort"> - <el-input-number v-model="form.postSort" controls-position="right" :min="0" /> - </el-form-item> - <el-form-item label="宀椾綅鐘舵��" prop="status"> - <el-radio-group v-model="form.status"> - <el-radio v-for="dict in sys_normal_disable" :key="dict.value" :value="dict.value">{{ dict.label }}</el-radio> - </el-radio-group> - </el-form-item> - <el-form-item label="澶囨敞" prop="remark"> - <el-input v-model="form.remark" type="textarea" placeholder="璇疯緭鍏ュ唴瀹�" /> - </el-form-item> - </el-form> - <template #footer> - <div class="dialog-footer"> - <el-button type="primary" @click="submitForm">纭� 瀹�</el-button> - <el-button @click="cancel">鍙� 娑�</el-button> - </div> - </template> - </el-dialog> + </el-dialog> + </el-col> + </el-row> </div> </template> <script setup name="Post" lang="ts"> import { listPost, addPost, delPost, getPost, updatePost } from '@/api/system/post'; import { PostForm, PostQuery, PostVO } from '@/api/system/post/types'; +import { DeptVO } from '@/api/system/dept/types'; +import api from '@/api/system/user'; const { proxy } = getCurrentInstance() as ComponentInternalInstance; const { sys_normal_disable } = toRefs<any>(proxy?.useDict('sys_normal_disable')); @@ -120,7 +172,9 @@ const single = ref(true); const multiple = ref(true); const total = ref(0); - +const deptName = ref(''); +const deptOptions = ref<DeptVO[]>([]); +const deptTreeRef = ref<ElTreeInstance>(); const postFormRef = ref<ElFormInstance>(); const queryFormRef = ref<ElFormInstance>(); @@ -131,8 +185,10 @@ const initFormData: PostForm = { postId: undefined, + deptId: undefined, postCode: '', postName: '', + postCategory: '', postSort: 0, status: '0', remark: '' @@ -145,16 +201,47 @@ pageSize: 10, postCode: '', postName: '', + postCategory: '', status: '' }, rules: { postName: [{ required: true, message: '宀椾綅鍚嶇О涓嶈兘涓虹┖', trigger: 'blur' }], postCode: [{ required: true, message: '宀椾綅缂栫爜涓嶈兘涓虹┖', trigger: 'blur' }], + deptId: [{ required: true, message: '閮ㄩ棬涓嶈兘涓虹┖', trigger: 'blur' }], postSort: [{ required: true, message: '宀椾綅椤哄簭涓嶈兘涓虹┖', trigger: 'blur' }] } }); const { queryParams, form, rules } = toRefs<PageData<PostForm, PostQuery>>(data); + +/** 閫氳繃鏉′欢杩囨护鑺傜偣 */ +const filterNode = (value: string, data: any) => { + if (!value) return true; + return data.label.indexOf(value) !== -1; +}; + +/** 鏍规嵁鍚嶇О绛涢�夐儴闂ㄦ爲 */ +watchEffect( + () => { + deptTreeRef.value?.filter(deptName.value); + }, + { + flush: 'post' // watchEffect浼氬湪DOM鎸傝浇鎴栬�呮洿鏂颁箣鍓嶅氨浼氳Е鍙戯紝姝ゅ睘鎬ф帶鍒跺湪DOM鍏冪礌鏇存柊鍚庤繍琛� + } +); + +/** 鏌ヨ閮ㄩ棬涓嬫媺鏍戠粨鏋� */ +const getTreeSelect = async () => { + const res = await api.deptTreeSelect(); + deptOptions.value = res.data; +}; + +/** 鑺傜偣鍗曞嚮浜嬩欢 */ +const handleNodeClick = (data: DeptVO) => { + queryParams.value.belongDeptId = data.id; + queryParams.value.deptId = undefined; + handleQuery(); +}; /** 鏌ヨ宀椾綅鍒楄〃 */ const getList = async () => { @@ -164,38 +251,51 @@ total.value = res.total; loading.value = false; }; + /** 鍙栨秷鎸夐挳 */ const cancel = () => { reset(); dialog.visible = false; }; + /** 琛ㄥ崟閲嶇疆 */ const reset = () => { form.value = { ...initFormData }; postFormRef.value?.resetFields(); }; + /** 鎼滅储鎸夐挳鎿嶄綔 */ const handleQuery = () => { queryParams.value.pageNum = 1; + if (queryParams.value.deptId) { + queryParams.value.belongDeptId = undefined; + } getList(); }; + /** 閲嶇疆鎸夐挳鎿嶄綔 */ const resetQuery = () => { queryFormRef.value?.resetFields(); + queryParams.value.pageNum = 1; + queryParams.value.deptId = undefined; + deptTreeRef.value?.setCurrentKey(undefined); handleQuery(); }; + /** 澶氶�夋閫変腑鏁版嵁 */ const handleSelectionChange = (selection: PostVO[]) => { ids.value = selection.map((item) => item.postId); single.value = selection.length != 1; multiple.value = !selection.length; }; + /** 鏂板鎸夐挳鎿嶄綔 */ const handleAdd = () => { reset(); dialog.visible = true; dialog.title = '娣诲姞宀椾綅'; }; + /** 淇敼鎸夐挳鎿嶄綔 */ const handleUpdate = async (row?: PostVO) => { reset(); @@ -205,6 +305,7 @@ dialog.visible = true; dialog.title = '淇敼宀椾綅'; }; + /** 鎻愪氦鎸夐挳 */ const submitForm = () => { postFormRef.value?.validate(async (valid: boolean) => { @@ -216,6 +317,7 @@ } }); }; + /** 鍒犻櫎鎸夐挳鎿嶄綔 */ const handleDelete = async (row?: PostVO) => { const postIds = row?.postId || ids.value; @@ -224,6 +326,7 @@ await getList(); proxy?.$modal.msgSuccess('鍒犻櫎鎴愬姛'); }; + /** 瀵煎嚭鎸夐挳鎿嶄綔 */ const handleExport = () => { proxy?.download( @@ -236,6 +339,7 @@ }; onMounted(() => { + getTreeSelect(); // 鍒濆鍖栭儴闂ㄦ暟鎹� getList(); }); </script> -- Gitblit v1.9.3