fix: 全选勾选不显示(renderDevices 签名缺选中状态导致防抖跳过渲染)+ 亮屏/息屏支持勾选设备(未勾选则全部在线,离线自动过滤)
This commit is contained in:
@@ -94,9 +94,13 @@ async function stopLocate(serial){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 批量亮屏/息屏所有在线设备(息屏会中断运行中任务,前端已确认)
|
// 批量亮屏/息屏所有在线设备(息屏会中断运行中任务,前端已确认)
|
||||||
|
// 亮屏/息屏:优先作用于勾选设备;未勾选则作用于全部在线设备
|
||||||
async function screenAllDevices(mode){
|
async function screenAllDevices(mode){
|
||||||
if(mode==='off'&&!confirm('确定让所有在线设备息屏?\n\n运行中的任务会因屏幕熄灭而中断,请谨慎操作。'))return;
|
const label=(mode==='on'?'亮屏':'息屏');
|
||||||
const r=await apiPost('/api/device/screen_all',{mode:mode});
|
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)return;
|
||||||
if(r.ok)showToast((mode==='off'?'已息屏':'已亮屏')+' '+r.success+'/'+r.total+' 台设备','success');
|
if(r.ok)showToast((mode==='off'?'已息屏':'已亮屏')+' '+r.success+'/'+r.total+' 台设备','success');
|
||||||
else showToast(r.error||'操作失败','error');
|
else showToast(r.error||'操作失败','error');
|
||||||
@@ -298,7 +302,8 @@ function renderDevices(){
|
|||||||
// 5秒自动刷新时若设备数据/分页/搜索/排序/定位状态都没变化,跳过整表重渲染(避免DOM抖动)
|
// 5秒自动刷新时若设备数据/分页/搜索/排序/定位状态都没变化,跳过整表重渲染(避免DOM抖动)
|
||||||
const _st=_lp('devices');
|
const _st=_lp('devices');
|
||||||
const _sig=JSON.stringify({d:_statusData.devices,p:_st.page,k:_st.kw,s:_st.sort,
|
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;
|
if(_sig===_devicesSig)return;
|
||||||
_devicesSig=_sig;
|
_devicesSig=_sig;
|
||||||
// 排序由 applyListPager 统一处理(sortValue + _lpSort)
|
// 排序由 applyListPager 统一处理(sortValue + _lpSort)
|
||||||
|
|||||||
+9
-2
@@ -634,16 +634,23 @@ def api_device_locate_stop():
|
|||||||
@app.route("/api/device/screen_all", methods=["POST"])
|
@app.route("/api/device/screen_all", methods=["POST"])
|
||||||
@perm_required(PERM_DEVICES)
|
@perm_required(PERM_DEVICES)
|
||||||
def api_device_screen_all():
|
def api_device_screen_all():
|
||||||
"""批量亮屏/息屏所有在线设备(并发)。mode: on=亮屏解锁 / off=息屏。
|
"""批量亮屏/息屏(并发)。mode: on=亮屏解锁 / off=息屏。
|
||||||
|
|
||||||
|
请求可带 serials 指定设备(前端勾选);不带则作用于全部在线设备。
|
||||||
息屏会中断运行中的任务(u2 无法操作),前端已有确认提示。
|
息屏会中断运行中的任务(u2 无法操作),前端已有确认提示。
|
||||||
"""
|
"""
|
||||||
data = request.json or {}
|
data = request.json or {}
|
||||||
mode = data.get("mode", "on")
|
mode = data.get("mode", "on")
|
||||||
try:
|
try:
|
||||||
serials = device_pool.list_online()
|
online = set(device_pool.list_online())
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
return jsonify({"ok": False, "error": f"获取设备列表失败: {e}"}), 502
|
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:
|
if not serials:
|
||||||
return jsonify({"ok": False, "error": "无在线设备"}), 400
|
return jsonify({"ok": False, "error": "无在线设备"}), 400
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user