Parcourir la source

feat(监控数据 大屏展示与平面图展示): 增加查询大屏下房间列表与冰箱信息的接口,增加平面图展示接口

增加查询大屏下房间列表与冰箱信息的接口,增加平面图展示接口
zjian il y a 2 mois
Parent
commit
a88a18cd48

+ 80 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/controller/BiController.java

@@ -0,0 +1,80 @@
+package vip.xiaonuo.coldchain.modular.bi.controller;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.coldchain.modular.bi.dto.MonitorTargetBiDTO;
+import vip.xiaonuo.coldchain.modular.bi.dto.TargetRoomBiDTO;
+import vip.xiaonuo.coldchain.modular.bi.service.BiService;
+import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+import vip.xiaonuo.coldchain.modular.monitortarget.param.MonitorTargetPageParam;
+import vip.xiaonuo.coldchain.modular.targetroom.entity.TargetRoom;
+import vip.xiaonuo.coldchain.modular.targetroom.param.TargetRoomPageParam;
+import vip.xiaonuo.coldchain.modular.targetroom.service.TargetRoomService;
+import vip.xiaonuo.common.pojo.CommonResult;
+
+import java.util.List;
+
+/**
+ * 房间配置控制器
+ *
+ * @author zj
+ * @date 2025/8/14
+ */
+@Tag(name = "大屏展示")
+@RestController
+@Validated
+public class BiController {
+    @Resource
+    private BiService biService;
+
+    /**
+     * 获取大屏的房间列表
+     *
+     * @author zj
+     * @date 2025/8/14
+     */
+    @Operation(summary = "获取大屏的房间列表")
+    @SaCheckPermission("/coldchain/targetroom/page")
+    @GetMapping("/coldchain/bi/targetroom/list")
+    public CommonResult<List<TargetRoomBiDTO>> listTargetRoom() {
+        return CommonResult.data(biService.listTargetRoom());
+    }
+
+    /**
+     * 获取大屏的房间下设备
+     *
+     * @author zj
+     * @date 2025/8/14
+     */
+    @Operation(summary = "获取大屏的房间下设备")
+    @SaCheckPermission("/coldchain/monitortarget/page")
+    @GetMapping("/coldchain/bi/monitortarget/list")
+    public CommonResult<List<MonitorTargetBiDTO>> listMonitorTarget(@RequestParam String roomId) {
+        MonitorTargetPageParam monitorTargetPageParam = new MonitorTargetPageParam();
+        monitorTargetPageParam.setRoomId(roomId);
+        return CommonResult.data(biService.pageMonitorTarget(monitorTargetPageParam).getRecords());
+    }
+
+
+    /**
+     * 获取大屏的房间下设备
+     *
+     * @author zj
+     * @date 2025/8/14
+     */
+    @Operation(summary = "获取平面图展示数据")
+    @SaCheckPermission("/coldchain/monitortarget/page")
+    @GetMapping("/coldchain/bi/monitortarget/page")
+    public CommonResult<Page<MonitorTargetBiDTO>> pageMonitorTargetSensor(MonitorTargetPageParam monitorTargetPageParam) {
+        return CommonResult.data(biService.pageMonitorTarget(monitorTargetPageParam));
+    }
+
+
+}

+ 46 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/dto/MonitorTargetBiDTO.java

@@ -0,0 +1,46 @@
+package vip.xiaonuo.coldchain.modular.bi.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class MonitorTargetBiDTO  {
+    private Long id;
+    private String name;
+    /**
+     * 房间id
+     */
+    private String roomId;
+    /**
+     * 房间名
+     */
+    private String roomName;
+    /**
+     * 状态(1:正常,2:闲置)
+     */
+    private String status = "2";
+    /**
+     * 最后心跳时间
+     */
+    private Date lastHeartbeatTime;
+    /**
+     * 在线设备数量
+     */
+    private Integer onlineNum;
+    /**
+     * 离线设备数量
+     */
+    private Integer offlineNum;
+    /**
+     * 设备总数
+     */
+    private Integer allNum;
+    /**
+     * 设备信息
+     */
+    private List<MonitorTargetRegionBiDTO> regions;
+
+
+}

+ 18 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/dto/MonitorTargetRegionBiDTO.java

@@ -0,0 +1,18 @@
+package vip.xiaonuo.coldchain.modular.bi.dto;
+
+import lombok.Data;
+import vip.xiaonuo.coldchain.modular.monitornotice.entity.Realtime;
+
+import java.util.List;
+
+@Data
+public class MonitorTargetRegionBiDTO {
+    private Long id;
+    private String name;
+    /**
+     * 探头数据
+     */
+    private List<Realtime> realtimes;
+    private String updateTime;
+
+}

+ 26 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/dto/TargetRoomBiDTO.java

@@ -0,0 +1,26 @@
+package vip.xiaonuo.coldchain.modular.bi.dto;
+
+import lombok.Data;
+import vip.xiaonuo.coldchain.modular.targetroom.entity.TargetRoom;
+
+import java.io.Serial;
+
+@Data
+public class TargetRoomBiDTO extends TargetRoom {
+
+    @Serial
+    private static final long serialVersionUID = -6754227144289470403L;
+
+    /**
+     * 在线冰箱数量
+     */
+    private Integer onlineNum;
+    /**
+     * 离线冰箱数量
+     */
+    private Integer offlineNum;
+    /**
+     * 冰箱总数量
+     */
+    private Integer allNum;
+}

+ 186 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/bi/service/BiService.java

@@ -0,0 +1,186 @@
+package vip.xiaonuo.coldchain.modular.bi.service;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.coldchain.modular.bi.dto.MonitorTargetBiDTO;
+import vip.xiaonuo.coldchain.modular.bi.dto.MonitorTargetRegionBiDTO;
+import vip.xiaonuo.coldchain.modular.bi.dto.TargetRoomBiDTO;
+import vip.xiaonuo.coldchain.modular.monitordevice.service.MonitorDeviceService;
+import vip.xiaonuo.coldchain.modular.monitornotice.entity.Realtime;
+import vip.xiaonuo.coldchain.modular.monitornotice.param.RealtimeParam;
+import vip.xiaonuo.coldchain.modular.monitornotice.service.MonitorNoticeService;
+import vip.xiaonuo.coldchain.modular.monitortarget.entity.MonitorTarget;
+import vip.xiaonuo.coldchain.modular.monitortarget.enums.MonitorStatusEnum;
+import vip.xiaonuo.coldchain.modular.monitortarget.param.MonitorTargetPageParam;
+import vip.xiaonuo.coldchain.modular.monitortarget.service.MonitorTargetService;
+import vip.xiaonuo.coldchain.modular.monitortargetregion.entity.MonitorTargetRegion;
+import vip.xiaonuo.coldchain.modular.monitortargetregion.service.MonitorTargetRegionService;
+import vip.xiaonuo.coldchain.modular.targetroom.entity.TargetRoom;
+import vip.xiaonuo.coldchain.modular.targetroom.service.TargetRoomService;
+import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
+import vip.xiaonuo.common.enums.CommonSortOrderEnum;
+import vip.xiaonuo.common.page.CommonPageRequest;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+@Service
+public class BiService {
+    @Resource
+    private TargetRoomService targetRoomService;
+
+    @Resource
+    private MonitorTargetService monitorTargetService;
+
+    @Resource
+    private MonitorTargetRegionService monitorTargetRegionService;
+
+    @Resource
+    private MonitorNoticeService monitorNoticeService;
+
+    @Resource
+    private MonitorDeviceService monitorDeviceService;
+
+
+
+
+    public List<TargetRoomBiDTO> listTargetRoom() {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        QueryWrapper<TargetRoom> queryWrapper = new QueryWrapper<TargetRoom>().checkSqlInjection();
+        queryWrapper.lambda().eq(TargetRoom::getCreateOrg, loginUser.getOrgId()).eq(TargetRoom::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        queryWrapper.lambda().orderByAsc(TargetRoom::getSortCode).orderByAsc(TargetRoom::getId);
+        List<TargetRoom> targetRooms = targetRoomService.list(CommonPageRequest.defaultPage(), queryWrapper);
+        List<TargetRoomBiDTO> targetRoomBiDTOS = BeanUtil.copyToList(targetRooms, TargetRoomBiDTO.class);
+        targetRoomBiDTOS.stream().parallel().forEach(r->{
+            //统计在线 离线 总数
+            List<MonitorTarget> monitorTargets = monitorTargetService.getTargetListByRoom(r.getId());
+            long count = monitorTargets.stream().filter(t -> t.getStatus().equals(MonitorStatusEnum.ONLINE.getCode())).count();
+            r.setOnlineNum(Convert.toInt(count));
+            r.setOfflineNum(monitorTargets.size()-r.getOnlineNum());
+            r.setAllNum(monitorTargets.size());
+        });
+        return targetRoomBiDTOS;
+    }
+
+
+    public Page<MonitorTargetBiDTO> pageMonitorTarget(MonitorTargetPageParam monitorTargetPageParam) {
+        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+        QueryWrapper<MonitorTarget> queryWrapper = new QueryWrapper<MonitorTarget>().checkSqlInjection();
+        if (StrUtil.isNotBlank(monitorTargetPageParam.getName())) {
+            queryWrapper.lambda().like(MonitorTarget::getName, monitorTargetPageParam.getName());
+        }
+        if (StrUtil.isNotBlank(monitorTargetPageParam.getRoomId())) {
+            queryWrapper.lambda().eq(MonitorTarget::getRoomId, monitorTargetPageParam.getRoomId());
+        }
+        if (ObjectUtil.isAllNotEmpty(monitorTargetPageParam.getSortField(), monitorTargetPageParam.getSortOrder())) {
+            CommonSortOrderEnum.validate(monitorTargetPageParam.getSortOrder());
+            queryWrapper.orderBy(true, monitorTargetPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), StrUtil.toUnderlineCase(monitorTargetPageParam.getSortField()));
+        } else {
+            queryWrapper.lambda().orderByAsc(MonitorTarget::getId);
+        }
+        queryWrapper.lambda().eq(MonitorTarget::getCreateOrg, loginUser.getOrgId()).eq(MonitorTarget::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+        Page<MonitorTarget> monitorTargets = monitorTargetService.page(CommonPageRequest.defaultPage(), queryWrapper);
+        List<MonitorTargetBiDTO> monitorTargetBiDTOS = BeanUtil.copyToList(monitorTargets.getRecords(), MonitorTargetBiDTO.class);
+
+        monitorTargetBiDTOS.stream().parallel().forEach(monitorTarget -> {
+            //获取设备区域列表并赋值返回
+            List<MonitorTargetRegion> regions = monitorTargetRegionService.getRegionListByTargetId(monitorTarget.getId().toString());
+            //对区域设备进行按名称分组
+            Map<String, List<MonitorTargetRegion>> regionMap =
+                    regions.stream().collect(Collectors.groupingBy(MonitorTargetRegion::getName));
+            List<MonitorTargetRegionBiDTO> regionBiDTOS = new ArrayList<>(regionMap.size());
+            int onlineNum = 0;
+            //查询寻分组区域设备监控数据
+            for (Map.Entry<String, List<MonitorTargetRegion>> entry : regionMap.entrySet()) {
+                List<Realtime> realtimes = entry.getValue().stream().parallel().map(r -> {
+                    Realtime realtime = monitorNoticeService.getRealtime(new RealtimeParam(r.getMonitorDeviceId(), r.getSensorRoute()));
+                    realtime.setTemperatureUp(r.getTemperatureUp());
+                    realtime.setTemperatureDown(r.getTemperatureDown());
+                    realtime.setHumidityUp(r.getHumidityUp());
+                    realtime.setHumidityDown(r.getHumidityDown());
+                    realtime.setCo2Up(r.getCo2Up());
+                    realtime.setCo2Down(r.getCo2Down());
+                    realtime.setSensorRoute(r.getSensorRoute());
+                    realtime.setSensorType(r.getSensorType());
+                    realtime.setDeviceCode(r.getDeviceCode());
+                    return realtime;
+                }).collect(Collectors.toList());
+                MonitorTargetRegionBiDTO targetRegionBiDTO = new MonitorTargetRegionBiDTO();
+                targetRegionBiDTO.setName(entry.getKey());
+                targetRegionBiDTO.setRealtimes(realtimes);
+                targetRegionBiDTO.setUpdateTime(CollectionUtil.isNotEmpty(realtimes)?realtimes.get(0).getUpdateTime():"");
+                regionBiDTOS.add(targetRegionBiDTO);
+                onlineNum += realtimes.stream().filter(r->r!=null && r.getSensorData()!=null).count();
+            }
+            //查询冰箱所在房间
+            TargetRoom targetRoom = targetRoomService.getById(monitorTarget.getRoomId());
+            monitorTarget.setRoomName(targetRoom.getName());
+            monitorTarget.setRegions(regionBiDTOS);
+            monitorTarget.setLastHeartbeatTime(monitorTarget.getLastHeartbeatTime());
+            //统计在线 离线 总数
+            monitorTarget.setAllNum(regions.size());
+            monitorTarget.setOnlineNum(onlineNum);
+            monitorTarget.setOfflineNum(monitorTarget.getAllNum()-monitorTarget.getOnlineNum());
+        });
+        Page<MonitorTargetBiDTO> monitorTargetBiDTOPage = new Page<>(monitorTargets.getCurrent(), monitorTargets.getSize(), monitorTargets.getTotal());
+        monitorTargetBiDTOPage.setRecords(monitorTargetBiDTOS);
+        return monitorTargetBiDTOPage;
+    }
+
+
+//    public Page<MonitorTargetBiDTO> pageMonitorTargetSensor(MonitorTargetPageParam monitorTargetPageParam) {
+//        SaBaseLoginUser loginUser = StpLoginUserUtil.getLoginUser();
+//        QueryWrapper<MonitorTarget> queryWrapper = new QueryWrapper<MonitorTarget>().checkSqlInjection();
+//        if (StrUtil.isNotBlank(monitorTargetPageParam.getName())) {
+//            queryWrapper.lambda().like(MonitorTarget::getName, monitorTargetPageParam.getName());
+//        }
+//        if (StrUtil.isNotBlank(monitorTargetPageParam.getRoomId())) {
+//            queryWrapper.lambda().eq(MonitorTarget::getRoomId, monitorTargetPageParam.getRoomId());
+//        }
+//        if (ObjectUtil.isAllNotEmpty(monitorTargetPageParam.getSortField(), monitorTargetPageParam.getSortOrder())) {
+//            CommonSortOrderEnum.validate(monitorTargetPageParam.getSortOrder());
+//            queryWrapper.orderBy(true, monitorTargetPageParam.getSortOrder().equals(CommonSortOrderEnum.ASC.getValue()), StrUtil.toUnderlineCase(monitorTargetPageParam.getSortField()));
+//        } else {
+//            queryWrapper.lambda().orderByAsc(MonitorTarget::getId);
+//        }
+//        queryWrapper.lambda().eq(MonitorTarget::getCreateOrg, loginUser.getOrgId()).eq(MonitorTarget::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE);
+//        Page<MonitorTarget> monitorTargets = monitorTargetService.page(CommonPageRequest.defaultPage(), queryWrapper);
+//        List<MonitorTargetBiDTO> monitorTargetBiDTOS = BeanUtil.copyToList(monitorTargets.getRecords(), MonitorTargetBiDTO.class);
+//        //获取设备区域列表并赋值返回
+//        monitorTargetBiDTOS.stream().parallel().forEach(monitorTarget -> {
+//            List<MonitorTargetRegion> regions = monitorTargetRegionService.getRegionListByTargetId(monitorTarget.getId().toString());
+//            Map<String, List<MonitorTargetRegion>> collect =
+//                    regions.stream().collect(Collectors.groupingBy(MonitorTargetRegion::getName));
+//            List<MonitorTargetRegionBiDTO> regionBiDTOS = new ArrayList<>(collect.size());
+//            for (Map.Entry<String, List<MonitorTargetRegion>> entry : collect.entrySet()) {
+//                MonitorTargetRegionBiDTO targetRegionBiDTO = new MonitorTargetRegionBiDTO();
+//                List<Realtime> realtimes = entry.getValue().stream().parallel().map(r -> {
+//                    Realtime realtime = monitorNoticeService.getRealtime(new RealtimeParam(r.getMonitorDeviceId(), r.getSensorRoute()));
+//                    return realtime;
+//                }).collect(Collectors.toList());
+//                targetRegionBiDTO.setName(entry.getKey());
+//                targetRegionBiDTO.setRealtimes(realtimes);
+//                regionBiDTOS.add(targetRegionBiDTO);
+//            }
+//            TargetRoom targetRoom = targetRoomService.getById(monitorTarget.getRoomId());
+//            monitorTarget.setRoomName(targetRoom.getName());
+//            monitorTarget.setRegions(regionBiDTOS);
+//        });
+//        Page<MonitorTargetBiDTO> monitorTargetBiDTOPage = new Page<>(monitorTargets.getCurrent(), monitorTargets.getSize(), monitorTargets.getTotal());
+//        monitorTargetBiDTOPage.setRecords(monitorTargetBiDTOS);
+//        return monitorTargetBiDTOPage;
+//    }
+
+}

+ 46 - 0
snowy-plugin/snowy-plugin-coldchain/src/main/java/vip/xiaonuo/coldchain/modular/monitornotice/entity/Realtime.java

@@ -1,5 +1,6 @@
 package vip.xiaonuo.coldchain.modular.monitornotice.entity;
 
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Getter;
 import lombok.Setter;
 import vip.xiaonuo.coldchain.core.bean.influxdb.SensorData;
@@ -12,4 +13,49 @@ public class Realtime {
     private SensorData sensorData;
 
     private String updateTime;
+
+
+    /**
+     * 温度报警上限 temperature humidity co2
+     */
+    private Float temperatureUp;
+    /**
+     * 温度报警下限
+     */
+    private Float temperatureDown;
+
+    /**
+     * 湿度报警上限 temperature humidity co2
+     */
+
+    private Float humidityUp;
+    /**
+     * 湿度报警下限
+     */
+    private Float humidityDown;
+
+    /**
+     * 二氧化碳报警上限 temperature humidity co2
+     */
+    private Float co2Up;
+
+    /**
+     * 二氧化碳报警下限
+     */
+    private Float co2Down;
+
+
+    /**
+     * 传感器路数
+     */
+    private Integer sensorRoute;
+    /**
+     * 传感器类型
+     */
+    private String sensorType;
+    /**
+     * 冷链编号
+     */
+    private String deviceCode;
+
 }