Procházet zdrojové kódy

feat:新增首页统计接口
feat:新增首页预警列表接口
fix:修改编辑检测器/检测器类型,数据校验逻辑

黄渊昊 před 6 měsíci
rodič
revize
d5fa32d30c

+ 11 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/controller/MonitorDeviceController.java

@@ -30,6 +30,7 @@ import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceEditParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceIdParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.CountEntity;
 import vip.xiaonuo.common.annotation.CommonLog;
 import vip.xiaonuo.common.pojo.CommonResult;
 
@@ -160,4 +161,14 @@ public class MonitorDeviceController {
         }
         return CommonResult.ok();
     }
+
+    /**
+     * 获取首页统计信息
+     */
+    @Operation(summary = "获取首页统计信息")
+    @SaCheckPermission("/coldchain/monitordevice/getIndexCount")
+    @GetMapping("/coldchain/monitordevice/getIndexCount")
+    public CommonResult<CountEntity> getIndexCount() {
+        return CommonResult.data(monitorDeviceService.getIndexCount());
+    }
 }

+ 6 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/MonitorDeviceService.java

@@ -23,6 +23,7 @@ import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceAddParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceEditParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceIdParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.CountEntity;
 
 import java.time.Instant;
 import java.util.Date;
@@ -104,4 +105,9 @@ public interface MonitorDeviceService extends IService<MonitorDevice> {
     boolean getByDeviceName(String deviceName);
 
     boolean getByDeviceCode(String deviceCode);
+
+    /**
+     * 获取首页统计信息
+     */
+    CountEntity getIndexCount();
 }

+ 58 - 2
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevice/service/impl/MonitorDeviceServiceImpl.java

@@ -41,6 +41,7 @@ import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceEditParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDeviceIdParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.param.MonitorDevicePageParam;
 import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
+import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.CountEntity;
 import vip.xiaonuo.coldchain.modular.monitordevicetype.entity.MonitorDeviceType;
 import vip.xiaonuo.coldchain.modular.monitordevicetype.service.MonitorDeviceTypeService;
 import vip.xiaonuo.coldchain.modular.monitortargetregion.service.MonitorTargetRegionService;
@@ -139,13 +140,48 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         return !devices.isEmpty() ? true : false;
     }
 
+    public List<MonitorDevice> getDeviceByDeviceName(String deviceName) {
+        return this.list(new LambdaQueryWrapper<MonitorDevice>()
+                .eq(MonitorDevice::getDeviceName, deviceName).eq(MonitorDevice::getDeleteFlag,CommonDeleteFlagEnum.NOT_DELETE));
+    }
+
+    public List<MonitorDevice> getDeviceByDeviceCode(String deviceCode) {
+        return this.list(new QueryWrapper<MonitorDevice>().eq("device_code", deviceCode));
+    }
+
 
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(MonitorDeviceEditParam monitorDeviceEditParam) {
         MonitorDevice monitorDevice = this.queryEntity(monitorDeviceEditParam.getId());
         BeanUtil.copyProperties(monitorDeviceEditParam, monitorDevice);
-        this.updateById(monitorDevice);
+        List<MonitorDevice> deviceByDeviceName = this.getDeviceByDeviceName(monitorDevice.getDeviceName());
+        for (MonitorDevice device : deviceByDeviceName) {
+            if (!device.getId().equals(monitorDeviceEditParam.getId())) {
+                throw new CommonException("设备名已注册使用:{}", monitorDevice.getDeviceName());
+            }
+        }
+        List<MonitorDevice> deviceByDeviceCode = this.getDeviceByDeviceCode(monitorDevice.getDeviceCode());
+        for (MonitorDevice device : deviceByDeviceCode) {
+            if (!device.getId().equals(monitorDeviceEditParam.getId())) {
+                throw new CommonException("设备编码已注册使用:{}", monitorDevice.getDeviceCode());
+            }
+        }
+        boolean update = this.updateById(monitorDevice);
+        // 召唤设备默认参数
+        if (update) {
+            try {
+                // 调用设备配置参数接口
+                renKeService.callParamIds(Integer.parseInt(monitorDevice.getDeviceCode()));
+            } catch (NumberFormatException e) {
+                // 如果设备编码不能解析为整数,抛出异常或记录日志
+                throw new CommonException("设备编码解析失败,无法发送配置参数。设备编码: " + monitorDevice.getDeviceCode(), e + "请输入整数编码");
+            }
+        } else {
+            throw new CommonException("设备保存失败,设备编码: " + monitorDevice.getDeviceCode());
+        }
+        //缓存整形的设备编号和设备型号到缓存
+        monitorDeviceCache.cacheDevice(monitorDevice.getDeviceCode(), monitorDevice.getModelName());
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -224,6 +260,7 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
     }
 
     // 通用更新方法,避免代码重复,并处理 timestamp 为空的情况
+
     private boolean updateDeviceTimeByDeviceId(Integer deviceId, Date timestamp, String timeField) {
         if (timestamp == null) {
             // 如果 timestamp 为空,使用当前系统时间
@@ -247,7 +284,6 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
         // 更新设备信息
         return this.updateById(device);
     }
-
     @Override
     public List<SensorData> queryDataByDeviceIdAndRoads(String deviceId, Integer roads, String startTime, String endTime) {
         return sensorDataService.queryDataByDeviceIdAndRoads(deviceId, roads, startTime, endTime);
@@ -263,4 +299,24 @@ public class MonitorDeviceServiceImpl extends ServiceImpl<MonitorDeviceMapper, M
 //        return sensorDataService.querySensorData(deviceId, roads, startTime, endTime, queryConditions);
         return null;
     }
+
+    @Override
+    public CountEntity getIndexCount() {
+        CountEntity countEntity = new CountEntity();
+        countEntity.setDeviceCount((int)count());
+        LambdaQueryWrapper<MonitorDevice> onlineDeviceQueryWrapper = new LambdaQueryWrapper<>();
+        onlineDeviceQueryWrapper.eq(MonitorDevice::getStatus, MonitorDeviceStatusEnum.NORMAL.getValue()).eq(MonitorDevice::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        LambdaQueryWrapper<MonitorDevice> offlineDeviceIdQueryWrapper = new LambdaQueryWrapper<>();
+        offlineDeviceIdQueryWrapper.eq(MonitorDevice::getStatus, MonitorDeviceStatusEnum.UNUSED.getValue()).eq(MonitorDevice::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        countEntity.setOnlineDeviceCount((int)count(onlineDeviceQueryWrapper));
+        Integer sensorCount = 0;
+        List<MonitorDevice> monitorDeviceList = list();
+        for (MonitorDevice monitorDevice : monitorDeviceList) {
+            sensorCount += monitorDevice.getSensorCount();
+        }
+        countEntity.setSensorCount(sensorCount);
+        countEntity.setUsedSensorCount(monitorTargetRegionService.getUsedSensorCount());
+        countEntity.setUnusedSensorCount(sensorCount - countEntity.getUsedSensorCount());
+        return countEntity;
+    }
 }

+ 38 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/entity/CountEntity.java

@@ -0,0 +1,38 @@
+package vip.xiaonuo.coldchain.modular.monitordevicetype.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class CountEntity {
+    /**
+     * 设备总数
+     */
+    private Integer deviceCount;
+
+    /**
+     * 正常设备数
+     */
+    private Integer onlineDeviceCount;
+
+    /**
+     * 离线设备数
+     */
+    private Integer offlineDeviceCount;
+
+    /**
+     * 总路数
+     */
+    private Integer sensorCount;
+
+    /**
+     * 已使用路数
+     */
+    private Integer usedSensorCount;
+
+    /**
+     * 未使用路数
+     */
+    private Integer unusedSensorCount;
+}

+ 22 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitordevicetype/service/impl/MonitorDeviceTypeServiceImpl.java

@@ -95,11 +95,33 @@ public class MonitorDeviceTypeServiceImpl extends ServiceImpl<MonitorDeviceTypeM
         return !types.isEmpty();
     }
 
+    public List<MonitorDeviceType> getTypeByName(String name) {
+        return this.list(new LambdaQueryWrapper<MonitorDeviceType>()
+                .eq(MonitorDeviceType::getName, name).eq(MonitorDeviceType::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE));
+    }
+
+    public List<MonitorDeviceType> getTypeByCode(String code) {
+        return this.list(new LambdaQueryWrapper<MonitorDeviceType>()
+                .eq(MonitorDeviceType::getCode, code).eq(MonitorDeviceType::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE));
+    }
+
     @Transactional(rollbackFor = Exception.class)
     @Override
     public void edit(MonitorDeviceTypeEditParam monitorDeviceTypeEditParam) {
         MonitorDeviceType monitorDeviceType = this.queryEntity(monitorDeviceTypeEditParam.getId());
         BeanUtil.copyProperties(monitorDeviceTypeEditParam, monitorDeviceType);
+        List<MonitorDeviceType> deviceByDeviceName = this.getTypeByName(monitorDeviceType.getName());
+        for (MonitorDeviceType deviceType : deviceByDeviceName) {
+            if (!deviceType.getId().equals(monitorDeviceTypeEditParam.getId())) {
+                throw new CommonException("设备名已注册使用:{}", deviceType.getName());
+            }
+        }
+        List<MonitorDeviceType> deviceByDeviceCode = this.getTypeByCode(monitorDeviceType.getCode());
+        for (MonitorDeviceType deviceType : deviceByDeviceCode) {
+            if (!deviceType.getId().equals(monitorDeviceTypeEditParam.getId())) {
+                throw new CommonException("设备编码已注册使用:{}", deviceType.getCode());
+            }
+        }
         this.updateById(monitorDeviceType);
     }
 

+ 16 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/controller/MonitorNoticeController.java

@@ -120,4 +120,20 @@ public class MonitorNoticeController {
     public CommonResult<MonitorNotice> detail(@Valid MonitorNoticeIdParam monitorNoticeIdParam) {
         return CommonResult.data(monitorNoticeService.detail(monitorNoticeIdParam));
     }
+
+    /**
+     * 获取监控通知列表
+     *
+     * @author 黄渊昊
+     */
+    @Operation(summary = "获取监控通知列表")
+    @SaCheckPermission("/coldchain/monitornotice/list")
+    @GetMapping("/coldchain/monitornotice/list")
+    public CommonResult<List<MonitorNotice>> list() {
+        return CommonResult.data(monitorNoticeService.list());
+    }
+
+    /**
+     *
+     */
 }

+ 4 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitortargetregion/service/MonitorTargetRegionService.java

@@ -102,4 +102,8 @@ public interface MonitorTargetRegionService extends IService<MonitorTargetRegion
 
     MonitorTargetRegion findOneByDeviceCodeAndSensorNo(String deviceCode,Integer sensorNo);
 
+    /**
+     * 获取已使用总路数
+     */
+    Integer getUsedSensorCount();
 }

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

@@ -205,6 +205,11 @@ public class MonitorTargetRegionServiceImpl extends ServiceImpl<MonitorTargetReg
         return getOne(queryWrapper);
     }
 
+    @Override
+    public Integer getUsedSensorCount() {
+        return (int)count();
+    }
+
     private void fillParentLocationInfo(List<MonitorTargetRegion> resourceList) {
         if (CollUtil.isNotEmpty(resourceList)) {
             List<MonitorTargetRegion> locationTypes = resourceList.stream().filter(distinctByKey(MonitorTargetRegion::getParentId)).collect(Collectors.toList());