From 2d1b10c7f3abd872f7e69ae9f9772db4c42fb49b Mon Sep 17 00:00:00 2001 From: butubb <1422726308@qq.com> Date: Wed, 19 Aug 2026 13:57:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=85=A8=E9=80=89=E5=8B=BE=E9=80=89?= =?UTF-8?q?=E4=B8=8D=E6=98=BE=E7=A4=BA=EF=BC=88renderDevices=20=E7=AD=BE?= =?UTF-8?q?=E5=90=8D=E7=BC=BA=E9=80=89=E4=B8=AD=E7=8A=B6=E6=80=81=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E9=98=B2=E6=8A=96=E8=B7=B3=E8=BF=87=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=EF=BC=89+=20=E4=BA=AE=E5=B1=8F/=E6=81=AF=E5=B1=8F=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=8B=BE=E9=80=89=E8=AE=BE=E5=A4=87=EF=BC=88=E6=9C=AA?= =?UTF-8?q?=E5=8B=BE=E9=80=89=E5=88=99=E5=85=A8=E9=83=A8=E5=9C=A8=E7=BA=BF?= =?UTF-8?q?=EF=BC=8C=E7=A6=BB=E7=BA=BF=E8=87=AA=E5=8A=A8=E8=BF=87=E6=BB=A4?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/admin/monitor.js | 11 ++++++++--- web_server.py | 11 +++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) 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