diff --git a/static/admin/monitor.js b/static/admin/monitor.js index 4d82363..2e5a9b3 100644 --- a/static/admin/monitor.js +++ b/static/admin/monitor.js @@ -94,9 +94,13 @@ async function stopLocate(serial){ } // 批量亮屏/息屏所有在线设备(息屏会中断运行中任务,前端已确认) +// 亮屏/息屏:优先作用于勾选设备;未勾选则作用于全部在线设备 async function screenAllDevices(mode){ - if(mode==='off'&&!confirm('确定让所有在线设备息屏?\n\n运行中的任务会因屏幕熄灭而中断,请谨慎操作。'))return; - const r=await apiPost('/api/device/screen_all',{mode:mode}); + const label=(mode==='on'?'亮屏':'息屏'); + const selected=Array.from(_selectedSerials); + const target=selected.length?('选中设备 '+selected.length+' 台'):'全部在线设备'; + if(!confirm(label+':将作用于'+target+'。\n\n'+(mode==='off'?'息屏会中断运行中的任务(u2 无法操作),':'')+'确认继续吗?'))return; + const r=await apiPost('/api/device/screen_all',{mode:mode,serials:selected.length?selected:undefined}); if(!r)return; if(r.ok)showToast((mode==='off'?'已息屏':'已亮屏')+' '+r.success+'/'+r.total+' 台设备','success'); else showToast(r.error||'操作失败','error'); @@ -298,7 +302,8 @@ function renderDevices(){ // 5秒自动刷新时若设备数据/分页/搜索/排序/定位状态都没变化,跳过整表重渲染(避免DOM抖动) const _st=_lp('devices'); const _sig=JSON.stringify({d:_statusData.devices,p:_st.page,k:_st.kw,s:_st.sort, - l:[..._locatingSerials].sort().join(',')}); + l:[..._locatingSerials].sort().join(','), + sel:[..._selectedSerials].sort().join(',')}); if(_sig===_devicesSig)return; _devicesSig=_sig; // 排序由 applyListPager 统一处理(sortValue + _lpSort) diff --git a/web_server.py b/web_server.py index dc8635c..0408dd8 100644 --- a/web_server.py +++ b/web_server.py @@ -634,16 +634,23 @@ def api_device_locate_stop(): @app.route("/api/device/screen_all", methods=["POST"]) @perm_required(PERM_DEVICES) def api_device_screen_all(): - """批量亮屏/息屏所有在线设备(并发)。mode: on=亮屏解锁 / off=息屏。 + """批量亮屏/息屏(并发)。mode: on=亮屏解锁 / off=息屏。 + 请求可带 serials 指定设备(前端勾选);不带则作用于全部在线设备。 息屏会中断运行中的任务(u2 无法操作),前端已有确认提示。 """ data = request.json or {} mode = data.get("mode", "on") try: - serials = device_pool.list_online() + online = set(device_pool.list_online()) except Exception as e: return jsonify({"ok": False, "error": f"获取设备列表失败: {e}"}), 502 + serials = data.get("serials") or [] + if serials: + # 指定设备:过滤掉不在线的(离线设备操作无意义,直接跳过) + serials = [s for s in serials if s in online] + else: + serials = list(online) if not serials: return jsonify({"ok": False, "error": "无在线设备"}), 400