panhui пре 2 година
родитељ
комит
b63928a056
4 измењених фајлова са 73 додато и 7 уклоњено
  1. 16 1
      src/chat/chat.controller.ts
  2. 11 3
      src/chat/chat.module.ts
  3. 34 3
      src/chat/chat.service.ts
  4. 12 0
      src/users/users.service.ts

+ 16 - 1
src/chat/chat.controller.ts

@@ -1,10 +1,11 @@
-import { Controller, Get, Post, Req, Res, Sse, HttpCode } from '@nestjs/common'
+import { Controller, Get, Post, Req, Res, Sse, HttpCode, Query } from '@nestjs/common'
 import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'
 import { ChatService } from './chat.service'
 import { Observable } from 'rxjs'
 import { Public } from '../auth/public.decorator'
 import { HasRoles } from '../auth/roles.decorator'
 import { Role } from '../model/role.enum'
+import { format } from 'date-fns'
 
 @ApiTags('chat')
 @Controller('chat')
@@ -52,4 +53,18 @@ export class ChatController {
     public chatProxyStream(@Req() req) {
         return this.chatService.streamChatProxy(req)
     }
+
+    @Get('/getDatas')
+    public async getDatas(@Query() { apiUserId }) {
+        const apiNum = await this.chatService.getCount(Number(apiUserId), Role.Api)
+        const userNum = await this.chatService.getCount(Number(apiUserId), Role.User)
+        const todayNum = await this.chatService.getCount(Number(apiUserId), undefined, format(new Date(), 'yyyy-MM-dd'))
+        const week = await this.chatService.getWeekCount(Number(apiUserId))
+        return {
+            api: apiNum,
+            user: userNum,
+            today: todayNum,
+            week: week
+        }
+    }
 }

+ 11 - 3
src/chat/chat.module.ts

@@ -7,12 +7,20 @@ import { TokenUsage } from './entities/token-usage.entity'
 import { MembershipModule } from '../membership/membership.module'
 import { HttpModule } from '@nestjs/axios'
 import { SysConfigModule } from '../sys-config/sys-config.module'
-import {ChatPdfModule} from "../chat-pdf/chat-pdf.module";
+import { ChatPdfModule } from '../chat-pdf/chat-pdf.module'
+import { UsersModule } from '../users/users.module'
 
 @Module({
-    imports: [TypeOrmModule.forFeature([ChatHistory, TokenUsage]), MembershipModule, HttpModule, SysConfigModule, ChatPdfModule],
+    imports: [
+        TypeOrmModule.forFeature([ChatHistory, TokenUsage]),
+        MembershipModule,
+        HttpModule,
+        SysConfigModule,
+        ChatPdfModule,
+        UsersModule
+    ],
     providers: [ChatService],
     controllers: [ChatController],
     exports: [ChatService]
 })
-export class ChatModule { }
+export class ChatModule {}

+ 34 - 3
src/chat/chat.service.ts

@@ -3,11 +3,10 @@ import { Observable, interval } from 'rxjs'
 import { ChatGPTAPI, ChatMessage } from '../chatapi'
 import type { RequestProps } from './types'
 import { chatReplyProcess } from './chatgpt'
-import { Repository, MoreThanOrEqual, LessThanOrEqual, And } from 'typeorm'
+import { In, Repository, MoreThanOrEqual, LessThanOrEqual, And } from 'typeorm'
 import { ChatHistory } from './entities/chat.entity'
 import { InjectRepository } from '@nestjs/typeorm'
 import { TokenUsage } from './entities/token-usage.entity'
-import { format } from 'date-fns'
 import { MembershipService } from '../membership/membership.service'
 import { MemberType } from '../membership/entities/membership.entity'
 import { get_encoding } from '@dqbd/tiktoken'
@@ -16,6 +15,9 @@ import { HttpService } from '@nestjs/axios'
 import * as types from '../chatapi/types'
 import { SysConfigService } from '../sys-config/sys-config.service'
 import { ChatPdfService } from '../chat-pdf/chat-pdf.service'
+import { UsersService } from '../users/users.service'
+import { Role } from '../model/role.enum'
+import { startOfDay, endOfDay, addDays, format } from 'date-fns'
 
 @Injectable()
 export class ChatService {
@@ -28,7 +30,8 @@ export class ChatService {
         private readonly membershipService: MembershipService,
         private readonly httpService: HttpService,
         private readonly sysConfigService: SysConfigService,
-        private readonly chatPdfService: ChatPdfService
+        private readonly chatPdfService: ChatPdfService,
+        private readonly usersService: UsersService
     ) {}
 
     public chat(req, res): Observable<any> {
@@ -270,4 +273,32 @@ export class ChatService {
             date: And(MoreThanOrEqual(start || '2023-04-01'), LessThanOrEqual(end || date))
         })
     }
+
+    public async getCount(apiUserId: number, roles?: Role, date?: string) {
+        const userIds = await this.usersService.getUsers(apiUserId, roles)
+
+        return this.chatHistoryRepository.countBy({
+            userId: In(userIds),
+            role: 'user',
+            time: date
+                ? And(MoreThanOrEqual(startOfDay(new Date(date))), LessThanOrEqual(endOfDay(new Date(date))))
+                : undefined
+        })
+    }
+
+    public async getWeekCount(apiUserId: number) {
+        const date1 = new Date()
+        let dayInfo = {}
+        for (let i = 0; i < 7; i++) {
+            let date2 = format(addDays(date1, 0 - i), 'yyyy-MM-dd')
+            let api = await this.getCount(apiUserId, Role.Api, date2)
+            let user = await this.getCount(apiUserId, Role.User, date2)
+            dayInfo[format(addDays(date1, 0 - i), 'MM-dd')] = {
+                api: api,
+                user: user
+            }
+        }
+
+        return dayInfo
+    }
 }

+ 12 - 0
src/users/users.service.ts

@@ -24,6 +24,7 @@ import { Role } from '../model/role.enum'
 import { PageRequest } from '../common/dto/page-request'
 import { th } from 'date-fns/locale'
 import { startOfDay, endOfDay, addDays, format } from 'date-fns'
+import { where } from 'sequelize'
 
 @Injectable()
 export class UsersService {
@@ -261,4 +262,15 @@ export class UsersService {
 
         return dayInfo
     }
+
+    public async getUsers(apiUserId: number, roles?: Role) {
+        let users = await this.userRepository.findBy({
+            apiUserId: apiUserId,
+            roles: roles
+        })
+
+        return users.map((item) => {
+            return item.id
+        })
+    }
 }