From 8a857fe1b0b69dafbdaa15b45edab03a2c3bcdb2 Mon Sep 17 00:00:00 2001 From: 田源 <lastanimals@163.com> Date: 星期二, 09 七月 2024 09:52:47 +0800 Subject: [PATCH] 成员管理表格查询 增删改 分配成员 统计 下载导入模板 --- Source/plt-web/plt-web-ui/src/views/system/department/option.js | 34 +++ Source/plt-web/plt-web-ui/src/views/system/role/index.vue | 38 ++- Source/plt-web/plt-web-ui/src/views/system/user/index.vue | 38 ++- Source/plt-web/plt-web-ui/src/api/system/departMent/api.js | 89 +++++++++ Source/plt-web/plt-web-ui/src/views/system/department/index.vue | 338 +++++++++++++++++++++++++++++++++++++ Source/plt-web/plt-web-ui/src/views/system/user/option.js | 2 6 files changed, 514 insertions(+), 25 deletions(-) diff --git a/Source/plt-web/plt-web-ui/src/api/system/departMent/api.js b/Source/plt-web/plt-web-ui/src/api/system/departMent/api.js new file mode 100644 index 0000000..0acd660 --- /dev/null +++ b/Source/plt-web/plt-web-ui/src/api/system/departMent/api.js @@ -0,0 +1,89 @@ +import request from '@/router/axios'; + +// 鍒楄〃鏌ヨ +export function refTree(params) { + return request({ + url: "/api/departmentQueryController/refTree", + method: "get", + params + }); +} + +// 鏂板 +export function addDept(params) { + return request({ + url: "/api/departmentQueryController/addDept", + method: "post", + data:params + }); +} + +// 淇敼 +export function updateDept(params) { + return request({ + url: "/api/departmentQueryController/updateDept", + method: "put", + data:params + }); +} + +// 淇敼 +export function deleteDept(params) { + return request({ + url: "/api/departmentQueryController/deleteDept", + method: "delete", + params + }); +} + +// 缁熻 +export function countSmUserByDeptOid(params) { + return request({ + url: "/api/userQueryController/countSmUserByDeptOid", + method: "get", + params + }); +} + +// 寰呴�変汉鍛樻煡璇� +export function listUserUnInDeptOid(params) { + return request({ + url: "/api/userQueryController/listUserUnInDeptOid", + method: "get", + params + }); +} + +// 宸查�変汉鍛樻煡璇� +export function listUserByDeptOid(params) { + return request({ + url: "/api/userQueryController/listUserByDeptOid", + method: "get", + params + }); +} + +// 宸查�変汉鍛樻煡璇� +export function saveUsersDepts(params) { + let formData = new FormData; + for (let key in params){ + formData.append(key,params[key]) + } + return request({ + url: "/api/departmentQueryController/saveUsersDepts", + method: "post", + data:formData + }); +} + +// 涓嬭浇 +export const download = (params) => { + return request({ + url: '/api/departmentQueryController/downloadImportTemplate', + method: 'get', + headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'}, + responseType: 'blob', + params + }) +} + diff --git a/Source/plt-web/plt-web-ui/src/views/system/department/index.vue b/Source/plt-web/plt-web-ui/src/views/system/department/index.vue index fe8983e..d56868a 100644 --- a/Source/plt-web/plt-web-ui/src/views/system/department/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/system/department/index.vue @@ -1,15 +1,353 @@ <template> <basic-container> + <avue-crud + ref="departCrud" + :data="tableData" + :option="option" + :page.sync="page" + :table-loading="tableLoading" + @on-load="getTableList" + @refresh-change="handleRefresh" + @selection-change="selectChange" + @row-save="rowSaveHandler" + @row-update="rowUpdateHandler" + @row-del="rowDeleteHandler" + @current-row-change="handleCurrentRowChange" + > + <template slot="menu" slot-scope="{row,size,type}"> + <el-button icon="el-icon-circle-plus-outline" size="small" type="text" @click="handleAdd()">鏂板瀛愮骇</el-button> + <el-button v-if="row.ALLDept !== 'ALLDept'" icon="el-icon-edit" size="small" type="text" + @click="editBtnClick(row)">缂栬緫 + </el-button> + <el-button v-if="row.ALLDept !== 'ALLDept'" icon="el-icon-delete" size="small" type="text" + @click="rowDeleteHandler(row)">鍒犻櫎 + </el-button> + </template> + + <template slot="menuLeft" slot-scope="scope"> + <el-button icon="el-icon-school" plain size="small" type="primary" @click="assignMembersHandler">鍒嗛厤鎴愬憳</el-button> + <el-button icon="el-icon-user" plain size="small" type="primary" @click="statisticsHandler">缁熻</el-button> + <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="statisticsHandler">瀵煎叆閮ㄩ棬</el-button> + <el-button icon="el-icon-download" plain size="small" type="primary" @click="downLoadHandler">涓嬭浇瀵煎叆妯℃澘</el-button> + </template> + </avue-crud> + + <!-- 缁熻瀵硅瘽妗� --> + <el-dialog + v-dialogDrag + v-loading="statisticsLoading" + :destroy-on-close="true" + :visible.sync="statisticsVisible" + append-to-body="true" + class="avue-dialog" + title="浜哄憳淇℃伅" + width="50%" + > + <avue-crud + :data="countData" + :option="countOption" + > + </avue-crud> + <div slot="footer" class="dialog-footer" style="display: flex;gap: 20px;justify-content: center"> + <div> + <el-tag>褰撳墠瑙掕壊鎬讳汉鏁�: {{ this.countData.length }}</el-tag> + </div> + <el-button icon="el-icon-close" size="small" type="danger" @click="statisticsVisible = false">鍏� 闂�</el-button> + </div> + </el-dialog> + + + <!-- 鍒嗛厤鎴愬憳绌挎妗� --> + <transfer ref="transfer" :left-role-data="leftTransferData" :right-role-data="rightTransferData" + :transferTitle="transferTitle" title="閮ㄩ棬娣诲姞鎴愬憳" + @transferSend="departTransferSend"> + </transfer> + </basic-container> </template> <script> +import { + refTree, + addDept, + updateDept, + deleteDept, + countSmUserByDeptOid, + listUserUnInDeptOid, + listUserByDeptOid, + saveUsersDepts, + download +} from "@/api/system/departMent/api"; +import basicOption from '@/util/basic-option'; +import {column} from './option' +import func from "@/util/func"; + export default { name: "departmentManage", data() { return { + tableData: [], + option: { + ...basicOption, + rowKey: 'oid', + rowParentKey: 'parentId', + selection: false, + addBtn: false, + editBtn: false, + delBtn: false, + gridBtn: false, + highlightCurrentRow: true, + column: column + }, + tableLoading: false, + departCurrenRow: {}, + parentId: '', + statisticsLoading: false, + statisticsVisible: false, + countData: [], + countOption: { + ...basicOption, + selection: false, + refreshBtn: false, + addBtn: false, + menu: false, + column: [ + { + label: '閮ㄩ棬', + prop: 'pkDepartmentName', + sortable: true, + }, + { + label: '鐢ㄦ埛鍚�', + prop: 'id', + sortable: true, + }, + { + label: '鐪熷疄濮撳悕', + prop: 'name', + sortable: true, + }, + { + label: '瑙掕壊', + prop: 'pkPersonName', + sortable: true, + }, + ] + }, + leftTransferData: [], + rightTransferData: [], + transferTitle: ['寰呴�変汉鍛�', '宸查�変汉鍛�'], } }, + methods: { + // 琛ㄦ牸鍒濆鍖栬姹� + getTableList() { + refTree({queryAllLevel: true, 'extandParamsMap[showAllDepartmentNode]': true}).then(res => { + this.tableData = this.departDtaFormAtter(res.data.treeData); + }) + }, + + // 鍒嗛厤閮ㄩ棬鏁版嵁杞崲 + departDtaFormAtter(items) { + return items.map(item => { + // 杞崲褰撳墠鑺傜偣鐨勫睘鎬� + const formList = { + oid: item.oid, + id: item.attributes.id, + name: item.attributes.name, + description: item.attributes.description, + code: item.attributes.code, + specialties: item.attributes.specialties, + uniqueId: item.attributes.uniqueId, + ALLDept: item.attributes.ALLDept ? item.attributes.ALLDept : "", + parentId: item.parentId, + parentName: item.parentName, + parentBtmName: item.parentBtmName, + // 濡傛灉children瀛樺湪涓斾笉涓虹┖锛屽垯閫掑綊杞崲children + children: item.children && item.children.length > 0 ? this.departDtaFormAtter(item.children) : undefined + }; + return formList; + }); + }, + + // 鍒楀ご鍒锋柊 + handleRefresh() { + this.getTableList(); + }, + + // 涓嬫媺 + selectChange() { + + }, + + // 琛ㄦ牸琛屾柊澧炲瓙绾� + handleAdd() { + this.$refs.departCrud.rowAdd(); + }, + + // 娣诲姞 + rowSaveHandler(row, done, loading) { + row = {...row, ...{pkFatherDepartment: this.parentId}}; + addDept(row).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.getTableList(); + done(); + } + }).catch(err => { + console.log(err); + loading(); + }) + + }, + + // 缂栬緫鎸夐挳鐐瑰嚮浜嬩欢 + editBtnClick(row) { + this.$refs.departCrud.rowEdit(row); + }, + + // 缂栬緫 + rowUpdateHandler(row, index, done, loading) { + let params = { + name: row.name, + id: row.id, + code: row.code, + specialties: row.specialties, + description: row.description, + oid: row.oid + } + updateDept(params).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.getTableList(); + done(); + } + }).catch(err => { + console.log(err); + loading(); + }) + }, + + // 鍒犻櫎 + rowDeleteHandler(row) { + let params = { + ids: row.oid + } + + this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎褰撳墠閮ㄩ棬鍚楋紵', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + deleteDept(params).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.getTableList(); + } + }) + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); + }, + + // 琛ㄦ牸琛� 琛屽崟閫� + handleCurrentRowChange(row) { + // 鍗曠嫭娣诲姞 ALLDept 灞炴�у垽鏂槸鍚︽槸椤跺眰鑺傜偣鎵�鏈夐儴闂� + if (row.ALLDept === "ALLDept") { + this.parentId = ""; + } else { + this.parentId = row.oid; + } + + this.departCurrenRow = row; + }, + // 缁熻 + statisticsHandler() { + console.log(this.departCurrenRow); + if (func.isEmptyObject(this.departCurrenRow)) { + this.$message.warning('璇烽�夋嫨閮ㄩ棬锛�'); + return + } + + countSmUserByDeptOid({pkDepartment: this.departCurrenRow.ALLDept === 'ALLDept' ? null : this.departCurrenRow.oid}).then(res => { + console.log(res); + if (res.data.code === 200) { + const data = res.data.data; + this.countData = data.map(item => { + return { + pkDepartmentName: item.pkDepartmentName, + name: item.name, + id: item.id, + pkPersonName: item.pkPersonName + } + }); + this.statisticsVisible = true; + } + }).catch(err => { + console.log(err) + }) + }, + + // 鍒嗛厤鎴愬憳 + assignMembersHandler() { + if (func.isEmptyObject(this.departCurrenRow)) { + this.$message.error('璇烽�夋嫨閮ㄩ棬鑺傜偣'); + return + } + if (this.departCurrenRow.ALLDept === "ALLDept") { + this.$message.error('姝よ妭鐐逛负閮ㄩ棬鏍囪瘑锛屼笉鑳芥墽琛屽垎閰嶆垚鍛樻搷浣滐紝璇烽�夋嫨鍏朵粬鑺傜偣锛�') + return + } + + Promise.all([ + listUserUnInDeptOid({pkDepartment: this.departCurrenRow.oid}), + listUserByDeptOid({pkDepartment: this.departCurrenRow.oid}) + ]).then(([unInRoleRes, byRoleRes]) => { + if (unInRoleRes.data.code === 200 && byRoleRes.data.code === 200) { + const leftData = [...unInRoleRes.data.data, ...byRoleRes.data.data]; + // 缁勮濂界┛姊鍙敤鏁版嵁 + this.leftTransferData = leftData.map(item => { + return { + name: item.name + `(${item.id})`, + oid: item.oid + } + }) + this.rightTransferData = byRoleRes.data.data.map(item => item.oid); + this.$refs.transfer.visible = true; + } + }).catch(err => { + console.error(err); + }); + }, + + // 鍒嗛厤鎴愬憳绌挎妗嗗洖濉� + departTransferSend(row) { + let params = { + userOids: row.join(','), + deptId: this.departCurrenRow.oid + } + saveUsersDepts(params).then(res => { + console.log(res); + this.$message.success(res.data.obj); + this.getTableList(); + }).catch(err => { + console.log(err); + }) + }, + + // 涓嬭浇瀵煎叆妯℃澘 + downLoadHandler(){ + download().then(res => { + func.downloadFileByBlobHandler(res); + this.$message.success('涓嬭浇鎴愬姛') + }).catch(err => { + this.$message.error(err); + }) + } + } } </script> diff --git a/Source/plt-web/plt-web-ui/src/views/system/department/option.js b/Source/plt-web/plt-web-ui/src/views/system/department/option.js new file mode 100644 index 0000000..fe70287 --- /dev/null +++ b/Source/plt-web/plt-web-ui/src/views/system/department/option.js @@ -0,0 +1,34 @@ +export const column = [ + { + label: '鍚嶇О', + prop: 'name', + rules: [ + { + required: true, + message: '璇疯緭鍏ュ悕绉�', + trigger: 'blur' + } + ] + }, + { + label: '缂栧彿', + prop: 'id', + }, + { + label: '浠e彿', + prop: 'code' + }, + { + label:'涓撲笟', + prop: 'specialties' + }, + { + label:'閮ㄩ棬鍞竴鏍囪瘑ID', + prop: 'uniqueId', + display:false, + }, + { + label: '鎻忚堪', + prop: 'description', + }, +]; diff --git a/Source/plt-web/plt-web-ui/src/views/system/role/index.vue b/Source/plt-web/plt-web-ui/src/views/system/role/index.vue index 19ec3c8..11b775a 100644 --- a/Source/plt-web/plt-web-ui/src/views/system/role/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/system/role/index.vue @@ -177,30 +177,34 @@ }, // 娣诲姞 - rowSaveHandler(row, done) { + rowSaveHandler(row, done,loading) { delete row.roleClassifyText; addRole(row).then(res => { console.log(res) if (res.data.code === 200) { this.$message.success(res.data.obj); this.getTableList(); + done(); } + }).catch(err =>{ + console.log(err); + loading(); }) - done(); }, // 缂栬緫 - rowUpdateHandler(row, index, done) { + rowUpdateHandler(row, index, done,loading) { delete row.roleClassifyText; updateRole(row).then(res => { if (res.data.code === 200) { this.$message.success(res.data.obj); this.getTableList(); + done(); } }).catch(err => { + loading(); console.log(err); }); - done() }, // 鍒犻櫎 @@ -208,14 +212,24 @@ let params = { ids: row.oid } - deleteRole(params).then(res => { - if (res.data.code === 200) { - this.$message.success(res.data.obj); - this.getTableList(); - } - }).catch(err => { - console.log(err); - }) + + this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎褰撳墠瑙掕壊鍚楋紵', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + deleteRole(params).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.getTableList(); + } + }); + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); }, // 澶氶�夊垹闄� diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue index 2303278..94dba49 100644 --- a/Source/plt-web/plt-web-ui/src/views/system/user/index.vue +++ b/Source/plt-web/plt-web-ui/src/views/system/user/index.vue @@ -53,7 +53,7 @@ <el-button icon="el-icon-delete" size="small" type="text" @click.stop="rowDeleteHandler(row)">鍒犻櫎</el-button> <el-button size="small" type="text" @click.stop="stopUserHandler(row)"> <span v-if="row.status === 0" style="color: #fa3434"><i class="el-icon-video-pause"></i> 鍋滅敤</span> - <span v-if="row.status === 1" style="color: #55b61d"><i class="el-icon-video-pause"></i> 鍚敤</span> + <span v-if="row.status === 1" style="color: #55b61d"><i class="el-icon-video-play"></i> 鍚敤</span> </el-button> </template> @@ -387,7 +387,7 @@ }, // 鏂板 - rowSaveHandler(row, done) { + rowSaveHandler(row, done,loading) { if (row.password != row.confirmPassword) { this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒') return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false; @@ -397,11 +397,12 @@ if (res.data.code === 200) { this.$message.success(res.data.obj); this.getTableList(); + done() } }).catch(err => { + loading() console.log(err); }) - done() }, // 鎿嶄綔鏍忕紪杈� @@ -417,7 +418,7 @@ }, // 缂栬緫 - rowUpdateHandler(row, index, done) { + rowUpdateHandler(row, index, done,loading) { if (row.password != row.confirmPassword) { this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒') return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false; @@ -427,11 +428,12 @@ if (res.data.code === 200) { this.$message.success(res.data.obj); this.getTableList(); + done() } }).catch(err => { + loading() console.log(err); }); - done() }, // 鍒犻櫎 @@ -439,14 +441,24 @@ let params = { ids: row.oid } - deleteUser(params).then(res => { - if (res.data.code === 200) { - this.$message.success(res.data.obj); - this.getTableList(); - } - }).catch(err => { - console.log(err); - }) + + this.$confirm('鎮ㄧ‘瀹氳鍒犻櫎褰撳墠鐨勬垚鍛樺悧锛�', '鎻愮ず', { + confirmButtonText: '纭畾', + cancelButtonText: '鍙栨秷', + type: 'warning' + }).then(() => { + deleteUser(params).then(res => { + if (res.data.code === 200) { + this.$message.success(res.data.obj); + this.getTableList(); + } + }); + }).catch(() => { + this.$message({ + type: 'info', + message: '宸插彇娑堝垹闄�' + }); + }); }, // 澶氶�夊垹闄� diff --git a/Source/plt-web/plt-web-ui/src/views/system/user/option.js b/Source/plt-web/plt-web-ui/src/views/system/user/option.js index d302eb2..7941331 100644 --- a/Source/plt-web/plt-web-ui/src/views/system/user/option.js +++ b/Source/plt-web/plt-web-ui/src/views/system/user/option.js @@ -80,6 +80,8 @@ align:'center', search:true, sortable:true, + overHidden: true, + width:200, }, { label: '涓撲笟', -- Gitblit v1.9.3