Commit d346a8d2ae2a8eb366ac15a765c68ad2bcb289d2

Authored by YunaiV
1 parent 72245b5b

feat:【IoT 物联网】完善设备消息的查询

Showing 13 changed files with 136 additions and 126 deletions
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceLogController.java renamed to yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceMessageController.java
... ... @@ -3,10 +3,10 @@ package cn.iocoder.yudao.module.iot.controller.admin.device;
3 3 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
4 4 import cn.iocoder.yudao.framework.common.pojo.PageResult;
5 5 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
6   -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO;
7   -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogRespVO;
  6 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessageRespVO;
  7 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessagePageReqVO;
8 8 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
9   -import cn.iocoder.yudao.module.iot.service.device.property.IotDeviceLogService;
  9 +import cn.iocoder.yudao.module.iot.service.device.message.IotDeviceMessageService;
10 10 import io.swagger.v3.oas.annotations.Operation;
11 11 import io.swagger.v3.oas.annotations.tags.Tag;
12 12 import jakarta.annotation.Resource;
... ... @@ -19,21 +19,21 @@ import org.springframework.web.bind.annotation.RestController;
19 19  
20 20 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
21 21  
22   -@Tag(name = "管理后台 - IoT 设备日志")
  22 +@Tag(name = "管理后台 - IoT 设备消息")
23 23 @RestController
24   -@RequestMapping("/iot/device/log")
  24 +@RequestMapping("/iot/device/message")
25 25 @Validated
26   -public class IotDeviceLogController {
  26 +public class IotDeviceMessageController {
27 27  
28 28 @Resource
29   - private IotDeviceLogService deviceLogService;
  29 + private IotDeviceMessageService deviceMessageService;
30 30  
31 31 @GetMapping("/page")
32   - @Operation(summary = "获得设备日志分页")
33   - @PreAuthorize("@ss.hasPermission('iot:device:log-query')")
34   - public CommonResult<PageResult<IotDeviceLogRespVO>> getDeviceLogPage(@Valid IotDeviceLogPageReqVO pageReqVO) {
35   - PageResult<IotDeviceMessageDO> pageResult = deviceLogService.getDeviceLogPage(pageReqVO);
36   - return success(BeanUtils.toBean(pageResult, IotDeviceLogRespVO.class));
  32 + @Operation(summary = "获得设备消息分页")
  33 + @PreAuthorize("@ss.hasPermission('iot:device:message-query')")
  34 + public CommonResult<PageResult<IotDeviceMessageRespVO>> getDeviceLogPage(@Valid IotDeviceMessagePageReqVO pageReqVO) {
  35 + PageResult<IotDeviceMessageDO> pageResult = deviceMessageService.getDeviceMessagePage(pageReqVO);
  36 + return success(BeanUtils.toBean(pageResult, IotDeviceMessageRespVO.class));
37 37 }
38 38  
39 39 }
40 40 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDeviceLogPageReqVO.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data;
2   -
3   -import cn.iocoder.yudao.framework.common.pojo.PageParam;
4   -import io.swagger.v3.oas.annotations.media.Schema;
5   -import jakarta.validation.constraints.NotEmpty;
6   -import lombok.Data;
7   -
8   -@Schema(description = "管理后台 - IoT 设备日志分页查询 Request VO")
9   -@Data
10   -public class IotDeviceLogPageReqVO extends PageParam {
11   -
12   - // TODO @芋艿:【优先级:中】改成通过 deviceId 查询;然后转换下;
13   - @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "device123")
14   - @NotEmpty(message = "设备标识不能为空")
15   - private String deviceKey;
16   -
17   - @Schema(description = "消息类型", example = "property")
18   - private String type; // 参见 IotDeviceMessageTypeEnum 枚举,精准匹配
19   -
20   - @Schema(description = "标识符", example = "temperature")
21   - private String identifier; // 参见 IotDeviceMessageIdentifierEnum 枚举,模糊匹配
22   -
23   -}
24 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/data/IotDeviceLogRespVO.java deleted
1   -package cn.iocoder.yudao.module.iot.controller.admin.device.vo.data;
2   -
3   -import io.swagger.v3.oas.annotations.media.Schema;
4   -import lombok.Data;
5   -
6   -import java.time.LocalDateTime;
7   -
8   -@Schema(description = "管理后台 - IoT 设备日志 Response VO")
9   -@Data
10   -public class IotDeviceLogRespVO {
11   -
12   - @Schema(description = "日志编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
13   - private String id;
14   -
15   - @Schema(description = "产品标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "product123")
16   - private String productKey;
17   -
18   - @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "device123")
19   - private String deviceKey;
20   -
21   - @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "property")
22   - private String type;
23   -
24   - @Schema(description = "标识符", requiredMode = Schema.RequiredMode.REQUIRED, example = "temperature")
25   - private String identifier;
26   -
27   - @Schema(description = "日志内容", requiredMode = Schema.RequiredMode.REQUIRED)
28   - private String content;
29   -
30   - @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED)
31   - private LocalDateTime reportTime;
32   -
33   - @Schema(description = "记录时间戳", requiredMode = Schema.RequiredMode.REQUIRED)
34   - private LocalDateTime ts;
35   -
36   -}
37 0 \ No newline at end of file
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessagePageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import cn.iocoder.yudao.framework.common.validation.InEnum;
  5 +import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum;
  6 +import io.swagger.v3.oas.annotations.media.Schema;
  7 +import jakarta.validation.constraints.NotNull;
  8 +import lombok.Data;
  9 +
  10 +@Schema(description = "管理后台 - IoT 设备消息分页查询 Request VO")
  11 +@Data
  12 +public class IotDeviceMessagePageReqVO extends PageParam {
  13 +
  14 + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  15 + @NotNull(message = "设备编号不能为空")
  16 + private Long deviceId;
  17 +
  18 + @Schema(description = "消息类型", example = "property")
  19 + @InEnum(IotDeviceMessageMethodEnum.class)
  20 + private String method;
  21 +
  22 + @Schema(description = "是否上行", example = "true")
  23 + private Boolean upstream;
  24 +
  25 +}
0 26 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/message/IotDeviceMessageRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.iot.controller.admin.device.vo.message;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +@Schema(description = "管理后台 - IoT 设备消息 Response VO")
  9 +@Data
  10 +public class IotDeviceMessageRespVO {
  11 +
  12 + @Schema(description = "消息编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
  13 + private String id;
  14 +
  15 + @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED)
  16 + private LocalDateTime reportTime;
  17 +
  18 + @Schema(description = "记录时间戳", requiredMode = Schema.RequiredMode.REQUIRED)
  19 + private LocalDateTime ts;
  20 +
  21 + @Schema(description = "设备编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
  22 + private Long deviceId;
  23 +
  24 + @Schema(description = "服务编号", example = "server_123")
  25 + private String serverId;
  26 +
  27 + @Schema(description = "是否上行消息", example = "true", examples = "false")
  28 + private Boolean upstream;
  29 +
  30 + @Schema(description = "是否回复消息", example = "false", examples = "true")
  31 + private Boolean reply;
  32 +
  33 + // ========== codec(编解码)字段 ==========
  34 +
  35 + @Schema(description = "请求编号", example = "req_123")
  36 + private String requestId;
  37 +
  38 + @Schema(description = "请求方法", requiredMode = Schema.RequiredMode.REQUIRED, example = "thing.property.report")
  39 + private String method;
  40 +
  41 + @Schema(description = "请求参数")
  42 + private Object params;
  43 +
  44 + @Schema(description = "响应结果")
  45 + private Object data;
  46 +
  47 + @Schema(description = "响应错误码", example = "200")
  48 + private Integer code;
  49 +
  50 + @Schema(description = "响应提示", example = "操作成功")
  51 + private String msg;
  52 +
  53 +}
0 54 \ No newline at end of file
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/dataobject/device/IotDeviceMessageDO.java
... ... @@ -29,7 +29,7 @@ public class IotDeviceMessageDO {
29 29 */
30 30 private Long reportTime;
31 31 /**
32   - * 存储时序时间
  32 + * 存储时间戳
33 33 */
34 34 private Long ts;
35 35  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/dal/tdengine/IotDeviceMessageMapper.java
1 1 package cn.iocoder.yudao.module.iot.dal.tdengine;
2 2  
3   -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO;
  3 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessagePageReqVO;
4 4 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
5 5 import cn.iocoder.yudao.module.iot.framework.tdengine.core.annotation.TDengineDS;
6 6 import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
... ... @@ -47,7 +47,7 @@ public interface IotDeviceMessageMapper {
47 47 * @return 设备消息列表
48 48 */
49 49 IPage<IotDeviceMessageDO> selectPage(IPage<IotDeviceMessageDO> page,
50   - @Param("reqVO") IotDeviceLogPageReqVO reqVO);
  50 + @Param("reqVO") IotDeviceMessagePageReqVO reqVO);
51 51  
52 52 /**
53 53 * 统计设备消息数量
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageService.java
1 1 package cn.iocoder.yudao.module.iot.service.device.message;
2 2  
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessagePageReqVO;
3 5 import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
4 6 import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO;
  7 +import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
5 8  
6 9 /**
7 10 * IoT 设备消息 Service 接口
... ... @@ -46,4 +49,12 @@ public interface IotDeviceMessageService {
46 49 */
47 50 void handleUpstreamDeviceMessage(IotDeviceMessage message, IotDeviceDO device);
48 51  
  52 + /**
  53 + * 获得设备消息分页
  54 + *
  55 + * @param pageReqVO 分页查询
  56 + * @return 设备消息分页
  57 + */
  58 + PageResult<IotDeviceMessageDO> getDeviceMessagePage(IotDeviceMessagePageReqVO pageReqVO);
  59 +
49 60 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/message/IotDeviceMessageServiceImpl.java
... ... @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.iot.service.device.message;
3 3 import cn.hutool.core.util.StrUtil;
4 4 import cn.hutool.extra.spring.SpringUtil;
5 5 import cn.iocoder.yudao.framework.common.exception.ServiceException;
  6 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
6 7 import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
7 8 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
  9 +import cn.iocoder.yudao.module.iot.controller.admin.device.vo.message.IotDeviceMessagePageReqVO;
8 10 import cn.iocoder.yudao.module.iot.core.enums.IotDeviceMessageMethodEnum;
9 11 import cn.iocoder.yudao.module.iot.core.enums.IotDeviceStateEnum;
10 12 import cn.iocoder.yudao.module.iot.core.mq.message.IotDeviceMessage;
... ... @@ -15,6 +17,8 @@ import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
15 17 import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceMessageMapper;
16 18 import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
17 19 import cn.iocoder.yudao.module.iot.service.device.property.IotDevicePropertyService;
  20 +import com.baomidou.mybatisplus.core.metadata.IPage;
  21 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
18 22 import com.google.common.base.Objects;
19 23 import jakarta.annotation.Resource;
20 24 import lombok.extern.slf4j.Slf4j;
... ... @@ -62,9 +66,10 @@ public class IotDeviceMessageServiceImpl implements IotDeviceMessageService {
62 66 @Async
63 67 void createDeviceLogAsync(IotDeviceMessage message) {
64 68 IotDeviceMessageDO messageDO = BeanUtils.toBean(message, IotDeviceMessageDO.class)
65   - .setUpstream(IotDeviceMessageUtils.isUpstreamMessage(message));
  69 + .setUpstream(IotDeviceMessageUtils.isUpstreamMessage(message))
  70 + .setReply(IotDeviceMessageUtils.isReplyMessage(message));
66 71 if (message.getParams() != null) {
67   - messageDO.setParams(JsonUtils.toJsonString(messageDO.getData()));
  72 + messageDO.setParams(JsonUtils.toJsonString(messageDO.getParams()));
68 73 }
69 74 if (messageDO.getData() != null) {
70 75 messageDO.setData(JsonUtils.toJsonString(messageDO.getData()));
... ... @@ -184,6 +189,20 @@ public class IotDeviceMessageServiceImpl implements IotDeviceMessageService {
184 189 return null;
185 190 }
186 191  
  192 + @Override
  193 + public PageResult<IotDeviceMessageDO> getDeviceMessagePage(IotDeviceMessagePageReqVO pageReqVO) {
  194 + try {
  195 + IPage<IotDeviceMessageDO> page = deviceLogMapper.selectPage(
  196 + new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
  197 + return new PageResult<>(page.getRecords(), page.getTotal());
  198 + } catch (Exception exception) {
  199 + if (exception.getMessage().contains("Table does not exist")) {
  200 + return PageResult.empty();
  201 + }
  202 + throw exception;
  203 + }
  204 + }
  205 +
187 206 private IotDeviceMessageServiceImpl getSelf() {
188 207 return SpringUtil.getBean(getClass());
189 208 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/property/IotDeviceLogService.java
1 1 package cn.iocoder.yudao.module.iot.service.device.property;
2 2  
3   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
4   -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO;
5   -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
6   -
7 3 import javax.annotation.Nullable;
8 4 import java.time.LocalDateTime;
9 5 import java.util.List;
10 6 import java.util.Map;
11 7  
12 8 /**
13   - * IoT 设备日志数据 Service 接口
  9 + * IoT 设备消息数据 Service 接口
14 10 *
15 11 * @author alwayssuper
16 12 */
17 13 public interface IotDeviceLogService {
18 14  
19 15 /**
20   - * 获得设备日志分页
21   - *
22   - * @param pageReqVO 分页查询
23   - * @return 设备日志分页
24   - */
25   - PageResult<IotDeviceMessageDO> getDeviceLogPage(IotDeviceLogPageReqVO pageReqVO);
26   -
27   - /**
28   - * 获得设备日志数量
  16 + * 获得设备消息数量
29 17 *
30   - * @param createTime 创建时间,如果为空,则统计所有日志数量
31   - * @return 日志数量
  18 + * @param createTime 创建时间,如果为空,则统计所有消息数量
  19 + * @return 消息数量
32 20 */
33 21 Long getDeviceLogCount(@Nullable LocalDateTime createTime);
34 22  
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/property/IotDeviceLogServiceImpl.java
... ... @@ -2,13 +2,7 @@ package cn.iocoder.yudao.module.iot.service.device.property;
2 2  
3 3 import cn.hutool.core.date.LocalDateTimeUtil;
4 4 import cn.hutool.core.map.MapUtil;
5   -import cn.iocoder.yudao.framework.common.pojo.PageResult;
6   -import cn.iocoder.yudao.module.iot.controller.admin.device.vo.data.IotDeviceLogPageReqVO;
7   -import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceMessageDO;
8 5 import cn.iocoder.yudao.module.iot.dal.tdengine.IotDeviceMessageMapper;
9   -import cn.iocoder.yudao.module.iot.service.device.IotDeviceService;
10   -import com.baomidou.mybatisplus.core.metadata.IPage;
11   -import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
12 6 import jakarta.annotation.Resource;
13 7 import lombok.extern.slf4j.Slf4j;
14 8 import org.springframework.stereotype.Service;
... ... @@ -31,26 +25,9 @@ import java.util.stream.Collectors;
31 25 public class IotDeviceLogServiceImpl implements IotDeviceLogService {
32 26  
33 27 @Resource
34   - private IotDeviceService deviceService;
35   -
36   - @Resource
37 28 private IotDeviceMessageMapper deviceLogMapper;
38 29  
39 30 @Override
40   - public PageResult<IotDeviceMessageDO> getDeviceLogPage(IotDeviceLogPageReqVO pageReqVO) {
41   - try {
42   - IPage<IotDeviceMessageDO> page = deviceLogMapper.selectPage(
43   - new Page<>(pageReqVO.getPageNo(), pageReqVO.getPageSize()), pageReqVO);
44   - return new PageResult<>(page.getRecords(), page.getTotal());
45   - } catch (Exception exception) {
46   - if (exception.getMessage().contains("Table does not exist")) {
47   - return PageResult.empty();
48   - }
49   - throw exception;
50   - }
51   - }
52   -
53   - @Override
54 31 public Long getDeviceLogCount(LocalDateTime createTime) {
55 32 return deviceLogMapper.selectCountByCreateTime(createTime != null ? LocalDateTimeUtil.toEpochMilli(createTime) : null);
56 33 }
... ...
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/IotDeviceMessageMapper.xml
... ... @@ -55,12 +55,6 @@
55 55 <if test="reqVO.upstream != null">
56 56 AND upstream = #{reqVO.upstream}
57 57 </if>
58   - <if test="reqVO.startTime != null">
59   - AND ts >= #{reqVO.startTime}
60   - </if>
61   - <if test="reqVO.endTime != null">
62   - AND ts &lt;= #{reqVO.endTime}
63   - </if>
64 58 </where>
65 59 ORDER BY ts DESC
66 60 </select>
... ...
yudao-module-iot/yudao-module-iot-core/src/main/java/cn/iocoder/yudao/module/iot/core/enums/IotDeviceMessageMethodEnum.java
... ... @@ -19,18 +19,18 @@ public enum IotDeviceMessageMethodEnum implements ArrayValuable&lt;String&gt; {
19 19  
20 20 // ========== 设备状态 ==========
21 21  
22   - STATE_ONLINE("thing.state.online", true),
23   - STATE_OFFLINE("thing.state.offline", true),
  22 + STATE_ONLINE("thing.state.online", "设备上线", true),
  23 + STATE_OFFLINE("thing.state.offline", "设备下线", true),
24 24  
25 25 // ========== 设备属性 ==========
26 26 // 可参考:https://help.aliyun.com/zh/iot/user-guide/device-properties-events-and-services
27 27  
28   - PROPERTY_POST("thing.property.post", true),
29   - PROPERTY_SET("thing.property.set", false),
  28 + PROPERTY_POST("thing.property.post", "属性上报", true),
  29 + PROPERTY_SET("thing.property.set", "属性设置", false),
30 30  
31 31 // ========== 设备事件 ==========
32 32  
33   - EVENT_POST("thing.event.post", true),
  33 + EVENT_POST("thing.event.post", "事件上报", true),
34 34  
35 35 ;
36 36  
... ... @@ -44,6 +44,8 @@ public enum IotDeviceMessageMethodEnum implements ArrayValuable&lt;String&gt; {
44 44  
45 45 private final String method;
46 46  
  47 + private final String name;
  48 +
47 49 private final Boolean upstream;
48 50  
49 51 @Override
... ...