Commit 53693529e1d06a417f7e1d8f9f68e0478cdb4fca
1 parent
8bcfd408
【代码评审】IoT:首页统计
Showing
13 changed files
with
46 additions
and
90 deletions
pom.xml
| @@ -16,7 +16,7 @@ | @@ -16,7 +16,7 @@ | ||
| 16 | <module>yudao-module-system</module> | 16 | <module>yudao-module-system</module> |
| 17 | <module>yudao-module-infra</module> | 17 | <module>yudao-module-infra</module> |
| 18 | <!-- <module>yudao-module-member</module>--> | 18 | <!-- <module>yudao-module-member</module>--> |
| 19 | -<!-- <module>yudao-module-bpm</module>--> | 19 | + <module>yudao-module-bpm</module> |
| 20 | <!-- <module>yudao-module-report</module>--> | 20 | <!-- <module>yudao-module-report</module>--> |
| 21 | <!-- <module>yudao-module-mp</module>--> | 21 | <!-- <module>yudao-module-mp</module>--> |
| 22 | <!-- <module>yudao-module-pay</module>--> | 22 | <!-- <module>yudao-module-pay</module>--> |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/statistics/IotStatisticsController.java
| @@ -36,43 +36,42 @@ public class IotStatisticsController { | @@ -36,43 +36,42 @@ public class IotStatisticsController { | ||
| 36 | @Resource | 36 | @Resource |
| 37 | private IotDeviceLogService deviceLogService; | 37 | private IotDeviceLogService deviceLogService; |
| 38 | 38 | ||
| 39 | - // TODO @super:description 非必要,可以不写哈 | ||
| 40 | @GetMapping("/get-summary") | 39 | @GetMapping("/get-summary") |
| 41 | - @Operation(summary = "获取IOT数据统计") | 40 | + @Operation(summary = "获取 IoT 数据统计") |
| 42 | public CommonResult<IotStatisticsSummaryRespVO> getIotStatisticsSummary(){ | 41 | public CommonResult<IotStatisticsSummaryRespVO> getIotStatisticsSummary(){ |
| 43 | IotStatisticsSummaryRespVO respVO = new IotStatisticsSummaryRespVO(); | 42 | IotStatisticsSummaryRespVO respVO = new IotStatisticsSummaryRespVO(); |
| 44 | - // 获取总数 | 43 | + // 1.1 获取总数 |
| 45 | respVO.setProductCategoryCount(productCategoryService.getProductCategoryCount(null)); | 44 | respVO.setProductCategoryCount(productCategoryService.getProductCategoryCount(null)); |
| 46 | respVO.setProductCount(productService.getProductCount(null)); | 45 | respVO.setProductCount(productService.getProductCount(null)); |
| 47 | respVO.setDeviceCount(deviceService.getDeviceCount(null)); | 46 | respVO.setDeviceCount(deviceService.getDeviceCount(null)); |
| 48 | respVO.setDeviceMessageCount(deviceLogService.getDeviceLogCount(null)); | 47 | respVO.setDeviceMessageCount(deviceLogService.getDeviceLogCount(null)); |
| 49 | - | ||
| 50 | - // 获取今日新增数量 | 48 | + // 1.2 获取今日新增数量 |
| 49 | + // TODO @super:使用 LocalDateTimeUtils.getToday() | ||
| 51 | LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); | 50 | LocalDateTime todayStart = LocalDateTime.now().withHour(0).withMinute(0).withSecond(0); |
| 52 | respVO.setProductCategoryTodayCount(productCategoryService.getProductCategoryCount(todayStart)); | 51 | respVO.setProductCategoryTodayCount(productCategoryService.getProductCategoryCount(todayStart)); |
| 53 | respVO.setProductTodayCount(productService.getProductCount(todayStart)); | 52 | respVO.setProductTodayCount(productService.getProductCount(todayStart)); |
| 54 | respVO.setDeviceTodayCount(deviceService.getDeviceCount(todayStart)); | 53 | respVO.setDeviceTodayCount(deviceService.getDeviceCount(todayStart)); |
| 55 | respVO.setDeviceMessageTodayCount(deviceLogService.getDeviceLogCount(todayStart)); | 54 | respVO.setDeviceMessageTodayCount(deviceLogService.getDeviceLogCount(todayStart)); |
| 56 | 55 | ||
| 57 | - // 获取各个品类下设备数量统计 | 56 | + // 2. 获取各个品类下设备数量统计 |
| 58 | respVO.setProductCategoryDeviceCounts(productCategoryService.getProductCategoryDeviceCountMap()); | 57 | respVO.setProductCategoryDeviceCounts(productCategoryService.getProductCategoryDeviceCountMap()); |
| 59 | 58 | ||
| 60 | - // 获取设备状态数量统计 | 59 | + // 3. 获取设备状态数量统计 |
| 61 | Map<Integer, Long> deviceCountMap = deviceService.getDeviceCountMapByState(); | 60 | Map<Integer, Long> deviceCountMap = deviceService.getDeviceCountMapByState(); |
| 62 | respVO.setDeviceOnlineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.ONLINE.getState(), 0L)); | 61 | respVO.setDeviceOnlineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.ONLINE.getState(), 0L)); |
| 63 | respVO.setDeviceOfflineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.OFFLINE.getState(), 0L)); | 62 | respVO.setDeviceOfflineCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.OFFLINE.getState(), 0L)); |
| 64 | respVO.setDeviceInactiveCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.INACTIVE.getState(), 0L)); | 63 | respVO.setDeviceInactiveCount(deviceCountMap.getOrDefault(IotDeviceStateEnum.INACTIVE.getState(), 0L)); |
| 65 | - | ||
| 66 | return CommonResult.success(respVO); | 64 | return CommonResult.success(respVO); |
| 67 | } | 65 | } |
| 68 | - @GetMapping("/get-log-summary") | ||
| 69 | - @Operation(summary = "获取IOT上下行消息数据统计") | ||
| 70 | - public CommonResult<IotStatisticsDeviceMessageSummaryRespVO> getIotStatisticsDeviceMessageSummary(@Valid IotStatisticsReqVO reqVO){ | ||
| 71 | - // 根据传入时间范围获取设备上下行消息数量统计 | ||
| 72 | - IotStatisticsDeviceMessageSummaryRespVO iotStatisticsRespVO = new IotStatisticsDeviceMessageSummaryRespVO(); | ||
| 73 | - iotStatisticsRespVO.setUpstreamCounts(deviceLogService.getDeviceLogUpCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())); | ||
| 74 | - iotStatisticsRespVO.setDownstreamCounts(deviceLogService.getDeviceLogDownCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())); | ||
| 75 | 66 | ||
| 76 | - return CommonResult.success(iotStatisticsRespVO); | 67 | + // TODO @super:要不干掉 IotStatisticsReqVO 参数,直接使用 @RequestParam 接收,简单一些。 |
| 68 | + @GetMapping("/get-log-summary") | ||
| 69 | + @Operation(summary = "获取 IoT 设备上下行消息数据统计") | ||
| 70 | + public CommonResult<IotStatisticsDeviceMessageSummaryRespVO> getIotStatisticsDeviceMessageSummary( | ||
| 71 | + @Valid IotStatisticsReqVO reqVO) { | ||
| 72 | + return CommonResult.success(new IotStatisticsDeviceMessageSummaryRespVO() | ||
| 73 | + .setDownstreamCounts(deviceLogService.getDeviceLogUpCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())) | ||
| 74 | + .setDownstreamCounts((deviceLogService.getDeviceLogDownCountByHour(null, reqVO.getStartTime(), reqVO.getEndTime())))); | ||
| 77 | } | 75 | } |
| 76 | + | ||
| 78 | } | 77 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/statistics/vo/IotStatisticsDeviceMessageSummaryRespVO.java
| @@ -6,14 +6,14 @@ import lombok.Data; | @@ -6,14 +6,14 @@ import lombok.Data; | ||
| 6 | import java.util.List; | 6 | import java.util.List; |
| 7 | import java.util.Map; | 7 | import java.util.Map; |
| 8 | 8 | ||
| 9 | -@Schema(description = "管理后台 - Iot 上下行消息数量统计 Response VO") | 9 | +@Schema(description = "管理后台 - IoT 设备上下行消息数量统计 Response VO") |
| 10 | @Data | 10 | @Data |
| 11 | public class IotStatisticsDeviceMessageSummaryRespVO { | 11 | public class IotStatisticsDeviceMessageSummaryRespVO { |
| 12 | + | ||
| 12 | @Schema(description = "每小时上行数据数量统计") | 13 | @Schema(description = "每小时上行数据数量统计") |
| 13 | private List<Map<Long, Integer>> upstreamCounts; | 14 | private List<Map<Long, Integer>> upstreamCounts; |
| 14 | 15 | ||
| 15 | @Schema(description = "每小时下行数据数量统计") | 16 | @Schema(description = "每小时下行数据数量统计") |
| 16 | private List<Map<Long, Integer>> downstreamCounts; | 17 | private List<Map<Long, Integer>> downstreamCounts; |
| 17 | 18 | ||
| 18 | - // TODO @super:如果只有这两个字段,使用 KeyValue 这个键值对 | ||
| 19 | } | 19 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/statistics/vo/IotStatisticsReqVO.java
| @@ -4,12 +4,11 @@ import io.swagger.v3.oas.annotations.media.Schema; | @@ -4,12 +4,11 @@ import io.swagger.v3.oas.annotations.media.Schema; | ||
| 4 | import jakarta.validation.constraints.NotNull; | 4 | import jakarta.validation.constraints.NotNull; |
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | 6 | ||
| 7 | -@Schema(description = "管理后台 - Iot统计 Request VO") | 7 | +@Schema(description = "管理后台 - IoT 统计 Request VO") |
| 8 | @Data | 8 | @Data |
| 9 | public class IotStatisticsReqVO { | 9 | public class IotStatisticsReqVO { |
| 10 | 10 | ||
| 11 | - // TODO @supper:times 直接传递哈; | ||
| 12 | - // TODO 2super:private 不要丢了 | 11 | + // TODO @super:前端传递的时候,还是通过 startTime 和 endTime 传递。后端转成 Long |
| 13 | 12 | ||
| 14 | @Schema(description = "查询起始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1658486600000") | 13 | @Schema(description = "查询起始时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "1658486600000") |
| 15 | @NotNull(message = "查询起始时间不能为空") | 14 | @NotNull(message = "查询起始时间不能为空") |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/statistics/vo/IotStatisticsSummaryRespVO.java
| @@ -5,8 +5,6 @@ import lombok.Data; | @@ -5,8 +5,6 @@ import lombok.Data; | ||
| 5 | 5 | ||
| 6 | import java.util.Map; | 6 | import java.util.Map; |
| 7 | 7 | ||
| 8 | -// TODO @super:Total 全部改成 Count | ||
| 9 | -// TODO @super:IotStatisticsSummaryRespVO | ||
| 10 | /** | 8 | /** |
| 11 | * 管理后台 - Iot 统计 Response VO | 9 | * 管理后台 - Iot 统计 Response VO |
| 12 | */ | 10 | */ |
| @@ -14,56 +12,40 @@ import java.util.Map; | @@ -14,56 +12,40 @@ import java.util.Map; | ||
| 14 | @Data | 12 | @Data |
| 15 | public class IotStatisticsSummaryRespVO { | 13 | public class IotStatisticsSummaryRespVO { |
| 16 | 14 | ||
| 17 | - // TODO @super:productCategory 哈 | ||
| 18 | @Schema(description = "品类数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | 15 | @Schema(description = "品类数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| 19 | - private long productCategoryCount; | 16 | + private Long productCategoryCount; |
| 20 | 17 | ||
| 21 | @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") | 18 | @Schema(description = "产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| 22 | - private long productCount; | 19 | + private Long productCount; |
| 23 | 20 | ||
| 24 | @Schema(description = "设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") | 21 | @Schema(description = "设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| 25 | - private long deviceCount; | 22 | + private Long deviceCount; |
| 26 | 23 | ||
| 27 | - // TODO @super:deviceMessageCount;设备消息数量 | ||
| 28 | @Schema(description = "上报数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") | 24 | @Schema(description = "上报数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") |
| 29 | - private long deviceMessageCount; | 25 | + private Long deviceMessageCount; |
| 30 | 26 | ||
| 31 | - // TODO @super:productCategory 哈 | ||
| 32 | @Schema(description = "今日新增品类数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") | 27 | @Schema(description = "今日新增品类数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") |
| 33 | - private long productCategoryTodayCount; | 28 | + private Long productCategoryTodayCount; |
| 34 | 29 | ||
| 35 | @Schema(description = "今日新增产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") | 30 | @Schema(description = "今日新增产品数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") |
| 36 | - private long productTodayCount; | 31 | + private Long productTodayCount; |
| 37 | 32 | ||
| 38 | @Schema(description = "今日新增设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") | 33 | @Schema(description = "今日新增设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "100") |
| 39 | - private long deviceTodayCount; | 34 | + private Long deviceTodayCount; |
| 40 | 35 | ||
| 41 | - // TODO @super:deviceMessageCount;今日设备消息数量 | ||
| 42 | @Schema(description = "今日新增上报数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") | 36 | @Schema(description = "今日新增上报数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1000") |
| 43 | - private long deviceMessageTodayCount; | ||
| 44 | - | ||
| 45 | - // TODO @super:deviceOnlineCount | 37 | + private Long deviceMessageTodayCount; |
| 46 | 38 | ||
| 47 | @Schema(description = "在线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") | 39 | @Schema(description = "在线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "80") |
| 48 | - private long deviceOnlineCount; | ||
| 49 | - | ||
| 50 | - // TODO @super:deviceOfflineCount | 40 | + private Long deviceOnlineCount; |
| 51 | 41 | ||
| 52 | @Schema(description = "离线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15") | 42 | @Schema(description = "离线数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "15") |
| 53 | - private long deviceOfflineCount; | ||
| 54 | - | ||
| 55 | - // TODO @super:deviceInactivECount | 43 | + private Long deviceOfflineCount; |
| 56 | 44 | ||
| 57 | @Schema(description = "待激活设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") | 45 | @Schema(description = "待激活设备数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "5") |
| 58 | - private long deviceInactiveCount; | 46 | + private Long deviceInactiveCount; |
| 59 | 47 | ||
| 60 | - // TODO @super:1)类型改成 Map,key 分类名、value 设备数量;2)deviceStatsOfCategory => productCategoryDeviceCounts | ||
| 61 | @Schema(description = "按品类统计的设备数量") | 48 | @Schema(description = "按品类统计的设备数量") |
| 62 | private Map<String, Integer> productCategoryDeviceCounts; | 49 | private Map<String, Integer> productCategoryDeviceCounts; |
| 63 | 50 | ||
| 64 | - // TODO @super:貌似界面里,用不到这个字段??? | ||
| 65 | - | ||
| 66 | - | ||
| 67 | - // TODO @super:deviceUpMessageStats、deviceDownMessageStats 单独抽到 IotStatisticsDeviceMessageSummaryRespVO,然后里面属性就是 upstreamCounts、downstreamCounts | ||
| 68 | - | ||
| 69 | } | 51 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
| @@ -8,13 +8,11 @@ import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePa | @@ -8,13 +8,11 @@ import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePa | ||
| 8 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; | 8 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; |
| 9 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | 9 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| 10 | import org.apache.ibatis.annotations.Mapper; | 10 | import org.apache.ibatis.annotations.Mapper; |
| 11 | -import org.apache.ibatis.annotations.Param; | ||
| 12 | 11 | ||
| 13 | import javax.annotation.Nullable; | 12 | import javax.annotation.Nullable; |
| 14 | import java.time.LocalDateTime; | 13 | import java.time.LocalDateTime; |
| 15 | import java.util.List; | 14 | import java.util.List; |
| 16 | import java.util.Map; | 15 | import java.util.Map; |
| 17 | -import java.util.stream.Collectors; | ||
| 18 | 16 | ||
| 19 | /** | 17 | /** |
| 20 | * IoT 设备 Mapper | 18 | * IoT 设备 Mapper |
| @@ -79,18 +77,15 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | @@ -79,18 +77,15 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> { | ||
| 79 | .geIfPresent(IotDeviceDO::getCreateTime, createTime)); | 77 | .geIfPresent(IotDeviceDO::getCreateTime, createTime)); |
| 80 | } | 78 | } |
| 81 | 79 | ||
| 82 | - default Long selectCountByState(@Nullable Integer state) { | ||
| 83 | - return selectCount(new LambdaQueryWrapperX<IotDeviceDO>() | ||
| 84 | - .eqIfPresent(IotDeviceDO::getState, state)); | ||
| 85 | - } | ||
| 86 | - | ||
| 87 | /** | 80 | /** |
| 88 | * 查询指定产品下各状态的设备数量 | 81 | * 查询指定产品下各状态的设备数量 |
| 89 | * | 82 | * |
| 90 | * @return 设备数量统计列表 | 83 | * @return 设备数量统计列表 |
| 91 | */ | 84 | */ |
| 85 | + // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?! | ||
| 92 | List<Map<String, Object>> selectDeviceCountMapByProductId(); | 86 | List<Map<String, Object>> selectDeviceCountMapByProductId(); |
| 93 | 87 | ||
| 88 | + // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?! | ||
| 94 | /** | 89 | /** |
| 95 | * 查询各个状态下的设备数量 | 90 | * 查询各个状态下的设备数量 |
| 96 | * | 91 | * |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/IotDeviceLogMapper.java
| @@ -63,14 +63,14 @@ public interface IotDeviceLogMapper { | @@ -63,14 +63,14 @@ public interface IotDeviceLogMapper { | ||
| 63 | * 查询每个小时设备上行消息数量 | 63 | * 查询每个小时设备上行消息数量 |
| 64 | */ | 64 | */ |
| 65 | List<Map<String, Object>> selectDeviceLogUpCountByHour(@Param("deviceKey") String deviceKey, | 65 | List<Map<String, Object>> selectDeviceLogUpCountByHour(@Param("deviceKey") String deviceKey, |
| 66 | - @Param("startTime") Long startTime, | ||
| 67 | - @Param("endTime") Long endTime); | 66 | + @Param("startTime") Long startTime, |
| 67 | + @Param("endTime") Long endTime); | ||
| 68 | 68 | ||
| 69 | /** | 69 | /** |
| 70 | * 查询每个小时设备下行消息数量 | 70 | * 查询每个小时设备下行消息数量 |
| 71 | */ | 71 | */ |
| 72 | List<Map<String, Object>> selectDeviceLogDownCountByHour(@Param("deviceKey") String deviceKey, | 72 | List<Map<String, Object>> selectDeviceLogDownCountByHour(@Param("deviceKey") String deviceKey, |
| 73 | - @Param("startTime") Long startTime, | ||
| 74 | - @Param("endTime") Long endTime); | 73 | + @Param("startTime") Long startTime, |
| 74 | + @Param("endTime") Long endTime); | ||
| 75 | 75 | ||
| 76 | } | 76 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
| @@ -196,14 +196,6 @@ public interface IotDeviceService { | @@ -196,14 +196,6 @@ public interface IotDeviceService { | ||
| 196 | */ | 196 | */ |
| 197 | Long getDeviceCount(@Nullable LocalDateTime createTime); | 197 | Long getDeviceCount(@Nullable LocalDateTime createTime); |
| 198 | 198 | ||
| 199 | - | ||
| 200 | - /** | ||
| 201 | - * 获得所有设备列表 | ||
| 202 | - * | ||
| 203 | - * @return 设备列表 | ||
| 204 | - */ | ||
| 205 | - List<IotDeviceDO> getDeviceList(); | ||
| 206 | - | ||
| 207 | /** | 199 | /** |
| 208 | * 获取 MQTT 连接参数 | 200 | * 获取 MQTT 连接参数 |
| 209 | * | 201 | * |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
| @@ -430,13 +430,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { | @@ -430,13 +430,7 @@ public class IotDeviceServiceImpl implements IotDeviceService { | ||
| 430 | return deviceMapper.selectCountByCreateTime(createTime); | 430 | return deviceMapper.selectCountByCreateTime(createTime); |
| 431 | } | 431 | } |
| 432 | 432 | ||
| 433 | - // TODO @super:是不是 groupby 查询,更高效;不过 controller,还是要考虑 null 的情况;不过可以直接枚举 foreach 处理下 | ||
| 434 | - | ||
| 435 | - @Override | ||
| 436 | - public List<IotDeviceDO> getDeviceList() { | ||
| 437 | - return deviceMapper.selectList(); | ||
| 438 | - } | ||
| 439 | - | 433 | + // TODO @super:简化 |
| 440 | @Override | 434 | @Override |
| 441 | public Map<Long, Integer> getDeviceCountMapByProductId() { | 435 | public Map<Long, Integer> getDeviceCountMapByProductId() { |
| 442 | // 查询结果转换成Map | 436 | // 查询结果转换成Map |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDeviceLogService.java
| @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.iot.service.device.data; | @@ -2,7 +2,6 @@ package cn.iocoder.yudao.module.iot.service.device.data; | ||
| 2 | 2 | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO; | 4 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO; |
| 5 | -import cn.iocoder.yudao.module.iot.controller.admin.statistics.vo.IotStatisticsDeviceMessageSummaryRespVO; | ||
| 6 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO; | 5 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO; |
| 7 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; | 6 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; |
| 8 | 7 | ||
| @@ -57,8 +56,8 @@ public interface IotDeviceLogService { | @@ -57,8 +56,8 @@ public interface IotDeviceLogService { | ||
| 57 | * @return key: 时间戳, value: 消息数量 | 56 | * @return key: 时间戳, value: 消息数量 |
| 58 | */ | 57 | */ |
| 59 | List<Map<Long, Integer>> getDeviceLogUpCountByHour(@Nullable String deviceKey, | 58 | List<Map<Long, Integer>> getDeviceLogUpCountByHour(@Nullable String deviceKey, |
| 60 | - @Nullable Long startTime, | ||
| 61 | - @Nullable Long endTime); | 59 | + @Nullable Long startTime, |
| 60 | + @Nullable Long endTime); | ||
| 62 | 61 | ||
| 63 | /** | 62 | /** |
| 64 | * 获得每个小时设备下行消息数量统计 | 63 | * 获得每个小时设备下行消息数量统计 |
| @@ -69,7 +68,7 @@ public interface IotDeviceLogService { | @@ -69,7 +68,7 @@ public interface IotDeviceLogService { | ||
| 69 | * @return key: 时间戳, value: 消息数量 | 68 | * @return key: 时间戳, value: 消息数量 |
| 70 | */ | 69 | */ |
| 71 | List<Map<Long, Integer>> getDeviceLogDownCountByHour(@Nullable String deviceKey, | 70 | List<Map<Long, Integer>> getDeviceLogDownCountByHour(@Nullable String deviceKey, |
| 72 | - @Nullable Long startTime, | ||
| 73 | - @Nullable Long endTime); | 71 | + @Nullable Long startTime, |
| 72 | + @Nullable Long endTime); | ||
| 74 | 73 | ||
| 75 | } | 74 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/data/IotDeviceLogServiceImpl.java
| @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | @@ -7,7 +7,6 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; | ||
| 7 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; | 7 | import cn.iocoder.yudao.framework.common.util.json.JsonUtils; |
| 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 8 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 9 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO; | 9 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO; |
| 10 | -import cn.iocoder.yudao.module.iot.controller.admin.statistics.vo.IotStatisticsDeviceMessageSummaryRespVO; | ||
| 11 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO; | 10 | import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceLogDO; |
| 12 | import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceLogMapper; | 11 | import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceLogMapper; |
| 13 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; | 12 | import cn.iocoder.yudao.module.iot.mq.message.IotDeviceMessage; |
| @@ -73,13 +72,13 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | @@ -73,13 +72,13 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | ||
| 73 | 72 | ||
| 74 | @Override | 73 | @Override |
| 75 | public Long getDeviceLogCount(LocalDateTime createTime) { | 74 | public Long getDeviceLogCount(LocalDateTime createTime) { |
| 76 | - // todo @super:1)LocalDateTimeUtil.toEpochMilli(createTime);2)直接表达式,更简洁 time != null ? createTime.toInstant(ZoneOffset.UTC).toEpochMilli() : null; | ||
| 77 | return deviceLogMapper.selectCountByCreateTime(createTime != null ? LocalDateTimeUtil.toEpochMilli(createTime) : null); | 75 | return deviceLogMapper.selectCountByCreateTime(createTime != null ? LocalDateTimeUtil.toEpochMilli(createTime) : null); |
| 78 | } | 76 | } |
| 79 | 77 | ||
| 80 | // TODO @super:加一个参数,Boolean upstream:true 上行,false 下行,null 不过滤 | 78 | // TODO @super:加一个参数,Boolean upstream:true 上行,false 下行,null 不过滤 |
| 81 | @Override | 79 | @Override |
| 82 | public List<Map<Long, Integer>> getDeviceLogUpCountByHour(String deviceKey, Long startTime, Long endTime) { | 80 | public List<Map<Long, Integer>> getDeviceLogUpCountByHour(String deviceKey, Long startTime, Long endTime) { |
| 81 | + // TODO @super:不能只基于数据库统计。因为有一些小时,可能出现没数据的情况,导致前端展示的图是不全的。可以参考 CrmStatisticsCustomerService 来实现 | ||
| 83 | List<Map<String, Object>> list = deviceLogMapper.selectDeviceLogUpCountByHour(deviceKey, startTime, endTime); | 82 | List<Map<String, Object>> list = deviceLogMapper.selectDeviceLogUpCountByHour(deviceKey, startTime, endTime); |
| 84 | return list.stream() | 83 | return list.stream() |
| 85 | .map(map -> { | 84 | .map(map -> { |
| @@ -93,6 +92,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | @@ -93,6 +92,7 @@ public class IotDeviceLogServiceImpl implements IotDeviceLogService { | ||
| 93 | .collect(Collectors.toList()); | 92 | .collect(Collectors.toList()); |
| 94 | } | 93 | } |
| 95 | 94 | ||
| 95 | + // TODO @super:getDeviceLogDownCountByHour 融合到 getDeviceLogUpCountByHour | ||
| 96 | @Override | 96 | @Override |
| 97 | public List<Map<Long, Integer>> getDeviceLogDownCountByHour(String deviceKey, Long startTime, Long endTime) { | 97 | public List<Map<Long, Integer>> getDeviceLogDownCountByHour(String deviceKey, Long startTime, Long endTime) { |
| 98 | List<Map<String, Object>> list = deviceLogMapper.selectDeviceLogDownCountByHour(deviceKey, startTime, endTime); | 98 | List<Map<String, Object>> list = deviceLogMapper.selectDeviceLogDownCountByHour(deviceKey, startTime, endTime); |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductCategoryService.java
| @@ -93,9 +93,8 @@ public interface IotProductCategoryService { | @@ -93,9 +93,8 @@ public interface IotProductCategoryService { | ||
| 93 | */ | 93 | */ |
| 94 | Long getProductCategoryCount(@Nullable LocalDateTime createTime); | 94 | Long getProductCategoryCount(@Nullable LocalDateTime createTime); |
| 95 | 95 | ||
| 96 | - // TODO @super:1)Map<ProductCategory, Count> 虽然有点怪哈,然后 Controller 按需转换成 Map<String, Integer> ;2)名字 getProductCategoryDeviceCountMap 方法 | ||
| 97 | /** | 96 | /** |
| 98 | - * 获得各个品类下设备数量统计 | 97 | + * 获得各个品类下设备数量统计,其中 key 是产品分类名 |
| 99 | * | 98 | * |
| 100 | * @return 品类设备统计列表 | 99 | * @return 品类设备统计列表 |
| 101 | */ | 100 | */ |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductCategoryServiceImpl.java
| @@ -106,11 +106,9 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService | @@ -106,11 +106,9 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService | ||
| 106 | 106 | ||
| 107 | // 2. 统计每个分类下的设备数量 | 107 | // 2. 统计每个分类下的设备数量 |
| 108 | Map<String, Integer> categoryDeviceCountMap = new HashMap<>(); | 108 | Map<String, Integer> categoryDeviceCountMap = new HashMap<>(); |
| 109 | - | ||
| 110 | - // 2.1 初始化所有分类的计数为0 | ||
| 111 | for (IotProductCategoryDO category : categoryList) { | 109 | for (IotProductCategoryDO category : categoryList) { |
| 112 | categoryDeviceCountMap.put(category.getName(), 0); | 110 | categoryDeviceCountMap.put(category.getName(), 0); |
| 113 | - | 111 | + // TODO @super:CollectionUtils.getSumValue(),看看能不能简化下 |
| 114 | // 2.2 找到该分类下的所有产品,累加设备数量 | 112 | // 2.2 找到该分类下的所有产品,累加设备数量 |
| 115 | for (IotProductDO product : productList) { | 113 | for (IotProductDO product : productList) { |
| 116 | if (Objects.equals(product.getCategoryId(), category.getId())) { | 114 | if (Objects.equals(product.getCategoryId(), category.getId())) { |
| @@ -119,7 +117,6 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService | @@ -119,7 +117,6 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService | ||
| 119 | } | 117 | } |
| 120 | } | 118 | } |
| 121 | } | 119 | } |
| 122 | - | ||
| 123 | return categoryDeviceCountMap; | 120 | return categoryDeviceCountMap; |
| 124 | } | 121 | } |
| 125 | 122 |