Sfoglia il codice sorgente

Merge branch 'V2' of http://47.92.161.104:10080/zq/jp-housekeeper-portal into V2

yanliming 5 anni fa
parent
commit
b3ee2306b7

+ 5 - 1
src/api/base/iconInfo.js

@@ -45,6 +45,10 @@ function listByRoleId(formData){
   return request.post(constant.serverUrl + "/base/iconInfo/listByRoleId", formData);
 }
 
+function getIconTypeList(){
+  return request.post(constant.serverUrl + "/base/iconInfo/getIconTypeList");
+}
+
 export default {
-  pageList,create,edit,add,update,remove,batchRemove,listByRoleId
+  pageList,create,edit,add,update,remove,batchRemove,listByRoleId,getIconTypeList
 }

+ 20 - 1
src/api/base/personRoleInfo.js

@@ -49,6 +49,25 @@ function findAll(){
   return request.post(constant.serverUrl + "/base/personRoleInfo/findAll");
 }
 
+function findAllIcon(){
+  return request.get(constant.serverUrl + "/base/personRoleInfo/findAllIcon");
+}
+
+function findRelatedIcon(personRoleId,mode){
+  return request.get(constant.serverUrl + `/base/personRoleInfo/findRelatedIcon?personRoleId=${personRoleId}&mode=${mode}`);
+}
+
+function saveRelatedIcon(personRoleId,mode,idList){
+  var formData = new FormData();
+
+  formData.append("personRoleId",personRoleId);
+  formData.append("mode",mode);
+  formData.append("idList",idList.join(","));
+
+  return request.post(constant.serverUrl + "/base/personRoleInfo/saveRelatedIcon",formData);
+}
+
 export default {
-  pageList,create,edit,add,update,remove,batchRemove,listByCompanyId,findAll
+  pageList,create,edit,add,update,remove,batchRemove,listByCompanyId,findAll,
+  findAllIcon,findRelatedIcon,saveRelatedIcon
 }

+ 12 - 0
src/routers/modules/base.js

@@ -449,6 +449,18 @@ var routers = [
                         title: '摄像头管理'
                 }
         },
+        {
+                path: '/base/iconInfo/list',
+                name: 'baseIconInfoList',
+                // route level code-splitting
+                // this generates a separate chunk (about.[hash].js) for this route
+                // which is lazy-loaded when the route is visited.
+                component: () => import('@/views/base/iconInfo-list.vue'),
+                meta: {
+                        roles: ["admin"],
+                        title: '图标管理'
+                }
+        },
         {
                 //订单管理
                 path: '/base/order/list',

+ 39 - 4
src/views/base/companyInfo-list.vue

@@ -38,6 +38,22 @@
         ></el-select-tree>&nbsp;
         <el-checkbox v-model="queryModel.subordinate">是否包含下级单位</el-checkbox>
       </el-form-item>
+      <el-form-item label="适用场景" prop="sceneId">
+        <el-select
+          v-model="queryModel.sceneId"
+          filterable
+          placeholder="请选择"
+          style="width: 110px"
+          size="mini"
+        >
+          <el-option
+            v-for="result in sceneData"
+            :key="result.id"
+            :label="result.sceneName"
+            :value="result.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button
           type="primary"
@@ -184,6 +200,7 @@ import Constant from "@/constant";
 import companyInfoDetail from "./companyInfo-detail";
 import companyDeviceRelationList from "./companyDeviceRelation-list";
 import companyInfoApi from "@/api/base/companyInfo";
+import sceneInfoApi from "@/api/base/sceneInfo";
 import SelectTree from "@/components/SelectTree";
 import QRCode from "qrcodejs2";
 
@@ -200,7 +217,8 @@ export default {
       queryModel: {
         name: "",
         parentId: "",
-        subordinate: false
+        subordinate: false,
+        sceneId: ""
       },
       loading: false,
       tableData: [],
@@ -237,12 +255,18 @@ export default {
       headers: {
         Authorization: getToken()
       },
-      xlsLoading: false
+      xlsLoading: false,
+      sceneData: []
     };
   },
   created() {
     var self = this;
 
+    sceneInfoApi.list().then((response) => {
+      var jsonData = response.data;
+      this.sceneData = jsonData.data;
+    });
+
     companyInfoApi.list().then(function(response) {
       var jsonData = response.data;
       if (jsonData.result) {
@@ -297,10 +321,21 @@ export default {
       formData.append("pageIndex", self.pageIndex);
       formData.append("pageSize", self.pageSize);
 
-      formData.append("name", self.queryModel.name);
-      formData.append("parentId", self.queryModel.parentId);
+      if(self.queryModel.name!=null){
+        formData.append("name", self.queryModel.name);
+      }
+
+      if(self.queryModel.parentId!=null){
+        formData.append("parentId", self.queryModel.parentId);
+      }
+
       formData.append("subordinate", self.queryModel.subordinate);
 
+
+      if(self.queryModel.sceneId!=null){
+        formData.append("sceneId", self.queryModel.sceneId);
+      }
+
       if (this.field != null) {
         formData.append("field", this.field);
       }

+ 256 - 0
src/views/base/iconInfo-detail.vue

@@ -0,0 +1,256 @@
+
+<style scoped>
+.user-panel {
+  margin: 10px auto;
+}
+</style>
+<template>
+  <el-dialog
+    :visible.sync="showDialog"
+    :title="title"
+    :modal-append-to-body="false"
+    style="text-align: left"
+    width="80%"
+    @close="closeDialog"
+  >
+    <div class="user-panel" v-loading="loading">
+      <el-form
+        ref="form"
+        :model="formModel"
+        :rules="ruleValidate"
+        :label-width="'150px'"
+        inline
+      >
+        <el-form-item label="图标名称" prop="iconName">
+          <el-input
+            v-model="formModel.iconName"
+            placeholder="请输入图标名称"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="图标路由" prop="iconRoute">
+          <el-input
+            v-model="formModel.iconRoute"
+            placeholder="请输入图标路由"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="图标的子页面路由" prop="iconSubRoute">
+          <el-input
+            v-model="formModel.iconSubRoute"
+            placeholder="请输入图标的子页面路由"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="图标url" prop="iconUrl">
+          <el-input
+            v-model="formModel.iconUrl"
+            placeholder="请输入图标url"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="参数" prop="iconParam">
+          <el-input
+            v-model="formModel.iconParam"
+            placeholder="请输入参数"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="图标图片" prop="iconPic">
+          <el-input
+            v-model="formModel.iconPic"
+            placeholder="请输入图标图片"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="通用功能展示的图片" prop="iconCommonPic">
+          <el-input
+            v-model="formModel.iconCommonPic"
+            placeholder="请输入通用功能展示的图片"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <!-- <el-form-item label="图标类型" prop="iconTypeId">
+          <el-input
+            v-model="formModel.iconTypeId"
+            placeholder="请输入图标类型"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item> -->
+        <el-form-item label="图标类型" prop="iconTypeId">
+          <el-select v-model="formModel.iconTypeId" style="width:80%">
+            <el-option v-for="(item,index) in iconTypeList" 
+            :label="item.typeName" :value="item.id" :key="index"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注信息" prop="remark">
+          <el-input
+            v-model="formModel.remark"
+            placeholder="请输入备注信息"
+            style="width: 300px"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="是否启用" prop="useEnable">
+           <el-switch
+            v-model="formModel.useEnable"
+            active-color="#13ce66"
+            active-text="是"
+            inactive-color="#ff4949"
+            inactive-text="否"
+          ></el-switch>
+        </el-form-item>
+      </el-form>
+    </div>
+    <span slot="footer" class="dialog-footer">
+      <el-button @click="closeDialog">取 消</el-button>
+      <el-button type="primary" @click="handleSubmit" :loading="submitting"
+        >确 定</el-button
+      >
+    </span>
+  </el-dialog>
+</template>
+<script>
+import Constant from "@/constant";
+import iconInfoApi from "@/api/base/iconInfo";
+
+export default {
+  props: ["businessKey", "title"],
+  data() {
+    return {
+      iconTypeList: [],
+      formModel: {},
+      ruleValidate: {
+        id: [{ required: true, message: "不能为空", trigger: "blur" }],
+        iconName: [
+          { required: true, message: "图标名称不能为空", trigger: "blur" },
+        ],
+        iconRoute: [
+          { required: true, message: "图标路由不能为空", trigger: "blur" },
+        ],
+        iconSubRoute: [
+          {
+            required: true,
+            message: "图标的子页面路由不能为空",
+            trigger: "blur",
+          },
+        ],
+        iconUrl: [
+          { required: true, message: "图标url不能为空", trigger: "blur" },
+        ],
+        iconParam: [
+          { required: true, message: "参数不能为空", trigger: "blur" },
+        ],
+        useEnable: [
+          { required: true, message: "是否启用不能为空", trigger: "blur" },
+        ],
+        iconPic: [
+          { required: true, message: "图标图片不能为空", trigger: "blur" },
+        ],
+        iconCommonPic: [
+          {
+            required: true,
+            message: "通用功能展示的图片不能为空",
+            trigger: "blur",
+          },
+        ],
+        iconTypeId: [
+          { required: true, message: "图标类型id不能为空", trigger: "blur" },
+        ],
+        delFlag: [
+          { required: true, message: "是否删除不能为空", trigger: "blur" },
+        ],
+        createBy: [
+          { required: true, message: "创建人不能为空", trigger: "blur" },
+        ],
+        createTime: [
+          { required: true, message: "创建时间不能为空", trigger: "blur" },
+        ],
+        updateBy: [
+          { required: true, message: "更新人不能为空", trigger: "blur" },
+        ],
+        updateTime: [
+          { required: true, message: "更新时间不能为空", trigger: "blur" },
+        ],
+        remark: [
+          { required: true, message: "备注信息不能为空", trigger: "blur" },
+        ],
+      },
+      showDialog: true,
+      loading: false,
+      submitting: false,
+    };
+  },
+  created() {
+    // this.loadTree();
+
+    iconInfoApi.getIconTypeList().then(response => {
+      var jsonData = response.data;
+      this.iconTypeList = jsonData.data;
+    });
+  },
+  methods: {
+    closeDialog() {
+      this.$emit("close", false);
+    },
+    handleSubmit() {
+      var self = this;
+
+      this.$refs["form"].validate((valid) => {
+        if (valid) {
+          (function () {
+            var id = self.formModel.id;
+
+            if (id == null || id.length == 0) {
+              return iconInfoApi.add(self.formModel);
+            } else {
+              return iconInfoApi.update(self.formModel);
+            }
+          })().then(function (response) {
+            var jsonData = response.data;
+
+            if (jsonData.result) {
+              self.$message({
+                message: "保存成功!",
+                type: "success",
+              });
+
+              self.$emit("close", true);
+            } else {
+              self.$message({
+                message: jsonData.message + "",
+                type: "warning",
+              });
+
+              self.$emit("close", false);
+            }
+          });
+        }
+      });
+    },
+  },
+  mounted: function () {
+    var self = this;
+
+    (function () {
+      if (self.businessKey.length == 0) {
+        return iconInfoApi.create();
+      } else {
+        return iconInfoApi.edit(self.businessKey);
+      }
+    })()
+      .then((response) => {
+        var jsonData = response.data;
+        self.loading = false;
+
+        if (jsonData.result) {
+          self.formModel = jsonData.data;
+        } else {
+          self.$message.error(jsonData.message + "");
+        }
+      })
+      .catch((error) => {
+        self.$message.error(error + "");
+      });
+  },
+};
+</script>

+ 376 - 0
src/views/base/iconInfo-list.vue

@@ -0,0 +1,376 @@
+<template>
+  <div>
+    <el-breadcrumb separator=">">
+      <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
+      <el-breadcrumb-item>
+        <a href="#">系统管理</a>
+      </el-breadcrumb-item>
+      <el-breadcrumb-item>
+        <a href="/iconInfo">图标管理</a>
+      </el-breadcrumb-item>
+    </el-breadcrumb>
+    <el-divider></el-divider>
+    <!--
+      要resetFields起作用,必须配置:model和prop
+    -->
+    <el-form
+      ref="queryForm"
+      :model="queryModel"
+      inline
+      class="demo-form-inline"
+    >
+      <el-form-item label="图标名称" prop="iconName">
+        <el-input
+          type="text"
+          size="mini"
+          v-model="queryModel.iconName"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="备注信息" prop="remark">
+        <el-input
+          type="text"
+          size="mini"
+          v-model="queryModel.remark"
+        ></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          size="mini"
+          icon="ios-search"
+          @click="changePage(1)"
+          :loading="loading"
+          >查询</el-button
+        >&nbsp;
+        <el-button
+          type="info"
+          size="mini"
+          style="margin-left: 8px"
+          @click="handleReset('queryForm')"
+          >重置</el-button
+        >&nbsp;
+      </el-form-item>
+    </el-form>
+    <el-divider></el-divider>
+    <el-row class="button-group">
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-circle-plus"
+        @click="handleAdd"
+        >新增</el-button
+      >
+      <el-button
+        type="primary"
+        size="small"
+        plain
+        icon="el-icon-circle-plus"
+        :disabled="multipleSelection.length == 0"
+        @click="handleBatchDelete"
+        >删除选中项</el-button
+      >
+    </el-row>
+    <el-table
+      :data="tableData"
+      style="min-height: 400px"
+      v-loading="loading"
+      stripe
+      @sort-change="sortChange"
+      @selection-change="handleSelectionChange"
+    >
+      <el-table-column type="selection" width="55"></el-table-column>
+      <el-table-column
+        prop="iconName"
+        label="图标名称"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconRoute"
+        label="图标路由"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconSubRoute"
+        label="图标的子页面路由"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconUrl"
+        label="图标url"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconParam"
+        label="参数"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconPic"
+        label="图标图片"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconCommonPic"
+        label="通用功能展示的图片"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="iconTypeName"
+        label="图标类型"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="remark"
+        label="备注信息"
+        width="180"
+      ></el-table-column>
+      <el-table-column
+        prop="useEnableName"
+        label="是否启用"
+        width="180"
+      ></el-table-column>
+      <el-table-column label="操作" fixed="right" width="150">
+        <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
+          >
+        </template>
+      </el-table-column>
+    </el-table>
+    <el-pagination
+      :current-page.sync="pageIndex"
+      :total="totalElements"
+      :page-sizes="pageSizeList"
+      @current-change="changePage"
+      @size-change="pageSizeChange"
+      layout="total, sizes, prev, pager, next, jumper"
+    ></el-pagination>
+    <iconInfo-detail
+      v-if="showModal"
+      :businessKey="businessKey"
+      :title="modalTitle"
+      @close="onDetailModalClose"
+    ></iconInfo-detail>
+  </div>
+</template>
+<script>
+import Constant from "@/constant";
+import IconInfoDetail from "./iconInfo-detail";
+import iconInfoApi from "@/api/base/iconInfo";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+
+export default {
+  name: "baseIconInfoList",
+  data() {
+    var self = this;
+
+    return {
+      queryModel: {
+        id: "",
+        iconName: "",
+        iconRoute: "",
+        iconSubRoute: "",
+        iconUrl: "",
+        iconParam: "",
+        useEnable: "",
+        iconPic: "",
+        iconCommonPic: "",
+        iconTypeId: "",
+        delFlag: "",
+        createBy: "",
+        createTime: "",
+        updateBy: "",
+        updateTime: "",
+        remark: "",
+      },
+      loading: false,
+      tableData: [],
+      pageIndex: 1,
+      pageSize: 10,
+      totalPages: 0,
+      totalElements: 0,
+      field: "",
+      direction: "",
+      pageSizeList: [10, 20, 30],
+      multipleSelection: [],
+      showModal: false,
+      modalTitle: "",
+      businessKey: "",
+    };
+  },
+  methods: {
+    changePage(pageIndex) {
+      var self = this;
+
+      self.loading = true;
+
+      self.pageIndex = pageIndex;
+      var formData = new FormData();
+
+      formData.append("pageIndex", self.pageIndex);
+      formData.append("pageSize", self.pageSize);
+
+      formData.append("id", self.queryModel.id);
+      formData.append("iconName", self.queryModel.iconName);
+      formData.append("iconRoute", self.queryModel.iconRoute);
+      formData.append("iconSubRoute", self.queryModel.iconSubRoute);
+      formData.append("iconUrl", self.queryModel.iconUrl);
+      formData.append("iconParam", self.queryModel.iconParam);
+      formData.append("useEnable", self.queryModel.useEnable);
+      formData.append("iconPic", self.queryModel.iconPic);
+      formData.append("iconCommonPic", self.queryModel.iconCommonPic);
+      formData.append("iconTypeId", self.queryModel.iconTypeId);
+      formData.append("delFlag", self.queryModel.delFlag);
+      formData.append("createBy", self.queryModel.createBy);
+      formData.append("createTime", self.queryModel.createTime);
+      formData.append("updateBy", self.queryModel.updateBy);
+      formData.append("updateTime", self.queryModel.updateTime);
+      formData.append("remark", self.queryModel.remark);
+
+      if (this.field != null) {
+        formData.append("field", this.field);
+      }
+
+      if (this.direction != null) {
+        formData.append("direction", this.direction);
+      }
+
+      iconInfoApi
+        .pageList(formData)
+        .then(function (response) {
+          self.loading = false;
+
+          var jsonData = response.data.data;
+
+          self.tableData = jsonData.data;
+          self.totalPages = jsonData.totalPages;
+          self.totalElements = jsonData.recordsTotal;
+        })
+        .catch((error) => {
+          self.loading = false;
+          // self.$message.error(error + "");
+        });
+    },
+    pageSizeChange(pageSize) {
+      this.pageSize = pageSize;
+
+      this.$nextTick(() => {
+        this.changePage(this.pageIndex);
+      });
+    },
+    sortChange(data) {
+      this.field = data.column.field;
+      this.direction = data.order;
+
+      this.changePage(this.pageIndex);
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    handleReset(name) {
+      this.$refs[name].resetFields();
+    },
+    handleAdd() {
+      this.modalTitle = "新增";
+      this.businessKey = "";
+      this.showModal = true;
+    },
+    handleEdit(record) {
+      this.modalTitle = "编辑";
+      this.businessKey = record.id;
+      this.showModal = true;
+    },
+    handleDelete(record) {
+      var self = this;
+
+      self
+        .$confirm("是否确认删除?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        })
+        .then(() => {
+          iconInfoApi.remove(record.id).then(function (response) {
+            var jsonData = response.data;
+
+            if (jsonData.result) {
+              // var index = self.tableData.indexOf(record);
+              // self.tableData.splice(index, 1);
+              self.changePage(self.pageIndex);
+
+              self.$message({
+                type: "success",
+                message: "删除成功!",
+              });
+            }
+          });
+        });
+    },
+    handleBatchDelete() {
+      var self = this;
+
+      var idList = this.multipleSelection.map((record) => {
+        return record.id;
+      });
+
+      this.$confirm("是否确认删除选中项?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(() => {
+        iconInfoApi.batchRemove(idList).then(function (response) {
+          var jsonData = response.data;
+
+          if (jsonData.result) {
+            self.changePage(self.pageIndex);
+
+            self.$message({
+              type: "success",
+              message: "删除成功!",
+            });
+          }
+        });
+      });
+    },
+    onDetailModalClose(refreshed) {
+      //保存成功后回调
+      this.showModal = false;
+
+      if (refreshed) {
+        this.changePage(this.pageIndex);
+      }
+    },
+  },
+  mounted: function () {
+    this.changePage(1);
+  },
+  components: {
+    "iconInfo-detail": IconInfoDetail,
+  },
+};
+</script>
+<style lang="scss" scoped>
+.el-breadcrumb {
+  margin: 10px;
+  line-height: 20px;
+}
+
+.el-divider {
+  margin: 5px 0;
+}
+
+.demo-form-inline {
+  margin-left: 10px;
+  text-align: left;
+}
+
+.button-group {
+  margin-left: 10px;
+  text-align: left;
+}
+</style>

+ 62 - 66
src/views/base/personInfo-detail.vue

@@ -12,6 +12,7 @@
     style="text-align: left"
     @close="closeDialog"
     :close-on-click-modal="false"
+    width="900px"
   >
     <div class="user-panel" v-loading="loading">
       <el-form
@@ -20,18 +21,6 @@
         :rules="ruleValidate"
         :label-width="'100px'"
       >
-        <!-- <el-row>
-          <el-col :span="12">
-            <el-form-item label="单位" prop="companyId">
-              <el-select-tree
-                :props="props"
-                :options="companyResult"
-                v-model="formModel.companyId"
-                height="200"
-              ></el-select-tree>
-            </el-form-item>
-          </el-col>
-        </el-row> -->
         <el-row>
           <el-col :span="12">
             <el-form-item label="姓名" prop="name">
@@ -41,18 +30,6 @@
               ></el-input>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="园区" prop="parkId">
-              <el-select-tree
-                :props="props"
-                :options="parkList"
-                v-model="formModel.parkId"
-                height="200"
-              ></el-select-tree>
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row>
           <el-col :span="12">
             <el-form-item label="手机号" prop="phone">
               <el-input
@@ -61,34 +38,48 @@
               ></el-input>
             </el-form-item>
           </el-col>
+        </el-row>        
+        <el-row>
           <el-col :span="12">
-            <el-form-item label="身份证" prop="idCard">
-              <el-input
-                v-model="formModel.idCard"
-                placeholder="请输入身份证"
-              ></el-input>
+            <el-form-item label="单位" prop="companyId">
+              <el-select-tree
+                :props="props"
+                :options="companyResult"
+                v-model="formModel.companyId"
+                height="200"
+                style="width:330px;"
+                size="large"
+              ></el-select-tree>
             </el-form-item>
           </el-col>
-        </el-row>
-        <!-- <el-row>
-          <el-col :span="24">
-            <el-form-item label="用户身份" prop="popedom">
+          <el-col :span="12">
+            <el-form-item label="用户身份" prop="personRoleId">
               <el-select
-                v-model="formModel.popedom"
                 filterable
                 placeholder="请选择"
                 style="width: 280px"
+                v-model="formModel.personRoleId"
               >
                 <el-option
                   v-for="role in personRoleResult"
                   :key="role.personRoleName"
                   :label="role.personRoleName"
-                  :value="role.personRoleName"
+                  :value="role.id"
                 ></el-option>
               </el-select>
             </el-form-item>
           </el-col>
-        </el-row> -->
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="身份证" prop="idCard">
+              <el-input
+                v-model="formModel.idCard"
+                placeholder="请输入身份证"
+              ></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
         <el-row>
           <el-col :span="24">
             <el-form-item label="关联单位" prop="personCompany">
@@ -250,6 +241,26 @@ export default {
     "companyPosition4",
     "companyPosition5",
   ],
+  watch: {
+    "formModel.companyId":function(newVal,oldVal){
+        var self = this;
+
+        if(newVal!=null){
+          var formData = new FormData();
+          formData.append("companyId", newVal);
+
+          //查询单位下角色
+          personRoleInfoApi.listByCompanyId(formData)
+          .then(response=>{
+              var jsonData = response.data;
+
+              if (jsonData.result) {
+                self.personRoleResult = jsonData.data;
+              }
+          })
+        }
+    }
+  },
   data() {
     let checkIdCard = (rule, value, callback) => {
       var identNumber = value;
@@ -268,6 +279,7 @@ export default {
         companyId: [{ required: true, message: "请选择单位", trigger: "blur" }],
         name: [{ required: true, message: "姓名不能为空", trigger: "blur" }],
         phone: [{ required: true, message: "手机号不能为空", trigger: "blur" }],
+        personRoleId: [{ required: true, message: "请选择身份", trigger: "blur" }]
         // idCard: [
         //   { required: false, message: "身份证不能为空", trigger: "blur" },
         //   {
@@ -275,9 +287,6 @@ export default {
         //     trigger: "blur"
         //   }
         // ]
-        popedom: [
-          { required: true, message: "请选择用户身份", trigger: "blur" },
-        ],
       },
       showDialog: true,
       loading: false,
@@ -358,15 +367,15 @@ export default {
             var id = self.formModel.id;
             //数组转换为字符串
             //用户身份
-            if (
-              self.formModel.popedom != null &&
-              self.formModel.popedom != ""
-            ) {
-              var popedom = self.formModel.popedom.join(",");
-              self.formModel.popedom = popedom;
-            } else {
-              self.formModel.popedom = "";
-            }
+            // if (
+            //   self.formModel.popedom != null &&
+            //   self.formModel.popedom != ""
+            // ) {
+            //   var popedom = self.formModel.popedom.join(",");
+            //   self.formModel.popedom = popedom;
+            // } else {
+            //   self.formModel.popedom = "";
+            // }
 
             //子单位
             if (
@@ -451,12 +460,12 @@ export default {
           }
 
           if (self.businessKey.length == 0) {
-            self.formModel.popedom = ["1"];
+            //self.formModel.popedom = ["1"];
           } else {
-            var popedom = self.formModel.popedom;
-            if (popedom != "") {
-              self.formModel.popedom = popedom.split(",");
-            }
+            // var popedom = self.formModel.popedom;
+            // if (popedom != "") {
+            //   self.formModel.popedom = popedom.split(",");
+            // }
 
             var personCompany = self.formModel.personCompany;
             if (personCompany != "") {
@@ -468,19 +477,6 @@ export default {
               self.formModel.wechatNoticeEnabled = true;
             }
           }
-
-          var formData5 = new FormData();
-          formData5.append("companyId", self.formModel.companyId);
-          personRoleInfoApi
-            .listByCompanyId(formData5)
-            .then(function (response) {
-              var jsonData = response.data;
-              if (jsonData.result) {
-                if (jsonData.data != null && jsonData.data != "") {
-                  self.personRoleResult = jsonData.data;
-                }
-              }
-            });
         } else {
           self.$message.error(jsonData.message + "");
         }

+ 61 - 30
src/views/base/personInfo-list.vue

@@ -562,23 +562,37 @@
       <el-form label-width="150px">
         <el-form-item label="模板下载">
           <el-link
-            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/personInfo/2020/10/%E5%B0%8F%E9%B9%8F%E7%AE%A1%E5%AE%B6%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xls"
+            href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/personInfo/2020/10/小鹏管家人员导入模板.xls"
             type="primary"
             target="_blank"
             >点击下载模板</el-link
           >
         </el-form-item>
-        <!-- <el-form-item label="单位">
+        <el-form-item label="单位">
           <el-select-tree
-            size="mini"
+            size="large"
             :props="props"
             :options="companyResult"
-            v-model="uploadCompanyId"
-            @input="changeUploadCompayId($event)"
+            v-model="uploadXlsData.companyId"
             height="200"
-          ></el-select-tree
+            width="300px"
+          ></el-select-tree>
+        </el-form-item>
+        <el-form-item label="用户身份" prop="personRoleId">
+          <el-select
+            filterable
+            placeholder="请选择"
+            style="width: 300px;"
+            v-model="uploadXlsData.personRoleId"
           >
-        </el-form-item> -->
+            <el-option
+              v-for="role in personRoleResult"
+              :key="role.personRoleName"
+              :label="role.personRoleName"
+              :value="role.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>        
         <el-form-item label="上传文件">
           <el-upload
             class="upload-demo"
@@ -675,9 +689,7 @@
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="closeBatchUnBoundDevice">关 闭</el-button>
-        <el-button type="primary" @click="handleBatchUnBoundDevice"
-          >确 定</el-button
-        >
+        <el-button type="primary" @click="handleBatchUnBoundDevice">确 定</el-button>
       </div>
     </el-dialog>
     <!-- 批量解绑设备end -->
@@ -708,6 +720,7 @@ import PersonPopedomList from "./personPopedom-list";
 
 import personInfoApi from "@/api/base/personInfo";
 import companyInfoApi from "@/api/base/companyInfo";
+import personRoleInfoApi from "@/api/base/personRoleInfo";
 import companyPositionApi from "@/api/base/companyPosition";
 import deviceInfoApi from "@/api/base/deviceInfo";
 import personDeviceRelationApi from "@/api/base/personDeviceRelation";
@@ -756,14 +769,15 @@ export default {
       modalTitle: "",
       businessKey: "",
       companyResult: [],
-      uploadCompanyId: "",
       batchImportVisible: false,
       batchImportFileList: [],
       uploadUrlXls: Constant.serverUrl + "/base/personInfo/importXls",
       uploadXlsData: {
         subFolder: "company",
         companyId: "",
+        personRoleId: ""
       },
+      personRoleResult: [],
       headers: {
         Authorization: getToken(),
       },
@@ -804,6 +818,26 @@ export default {
       showRoleModal: false,
     };
   },
+  watch: {
+    "uploadXlsData.companyId":function(newVal,oldVal){
+        var self = this;
+
+        if(newVal!=null){
+          var formData = new FormData();
+          formData.append("companyId", newVal);
+
+          //查询单位下角色
+          personRoleInfoApi.listByCompanyId(formData)
+          .then(response=>{
+              var jsonData = response.data;
+
+              if (jsonData.result) {
+                self.personRoleResult = jsonData.data;
+              }
+          })
+        }
+    }
+  },
   created() {
     var self = this;
 
@@ -1052,10 +1086,6 @@ export default {
         this.changePage(this.pageIndex);
       }
     },
-    changeUploadCompayId(value) {
-      var self = this;
-      self.uploadXlsData.companyId = value;
-    },
     bindDevice(record) {
       //绑定设备
       this.personId = record.id;
@@ -1070,35 +1100,36 @@ export default {
     beforeUpload(file, fileList) {
       //导入前判断
       var self = this;
-      // if (self.uploadCompanyId == null || self.uploadCompanyId == "") {
-      //   self.$message({
-      //     type: "warning",
-      //     message: "请选择单位",
-      //   });
-      //   self.xlsLoading = false;
-      //   return false;
-      // } else {
-      self.xlsLoading = true;
-      //return true;
-      //}
+      var companyId = self.uploadXlsData.companyId;
+
+      if (companyId==null || companyId.length==0) {
+        self.$message({
+          type: "warning",
+          message: "请选择单位!",
+        });
+        self.xlsLoading = false;
+        return false;
+      } else {
+        self.xlsLoading = true;
+        return true;
+      }
     },
     //批量导入-上传成功
     handleBatchImportSuccess(response, file, fileList) {
       var self = this;
       self.xlsLoading = false;
+      self.uploadXlsData.companyId = null;
+      
       if (response.result) {
         self.$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) {
           //下载有错误信息提示的报表

+ 25 - 0
src/views/base/personRoleInfo-detail.vue

@@ -27,6 +27,21 @@
             style="width: 300px"
           ></el-input>
         </el-form-item>
+        <el-form-item label="上级身份" prop="parentId">
+          <el-select
+            v-model="formModel.parentId"
+            filterable
+            placeholder="请选择"
+            style="width: 300px"
+          >
+            <el-option
+              v-for="result in personRoleList"
+              :key="result.id"
+              :label="result.personRoleName"
+              :value="result.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
         <el-form-item label="适用于与场景" prop="sceneId">
           <el-select
             v-model="formModel.sceneId"
@@ -91,6 +106,7 @@ export default {
       showDialog: true,
       loading: false,
       submitting: false,
+      personRoleList: []
     };
   },
   methods: {
@@ -136,6 +152,15 @@ export default {
   mounted: function () {
     var self = this;
 
+    personRoleInfoApi.findAll()
+    .then(response=>{
+      var jsonData = response.data;
+
+      if(jsonData.result){
+        this.personRoleList = jsonData.data;
+      }
+    });
+
     (function () {
       if (self.formModel.useEnable == null) {
         self.formModel.useEnable = 0;

+ 179 - 0
src/views/base/personRoleInfo-icon.vue

@@ -0,0 +1,179 @@
+<template>
+    <el-dialog
+      :visible.sync="showDialog"
+      :title="title"
+      width="900px"
+      :modal-append-to-body="false"
+      style="text-align:left;"
+      @close="closeDialog"
+      :close-on-click-modal="false"
+    >
+    <div class="flex-row">
+      <div class="role-permission">
+          <el-transfer
+          v-model="relatedMenus"
+          :data="menuList"
+          v-loading="loading"
+          filterable
+          target-order="push"
+          :filter-method="filterMethod"
+          filter-placeholder="请输入关键字"
+          :props="{key: 'id',label: 'description'}"
+          :titles="['未分配菜单','已分配菜单']"
+          @right-check-change="rightCheckChange"
+          ></el-transfer>
+      </div>
+      <div class="flex-col">
+        <div>
+          <el-button round size="mini" @click="moveUp">上移</el-button>
+          <div style="height:10px;"></div>
+          <el-button round size="mini" @click="moveDown">下移</el-button>
+        </div>
+      </div>
+    </div>
+    <span slot="footer" class="dialog-footer">
+        <el-button @click="closeDialog">取 消</el-button>
+        <el-button type="primary" @click="handleSubmit" :loading="submitting">确 定</el-button>
+    </span>
+    </el-dialog>
+</template>
+<script>
+import personRoleApi from "@/api/base/personRoleInfo";
+
+export default {
+  props: ["personRoleId","mode","title"],
+  data() {
+    return {
+      menuList: [],
+      relatedMenus: [],
+      loading: false,
+      showDialog: true,
+      submitting: false,
+      rightCheckedItems: []
+    };
+  }, 
+  methods: {
+    closeDialog() {
+      this.$emit("close",false);
+    },
+    handleSubmit() {
+      var self = this;
+
+      personRoleApi
+        .saveRelatedIcon(this.personRoleId,this.mode,this.relatedMenus)
+        .then(function(response) {
+          var jsonData = response.data;
+          self.submitting = false;
+
+          if (jsonData.result) {
+            self.$message({
+              message: "保存成功!",
+              type: "success"
+            });
+
+            self.$emit("close",true);
+          } else {
+            self.$message({
+              message: jsonData.message + "",
+              type: "warning"
+            });
+
+            self.$emit("close",false);
+          }
+        });
+    },
+    filterMethod(query, item) {
+      return item.description.indexOf(query) > -1;
+    },
+    queryRelatedMenuList() {
+      var self = this;
+
+      self.loading = true;
+
+      self.menuList = [];
+      self.relatedMenus= [];
+
+      personRoleApi.findAllIcon(this.personRoleId)
+        .then(response => {
+          var jsonData = response.data;
+
+          self.menuList = jsonData.data.map(item => {
+            return {
+              id: item.id,
+              description: "[" + item.iconTypeName + "]" + item.iconName
+            };
+          });
+
+          return personRoleApi.findRelatedIcon(self.personRoleId,self.mode);
+        })
+        .then(response => {
+          var jsonData = response.data;
+
+          self.relatedMenus = jsonData.data.map(item => {
+            return item.iconId;
+          });
+
+          //console.log(self.relatedMenus);
+
+          self.loading = false;
+        });
+    },
+    rightCheckChange(checkedItems) {
+      this.rightCheckedItems = checkedItems;
+    },
+    moveUp() {
+      this.rightCheckedItems.forEach(id=>{
+        var index = this.relatedMenus.indexOf(id);
+
+        if(index>0){
+          console.log(index + "," + id);
+          this.relatedMenus.splice(index,1);
+          this.relatedMenus.splice(index-1,0,id);
+        }
+      })
+    },
+    moveDown() {
+      this.rightCheckedItems.forEach(id=>{
+        var index = this.relatedMenus.indexOf(id);
+
+        if(index<this.relatedMenus.length-1){
+          console.log(index + "," + id);
+          this.relatedMenus.splice(index,1);
+          this.relatedMenus.splice(index+1,0,id);
+        }
+      })
+    }
+  },
+  mounted() {
+    this.queryRelatedMenuList();
+  }
+};
+</script>
+<style lang="scss">
+.role-permission {
+  .el-transfer-panel {
+    border: 1px solid #ebeef5;
+    border-radius: 4px;
+    overflow: hidden;
+    background: #fff;
+    display: inline-block;
+    vertical-align: middle;
+    width: 320px;
+    -webkit-box-sizing: border-box;
+    box-sizing: border-box;
+    position: relative;
+  }
+}
+
+.flex-row{
+  display:flex;
+  flex-direction: row;
+}
+
+.flex-col{
+  display: flex;
+  flex-direction: col;
+  justify-content: center; /* 水平居中 */
+  align-items: center;     /* 垂直居中 */
+}
+</style>

+ 55 - 5
src/views/base/personRoleInfo-list.vue

@@ -100,6 +100,11 @@
         label="身份名称"
         width="150"
       ></el-table-column>
+      <el-table-column
+        prop="parentName"
+        label="上级身份"
+        width="150"
+      ></el-table-column>
       <el-table-column
         prop="sceneName"
         label="适用场景"
@@ -115,15 +120,29 @@
           ></el-switch>
         </template>
       </el-table-column>
+      <el-table-column prop="registerEnable" label="注册时可选" width="180">
+        <template slot-scope="{ row }">
+          <el-switch
+            v-model="row.registerEnable"
+            active-color="#13ce66"
+            inactive-color="#ff4949"
+            @change="updateRegisterEnabled(row)"
+          ></el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column prop="registerEnable" label="首页菜单设置" width="180">
+        <template slot-scope="{ row }">
+          <el-link type="primary" @click="showIconList(row,'common')">通用菜单</el-link>-
+          <el-link type="primary" @click="showIconList(row,'default')">默认菜单</el-link>
+        </template>
+      </el-table-column>
       <el-table-column prop="remark" label="备注" width="180"></el-table-column>
-      <el-table-column label="操作">
+      <el-table-column label="操作" fixed="right" width="200">
         <template slot-scope="{ row }">
           <el-button size="mini" type="warning" @click="handleEdit(row)"
-            >编辑</el-button
-          >
+            >编辑</el-button>
           <el-button size="mini" type="danger" @click="handleDelete(row)"
-            >删除</el-button
-          >
+            >删除</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -142,11 +161,19 @@
       :sceneData="sceneData"
       @close="onDetailModalClose"
     ></personRoleInfo-detail>
+    <personRoleInfo-icon
+      v-if="showIconModal"
+      :personRoleId="businessKey"
+      :title="iconModalTitle"
+      :mode="iconMode"
+      @close="onIconModalClose"
+    ></personRoleInfo-icon>
   </div>
 </template>
 <script>
 import Constant from "@/constant";
 import PersonRoleInfoDetail from "./personRoleInfo-detail";
+import PersonRoleInfoIcon from "./personRoleInfo-icon";
 import personRoleInfoApi from "@/api/base/personRoleInfo";
 import sceneInfoApi from "@/api/base/sceneInfo";
 import NProgress from "nprogress"; // progress bar
@@ -175,6 +202,9 @@ export default {
       modalTitle: "",
       businessKey: "",
       sceneData: [],
+      iconMode: "common",
+      showIconModal: false,
+      iconModalTitle: ""
     };
   },
   created() {
@@ -313,15 +343,35 @@ export default {
         this.changePage(this.pageIndex);
       }
     },
+    onIconModalClose(){
+      this.showIconModal = false;
+    },
     updateEnabled(row) {
       personRoleInfoApi.update(row);
     },
+    updateRegisterEnabled(row) {
+      personRoleInfoApi.update(row);
+    },
+    showIconList(row,mode) {
+      this.iconMode = mode;
+      this.businessKey = row.id;
+
+      if(mode=="common"){
+        this.iconModalTitle = "通用菜单设置";
+      }
+      else{
+        this.iconModalTitle = "默认菜单设置";
+      }
+
+      this.showIconModal = true;
+    }
   },
   mounted: function () {
     this.changePage(1);
   },
   components: {
     "personRoleInfo-detail": PersonRoleInfoDetail,
+    "personRoleInfo-icon" : PersonRoleInfoIcon
   },
 };
 </script>