From 0d9c8915b4c9deef17459f886ef136ad3d3b9440 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期四, 04 七月 2024 16:50:04 +0800
Subject: [PATCH] 成员管理 分配部门 部门搜索 添加 修改 导入人员 下载导入模板

---
 Source/plt-web/plt-web-ui/src/App.vue                                        |    2 
 /dev/null                                                                    |  158 --------------
 Source/plt-web/plt-web-ui/src/views/system/user/index.vue                    |  258 ++++++++++++++++++++++-
 Source/plt-web/plt-web-ui/src/util/basic-option.js                           |    3 
 Source/plt-web/plt-web-ui/src/api/system/user/api.js                         |   32 ++
 Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue         |   13 
 Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue |  146 +++++++++++++
 Source/plt-web/plt-web-ui/src/main.js                                        |    4 
 Source/plt-web/plt-web-ui/src/views/system/user/option.js                    |   17 -
 9 files changed, 441 insertions(+), 192 deletions(-)

diff --git a/Source/plt-web/plt-web-ui/src/App.vue b/Source/plt-web/plt-web-ui/src/App.vue
index 4b2c36e..32b2829 100644
--- a/Source/plt-web/plt-web-ui/src/App.vue
+++ b/Source/plt-web/plt-web-ui/src/App.vue
@@ -32,7 +32,7 @@
   margin: 50px auto;
 }
 .avue-dialog .el-dialog{
-  top:43%;
+  top:50%;
   max-height: calc(100% - 100px);
   -webkit-transform: translate(-50%, 0);
   transform: translate(-50%, -50%);
diff --git a/Source/plt-web/plt-web-ui/src/api/system/user/api.js b/Source/plt-web/plt-web-ui/src/api/system/user/api.js
index b24c646..ce644b2 100644
--- a/Source/plt-web/plt-web-ui/src/api/system/user/api.js
+++ b/Source/plt-web/plt-web-ui/src/api/system/user/api.js
@@ -25,7 +25,7 @@
 // 瑙掕壊鍏ㄦ煡璇�
 export function gridRoles(page,limit) {
   return request({
-    url: "/api/roleQueryController/gridRoles",
+    url: "/api/roleQueryController/refDataGrid",
     method: "get",
     params:{
       page,limit
@@ -101,3 +101,33 @@
     data:formData
   });
 }
+
+// 涓嬭浇妯℃澘鎺ュ彛
+export const download = (params) => {
+  return request({
+    url: '/api/userQueryController/downloadImportTemplate',
+    method: 'get',
+    headers: {'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'},
+    responseType: 'blob',
+    params
+  })
+}
+
+//鑾峰彇瀵嗙爜绛栫暐
+export function departmentQueryController(params) {
+  return request({
+    url: "/api/departmentQueryController/refTree",
+    method: "get",
+    params
+  });
+}
+
+//鑾峰彇瀵嗙爜绛栫暐
+export function saveUsersDepts(params) {
+  return request({
+    url: "/api/departmentQueryController/saveUsersDepts",
+    method: "post",
+    params
+  });
+}
+
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue
deleted file mode 100644
index 35b1b6d..0000000
--- a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/Upload-files.vue
+++ /dev/null
@@ -1,158 +0,0 @@
-<template>
-  <el-dialog
-    :visible.sync="dialogVisible"
-    append-to-body
-    title="涓婁紶鏂囦欢"
-  >
-    <Divider left="30px" text="瀵煎叆鎻愮ず"></Divider>
-    <ul>
-      <li>
-        1.绾㈣壊瀛椾綋琛ㄧず蹇呰緭椤�
-      </li>
-      <li>
-        2.姣忔浠呰兘鏈�澶氬鍏�10000鏉℃暟鎹�
-      </li>
-    </ul>
-    <Divider left="30px" text="excel鏂囦欢锛岄�夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
-    <el-upload
-      :before-upload="beforeUpload"
-      :headers="uploadHeaders"
-      :on-change="uploadChange"
-      :on-error="onError"
-      :on-success="onSuccess"
-      :show-file-list="false"
-      accept=".xlsx, .xls"
-      action="/api/ubcs-code/codeClassify/importClassify"
-      class="upload-demo">
-      <el-button size="small" style="margin: 15px 35px" type="primary">娴忚鏂囦欢</el-button>
-    </el-upload>
-    <template #footer>
-      <el-button
-        :loading="downloadLoading"
-        size="small"
-        type="primary"
-        @click="downloadTemplateFun"
-      >涓嬭浇瀵煎叆妯℃澘
-      </el-button
-      >
-      <el-button size="small" @click="dialogVisible = false">鍏抽棴</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script>
-// import {downloadErrorFile,downloadBatchImportApplyTemplate} from '@/api/template/templateAttr'
-import {getToken} from "@/util/auth";
-import func from "@/util/func";
-
-export default {
-  name: "Upload-files",
-  props: {
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-    codeClassifyOid: {
-      type: String,
-      default: "",
-    },
-  },
-  data() {
-    return {
-      flga: true,
-      pageLoading: null,
-      downloadLoading: false,
-    }
-  },
-  watch: {
-    visible: {
-      handler(newval, oldval) {
-        // console.log('newval',newval)
-      }
-    }
-  },
-  computed: {
-    uploadHeaders() {
-      return {
-        "Blade-Auth": "bearer " + getToken(),
-      };
-    },
-    dialogVisible: {
-      get() {
-        return this.visible;
-      },
-      set(val) {
-        this.$emit("update:visible", val);
-      },
-    },
-  },
-  methods: {
-    //鏂囦欢涓婁紶鍓�
-    async beforeUpload(file) {
-      const fileType = file.name.split(".").pop();
-      if (fileType !== "xlsx" && fileType !== "xls") {
-        // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
-        this.$message.error("鍙厑璁镐笂浼爔lsx銆亁ls鏍煎紡鐨勬枃浠�");
-        return Promise.reject(false);
-      }
-      this.pageLoading = this.$loading({
-        lock: true,
-        text: "鏂囦欢涓婁紶涓�",
-        spinner: "el-icon-loading",
-        background: "rgba(0, 0, 0, 0.7)",
-      });
-      return true;
-    },
-    // 鏂囦欢涓婁紶鎴愬姛
-    onSuccess(resbonse) {
-      if (Object.keys(resbonse.data).length === 0) {
-        this.$message.success("涓婁紶鎴愬姛锛�");
-        this.dialogVisible = false;
-        return;
-      }
-      if (resbonse.data.fileOid) {
-        const fileName = resbonse.data.filePath.split("/").pop();
-        this.$message.error("璇蜂笅杞介敊璇俊鎭枃浠惰繘琛屾煡鐪嬶紒");
-        downloadErrorFile({uuid: resbonse.data.fileOid}).then((res) => {
-          func.downloadFileByBlobHandler(res);
-        });
-      }
-    },
-    //鐐瑰嚮涓嬭浇妯℃澘
-    downloadTemplateFun() {
-      this.downloadLoading = true;
-      downloadBatchImportApplyTemplate({codeClassifyOid: this.codeClassifyOid}).then(res => {
-        this.$utilFunc.downloadFileByBlob(res.data, "妯℃澘鏂囦欢.xls");
-        this.downloadLoading = false;
-      }).catch((res) => {
-        this.$message.warning(res)
-        this.downloadLoading = false;
-      })
-    },
-    //鏂囦欢涓婁紶澶辫触
-    onError(res) {
-      this.pageLoading.close();
-    },
-    //鏂囦欢鐘舵�佹敼鍙�
-    uploadChange(file) {
-      if (file.status === "success" || file.status === "error") {
-        this.pageLoading.close();
-      }
-    }
-  }
-}
-</script>
-
-<style lang="scss" scoped>
-ul {
-  color: rgb(188, 188, 188);
-  margin: 20px 0 20px 0;
-  padding: 0 0 0 30px;
-  list-style: none;
-
-  li {
-    margin-bottom: 5px;
-    font-size: 13px;
-  }
-}
-</style>
diff --git a/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue
new file mode 100644
index 0000000..d75110c
--- /dev/null
+++ b/Source/plt-web/plt-web-ui/src/components/PLT-basic-component/upload-file.vue
@@ -0,0 +1,146 @@
+<template>
+  <el-dialog
+    v-dialogDrag
+    :close-on-click-modal="false"
+    :destroy-on-close="true"
+    :title="title"
+    :visible.sync="visible"
+    width="40%"
+    append-to-body
+    class="avue-dialog"
+    style="margin-top: -20vh !important;"
+  >
+    <Divider left="30px" text="瀵煎叆鎻愮ず"></Divider>
+    <ul>
+      <li>
+        璇风偣鍑绘祻瑙堟枃浠惰繘琛屼笂浼�
+      </li>
+    </ul>
+    <Divider left="30px" text="閫夋嫨鏂囦欢鍚庝細鑷姩涓婁紶"></Divider>
+    <el-upload
+      :action="fileUrl"
+      :before-upload="beforeUpload"
+      :data="fileData"
+      :headers="uploadHeaders"
+      :on-change="uploadChange"
+      :on-error="onError"
+      :on-success="onSuccess"
+      :show-file-list="false"
+      class="upload-demo">
+      <el-button size="small" style="margin: 15px 35px" type="primary">娴忚鏂囦欢</el-button>
+    </el-upload>
+    <template #footer>
+      <el-button size="small" @click="visible = false">鍏抽棴</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import {getToken} from "@/util/auth";
+import func from "@/util/func";
+import {validatenull} from "@/util/validate";
+
+export default {
+  name: "upload-file",
+  props: {
+    fileType: {
+      type: Array,
+      default: () => []
+    },
+    title: {
+      type: String,
+      default: '涓婁紶鏂囦欢'
+    },
+    fileUrl: {
+      type: String,
+      default: ''
+    },
+    fileData: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      flga: true,
+      pageLoading: null,
+      downloadLoading: false,
+      visible: false,
+    }
+  },
+  created() {
+  },
+  watch: {
+    visible: {
+      handler(newval, oldval) {
+        // console.log('newval',newval)
+      }
+    }
+  },
+  computed: {
+    uploadHeaders() {
+      return {
+        "Authorizationtoken": getToken(),
+      };
+    },
+  },
+  methods: {
+    //鏂囦欢涓婁紶鍓�
+    async beforeUpload(file) {
+      // 鑾峰彇鏂囦欢鎵╁睍鍚�
+      const fileExtension = file.name.split(".").pop().toLowerCase(); // 杞崲涓哄皬鍐欎互閬垮厤澶у皬鍐欎笉鍖归厤鐨勯棶棰�
+      if (this.fileType) {
+        if (!this.fileType.includes(fileExtension)) {
+          // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
+          this.$message.error(`鍙厑璁镐笂浼�${this.fileType.toString()}鏍煎紡鐨勬枃浠禶);
+          return Promise.reject(false);
+        }
+      }
+      this.pageLoading = this.$loading({
+        lock: true,
+        text: "鏂囦欢涓婁紶涓�",
+        spinner: "el-icon-loading",
+        background: "rgba(0, 0, 0, 0.7)",
+      });
+
+      return true;
+    },
+    // 鏂囦欢涓婁紶鎴愬姛
+    onSuccess(resbonse) {
+      console.log(resbonse);
+      if (resbonse.code === 200) {
+        this.$message.success("瀵煎叆鎴愬姛锛�");
+        this.visible = false;
+      } else {
+        this.$message.error(resbonse.msg);
+      }
+    },
+    //鏂囦欢涓婁紶澶辫触
+    onError(res) {
+      this.pageLoading.close();
+      this.$message.error(res);
+    },
+    //鏂囦欢鐘舵�佹敼鍙�
+    uploadChange(file) {
+      console.log( this.pageLoading);
+      if (file.status === "success" || file.status === "error") {
+        this.pageLoading.close();
+      }
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+ul {
+  color: rgb(188, 188, 188);
+  margin: 20px 0 20px 0;
+  padding: 0 0 0 30px;
+  list-style: none;
+
+  li {
+    margin-bottom: 5px;
+    font-size: 13px;
+  }
+}
+</style>
diff --git a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
index dc1c5b1..6b73c7c 100644
--- a/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
+++ b/Source/plt-web/plt-web-ui/src/components/actions/base/uploadFile.vue
@@ -118,14 +118,13 @@
     async beforeUpload(file) {
       // 鑾峰彇鏂囦欢鎵╁睍鍚�
       const fileExtension = file.name.split(".").pop().toLowerCase(); // 杞崲涓哄皬鍐欎互閬垮厤澶у皬鍐欎笉鍖归厤鐨勯棶棰�
-      const allowedExtensions = this.paramVOS.fileType || ['css', 'csv', 'doc', 'gif', 'html', 'jpe', 'jpg', 'jpeg', 'png', 'js', 'json',
-        'mp3', 'mp4', 'xlsx', 'xml', 'zip', 'xhtml', 'wps', 'ppt', 'xls', 'word', 'pdf', 'txt'];
 
-      // 妫�鏌ユ枃浠舵墿灞曞悕鏄惁鍦ㄥ厑璁哥殑鏂囦欢鎵╁睍鍚嶆暟缁勪腑
-      if (!allowedExtensions.includes(fileExtension)) {
-        // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
-        this.$message.error(`鍙厑璁镐笂浼�${allowedExtensions.toString()}鏍煎紡鐨勬枃浠禶);
-        return Promise.reject(false);
+      if(this.paramVOS.fileType){
+        if (!this.paramVOS.fileType.includes(fileExtension)) {
+          // 涓婁紶鏍煎紡涓嶇鍚堣姹傦紝鎻愮ず閿欒淇℃伅骞跺彇娑堜笂浼�
+          this.$message.error(`鍙厑璁镐笂浼�${this.paramVOS.fileType.toString()}鏍煎紡鐨勬枃浠禶);
+          return Promise.reject(false);
+        }
       }
 
       this.pageLoading = this.$loading({
diff --git a/Source/plt-web/plt-web-ui/src/main.js b/Source/plt-web/plt-web-ui/src/main.js
index 5471b03..05e9ed2 100644
--- a/Source/plt-web/plt-web-ui/src/main.js
+++ b/Source/plt-web/plt-web-ui/src/main.js
@@ -39,7 +39,7 @@
 // 瀵屾枃鏈粍浠�
 import richText from '@/components/PLT-basic-component/richText'
 // 涓婁紶鏂囦欢缁勪欢
-import UploadFiles from  '@/components/PLT-basic-component/Upload-files'
+import uploadFile from '@/components/PLT-basic-component/upload-file'
 // 琛ㄥ崟涓婁紶鏂囦欢缁勪欢
 import formUpload from "@/components/PLT-basic-component/formUpload";
 // 绌挎妗嗙粍浠�
@@ -56,7 +56,7 @@
 Vue.component('dynamicTableForm', dynamicTableForm);
 Vue.component('dynamicForm', dynamicForm);
 Vue.component('richText', richText);
-Vue.component('UploadFiles', UploadFiles);
+Vue.component('uploadFile', uploadFile);
 Vue.component('formUpload', formUpload);
 Vue.component('Divider', Divider);
 Vue.component('transfer', transfer);
diff --git a/Source/plt-web/plt-web-ui/src/util/basic-option.js b/Source/plt-web/plt-web-ui/src/util/basic-option.js
index aa2feb4..1c2b03c 100644
--- a/Source/plt-web/plt-web-ui/src/util/basic-option.js
+++ b/Source/plt-web/plt-web-ui/src/util/basic-option.js
@@ -7,8 +7,11 @@
   searchIcon:true,
   selection:true,
   stripe:true,
+  headerAlign: 'center',
+  align: 'center',
   // selection 鏄惁鏈夐�夋嫨妗�
   // indexFixed:true/left/right, 鍥哄畾鍒�
   // menu:false, 鏄惁鏈夋搷浣滄爮
   // menuTitle:xxx, 鎿嶄綔鏍忔爣棰�
+  // stripe 鏉$汗
 }
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 f584d62..1970aa3 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
@@ -2,6 +2,7 @@
   <basic-container>
     <avue-crud
       ref="userCrud"
+      :before-open="beforeOpen"
       :data="tableData"
       :option="option"
       :page.sync="page"
@@ -16,8 +17,27 @@
       @row-click="rowClickHandler"
       @row-save="rowSaveHandler"
       @row-update="rowUpdateHandler"
-      @row-del="rowDelHandler"
     >
+      <!-- 閮ㄩ棬澶撮儴鎼滅储鎻掓Ы  -->
+      <template slot-scope="{disabled,size}" slot="pkDepartmentNameSearch">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departSearchValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departSearchObj.name" :value="departSearchObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartSearchHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
+      <!-- 瀵硅瘽妗嗛儴闂ㄦ彃妲�     -->
+      <template slot="pkDepartmentNameForm" slot-scope="scope">
+        <div style="display: flex;gap: 5px">
+          <el-select v-model="departValue" clearable placeholder="璇烽�夋嫨閮ㄩ棬">
+            <el-option :label="departObj.name" :value="departObj.oid"></el-option>
+          </el-select>
+          <el-button size="small" type="success" @click="dialogDepartHandler">閫夋嫨閮ㄩ棬</el-button>
+        </div>
+      </template>
+
       <template slot="status" slot-scope="{row}">
         <el-tag v-if="row.status === 0" type="success">鍚敤</el-tag>
         <el-tag v-if="row.status === 1" type="danger">鍋滅敤</el-tag>
@@ -29,7 +49,9 @@
       </template>
 
       <template #menu="{row,index,size}">
-        <el-button size="small" type="text" @click="stopUserHandler(row)">
+        <el-button icon="el-icon-edit" size="small" type="text" @click.stop="rowEditHandler(row,index)">缂栬緫</el-button>
+        <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>
         </el-button>
@@ -38,12 +60,13 @@
       <template slot="menuLeft" slot-scope="scope">
         <el-button icon="el-icon-delete" plain size="small" type="danger" @click="allDelHandler">鍒犻櫎</el-button>
         <el-button icon="el-icon-user" plain size="small" type="primary" @click="roleHandler">鍒嗛厤瑙掕壊</el-button>
-        <el-button icon="el-icon-school" plain size="small" type="primary">鍒嗛厤閮ㄩ棬</el-button>
+        <el-button icon="el-icon-school" plain size="small" type="primary" @click="departmentHandler">鍒嗛厤閮ㄩ棬</el-button>
         <el-button icon="el-icon-key" plain size="small" type="success" @click="setPwsHandler">璁剧疆瀵嗙爜绛栫暐</el-button>
-        <el-button icon="el-icon-upload2" plain size="small" type="primary">瀵煎叆浜哄憳</el-button>
-        <el-button icon="el-icon-download" plain size="small" type="primary">涓嬭浇瀵煎叆妯℃澘</el-button>
+        <el-button icon="el-icon-upload2" plain size="small" type="primary" @click="uploadRole">瀵煎叆浜哄憳</el-button>
+        <el-button icon="el-icon-download" plain size="small" type="primary" @click="downloadHandler">涓嬭浇瀵煎叆妯℃澘</el-button>
       </template>
     </avue-crud>
+
     <!-- 鍒嗛厤瑙掕壊绌挎妗�   -->
     <transfer ref="transfer" :left-role-data="leftRoleData" :right-role-data="rightRoleData"
               :transferTitle="transferTitle" title="鍒嗛厤瑙掕壊"
@@ -58,7 +81,7 @@
       :visible.sync="pwdVisible"
       append-to-body="true"
       class="avue-dialog"
-      style="margin-top: -20vh !important;"
+      style="margin-top: -15vh !important;"
       title="璁剧疆瀵嗙爜绛栫暐"
       width="30%"
     >
@@ -73,6 +96,33 @@
       <div slot="footer" class="dialog-footer">
         <el-button size="small" @click="pwdVisible = false">鍙� 娑�</el-button>
         <el-button size="small" type="primary" @click="savePwdHandler">纭� 瀹�</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 瀵煎叆浜哄憳   -->
+    <upload-file ref="upload" :fileType="upFileType" :fileUrl="fileUrl" title="瀵煎叆浜哄憳"></upload-file>
+
+    <!-- 鍒嗛厤閮ㄩ棬瀵硅瘽妗�    -->
+    <el-dialog
+      v-dialogDrag
+      v-loading="departLoading"
+      :destroy-on-close="true"
+      :visible.sync="departVisible"
+      append-to-body="true"
+      class="avue-dialog"
+      title="鍒嗛厤閮ㄩ棬"
+      width="50%"
+    >
+      <avue-crud
+        ref="departCrud"
+        :data="departData"
+        :option="departOption"
+        @current-row-change="handleCurrentRowChange"
+      >
+      </avue-crud>
+      <div slot="footer" class="dialog-footer">
+        <el-button size="small" @click="departVisible = false">鍙� 娑�</el-button>
+        <el-button size="small" type="primary" @click="saveDepartHandler">纭� 瀹�</el-button>
       </div>
     </el-dialog>
   </basic-container>
@@ -90,15 +140,55 @@
   updateUser,
   deleteUser,
   selectPwdStrategyMap,
-  saveUserPasswordStrateg
+  saveUserPasswordStrateg,
+  download,
+  departmentQueryController,
+  saveUsersDepts
 } from '@/api/system/user/api'
 import {column} from "./option"
 import func from '@/util/func'
 
 export default {
   name: "userManage",
-  data() {
+  data: function () {
     return {
+      departSearchObj:{},
+      departSearchValue:'',
+      loadKey: 0,
+      departStatus: '', // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      departValue: '', // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋缁戝畾鍊�
+      departObj: {},  // 閮ㄩ棬瀵硅瘽妗嗕笅鎷夋閫夐」缁戝畾鍊�
+      departCurrenRow: {},
+      departOption: {
+        ...basicOption,
+        rowKey: 'oid',
+        rowParentKey: 'parentId',
+        selection: false,
+        highlightCurrentRow: true,
+        stripe: false,
+        menu: false,
+        refreshBtn: false,
+        gridBtn: false,
+        column: [
+          {
+            label: '鍚嶇О',
+            prop: 'name',
+          },
+          {
+            label: '缂栧彿',
+            prop: 'id',
+          },
+          {
+            label: '鎻忚堪',
+            prop: 'description',
+          },
+        ]
+      },
+      departData: [],
+      departLoading: false,
+      departVisible: false,
+      upFileType: ['xls', 'xlsx'],
+      fileUrl: 'api/userQueryController/importUser',
       pwdVisible: false,
       pwdLoading: false,
       pwdValue: '',
@@ -107,6 +197,8 @@
       tableData: [],
       option: {
         ...basicOption,
+        editBtn: false,
+        delBtn: false,
         dialogWidth: '50%',
         calcHeight: -60,
         column: column
@@ -127,6 +219,14 @@
   created() {
   },
   methods: {
+    // 鏂板鎴栦慨鏀瑰璇濇鎵撳紑鍓�
+    beforeOpen(done, type) {
+      if(type == 'add'){
+        this.departObj = {};
+        this.departValue = "";
+      }
+      done();
+    },
     // 琛ㄦ牸璇锋眰
     getTableList() {
       this.tableLoading = true;
@@ -147,6 +247,11 @@
 
     // 鎼滅储鏌ヨ
     handleSearch(params, done) {
+      this.searchParams = {};
+      if(this.departSearchObj && this.departSearchValue){
+        this.searchParams['conditionMap["pkDepartment"]'] = this.departSearchValue;
+      }
+
       if (!func.isEmptyObject(params)) {
         for (let key in params) {
           if (params.hasOwnProperty(key)) {
@@ -155,15 +260,20 @@
             this.searchParams[`conditionMap["${newKey}"]`] = params[key];
           }
         }
-      } else {
+      }
+
+      if (func.isEmptyObject(params) && !this.departSearchValue) {
         this.searchParams = {};
       }
+
       this.getTableList();
       done();
     },
 
     // 閲嶇疆鎼滅储鏉′欢
     handleReset() {
+      this.departSearchObj = {};
+      this.departSearchValue = "";
       this.searchParams = {};
       this.getTableList();
     },
@@ -282,6 +392,7 @@
         this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
         return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
       }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
       addUser(row).then(res => {
         if (res.data.code === 200) {
           this.$message.success(res.data.obj);
@@ -293,12 +404,25 @@
       done()
     },
 
+    // 鎿嶄綔鏍忕紪杈�
+    rowEditHandler(row, index) {
+      let obj = { name: row.pkDepartmentName, oid: row.pkDepartment, rowOid: row.oid };
+      this.departValue = row.pkDepartment;
+      this.departObj = obj;
+
+      if (this.departObj.rowOid) {
+        this.$refs.userCrud.rowEdit(row, index);
+      }
+
+    },
+
     // 缂栬緫
     rowUpdateHandler(row, index, done) {
       if (row.password != row.confirmPassword) {
         this.$message.error('璇锋鏌ヤ袱娆″瘑鐮佹槸鍚﹁緭鍏ヤ竴鑷达紒')
         return this.$refs.userCrud.$refs.dialogForm.$refs.tableForm.allDisabled = false;
       }
+      row.pkDepartment = this.departValue; // 灏嗗綋鍓嶈鐨勯儴闂ㄥ弬鏁皃kDepartment 璧嬪�间负涓嬫媺妗嗙粦瀹氱殑鍊�
       updateUser(row).then(res => {
         if (res.data.code === 200) {
           this.$message.success(res.data.obj);
@@ -311,7 +435,7 @@
     },
 
     // 鍒犻櫎
-    rowDelHandler(row) {
+    rowDeleteHandler(row) {
       let params = {
         ids: row.oid
       }
@@ -351,7 +475,119 @@
           message: '宸插彇娑堝垹闄�'
         });
       });
-    }
+    },
+
+    // 涓嬭浇瀵煎叆妯℃澘
+    downloadHandler() {
+      download().then(res => {
+        console.log(res);
+        func.downloadFileByBlobHandler(res);
+        this.$message.success('涓嬭浇鎴愬姛')
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 瀵煎叆浜哄憳
+    uploadRole() {
+      this.$refs.upload.visible = true;
+    },
+
+    // 鍒嗛厤閮ㄩ棬
+    departmentHandler() {
+      if (this.selectList.length <= 0) {
+        this.$message.warning('娓呭厛閫夋嫨浜哄憳鍐嶈繘琛屾搷浣滐紒')
+        return;
+      }
+      this.departStatus = 'default'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+      this.departmentQueryOnLoad();
+    },
+
+    // 鍒嗛厤閮ㄩ棬琛ㄦ牸鍒濆鍖栬姹�
+    departmentQueryOnLoad() {
+      departmentQueryController({queryAllLevel: true}).then(res => {
+        const data = res.data.treeData;
+        this.departData = this.departDtaFormAtter(data);
+        this.departVisible = true;
+      }).catch(err => {
+        this.$message.error(err);
+      })
+    },
+
+    // 鍒嗛厤閮ㄩ棬鏁版嵁杞崲
+    departDtaFormAtter(items) {
+      return items.map(item => {
+        // 杞崲褰撳墠鑺傜偣鐨勫睘鎬�
+        const formList = {
+          oid: item.oid,
+          id: item.attributes.id,
+          name: item.attributes.name,
+          description: item.attributes.description,
+          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;
+      });
+    },
+
+    // 鍒嗛厤閮ㄩ棬 琛屽崟閫�
+    handleCurrentRowChange(row) {
+      this.departCurrenRow = row;
+    },
+
+    // 鍒嗛厤閮ㄩ棬 淇濆瓨
+    saveDepartHandler() {
+      if (func.isEmptyObject(this.departCurrenRow)) {
+        this.$message.warning('璇烽�夋嫨閮ㄩ棬鑺傜偣锛�')
+        return;
+      }
+
+      if (this.departStatus == 'default') {
+        let params = {
+          userOIds: this.selectList.map(item => item.oid).join(','),
+          deptId: this.departCurrenRow.oid,
+        };
+        saveUsersDepts(params).then(res => {
+          if (res.data.code === 200) {
+            this.departVisible = false;
+            this.getTableList();
+            this.$message.success('鍒嗛厤鎴愬姛锛�')
+          }
+        }).catch(err => {
+          console.log(err);
+        })
+        return;
+      }
+
+      if (this.departStatus == 'handle') {
+        this.departObj = this.departCurrenRow;
+        this.departValue = this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;;
+      }
+
+      if(this.departStatus == 'search'){
+        this.departSearchObj =  this.departCurrenRow;
+        this.departSearchValue =  this.departCurrenRow.oid;
+        this.departVisible = false;
+        return;
+      }
+    },
+
+    // 瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartHandler() {
+      this.departmentQueryOnLoad();
+      this.departStatus = 'handle'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
+
+    // 鎼滅储瀵硅瘽妗嗗垎閰嶉儴闂ㄦ寜閽�
+    dialogDepartSearchHandler(){
+      this.departmentQueryOnLoad();
+      this.departStatus = 'search'; // 鍖哄垎涓嶅悓鏂瑰紡鎵撳紑閮ㄩ棬瀵硅瘽妗�
+    },
   }
 
 }
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 58c46e3..07f7c2b 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
@@ -2,7 +2,6 @@
   {
     label: '璐﹀彿',
     prop: 'id',
-    align:'center',
     search:true,
     sortable:true,
     rules: [
@@ -16,7 +15,6 @@
   {
     label: '濮撳悕',
     prop: 'name',
-    align:'center',
     search:true,
     sortable:true,
     rules: [
@@ -61,7 +59,6 @@
   {
     label: '鐘舵��',
     prop: 'status',
-    align: 'center',
     display:false,
     sortable:true,
     slot: true,
@@ -75,7 +72,6 @@
   {
     label: '閿佸畾鐘舵��',
     prop: 'lockFlag',
-    align:'center',
     sortable:true,
     display:false,
   },
@@ -86,20 +82,18 @@
     search:true,
     sortable:true,
     searchslot:true,
-    row:true,
+    formslot:true,
   },
   {
     label: '涓撲笟',
     prop: 'specialties',
-    align:'center',
     sortable:true,
   },
   {
     label: '瑙掕壊',
     prop: 'pkPersonName',
-    align:'center',
     type:'select',
-    dicUrl: 'api/roleQueryController/gridRoles',
+    dicUrl: 'api/roleQueryController/refDataGrid',
     props: {
       label: 'name',
       value: 'oid'
@@ -112,27 +106,26 @@
   {
     label: '鐢靛瓙閭欢',
     prop: 'email',
-    align:'center',
     sortable:true,
+    overHidden: true,
+    row:true
   },
   {
     label: '鎻忚堪',
     type:'textarea',
     prop: 'description',
-    align:'center',
     sortable:true,
+    overHidden: true,
   },
   {
     label: '閮ㄩ棬棰嗗',
     prop: 'isDeptLeader',
-    align:'center',
     sortable:true,
     display:false,
   },
   {
     label: '鎵�灞炲瘑绾�',
     prop: 'secretGradeText',
-    align:'center',
     sortable:true,
     display:false,
   },

--
Gitblit v1.9.3