Procházet zdrojové kódy

feat(rcs-number): 添加定时释放smspva过期号码功能

wui před 10 měsíci
rodič
revize
80fdf98aaf

+ 17 - 2
src/rcs-number/impl/smspva.service.ts

@@ -1,7 +1,7 @@
 import { GetNumberResponse, GetNumberService } from './get-number-service'
 import { GetNumberResponse, GetNumberService } from './get-number-service'
 import { RcsNumberSource } from '../entities/rcs-number.entity'
 import { RcsNumberSource } from '../entities/rcs-number.entity'
 import axios from 'axios'
 import axios from 'axios'
-import { InternalServerErrorException } from '@nestjs/common'
+import { InternalServerErrorException, Logger } from '@nestjs/common'
 
 
 const API_KEY = 'uNW56fGr0zstfs87Xn0e1l2gCYVnb1'
 const API_KEY = 'uNW56fGr0zstfs87Xn0e1l2gCYVnb1'
 const SERVICE = 'opt259'
 const SERVICE = 'opt259'
@@ -45,7 +45,22 @@ export class smspva extends GetNumberService {
         }
         }
     }
     }
 
 
-    async releaseNumber(number: string) {}
+    async releaseNumber(number: string) {
+        const res = await axiosInstance.put(
+            `cancelorder/${Number(number)}`,
+            {},
+            {
+                headers: {
+                    apikey: API_KEY
+                }
+            }
+        )
+        if (res.data.statusCode === 200) {
+            Logger.log(`release orderId ${number} success`)
+        } else {
+            throw new InternalServerErrorException(res.data.error.description)
+        }
+    }
 
 
     async retriveMessage(orderId: string, num?: number): Promise<string> {
     async retriveMessage(orderId: string, num?: number): Promise<string> {
         const res = await axiosInstance.get(`sms/${Number(orderId)}`, {
         const res = await axiosInstance.get(`sms/${Number(orderId)}`, {

+ 45 - 2
src/rcs-number/rcs-number.service.ts

@@ -5,7 +5,7 @@ import { InjectRepository } from '@nestjs/typeorm'
 import { RcsNumber, RcsNumberSource, RcsNumberStatus } from './entities/rcs-number.entity'
 import { RcsNumber, RcsNumberSource, RcsNumberStatus } from './entities/rcs-number.entity'
 import { PageRequest } from '../common/dto/page-request'
 import { PageRequest } from '../common/dto/page-request'
 import { paginate, Pagination } from 'nestjs-typeorm-paginate'
 import { paginate, Pagination } from 'nestjs-typeorm-paginate'
-import { MoreThan, Not, Repository } from 'typeorm'
+import { Between, LessThan, MoreThan, MoreThanOrEqual, Not, Repository } from 'typeorm'
 import { DeviceService } from 'src/device/device.service'
 import { DeviceService } from 'src/device/device.service'
 import { TaskService } from 'src/task/task.service'
 import { TaskService } from 'src/task/task.service'
 import { OperatorConfigService } from 'src/operator_config/operator_config.service'
 import { OperatorConfigService } from 'src/operator_config/operator_config.service'
@@ -271,7 +271,11 @@ export class RcsNumberService {
         const rcsNumber = await this.rcsNumberRepository.findOneBy({ id })
         const rcsNumber = await this.rcsNumberRepository.findOneBy({ id })
         if (rcsNumber) {
         if (rcsNumber) {
             const numberService = this.getNumberService(rcsNumber.from)
             const numberService = this.getNumberService(rcsNumber.from)
-            await numberService.releaseNumber(rcsNumber.rawNumber)
+            let param = rcsNumber.rawNumber
+            if (rcsNumber.from === RcsNumberSource.smspva) {
+                param = rcsNumber.orderId
+            }
+            await numberService.releaseNumber(param)
         }
         }
     }
     }
 
 
@@ -398,6 +402,45 @@ export class RcsNumberService {
         })
         })
     }
     }
 
 
+    // 释放smspva号码
+    @Cron('0 * * * * *')
+    async scheduledRelease() {
+        Logger.log('Scheduled release started.')
+
+        const now = new Date()
+        now.setSeconds(0, 0)
+        const prevMinute = new Date(now)
+        prevMinute.setMinutes(prevMinute.getMinutes() - 1)
+
+        const rcsNumbers = await this.rcsNumberRepository.findBy({
+            from: RcsNumberSource.smspva,
+            expiryTime: Between(prevMinute, now),
+            status: RcsNumberStatus.EXPIRED
+        })
+
+        if (rcsNumbers.length === 0) {
+            Logger.log('No expired numbers to release.')
+            return
+        }
+
+        const results = await Promise.allSettled(
+            rcsNumbers.map((rcsNumber) =>
+                this.smspva.releaseNumber(rcsNumber.orderId).catch((e) => {
+                    Logger.error(`Failed to release orderId ${rcsNumber.orderId}: ${e.message}`)
+                    throw e
+                })
+            )
+        )
+
+        results.forEach((result, index) => {
+            if (result.status === 'rejected') {
+                Logger.error(`Order ID ${rcsNumbers[index].orderId} release failed: ${result.reason}`)
+            }
+        })
+
+        Logger.log(`Scheduled release completed: ${results.length} numbers processed.`)
+    }
+
     // @Cron('0 0 8 * * *')
     // @Cron('0 0 8 * * *')
     // async addBlack(): Promise<void> {
     // async addBlack(): Promise<void> {
     //     try {
     //     try {