Răsfoiți Sursa

feat(task): 添加备份统计功能并移除发送小时统计

- 新增 backupStatistics 方法,用于获取备份统计信息
- 移除 sentHourStatistics 方法
- 更新 numStatistics 方法,添加小时数据统计
wui 1 an în urmă
părinte
comite
863fbc0166
2 a modificat fișierele cu 106 adăugiri și 7 ștergeri
  1. 6 6
      src/task/task.controller.ts
  2. 100 1
      src/task/task.service.ts

+ 6 - 6
src/task/task.controller.ts

@@ -148,12 +148,6 @@ export class TaskController {
         return await this.taskService.numStatistics()
     }
 
-    @Get('/sentHourStatistics')
-    @HasAnyRoles('admin')
-    async sentHourStatistics() {
-        return await this.taskService.sentHourStatistics()
-    }
-
     @Get('/sentCountryStatistics')
     async sentCountryStatistics(@Req() req) {
         return await this.taskService.sentCountryStatistics(req)
@@ -165,4 +159,10 @@ export class TaskController {
         return await this.taskService.scheduledTaskExecution()
     }
 
+    @Get('/backupStatistics')
+    @HasAnyRoles('admin')
+    async backupStatistics(){
+        return await this.taskService.backupStatistics()
+    }
+
 }

+ 100 - 1
src/task/task.service.ts

@@ -815,7 +815,8 @@ export class TaskService implements OnModuleInit {
             totalHoursYesterday: 0,
             totalHoursToday: 0,
             orderCountYesterday: 0,
-            orderCountToday: 0
+            orderCountToday: 0,
+            hourData: 0
         }
         await Promise.all([
             (async () => {
@@ -841,12 +842,33 @@ export class TaskService implements OnModuleInit {
                         .getRawOne()
                     res.orderCountToday = todayOrderCount.sum
                 } catch (e) {}
+            })(),
+            (async () => {
+                try {
+                    res.hourData = await this.sentHourStatistics()
+                } catch (e) {}
             })()
         ])
 
         return res
     }
 
+    async sentHourStatistics() {
+        const result = await this.taskItemRepository.query(`
+            SELECT SUM(c) / 60 AS hour
+            FROM (
+                SELECT 1 AS c, UNIX_TIMESTAMP(sendAt) DIV 60 * 60 AS "time"
+                FROM task_item
+                WHERE sendAt >= CURDATE() - INTERVAL 1 DAY
+                AND sendAt < CURDATE()
+                AND status != 'idle'
+                GROUP BY time
+                ) tmp
+        `)
+
+        return Number(result[0]?.hour) || 0
+    }
+
     async sentCountryStatistics(req: any) {
         let where = {}
         if (req.user.roles.includes('api') || req.user.roles.includes('superApi')) {
@@ -900,6 +922,83 @@ export class TaskService implements OnModuleInit {
         }
     }
 
+    async backupStatistics() {
+        const res = {
+            todayData: null,
+            totalData: null,
+            yesterdayData: null
+        }
+
+        await Promise.all([
+            (async () => {
+                try {
+                    // 总备份数量,剩余未使用备份数量
+                    res.totalData = await this.rcsNumberRepository
+                        .createQueryBuilder()
+                        .select('COUNT(1)', 'count')
+                        .addSelect('stockFlag', 'stockFlag')
+                        .where('stockFlag IN (:...stockFlags)', { stockFlags: [1, 2, 3] })
+                        .groupBy('stockFlag')
+                        .getRawMany()
+                } catch (e) {
+                    console.log(e)
+                }
+            })(),
+            (async () => {
+                try {
+                    // 昨日备份使用成功数量,失败数量
+                    res.yesterdayData = await this.rcsNumberRepository
+                        .createQueryBuilder()
+                        .select('COUNT(1)', 'count')
+                        .addSelect('stockFlag', 'stockFlag')
+                        .where('createdAt >= CURDATE() - INTERVAL 1 DAY')
+                        .andWhere('createdAt < CURDATE()')
+                        .andWhere('stockFlag IN (:...stockFlags)', { stockFlags: [1, 2, 3] })
+                        .groupBy('stockFlag')
+                        .getRawMany()
+                } catch (e) {
+                    console.log(e)
+                }
+            })(),
+            (async () => {
+                try {
+                    // 当天备份数量
+                    res.todayData = await this.rcsNumberRepository
+                        .createQueryBuilder()
+                        .select('COUNT(1)', 'count')
+                        .addSelect('stockFlag', 'stockFlag')
+                        .where('createdAt >= CURDATE()')
+                        .andWhere('stockFlag IN (:...stockFlags)', { stockFlags: [1, 2, 3] })
+                        .groupBy('stockFlag')
+                        .getRawMany()
+                } catch (e) {
+                    console.log(e)
+                }
+            })()
+        ])
+
+        return [
+            {
+                flag: '剩余备份',
+                yesterday: res.yesterdayData?.find((item) => item.stockFlag === 1)?.count ?? 0,
+                today: res.todayData?.find((item) => item.stockFlag === 1)?.count ?? 0,
+                total: res.totalData?.find((item) => item.stockFlag === 1)?.count ?? 0
+            },
+            {
+                flag: '使用成功',
+                yesterday: res.yesterdayData?.find((item) => item.stockFlag === 2)?.count ?? 0,
+                today: res.todayData?.find((item) => item.stockFlag === 2)?.count ?? 0,
+                total: res.totalData?.find((item) => item.stockFlag === 2)?.count ?? 0
+            },
+            {
+                flag: '使用失败',
+                yesterday: res.yesterdayData?.find((item) => item.stockFlag === 3)?.count ?? 0,
+                today: res.todayData?.find((item) => item.stockFlag === 3)?.count ?? 0,
+                total: res.totalData?.find((item) => item.stockFlag === 3)?.count ?? 0
+            }
+        ]
+    }
+
     async getSuccessNum(id: number) {
         return await this.taskItemRepository.count({
             where: {