feat: 任务离线设备自动跳过(serial/分组模式触发时过滤 STF 池离线设备,默认开启,任务编辑器可勾选关闭)
This commit is contained in:
@@ -252,7 +252,7 @@ self.set_progress(done=5, total=80, unit="视频",
|
|||||||
| Tab | 功能 | 可见性 |
|
| Tab | 功能 | 可见性 |
|
||||||
|-----|------|--------|
|
|-----|------|--------|
|
||||||
| 监控 | 设备状态大屏:在线/离线、运行任务、当前动作、进度条、前台 App、截图、停止 | 所有登录用户(设备操作按钮需"设备控制"权限) |
|
| 监控 | 设备状态大屏:在线/离线、运行任务、当前动作、进度条、前台 App、截图、停止 | 所有登录用户(设备操作按钮需"设备控制"权限) |
|
||||||
| 任务 | 子分栏:任务计划(CRUD/启用停用/立即执行/下次运行时间)、自定义动作(打包复用) | 所有登录用户可看,写操作需"任务管理"权限 |
|
| 任务 | 子分栏:任务计划(CRUD/启用停用/立即执行/下次运行时间/**离线设备自动跳过**)、自定义动作(打包复用) | 所有登录用户可看,写操作需"任务管理"权限 |
|
||||||
| 分组 | 设备分组管理:创建/编辑/删除分组 | 所有登录用户可看,写操作需"任务管理"权限 |
|
| 分组 | 设备分组管理:创建/编辑/删除分组 | 所有登录用户可看,写操作需"任务管理"权限 |
|
||||||
| 日志 | 实时日志查看:按模块切换(core/task/web/action) | 需"日志查看"权限 |
|
| 日志 | 实时日志查看:按模块切换(core/task/web/action) | 需"日志查看"权限 |
|
||||||
| 用户 | 用户管理:创建/删除/修改密码/分配权限 | 仅管理员 |
|
| 用户 | 用户管理:创建/删除/修改密码/分配权限 | 仅管理员 |
|
||||||
|
|||||||
+23
-8
@@ -146,15 +146,30 @@ class TaskJob:
|
|||||||
"""根据 target 解析出实际要跑的 serial 列表。"""
|
"""根据 target 解析出实际要跑的 serial 列表。"""
|
||||||
mode = self.target.get("mode", "all")
|
mode = self.target.get("mode", "all")
|
||||||
if mode == "serial":
|
if mode == "serial":
|
||||||
return [self.target["serial"]]
|
serials = [self.target["serial"]]
|
||||||
if mode == "group":
|
elif mode == "group":
|
||||||
g = manager.groups.get(self.target.get("group_name"))
|
g = manager.groups.get(self.target.get("group_name"))
|
||||||
return list(g.serials) if g else []
|
serials = list(g.serials) if g else []
|
||||||
# all:返回所有空闲设备
|
else:
|
||||||
try:
|
# all:返回所有空闲设备(天然只含在线设备)
|
||||||
return [d["serial"] for d in manager.stf.list_free_devices()]
|
try:
|
||||||
except Exception:
|
return [d["serial"] for d in manager.stf.list_free_devices()]
|
||||||
return []
|
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 扫描器 ==================
|
# ================== 前台 App 扫描器 ==================
|
||||||
|
|||||||
@@ -1045,6 +1045,10 @@ async function saveTask(jobId){
|
|||||||
catch(e){showToast('参数 JSON 格式错误','error');return;}
|
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 targetMode=document.getElementById('f-target_mode').value;
|
||||||
const target={mode:targetMode};
|
const target={mode:targetMode};
|
||||||
if(targetMode==='group')target.group_name=document.getElementById('f-target_group').value;
|
if(targetMode==='group')target.group_name=document.getElementById('f-target_group').value;
|
||||||
|
|||||||
@@ -104,6 +104,10 @@ function openTaskModal(jobId){
|
|||||||
'<div id="f-target_serial_wrap" class="form-group" style="margin-top:8px;margin-bottom:0">'+
|
'<div id="f-target_serial_wrap" class="form-group" style="margin-top:8px;margin-bottom:0">'+
|
||||||
'<select class="form-control" id="f-target_serial"><option value="">选择设备...</option>'+dl+'</select>'+
|
'<select class="form-control" id="f-target_serial"><option value="">选择设备...</option>'+dl+'</select>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
|
'<div class="form-check" style="margin-top:8px">'+
|
||||||
|
'<input type="checkbox" id="f-skip_offline" '+(j.params&&j.params.skip_offline===false?'':'checked')+'>'+
|
||||||
|
'<label for="f-skip_offline">离线设备自动跳过(推荐)</label>'+
|
||||||
|
'</div>'+
|
||||||
'</div>'+
|
'</div>'+
|
||||||
'<div class="form-row">'+
|
'<div class="form-row">'+
|
||||||
'<div class="form-group"><label>调度方式</label>'+
|
'<div class="form-group"><label>调度方式</label>'+
|
||||||
|
|||||||
Reference in New Issue
Block a user