(task: SendTask)
| 316 | |
| 317 | const taskName = `sendat_${task.task_id}`; |
| 318 | // Guard: delete any zombie cron from a previous generation before re-registering |
| 319 | if (cronManager.has(taskName)) { |
| 320 | cronManager.del(taskName); |
| 321 | } |
| 322 | |
| 323 | if (task.interval) { |
| 324 | if (task.cron) { |
| 325 | // 定时任务(每天固定时间) |
| 326 | const cronExpression = `${task.second} ${task.minute} ${task.hour} * * *`; |
| 327 | cronManager.set(taskName, cronExpression, async () => { |
| 328 | await this.executeTask(task); |
| 329 | }); |
| 330 | } else { |
| 331 | // 间隔任务 |
| 332 | const intervalMs = |
| 333 | (parseInt(task.hour) * 3600 + |
| 334 | parseInt(task.minute) * 60 + |
| 335 | parseInt(task.second)) * 1000; |
| 336 | |
| 337 | if (intervalMs > 0) { |
| 338 | // 使用cron表达式模拟间隔任务 |
| 339 | const seconds = parseInt(task.second); |
| 340 | const minutes = parseInt(task.minute); |
| 341 | const hours = parseInt(task.hour); |
| 342 | |
| 343 | let cronExpression = ''; |
| 344 | if (hours > 0) { |
| 345 | cronExpression = `${seconds} ${minutes} */${hours} * * *`; |
| 346 | } else if (minutes > 0) { |
| 347 | cronExpression = `${seconds} */${minutes} * * * *`; |
| 348 | } else { |
| 349 | cronExpression = `*/${seconds} * * * * *`; |
| 350 | } |
| 351 | |
| 352 | cronManager.set(taskName, cronExpression, async () => { |
| 353 | await this.executeTask(task); |
| 354 | }); |
| 355 | } |
| 356 | } |
| 357 | } else { |
| 358 | // 单次任务 - 使用cron表达式指定具体时间 |
| 359 | const now = new Date(); |
| 360 | const targetTime = new Date(); |
| 361 | targetTime.setHours(parseInt(task.hour), parseInt(task.minute), parseInt(task.second)); |
| 362 | |
| 363 | if (targetTime <= now) { |
| 364 | targetTime.setDate(targetTime.getDate() + 1); |
| 365 | } |
| 366 | |
| 367 | const cronExpression = `${targetTime.getSeconds()} ${targetTime.getMinutes()} ${targetTime.getHours()} ${targetTime.getDate()} ${targetTime.getMonth() + 1} *`; |
| 368 | |
| 369 | cronManager.set(taskName, cronExpression, async () => { |
| 370 | await this.executeTask(task); |
| 371 | // 单次任务执行后删除 |
| 372 | await this.removeTask(task.task_id); |
| 373 | }); |
| 374 | } |
| 375 | } |
no test coverage detected