Pārlūkot izejas kodu

feat:修复部分缓存导致的数据不正确问题
feat:拆分properties文件
feat:新增一键清除缓存接口
fix:修复小程序搜索数据不准确bug
fix:修复小程序搜索后统计数量不对bug
fix:修复findOneByDeviceCodeAndSensorNo搜索条件不对
fix:修复预警
fix:小程序预警信息修复排序
fix:微信消息推送增加单位

黄渊昊 10 stundas atpakaļ
vecāks
revīzija
670f607aad
15 mainītis faili ar 240 papildinājumiem un 25 dzēšanām
  1. 80 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/bean/SensorThreshold.java
  2. 5 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmServiceImpl.java
  3. 56 3
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java
  4. 11 9
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/RedisSensorAlarmMessagePushService.java
  5. 35 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/impl/WechatMessagePushService.java
  6. 8 4
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/AppDeviceService.java
  7. 7 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/SimsService.java
  8. 10 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java
  9. 2 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/mapper/mapping/MonitorTargetMapper.xml
  10. 2 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/MonitorTargetService.java
  11. 13 0
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/service/impl/MonitorTargetServiceImpl.java
  12. 1 1
      snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java
  13. 3 3
      snowy-web-app/src/main/resources/application-master.properties
  14. 4 0
      snowy-web-app/src/main/resources/application-work-modbus.properties
  15. 3 2
      snowy-web-app/src/main/resources/application.properties

+ 80 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/bean/SensorThreshold.java

@@ -128,6 +128,86 @@ public class SensorThreshold {
     @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
     private Float pm10Down;
 
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float o3Up;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float o3Down;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float no2Up;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float no2Down;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float h2sUp;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float h2sDown;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float ch4Up;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float ch4Down;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float so2Up;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float so2Down;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float h2Up;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float h2Down;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float dBUp;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float dBDown;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float odorUp;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float odorDown;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float tspUp;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float tspDown;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float smokeUp;
+
+    @JsonSerialize(using = FloatNullToDashSerializer.class)
+    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "#.00")
+    private Float smokeDown;
+
     /**
      * 低电量报警下限
      */

+ 5 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/SensorAlarmServiceImpl.java

@@ -344,6 +344,10 @@ public class SensorAlarmServiceImpl extends ServiceImpl<SensorAlarmMapper, Senso
         if (Objects.nonNull(sensorAlarmSearchParam.getStartTime()) && Objects.nonNull(sensorAlarmSearchParam.getEndTime())) {
             Assert.isTrue(sensorAlarmSearchParam.getStartTime().before(sensorAlarmSearchParam.getEndTime()), "开始时间不能大于结束时间");
             queryWrapper.between(SensorAlarm::getCreateTime, sensorAlarmSearchParam.getStartTime(), sensorAlarmSearchParam.getEndTime());
+        } else {
+            Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.MONTH, -1);
+            queryWrapper.ge(SensorAlarm::getCreateTime, calendar.getTime());
         }
         queryWrapper.orderByDesc(SensorAlarm::getCreateTime);
         Page<SensorAlarm> page = this.page(CommonPageRequest.defaultPage(), queryWrapper);
@@ -432,6 +436,7 @@ public class SensorAlarmServiceImpl extends ServiceImpl<SensorAlarmMapper, Senso
             return page;
         } else {
             sensorAlarms = listByIds(page.getRecords().stream().map(SensorAlarm::getId).collect(Collectors.toList()));
+            sensorAlarms.sort((a, b) -> b.getCreateTime().compareTo(a.getCreateTime()));
         }
         page.setRecords(sensorAlarms);
 

+ 56 - 3
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/check/DefaultSensorAlarmChecker.java

@@ -4,6 +4,7 @@ import com.github.jfcloud.influxdb.util.InfluxDBDateFormatter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 import vip.xiaonuo.coldchain.core.alarm.bean.NotificationChannel;
 import vip.xiaonuo.coldchain.core.alarm.bean.SensorAlarm;
@@ -15,6 +16,7 @@ import vip.xiaonuo.coldchain.core.alarm.offline.DeviceOfflineDetectionService;
 import vip.xiaonuo.coldchain.core.alarm.service.messagepush.RedisSensorAlarmMessagePushService;
 import vip.xiaonuo.coldchain.core.alarm.service.threshold.SensorThresholdService;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
 import vip.xiaonuo.coldchain.core.event.SensorAlarmEvent;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
 
@@ -22,6 +24,7 @@ import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 @Component
 @RequiredArgsConstructor
@@ -33,7 +36,7 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
     private final ColdChainAlarmMessageProperties alarmMessageProperties;
     private final ApplicationEventPublisher applicationEventPublisher;
     private final RedisSensorAlarmMessagePushService redisSensorAlarmMessagePushService;
-
+    private final RedisTemplate<String, Object> redisTemplate;
     private final DeviceOfflineDetectionService deviceOfflineDetectionService;
 
     @Override
@@ -89,6 +92,42 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         if (noNull(sensorData.getBattery())) {
             alarmTriggered |= checkThreshold(sensorData.getBattery(), null, threshold.getBatteryDown(), "电量", monitorTargetRegion);
         }
+        if (noNull(sensorData.getCh2o())) {
+            alarmTriggered |= checkThreshold(sensorData.getCh2o(), threshold.getCh2oUp(), threshold.getCh2oDown(), "甲醛  ", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getO3())) {
+            alarmTriggered |= checkThreshold(sensorData.getO3(), threshold.getO3Up(), threshold.getO3Down(), "臭氧", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getH2s())) {
+            alarmTriggered |= checkThreshold(sensorData.getH2s(), threshold.getH2sUp(), threshold.getH2sDown(), "硫化氢", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getCh4())) {
+            alarmTriggered |= checkThreshold(sensorData.getCh4(), threshold.getCh4Up(), threshold.getCh4Down(), "甲烷", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getNo2())) {
+            alarmTriggered |= checkThreshold(sensorData.getNo2(), threshold.getNo2Up(), threshold.getNo2Down(), "二氧化氮", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getSo2())) {
+            alarmTriggered |= checkThreshold(sensorData.getSo2(), threshold.getSo2Up(), threshold.getSo2Down(), "二氧化硫", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getH2())) {
+            alarmTriggered |= checkThreshold(sensorData.getH2(), threshold.getH2Up(), threshold.getH2Down(), "氢气", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getH2s())) {
+            alarmTriggered |= checkThreshold(sensorData.getH2s(), threshold.getH2sUp(), threshold.getH2sDown(), "硫化氢", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getDB())) {
+            alarmTriggered |= checkThreshold(sensorData.getDB(), threshold.getDBUp(), threshold.getDBDown(), "噪声", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getOdor())) {
+            alarmTriggered |= checkThreshold(sensorData.getOdor(), threshold.getOdorUp(), threshold.getOdorDown(), "异味", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getTsp())) {
+            alarmTriggered |= checkThreshold(sensorData.getTsp(), threshold.getTspUp(), threshold.getTspDown(), "TSP", monitorTargetRegion);
+        }
+        if (noNull(sensorData.getSmoke())) {
+            alarmTriggered |= checkThreshold(sensorData.getSmoke(), threshold.getSmokeUp(), threshold.getSmokeDown(), "烟雾", monitorTargetRegion);
+        }
         return alarmTriggered;
     }
 
@@ -119,8 +158,17 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
             //todo
             // SensorAlarmType.DATA_RESTORE_ALARM
             if (redisSensorAlarmMessagePushService.hasExceededPushLimitLike(monitorTargetRegion.getId(), monitorTargetRegion.getSensorRoute(),type + "*")) {
-                publishAlarm(type + "恢复", value, unit, time, upperThreshold, monitorTargetRegion
-                        , SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode());
+                String key = generateAlarmHistoryKey(monitorTargetRegion.getId(), monitorTargetRegion.getSensorRoute(),  type + "*");
+                Set<String> keys = redisTemplate.keys(key);
+                for (String k : keys) {
+                    if (k.contains("过低")) {
+                        publishAlarm(type + "恢复", value, unit, time, lowerThreshold, monitorTargetRegion
+                                , SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode());
+                    } else if (k.contains("超标")) {
+                        publishAlarm(type + "恢复", value, unit, time, upperThreshold, monitorTargetRegion
+                                , SensorAlarmType.DATA_RESTORE_ALARM.getDeviceCode());
+                    }
+                }
                 alarmTriggered = true;
                 log.info("针对异常设备数据恢复?设备正常");
             }
@@ -128,6 +176,11 @@ public class DefaultSensorAlarmChecker implements SensorAlarmChecker {
         return alarmTriggered;
     }
 
+    private String generateAlarmHistoryKey(String deviceID, Integer sensorRoute, String alarmType) {
+        return JfcloudColdChainConstants.REDIS_ALARM_HISTORY_KEY_PREFIX
+                + ":" + deviceID + ":" + sensorRoute + ":" + alarmType;
+    }
+
 
     /**
      * 发布报警事件

+ 11 - 9
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/RedisSensorAlarmMessagePushService.java

@@ -50,11 +50,12 @@ public class RedisSensorAlarmMessagePushService {
         Long firstAlarmTimeForOnline = 0L;
 
         if (alarm.getType().equals("0") || alarm.getType().equals("1")) {
-            recordAlarmTime(deviceID, alarm.getSensorRoute(), alarm.getType());
+            recordAlarmTime(deviceID, alarm.getSensorRoute(), alarm.getAlarmType());
         } else if (alarm.getType().equals("2")) {
-            firstAlarmTimeForRecovery = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "0");
+            String substring = alarmType.substring(0, 2) + "*";
+            firstAlarmTimeForRecovery = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), substring);
         } else if (alarm.getType().equals("4")) {
-            firstAlarmTimeForOnline = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "1");
+            firstAlarmTimeForOnline = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "设备离线");
         }
 
         Map<String, SensorAlarmUser> users = Optional.ofNullable(alarm.getAlarmUsers()).orElse(Collections.emptyList()) // 如果为 null 则返回空集合
@@ -88,7 +89,7 @@ public class RedisSensorAlarmMessagePushService {
             if (hasExceededPushLimit(openId, deviceID, alarm.getSensorRoute(), alarmType)) {
                 log.info("用户 {} 对设备 {} 的告警类型 {} 在过去 {} 分钟内推送次数超过限制,跳过推送",
                         openId, deviceID, alarmType, JfcloudColdChainConstants.MESS_PUSH_TIME_WINDOW / 60 / 1000);
-                delAlarmTime(deviceID, alarm.getSensorRoute(), alarmType);
+//                delAlarmTime(deviceID, alarm.getSensorRoute(), alarmType);
                 continue;
             }
 
@@ -119,7 +120,8 @@ public class RedisSensorAlarmMessagePushService {
 //                                firstAlarmTime = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "0");
                                 b = pushService.sendAlarmRecoverMessage(alarm, firstAlarmTimeForRecovery);
                                 if (b) {
-                                    delAlarmTime(deviceID, alarm.getSensorRoute(), "0");
+                                    String substring = alarmType.substring(0, 2) + "*";
+                                    delAlarmTime(deviceID, alarm.getSensorRoute(), substring);
                                     delAlarmCount(openId, alarm.getSensorCode(), alarm.getSensorRoute(), "0");
                                 }
                                 break;
@@ -127,7 +129,7 @@ public class RedisSensorAlarmMessagePushService {
 //                                firstAlarmTime = (Long) getAlarmTime(deviceID, alarm.getSensorRoute(), "1");
                                 b = pushService.sendOnlineMessage(alarm, firstAlarmTimeForOnline);
                                 if (b) {
-                                    delAlarmTime(deviceID, alarm.getSensorRoute(), "1");
+                                    delAlarmTime(deviceID, alarm.getSensorRoute(), "设备离线");
                                     delAlarmCount(openId, alarm.getSensorCode(), alarm.getSensorRoute(), "1");
                                 }
                                 break;
@@ -183,8 +185,8 @@ public class RedisSensorAlarmMessagePushService {
         return pushTimes.size() >= JfcloudColdChainConstants.MESS_PUSH_MAX_PUSH_COUNT;
     }
 
-    public boolean hasExceededPushLimitLike(String sensorCode, Integer sensorRoute, String alarmType) {
-        String key = generateAlarmHistoryKey(sensorCode, sensorRoute, alarmType);
+    public boolean hasExceededPushLimitLike(String sensorCode, Integer sensorRoute, String type) {
+        String key = generateAlarmHistoryKey(sensorCode, sensorRoute, type);
         Set<String> keys = redisTemplate.keys(key);
         if (keys == null || keys.isEmpty()) {
             return false;
@@ -205,7 +207,7 @@ public class RedisSensorAlarmMessagePushService {
     /**
      * 检查是否超过推送区域限制
      *
-     * @param openid 用户OpenID
+     * @param openId 用户OpenID
      * @param sensorCode 设备ID
      * @param sensorRoute 传感器路由
      * @param alarmType 告警类型(0:数据异常, 1:设备离线, 2:恢复通知, 4:其他类型)

+ 35 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/core/alarm/service/messagepush/impl/WechatMessagePushService.java

@@ -24,13 +24,47 @@ public class WechatMessagePushService implements MessagePushService {
 
     @Override
     public boolean sendAlarmMessage(SensorAlarm alarm/*, SensorAlarmUser user*/) {
+        String unit = new String();
+        if (alarm.getAlarmType().contains("温度")) {
+            unit = "°C";
+        } else if (alarm.getAlarmType().contains("湿度") ||
+                alarm.getAlarmType().contains("电量")) {
+            unit = "%";
+        } else if (alarm.getAlarmType().contains("二氧化碳") ||
+                alarm.getAlarmType().contains("一氧化碳") ||
+                alarm.getAlarmType().contains("TVOC") ||
+                alarm.getAlarmType().contains("臭氧") ||
+                alarm.getAlarmType().contains("氢气") ||
+                alarm.getAlarmType().contains("硫化氢") ||
+                alarm.getAlarmType().contains("二氧化硫") ||
+                alarm.getAlarmType().contains("二氧化氮") ||
+                alarm.getAlarmType().contains("氨气") ||
+                alarm.getAlarmType().contains("异味") ||
+                alarm.getAlarmType().contains("烟雾")) {
+            unit = "ppm";
+        } else if (alarm.getAlarmType().contains("PM2.5") ||
+                alarm.getAlarmType().contains("PM10") ||
+                alarm.getAlarmType().contains("TSP") ||
+                alarm.getAlarmType().contains("甲醛")) {
+            unit = "ug/m3";
+        } else if (alarm.getAlarmType().contains("压力")) {
+            unit = "kPa";
+        } else if (alarm.getAlarmType().contains("光照")) {
+            unit = "Lux";
+        } else if (alarm.getAlarmType().contains("甲烷")) {
+            unit = "LEL";
+        } else if (alarm.getAlarmType().contains("噪声")) {
+            unit = "dB";
+        } else if (alarm.getAlarmType().contains("氧气")) {
+            unit = "VOL";
+        }
         AlarmPushParam pushParam = null;
         if (alarm.getValue() == 0 || alarm.getThreshold() == 0) {
             pushParam = new AlarmPushParam();
             pushParam.setValue("Device Offline or Power Failure");
         } else {
             //数据异常
-            pushParam = new AlarmPushParam(alarm.getValue() + "/" + alarm.getThreshold());
+            pushParam = new AlarmPushParam(alarm.getValue() + unit + "/" + alarm.getThreshold() + unit);
         }
         if (alarm.getMessage().length() > 17) {
             pushParam.setContext(alarm.getMessage().substring(0, 17) + "...");

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

@@ -720,11 +720,11 @@ public class AppDeviceService {
         updateField(appDeviceAlarmParam::getPm25Down, monitorTargetRegion::setPm25Down);
         updateField(appDeviceAlarmParam::getPm10Up, monitorTargetRegion::setPm10Up);
         updateField(appDeviceAlarmParam::getPm10Down, monitorTargetRegion::setPm10Down);
-        boolean falg = monitorTargetRegionService.updateById(monitorTargetRegion);
-        if (falg) {
+        boolean flag = monitorTargetRegionService.updateById(monitorTargetRegion);
+        if (flag) {
             jfcloudRedisCacheService.evictMonitorTargetRegionCache(monitorTargetRegion.getDeviceCode(), monitorTargetRegion.getSensorRoute());
         }
-        return falg;
+        return flag;
     }
 
     private <V> void updateField(Supplier<V> getter, Consumer<V> setter) {
@@ -787,7 +787,11 @@ public class AppDeviceService {
         monitorTargetRegion.setIgnoreEndTime(appDeviceAlarmParam.getIgnoreEndTime());
         monitorTargetRegion.setAlarmUsers(appDeviceAlarmParam.getAlarmUsers());
         monitorTargetRegion.setDeviceOfflineAlarm(appDeviceAlarmParam.getDeviceOfflineAlarm());
-        return monitorTargetRegionService.updateById(monitorTargetRegion);
+        boolean flag = monitorTargetRegionService.updateById(monitorTargetRegion);
+        if (flag) {
+            jfcloudRedisCacheService.evictMonitorTargetRegionCache(monitorTargetRegion.getDeviceCode(), monitorTargetRegion.getSensorRoute());
+        }
+        return flag;
     }
 
     private static final DecimalFormat TEMP_FORMAT = new DecimalFormat("0.0");

+ 7 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/app/service/SimsService.java

@@ -13,6 +13,7 @@ import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import org.springframework.stereotype.Service;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
+import vip.xiaonuo.coldchain.core.config.JfcloudRedisCacheService;
 import vip.xiaonuo.coldchain.modular.app.dto.DeviceDataDto;
 import vip.xiaonuo.coldchain.modular.app.param.AppDeviceQueryParams;
 import vip.xiaonuo.coldchain.modular.app.param.SensorEchartData;
@@ -35,6 +36,7 @@ import java.util.List;
 public class SimsService {
     private final MonitorDeviceService monitorDeviceService;
     private final AppDeviceService appDeviceService;
+    private final JfcloudRedisCacheService jfcloudRedisCacheService;
 
     @Resource
     private MonitorTargetService monitorTargetService;
@@ -88,6 +90,10 @@ public class SimsService {
         MonitorTargetRegion monitorTargetRegion = monitorTargetRegionService.findOneByDeviceCodeAndSensorNo(updateTargetParam.getSensorCode(), updateTargetParam.getSensorRoute());
         updateTargetParam.setId(monitorTargetRegion.getMonitorTargetId());
         MonitorTarget monitorTarget = BeanUtil.copyProperties(updateTargetParam, MonitorTarget.class);
-        return monitorTargetService.updateById(monitorTarget);
+        boolean flag = monitorTargetService.updateById(monitorTarget);
+        if (flag) {
+            jfcloudRedisCacheService.evictMonitorTargetRegionCache(monitorTargetRegion.getDeviceCode(), monitorTargetRegion.getSensorRoute());
+        }
+        return flag;
     }
 }

+ 10 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortarget/controller/MonitorTargetController.java

@@ -241,4 +241,14 @@ public class MonitorTargetController {
     public CommonResult<Map> list() {
         return CommonResult.data(monitorTargetService.countTargetByType());
     }
+
+    /**
+     * 清除缓存
+     */
+    @Operation(summary = "清除缓存")
+    @PostMapping("/coldchain/monitortarget/clearCache")
+    public CommonResult<String> clearCache() {
+        monitorTargetService.clearCache();
+        return CommonResult.ok();
+    }
 }

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

@@ -13,7 +13,7 @@
         FROM monitor_target t
         LEFT JOIN monitor_target_region r ON r.monitor_target_id = t.id
         WHERE t.DELETE_FLAG = 'NOT_DELETE'
---         AND r.DELETE_FLAG = 'NOT_DELETE'
+        AND r.DELETE_FLAG = 'NOT_DELETE'
 <!--        &lt;!&ndash; 动态条件:仅在 r 存在时检查 r 的 DELETE_FLAG &ndash;&gt;-->
 <!--        AND (r.DELETE_FLAG = 'NOT_DELETE' OR r.id IS NULL)-->
         <!-- 动态条件:按房间ID查询 -->
@@ -48,6 +48,7 @@
         FROM monitor_target t
         LEFT JOIN monitor_target_region r ON r.monitor_target_id = t.id
         WHERE t.DELETE_FLAG = 'NOT_DELETE'
+        AND r.DELETE_FLAG = 'NOT_DELETE'
         <!-- 动态条件:按名称或 sensor_code 或 name 模糊查询 -->
         <if test="param.type != null and param.type.trim() != ''">
             <if test="param.searchKey != null and param.searchKey.trim() != '' and searchFlag == 'false'">

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

@@ -187,4 +187,6 @@ public interface MonitorTargetService extends IService<MonitorTarget> {
      * @return {@link Map }
      */
     Map countTargetByType();
+
+    void clearCache();
 }

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

@@ -29,12 +29,15 @@ import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.Cache;
+import org.springframework.cache.CacheManager;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.coldchain.core.alarm.service.delay.DeviceAlertDelayService;
+import vip.xiaonuo.coldchain.core.config.JfcloudColdChainConstants;
 import vip.xiaonuo.coldchain.core.config.JfcloudRedisCacheService;
 import vip.xiaonuo.coldchain.modular.monitordevice.entity.MonitorDeviceTemplate;
 import vip.xiaonuo.coldchain.modular.monitordevice.handler.CustomCellWriteHandler;
@@ -86,6 +89,8 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
     private JfcloudRedisCacheService jfcloudRedisCacheService;
     @Resource
     private DeviceAlertDelayService delayService;
+    @Autowired
+    private CacheManager cacheManager;
 
     @Override
     public Page<MonitorTarget> page(MonitorTargetPageParam monitorTargetPageParam) {
@@ -585,5 +590,13 @@ public class MonitorTargetServiceImpl extends ServiceImpl<MonitorTargetMapper, M
         return result;
     }
 
+    @Override
+    public void clearCache() {
+        Cache cache = cacheManager.getCache(JfcloudColdChainConstants.MONITORTARGETREGION_CACHE_NAME);
+        if (cache != null) {
+            cache.clear();  // 清除该缓存名称下的所有键值对
+        }
+    }
+
 
 }

+ 1 - 1
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/impl/MonitorTargetRegionServiceImpl.java

@@ -236,7 +236,7 @@ public class MonitorTargetRegionServiceImpl extends ServiceImpl<MonitorTargetReg
     public MonitorTargetRegion findOneByDeviceCodeAndSensorNo(String deviceCode, Integer sensorNo) {
         // 查询条件封装
         LambdaQueryWrapper<MonitorTargetRegion> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(MonitorTargetRegion::getDeviceCode, deviceCode)
+        queryWrapper.eq(MonitorTargetRegion::getSensorCode, deviceCode)
                 .eq(MonitorTargetRegion::getSensorRoute, sensorNo)
                 .eq(MonitorTargetRegion::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
         MonitorTargetRegion monitorTargetRegion = getOne(queryWrapper,false);

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

@@ -1,7 +1,7 @@
 server.port=58888
 #\u516C\u7F51
-coldchain.port=0
+#coldchain.port=0
 #modbusTCP\u76D1\u542C\u63A5\u53E3
-coldchain.modbus-port=0
+#coldchain.modbus-port=9090
 #\u4E2D\u5357\u533B\u9662
-#coldchain.port=40404
+coldchain.port=40404

+ 4 - 0
snowy-web-app/src/main/resources/application-work-modbus.properties

@@ -0,0 +1,4 @@
+server.port=58890
+coldchain.port=0
+#modbusTCP\u76D1\u542C\u63A5\u53E3
+coldchain.modbus-port=9090

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

@@ -7,8 +7,9 @@ spring.main.allow-bean-definition-overriding=true
 #########################################
 # spring profiles configuration
 #########################################
-spring.profiles.active=master
-#spring.profiles.active=work
+#spring.profiles.active=master
+spring.profiles.active=work
+#spring.profiles.active=work-modbus
 
 #########################################
 # multipart configuration