Commit 4f962bd1f73fed4b7fb1c4186300ecd3ca0ac59f
1 parent
2b27085e
[fix]:code review
Showing
12 changed files
with
68 additions
and
31 deletions
yudao-module-iot/yudao-module-iot-api/src/main/java/cn/iocoder/yudao/module/iot/enums/ErrorCodeConstants.java
| @@ -30,6 +30,7 @@ public interface ErrorCodeConstants { | @@ -30,6 +30,7 @@ public interface ErrorCodeConstants { | ||
| 30 | ErrorCode DEVICE_GATEWAY_NOT_EXISTS = new ErrorCode(1_050_003_004, "网关设备不存在"); | 30 | ErrorCode DEVICE_GATEWAY_NOT_EXISTS = new ErrorCode(1_050_003_004, "网关设备不存在"); |
| 31 | ErrorCode DEVICE_NOT_GATEWAY = new ErrorCode(1_050_003_005, "设备不是网关设备"); | 31 | ErrorCode DEVICE_NOT_GATEWAY = new ErrorCode(1_050_003_005, "设备不是网关设备"); |
| 32 | ErrorCode DEVICE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_003_006, "导入设备数据不能为空!"); | 32 | ErrorCode DEVICE_IMPORT_LIST_IS_EMPTY = new ErrorCode(1_050_003_006, "导入设备数据不能为空!"); |
| 33 | + ErrorCode DEVICE_DATA_CONTENT_JSON_PARSE_ERROR = new ErrorCode(1_050_003_007, "导入设备数据格式错误!"); | ||
| 33 | 34 | ||
| 34 | // ========== 产品分类 1-050-004-000 ========== | 35 | // ========== 产品分类 1-050-004-000 ========== |
| 35 | ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_004_000, "产品分类不存在"); | 36 | ErrorCode PRODUCT_CATEGORY_NOT_EXISTS = new ErrorCode(1_050_004_000, "产品分类不存在"); |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/IotDeviceDataController.java
| @@ -55,11 +55,10 @@ public class IotDeviceDataController { | @@ -55,11 +55,10 @@ public class IotDeviceDataController { | ||
| 55 | // TODO:数据权限 | 55 | // TODO:数据权限 |
| 56 | @PostMapping("/simulator") | 56 | @PostMapping("/simulator") |
| 57 | @Operation(summary = "模拟设备") | 57 | @Operation(summary = "模拟设备") |
| 58 | - public CommonResult<Boolean> simulatorDevice(@Valid @RequestBody IotDeviceDataSimulatorSaveReqVO simulcatorReqVO) { | ||
| 59 | - //TODO:先生成一下设备日志 后续完善模拟设备代码逻辑 | 58 | + public CommonResult<Boolean> simulatorDevice(@Valid @RequestBody IotDeviceDataSimulatorSaveReqVO simulatorReqVO) { |
| 59 | + //TODO:先使用 IotDeviceDataSimulatorSaveReqVO 另外content里数据类型的效验前端也没做,后端应该要要效验一下,这块后续看看怎么安排 | ||
| 60 | // TODO @super:应该 deviceDataService 里面有个 simulatorDevice,然后里面去 insert 日志! | 60 | // TODO @super:应该 deviceDataService 里面有个 simulatorDevice,然后里面去 insert 日志! |
| 61 | - IotDevicePropertyReportReqDTO simulatorReqVO = new IotDevicePropertyReportReqDTO(); | ||
| 62 | - deviceDataService.simulateSend(simulatorReqVO); | 61 | + deviceDataService.simulatorSend(simulatorReqVO); |
| 63 | return success(true); | 62 | return success(true); |
| 64 | } | 63 | } |
| 65 | 64 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/vo/deviceData/IotDeviceDataSimulatorSaveReqVO.java
| @@ -38,7 +38,6 @@ public class IotDeviceDataSimulatorSaveReqVO { | @@ -38,7 +38,6 @@ public class IotDeviceDataSimulatorSaveReqVO { | ||
| 38 | @NotEmpty(message = "数据内容不能为空") | 38 | @NotEmpty(message = "数据内容不能为空") |
| 39 | private String content; | 39 | private String content; |
| 40 | 40 | ||
| 41 | - // TODO @芋艿:需要讨论下,reportTime 到底以那个为准! | ||
| 42 | @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED) | 41 | @Schema(description = "上报时间", requiredMode = Schema.RequiredMode.REQUIRED) |
| 43 | private Long reportTime; | 42 | private Long reportTime; |
| 44 | 43 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/consumer/deviceconsumer/DeviceConsumer.java
| @@ -30,7 +30,9 @@ public class DeviceConsumer { | @@ -30,7 +30,9 @@ public class DeviceConsumer { | ||
| 30 | @Async | 30 | @Async |
| 31 | public void onMessage(ThingModelMessage message) { | 31 | public void onMessage(ThingModelMessage message) { |
| 32 | log.info("[onMessage][消息内容({})]", message); | 32 | log.info("[onMessage][消息内容({})]", message); |
| 33 | - deviceDataService.saveDeviceDataTest(message); | 33 | + // 设备数据记录 |
| 34 | +// deviceDataService.saveDeviceDataTest(message); | ||
| 35 | + // 设备日志记录 | ||
| 34 | iotDeviceLogDataService.saveDeviceLog(message); | 36 | iotDeviceLogDataService.saveDeviceLog(message); |
| 35 | } | 37 | } |
| 36 | 38 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/mq/consumer/simulatesend/SimulateSendConsumer.java deleted
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceLogDataService.java
| @@ -37,7 +37,11 @@ public interface IotDeviceLogDataService { | @@ -37,7 +37,11 @@ public interface IotDeviceLogDataService { | ||
| 37 | */ | 37 | */ |
| 38 | PageResult<IotDeviceLogDO> getDeviceLogPage(IotDeviceLogPageReqVO pageReqVO); | 38 | PageResult<IotDeviceLogDO> getDeviceLogPage(IotDeviceLogPageReqVO pageReqVO); |
| 39 | 39 | ||
| 40 | - | 40 | + /** |
| 41 | + * 插入设备日志 | ||
| 42 | + * | ||
| 43 | + * @param msg 设备数据 | ||
| 44 | + */ | ||
| 41 | void saveDeviceLog(ThingModelMessage msg); | 45 | void saveDeviceLog(ThingModelMessage msg); |
| 42 | 46 | ||
| 43 | } | 47 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceLogDataServiceImpl.java
| 1 | package cn.iocoder.yudao.module.iot.service.device; | 1 | package cn.iocoder.yudao.module.iot.service.device; |
| 2 | 2 | ||
| 3 | +import cn.hutool.json.JSONUtil; | ||
| 3 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 4 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 4 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; | 5 | import cn.iocoder.yudao.framework.common.util.object.BeanUtils; |
| 5 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataSimulatorSaveReqVO; | 6 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataSimulatorSaveReqVO; |
| @@ -12,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; | @@ -12,6 +13,7 @@ import lombok.extern.slf4j.Slf4j; | ||
| 12 | import org.springframework.stereotype.Service; | 13 | import org.springframework.stereotype.Service; |
| 13 | import org.springframework.validation.annotation.Validated; | 14 | import org.springframework.validation.annotation.Validated; |
| 14 | 15 | ||
| 16 | +import java.util.Date; | ||
| 15 | import java.util.List; | 17 | import java.util.List; |
| 16 | 18 | ||
| 17 | /** | 19 | /** |
| @@ -79,7 +81,19 @@ public class IotDeviceLogDataServiceImpl implements IotDeviceLogDataService{ | @@ -79,7 +81,19 @@ public class IotDeviceLogDataServiceImpl implements IotDeviceLogDataService{ | ||
| 79 | 81 | ||
| 80 | @Override | 82 | @Override |
| 81 | public void saveDeviceLog(ThingModelMessage msg) { | 83 | public void saveDeviceLog(ThingModelMessage msg) { |
| 84 | + // 1. 构建设备日志对象 | ||
| 85 | + IotDeviceLogDO iotDeviceLogDO = IotDeviceLogDO.builder() | ||
| 86 | + .id(msg.getId()) // 消息ID | ||
| 87 | + .deviceKey(msg.getDeviceKey()) // 设备标识 | ||
| 88 | + .productKey(msg.getProductKey()) // 产品标识 | ||
| 89 | + .type(msg.getMethod()) // 消息类型,使用method作为类型 | ||
| 90 | + .subType("property") // TODO:这块先写死,后续优化 | ||
| 91 | + .content(JSONUtil.toJsonStr(msg)) // TODO:后续优化 | ||
| 92 | + .reportTime(msg.getTime()) // 上报时间 | ||
| 93 | + .build(); | ||
| 82 | 94 | ||
| 95 | + // 2. 插入设备日志 | ||
| 96 | + iotDeviceLogDataMapper.insert(iotDeviceLogDO); | ||
| 83 | } | 97 | } |
| 84 | 98 | ||
| 85 | } | 99 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDevicePropertyDataService.java
| @@ -46,7 +46,7 @@ public interface IotDevicePropertyDataService { | @@ -46,7 +46,7 @@ public interface IotDevicePropertyDataService { | ||
| 46 | * @param simulatorReqVO 设备数据 | 46 | * @param simulatorReqVO 设备数据 |
| 47 | */ | 47 | */ |
| 48 | 48 | ||
| 49 | - void simulateSend(IotDevicePropertyReportReqDTO simulatorReqVO); | 49 | + void simulatorSend(IotDeviceDataSimulatorSaveReqVO simulatorReqVO); |
| 50 | 50 | ||
| 51 | /** | 51 | /** |
| 52 | * 获得设备属性最新数据 | 52 | * 获得设备属性最新数据 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDevicePropertyDataServiceImpl.java
| @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.iot.service.device; | @@ -3,8 +3,10 @@ package cn.iocoder.yudao.module.iot.service.device; | ||
| 3 | import cn.hutool.core.collection.CollUtil; | 3 | import cn.hutool.core.collection.CollUtil; |
| 4 | import cn.hutool.core.date.DateUtil; | 4 | import cn.hutool.core.date.DateUtil; |
| 5 | import cn.hutool.core.map.MapUtil; | 5 | import cn.hutool.core.map.MapUtil; |
| 6 | +import cn.hutool.core.util.IdUtil; | ||
| 6 | import cn.hutool.core.util.StrUtil; | 7 | import cn.hutool.core.util.StrUtil; |
| 7 | import cn.hutool.json.JSONObject; | 8 | import cn.hutool.json.JSONObject; |
| 9 | +import cn.hutool.json.JSONUtil; | ||
| 8 | import cn.iocoder.yudao.framework.common.pojo.PageResult; | 10 | import cn.iocoder.yudao.framework.common.pojo.PageResult; |
| 9 | import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; | 11 | import cn.iocoder.yudao.module.iot.api.device.dto.IotDevicePropertyReportReqDTO; |
| 10 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataPageReqVO; | 12 | import cn.iocoder.yudao.module.iot.controller.admin.device.vo.deviceData.IotDeviceDataPageReqVO; |
| @@ -39,8 +41,10 @@ import java.util.HashMap; | @@ -39,8 +41,10 @@ import java.util.HashMap; | ||
| 39 | import java.util.List; | 41 | import java.util.List; |
| 40 | import java.util.Map; | 42 | import java.util.Map; |
| 41 | 43 | ||
| 44 | +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||
| 42 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; | 45 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; |
| 43 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; | 46 | import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.filterList; |
| 47 | +import static cn.iocoder.yudao.module.iot.enums.ErrorCodeConstants.DEVICE_DATA_CONTENT_JSON_PARSE_ERROR; | ||
| 44 | 48 | ||
| 45 | /** | 49 | /** |
| 46 | * IoT 设备【属性】数据 Service 实现类 | 50 | * IoT 设备【属性】数据 Service 实现类 |
| @@ -164,24 +168,33 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe | @@ -164,24 +168,33 @@ public class IotDevicePropertyDataServiceImpl implements IotDevicePropertyDataSe | ||
| 164 | thingModelMessageService.saveThingModelMessage(device, thingModelMessage); | 168 | thingModelMessageService.saveThingModelMessage(device, thingModelMessage); |
| 165 | } | 169 | } |
| 166 | 170 | ||
| 167 | - //TODO: copy了saveDeviceData的逻辑,后续看看这块怎么优化 | 171 | + //TODO: copy 了 saveDeviceData 的逻辑,后续看看这块怎么优化 |
| 168 | @Override | 172 | @Override |
| 169 | - public void simulateSend(IotDevicePropertyReportReqDTO simulatorReqVO) { | ||
| 170 | - // 1. 根据产品 key 和设备名称,获得设备信息 | ||
| 171 | - IotDeviceDO device = deviceService.getDeviceByProductKeyAndDeviceName(simulatorReqVO.getProductKey(), simulatorReqVO.getDeviceName()); | ||
| 172 | - // 2. 解析消息,保存数据 | ||
| 173 | - JSONObject jsonObject = new JSONObject(simulatorReqVO.getParams()); | ||
| 174 | - log.info("[saveDeviceData][productKey({}) deviceName({}) data({})]", simulatorReqVO.getProductKey(), simulatorReqVO.getDeviceName(), jsonObject); | 173 | + public void simulatorSend(IotDeviceDataSimulatorSaveReqVO simulatorReqVO) { |
| 174 | + // 1. 根据设备 key ,获得设备信息 | ||
| 175 | + IotDeviceDO device = deviceService.getDeviceByDeviceKey(simulatorReqVO.getDeviceKey()); | ||
| 176 | + | ||
| 177 | + // 2. 解析 content 为 JSON 对象 | ||
| 178 | + JSONObject contentJson; | ||
| 179 | + try { | ||
| 180 | + contentJson = JSONUtil.parseObj(simulatorReqVO.getContent()); | ||
| 181 | + } catch (Exception e) { | ||
| 182 | + throw exception(DEVICE_DATA_CONTENT_JSON_PARSE_ERROR); | ||
| 183 | + } | ||
| 184 | + | ||
| 185 | + // 3. 构建物模型消息 | ||
| 175 | ThingModelMessage thingModelMessage = ThingModelMessage.builder() | 186 | ThingModelMessage thingModelMessage = ThingModelMessage.builder() |
| 176 | - .id(jsonObject.getStr("id")) | ||
| 177 | - .sys(jsonObject.get("sys")) | ||
| 178 | - .method(jsonObject.getStr("method")) | ||
| 179 | - .params(jsonObject.get("params")) | ||
| 180 | - .time(jsonObject.getLong("time") == null ? System.currentTimeMillis() : jsonObject.getLong("time")) | 187 | + .id(IdUtil.fastSimpleUUID()) // TODO:后续优化 |
| 188 | + .sys(null)// TODO:这块先写死,后续优化 | ||
| 189 | + .method("thing.event.property.post") // TODO:这块先写死,后续优化 | ||
| 190 | + .params(contentJson) // 将 content 作为 params | ||
| 191 | + .time(simulatorReqVO.getReportTime()) // 使用上报时间 | ||
| 181 | .productKey(simulatorReqVO.getProductKey()) | 192 | .productKey(simulatorReqVO.getProductKey()) |
| 182 | - .deviceName(simulatorReqVO.getDeviceName()) | 193 | + .deviceName(device.getDeviceName()) |
| 183 | .deviceKey(device.getDeviceKey()) | 194 | .deviceKey(device.getDeviceKey()) |
| 184 | .build(); | 195 | .build(); |
| 196 | + | ||
| 197 | + // 4. 发送模拟消息 | ||
| 185 | simulateSendProducer.sendSimulateMessage(thingModelMessage); | 198 | simulateSendProducer.sendSimulateMessage(thingModelMessage); |
| 186 | } | 199 | } |
| 187 | 200 |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceService.java
| @@ -72,6 +72,15 @@ public interface IotDeviceService { | @@ -72,6 +72,15 @@ public interface IotDeviceService { | ||
| 72 | */ | 72 | */ |
| 73 | IotDeviceDO getDevice(Long id); | 73 | IotDeviceDO getDevice(Long id); |
| 74 | 74 | ||
| 75 | + | ||
| 76 | + /** | ||
| 77 | + * 根据设备 key 获得设备 | ||
| 78 | + * | ||
| 79 | + * @param deviceKey 编号 | ||
| 80 | + * @return IoT 设备 | ||
| 81 | + */ | ||
| 82 | + IotDeviceDO getDeviceByDeviceKey(String deviceKey); | ||
| 83 | + | ||
| 75 | /** | 84 | /** |
| 76 | * ��得设备分页 | 85 | * ��得设备分页 |
| 77 | * | 86 | * |
yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/service/device/IotDeviceServiceImpl.java
| @@ -198,6 +198,11 @@ public class IotDeviceServiceImpl implements IotDeviceService { | @@ -198,6 +198,11 @@ public class IotDeviceServiceImpl implements IotDeviceService { | ||
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | @Override | 200 | @Override |
| 201 | + public IotDeviceDO getDeviceByDeviceKey(String deviceKey) { | ||
| 202 | + return deviceMapper.selectByDeviceKey(deviceKey); | ||
| 203 | + } | ||
| 204 | + | ||
| 205 | + @Override | ||
| 201 | public PageResult<IotDeviceDO> getDevicePage(IotDevicePageReqVO pageReqVO) { | 206 | public PageResult<IotDeviceDO> getDevicePage(IotDevicePageReqVO pageReqVO) { |
| 202 | return deviceMapper.selectPage(pageReqVO); | 207 | return deviceMapper.selectPage(pageReqVO); |
| 203 | } | 208 | } |
yudao-module-iot/yudao-module-iot-biz/src/main/resources/mapper/device/IotDeviceLogDataMapper.xml
| @@ -27,7 +27,7 @@ | @@ -27,7 +27,7 @@ | ||
| 27 | 27 | ||
| 28 | <!-- 插入设备日志数据 在子表不存在的情况下 可在数据插入时 自动建表 --> | 28 | <!-- 插入设备日志数据 在子表不存在的情况下 可在数据插入时 自动建表 --> |
| 29 | <insert id="insert"> | 29 | <insert id="insert"> |
| 30 | - INSERT INTO device_log_${log.deviceKey} (id, product_key, type, subType, content, report_time) | 30 | + INSERT INTO device_log_${log.deviceKey} (ts, id, product_key, type, subType, content, report_time) |
| 31 | USING device_log | 31 | USING device_log |
| 32 | TAGS ('${log.deviceKey}') | 32 | TAGS ('${log.deviceKey}') |
| 33 | VALUES ( | 33 | VALUES ( |