diff --git a/backend/iot-device/src/main/java/com/iot/device/service/impl/DeviceServiceImpl.java b/backend/iot-device/src/main/java/com/iot/device/service/impl/DeviceServiceImpl.java index fe7a17d..0d2cb11 100644 --- a/backend/iot-device/src/main/java/com/iot/device/service/impl/DeviceServiceImpl.java +++ b/backend/iot-device/src/main/java/com/iot/device/service/impl/DeviceServiceImpl.java @@ -154,8 +154,19 @@ public class DeviceServiceImpl extends ServiceImpl impleme .eq(StringUtils.hasText(query.getParentDeviceId()), Device::getParentDeviceId, query.getParentDeviceId()) .eq(query.getIsGateway() != null, Device::getIsGateway, query.getIsGateway()) // 产品维度过滤:支持按 productId 精确查,或按产品名/编码模糊查 - .eq(query.getProductId() != null && query.getProductId() > 0, Device::getProductId, query.getProductId()) - .orderByDesc(Device::getUpdateTime); + .eq(query.getProductId() != null && query.getProductId() > 0, Device::getProductId, query.getProductId()); + + // 排序策略按视角区分: + // - member(APP / 小程序):按 id 升序,设备位置固定。 + // 原先按 update_time desc,而设备每次上报状态/DP 都会刷新 update_time, + // 于是「点了 JD2BTSA 的开关 → 它立刻跳到 JD6BTSA 前面」,用户心智里 + // 常用设备的位置是固定的,不能因为一次操作就重排。 + // - admin(后台管理):按 update_time desc,最近更新的排前面,便于管理员排查。 + if (query.getOwnerId() != null && query.getOwnerId() > 0) { + wrapper.orderByAsc(Device::getId); + } else { + wrapper.orderByDesc(Device::getUpdateTime); + } // 按产品关键字过滤:先解析出匹配的 product_id 集合,再约束 device if (StringUtils.hasText(query.getProductKeyword())) {