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