xiongzhu 1 tahun lalu
induk
melakukan
ff604df357

+ 15 - 0
src/balance/balance.service.ts

@@ -21,6 +21,8 @@ export class BalanceService {
         @InjectRepository(Balance)
         private balanceRepository: Repository<Balance>,
         @InjectRepository(BalanceRecord)
+        private balanceRecordRepository: Repository<BalanceRecord>,
+        @InjectRepository(BalanceRecord)
         private recordRepository: Repository<BalanceRecord>,
         @InjectRepository(Users)
         private userRepository: Repository<Users>,
@@ -385,4 +387,17 @@ export class BalanceService {
             throw new Error('Permission denied!')
         }
     }
+
+    async sumAmount(userId: number, type: BalanceType) {
+        const data = await this.balanceRecordRepository
+            .createQueryBuilder()
+            .select('SUM(amount)', 'sum')
+            .where('userId = :userId', { userId })
+            .andWhere('type = :type', { type })
+            .getRawOne()
+        if (data.sum) {
+            return new Decimal(data.sum)
+        }
+        return new Decimal(0)
+    }
 }

+ 1 - 2
src/pay-order/pay-order.service.ts

@@ -126,12 +126,11 @@ export class PayOrderService {
 
                     const rechargeRatio = await this.sysConfigService.getString('recharge_ratio', '')
                     const ratio = new Decimal(rechargeRatio)
-                    const balanceDecimal = new Decimal(payOrders.amount).mul(ratio)
 
                     await this.balanceService.rechargeBalance(
                         parseInt(payOrders.userId),
                         parseInt(payOrders.userId),
-                        balanceDecimal.toNumber()
+                        payOrders.amount.mul(ratio)
                     )
                     await this.payOrderRepository.save(payOrders)
                     break

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

@@ -18,6 +18,7 @@ import { Phone } from './entities/phone.entity'
 import { PhoneListService } from './phone-list.service'
 import { FileInterceptor } from '@nestjs/platform-express'
 import { BalanceService } from '../balance/balance.service'
+import Decimal from 'decimal.js'
 
 @Controller('phone-list')
 export class PhoneListController {
@@ -99,7 +100,7 @@ export class PhoneListController {
 
         if (flag === 1) {
             if (req.user.roles.includes('user')) {
-                if (!(await this.balanceService.changeScreenBalance(req.user.id, phones.length))) {
+                if (!(await this.balanceService.changeScreenBalance(req.user.id, new Decimal(phones.length)))) {
                     throw new InternalServerErrorException('筛号余额不足请充值!')
                 }
             }

+ 18 - 32
src/task/task.service.ts

@@ -36,6 +36,7 @@ import { RcsNumber } from '../rcs-number/entities/rcs-number.entity'
 import axios from 'axios'
 import { BalanceRecord, BalanceType } from '../balance/entities/balance-record.entity'
 import { Device } from '../device/entities/device.entity'
+import Decimal from 'decimal.js'
 
 @Injectable()
 export class TaskService implements OnModuleInit {
@@ -64,8 +65,7 @@ export class TaskService implements OnModuleInit {
         private readonly balanceService: BalanceService,
         private readonly userService: UsersService,
         private readonly operatorConfigService: OperatorConfigService
-    ) {
-    }
+    ) {}
 
     onModuleInit() {
         this.lock.acquire('dispatchTask', async () => {
@@ -138,13 +138,13 @@ export class TaskService implements OnModuleInit {
             task.confusion = 'both'
         }
         // 定时任务
-        let cost = 0
+        let cost = new Decimal(0)
         if (task.startedAt) {
             task.status = TaskStatus.SCHEDULED
             const user = await this.userService.findById(task.userId)
             // 创建任务前扣费
             cost = await this.getCost(task, user)
-            if (cost > (user.balance || 0)) {
+            if (new Decimal(cost).comparedTo(user.balance || new Decimal(0)) > 0) {
                 throw new Error('余额不足,请充值后创建定时任务!')
             }
             task.paid = true
@@ -227,7 +227,6 @@ export class TaskService implements OnModuleInit {
             }
         }
 
-
         return this.refineContent(message)
     }
 
@@ -275,9 +274,9 @@ export class TaskService implements OnModuleInit {
         if (user.roles.includes(Role.Admin)) {
             return 0
         }
-        const cost: number = await this.getCost(task, user)
+        const cost = await this.getCost(task, user)
         // 验证余额
-        if (cost > (user.balance || 0)) {
+        if (cost.comparedTo(user.balance || new Decimal(0)) > 0) {
             return -1
         } else {
             return cost
@@ -306,7 +305,7 @@ export class TaskService implements OnModuleInit {
             if (!user.roles.includes(Role.Admin)) {
                 // 开始任务前扣费
                 const cost = await this.getCost(task, user)
-                if (cost > (user.balance || 0)) {
+                if (cost.comparedTo(user.balance || new Decimal(0)) > 0) {
                     throw new Error('Insufficient balance!')
                 }
                 await this.balanceService.feeDeduction(task.userId, cost, task.id)
@@ -695,8 +694,7 @@ export class TaskService implements OnModuleInit {
                     if (durianRes.data.code === 200) {
                         res.durian = durianRes.data.data.score
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -717,8 +715,7 @@ export class TaskService implements OnModuleInit {
                     if (cowboyRes.data.code === 200) {
                         res.cowboy = cowboyRes.data.data.score
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -732,8 +729,7 @@ export class TaskService implements OnModuleInit {
                     if (parts[0] === '0') {
                         res.xyz = parts[1] < 0 ? 0 : parts[1]
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -746,8 +742,7 @@ export class TaskService implements OnModuleInit {
                     if (cloud033Res.data.code === '1001') {
                         res.cloud033 = cloud033Res.data.data.integral
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -760,8 +755,7 @@ export class TaskService implements OnModuleInit {
                     if (cloud034Res.data.code === '1001') {
                         res.cloud034 = cloud034Res.data.data.integral
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -774,8 +768,7 @@ export class TaskService implements OnModuleInit {
                     if (cloud037Res.data.code === '1001') {
                         res.cloud037 = cloud037Res.data.data.integral
                     }
-                } catch (e) {
-                }
+                } catch (e) {}
             })()
         ])
         return res
@@ -787,7 +780,7 @@ export class TaskService implements OnModuleInit {
 
         return await this.taskItemRepository
             .createQueryBuilder()
-            .select(['COUNT(*) AS sent', 'DATE_FORMAT(sendAt, \'%Y-%m-%d %H:00:00\') AS hour'])
+            .select(['COUNT(*) AS sent', "DATE_FORMAT(sendAt, '%Y-%m-%d %H:00:00') AS hour"])
             .where('sendAt BETWEEN :start AND :end', { start: twelveHoursAgo, end: new Date() })
             .groupBy('hour')
             .orderBy('hour', 'DESC')
@@ -812,8 +805,7 @@ export class TaskService implements OnModuleInit {
                         .andWhere('task.startedAt < CURDATE()')
                         .getRawOne()
                     res.orderCountYesterday = yesterdayOrderCount.sum
-                } catch (e) {
-                }
+                } catch (e) {}
             })(),
             (async () => {
                 try {
@@ -825,8 +817,7 @@ export class TaskService implements OnModuleInit {
                         .andWhere('task.startedAt < CURDATE() + INTERVAL 1 DAY')
                         .getRawOne()
                     res.orderCountToday = todayOrderCount.sum
-                } catch (e) {
-                }
+                } catch (e) {}
             })()
         ])
 
@@ -991,7 +982,7 @@ export class TaskService implements OnModuleInit {
         // const rate = new Decimal(String(user.rate))
         // const num = new Decimal(String(number))
         // const cost = rate.mul(num)
-        return number
+        return new Decimal(number)
     }
 
     @Interval(2000)
@@ -1296,12 +1287,7 @@ export class TaskService implements OnModuleInit {
     }
 
     public async updateSend(id: number) {
-        const user = await this.userRepository.findOneBy({ id })
-        user.send = await this.balanceRecordRepository.sum('amount', {
-            userId: id,
-            type: BalanceType.CONSUMPTION
-        })
-        return await this.userRepository.save(user)
+        return await this.balanceService.sumAmount(id, BalanceType.CONSUMPTION)
     }
 
     @Cron('0 0,30 * * * *')