瀏覽代碼

fix: 修复APP查询问题 和 建大设备缓存问题

jackzhou 5 月之前
父節點
當前提交
9fdb1e8fb1

+ 2 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/offline/DeviceOfflineDetectionService.java

@@ -111,7 +111,8 @@ public class DeviceOfflineDetectionService {
 //        log.info("查找出从来没上线的设备都统一都下线处理");
 //        monitorTargetService.updateStatusbatch(deviceCodes);
 //    }
-    @Scheduled(fixedRate = 300000) // 每 5 分钟运行一次
+
+    @Scheduled(fixedRate = 300000, initialDelay = 60000) // 每 5 分钟运行一次
     public void checkDeviceStatus() {
         log.info("开始自动检测设备在线状态...");
         Map<String, Integer> deviceCodes = new LinkedHashMap<>();

+ 5 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/cache/monitordevice/MonitorDeviceCacheInitializer.java

@@ -1,5 +1,6 @@
 package vip.xiaonuo.coldchain.core.cache.monitordevice;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.CommandLineRunner;
@@ -31,8 +32,10 @@ public class MonitorDeviceCacheInitializer implements CommandLineRunner {
 
     private void updateDeviceCache() {
         try {
-            // 获取设备列表
-            List<MonitorDevice> deviceList = monitorDeviceService.list();
+            // 获取设备列表 只缓存建大仁科的设备
+            LambdaQueryWrapper<MonitorDevice> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.likeRight(MonitorDevice::getModelName, "RS");
+            List<MonitorDevice> deviceList = monitorDeviceService.list(queryWrapper);
             if (deviceList.isEmpty()) {
                 log.warn("采集设备列表为空,未进行缓存更新");
                 return;  // 设备列表为空,跳过缓存更新

+ 7 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/param/AppDeviceUpdateParam.java

@@ -80,4 +80,11 @@ public class AppDeviceUpdateParam {
      */
     @Schema(description = "告警接收人,存储告警通知的接收用户信息")
     private List<SensorAlarmUser> alarmUsers;
+
+    /**
+     * 设备下线预警
+     */
+    @Schema(description = "设备下线预警")
+    private Boolean deviceOfflineAlarm;
+
 }

+ 2 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java

@@ -59,8 +59,6 @@ public class AppDeviceService {
         List<AppDevice> rlt = Lists.newArrayList();
         // 创建监控目标分页查询参数对象
         MonitorTargetPageParam monitorTargetPageParam = new MonitorTargetPageParam();
-        // 获取当前登录用户的 ID,并设置到查询参数中
-//        monitorTargetPageParam.setUserId(StpLoginUserUtil.getLoginUser().getId());
         // 设置分页参数:当前页和每页记录数
         monitorTargetPageParam.setCurrent(appDevicePageParam.getCurrent());
         monitorTargetPageParam.setSize(appDevicePageParam.getSize());
@@ -68,7 +66,7 @@ public class AppDeviceService {
         monitorTargetPageParam.setName(appDevicePageParam.getName());
         monitorTargetPageParam.setRoomId(appDevicePageParam.getRoomId());
         // 调用 monitorTargetService 查询当前用户的监控目标数据,分页结果
-        Page<MonitorTarget> pageByUser = monitorTargetService.getPageByUser(monitorTargetPageParam);
+        Page<MonitorTarget> pageByUser = monitorTargetService.selectMonitorTargetByPage(monitorTargetPageParam);
         // 遍历监控目标分页记录
         pageByUser.getRecords().forEach(monitorTarget -> {
             // 创建新的 AppDevice 对象来存储转换后的设备信息
@@ -387,6 +385,7 @@ public class AppDeviceService {
         monitorTargetRegion.setIgnoreStartTime(appDeviceAlarmParam.getIgnoreStartTime());
         monitorTargetRegion.setIgnoreEndTime(appDeviceAlarmParam.getIgnoreEndTime());
         monitorTargetRegion.setAlarmUsers(appDeviceAlarmParam.getAlarmUsers());
+        monitorTargetRegion.setDeviceOfflineAlarm(appDeviceAlarmParam.getDeviceOfflineAlarm());
         return monitorTargetRegionService.updateById(monitorTargetRegion);
     }
 }

+ 9 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/MonitorTargetMapper.java

@@ -13,8 +13,10 @@
 package vip.xiaonuo.coldchain.modular.monitortarget.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
 import vip.xiaonuo.coldchain.modular.monitortarget.entity.StatusCount;
+import vip.xiaonuo.coldchain.modular.monitortarget.param.MonitorTargetPageParam;
 
 import java.util.List;
 
@@ -26,4 +28,11 @@ import java.util.List;
  **/
 public interface MonitorTargetMapper extends BaseMapper<MonitorTarget> {
     List<StatusCount> getCountByStatus(String name,String roomId,String orgId);
+    /**
+     * 使用 MonitorTargetPageParam 对象进行分页查询
+     *
+     * @param monitorTargetPageParam 查询参数对象,封装了所有查询条件
+     * @return MonitorTarget 列表
+     */
+    List<MonitorTarget> selectMonitorTargetByPage(@Param("param") MonitorTargetPageParam monitorTargetPageParam);
 }

+ 59 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/mapping/MonitorTargetMapper.xml

@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="vip.xiaonuo.coldchain.modular.monitortarget.mapper.MonitorTargetMapper">
+    <resultMap id="MonitorTargetResultMap" type="vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget">
+        <result column="alarm_users" property="alarmUsers" javaType="java.util.List" typeHandler="vip.xiaonuo.coldchain.core.handler.SensorAlarmUserTypeHandler"/>
+        <result column="notification_channel" property="notificationChannel" javaType="java.util.List" typeHandler="vip.xiaonuo.coldchain.core.handler.NotificationChannelListTypeHandler"/>
+    </resultMap>
 
     <select id="getCountByStatus" resultType="vip.xiaonuo.coldchain.modular.monitortarget.entity.StatusCount">
         select status, count(`status`) as count
@@ -21,4 +25,59 @@
         group by status
     </select>
 
+
+    <!-- 查询 MonitorTarget 列表 -->
+    <select id="selectMonitorTargetByPage" resultMap="MonitorTargetResultMap">
+        SELECT t.*
+        FROM monitor_target t
+        LEFT JOIN monitor_target_region r ON r.monitor_target_id = t.id
+        WHERE 1=1
+        <!-- 过滤条件:MonitorTarget 删除标志 -->
+        AND t.DELETE_FLAG = 'NOT_DELETE'
+        <!-- 过滤条件:monitor_target_region 删除标志 -->
+        AND r.DELETE_FLAG = 'NOT_DELETE'
+        <!-- 动态条件:按名称模糊查询 -->
+        <if test="param.name != null and param.name.trim() != ''">
+            AND t.name LIKE CONCAT('%', #{param.name}, '%')
+        </if>
+        <!-- 动态条件:按创建用户查询 -->
+        <if test="param.userId != null and param.userId.trim() != ''">
+            AND t.create_user = #{param.userId}
+        </if>
+        <!-- 动态条件:按房间ID查询 -->
+        <if test="param.roomId != null and param.roomId.trim() != ''">
+            AND t.room_id = #{param.roomId}
+        </if>
+        <!-- 动态条件:按机构ID查询 -->
+        <if test="param.orgId != null and param.orgId.trim() != ''">
+            AND t.create_org = #{param.orgId}
+        </if>
+        <if test="param.orgId == null or param.orgId.trim() == ''">
+            AND t.create_org = #{param.orgId}
+        </if>
+        <!-- 动态条件:按 sensor_code 或 name 模糊查询 -->
+        <if test="param.searchKey != null and param.searchKey.trim() != ''">
+            AND (r.sensor_code LIKE CONCAT('%', #{param.searchKey}, '%')
+            OR r.name LIKE CONCAT('%', #{param.searchKey}, '%'))
+        </if>
+        <!-- 动态排序 -->
+        <choose>
+            <when test="param.sortField != null and param.sortField.trim() != '' and param.sortOrder != null and param.sortOrder.trim() != ''">
+                ORDER BY ${param.sortField}
+                <if test="param.sortOrder == 'asc'">
+                    ASC
+                </if>
+                <if test="param.sortOrder == 'desc'">
+                    DESC
+                </if>
+            </when>
+            <otherwise>
+                ORDER BY t.status ASC, t.name ASC
+            </otherwise>
+        </choose>
+        <!-- 分页 -->
+        LIMIT #{param.offset}, #{param.size}
+    </select>
+
+
 </mapper>

+ 6 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/param/MonitorTargetPageParam.java

@@ -79,4 +79,10 @@ public class MonitorTargetPageParam {
      */
     @Schema(description = "房间id")
     private String roomId;
+
+    // 计算分页偏移量
+    public int getOffset() {
+        return (current - 1) * size;  // 当前页 - 1 乘以每页条数
+    }
+
 }

+ 2 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java

@@ -143,4 +143,6 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
     TargetRoom getRoomByMonitorTargetId(String monitorTargetId);
 
     void updateStatusbatch(Map<String,Integer> deviceCodes);
+
+    Page<MonitorTarget> selectMonitorTargetByPage(MonitorTargetPageParam monitorTargetPageParam);
 }

+ 36 - 10
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java

@@ -166,25 +166,30 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
 
     @Override
     public void updateStatusbatch(Map<String, Integer> notInPairs) {
-        // 构建查询条件
+        // 构建查询建大仁科条件
         LambdaQueryWrapper<MonitorTargetRegion> queryWrapper = new LambdaQueryWrapper<>();
-        // 将每个 (deviceCode, sensorRoute) 组合转换为 "deviceCode:sensorRoute" 格式的字符串
-        List<String> notInConditions = notInPairs.entrySet().stream()
-                .map(entry -> entry.getKey() + ":" + entry.getValue())
-                .collect(Collectors.toList());
-        queryWrapper.notIn(MonitorTargetRegion::getDeviceCodeAndSensorRoute, notInConditions);
+        queryWrapper.likeRight(MonitorTargetRegion::getModelName, "RS");
+        if(!notInPairs.isEmpty()){
+            // 将每个 (deviceCode, sensorRoute) 组合转换为 "deviceCode:sensorRoute" 格式的字符串
+            List<String> notInConditions = notInPairs.entrySet().stream()
+                    .map(entry -> entry.getKey() + ":" + entry.getValue())
+                    .collect(Collectors.toList());
+            if(!notInConditions.isEmpty()){
+                queryWrapper.notIn(MonitorTargetRegion::getDeviceCodeAndSensorRoute, notInConditions);
+            }
+        }
         // 查询不符合条件的 MonitorTargetRegion
         List<MonitorTargetRegion> targetRegions = monitorTargetRegionService.list(queryWrapper);
         // 使用 stream 过滤出 deviceCode 不为空的 monitorTargetId 列表
-        List<String> monitorTargetIds = targetRegions.stream()
+        Set<String> monitorTargetIds = targetRegions.stream()
                 .filter(monitorTargetRegion -> monitorTargetRegion.getDeviceCode() != null)
                 .map(MonitorTargetRegion::getMonitorTargetId) // 提取 monitorTargetId
-                .toList();
+                .collect(Collectors.toSet());
         // 批量更新状态
         if (!monitorTargetIds.isEmpty()) {
             LambdaUpdateWrapper<MonitorTarget> updateWrapper = new LambdaUpdateWrapper<>();
-            updateWrapper.in(MonitorTarget::getId, monitorTargetIds); // 条件:monitorTargetId 在列表中
-            updateWrapper.set(MonitorTarget::getStatus, MonitorStatusEnum.OFF.getCode()); // 设置状态为 OFF
+            updateWrapper.in(MonitorTarget::getId, monitorTargetIds);
+            updateWrapper.set(MonitorTarget::getStatus, MonitorStatusEnum.OFF.getCode());
             // 执行批量更新
             boolean updateResult = this.update(updateWrapper);
             if (updateResult) {
@@ -197,6 +202,19 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         }
     }
 
+    @Override
+    public Page<MonitorTarget> selectMonitorTargetByPage(MonitorTargetPageParam monitorTargetPageParam) {
+        if (StrUtil.isBlank(monitorTargetPageParam.getOrgId())) {
+            monitorTargetPageParam.setOrgId(StpLoginUserUtil.getLoginUser().getOrgId());
+        }
+        List<MonitorTarget> list = monitorTargetMapper.selectMonitorTargetByPage(monitorTargetPageParam);
+        // 构造分页结果
+        Page<MonitorTarget> page = new Page<>(monitorTargetPageParam.getCurrent(), monitorTargetPageParam.getSize());
+        page.setRecords(list);
+        // 如果需要查询总数,可以再查询一遍总数
+        return page;
+    }
+
 
     @Transactional(rollbackFor = Exception.class)
     @Override
@@ -241,6 +259,13 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         return monitorTargetList;
     }
 
+
+    /**
+     * jackzhou 重写 2025-1-7 新方法 selectMonitorTargetByPage
+     * @param monitorTargetPageParam
+     * @return
+     */
+    @Deprecated
     @Override
     public Page<MonitorTarget> getPageByUser(MonitorTargetPageParam monitorTargetPageParam) {
         QueryWrapper<MonitorTarget> queryWrapper = new QueryWrapper<MonitorTarget>().checkSqlInjection();
@@ -273,6 +298,7 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
             monitorTarget.setRoomName(targetRoomService.queryEntity(monitorTarget.getRoomId()).getName());
         });
         return rlt;
+
     }
 
     @Override

+ 2 - 2
snowy-web-app/src/main/resources/application.properties

@@ -135,8 +135,8 @@ spring.data.redis.lettuce.pool.min-idle=0
 #########################################
 # mybatis-plus configuration
 #########################################
-mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
-#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
+#mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
+mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.slf4j.Slf4jImpl
 mybatis-plus.configuration.jdbc-type-for-null=null
 mybatis-plus.global-config.banner=false
 mybatis-plus.global-config.enable-sql-runner=true