diff --git a/README.md b/README.md index 5500c1d..32cf875 100644 --- a/README.md +++ b/README.md @@ -252,7 +252,7 @@ self.set_progress(done=5, total=80, unit="视频", | Tab | 功能 | 可见性 | |-----|------|--------| | 监控 | 设备状态大屏:在线/离线、运行任务、当前动作、进度条、前台 App、截图、停止 | 所有登录用户(设备操作按钮需"设备控制"权限) | -| 任务 | 子分栏:任务计划(CRUD/启用停用/立即执行/下次运行时间)、自定义动作(打包复用) | 所有登录用户可看,写操作需"任务管理"权限 | +| 任务 | 子分栏:任务计划(CRUD/启用停用/立即执行/下次运行时间/**离线设备自动跳过**)、自定义动作(打包复用) | 所有登录用户可看,写操作需"任务管理"权限 | | 分组 | 设备分组管理:创建/编辑/删除分组 | 所有登录用户可看,写操作需"任务管理"权限 | | 日志 | 实时日志查看:按模块切换(core/task/web/action) | 需"日志查看"权限 | | 用户 | 用户管理:创建/删除/修改密码/分配权限 | 仅管理员 | diff --git a/core/task_manager.py b/core/task_manager.py index 894cd39..78862de 100644 --- a/core/task_manager.py +++ b/core/task_manager.py @@ -146,15 +146,30 @@ class TaskJob: """根据 target 解析出实际要跑的 serial 列表。""" mode = self.target.get("mode", "all") if mode == "serial": - return [self.target["serial"]] - if mode == "group": + serials = [self.target["serial"]] + elif mode == "group": g = manager.groups.get(self.target.get("group_name")) - return list(g.serials) if g else [] - # all:返回所有空闲设备 - try: - return [d["serial"] for d in manager.stf.list_free_devices()] - except Exception: - return [] + serials = list(g.serials) if g else [] + else: + # all:返回所有空闲设备(天然只含在线设备) + try: + return [d["serial"] for d in manager.stf.list_free_devices()] + except Exception: + return [] + # 离线自动跳过(serial/group 模式):跳过 STF 池里不在线(present=False)的设备, + # 避免对离线设备反复尝试占用后报"设备离线"。默认开启,可在任务编辑器取消勾选。 + if serials and self.params.get("skip_offline", True): + try: + online = {d["serial"] for d in manager.stf.list_all_devices() + if d.get("present") and d.get("ready")} + except Exception: + online = None # STF 查询失败时不过滤,维持原行为 + if online is not None: + skipped = [s for s in serials if s not in online] + if skipped: + _log.info(f"任务 {self.name} 离线自动跳过 {len(skipped)} 台设备: {skipped}") + serials = [s for s in serials if s in online] + return serials # ================== 前台 App 扫描器 ================== diff --git a/static/admin/editor.js b/static/admin/editor.js index 065b95b..981a493 100644 --- a/static/admin/editor.js +++ b/static/admin/editor.js @@ -1045,6 +1045,10 @@ async function saveTask(jobId){ catch(e){showToast('参数 JSON 格式错误','error');return;} } + // 离线自动跳过(serial/group 模式):任务触发时跳过 STF 池中不在线的设备 + const skipEl=document.getElementById('f-skip_offline'); + params.skip_offline = skipEl?skipEl.checked:true; + const targetMode=document.getElementById('f-target_mode').value; const target={mode:targetMode}; if(targetMode==='group')target.group_name=document.getElementById('f-target_group').value; diff --git a/static/admin/tasks.js b/static/admin/tasks.js index b5d09ff..f840f44 100644 --- a/static/admin/tasks.js +++ b/static/admin/tasks.js @@ -104,6 +104,10 @@ function openTaskModal(jobId){ '