warrior 2 days ago
parent
commit
cd71efaa5d

+ 104 - 33
projects/live-app/src/modules/tabs/notice/notice.component.html

@@ -1,10 +1,19 @@
-<ion-header [translucent]="true" [ngClass]="{
-  'header': true,
-  'pad-top-ios': deviceSer.isIOS
-}">
+<ion-header
+  [translucent]="true"
+  [ngClass]="{
+    header: true,
+    'pad-top-ios': deviceSer.isIOS
+  }"
+>
   <div class="top">
     <div class="more"></div>
-    <ion-segment [scrollable]="true" (ionChange)="segmentChanged($event)" layout="icon-bottom" value="notice" mode="md">
+    <ion-segment
+      [scrollable]="true"
+      (ionChange)="segmentChanged($event)"
+      layout="icon-bottom"
+      value="notice"
+      mode="md"
+    >
       <ion-segment-button value="notice" class="tabs" content-id="notice">
         <ion-label>消息</ion-label>
       </ion-segment-button>
@@ -13,16 +22,31 @@
       </ion-segment-button>
     </ion-segment>
     <div class="more">
-      <ion-button id="click-trigger"><ion-icon name="ellipsis-horizontal-outline"></ion-icon></ion-button>
+      <ion-button id="click-trigger"
+        ><ion-icon name="ellipsis-horizontal-outline"></ion-icon
+      ></ion-button>
     </div>
   </div>
 </ion-header>
 <ion-content class="content">
-  <ion-searchbar animated="true" placeholder="搜索"></ion-searchbar>
-  <ion-popover trigger="click-trigger" [dismissOnSelect]="true" triggerAction="click">
+  @if (active == 'friends') {
+  <ion-searchbar
+    animated="true"
+    [(ngModel)]="value"
+    (keyup.enter)="toSearch()"
+    placeholder="搜索"
+  ></ion-searchbar>
+  }
+  <ion-popover
+    trigger="click-trigger"
+    [dismissOnSelect]="true"
+    triggerAction="click"
+  >
     <ng-template>
       <ion-list>
-        <ion-item class="clear" [button]="true" [detail]="false">已读所有消息</ion-item>
+        <ion-item class="clear" [button]="true" [detail]="false"
+          >已读所有消息</ion-item
+        >
       </ion-list>
     </ng-template>
   </ion-popover>
@@ -31,7 +55,12 @@
       <div class="notice-list" (touchmove)="onMousemove($event)">
         <ion-list>
           <ion-item class="li" (click)="toUrl('/account/noticelog')">
-            <img src="img/notice.png" class="avatar" slot="start" alt="avatar" />
+            <img
+              src="img/notice.png"
+              class="avatar"
+              slot="start"
+              alt="avatar"
+            />
             <div class="li-right">
               <div class="name">
                 系统消息
@@ -39,33 +68,52 @@
               </div>
               <!-- <div class="message-content">{{ "暂无" }}</div> -->
             </div>
-            <ion-icon style="color: #afafaf" name="chevron-forward-outline"></ion-icon>
+            <ion-icon
+              style="color: #afafaf"
+              name="chevron-forward-outline"
+            ></ion-icon>
           </ion-item>
           <ion-item class="li" (click)="toUrl('/user/giftlog')">
             <img src="img/礼物.png" class="avatar" slot="start" alt="avatar" />
             <div class="li-right">
-              <div class="name">
-                送礼记录
-              </div>
+              <div class="name">送礼记录</div>
             </div>
-            <ion-icon style="color: #afafaf" name="chevron-forward-outline"></ion-icon>
+            <ion-icon
+              style="color: #afafaf"
+              name="chevron-forward-outline"
+            ></ion-icon>
           </ion-item>
           <ion-item class="li" (click)="toUrl('/live/call-log')">
-            <img src="img/通话记录.png" class="avatar" slot="start" alt="avatar" />
+            <img
+              src="img/通话记录.png"
+              class="avatar"
+              slot="start"
+              alt="avatar"
+            />
             <div class="li-right">
               <div class="name">通话记录</div>
               <div class="message-content"></div>
             </div>
-            <ion-icon style="color: #afafaf" name="chevron-forward-outline"></ion-icon>
+            <ion-icon
+              style="color: #afafaf"
+              name="chevron-forward-outline"
+            ></ion-icon>
           </ion-item>
-          <ion-item class="li" (click)="toUrl('/live/chat')">
-            <img src="img/亲密度.png" class="avatar" slot="start" alt="avatar" />
-
+          <ion-item class="li" (click)="toUrl('/user/relation')">
+            <img
+              src="img/亲密度.png"
+              class="avatar"
+              slot="start"
+              alt="avatar"
+            />
             <div class="li-right">
               <div class="name">亲密度</div>
               <div class="message-content"></div>
             </div>
-            <ion-icon style="color: #afafaf" name="chevron-forward-outline"></ion-icon>
+            <ion-icon
+              style="color: #afafaf"
+              name="chevron-forward-outline"
+            ></ion-icon>
           </ion-item>
           <ion-item class="li" (click)="toUrl('/user/service')">
             <img src="img/客服.png" class="avatar" slot="start" alt="avatar" />
@@ -73,10 +121,18 @@
               <div class="name">小客服</div>
               <div class="message-content"></div>
             </div>
-            <ion-icon style="color: #afafaf" name="chevron-forward-outline"></ion-icon>
+            <ion-icon
+              style="color: #afafaf"
+              name="chevron-forward-outline"
+            ></ion-icon>
           </ion-item>
           <ion-item class="li" (click)="toUrl('/live/chat/global_room')">
-            <img src="img/世界频道.png" class="avatar" slot="start" alt="avatar" />
+            <img
+              src="img/世界频道.png"
+              class="avatar"
+              slot="start"
+              alt="avatar"
+            />
             <div class="li-right">
               <div class="name">
                 世界频道
@@ -91,8 +147,12 @@
           </ion-item>
 
           @for (item of friends; track $index) {
-          <ion-item class="li" (click)="toUrl('/live/chat/' + item.channel)" (touchstart)="startPress(item)"
-            (mousemove)="stopPress()">
+          <ion-item
+            class="li"
+            (click)="toUrl('/live/chat/' + item.channel)"
+            (touchstart)="startPress(item)"
+            (mousemove)="stopPress()"
+          >
             <img [src]="item.avatar" class="avatar" slot="start" alt="avatar" />
             <div class="li-right">
               <div class="name">
@@ -101,8 +161,8 @@
               </div>
               <div class="message-content">
                 {{
-                msgServe.messageMapList[item.channel]?.slice(-1)[0]
-                ?.content || "暂无"
+                  msgServe.messageMapList[item.channel]?.slice(-1)[0]
+                    ?.content || "暂无"
                 }}
               </div>
             </div>
@@ -121,7 +181,7 @@
             </ion-avatar>
             <ion-label>{{
               item.nickname || item.name || "用户" + item.uid
-              }}</ion-label>
+            }}</ion-label>
           </ion-item>
           }
         </ion-list>
@@ -129,10 +189,21 @@
     </ion-segment-content>
   </ion-segment-view>
 </ion-content>
-<ion-alert [backdropDismiss]="false" [isOpen]="showModal" trigger="present-alert" header="删除与ta的聊天记录"
-  [buttons]="alertButtons"></ion-alert>
-<ion-modal #modal trigger="open-modal" [isOpen]="isOpen" (didDismiss)="isOpen = false" [initialBreakpoint]="1"
-  [breakpoints]="[0, 1]">
+<ion-alert
+  [backdropDismiss]="false"
+  [isOpen]="showModal"
+  trigger="present-alert"
+  header="删除与ta的聊天记录"
+  [buttons]="alertButtons"
+></ion-alert>
+<ion-modal
+  #modal
+  trigger="open-modal"
+  [isOpen]="isOpen"
+  (didDismiss)="isOpen = false"
+  [initialBreakpoint]="1"
+  [breakpoints]="[0, 1]"
+>
   <ng-template>
     <ion-toolbar>
       <ion-buttons slot="start">
@@ -146,4 +217,4 @@
       <img [src]="codeUrl" alt="" />
     </div>
   </ng-template>
-</ion-modal>
+</ion-modal>

+ 11 - 1
projects/live-app/src/modules/tabs/notice/notice.component.ts

@@ -8,12 +8,13 @@ import { MessageService } from '../../../services/message.service';
 import { ionicStandaloneModules } from '../../ionic-standalone.modules';
 import { DeviceService } from '../../../services/device.service';
 import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
 @Component({
   selector: 'app-notice',
   templateUrl: './notice.component.html',
   styleUrls: ['./notice.component.scss'],
   standalone: true,
-  imports: [SharedModule, ...ionicStandaloneModules, CommonModule],
+  imports: [SharedModule, ...ionicStandaloneModules, CommonModule,FormsModule],
 })
 export class NoticeComponent implements OnInit {
   active: string = 'notice';
@@ -163,4 +164,13 @@ export class NoticeComponent implements OnInit {
       };
     });
   }
+
+  value: string = '';
+  async toSearch() {
+    this.friends = []
+    let uid: any = Parse.User.current()?.id;
+    let resultFriends = await this.aiSer.getFriends(uid,this.value);
+    console.log(resultFriends);
+    this.friends = resultFriends['data'];
+  }
 }

+ 23 - 3
projects/live-app/src/modules/user/ranking/ranking.component.html

@@ -1,5 +1,20 @@
 <nav title="排名"></nav>
-<ion-content class="content"> 
+<ion-content class="content">
+  <ion-segment
+    [scrollable]="true"
+    (ionChange)="segmentChanged($event)"
+    layout="icon-bottom"
+    value="anchor"
+    mode="md"
+  >
+    <ion-segment-button value="anchor" class="tabs" content-id="anchor">
+      <ion-label>主播排行</ion-label>
+    </ion-segment-button>
+    <ion-segment-button value="user" class="tabs" content-id="user">
+      <ion-label>用户排行</ion-label>
+    </ion-segment-button>
+  </ion-segment>
+
   <div class="order" [style.background-image]="'url(img/用户榜底.png)'">
     <div class="ladder">
       <div class="top-block">
@@ -21,7 +36,12 @@
         <div class="top1">
           <div class="user-block">
             <div class="user-avatar">
-              <img src="img/1.png" alt="" class="tag" style="transform: rotate(90deg);" />
+              <img
+                src="img/1.png"
+                alt=""
+                class="tag"
+                style="transform: rotate(90deg)"
+              />
               <img [src]="orderList[0]?.avatar" class="avatar" alt="" />
             </div>
             <div class="user-name">
@@ -60,7 +80,7 @@
       <div class="row-right">
         <div class="row-tpis">距离第一名</div>
         <div class="row-tpis-num">
-          {{ orderList[0].credit  - item.credit}}
+          {{ orderList[0].credit - item.credit }}
         </div>
       </div>
     </div>

+ 1 - 0
projects/live-app/src/modules/user/ranking/ranking.component.scss

@@ -59,6 +59,7 @@
               .avatar {
                 width: 100%;
                 height: 100%;
+                border-radius: 50%;
               }
             }
           }

+ 12 - 0
projects/live-app/src/modules/user/ranking/ranking.component.ts

@@ -14,6 +14,9 @@ import { AiChatService } from '../../../services/aichart.service';
 export class RankingComponent implements OnInit {
   user?: Parse.Object = Parse.User.current();
   orderList: Array<any> = [];
+
+  active: string = 'anchor';
+  disbable:boolean = true
   constructor(
     private aiServ: AiChatService
   ) {}
@@ -22,4 +25,13 @@ export class RankingComponent implements OnInit {
     this.orderList = await this.aiServ.getOrderAnchor()
     console.log(this.orderList);
   }
+  async segmentChanged(e: any) {
+    let { value } = e.detail;
+    this.active = value;
+    console.log(this.active);
+    // console.log(this.active);
+    // this.orderList = []
+    this.orderList = await this.aiServ.getOrderAnchor(this.active)
+  }
+  
 }

+ 26 - 0
projects/live-app/src/modules/user/relation/relation.component.html

@@ -0,0 +1,26 @@
+<nav title="亲密度"></nav>
+<ion-content class="content">
+  <div class="list">
+    @for (item of list; track $index) {
+    <div class="li">
+      <div class="li-left">
+        <div class="num">{{ $index + 1 }}</div>
+        <div class="user-data">
+          <img class="avatar" [src]="item.avatar" alt="" />
+          <div class="nickname">
+            {{ item.nickname }}
+          </div>
+        </div>
+      </div>
+      <div class="li-right">
+        {{ item.credit }}
+      </div>
+    </div>
+    }
+  </div>
+  @if (disbable) {
+  <ion-infinite-scroll (ionInfinite)="onIonInfinite($event)">
+    <ion-infinite-scroll-content></ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+  }
+</ion-content>

+ 38 - 0
projects/live-app/src/modules/user/relation/relation.component.scss

@@ -0,0 +1,38 @@
+.content {
+  padding-bottom: 12.8205vw;
+  // background-image: url("https://file-cloud.fmode.cn/Qje9D4bqol/20241220/b313ov054708770.png") !important;
+  // background-repeat: no-repeat;
+  // background-position: center top;
+  // background-size: 100% 100%;
+  // --background: #ffffff00;
+}
+.list{
+  .li{
+    display: flex;
+    justify-content: space-between;
+    border-bottom: 0.2564vw solid #f3f3f3;
+    align-items: center;
+    padding:4px 10px;
+    .li-left{
+      display: flex;
+      align-items: center;
+      .num{
+        width: 20px;
+      }
+      .user-data{
+        display: flex;
+        align-items: center;
+        margin-left: 4px;
+        .avatar{
+          width: 10.2564vw;
+          height: 10.2564vw;
+          border-radius: 50%;
+          margin-right: 4px;
+        }
+      }
+    }
+    .li-right{
+      color: #fd4800;
+    }
+  }
+}

+ 28 - 0
projects/live-app/src/modules/user/relation/relation.component.spec.ts

@@ -0,0 +1,28 @@
+/* tslint:disable:no-unused-variable */
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+import { By } from '@angular/platform-browser';
+import { DebugElement } from '@angular/core';
+
+import { RelationComponent } from './relation.component';
+
+describe('RelationComponent', () => {
+  let component: RelationComponent;
+  let fixture: ComponentFixture<RelationComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ RelationComponent ]
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(RelationComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 33 - 0
projects/live-app/src/modules/user/relation/relation.component.ts

@@ -0,0 +1,33 @@
+import { Component, OnInit } from '@angular/core';
+import { InfiniteScrollCustomEvent } from '@ionic/core';
+import { NavComponent } from '../../../app/components/nav/nav.component';
+import { AiChatService } from '../../../services/aichart.service';
+import { ionicStandaloneModules } from '../../ionic-standalone.modules';
+
+@Component({
+  selector: 'app-relation',
+  templateUrl: './relation.component.html',
+  styleUrls: ['./relation.component.scss'],
+  standalone: true,
+  imports: [...ionicStandaloneModules, NavComponent],
+})
+export class RelationComponent implements OnInit {
+  list: Array<any> = [];
+  disbable: boolean = true;
+  constructor(private aiServ: AiChatService) {}
+
+  async ngOnInit() {
+    this.list = await this.aiServ.getRelation(20,this.list.length);
+    console.log(this.list);
+  }
+  async onIonInfinite(ev: any) {
+    let result = await this.aiServ.getRelation(20,this.list.length);
+    if (result.length == 0) {
+      this.disbable = false;
+    }
+    this.list.push(...result)
+    setTimeout(() => {
+      (ev as InfiniteScrollCustomEvent).target.complete();
+    }, 500);
+  }
+}

+ 5 - 0
projects/live-app/src/modules/user/user.modules.routes.ts

@@ -15,6 +15,7 @@ import { RankingComponent } from './ranking/ranking.component';
 import { FriendsComponent } from './friends/friends.component';
 import { GiftLogComponent } from './gift-log/gift-log.component';
 import { OnlineServiceComponent } from './online-service/online-service.component';
+import { RelationComponent } from './relation/relation.component';
 const routes: Routes = [
   {
     path: 'profile/:id',//主页
@@ -77,6 +78,10 @@ const routes: Routes = [
     path: 'service', //小客服
     component: OnlineServiceComponent,
   },
+  {
+    path: 'relation', //请密度
+    component: RelationComponent,
+  },
 ]
 @NgModule({
   imports: [RouterModule.forChild(routes)],

+ 141 - 55
projects/live-app/src/services/aichart.service.ts

@@ -9,52 +9,52 @@ export class AiChatService {
   isLoggedIn = false;
   company: string = 'Qje9D4bqol';
   emojis: Array<any> = [];
-  userLevelColor:any = {
-    '1':{
-      color:'#fff'
+  userLevelColor: any = {
+    '1': {
+      color: '#fff',
     },
-    '2':{
-      color:'#0ec52e'
+    '2': {
+      color: '#0ec52e',
     },
-    '3':{
-      color:'#377cf7'
+    '3': {
+      color: '#377cf7',
     },
-    '4':{
-      color:'#cbb013'
+    '4': {
+      color: '#cbb013',
     },
-    '5':{
-      color:'#ec760c'
+    '5': {
+      color: '#ec760c',
     },
-    '6':{
-      color:'#ec0cce'
+    '6': {
+      color: '#ec0cce',
     },
-    '7':{
-      color:'#8d0cec'
+    '7': {
+      color: '#8d0cec',
     },
-    '8':{
-      color:'#dd0a0a'
+    '8': {
+      color: '#dd0a0a',
     },
-  }
-  authorLevelColor:any = {
-    '1':{
-      color:'#10b590'
+  };
+  authorLevelColor: any = {
+    '1': {
+      color: '#10b590',
     },
-    '2':{
-      color:'#dd70ff'
+    '2': {
+      color: '#dd70ff',
     },
-    '3':{
-      color:'#ed9647'
+    '3': {
+      color: '#ed9647',
     },
-    '4':{
-      color:'#fb73ca'
+    '4': {
+      color: '#fb73ca',
     },
-    '5':{
-      color:'#efeb38'
+    '5': {
+      color: '#efeb38',
     },
-    '6':{
-      color:'#c11010'
-    }
-  }
+    '6': {
+      color: '#c11010',
+    },
+  };
 
   get identity(): boolean {
     let profile = JSON.parse(localStorage.getItem('profile') || '{}');
@@ -201,7 +201,7 @@ export class AiChatService {
     (SELECT COUNT(*) FROM "ProfileRadar" WHERE "toUser" = '${uid}' AND "name" = '关注' AND "isDeleted" IS NOT TRUE) AS fans;`;
     return this.http.customSQL(sql);
   }
-  async getGift(type?: string,id?:string): Promise<any> {
+  async getGift(type?: string, id?: string): Promise<any> {
     let where = type ? `AND "type" = '${type}'` : ``;
     let whereId = id ? `AND "objectId" = '${id}'` : ``;
     let sql = `SELECT "objectId" AS "id","name","price","order","imgUrl","video","type","rightsMap","config"
@@ -236,7 +236,8 @@ export class AiChatService {
     return data.data;
   }
   /* 获取好友列表 */
-  async getFriends(uid: string): Promise<any> {
+  async getFriends(uid: string,val?:string): Promise<any> {
+    let where = val ? `WHERE u.nickname LIKE '%${val}%'` : ''
     let rejectsSql = `SELECT invited FROM "EventLog" WHERE "isDeleted" IS NOT TRUE AND "user" = '${uid}' AND "isAward" = TRUE `;
     let data: any = await this.http.customSQL(rejectsSql);
     let list = data.data;
@@ -255,8 +256,8 @@ export class AiChatService {
       OR "user" = '${uid}')
       GROUP BY fid,"channel",deadline) AS f
     LEFT JOIN "_User" AS u
-    ON u."objectId" = f.fid
-    ${notInclude.length > 0 ? `WHERE u."objectId" NOT IN (${notInclude})` : ''}
+    ON u."objectId" = f.fid 
+    ${notInclude.length > 0 ? `WHERE u."objectId" NOT IN (${notInclude}) AND u.nickname LIKE '%${val}%'` : where}
     `;
     return this.http.customSQL(sql);
   }
@@ -298,12 +299,12 @@ export class AiChatService {
   }
 
   async getLinkUsers(params: {
-    company?:string,
-    value?:string, 
-    limit?:number, 
-    skip?:number, 
-    sex?:string, 
-    city?:string
+    company?: string;
+    value?: string;
+    limit?: number;
+    skip?: number;
+    sex?: string;
+    city?: string;
   }): Promise<any> {
     params['company'] = this.company;
     let baseurl = 'https://server.fmode.cn/api/ailiao/users';
@@ -334,16 +335,47 @@ export class AiChatService {
     return data?.data;
   }
 
-  async getOrderAnchor(limit?: number) {
-    let sql = `SELECT us."objectId",us."nickname",us."avatar",
-    COALESCE(SUM(llog.gold ),0) AS "credit"
-    FROM "LoveRender" AS llog
-    LEFT JOIN "_User" us
-    ON us."objectId" = llog."toUser"
-    WHERE llog.company = '${this.company}'
-    AND llog."isDeleted" IS NOT TRUE
-    GROUP BY us."objectId",us."username"
-    ORDER BY "credit" DESC LIMIT ${limit ?? 10}`;
+  async getOrderAnchor(type?: string, limit?: number) {
+    let sql = `SELECT us."objectId",us."nickname",us."avatar",ROUND(SUM("credit")::numeric, 2) AS credit
+      FROM (
+        SELECT COALESCE(SUM(llog.gold ),0) AS "credit",llog."toUser" AS uid
+        FROM "LoveRender" AS llog
+        WHERE llog.company = '${this.company}'
+        AND llog."isDeleted" IS NOT TRUE
+        GROUP BY llog."toUser"
+        UNION
+        SELECT SUM(lalog.duration / 60 * lalog.unit) "credit","Room"."user" AS uid
+        FROM "LiveActiveLog" AS lalog
+        LEFT JOIN "Room"
+        ON lalog."room" = "Room"."objectId"
+        WHERE lalog.company = '${this.company}'
+        AND lalog."isDeleted" IS NOT TRUE
+        GROUP BY "Room"."user"
+      ) AS tbl
+      LEFT JOIN "_User" us
+      ON us."objectId" = tbl.uid
+      GROUP BY us."objectId",us."username"
+      ORDER BY SUM(tbl."credit") DESC LIMIT ${limit ?? 50}`;
+    if (type == 'user') {
+      sql = `SELECT us."objectId",us."nickname",us."avatar",ROUND(SUM("credit")::numeric, 2) AS credit
+        FROM (
+          SELECT COALESCE(SUM(llog.gold ),0) AS "credit",llog."fromUser" AS uid
+          FROM "LoveRender" AS llog
+          WHERE llog.company = '${this.company}'
+          AND llog."isDeleted" IS NOT TRUE
+          GROUP BY llog."fromUser"
+          UNION
+          SELECT SUM(lalog.duration / 60 * lalog.unit) "credit",lalog."user" AS uid
+          FROM "LiveActiveLog" AS lalog
+          WHERE lalog.company = '${this.company}'
+          AND lalog."isDeleted" IS NOT TRUE
+          GROUP BY lalog."user"
+        ) AS tbl
+          LEFT JOIN "_User" us
+          ON us."objectId" = tbl.uid
+          GROUP BY us."objectId",us."username"
+          ORDER BY SUM(tbl."credit") DESC LIMIT ${limit ?? 50}`;
+    }
     let res: any = await this.http.customSQL(sql);
     return res.data;
   }
@@ -443,12 +475,66 @@ export class AiChatService {
     return res.data;
   }
 
-  async getCommentScore(room:string){
+  async getCommentScore(room: string) {
     let sql = `SELECT (SUM("credit")/COUNT("objectId")) AS ave
     FROM "DramaPostLog"
     WHERE room = '${room}'
-    `
+    `;
     let res: any = await this.http.customSQL(sql);
     return res.data[0]['ave'];
   }
+
+  async getRelation(limit?: number, skip?: number) {
+    let uid = Parse.User.current()?.id;
+    let sql = `SELECT us."objectId",us."nickname",us."avatar",ROUND(SUM("credit")::numeric, 2) AS credit
+    FROM (
+      SELECT COALESCE(SUM(llog.gold ),0) AS "credit",llog."toUser" AS uid
+      FROM "LoveRender" AS llog
+      WHERE llog.company = '${this.company}'
+      AND llog."isDeleted" IS NOT TRUE
+      AND llog."fromUser" = '${uid}'
+      GROUP BY llog."toUser"
+      UNION
+      SELECT SUM(lalog.duration / 60 * lalog.unit) "credit","Room"."user" AS uid
+      FROM "LiveActiveLog" AS lalog
+      LEFT JOIN "Room"
+      ON lalog."room" = "Room"."objectId"
+      WHERE lalog.company = '${this.company}'
+      AND lalog."isDeleted" IS NOT TRUE
+      AND lalog."user" = '${uid}'
+      GROUP BY "Room"."user"
+    ) AS tbl
+    LEFT JOIN "_User" us
+    ON us."objectId" = tbl.uid
+    GROUP BY us."objectId",us."username"
+    ORDER BY SUM(tbl."credit") DESC 
+    OFFSET ${skip || 0} LIMIT ${limit ?? 50}`;
+    if (this.identity) {
+      sql = `SELECT us."objectId",us."nickname",us."avatar",ROUND(SUM("credit")::numeric, 2) AS credit
+      FROM (
+        SELECT COALESCE(SUM(llog.gold ),0) AS "credit",llog."fromUser" AS uid
+        FROM "LoveRender" AS llog
+        WHERE llog.company = '${this.company}'
+        AND llog."isDeleted" IS NOT TRUE
+        AND llog."toUser" = '${uid}'
+        GROUP BY llog."fromUser"
+        UNION
+        SELECT SUM(lalog.duration / 60 * lalog.unit) "credit",lalog."user" AS uid
+        FROM "LiveActiveLog" AS lalog
+        LEFT JOIN "Room"
+        ON lalog."room" = "Room"."objectId"
+        WHERE lalog.company = '${this.company}'
+        AND lalog."isDeleted" IS NOT TRUE
+        AND "Room"."user" = '${uid}'
+        GROUP BY lalog."user"
+      ) AS tbl
+        LEFT JOIN "_User" us
+        ON us."objectId" = tbl.uid
+        GROUP BY us."objectId",us."username"
+        ORDER BY SUM(tbl."credit") DESC 
+        OFFSET ${skip || 0} LIMIT ${limit ?? 50}`;
+    }
+    let res: any = await this.http.customSQL(sql);
+    return res.data;
+  }
 }