mirror of
https://github.com/YunaiV/ruoyi-vue-pro.git
synced 2026-04-19 13:48:37 +00:00
feat:【IoT 物联网】优化设备数量统计逻辑,简化查询方法并返回更直观的结果映射
This commit is contained in:
@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
|
|||||||
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
|
||||||
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
|
import cn.iocoder.yudao.module.iot.controller.admin.device.vo.device.IotDevicePageReqVO;
|
||||||
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import jakarta.annotation.Nullable;
|
import jakarta.annotation.Nullable;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
@@ -13,6 +14,7 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IoT 设备 Mapper
|
* IoT 设备 Mapper
|
||||||
@@ -80,19 +82,33 @@ public interface IotDeviceMapper extends BaseMapperX<IotDeviceDO> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询指定产品下各状态的设备数量
|
* 查询指定产品下的设备数量
|
||||||
*
|
*
|
||||||
* @return 设备数量统计列表
|
* @return 产品编号 -> 设备数量的映射
|
||||||
*/
|
*/
|
||||||
// TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!
|
default Map<Long, Integer> selectDeviceCountMapByProductId() {
|
||||||
List<Map<String, Object>> selectDeviceCountMapByProductId();
|
List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
|
||||||
|
.select("product_id AS productId", "COUNT(1) AS deviceCount")
|
||||||
|
.groupBy("product_id"));
|
||||||
|
return result.stream().collect(Collectors.toMap(
|
||||||
|
map -> Long.valueOf(map.get("productId").toString()),
|
||||||
|
map -> Integer.valueOf(map.get("deviceCount").toString())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
// TODO @super:通过 mybatis-plus 来写哈,然后返回 Map 貌似就行了?!
|
|
||||||
/**
|
/**
|
||||||
* 查询各个状态下的设备数量
|
* 查询各个状态下的设备数量
|
||||||
*
|
*
|
||||||
* @return 设备数量统计列表
|
* @return 设备状态 -> 设备数量的映射
|
||||||
*/
|
*/
|
||||||
List<Map<String, Object>> selectDeviceCountGroupByState();
|
default Map<Integer, Long> selectDeviceCountGroupByState() {
|
||||||
|
List<Map<String, Object>> result = selectMaps(new QueryWrapper<IotDeviceDO>()
|
||||||
|
.select("state", "COUNT(1) AS deviceCount")
|
||||||
|
.groupBy("state"));
|
||||||
|
return result.stream().collect(Collectors.toMap(
|
||||||
|
map -> Integer.valueOf(map.get("state").toString()),
|
||||||
|
map -> Long.valueOf(map.get("deviceCount").toString())
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import org.springframework.validation.annotation.Validated;
|
|||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
|
||||||
@@ -430,25 +429,14 @@ public class IotDeviceServiceImpl implements IotDeviceService {
|
|||||||
return deviceMapper.selectCountByCreateTime(createTime);
|
return deviceMapper.selectCountByCreateTime(createTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO @super:简化
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Long, Integer> getDeviceCountMapByProductId() {
|
public Map<Long, Integer> getDeviceCountMapByProductId() {
|
||||||
// 查询结果转换成Map
|
return deviceMapper.selectDeviceCountMapByProductId();
|
||||||
List<Map<String, Object>> list = deviceMapper.selectDeviceCountMapByProductId();
|
|
||||||
return list.stream().collect(Collectors.toMap(
|
|
||||||
map -> Long.valueOf(map.get("key").toString()),
|
|
||||||
map -> Integer.valueOf(map.get("value").toString())
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<Integer, Long> getDeviceCountMapByState() {
|
public Map<Integer, Long> getDeviceCountMapByState() {
|
||||||
// 查询结果转换成Map
|
return deviceMapper.selectDeviceCountGroupByState();
|
||||||
List<Map<String, Object>> list = deviceMapper.selectDeviceCountGroupByState();
|
|
||||||
return list.stream().collect(Collectors.toMap(
|
|
||||||
map -> Integer.valueOf(map.get("key").toString()),
|
|
||||||
map -> Long.valueOf(map.get("value").toString())
|
|
||||||
));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ import java.time.LocalDateTime;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList;
|
||||||
|
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.getSumValue;
|
||||||
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
|
import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.PRODUCT_CATEGORY_NOT_EXISTS;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -99,23 +101,21 @@ public class IotProductCategoryServiceImpl implements IotProductCategoryService
|
|||||||
@Override
|
@Override
|
||||||
public Map<String, Integer> getProductCategoryDeviceCountMap() {
|
public Map<String, Integer> getProductCategoryDeviceCountMap() {
|
||||||
// 1. 获取所有数据
|
// 1. 获取所有数据
|
||||||
List<IotProductCategoryDO> categoryList = iotProductCategoryMapper.selectList();
|
List<IotProductCategoryDO> categories = iotProductCategoryMapper.selectList();
|
||||||
List<IotProductDO> productList = productService.getProductList();
|
List<IotProductDO> products = productService.getProductList();
|
||||||
// TODO @super:不要 list 查询,返回内存,而是查询一个 Map<productId, count>
|
|
||||||
Map<Long, Integer> deviceCountMapByProductId = deviceService.getDeviceCountMapByProductId();
|
Map<Long, Integer> deviceCountMapByProductId = deviceService.getDeviceCountMapByProductId();
|
||||||
|
|
||||||
// 2. 统计每个分类下的设备数量
|
// 2. 统计每个分类下的设备数量
|
||||||
Map<String, Integer> categoryDeviceCountMap = new HashMap<>();
|
Map<String, Integer> categoryDeviceCountMap = new HashMap<>();
|
||||||
for (IotProductCategoryDO category : categoryList) {
|
for (IotProductCategoryDO category : categories) {
|
||||||
categoryDeviceCountMap.put(category.getName(), 0);
|
// 2.1 找到该分类下的所有产品
|
||||||
// TODO @super:CollectionUtils.getSumValue(),看看能不能简化下
|
List<IotProductDO> categoryProducts = filterList(products,
|
||||||
// 2.2 找到该分类下的所有产品,累加设备数量
|
product -> Objects.equals(product.getCategoryId(), category.getId()));
|
||||||
for (IotProductDO product : productList) {
|
// 2.2 累加设备数量
|
||||||
if (Objects.equals(product.getCategoryId(), category.getId())) {
|
Integer totalDeviceCount = getSumValue(categoryProducts,
|
||||||
Integer deviceCount = deviceCountMapByProductId.getOrDefault(product.getId(), 0);
|
product -> deviceCountMapByProductId.getOrDefault(product.getId(), 0),
|
||||||
categoryDeviceCountMap.merge(category.getName(), deviceCount, Integer::sum);
|
Integer::sum, 0);
|
||||||
}
|
categoryDeviceCountMap.put(category.getName(), totalDeviceCount);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return categoryDeviceCountMap;
|
return categoryDeviceCountMap;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,25 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<!DOCTYPE mapper
|
|
||||||
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
|
||||||
<mapper namespace="cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceMapper">
|
|
||||||
|
|
||||||
<select id="selectDeviceCountGroupByState" resultType="java.util.Map">
|
|
||||||
SELECT
|
|
||||||
state AS `key`,
|
|
||||||
COUNT(1) AS `value`
|
|
||||||
FROM iot_device
|
|
||||||
WHERE deleted = 0
|
|
||||||
GROUP BY state
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectDeviceCountMapByProductId" resultType="java.util.Map">
|
|
||||||
SELECT
|
|
||||||
product_id AS `key`,
|
|
||||||
COUNT(1) AS `value`
|
|
||||||
FROM iot_device
|
|
||||||
WHERE deleted = 0
|
|
||||||
GROUP BY product_id
|
|
||||||
</select>
|
|
||||||
|
|
||||||
</mapper>
|
|
||||||
Reference in New Issue
Block a user