feat: 后端添加定时任务与启动时任务

This commit is contained in:
DLmaster361
2025-09-21 15:11:14 +08:00
parent 7c34b3ca94
commit cb741c7b2e
5 changed files with 68 additions and 34 deletions

View File

@@ -24,7 +24,7 @@ import time
import asyncio import asyncio
from fastapi import APIRouter, WebSocket, WebSocketDisconnect from fastapi import APIRouter, WebSocket, WebSocketDisconnect
from app.core import Config, Broadcast from app.core import Config, Broadcast, TaskManager
from app.services import System from app.services import System
from app.models.schema import * from app.models.schema import *
@@ -44,6 +44,8 @@ async def connect_websocket(websocket: WebSocket):
last_ping = time.monotonic() last_ping = time.monotonic()
data = {} data = {}
await TaskManager.start_startup_queue()
while True: while True:
try: try:

View File

@@ -180,23 +180,6 @@ async def confirm_notice() -> OutBase:
# return InfoOut(data=data) # return InfoOut(data=data)
@router.post(
"/startuptask",
summary="获取启动时运行的队列ID",
response_model=InfoOut,
status_code=200,
)
async def get_startup_task() -> InfoOut:
try:
data = await Config.get_startup_task()
except Exception as e:
return InfoOut(
code=500, status="error", message=f"{type(e).__name__}: {str(e)}", data={}
)
return InfoOut(data={"queueIdList": data})
@router.post( @router.post(
"/webconfig", "/webconfig",
summary="获取配置分享中心的配置信息", summary="获取配置分享中心的配置信息",

View File

@@ -214,6 +214,13 @@ class QueueConfig(ConfigBase):
), ),
) )
self.Data_LastTimedStart = ConfigItem(
"Data",
"LastTimedStart",
"2000-01-01 00:00",
DateTimeValidator("%Y-%m-%d %H:%M"),
)
self.TimeSet = MultipleConfig([TimeSet]) self.TimeSet = MultipleConfig([TimeSet])
self.QueueItem = MultipleConfig([QueueItem]) self.QueueItem = MultipleConfig([QueueItem])
@@ -1998,19 +2005,6 @@ class AppConfig(GlobalConfig):
return remote_web_config return remote_web_config
async def get_startup_task(self):
"""获取启动时需要运行的队列信息"""
logger.info("获取启动时需要运行的队列信息")
data = [
str(uid)
for uid, queue in self.QueueConfig.items()
if queue.get("Info", "StartUpEnabled")
]
logger.success("启动时需要运行的队列信息获取成功")
return data
async def save_maa_log(self, log_path: Path, logs: list, maa_result: str) -> bool: async def save_maa_log(self, log_path: Path, logs: list, maa_result: str) -> bool:
""" """
保存MAA日志并生成对应统计数据 保存MAA日志并生成对应统计数据

View File

@@ -22,7 +22,7 @@
import uuid import uuid
import asyncio import asyncio
from functools import partial from functools import partial
from typing import Dict, Optional from typing import Dict, Optional, Literal
from .config import Config, MaaConfig, GeneralConfig, QueueConfig from .config import Config, MaaConfig, GeneralConfig, QueueConfig
from app.models.schema import WebSocketMessage from app.models.schema import WebSocketMessage
@@ -41,7 +41,9 @@ class _TaskManager:
self.task_dict: Dict[uuid.UUID, asyncio.Task] = {} self.task_dict: Dict[uuid.UUID, asyncio.Task] = {}
async def add_task(self, mode: str, uid: str) -> uuid.UUID: async def add_task(
self, mode: Literal["自动代理", "人工排查", "设置脚本"], uid: str
) -> uuid.UUID:
""" """
添加任务 添加任务
@@ -331,5 +333,22 @@ class _TaskManager:
).model_dump() ).model_dump()
) )
async def start_startup_queue(self):
"""开始运行启动时运行的调度队列"""
logger.info("开始运行启动时任务")
for uid, queue in Config.QueueConfig.items():
if queue.get("Info", "StartUpEnabled") and uid not in self.task_dict:
logger.info(f"启动时需要运行的队列:{uid}")
task_id = await TaskManager.add_task("自动代理", str(uid))
await Config.send_json(
WebSocketMessage(
id="TaskManager", type="Signal", data={"newTask": str(task_id)}
).model_dump()
)
logger.success("启动时任务开始运行")
TaskManager = _TaskManager() TaskManager = _TaskManager()

View File

@@ -24,7 +24,9 @@ from datetime import datetime
from app.services import Matomo, System from app.services import Matomo, System
from app.utils import get_logger from app.utils import get_logger
from .config import Config from app.models.schema import WebSocketMessage
from .config import Config, QueueConfig
from .task_manager import TaskManager
logger = get_logger("主业务定时器") logger = get_logger("主业务定时器")
@@ -39,6 +41,7 @@ class _MainTimer:
while True: while True:
await self.set_silence() await self.set_silence()
await self.timed_start()
await asyncio.sleep(1) await asyncio.sleep(1)
@@ -69,6 +72,39 @@ class _MainTimer:
await asyncio.sleep(3600) await asyncio.sleep(3600)
async def timed_start(self):
"""定时启动代理任务"""
curtime = datetime.now().strftime("%Y-%m-%d %H:%M")
for uid, queue in Config.QueueConfig.items():
if not isinstance(queue, QueueConfig) or not queue.get(
"Info", "TimeEnabled"
):
continue
# 避免重复调起任务
if curtime == Config.get("Data", "LastTimeStarted"):
continue
for time_set in queue.TimeSet.values():
if (
time_set.get("Info", "Enabled")
and curtime[11:16] == time_set.get("Info", "Time")
and uid not in Config.task_dict
):
logger.info(f"定时唤起任务:{uid}")
task_id = await TaskManager.add_task("自动代理", str(uid))
await Config.send_json(
WebSocketMessage(
id="TaskManager",
type="Signal",
data={"newTask": str(task_id)},
).model_dump()
)
async def set_silence(self): async def set_silence(self):
"""静默模式通过模拟老板键来隐藏模拟器窗口""" """静默模式通过模拟老板键来隐藏模拟器窗口"""