Sfoglia il codice sorgente

人员管理,企业管理功能

xiao547607 5 anni fa
parent
commit
e9977fece9

+ 15 - 11
src/api/base/companyPosition.js

@@ -1,46 +1,50 @@
 import request from '@/utils/request'
 import constant from '@/constant'
 
-function pageList(formData){
+function pageList(formData) {
   return request.post(constant.serverUrl + "/base/companyPosition/pageList", formData);
 }
 
-function create(){
+function create() {
   return request.get(constant.serverUrl + "/base/companyPosition/create");
 }
 
-function edit(id){
+function edit(id) {
   return request.get(constant.serverUrl + "/base/companyPosition/edit/" + id);
 }
 
-function add(formModel){
-  return request.post(constant.serverUrl + "/base/companyPosition/add", formModel,{
+function add(formModel) {
+  return request.post(constant.serverUrl + "/base/companyPosition/add", formModel, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
-function update(formModel){  
-  return request.post(constant.serverUrl + "/base/companyPosition/update", formModel,{
+function update(formModel) {
+  return request.post(constant.serverUrl + "/base/companyPosition/update", formModel, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
-function remove(id){
+function remove(id) {
   return request.post(constant.serverUrl + "/base/companyPosition/delete/" + id);
 }
 
-function batchRemove(idList){
-  return request.post(constant.serverUrl + "/base/companyPosition/batchDelete",idList,{
+function batchRemove(idList) {
+  return request.post(constant.serverUrl + "/base/companyPosition/batchDelete", idList, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
+function detailForCompany() {
+  return request.get(constant.serverUrl + "/base/companyPosition/detailForCompany");
+}
+
 export default {
-  list,create,edit,add,update,remove,batchRemove,pageList
+  create, edit, add, update, remove, batchRemove, pageList, detailForCompany
 }

+ 1 - 1
src/api/base/deviceInfo.js

@@ -42,5 +42,5 @@ function batchRemove(idList){
 }
 
 export default {
-  list,create,edit,add,update,remove,batchRemove,pageList
+  create,edit,add,update,remove,batchRemove,pageList
 }

+ 39 - 11
src/api/base/personInfo.js

@@ -1,46 +1,74 @@
 import request from '@/utils/request'
 import constant from '@/constant'
+import { getToken } from "@/utils/auth"; // get token from cookie
 
-function pageList(formData){
+function pageList(formData) {
   return request.post(constant.serverUrl + "/base/personInfo/pageList", formData);
 }
 
-function create(){
+function create() {
   return request.get(constant.serverUrl + "/base/personInfo/create");
 }
 
-function edit(id){
+function edit(id) {
   return request.get(constant.serverUrl + "/base/personInfo/edit/" + id);
 }
 
-function add(formModel){
-  return request.post(constant.serverUrl + "/base/personInfo/add", formModel,{
+function add(formModel) {
+  return request.post(constant.serverUrl + "/base/personInfo/add", formModel, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
-function update(formModel){  
-  return request.post(constant.serverUrl + "/base/personInfo/update", formModel,{
+function update(formModel) {
+  return request.post(constant.serverUrl + "/base/personInfo/update", formModel, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
-function remove(id){
+function remove(id) {
   return request.post(constant.serverUrl + "/base/personInfo/delete/" + id);
 }
 
-function batchRemove(idList){
-  return request.post(constant.serverUrl + "/base/personInfo/batchDelete",idList,{
+function batchRemove(idList) {
+  return request.post(constant.serverUrl + "/base/personInfo/batchDelete", idList, {
     headers: {
       "Content-Type": "application/json"
     }
   });
 }
 
+function exportXls() {
+  //导出xls
+  //return request.post(constant.serverUrl + "/base/personInfo/exportXls");
+  window.open(constant.serverUrl + "/base/personInfo/exportXls?token=" + getToken());
+}
+
+function enabledFace(formData) {
+  //人脸授权
+  return request.post(constant.serverUrl + "/base/personInfo/enabledFace", formData);
+}
+
+function enabledCard(formData) {
+  //刷卡授权
+  return request.post(constant.serverUrl + "/base/personInfo/enabledCard", formData);
+}
+
+function enabledApp(formData) {
+  //手机授权
+  return request.post(constant.serverUrl + "/base/personInfo/enabledApp", formData);
+}
+
+function enabledGuest(formData) {
+  //访客授权
+  return request.post(constant.serverUrl + "/base/personInfo/EnabledGuest", formData);
+}
+
 export default {
-  pageList,create,edit,add,update,remove,batchRemove
+  pageList, create, edit, add, update, remove, batchRemove, exportXls,
+  enabledFace,enabledCard,enabledApp,enabledGuest
 }

+ 40 - 27
src/views/base/companyInfo-detail.vue

@@ -17,6 +17,21 @@
         <el-form-item label="公司名称" prop="name">
           <el-input v-model="formModel.name" placeholder="请输入公司名称" style="width:300px"></el-input>
         </el-form-item>
+        <el-form-item label="一级位置" prop="position1">
+          <el-input v-model="formModel.position1" placeholder="请输入一级位置" style="width:300px"></el-input>
+        </el-form-item>
+        <el-form-item label="二级位置" prop="position2">
+          <el-input v-model="formModel.position2" placeholder="请输入二级位置" style="width:300px"></el-input>
+        </el-form-item>
+        <el-form-item label="三级位置" prop="position3">
+          <el-input v-model="formModel.position3" placeholder="请输入三级位置" style="width:300px"></el-input>
+        </el-form-item>
+        <el-form-item label="四级位置" prop="position4">
+          <el-input v-model="formModel.position4" placeholder="请输入四级位置" style="width:300px"></el-input>
+        </el-form-item>
+        <el-form-item label="五级位置" prop="position5">
+          <el-input v-model="formModel.position5" placeholder="请输入五级位置" style="width:300px"></el-input>
+        </el-form-item>
         <el-form-item label="备注" prop="remark">
           <el-input v-model="formModel.remark" placeholder="请输入备注" style="width:300px"></el-input>
         </el-form-item>
@@ -26,7 +41,7 @@
         <el-form-item label="公司logo" prop="logo">
           <el-upload
             class="avatar-uploader"
-            action=""
+            action
             :show-file-list="false"
             :on-success="handleAvatarSuccess"
             :before-upload="beforeAvatarUpload"
@@ -53,9 +68,7 @@ export default {
     return {
       formModel: {},
       ruleValidate: {
-        name: [
-          { required: true, message: "公司名称不能为空", trigger: "blur" }
-        ]
+        name: [{ required: true, message: "公司名称不能为空", trigger: "blur" }]
       },
       showDialog: true,
       loading: false,
@@ -144,27 +157,27 @@ export default {
 };
 </script>
 <style>
-  .avatar-uploader .el-upload {
-    border: 1px dashed #d9d9d9;
-    border-radius: 6px;
-    cursor: pointer;
-    position: relative;
-    overflow: hidden;
-  }
-  .avatar-uploader .el-upload:hover {
-    border-color: #409EFF;
-  }
-  .avatar-uploader-icon {
-    font-size: 28px;
-    color: #8c939d;
-    width: 178px;
-    height: 178px;
-    line-height: 178px;
-    text-align: center;
-  }
-  .avatar {
-    width: 178px;
-    height: 178px;
-    display: block;
-  }
+.avatar-uploader .el-upload {
+  border: 1px dashed #d9d9d9;
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+}
+.avatar-uploader .el-upload:hover {
+  border-color: #409eff;
+}
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  line-height: 178px;
+  text-align: center;
+}
+.avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
 </style>

+ 10 - 5
src/views/base/companyInfo-list.vue

@@ -54,9 +54,14 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55"></el-table-column>
-      <el-table-column prop="sortNo" sort-by="sort_no" label="序号" sortable="custom" width="80"></el-table-column>
-      <el-table-column prop="name" sort-by="name_" label="公司名称" sortable="custom" width="180"></el-table-column>
-      <el-table-column prop="logo" sort-by="logo_" label="公司logo" sortable="custom" width="180">
+      <el-table-column prop="sortNo" label="序号" width="80"></el-table-column>
+      <el-table-column prop="name" label="公司名称" width="180"></el-table-column>
+      <el-table-column prop="position1Name" label="一级位置" width="180"></el-table-column>
+      <el-table-column prop="position2Name" label="二级位置" width="180"></el-table-column>
+      <el-table-column prop="position3Name" label="三级位置" width="180"></el-table-column>
+      <el-table-column prop="position4Name" label="四级位置" width="180"></el-table-column>
+      <el-table-column prop="position5Name" label="五级位置" width="180"></el-table-column>
+      <el-table-column prop="logo" sort-by="logo_" label="公司logo" width="180">
         <template slot-scope="{row}">
           <a :href="row.logo" target="_blank">
             <el-avatar
@@ -67,8 +72,8 @@
           </a>
         </template>
       </el-table-column>
-      <el-table-column prop="remark" sort-by="remark_" label="备注" sortable="custom" width="350"></el-table-column>
-      <el-table-column label="操作">
+      <el-table-column prop="remark" sort-by="remark_" label="备注" width="350"></el-table-column>
+      <el-table-column label="操作" width="150" fixed="right">
         <template slot-scope="{row}">
           <el-button size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)">删除</el-button>

+ 226 - 20
src/views/base/personInfo-list.vue

@@ -66,7 +66,20 @@
         :disabled="multipleSelection.length==0"
         @click="handleBatchDelete"
       >删除选中项</el-button>
-      <el-button type="primary" size="small" plain icon="el-icon-circle-plus">导入</el-button>
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-circle-plus"
+        @click="batchImportVisible = true"
+      >导入</el-button>
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-circle-plus"
+        @click="downloadAll"
+      >导出全部数据</el-button>
     </el-row>
     <el-table
       :data="tableData"
@@ -77,41 +90,65 @@
       @selection-change="handleSelectionChange"
     >
       <el-table-column type="selection" width="55"></el-table-column>
-      <el-table-column prop="companyId" label="企业编号" width="180"></el-table-column>
+      <el-table-column prop="companyName" label="企业" width="180"></el-table-column>
       <el-table-column prop="name" label="姓名" width="150"></el-table-column>
       <el-table-column prop="idCard" label="身份证" width="200"></el-table-column>
       <el-table-column prop="phone" label="手机号" width="180"></el-table-column>
       <el-table-column prop="openId" label="是否绑定公众号" width="180"></el-table-column>
       <el-table-column label="人脸授权">
         <template slot-scope="{row}">
-          <el-switch v-model="row.faceEnabled" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+          <el-switch
+            v-model="row.faceEnabled"
+            @change="enabledTo(row.id,'face',row.faceEnabled)"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            :disabled="disabled"
+          ></el-switch>
         </template>
       </el-table-column>
       <el-table-column label="刷卡授权">
         <template slot-scope="{row}">
-          <el-switch v-model="row.cardEnabled" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+          <el-switch
+            v-model="row.cardEnabled"
+            @change="enabledTo(row.id,'card')"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            :disabled="disabled"
+          ></el-switch>
         </template>
       </el-table-column>
       <el-table-column label="手机授权">
         <template slot-scope="{row}">
-          <el-switch v-model="row.appEnabled" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+          <el-switch
+            v-model="row.appEnabled"
+            @change="enabledTo(row.id,'app')"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            :disabled="disabled"
+          ></el-switch>
         </template>
       </el-table-column>
       <!-- <el-table-column label="密码">
         <template slot-scope="{row}">
-          <el-switch v-model="row.passwordEnabled" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+          <el-switch v-model="row.passwordEnabled" @change="enabledTo(row.id,'face')" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
         </template>
-      </el-table-column> -->
+      </el-table-column>-->
       <el-table-column label="访客授权">
         <template slot-scope="{row}">
-          <el-switch v-model="row.guestEnabled" active-color="#13ce66" inactive-color="#ff4949"></el-switch>
+          <el-switch
+            v-model="row.guestEnabled"
+            @change="enabledTo(row.id,'guest')"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            :disabled="disabled"
+          ></el-switch>
         </template>
       </el-table-column>
-      <el-table-column prop="position1" label="位置1" width="180"></el-table-column>
-      <el-table-column prop="position2" label="位置2" width="180"></el-table-column>
-      <el-table-column prop="position3" label="位置3" width="180"></el-table-column>
-      <el-table-column prop="position4" label="位置4" width="180"></el-table-column>
-      <el-table-column prop="position5" label="位置5" width="180"></el-table-column>
+      <el-table-column prop="position1" :label="position1" width="180"></el-table-column>
+      <el-table-column prop="position2" :label="position2" width="180"></el-table-column>
+      <el-table-column prop="position3" :label="position3" width="180"></el-table-column>
+      <el-table-column prop="position4" :label="position4" width="180"></el-table-column>
+      <el-table-column prop="position5" :label="position5" width="180"></el-table-column>
       <el-table-column label="操作" width="450" fixed="right">
         <template slot-scope="{row}">
           <el-button size="mini" type="warning" @click="handleEdit(row)">编辑</el-button>
@@ -137,6 +174,63 @@
       :companyResult="companyResult"
       @close="onDetailModalClose"
     ></personInfo-detail>
+    <!--批量导入S-->
+    <el-dialog
+      title="批量导入人员"
+      :visible.sync="batchImportVisible"
+      :modal-append-to-body="false"
+      style="text-align: left;"
+    >
+      <el-form label-width="150px">
+        <el-form-item label="模板下载">
+          <el-link
+            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/picc/template/企业人员名单导入模板.xls"
+            type="primary"
+            target="_blank"
+          >点击下载模板</el-link>
+        </el-form-item>
+        <el-form-item label="企业">
+          <el-select
+            v-model="uploadCompanyId"
+            filterable
+            placeholder="请选择"
+            @change="changeUploadCompayId"
+          >
+            <el-option
+              v-for="company in companyResult"
+              :key="company.id"
+              :label="company.name"
+              :value="company.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="上传文件">
+          <el-upload
+            class="upload-demo"
+            accept=".xls"
+            :action="uploadUrlXls"
+            :data="uploadXlsData"
+            :headers="headers"
+            :on-preview="handleBatchImportPreview"
+            name="uploadFile"
+            :multiple="true"
+            :limit="1"
+            :on-remove="handleBatchImportRemove"
+            :before-remove="beforeBatchImportRemove"
+            :on-exceed="handleBatchImportExceed"
+            :on-success="handleBatchImportSuccess"
+            :file-list="batchImportFileList"
+          >
+            <el-button size="small" type="primary">点击上传</el-button>
+            <div slot="tip" class="el-upload__tip">只能上传xls文件,且不超过500kb</div>
+          </el-upload>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="batchImportVisible = false">关 闭</el-button>
+      </div>
+    </el-dialog>
+    <!--批量导入E-->
   </div>
 </template>
 <script>
@@ -144,6 +238,9 @@ import Constant from "@/constant";
 import PersonInfoDetail from "./personInfo-detail";
 import personInfoApi from "@/api/base/personInfo";
 import companyInfoApi from "@/api/base/companyInfo";
+import companyPositionApi from "@/api/base/companyPosition";
+
+import { getToken } from "@/utils/auth"; // get token from cookie
 import NProgress from "nprogress"; // progress bar
 import "nprogress/nprogress.css"; // progress bar style
 
@@ -171,9 +268,38 @@ export default {
       showModal: false,
       modalTitle: "",
       businessKey: "",
-      companyResult: ""
+      companyResult: "",
+      uploadCompanyId: "",
+      batchImportVisible: false,
+      batchImportFileList: [],
+      uploadUrlXls: Constant.serverUrl + "/base/personInfo/importXls",
+      uploadXlsData: {
+        subFolder: "company",
+        companyId: ""
+      },
+      headers: {
+        Authorization: getToken()
+      },
+      disabled: false,
+      position1: "",
+      position2: "",
+      position3: "",
+      position4: "",
+      position5: ""
     };
   },
+  created() {
+    var self = this;
+
+    companyPositionApi.detailForCompany().then(function(response) {
+      var jsonData = response.data.data;
+      self.position1 = jsonData.position1Name;
+      self.position2 = jsonData.position2Name;
+      self.position3 = jsonData.position3Name;
+      self.position4 = jsonData.position4Name;
+      self.position5 = jsonData.position5Name;
+    });
+  },
   methods: {
     changePage(pageIndex) {
       var self = this;
@@ -300,19 +426,99 @@ export default {
         this.changePage(this.pageIndex);
       }
     },
-    bindDevice(record){
+    changeUploadCompayId(value) {
+      var self = this;
+      self.uploadXlsData.companyId = value;
+    },
+    bindDevice(record) {
       //绑定设备
-
     },
-    uploadData(record){
+    uploadData(record) {
       //上传数据
-
     },
-    showBind(record){
+    showBind(record) {
       //展示绑定设备
+    },
+    //批量导入-上传成功
+    handleBatchImportSuccess(response, file, fileList) {
+      console.log(response);
+      if (response.result) {
+        this.$message.success(response.message);
+        this.batchImportFileList = [];
+        this.changePage(1);
+        this.uploadCompanyId = "";
+        this.uploadXlsData.companyId = "";
+        this.batchImportVisible = false;
+      } else {
+        //this.$message.error(response.message);
+        this.batchImportFileList = [];
+        this.changePage(1);
+        this.uploadCompanyId = "";
+        this.uploadXlsData.companyId = "";
 
-    }
+        if (response.data != null) {
+          //下载有错误信息提示的报表
+          //window.open(response.data);
+          this.$message({
+            showClose: true,
+            dangerouslyUseHTMLString: true,
+            message:
+              response.message +
+              `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
+            duration: 30000
+          });
+        }
+      }
+    },
+    //批量导入-预览
+    handleBatchImportPreview(file) {
+      console.log(file.url);
+    },
+    //批量导入-移除
+    handleBatchImportRemove(file, fileList) {
+      console.log(file, fileList);
+    },
+    //批量导入-移除前操作
+    beforeBatchImportRemove(file, fileList) {
+      console.log(file, fileList);
+    },
+    //批量导入-文件超出个数限制时的钩子
+    handleBatchImportExceed(files, fileList) {
+      this.$message.warning(
+        `当前限制选择 3 个文件,本次选择了 ${
+          files.length
+        } 个文件,共选择了 ${files.length + fileList.length} 个文件`
+      );
+    },
+    downloadAll() {
+      personInfoApi.exportXls();
+    },
+    enabledTo(id, type, value) {
+      var self = this;
+      if (!self.disabled) {
+        var formData = new FormData();
+        formData.append("id", id);
+        if ("face" == type) {
+          personInfoApi.enabledFace(formData);
+        } else if ("card" == type) {
+          personInfoApi.enabledCard(formData);
+        } else if ("app" == type) {
+          personInfoApi.enabledApp(formData);
+        } else if ("guest" == type) {
+          personInfoApi.enabledGuest(formData);
+        }
+        self.disabled = true;
 
+        setTimeout(function() {
+          self.disabled = false;
+        }, 1000); //一秒内不能重复点击
+      } else {
+        self.$message({
+          type: "success",
+          message: "操作过快!"
+        });
+      }
+    }
   },
   async mounted() {
     var self = this;