warrior 7 месяцев назад
Родитель
Сommit
a6ab456553

+ 28 - 15
projects/textbook/src/modules/nav-admin/page-role/page-role.component.html

@@ -42,7 +42,7 @@
           nz-dropdown
           [nzDropdownMenu]="menutep"
           [nzPlacement]="'bottomLeft'"
-          style="margin-left: 0px; width: 220px;"
+          style="margin-left: 0px; width: 280px;"
         >
           <span nz-icon nzType="plus" nzTheme="outline"></span>新建
         </button>
@@ -78,6 +78,7 @@
         {{ profiles.length }}人
       </div>
       <label nz-checkbox [(ngModel)]="checkedShowFilter"
+      (ngModelChange)="onChecked()"
         >仅显示部门直属成员</label
       >
     </div>
@@ -89,6 +90,7 @@
   </div>
   <div class="layout" #maxWidth>
     <div class="sider" #sider>
+      @if(nodes.length > 0){
       <nz-tree
         [nzData]="nodes"
         nzAsyncData
@@ -97,7 +99,14 @@
         (nzExpandChange)="nzEvent($event)"
         (nzSearchValueChange)="onSearch($event)"
         [nzTreeTemplate]="nzTreeTemplate"
+        [nzExpandedKeys]="nzExpandedKeys"
       ></nz-tree>
+      }@else {
+        <div class="loading">
+          <nz-spin nzSimple></nz-spin>
+          <div class="tips">节点加载中</div>
+        </div>
+      }
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span
           class="custom-node"
@@ -129,24 +138,28 @@
       <nz-table
         #tableData
         [nzData]="profiles"
-        [nzTotal]="profiles.length"
-        [nzPageSize]="10"
+        [nzTotal]="profileLength"
+        [nzPageSize]="pageSize"
+        [nzPageIndex]="pageIndex"
         style="margin: 10px 0"
         [nzLoading]="loading"
         nzSize="middle"
         [nzNoResult]="emptyResult"
+        [nzFrontPagination]="false"
+        nzTableLayout="fixed"
+        (nzPageIndexChange)="pageIndexChange($event)"
       >
         <thead>
           <tr>
             <th
-              nzWidth="120px"
+              nzWidth="50px"
               nzLeft
               [nzChecked]="checkedAll"
               [nzIndeterminate]="indeterminate"
               nzLabel="Select all"
               (nzCheckedChange)="onAllChecked($event)"
             ></th>
-            <th nzWidth="120px" nzLeft>用户</th>
+            <th nzWidth="120px">用户</th>
             <th nzWidth="120px">手机号</th>
             <th nzWidth="120px">邮箱</th>
             <th nzWidth="120px">人员类型</th>
@@ -157,7 +170,7 @@
         <tbody>
           @for (data of profiles; track data.id) {
           <tr>
-            <td
+            <td nzEllipsis
               nzLeft
               [nzChecked]="setOfCheckedId.has(data.id)"
               (nzCheckedChange)="onItemChecked(data.id, $event)"
@@ -169,21 +182,21 @@
               class="activeTd"
             >
               <nz-avatar nzIcon="user"></nz-avatar>
-              {{ data?.get("user")?.get("name") }}
+              {{ data?.get("user")?.get("name") || '-'}}
             </td>
-            <td>
-              {{ data?.get("user")?.get("phone") }}
+            <td nzEllipsis>
+              {{ data?.get("user")?.get("phone") || '-' }}
             </td>
-            <td>
-              {{ data?.get("user")?.get("email") || data?.get("email") }}
+            <td nzEllipsis>
+              {{ data?.get("user")?.get("email") || data?.get("email") || '-'}}
             </td>
-            <td>
+            <td nzEllipsis>
               {{ data?.get("identity") }}
             </td>
-            <td>
-              {{ data?.get("user").get("departmentName") }}
+            <td nzEllipsis>
+              {{ data?.get("user").get("departmentName") || '-' }}
             </td>
-            <td nzRight>
+            <td nzEllipsis nzRight>
               <button
                 nz-button
                 nz-dropdown

+ 11 - 1
projects/textbook/src/modules/nav-admin/page-role/page-role.component.scss

@@ -12,7 +12,7 @@
   margin: 0 0 20px;
   padding: 0 24px;
   height: calc(100vh - 192px);
-  min-width: 1100px;
+  min-width: 800px;
   .tool{
     display: flex;
     justify-content: space-between;
@@ -61,6 +61,16 @@
       .custom-name:hover .folder-desc{
         display: block;
       }
+      .loading{
+        display: flex;
+        flex-direction: column;
+        justify-content: center;
+        align-items: center;
+        .tips{
+          color: #6f6f6f;
+          font-size: 14px;
+        }
+      }
     }
     .breadcrumb{
       flex: 1;

+ 36 - 11
projects/textbook/src/modules/nav-admin/page-role/page-role.component.ts

@@ -26,6 +26,7 @@ import { NzRadioModule } from 'ng-zorro-antd/radio';
 import { NzMessageService } from 'ng-zorro-antd/message';
 import { NzSelectModule } from 'ng-zorro-antd/select';
 import { textbookServer } from '../../../services/textbook';
+import { NzSpinModule } from 'ng-zorro-antd/spin';
 interface nodes {
   title: string;
   key: string;
@@ -59,6 +60,7 @@ interface depart {
     NzModalModule,
     NzRadioModule,
     NzSelectModule,
+    NzSpinModule
   ],
   standalone: true,
 })
@@ -82,6 +84,9 @@ export class PageRoleComponent implements OnInit {
   checkedAll: boolean = false; //全选
   indeterminate = false;
   loading = false;
+  pageSize: number = 10;
+  pageIndex: number = 1;
+  profileLength:number = 0
 
   isVisible: boolean = false;
   activatedNode: NzTreeNode | any; //当前选择节点
@@ -111,6 +116,7 @@ export class PageRoleComponent implements OnInit {
   };
   userType: Array<string> = ['工作联系人', '评审专家', '高校联系人', '个人'];
   parents: Array<any> = []; //所有一级列表
+  nzExpandedKeys:any = [] //默认展开节点数
 
   constructor(
     private route: Router,
@@ -130,11 +136,17 @@ export class PageRoleComponent implements OnInit {
       },
     };
   }
-
   ngOnInit(): void {
     this.activeRoute.paramMap.subscribe(async (params) => {
-      this.nodes = await this.getDepart();
-      this.parents = await this.getDepart();
+      let nodes:Array<any> = await this.getDepart();
+      this.parents = [...nodes]
+      Promise.all(nodes.map(async (item,index)=>{
+        nodes[index].children = await this.getDepart(item.key);
+        // nodes[index]['isExpanded'] = true
+        this.nzExpandedKeys.push(nodes[index]?.key)
+      })).then(()=>{
+        this.nodes = nodes
+      })
     });
   }
   async getDepart(
@@ -162,7 +174,7 @@ export class PageRoleComponent implements OnInit {
         branch: item.get('branch'),
         parent: item.get('parent')?.id, //上级
         isLeaf: !item.get('hasChildren'), //是否是最下级
-        type: item.get('type'),
+        type: item.get('type')
       });
     });
     return nodes;
@@ -199,6 +211,10 @@ export class PageRoleComponent implements OnInit {
   async getProfile() {
     this.profiles = [];
     this.loading = true;
+    let childrens = [this.currentDepart.key]
+    if(!this.checkedShowFilter){
+      childrens = await this.tbookSer.getChild(this.currentDepart.key)
+    }
     let queryParams = {
       where: {
         $or: [
@@ -208,7 +224,7 @@ export class PageRoleComponent implements OnInit {
                 where: {
                   $or: [
                     {
-                      department: { $eq: this.currentDepart.key },
+                      department: { $in: [childrens] },
                     },
                   ],
                 },
@@ -223,18 +239,27 @@ export class PageRoleComponent implements OnInit {
     query.include('user');
     query.notEqualTo('identity', '国家级管理员');
     query.notEqualTo('isDeleted', true);
+    this.profileLength = await query.count()
+    query.limit(this.pageSize)
+    query.skip((this.pageIndex - 1) * this.pageSize)
     let r = await query.find();
-    // let profiles: any[] = [];
-    // r.forEach((item) => {
-    //   let _item = item.toJSON();
-    //   _item['checked'] = false;
-    //   profiles.push(_item);
-    // });
     this.profiles = r;
     this.loading = false;
+    this.resetChange()
+  }
+  //分页切换
+  pageIndexChange(e: any) {
+    console.log(e);
+    this.pageIndex = e;
+    this.getProfile();
+  }
+  onChecked(){
+    this.pageIndex = 1;
+    this.getProfile()
   }
   //搜索触发
   onSearch(event: NzFormatEmitEvent) {
+    this.pageIndex = 1;
     console.log(event);
   }
   contextMenu(

+ 27 - 15
projects/textbook/src/modules/nav-province-contact/page-role/page-role.component.html

@@ -77,6 +77,7 @@
         {{ profiles.length }}人
       </div>
       <label nz-checkbox [(ngModel)]="checkedShowFilter"
+      (ngModelChange)="onChecked()"
         >仅显示部门直属成员</label
       >
     </div>
@@ -88,6 +89,7 @@
   </div>
   <div class="layout" #maxWidth>
     <div class="sider" #sider>
+      @if(nodes.length > 0){
       <nz-tree
         [nzData]="nodes"
         nzAsyncData
@@ -96,7 +98,14 @@
         (nzExpandChange)="nzEvent($event)"
         (nzSearchValueChange)="onSearch($event)"
         [nzTreeTemplate]="nzTreeTemplate"
+        [nzExpandedKeys]="[nodes[0].key]"
       ></nz-tree>
+      }@else {
+      <div class="loading">
+        <nz-spin nzSimple></nz-spin>
+        <div class="tips">节点加载中</div>
+      </div>
+      }
       <ng-template #nzTreeTemplate let-node let-origin="origin">
         <span
           class="custom-node"
@@ -120,12 +129,16 @@
       <nz-table
         #tableData
         [nzData]="profiles"
-        [nzTotal]="profiles.length"
-        [nzPageSize]="10"
+        [nzTotal]="profileLength"
+        [nzPageSize]="pageSize"
+        [nzPageIndex]="pageIndex"
         style="margin: 10px 0"
         [nzLoading]="loading"
         nzSize="middle"
         [nzNoResult]="emptyResult"
+        [nzFrontPagination]="false"
+        nzTableLayout="fixed"
+        (nzPageIndexChange)="pageIndexChange($event)"
       >
         <thead>
           <tr>
@@ -153,27 +166,26 @@
               [nzChecked]="data.checked"
               (nzCheckedChange)="onItemChecked(data.objectId, $event)"
             ></td> -->
-            <td
-              nzEllipsis
-              (click)="goDateil(data.user?.objectId)"
+            <td nzEllipsis
+              (click)="goDateil(data.get('user')?.id)"
               class="activeTd"
             >
               <nz-avatar nzIcon="user"></nz-avatar>
-              {{ data?.user.name || '-'}}
+              {{ data?.get("user")?.get("name") || '-'}}
             </td>
-            <td>
-              {{ data?.user.phone || '-'}}
+            <td nzEllipsis>
+              {{ data?.get("user")?.get("phone") || '-' }}
             </td>
-            <td>
-              {{ data?.user.email || data?.email || '-'}}
+            <td nzEllipsis>
+              {{ data?.get("user")?.get("email") || data?.get("email") || '-'}}
             </td>
-            <td>
-              {{ data?.identity || '-'}}
+            <td nzEllipsis>
+              {{ data?.get("identity") }}
             </td>
-            <td>
-              {{ data?.user.departmentName || '-' }}
+            <td nzEllipsis>
+              {{ data?.get("user").get("departmentName") || '-' }}
             </td>
-            <!-- <td nzRight>
+            <!-- <td nzEllipsis nzRight>
               @if(data?.user?.objectId == user?.id || data?.identity ==
               '工作联系人' || data?.identity == '高校联系人'){ - } @else {
               <button

+ 10 - 0
projects/textbook/src/modules/nav-province-contact/page-role/page-role.component.scss

@@ -65,6 +65,16 @@
     .breadcrumb{
       flex: 1;
     }
+    .loading{
+      display: flex;
+      flex-direction: column;
+      justify-content: center;
+      align-items: center;
+      .tips{
+        color: #6f6f6f;
+        font-size: 14px;
+      }
+    }
   }
   .activeTd{
     cursor: pointer;

+ 40 - 10
projects/textbook/src/modules/nav-province-contact/page-role/page-role.component.ts

@@ -26,6 +26,8 @@ import { NzRadioModule } from 'ng-zorro-antd/radio';
 import { NzMessageService } from 'ng-zorro-antd/message';
 import { textbookServer } from '../../../services/textbook';
 import { NzSelectModule } from 'ng-zorro-antd/select';
+import { NzSpinModule } from 'ng-zorro-antd/spin';
+
 interface nodes {
   title: string;
   key: string;
@@ -58,7 +60,7 @@ interface depart {
     NzEmptyModule,
     NzModalModule,
     NzRadioModule,
-    NzSelectModule,
+    NzSelectModule,NzSpinModule
   ],
   standalone: true,
 })
@@ -81,6 +83,9 @@ export class PageRoleComponent implements OnInit {
   checkedAll: boolean = false; //全选
   indeterminate = false;
   loading = false;
+  pageSize: number = 10;
+  pageIndex: number = 1;
+  profileLength:number = 0
 
   isVisible: boolean = false;
   activatedNode: NzTreeNode | any; //当前选择节点
@@ -145,7 +150,7 @@ export class PageRoleComponent implements OnInit {
     query.equalTo('objectId', this.tbookSer.profile.user.department?.objectId);
     query.select('code', 'name', 'branch', 'parent', 'type', 'hasChildren');
     let r = await query.first();
-    this.nodes = [
+    let n = [
       {
         title: this.tbookSer.profile.user.department.name,
         key: this.tbookSer.profile.user.department?.objectId,
@@ -161,6 +166,7 @@ export class PageRoleComponent implements OnInit {
         type: r?.get('branch'),
       },
     ];
+    this.nodes = n
     let query2 = new Parse.Query('Department');
     query2.select('name');
     query2.equalTo('parent', null);
@@ -247,6 +253,10 @@ export class PageRoleComponent implements OnInit {
   async getProfile() {
     this.profiles = [];
     this.loading = true;
+    let childrens = [this.currentDepart.key]
+    if(!this.checkedShowFilter){
+      childrens = await this.tbookSer.getChild(this.currentDepart.key)
+    }
     let queryParams = {
       where: {
         $or: [
@@ -256,7 +266,7 @@ export class PageRoleComponent implements OnInit {
                 where: {
                   $or: [
                     {
-                      department: { $eq: this.currentDepart.key },
+                      department: { $in: [childrens] },
                     },
                   ],
                 },
@@ -269,17 +279,36 @@ export class PageRoleComponent implements OnInit {
     };
     let query = Parse.Query.fromJSON('Profile', queryParams);
     query.include('user');
+    if(this.tbookSer.profile.identity == '工作联系人'){
+      query.containedIn('identity',['个人','高校联系人','评审专家'])
+    }else if(this.tbookSer.profile.identity == '高校联系人'){
+      query.containedIn('identity',['个人','评审专家'])
+    }
     query.notEqualTo('identity', '国家级管理员');
+    query.notEqualTo('isDeleted', true);
+    this.profileLength = await query.count()
+    query.limit(this.pageSize)
+    query.skip((this.pageIndex - 1) * this.pageSize)
     let r = await query.find();
-    let profiles: any[] = [];
-    r.forEach((item) => {
-      let _item = item.toJSON();
-      _item['checked'] = false;
-      profiles.push(_item);
-    });
-    this.profiles = profiles;
+    // let profiles: any[] = [];
+    // r.forEach((item) => {
+    //   let _item = item.toJSON();
+    //   _item['checked'] = false;
+    //   profiles.push(_item);
+    // });
+    this.profiles = r;
     this.loading = false;
   }
+  //分页切换
+  pageIndexChange(e: any) {
+    console.log(e);
+    this.pageIndex = e;
+    this.getProfile();
+  }
+  onChecked(){
+    this.pageIndex = 1;
+    this.getProfile()
+  }
   //搜索触发
   onSearch(event: NzFormatEmitEvent) {
     console.log(event);
@@ -366,6 +395,7 @@ export class PageRoleComponent implements OnInit {
     console.log(this.parentMap);
     this.editType = type;
     this.isVisible = true;
+    this.resetChange()
   }
   async onPre(data?: any, index?: number) {
     console.log(data);

+ 21 - 1
projects/textbook/src/services/textbook.ts

@@ -9,7 +9,7 @@ export class textbookServer {
   company: string = localStorage.getItem('company')!;
   theme: boolean = false; //深色主题模式
   profile: any = JSON.parse(localStorage.getItem('profile')!);
-  constructor(private http: HttpClient) {}
+  constructor() {}
   authMobile(mobile: string): boolean {
     let a = /^1[3456789]\d{9}$/;
     if (!String(mobile).match(a)) {
@@ -71,4 +71,24 @@ export class textbookServer {
     }
     return arr;
   }
+  //获取下级所有部门
+  async getChild(id:string):Promise<Array<string>>{
+    console.log(id);
+    let arr:Array<string> = [id]
+    let query = new Parse.Query('Department')
+    query.equalTo('parent',id)
+    query.notEqualTo('isDeleted',true)
+    query.select('id','hasChildren')
+    query.limit(200)
+    let r = await query.find()
+    for (let index = 0; index < r.length; index++) {
+      if(r[index].get('hasChildren')){
+        let child:Array<string> = await this.getChild(r[index].id)
+        arr.push(...child)
+      }else{
+        arr.push(r[index].id)
+      }
+    }
+    return Array.from(new Set([...arr]))
+  }
 }