Selaa lähdekoodia

组件优化:更新用户类型选项,重构用户选择逻辑,支持部门树形选择和动态过滤,优化项目管理筛选功能

刘博博 1 kuukausi sitten
vanhempi
commit
a5aefbfa28

+ 26 - 13
src/components/UserSelect/index.vue

@@ -92,7 +92,7 @@
 
                 <div class="user-table" v-if="shouldShowUserTable">
                     <el-table v-loading="userLoading" @row-click="clickRow" ref="table" :data="userList"
-                        @selection-change="handleSelectionChange" style="flex: 1">
+                        @selection-change="handleSelectionChange" style="flex: 1; overflow: auto;">
                         <!-- 根据选择模式显示不同的选择列 -->
                         <el-table-column v-if="selectMode === 'multiple'" type="selection" width="55"></el-table-column>
                         <el-table-column v-else type="index" width="55" label="选择">
@@ -116,7 +116,7 @@
                     </el-table>
                     <div class="pagination-container">
                         <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
-                            :limit.sync="queryParams.pageSize" @pagination="getUsers" />
+                            :limit.sync="queryParams.pageSize" @pagination="handlePagination" />
                     </div>
                 </div>
 
@@ -209,10 +209,10 @@ export default {
             // 用户类型选择
             selectedUserType: undefined,
             userTypeOptions: [
-                { value: '1', label: '系统用户' },
-                { value: '2', label: '慧项管第三方用户' },
-                { value: '3', label: '慧监理第三方用户' },
-                { value: '4', label: '建科用户' }
+                { value: '00', label: '系统用户' },
+                { value: '03', label: '慧项管第三方用户' },
+                { value: '02', label: '慧监理第三方用户' },
+                { value: '01', label: '建科用户' }
             ]
         };
     },
@@ -223,11 +223,11 @@ export default {
         },
         // 是否显示部门面板(只有建科用户需要选择部门)
         showDepartmentPanel() {
-            return this.selectedUserType === '4';
+            return this.selectedUserType === '01';
         },
         // 是否需要选择部门
         needDepartmentSelection() {
-            return this.selectedUserType === '4';
+            return this.selectedUserType === '01';
         },
         // 是否应该显示用户表格
         shouldShowUserTable() {
@@ -327,7 +327,7 @@ export default {
             }
             
             // 如果不是建科用户(1,2,3),直接加载该类型的所有用户
-            if (value !== '4') {
+            if (value !== '01') {
                 this.getUsersByType();
             }
             // 如果是建科用户(4),需要加载部门树供选择
@@ -335,6 +335,16 @@ export default {
                 this.loadDepartmentData();
             }
         },
+        // 处理分页变化
+        handlePagination() {
+            if (this.needDepartmentSelection) {
+                // 建科用户需要按部门查询
+                this.getUsers();
+            } else {
+                // 非建科用户按类型查询
+                this.getUsersByType();
+            }
+        },
         // 根据用户类型加载用户(不需要部门)
         async getUsersByType() {
             this.userLoading = true;
@@ -467,9 +477,9 @@ export default {
                 };
                 
                 // 如果有用户类型,添加到参数中
-                if (this.queryParams.userType) {
-                    params.userType = this.queryParams.userType;
-                }
+                // if (this.queryParams.userType) {
+                //     params.userType = this.queryParams.userType;
+                // }
 
                 const response = await listUser(params);
 
@@ -696,6 +706,7 @@ export default {
     min-height: 500px;
     border: 1px solid #e4e7ed;
     border-radius: 4px;
+    overflow: hidden; /* 确保内容不会溢出容器 */
 }
 
 .department-panel {
@@ -712,6 +723,7 @@ export default {
     display: flex;
     flex-direction: column;
     padding: 10px;
+    min-height: 0; /* 确保flex子元素可以缩小 */
 }
 
 .user-panel.full-width {
@@ -785,7 +797,8 @@ export default {
     flex: 1;
     display: flex;
     flex-direction: column;
-    overflow: hidden;
+    overflow: auto; /* 允许滚动 */
+    min-height: 0; /* 确保flex子元素可以缩小 */
 }
 
 .pagination-container {

+ 4 - 61
src/views/system/project/index.vue

@@ -2,7 +2,7 @@
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
       <el-form-item label="项目来源" prop="sourceFrom">
-        <el-select v-model="queryParams.sourceFrom" placeholder="请选择项目来源" clearable filterable @change="handleQuery">
+        <el-select v-model="queryParams.sourceFrom" placeholder="请选择项目来源" clearable filterable>
           <el-option
             v-for="item in projectTypeList"
             :key="item.dictCode || item.dictValue || item.value"
@@ -166,8 +166,6 @@ export default {
       total: 0,
       // 项目表格数据
       projectList: [],
-      // 所有项目数据(用于客户端筛选)
-      allProjectList: [],
       // 弹出层标题
       title: "",
       // 是否显示弹出层
@@ -215,65 +213,14 @@ export default {
     /** 查询项目列表 */
     getList() {
       this.loading = true;
-      
-      // 如果已有完整数据且只是筛选sourceFrom或更改分页,则使用客户端筛选
-      if (this.allProjectList.length > 0) {
-        this.filterProjectListBySource();
-        this.loading = false;
-        return;
-      }
-      
-      // 构建请求参数,获取所有数据
-      const params = {
-        pageNum: 1,
-        pageSize: 1000,
-        projectPid: this.queryParams.projectPid,
-        projectName: this.queryParams.projectName,
-        appId: this.queryParams.appId,
-        // 不传sourceFrom,获取所有数据
-      };
-      
-      listProject(params).then(response => {
-        // 存储所有数据
-        this.allProjectList = response.rows || [];
-        
-        // 应用筛选和分页
-        this.filterProjectListBySource();
-        
+      listProject(this.queryParams).then(response => {
+        this.projectList = response.rows || [];
+        this.total = response.total || 0;
         this.loading = false;
       }).catch(() => {
         this.loading = false;
-        this.allProjectList = [];
-        this.projectList = [];
-        this.total = 0;
       });
     },
-    
-    /** 根据sourceFrom筛选项目列表 */
-    filterProjectListBySource() {
-      if (!this.queryParams.sourceFrom) {
-        // 直接使用所有数据,但要处理分页
-        this.applyPaginationToData(this.allProjectList);
-        this.total = this.allProjectList.length;
-        return;
-      }
-      
-      // 在客户端根据sourceFrom筛选
-      const filteredData = this.allProjectList.filter(item => {
-        return item.sourceFrom === this.queryParams.sourceFrom;
-      });
-      
-      // 应用分页
-      this.applyPaginationToData(filteredData);
-      this.total = filteredData.length;
-    },
-    
-    /** 对数据应用分页 */
-    applyPaginationToData(data) {
-      const start = (this.queryParams.pageNum - 1) * this.queryParams.pageSize;
-      const end = start + this.queryParams.pageSize;
-      this.projectList = data.slice(start, end);
-    },
 
     getProjectTypeList() {
       getDicts('project_type').then(response => {
@@ -313,15 +260,11 @@ export default {
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
-      // 搜索时清空缓存数据,确保重新加载
-      this.allProjectList = [];
       this.getList();
     },
     /** 重置按钮操作 */
     resetQuery() {
       this.resetForm("queryForm");
-      // 重置时清空所有数据缓存,确保重新加载
-      this.allProjectList = [];
       this.handleQuery();
     },
     // 多选框选中数据

+ 249 - 132
src/views/system/staff/index.vue

@@ -1,141 +1,160 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="项目来源" prop="sourceFrom">
-        <el-select v-model="queryParams.sourceFrom" placeholder="请选择项目来源" clearable filterable @change="handleQuery">
-          <el-option
-            v-for="item in projectTypeList"
-            :key="item.dictCode || item.dictValue || item.value"
-            :label="item.dictLabel || item.label"
-            :value="item.dictValue || item.value"
+    <el-row :gutter="20">
+      <!--部门数据-->
+      <el-col :span="4" :xs="24" v-if="queryParams.userType === '01'">
+        <div class="head-container">
+          <el-input
+            v-model="deptName"
+            placeholder="请输入部门名称"
+            clearable
+            size="small"
+            prefix-icon="el-icon-search"
+            style="margin-bottom: 20px"
           />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="项目" prop="projectPid">
-        <el-select v-model="queryParams.projectPid"
-                   filterable
-                    clearable
-        >
-          <el-option v-for="itemP in projectList" :key="itemP.projectPid" :label="itemP.projectName"
-            :value="itemP.projectPid" />
-        </el-select>
-      </el-form-item>
-      <el-form-item label="成员" prop="userId">
-        <div class="approver-selector">
-          <div class="approver-input" @click="openQueryUserSelect">
-            <span v-if="selectedQueryUsers.length === 0" class="placeholder">请选择成员</span>
-            <el-tag
-              v-for="(user, index) in selectedQueryUsers"
-              :key="user.userId"
-              closable
-              @close="removeQueryUser(user, index)"
-              style="margin-right: 8px; margin-bottom: 5px"
-            >
-              {{ user.nickName || user.userName }}
-            </el-tag>
-          </div>
         </div>
-      </el-form-item>
-      <!-- <el-form-item label="角色" prop="roleId">
-        <el-select v-model="queryParams.roleId">
-          <el-option v-for="itemR in roleList" :key="itemR.roleId" :label="itemR.roleName" :value="itemR.roleId" />
+        <div class="head-container">
+          <el-tree
+            :data="deptOptions"
+            :props="defaultProps"
+            :expand-on-click-node="false"
+            :filter-node-method="filterNode"
+            ref="tree"
+            node-key="id"
+            highlight-current
+            @node-click="handleNodeClick"
+          >
+            <span slot-scope="{ node }" class="custom-tree-node">
+              <el-tooltip :content="node.label" placement="top" :disabled="!isTextOverflow(node.label)">
+                <span class="tree-node-label">{{ node.label }}</span>
+              </el-tooltip>
+            </span>
+          </el-tree>
+        </div>
+      </el-col>
+      <!--项目成员数据-->
+      <el-col :span="queryParams.userType === '01' ? 20 : 24" :xs="24">
+        <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="用户类型" prop="userType">
+            <el-select
+              v-model="queryParams.userType"
+              placeholder="请选择用户类型"
+              clearable
+              filterable
+            >
+              <el-option
+                v-for="item in userTypeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="项目来源" prop="sourceFrom">
+            <el-select v-model="queryParams.sourceFrom" placeholder="请选择项目来源" clearable filterable>
+              <el-option
+                v-for="item in projectTypeList"
+                :key="item.dictCode || item.dictValue || item.value"
+                :label="item.dictLabel || item.label"
+                :value="item.sourceFrom"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="项目名称" prop="projectPid">
+            <el-select v-model="queryParams.projectPid"
+                       filterable
+                        clearable
+            >
+              <el-option v-for="itemP in projectList" :key="itemP.projectPid" :label="itemP.projectName"
+                :value="itemP.projectPid" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="成员" prop="userId">
+        <el-select v-model="queryParams.userId" filterable clearable>
+          <el-option v-for="itemU in userList" :key="itemU.userId" :label="itemU.userName" :value="itemU.userId" />
         </el-select>
-      </el-form-item> -->
-      <!-- <el-form-item label="进入项目日期" prop="mBdate">
-        <el-date-picker clearable v-model="queryParams.mBdate" type="date" value-format="yyyy-MM-dd"
-          placeholder="请选择进入项目日期">
-        </el-date-picker>
-      </el-form-item>
-      <el-form-item label="撤出项目日期" prop="mEdate">
-        <el-date-picker clearable v-model="queryParams.mEdate" type="date" value-format="yyyy-MM-dd"
-          placeholder="请选择撤出项目日期">
-        </el-date-picker>
-      </el-form-item> -->
-      <el-form-item>
-        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
-        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
-    </el-form>
-
-    <el-row :gutter="10" class="mb8">
-      <!-- <el-col :span="1.5">
-        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
-          v-hasPermi="['system:staff:add']">新增</el-button>
-      </el-col>
-      <el-col :span="1.5">
-        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
-          v-hasPermi="['system:staff:edit']">修改</el-button>
-      </el-col> -->
-      <!-- <el-col :span="1.5">
-        <el-button
-          type="danger"
-          plain
-          icon="el-icon-delete"
-          size="mini"
-          :disabled="multiple"
-          @click="handleDelete"
-          v-hasPermi="['system:staff:remove']"
-        >删除</el-button>
-      </el-col> -->
-      <el-col :span="1.5">
-        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
-          v-hasPermi="['system:staff:export']">导出</el-button>
-      </el-col>
-      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
-    </el-row>
-
-    <el-table v-loading="loading" :data="staffList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="项目编号" align="center" prop="projectPid" />
-      <el-table-column label="项目名称" align="center" prop="projectName" />
-      <el-table-column label="项目来源" align="center" prop="sourceFromName" />
-      <el-table-column label="成员账号" align="center" prop="userName" />
-      <el-table-column label="成员名称" align="center" prop="nickName" />
-      <el-table-column label="成员类型" align="center" prop="userTypeName" />
-      <el-table-column label="系统角色" align="center" prop="roleName" />
-      <el-table-column label="创建日期" align="center" prop="createTime" />
-      <!-- <el-table-column label="进入项目日期" align="center" prop="mBdate" width="180" />
-      <el-table-column label="项目编号" align="center" prop="projectPid" min-width="90" >
-        <template slot-scope="scope">
-          <el-tooltip placement="top" popper-class="pid-tooltip">
-            <div slot="content" class="pid-tooltip-content">{{ scope.row.projectPid }}</div>
-            <span class="pid-ellipsis">{{ scope.row.projectPid }}</span>
-          </el-tooltip>
-        </template>
-      </el-table-column>
-      <el-table-column label="项目名称" align="center" prop="projectName" min-width="320">
-        <template slot-scope="scope">
-          <el-tooltip placement="top" popper-class="pid-tooltip">
-            <div slot="content" class="pid-tooltip-content">{{ scope.row.projectName }}</div>
-            <span class="name-ellipsis">{{ scope.row.projectName }}</span>
-          </el-tooltip>
-        </template>
-      </el-table-column>
-      <el-table-column label="用户名称" align="center" prop="userName" /> -->
-      <!-- <el-table-column label="角色" align="center" prop="roleName" /> -->
-      <el-table-column label="进入项目日期" align="center" prop="mBdate" width="180">
+          <!-- <el-form-item label="角色" prop="roleId">
+            <el-select v-model="queryParams.roleId">
+              <el-option v-for="itemR in roleList" :key="itemR.roleId" :label="itemR.roleName" :value="itemR.roleId" />
+            </el-select>
+          </el-form-item> -->
+          <!-- <el-form-item label="进入项目日期" prop="mBdate">
+            <el-date-picker clearable v-model="queryParams.mBdate" type="date" value-format="yyyy-MM-dd"
+              placeholder="请选择进入项目日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="撤出项目日期" prop="mEdate">
+            <el-date-picker clearable v-model="queryParams.mEdate" type="date" value-format="yyyy-MM-dd"
+              placeholder="请选择撤出项目日期">
+            </el-date-picker>
+          </el-form-item> -->
+          <el-form-item>
+            <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+          </el-form-item>
+        </el-form>
+
+        <el-row :gutter="10" class="mb8">
+          <!-- <el-col :span="1.5">
+            <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+              v-hasPermi="['system:staff:add']">新增</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
+              v-hasPermi="['system:staff:edit']">修改</el-button>
+          </el-col> -->
+          <!-- <el-col :span="1.5">
+            <el-button
+              type="danger"
+              plain
+              icon="el-icon-delete"
+              size="mini"
+              :disabled="multiple"
+              @click="handleDelete"
+              v-hasPermi="['system:staff:remove']"
+            >删除</el-button>
+          </el-col> -->
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+              v-hasPermi="['system:staff:export']">导出</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+
+        <el-table v-loading="loading" :data="staffList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" fixed="left" />
+      <el-table-column label="项目编号" align="center" prop="projectPid" width="100" fixed="left" show-overflow-tooltip />
+      <el-table-column label="项目名称" align="center" prop="projectName" fixed="left" width="200" show-overflow-tooltip />
+      <el-table-column label="项目来源" align="center" prop="sourceFromName" width="100" show-overflow-tooltip />
+      <el-table-column label="成员账号" align="center" prop="userName" width="100" show-overflow-tooltip />
+      <el-table-column label="成员名称" align="center" prop="nickName" width="100" show-overflow-tooltip />
+      <el-table-column label="成员类型" align="center" prop="userTypeName" width="100" show-overflow-tooltip />
+      <el-table-column label="系统角色" align="center" prop="roleName" width="100" show-overflow-tooltip />
+      <el-table-column label="创建日期" align="center" prop="createTime" width="150" show-overflow-tooltip />
+      <el-table-column label="进入项目日期" align="center" prop="mBdate" width="150" show-overflow-tooltip>
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.mBdate, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
-      <el-table-column label="撤出项目日期" align="center" prop="mEdate" width="180">
+      <el-table-column label="撤出项目日期" align="center" prop="mEdate" width="150" show-overflow-tooltip>
         <template slot-scope="scope">
           <span>{{ parseTime(scope.row.mEdate, '{y}-{m}-{d}') }}</span>
         </template>
       </el-table-column>
 
-      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
-        <template slot-scope="scope">
-          <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
-            v-hasPermi="['system:staff:edit']">修改</el-button> -->
-          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
-            v-hasPermi="['system:staff:remove']">删除</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
+            <template slot-scope="scope">
+              <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                v-hasPermi="['system:staff:edit']">修改</el-button> -->
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                v-hasPermi="['system:staff:remove']">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
 
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
-      @pagination="getList" />
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
 
     <!-- 添加或修改项目成员对话框 -->
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -176,7 +195,7 @@
         <el-form-item label="进入项目日期" prop="mBdate">
           <el-date-picker clearable v-model="form.mBdate" type="date" value-format="yyyy-MM-dd" placeholder="请选择进入项目日期">
           </el-date-picker>
-        </el-form-item> -->
+        </el-form-item>
         <el-form-item label="撤出项目日期" prop="mEdate">
           <el-date-picker clearable v-model="form.mEdate" type="date" value-format="yyyy-MM-dd" placeholder="请选择撤出项目日期">
           </el-date-picker>
@@ -219,19 +238,22 @@
       @confirm="handleUserSelectConfirm"
     />
 
-    <!-- 查询表单用户选择组件 -->
-    <user-select
-      :visible.sync="showQueryUserSelectDialog"
-      title="查询成员"
-      select-mode="single"
-      @confirm="handleQueryUserSelectConfirm"
-    />
+        <!-- 查询表单用户选择组件 -->
+        <user-select
+          :visible.sync="showQueryUserSelectDialog"
+          title="查询成员"
+          select-mode="single"
+          @confirm="handleQueryUserSelectConfirm"
+        />
+      </el-col>
+    </el-row>
   </div>
 </template>
 
 <script>
 import { listStaff, getStaff, delStaff, addStaff, updateStaff, projectList, userList, roleList } from "@/api/system/staff";
 import { getDicts } from "@/api/system/dict/data";
+import { deptTreeSelect } from "@/api/system/user";
 import UserSelect from "@/components/UserSelect";
 
 export default {
@@ -241,6 +263,15 @@ export default {
   },
   data() {
     return {
+      // 部门名称
+      deptName: undefined,
+      // 部门树选项
+      deptOptions: undefined,
+      // 树形结构属性
+      defaultProps: {
+        children: "children",
+        label: "label"
+      },
       // 遮罩层
       loading: true,
       // 选中数组
@@ -269,16 +300,25 @@ export default {
         roleId: null,
         mBdate: null,
         mEdate: null,
+        deptId: null,
+        userType: null,
       },
       queryUserParams: {
         pageNum: 1,
-        pageSize: 10,
+        pageSize: 1000,
         username: null
       },
       projectList: [],
       projectTypeList: [],
       userList: [],
       roleList: [],
+      // 用户类型选项
+      userTypeOptions: [
+        { value: '00', label: '系统用户' },
+        { value: '03', label: '慧项管第三方用户' },
+        { value: '02', label: '慧监理第三方用户' },
+        { value: '01', label: '建科用户' }
+      ],
       // 表单参数
       form: {
       },
@@ -302,14 +342,50 @@ export default {
       selectedQueryUsers: [], // 查询表单中选中的用户列表
     };
   },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      if (this.$refs.tree) {
+        this.$refs.tree.filter(val);
+      }
+    },
+    // 监听用户类型变化
+    'queryParams.userType'(newVal) {
+      // 如果用户类型不是建科用户,清空部门筛选
+      if (newVal !== '01') {
+        this.queryParams.deptId = null;
+        this.deptName = undefined;
+        if (this.$refs.tree) {
+          this.$refs.tree.setCurrentKey(null);
+        }
+      }
+    }
+  },
   created() {
     this.getList();
     this.getProjectList();
     this.getProjectTypeList();
     this.getUserList();
     this.getRoleList();
+    this.getDeptTree();
   },
   methods: {
+    /** 查询部门下拉树结构 */
+    getDeptTree() {
+      deptTreeSelect().then(response => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.handleQuery();
+    },
 
     handleFocusUserInput() {
       this.showUserDialog = true;
@@ -389,6 +465,15 @@ export default {
     /** 重置按钮操作 */
     resetQuery() {
       this.selectedQueryUsers = []; // 清空查询表单中选中的用户
+      this.queryParams.deptId = undefined;
+      this.queryParams.sourceFrom = null;
+      this.queryParams.projectPid = null;
+      this.queryParams.userId = null;
+      this.queryParams.userType = null;
+      this.deptName = undefined;
+      if (this.$refs.tree) {
+        this.$refs.tree.setCurrentKey(null);
+      }
       this.resetForm("queryForm");
       this.handleQuery();
     },
@@ -487,7 +572,16 @@ export default {
     /** 获取项目来源列表 */
     getProjectTypeList() {
       getDicts('project_type').then(response => {
-        this.projectTypeList = response.data || [];
+        this.projectTypeList = (response.data || []).map(item => {
+          // 为特定项目类型添加sourceFrom属性
+          if (item.dictLabel === "慧监理") {
+            return { ...item, sourceFrom: "a34851c530ee0d07d1154beb47bb93dd" };
+          } else if (item.dictLabel === "慧项管") {
+            return { ...item, sourceFrom: "f47ac10b58cc4372a5670e06f141669d" };
+          }
+          return item;
+        });
+        console.log(this.projectTypeList, 'this.projectTypeList');
       }).catch(() => {
         this.projectTypeList = [];
       });
@@ -545,6 +639,13 @@ export default {
       this.selectedQueryUsers.splice(index, 1);
       this.queryParams.userId = null;
     },
+
+    // 判断文本是否超出容器宽度
+    isTextOverflow(text) {
+      // 简单判断:如果文本长度超过10个字符,则认为可能溢出
+      // 可以根据实际情况调整这个阈值
+      return text && text.length > 10;
+    }
   }
 };
 </script>
@@ -580,6 +681,22 @@ export default {
   color: #C0C4CC;
   font-size: 14px;
 }
+
+/* 树节点样式 */
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+}
+
+.tree-node-label {
+  display: inline-block;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
 </style>
 
 <style>

+ 36 - 5
src/views/system/user/index.vue

@@ -23,7 +23,13 @@
             node-key="id"
             highlight-current
             @node-click="handleNodeClick"
-          />
+          >
+            <span slot-scope="{ node }" class="custom-tree-node">
+              <el-tooltip :content="node.label" placement="top" :disabled="!isTextOverflow(node.label)">
+                <span class="tree-node-label">{{ node.label }}</span>
+              </el-tooltip>
+            </span>
+          </el-tree>
         </div>
       </el-col>
       <!--用户数据-->
@@ -405,10 +411,10 @@ export default {
       roleOptions: [],
       // 用户类型选项
       userTypeOptions: [
-        { value: '1', label: '系统用户' },
-        { value: '2', label: '慧项管第三方用户' },
-        { value: '3', label: '慧监理第三方用户' },
-        { value: '4', label: '建科用户' }
+        { value: '00', label: '系统用户' },
+        { value: '03', label: '慧项管第三方用户' },
+        { value: '02', label: '慧监理第三方用户' },
+        { value: '01', label: '建科用户' }
       ],
       // 表单参数
       form: {},
@@ -683,7 +689,32 @@ export default {
     // 提交上传文件
     submitFileForm() {
       this.$refs.upload.submit();
+    },
+
+    // 判断文本是否超出容器宽度
+    isTextOverflow(text) {
+      // 简单判断:如果文本长度超过10个字符,则认为可能溢出
+      // 可以根据实际情况调整这个阈值
+      return text && text.length > 10;
     }
   }
 };
 </script>
+
+<style scoped>
+/* 树节点样式 */
+.custom-tree-node {
+  flex: 1;
+  display: flex;
+  align-items: center;
+  overflow: hidden;
+}
+
+.tree-node-label {
+  display: inline-block;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+</style>