wuyi 1 год назад
Родитель
Сommit
f7321548ec
4 измененных файлов с 66 добавлено и 42 удалено
  1. 1 0
      package.json
  2. 4 0
      src/task/entities/task-item.entity.ts
  3. 9 34
      src/task/task.controller.ts
  4. 52 8
      src/task/task.service.ts

+ 1 - 0
package.json

@@ -68,6 +68,7 @@
     "ioredis": "^5.3.2",
     "isomorphic-fetch": "^3.0.0",
     "keyv": "^4.5.2",
+    "moment": "^2.30.1",
     "mysql2": "^3.1.2",
     "nestjs-typeorm-paginate": "^4.0.3",
     "nodemailer": "^6.9.1",

+ 4 - 0
src/task/entities/task-item.entity.ts

@@ -26,4 +26,8 @@ export class TaskItem {
 
     @Column({ type: 'enum', enum: TaskItemStatus, nullable: false, default: TaskItemStatus.IDLE })
     status: string
+
+    @CreateDateColumn()
+    sendAt: Date
+
 }

+ 9 - 34
src/task/task.controller.ts

@@ -1,14 +1,15 @@
 import { Body, Controller, Delete, HttpException, HttpStatus, Param, Post, Put, Req, Res } from '@nestjs/common'
 import { PageRequest } from 'src/common/dto/page-request'
-import { Task } from './entities/task.entity'
+import { Task, TaskStatus } from './entities/task.entity'
 import { TaskService } from './task.service'
-import { TaskItem } from './entities/task-item.entity'
-import * as ExcelJS from 'exceljs';
-import { Response } from 'express';
+import { TaskItem, TaskItemStatus } from './entities/task-item.entity'
+import * as ExcelJS from 'exceljs'
+import { Response } from 'express'
 
 @Controller('task')
 export class TaskController {
-    constructor(private readonly taskService: TaskService) {}
+    constructor(private readonly taskService: TaskService) {
+    }
 
     @Post('/')
     async findAllTask(@Body() page: PageRequest<Task>) {
@@ -41,37 +42,11 @@ export class TaskController {
     }
 
     @Post('/item/:taskId/receipt')
-    async exportTaskItem(@Param('taskId') taskId: number, @Res() res: Response) {
+    async exportTaskItem(@Param('taskId') taskId: number) {
         try {
-            const taskItems = await this.taskService.getExportTaskItem(taskId);
-
-            const workbook = new ExcelJS.Workbook();
-            const worksheet = workbook.addWorksheet('Phone List');
-
-
-            worksheet.columns = [{ header: '手机号', key: 'number' }];
-
-
-            taskItems.forEach(item => {
-                worksheet.addRow({ item });
-            });
-
-            res.setHeader(
-                'Content-Type',
-                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
-            );
-            res.setHeader(
-                'Content-Disposition',
-                `attachment; filename=task_phone_list.xlsx`,
-            );
-
-            return workbook.xlsx.write(res).then(() => {
-                res.end();
-            });
+            return await this.taskService.exportTaskItem(taskId)
         } catch (error) {
-            // 处理可能的错误
-            console.error(error);
-            res.status(500).send('Error exporting list to Excel');
+            console.error(error)
         }
     }
 

+ 52 - 8
src/task/task.service.ts

@@ -14,6 +14,8 @@ import { SysConfigService } from '../sys-config/sys-config.service'
 import { Users } from '../users/entities/users.entity'
 import { Balance } from '../balance/entities/balance.entities'
 import { ta } from 'date-fns/locale'
+import * as ExcelJS from 'exceljs'
+import * as moment from 'moment'
 
 @Injectable()
 export class TaskService implements OnModuleInit {
@@ -31,7 +33,8 @@ export class TaskService implements OnModuleInit {
         private readonly phoneListService: PhoneListService,
         private readonly deviceService: DeviceService,
         private readonly sysConfigService: SysConfigService
-    ) {}
+    ) {
+    }
 
     onModuleInit() {
         this.taskRepository.update({ status: TaskStatus.PENDING }, { status: TaskStatus.IDLE })
@@ -138,15 +141,47 @@ export class TaskService implements OnModuleInit {
         }
     }
 
-    async getExportTaskItem(id: number) {
-        // 查询数据
+    async exportTaskItem(taskId: number) {
+        const workbook = new ExcelJS.Workbook()
+        const worksheet = workbook.addWorksheet('Sheet1')
+
         const taskItems = await this.taskItemRepository.find({
             where: {
-                taskId: id
+                taskId: taskId
             }
         })
 
-        return taskItems
+        // 设置列头
+        worksheet.columns = [
+            { header: '手机号', key: 'number', width: 30, style: { alignment: { horizontal: 'center' } } },
+            { header: '是否有效', key: 'isValid', width: 15, style: { alignment: { horizontal: 'center' } } },
+            { header: '发送成功', key: 'status', width: 15, style: { alignment: { horizontal: 'center' } } },
+            {
+                header: '发送时间',
+                key: 'sendAt',
+                width: 30,
+                style: { alignment: { horizontal: 'center' }, numFmt: 'YYYY-MM-DD HH:mm:ss' }
+            }
+        ]
+
+        taskItems.forEach(item => {
+            let valid = '有效'
+            let status = '发送成功'
+            const sendAt: Date = item.sendAt
+            const formattedSendAt = moment(sendAt).format('YYYY-MM-DD HH:mm:ss');
+            if (item.status === TaskItemStatus.FAIL) {
+                valid = '无效'
+                status = ''
+            }
+            worksheet.addRow({
+                number: item.number,
+                isValid: valid,
+                status: status,
+                sendAt: formattedSendAt
+            })
+        })
+
+        return await workbook.xlsx.writeBuffer()
     }
 
     async runTask(task: Task) {
@@ -253,7 +288,10 @@ export class TaskService implements OnModuleInit {
                         Logger.error('Task timeout', 'RcsService')
                         await this.taskItemRepository.update(
                             taskItems.map((i) => i.id),
-                            { status: TaskItemStatus.FAIL }
+                            {
+                                status: TaskItemStatus.FAIL,
+                                sendAt: new Date()
+                            }
                         )
                     } else {
                         Logger.log(
@@ -261,10 +299,16 @@ export class TaskService implements OnModuleInit {
                             'RcsService'
                         )
                         if (res.success?.length > 0) {
-                            await this.taskItemRepository.update(res.success, { status: TaskItemStatus.SUCCESS })
+                            await this.taskItemRepository.update(res.success, {
+                                status: TaskItemStatus.SUCCESS,
+                                sendAt: new Date()
+                            })
                         }
                         if (res.fail?.length > 0) {
-                            await this.taskItemRepository.update(res.fail, { status: TaskItemStatus.FAIL })
+                            await this.taskItemRepository.update(res.fail, {
+                                status: TaskItemStatus.FAIL,
+                                sendAt: new Date()
+                            })
                         }
                     }
                 })