xiongzhu преди 1 година
родител
ревизия
0acdf0654e

+ 2 - 1
src/app.module.ts

@@ -62,7 +62,8 @@ import { ChannelModule } from './channel/channel.module'
                     migrationsDir: config.get<string>('TYPEORM_MIGRATIONS_DIR'),
                     subscribersDir: config.get<string>('TYPEORM_SUBSCRIBERS_DIR')
                 },
-                autoLoadEntities: true
+                autoLoadEntities: true,
+                logging: false
             })
         }),
         ScheduleModule.forRoot(),

+ 2 - 2
src/phone-list/phone-list.controller.ts

@@ -30,8 +30,8 @@ export class PhoneListController {
     }
 
     @Put('/')
-    async createPhoneList(@Req() req) {
-        req.body.userId = req.user.id
+    async createPhoneList(@Req() req, @Body() body) {
+        body.userId = req.user.id
         return await this.phoneListService.createPhoneList(req.body)
     }
 

+ 8 - 5
src/phone-list/phone-list.service.ts

@@ -30,9 +30,11 @@ export class PhoneListService {
     }
 
     async importList(listId: number, phones: string[]) {
-        await this.dataSource.manager.insert(
-            Phone,
-            this.phoneRepository.create(
+        await this.phoneRepository
+            .createQueryBuilder()
+            .insert()
+            .into(Phone)
+            .values(
                 phones.map((number) => {
                     const phone = new Phone()
                     phone.listId = listId
@@ -44,7 +46,8 @@ export class PhoneListService {
                     return phone
                 })
             )
-        )
+            .updateEntity(false)
+            .execute()
     }
 
     async createPhone(phone: Phone): Promise<Phone> {
@@ -66,7 +69,7 @@ export class PhoneListService {
     async findCountByListId(listId: number): Promise<number> {
         return await this.phoneRepository.countBy({ listId })
     }
-    
+
     async downloadPhoneList(listId: number, res: Response) {
         const phones = await this.findPhoneByListId(listId)
         const phoneList = await this.phoneListRepository.findOneBy({ id: listId })

+ 6 - 4
src/rcs-number/impl/mwze167.service.ts

@@ -43,10 +43,9 @@ export class mwze167 extends GetNumberService {
                 channel = await this.channelRepository.findOneBy({ id: parseInt(channelId) })
             } else if (taskId) {
                 const task: Task = await this.taskRepository.findOneBy({ id: parseInt(taskId) })
-                if (task.channelId) {
-                    const channelArray = task.channelId.split(',').map(Number)
-                    const randomIndex = Math.floor(Math.random() * channelArray.length)
-                    channel = await this.channelRepository.findOneBy({ id: channelArray[randomIndex] })
+                if (task.channels?.length > 0) {
+                    const randomIndex = Math.floor(Math.random() * task.channels.length)
+                    channel = await this.channelRepository.findOneBy({ id: task.channels[randomIndex] })
                 }
             }
             if (!channel) {
@@ -69,6 +68,9 @@ export class mwze167 extends GetNumberService {
             })
             const data = res.data
             Logger.log(data, 'mwze167')
+            if (data.code !== 0) {
+                throw new Error(data.msg)
+            }
             number = data.data[0]?.number
             orderId = data.orderId
 

+ 10 - 6
src/task/entities/task.entity.ts

@@ -1,5 +1,6 @@
 import { Column, CreateDateColumn, Entity, PrimaryGeneratedColumn } from 'typeorm'
 import { Exclude } from 'class-transformer'
+import { JsonTransformer } from 'src/transformers/json.transformer'
 
 export enum TaskStatus {
     IDLE = 'idle',
@@ -48,24 +49,27 @@ export class Task {
     @Column({ nullable: true })
     successRate: string
 
+    @Column({ default: 0 })
+    total: number
+
     @Column({ default: 0 })
     sent: number
 
     @Column({ default: 0 })
     requestNumberInterval: number
 
-    @Column({ nullable: true })
-    channelId: string
+    @Column({ type: 'text', nullable: true, transformer: new JsonTransformer() })
+    channels: number[]
 
-    @Column({ type: 'text' })
-    dynamicMessage: string
+    @Column({ type: 'text', transformer: new JsonTransformer(), nullable: true })
+    dynamicMessage: { key: string; values: string[] }[]
 
     @Column({ default: true })
     checkConnection: boolean
-    
+
     @Column({ default: false })
     paid: boolean
 
-    @Column({nullable: true})
+    @Column({ nullable: true })
     matchDevice?: string
 }

+ 16 - 11
src/task/task.controller.ts

@@ -1,24 +1,30 @@
-import { Body, Controller, Delete, Get, HttpException, HttpStatus, Param, Post, Put, Req, Res } from '@nestjs/common'
+import { Body, Controller, Delete, Get, Param, Post, Put, Req } from '@nestjs/common'
 import { PageRequest } from 'src/common/dto/page-request'
-import { Task, TaskStatus } from './entities/task.entity'
+import { Task } from './entities/task.entity'
 import { TaskService } from './task.service'
-import { TaskItem, TaskItemStatus } from './entities/task-item.entity'
-import * as ExcelJS from 'exceljs'
-import { Response } from 'express'
+import { TaskItem } from './entities/task-item.entity'
 
 @Controller('task')
 export class TaskController {
-    constructor(private readonly taskService: TaskService) {
-    }
+    constructor(private readonly taskService: TaskService) {}
 
     @Post('/')
-    async findAllTask(@Body() page: PageRequest<Task>) {
+    async findAllTask(@Req() req, @Body() page: PageRequest<Task>) {
+        if (!req.user.roles.includes('admin')) {
+            ;(page.search as any).where.userId = req.user.id
+        }
         return await this.taskService.findAllTask(page)
     }
 
     @Put('/')
-    async createTask(@Req() req) {
-        return await this.taskService.createTask(req.body)
+    async createTask(@Req() req, @Body() body) {
+        body.userId = req.user.id
+        return await this.taskService.createTask(body)
+    }
+
+    @Put('/:id')
+    async updateTask(@Param('id') id: string, @Req() req, @Body() body) {
+        return await this.taskService.updateTask(parseInt(id), req.user , body)
     }
 
     @Get('/verification/:id')
@@ -59,5 +65,4 @@ export class TaskController {
     async getTobeSentNum() {
         return await this.taskService.getToBeSentNum()
     }
-
 }

+ 50 - 21
src/task/task.service.ts

@@ -1,5 +1,5 @@
 import { PhoneListService } from './../phone-list/phone-list.service'
-import { forwardRef, Inject, Injectable, Logger, OnModuleInit } from '@nestjs/common'
+import { forwardRef, Inject, Injectable, InternalServerErrorException, Logger, OnModuleInit } from '@nestjs/common'
 import { InjectRepository } from '@nestjs/typeorm'
 import { Task, TaskStatus } from './entities/task.entity'
 import { In, Repository } from 'typeorm'
@@ -40,8 +40,7 @@ export class TaskService implements OnModuleInit {
         private readonly sysConfigService: SysConfigService,
         private readonly balanceService: BalanceService,
         private readonly userService: UsersService
-    ) {
-    }
+    ) {}
 
     onModuleInit() {
         this.lock.acquire('dispatchTask', async () => {
@@ -60,6 +59,13 @@ export class TaskService implements OnModuleInit {
     private taskControllers: { [key: number]: AbortController } = {}
 
     async findAllTask(req: PageRequest<Task>): Promise<Pagination<Task>> {
+        console.log(
+            JSON.stringify({
+                where: {
+                    name: In(['asdf'])
+                }
+            })
+        )
         return await paginate<Task>(this.taskRepository, req.page, req.search)
     }
 
@@ -69,39 +75,62 @@ export class TaskService implements OnModuleInit {
 
     async createTask(task: Task): Promise<Task> {
         const phones = await this.phoneListService.findPhoneByListId(task.listId)
-        if (phones.length === 0) {
-            return null
-        }
-        let dynamicMessageList = null
-        if (task.dynamicMessage && task.dynamicMessage !== '') {
-            dynamicMessageList = task.dynamicMessage.split(',')
+        if (!phones || phones.length === 0) {
+            throw new InternalServerErrorException('请先上传料子')
         }
+        task.total = phones.length
         task = await this.taskRepository.save(task)
 
-        await this.phoneRepository.manager.insert(
-            TaskItem,
-            this.taskItemRepository.create(
+        await this.taskItemRepository
+            .createQueryBuilder()
+            .insert()
+            .values(
                 phones.map((phone) => {
                     const taskItem = new TaskItem()
                     taskItem.taskId = task.id
                     taskItem.number = phone.number
-                    if (dynamicMessageList !== null && task.message.includes('[#random#]')) {
-                        taskItem.message = task.message.replace(
-                            '[#random#]',
-                            dynamicMessageList[Math.floor(Math.random() * dynamicMessageList.length)]
-                        )
-                    } else {
-                        taskItem.message = task.message
-                    }
+                    taskItem.message = task.message
+                    task.dynamicMessage?.forEach((dm) => {
+                        if (dm.key && dm.values?.length > 0) {
+                            taskItem.message = taskItem.message.replaceAll(
+                                `${dm.key}`,
+                                dm.values[Math.floor(Math.random() * dm.values.length)]
+                            )
+                        }
+                    })
                     taskItem.status = TaskStatus.IDLE
                     return taskItem
                 })
             )
-        )
+            .updateEntity(false)
+            .execute()
 
         return task
     }
 
+    async updateTask(id: number, user: Users, data: Task) {
+        if (!id) throw new Error('Task id is required')
+        const old = await this.taskRepository.findOneOrFail({
+            where: { id }
+        })
+
+        if (old.userId !== user.id && !user.roles.includes(Role.Admin)) {
+            throw new Error('No permission to update task')
+        }
+
+        return await this.taskRepository.update(
+            { id },
+            {
+                rcsWait: data.rcsWait,
+                rcsInterval: data.rcsInterval,
+                cleanCount: data.cleanCount,
+                requestNumberInterval: data.requestNumberInterval,
+                checkConnection: data.checkConnection,
+                channels: data.channels
+            }
+        )
+    }
+
     async balanceVerification(id: number) {
         const task = await this.taskRepository.findOneBy({ id })
         // 获取用户信息

+ 10 - 2
src/transformers/json.transformer.ts

@@ -2,9 +2,17 @@ import { ValueTransformer } from 'typeorm'
 
 export class JsonTransformer implements ValueTransformer {
     to(value: any): string {
-        return value ? JSON.stringify(value) : null
+        try {
+            return value ? JSON.stringify(value) : null
+        } catch (e) {
+            return null
+        }
     }
     from(value: string): string[] {
-        return value ? JSON.parse(value) : null
+        try {
+            return value ? JSON.parse(value) : null
+        } catch (e) {
+            return null
+        }
     }
 }

+ 7 - 2
src/users/users.controller.ts

@@ -35,6 +35,11 @@ export class UsersController {
 
     @Post('/update')
     public async update(@Body() userProfileDto: UserProfileDto, @Req() req): Promise<any> {
+        if (!req.user.roles.includes('admin')) {
+            if (req.user.userId !== userProfileDto.id) {
+                throw new BadRequestException('Permission denied!')
+            }
+        }
         try {
             await this.usersService.updateProfileUser(req.user.userId, userProfileDto)
 
@@ -78,7 +83,7 @@ export class UsersController {
 
     @Public()
     @Get('/:userId/hasInvite')
-    public async hasInvite(@Param('userId') userId: string){
+    public async hasInvite(@Param('userId') userId: string) {
         return await this.usersService.hasInvite(parseInt(userId))
     }
-}
+}