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