Commit 801a6b970eeaf2ba31778d8cd6a37181a9809407

Authored by YunaiV
1 parent da60e649

feat:【IoT 物联网】优化设备数量统计逻辑,简化查询方法并返回更直观的结果映射

yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/mysql/device/IotDeviceMapper.java
... ... @@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
6 6 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
7 7 import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
8 8 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  9 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
9 10 import jakarta.annotation.Nullable;
10 11 import org.apache.ibatis.annotations.Mapper;
11 12  
... ... @@ -13,6 +14,7 @@ import java.time.LocalDateTime;
13 14 import java.util.Collection;
14 15 import java.util.List;
15 16 import java.util.Map;
  17 +import java.util.stream.Collectors;
16 18  
17 19 /**
18 20 * IoT 设备 Mapper
... ... @@ -80,19 +82,33 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
80 82 }
81 83  
82 84 /**
83   - * 查询指定产品下各状态的设备数量
  85 + * 查询指定产品下的设备数量
84 86 *
85   - * @return 设备数量统计列表
  87 + * @return 产品编号 -> 设备数量的映射
86 88 */
87   - // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!
88   - List<Map<String, Object>> selectDeviceCountMapByProductId();
  89 + default Map<Long, Integer> selectDeviceCountMapByProductId() {
  90 + List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
  91 + .select("product_id AS productId", "COUNT(1) AS deviceCount")
  92 + .groupBy("product_id"));
  93 + return result.stream().collect(Collectors.toMap(
  94 + map -> Long.valueOf(map.get("productId").toString()),
  95 + map -> Integer.valueOf(map.get("deviceCount").toString())
  96 + ));
  97 + }
89 98  
90   - // TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!
91 99 /**
92 100 * 查询各个状态下的设备数量
93 101 *
94   - * @return 设备数量统计列表
  102 + * @return 设备状态 -> 设备数量的映射
95 103 */
96   - List<Map<String, Object>> selectDeviceCountGroupByState();
  104 + default Map<Integer, Long> selectDeviceCountGroupByState() {
  105 + List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
  106 + .select("state", "COUNT(1) AS deviceCount")
  107 + .groupBy("state"));
  108 + return result.stream().collect(Collectors.toMap(
  109 + map -> Integer.valueOf(map.get("state").toString()),
  110 + map -> Long.valueOf(map.get("deviceCount").toString())
  111 + ));
  112 + }
97 113  
98 114 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
... ... @@ -36,7 +36,6 @@ import org.springframework.validation.annotation.Validated;
36 36 import javax.annotation.Nullable;
37 37 import java.time.LocalDateTime;
38 38 import java.util.*;
39   -import java.util.stream.Collectors;
40 39  
41 40 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
42 41 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
... ... @@ -430,25 +429,14 @@ public class IotDeviceServiceImpl implements IotDeviceService {
430 429 return deviceMapper.selectCountByCreateTime(createTime);
431 430 }
432 431  
433   - // TODO @super:简化
434 432 @Override
435 433 public Map<Long, Integer> getDeviceCountMapByProductId() {
436   - // 查询结果转换成Map
437   - List<Map<String, Object>> list = deviceMapper.selectDeviceCountMapByProductId();
438   - return list.stream().collect(Collectors.toMap(
439   - map -> Long.valueOf(map.get("key").toString()),
440   - map -> Integer.valueOf(map.get("value").toString())
441   - ));
  434 + return deviceMapper.selectDeviceCountMapByProductId();
442 435 }
443 436  
444 437 @Override
445 438 public Map<Integer, Long> getDeviceCountMapByState() {
446   - // 查询结果转换成Map
447   - List<Map<String, Object>> list = deviceMapper.selectDeviceCountGroupByState();
448   - return list.stream().collect(Collectors.toMap(
449   - map -> Integer.valueOf(map.get("key").toString()),
450   - map -> Long.valueOf(map.get("value").toString())
451   - ));
  439 + return deviceMapper.selectDeviceCountGroupByState();
452 440 }
453 441  
454 442 @Override
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/product/IotProductCategoryServiceImpl.java
... ... @@ -17,6 +17,8 @@ import java.time.LocalDateTime;
17 17 import java.util.*;
18 18  
19 19 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  20 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
  21 +import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
20 22 import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
21 23  
22 24 /**
... ... @@ -99,23 +101,21 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService
99 101 @Override
100 102 public Map<String, Integer> getProductCategoryDeviceCountMap() {
101 103 // 1. 获取所有数据
102   - List<IotProductCategoryDO> categoryList = iotProductCategoryMapper.selectList();
103   - List<IotProductDO> productList = productService.getProductList();
104   - // TODO @super:不要 list 查询,返回内存,而是查询一个 Map<productId, count>
  104 + List<IotProductCategoryDO> categories = iotProductCategoryMapper.selectList();
  105 + List<IotProductDO> products = productService.getProductList();
105 106 Map<Long, Integer> deviceCountMapByProductId = deviceService.getDeviceCountMapByProductId();
106 107  
107 108 // 2. 统计每个分类下的设备数量
108 109 Map<String, Integer> categoryDeviceCountMap = new HashMap<>();
109   - for (IotProductCategoryDO category : categoryList) {
110   - categoryDeviceCountMap.put(category.getName(), 0);
111   - // TODO @super:CollectionUtils.getSumValue(),看看能不能简化下
112   - // 2.2 找到该分类下的所有产品,累加设备数量
113   - for (IotProductDO product : productList) {
114   - if (Objects.equals(product.getCategoryId(), category.getId())) {
115   - Integer deviceCount = deviceCountMapByProductId.getOrDefault(product.getId(), 0);
116   - categoryDeviceCountMap.merge(category.getName(), deviceCount, Integer::sum);
117   - }
118   - }
  110 + for (IotProductCategoryDO category : categories) {
  111 + // 2.1 找到该分类下的所有产品
  112 + List<IotProductDO> categoryProducts = filterList(products,
  113 + product -> Objects.equals(product.getCategoryId(), category.getId()));
  114 + // 2.2 累加设备数量
  115 + Integer totalDeviceCount = getSumValue(categoryProducts,
  116 + product -> deviceCountMapByProductId.getOrDefault(product.getId(), 0),
  117 + Integer::sum, 0);
  118 + categoryDeviceCountMap.put(category.getName(), totalDeviceCount);
119 119 }
120 120 return categoryDeviceCountMap;
121 121 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/IotDeviceMapper.xml deleted
1   -<?xml version="1.0" encoding="UTF-8"?>
2   -<!DOCTYPE mapper
3   - PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4   - "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5   -<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper">
6   -
7   - <select id="selectDeviceCountGroupByState" resultType="java.util.Map">
8   - SELECT
9   - state AS `key`,
10   - COUNT(1) AS `value`
11   - FROM iot_device
12   - WHERE deleted = 0
13   - GROUP BY state
14   - </select>
15   -
16   - <select id="selectDeviceCountMapByProductId" resultType="java.util.Map">
17   - SELECT
18   - product_id AS `key`,
19   - COUNT(1) AS `value`
20   - FROM iot_device
21   - WHERE deleted = 0
22   - GROUP BY product_id
23   - </select>
24   -
25   -</mapper>
26 0 \ No newline at end of file