Forráskód Böngészése

feat(rcs-number): 优化定时释放功能并支持 svenkvint 号码释放

- 修改定时释放功能,支持处理所有已过期的号码,而不仅仅是来自 smspva 的号码
- 重构释放号码逻辑,使用统一的 getNumberService 方法处理不同来源的号码
- 为 svenkvint 服务实现 releaseNumber 方法,支持 svenkvint 号码的释放
- 优化日志记录,增加成功和失败的统计信息
- 添加错误处理,确保定时任务在遇到错误时不会中断
wui 10 hónapja
szülő
commit
9af80c9c53

+ 21 - 3
src/rcs-number/impl/svenkvint.service.ts

@@ -48,7 +48,25 @@ export class svenkvint extends GetNumberService {
         }
         }
     }
     }
 
 
-    async releaseNumber(number: string) {}
+    async releaseNumber(number: string) {
+        const timestamp = Math.floor(Date.now() / 1000)
+        const data = `channel=${channel}t=${timestamp}taskid=${number}${key}`
+        const sign = createHash('md5').update(data).digest('hex')
+
+        const formData = querystring.stringify({
+            channel,
+            taskid: number,
+            t: timestamp,
+            sign
+        })
+
+        const res = await axiosInstance.post('releasePhone', formData, {
+            headers: {
+                'Content-Type': 'application/x-www-form-urlencoded'
+            }
+        })
+        // console.log('releaseNumber', res.data)
+    }
 
 
     async retriveMessage(orderId: string, num?: number): Promise<string> {
     async retriveMessage(orderId: string, num?: number): Promise<string> {
         const timestamp = Math.floor(Date.now() / 1000)
         const timestamp = Math.floor(Date.now() / 1000)
@@ -69,8 +87,8 @@ export class svenkvint extends GetNumberService {
             }
             }
         })
         })
 
 
-        console.log(res.data)
-        if (res.data.code == 0){
+        // console.log('retriveMessage', res.data)
+        if (res.data.code == 0) {
             return `Your Messenger verification code is G-${res.data.vcode}`
             return `Your Messenger verification code is G-${res.data.vcode}`
         }
         }
     }
     }

+ 42 - 36
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 { Between, MoreThan, Not, Repository } from 'typeorm'
+import { Between, In, MoreThan, 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'
@@ -282,7 +282,7 @@ export class RcsNumberService {
         if (rcsNumber) {
         if (rcsNumber) {
             const numberService = this.getNumberService(rcsNumber.from)
             const numberService = this.getNumberService(rcsNumber.from)
             let param = rcsNumber.rawNumber
             let param = rcsNumber.rawNumber
-            if (rcsNumber.from === RcsNumberSource.smspva) {
+            if (rcsNumber.from === RcsNumberSource.smspva || rcsNumber.from === RcsNumberSource.svenkvint) {
                 param = rcsNumber.orderId
                 param = rcsNumber.orderId
             }
             }
             await numberService.releaseNumber(param)
             await numberService.releaseNumber(param)
@@ -418,50 +418,56 @@ export class RcsNumberService {
         })
         })
     }
     }
 
 
-    // 释放smspva号码
+    // 释放号码 smspva svenkvint
     @Cron('0 * * * * *')
     @Cron('0 * * * * *')
     async scheduledRelease() {
     async scheduledRelease() {
         Logger.log('Scheduled release started.')
         Logger.log('Scheduled release started.')
+        try {
+            const now = new Date()
+            now.setSeconds(0, 0)
+            const prevMinute = new Date(now)
+            prevMinute.setMinutes(prevMinute.getMinutes() - 1)
+
+            const rcsNumbers = await this.rcsNumberRepository.findBy({
+                expiryTime: Between(prevMinute, now),
+                status: RcsNumberStatus.EXPIRED
+            })
 
 
-        const now = new Date()
-        now.setSeconds(0, 0)
-        const prevMinute = new Date(now)
-        prevMinute.setMinutes(prevMinute.getMinutes() - 1)
+            if (rcsNumbers.length === 0) {
+                Logger.log('No expired numbers to release.')
+                return
+            }
 
 
-        const rcsNumbers = await this.rcsNumberRepository.findBy({
-            from: RcsNumberSource.smspva,
-            expiryTime: Between(prevMinute, now),
-            status: RcsNumberStatus.EXPIRED
-        })
+            const results = await Promise.allSettled(
+                rcsNumbers.map(async (rcsNumber) => {
+                    const numberService = this.getNumberService(rcsNumber.from)
+                    if (!numberService) {
+                        throw new Error(`Unknown source: ${rcsNumber.from}`)
+                    }
 
 
-        if (rcsNumbers.length === 0) {
-            Logger.log('No expired numbers to release.')
-            return
-        }
+                    try {
+                        await numberService.releaseNumber(rcsNumber.orderId)
+                        return { orderId: rcsNumber.orderId, success: true }
+                    } catch (error) {
+                        Logger.error(`Failed to release orderId ${rcsNumber.orderId}: ${error.message}`)
+                        throw error
+                    }
+                })
+            )
 
 
-        const results = await Promise.allSettled(
-            rcsNumbers.map((rcsNumber) => {
-                if (rcsNumber.from === RcsNumberSource.smspva) {
-                    this.smspva.releaseNumber(rcsNumber.orderId).catch((e) => {
-                        Logger.error(`Failed to release orderId ${rcsNumber.orderId}: ${e.message}`)
-                        throw e
-                    })
-                } else if (rcsNumber.from === RcsNumberSource.smspva02) {
-                    this.smspva02.releaseNumber(rcsNumber.orderId).catch((e) => {
-                        Logger.error(`Failed to release orderId ${rcsNumber.orderId}: ${e.message}`)
-                        throw e
-                    })
+            const successful = results.filter((r) => r.status === 'fulfilled').length
+            const failed = results.filter((r) => r.status === 'rejected').length
+
+            results.forEach((result, index) => {
+                if (result.status === 'rejected') {
+                    Logger.error(`Order ID ${rcsNumbers[index].orderId} release failed: ${result.reason}`)
                 }
                 }
             })
             })
-        )
 
 
-        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.`)
+            Logger.log(`Scheduled release completed: ${successful} successful, ${failed} failed.`)
+        } catch (error) {
+            Logger.error(`Scheduled release encountered an error: ${error.message}`)
+        }
     }
     }
 
 
     // @Cron('0 0 8 * * *')
     // @Cron('0 0 8 * * *')