Эх сурвалжийг харах

新增用户关联 用户功能

zhulu 1 жил өмнө
parent
commit
b8655fdc25

+ 15 - 0
src/api/system/user.js

@@ -168,3 +168,18 @@ export function newDateDay(time) {
   d = d < 10 ? '0' + d : d
   return y + '-' + m+'-'+d
 }
+
+export function updateUserMapper(data) {
+  return request({
+    url: '/system/user/mapperuser',
+    method: 'put',
+    data
+  })
+}
+
+export function getUserMapper(userId) {
+  return request({
+    url: '/system/user/mapperlist/'+userId,
+    method: 'get'
+  })
+}

+ 24 - 7
src/components/userSelector/index.vue

@@ -19,7 +19,7 @@
             @checkChange="checkChange"
             @click="clickTreeNode"
             :customRequest="customTreeRequest"
-            :defuaultCheckSub="search.checkSub"
+            :defaultCheckSub="true"
             :autoHeight="false"
           ></org-tree>
         </el-col>
@@ -147,6 +147,10 @@ export default {
       type: Boolean,
       default: true,
     },
+    otherPrap:{
+      type: Object,
+      default:null
+    }
   },
   methods: {
     getLabel,
@@ -217,12 +221,25 @@ export default {
       this.refresh();
     },
     emptySearch() {
-      return {
-        orgId: null,
-        checkSub: false,
-        username: null,
-        name: null,
-      };
+      if(this.otherPrap)
+      {
+        return {
+          orgId: null,
+          checkSub: true,
+          username: null,
+          name: null,
+          ...this.otherPrap
+        };
+      }
+      else{
+          return {
+          orgId: null,
+          checkSub: true,
+          username: null,
+          name: null,
+        };
+      }
+      
     },
   },
   mounted() {},

+ 22 - 1
src/views/system/user/index.vue

@@ -329,6 +329,15 @@
                     v-hasPermi="['system:user:resetPwd']"
                     >重置密码</el-button
                   >
+                  <el-button
+                    size="mini"
+                    type="text"
+                    icon="el-icon-s-check"                    
+                    @click="mapperSubUser(scope.row)"
+                    v-hasPermi="['system:user:mapperUser']"
+                    
+                    >关联账号</el-button
+                  >
                 </template>
               </el-table-column>
             </el-table>
@@ -576,11 +585,19 @@
         <el-button @click="upload.open = false">取 消</el-button>
       </div>
     </DialogCom>
+    <mapperUser-dialog
+      ref="mapperUserDialog"
+    ></mapperUser-dialog>
+    
   </div>
 </template>
 
 <script>
 import OrgTree from "@/components/orgTree";
+// import UserSelector from "@/components/userSelector/index.vue";
+// import UserSelector from "./userSelector/index.vue";
+import MapperUserDialog from "./mapperUser.vue";
+// import { deptTreeWithSameTypeUp } from "@/api/system/org.js";
 import {
   listUser,
   getUser,
@@ -607,7 +624,7 @@ export default {
 
   name: "User",
   mixins: [tableList],
-  components: { OrgTree },
+  components: { OrgTree,MapperUserDialog },
 
   data() {
     return {
@@ -990,6 +1007,10 @@ export default {
         this.title = "重置密码";
       });
     },
+    mapperSubUser(row)
+    {
+      this.$refs.mapperUserDialog.show(row.id);
+    },
     /** 修改按钮操作 */
     handleUpdate(row) {
       this.isRoleIdsChanged = false;

+ 319 - 0
src/views/system/user/mapperUser.vue

@@ -0,0 +1,319 @@
+<template>
+  <div class="app-container">
+    <DialogCom
+      @closed="onClose"
+      title="关联账号"
+      :visible.sync="isShow"
+      width="1300px"
+    >
+    <div class="page-body">
+        <el-descriptions size="medium" border>
+          <template #title>
+            <h3 class="title">
+              <i class="el-icon-collection-tag"></i>
+              基础信息
+            </h3>
+          </template>
+          <el-descriptions-item v-for="v in dataInfo" :label="v.label" :key="v.key">{{ v.value }}</el-descriptions-item>
+          <el-descriptions-item label="角色">{{ roleName }}</el-descriptions-item>
+          <el-descriptions-item label="性别">{{ sex }}</el-descriptions-item>
+          <el-descriptions-item label="状态">{{ status }}</el-descriptions-item>
+        </el-descriptions>
+      <!-- <div class="info-box"> -->
+        <h3 class="title">
+          <i class="el-icon-collection-tag"></i>
+          关联人员列表
+        </h3>
+        <div style="margin-bottom: 10px">
+          <el-button
+            @click="openSelect"            
+            ><span class="requiredlabel">选择关联人员</span></el-button
+          >
+          <el-button
+            @click="deleteSelected"            
+            >批量删除</el-button
+          >
+        </div>
+
+        <el-table
+          :data="tableData"
+          style="width: 100%"
+          height="300px"
+          border
+          @selection-change="handleSelectionChange"
+        >
+          <el-table-column
+            type="selection"
+          ></el-table-column>
+          <el-table-column
+            prop="subUserOrgName"
+            label="机构名称"
+            align="center"
+            show-overflow-tooltip
+          >
+          </el-table-column>
+          <el-table-column
+            prop="subUserName"
+            label="名称"
+            align="center"
+            show-overflow-tooltip
+          >
+          </el-table-column>
+          <el-table-column
+            prop="subUserRoleNames"
+            label="角色名称"
+            width="300px"
+            align="center"
+            show-overflow-tooltip
+          >
+          </el-table-column>         
+          <el-table-column label="操作" align="center">
+            <template v-slot="{ row }">
+              <el-button               
+                type="text"
+                @click="removeRow(row)"
+                >删除</el-button
+              >
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+    <!-- </div> -->
+    <div slot="footer" class="dialog-footer" style="margin-top: 10px">
+        <el-button type="primary" @click="onSubmit">确定</el-button>
+        <el-button @click="onClose">取消</el-button>
+      </div>
+    </DialogCom>
+    <UserSelector
+      ref="UserSelector"
+      @select="onUserSelect"
+      :customTreeRequest="deptTreeWithSameTypeUp"
+      :otherPrap="searchUserPrap"
+    ></UserSelector>
+  </div>
+</template>
+
+<script>
+import { getUser,updateUserMapper,getUserMapper } from "@/api/system/user";
+import UserSelector from "@/components/userSelector/index.vue";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { deptTreeWithSameTypeUp } from "@/api/system/org.js";
+
+export default {
+  dicts: ['administrative_level','sys_yes_no','sys_highest_education', "sys_work_type", "sys_duties", "sys_education_type", 'sys_department_type', 'post_no_pass', 'current_position','department_name'],
+  fillter: {},
+  components: {UserSelector},
+  props: [],
+
+  data() {
+    return {
+      isShow:false,
+      userId:null,
+      tableData:[],
+      selectedRows:[],
+      searchUserPrap:{ source:0},
+
+      //基础信息key
+      infoKeys: [
+        { label: '用户名称', key: 'username' },
+        { label: '用户昵称', key: 'name' },
+        { label: '工号', key: 'jobNumber' },
+        //  {label:'部门',key:'orgName'},
+        { label: '手机', key: 'phone' },
+        // {label:'性别',key:'gender'},
+        // {label:'状态',key:'isLock'},
+        { label: '机构', key: 'orgName' },
+      ],
+      dataInfo: [],
+      // 机构树选项
+      deptList: undefined,
+      // 遮罩层
+      orgloading: true,
+      // 选中数组
+      orgids: [],
+      // 选中数组
+      Bankids: [],
+      // 非单个停用
+      single: true,
+      // 非多个停用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+    };
+  },
+  computed: {    
+  },
+  created() {
+  },
+  mounted() {
+  },
+  methods: {
+    deptTreeWithSameTypeUp,
+    handleChange(value) {
+    },
+    async show(id, other = {}) {
+      this.userId=id;
+      this.tableData=[];      
+      await this.getInfo(id, other);  
+      this.isShow = true;
+    },
+    getInfo(userId) {
+      getUser(userId).then((data) => {
+        if (!data.data) return;
+        let res = data.data;
+        this.dataInfo = this.infoKeys.map((v, i) => {
+          v.value = res[v.key];
+          return v
+        })
+        this.roleName = data.roleName;
+        this.sex = data.sex;
+        this.status = data.status;
+      });
+      getUserMapper(userId).then((data) => {
+        if (!data.data) return;
+        this.tableData=data.data;
+      })
+    },
+    openSelect() {
+      this.$refs.UserSelector.show();
+    },
+    onUserSelect(selectList) {
+      if (!selectList || selectList.length === 0) {
+        this.$message.warning("请选择要关联的人员");
+        return;
+      }
+      if (this.tableData == null) {
+        this.tableData = [];
+      }
+       let selectedUserOrgIds = selectList.map((i) => i.orgId);
+        // Array.from(new Set(arr))
+        let temp=selectedUserOrgIds.filter(function (item, index, arr) {
+        //当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
+          return selectedUserOrgIds.indexOf(item, 0) === index;
+        });
+        if(temp.length<selectedUserOrgIds.length)
+        {
+          this.$message.warning("一个机构下人只能关联一个自建账号,多选时只会选中该机构下的第一个的账号,其他账号将会被忽略");
+        }
+
+      // this.tableData = this.tableData.filter((d) => selectedIds.includes(d.id));
+      
+      // 一个机构下人只能关联一个自建账号
+      for (let i = 0; i < selectList.length; i++) {
+        let item = selectList[i];
+        let exist = this.tableData.find((d) => d.subUserId == item.id);
+        let orgExist = this.tableData.find((d) => d.subUserOrgId == item.orgId);
+        console.log(this.orgId, "this.orgId");
+        if (!exist && !orgExist) {
+          let tem = {
+            masterUserId:this.userId,
+            subUserId: item.id,
+            subUserName: item.name,
+            subUserOrgId: item.orgId,
+            subUserOrgName: item.orgName,
+            subUserAccount: item.userName,
+            subUserRoleNames: item.roleNames,
+          };
+          this.tableData.push(tem);
+          // console.log(tem,"tem")
+        }
+      }
+    },
+     // 监听行选中事件,将选中的行数据存入 selectedRows 数组中
+     handleSelectionChange(selection) {
+      // console.log(selection, "selection");
+      this.selectedRows = selection;
+    },
+    deleteSelected() {
+      // 在这里执行批量删除操作,使用 this.selectedRows 数组中的数据
+      console.log("删除选中的数据:", this.selectedRows);
+      // 从数据数组中移除选中的行数据
+      this.tableData = this.tableData.filter(
+        (row) => !this.selectedRows.includes(row)
+      );
+      // 清空选中的行数据
+      this.selectedRows = [];
+    },
+    removeRow(row) {
+      this.$modal
+        .confirm("是否确认删除?")
+        .then(function () {})
+        .then(() => {
+          this.tableData = this.tableData.filter((item) => item !== row);
+          this.$modal.msgSuccess("删除成功");
+        });
+    },
+    onSubmit() {
+      this.tableData.map((item) => item.subUserId);
+      let data = {
+        masterUserId: this.userId,
+        mapperUserIds: this.tableData && this.tableData.length>0 ? this.tableData.map((item) => item.subUserId):[]
+      }
+      updateUserMapper(data).then((response) => {
+        this.$modal.msgSuccess("关联成功");
+        this.onClose();
+      });
+
+    },
+    onClose()
+    {
+      this.userId=null;
+      this.tableData=[]; 
+      this.isShow=false;     
+    } 
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.user-extend{
+  background-color: #fff;
+  padding: 10px;
+}
+.title {
+  font-size: 18px;
+  text-align: left;
+  color: #008CD6ff;
+  height: 36px;
+  line-height: 36px;
+  padding-left: 8px;
+  margin: 0;
+}
+
+.info-box {
+  margin: 20px;
+}
+
+.demo-form-inline {}
+
+.dialog-footer {}
+
+.container {}
+
+.image-container {
+  display: inline-block;
+  width: 200px;
+  margin-right: 20px;
+  /* 设置与下一个div的水平间距 */
+}
+
+.zoom-image {
+  transition: transform 0.3s ease;
+}
+
+.zoom-image:hover {
+  transform: scale(1.02);
+}
+
+.border-color-change {
+  border: 1px solid #ccc;
+  transition: border-color 0.3s ease;
+}
+
+.border-color-change:hover {
+  border-color: #1ea8e9;
+  /* 您可以将此颜色更改为所需的颜色 */
+}
+</style>