From 182d4c796164dc4c24579045606b6a1fc4b682e8 Mon Sep 17 00:00:00 2001 From: zhuangtianxiang <2913129173@qq.com> Date: Thu, 20 Mar 2025 16:19:29 +0800 Subject: [PATCH] =?UTF-8?q?refactor(iot):=20=E9=87=8D=E6=9E=84=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=92=8C=E4=BA=A7=E5=93=81=E6=A8=A1=E5=9D=97=E7=9A=84?= =?UTF-8?q?=20WebSocket=20=E6=B6=88=E6=81=AF=E5=8F=91=E9=80=81=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除了 Device 和 Product 控制器中的字符串返回值,改为返回服务层对象- 优化了 Event 和 Param服务的实现,使用流式处理提高效率 - 删除了未使用的 SseConfig 类和 WebSocketServer 类 - 调整了 WebSocketConfig 和 WebSocketInterceptor 中的路径配置 - 移除了 Device 和 DeviceVo 中的冗余字段 --- .../framework/message/sse/SseConfig.java | 48 ------------------- .../message/websocket/WebSocketConfig.java | 2 +- .../websocket/WebSocketInterceptor.java | 6 +-- .../message/websocket/WebSocketServer.java | 4 -- .../device/controller/DeviceController.java | 8 ++-- .../modules/iot/device/entity/Device.java | 14 ++---- .../service/impl/DeviceServiceImpl.java | 4 +- .../modules/iot/device/vo/DeviceVo.java | 3 +- .../product/controller/ProductController.java | 15 +----- .../modules/iot/tsl/service/ParamService.java | 2 - .../tsl/service/impl/EventServiceImpl.java | 18 ++++++- .../tsl/service/impl/ParamServiceImpl.java | 14 ------ .../resources/mappers/iot/DeviceMapper.xml | 2 - 13 files changed, 32 insertions(+), 108 deletions(-) delete mode 100644 src/main/java/com/zsc/edu/gateway/framework/message/sse/SseConfig.java delete mode 100644 src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketServer.java diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/sse/SseConfig.java b/src/main/java/com/zsc/edu/gateway/framework/message/sse/SseConfig.java deleted file mode 100644 index 5832ab0..0000000 --- a/src/main/java/com/zsc/edu/gateway/framework/message/sse/SseConfig.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.zsc.edu.gateway.framework.message.sse; - -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import java.io.IOException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.function.Supplier; - -/** - * @author zhuang - */ -@Component -public class SseConfig { - private final ExecutorService executorService = Executors.newCachedThreadPool(); - - public SseEmitter sendSseEvents(Supplier dataSupplier) { - SseEmitter emitter = new SseEmitter(30000L); - - AtomicBoolean isCompleted = new AtomicBoolean(false); - emitter.onCompletion(() -> isCompleted.set(true)); - - executorService.execute(() -> { - try { - while (!isCompleted.get()) { - Object data = dataSupplier.get(); - if (data == null) { - break; - } - if (!isCompleted.get()) { - emitter.send(SseEmitter.event().data(data)); - } - Thread.sleep(5000); - } - } catch (IOException | InterruptedException e) { - emitter.completeWithError(e); - } finally { - emitter.complete(); - } - }); - return emitter; - } - - -} diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketConfig.java b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketConfig.java index ac8b100..1b1c4d3 100644 --- a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketConfig.java +++ b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketConfig.java @@ -20,7 +20,7 @@ public class WebSocketConfig implements WebSocketConfigurer { @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { - registry.addHandler(genericWebSocketHandler, "/ws/{path}") + registry.addHandler(genericWebSocketHandler, "/api/rest/device/ws/device/status", "/api/rest/device/ws/record/status", "/api/rest/product/ws/product/status") .setAllowedOrigins("*") .addInterceptors(new WebSocketInterceptor()); } diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java index e3db3ee..60c332a 100644 --- a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java +++ b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketInterceptor.java @@ -36,13 +36,13 @@ public class WebSocketInterceptor implements HandshakeInterceptor { // 根据路径变量设置不同的业务逻辑 Supplier switch (pathVariable) { - case "device/status": + case "/api/rest/device/ws/device/status": attributes.put("dataSupplier", (Supplier) () -> String.valueOf(deviceService.status())); break; - case "record/status": + case "/api/rest/device/ws/record/status": attributes.put("dataSupplier", (Supplier) () -> String.valueOf(recordService.recordDataStatus())); break; - case "product/status": + case "/api/rest/product/ws/product/status": attributes.put("dataSupplier", (Supplier) () -> String.valueOf(productService.status())); break; default: diff --git a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketServer.java b/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketServer.java deleted file mode 100644 index 76c68d5..0000000 --- a/src/main/java/com/zsc/edu/gateway/framework/message/websocket/WebSocketServer.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.zsc.edu.gateway.framework.message.websocket; - -public class WebSocketServer { -} diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java index c13a7c9..173a276 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/controller/DeviceController.java @@ -144,8 +144,8 @@ public class DeviceController { @GetMapping(value = "/ws/device/status") @PreAuthorize("hasAuthority('iot:device:query')") @DataPermission - public String status() { - return "websocket-device-status"; + public Object status() { + return service.status(); } /** @@ -154,8 +154,8 @@ public class DeviceController { @GetMapping(value = "/ws/record/status") @PreAuthorize("hasAuthority('iot:device:query')") @DataPermission - public String recordDataStatus() { - return "websocket-record-status"; + public Object recordDataStatus() { + return recordService.recordDataStatus(); } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java index b1226d4..fafa3da 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/entity/Device.java @@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.IEnum; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.zsc.edu.gateway.common.enums.IState; import com.zsc.edu.gateway.framework.json.JsonbTypeHandler; -import com.zsc.edu.gateway.modules.attachment.entity.Attachment; import com.zsc.edu.gateway.modules.iot.product.entity.Product; import com.zsc.edu.gateway.modules.system.entity.BaseEntity; import lombok.AllArgsConstructor; @@ -24,6 +25,7 @@ import java.util.Map; @Getter @NoArgsConstructor @AllArgsConstructor +@JsonInclude @TableName("iot_device") public class Device extends BaseEntity { @@ -114,22 +116,12 @@ public class Device extends BaseEntity { */ public String iconId; - /** - * 设备图标附件 - */ - @TableField(exist = false) - public Attachment icon; /** * 设备预览图附件ID */ public String previewId; - /** - * 设备预览图附件 - */ - @TableField(exist = false) - public Attachment preview; public enum Status implements IEnum, IState { UNACTIVATED(0, "未激活"), diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java index 1d74de7..836c872 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/service/impl/DeviceServiceImpl.java @@ -227,12 +227,10 @@ public class DeviceServiceImpl extends ServiceImpl imp */ @Override public List findByName(String name) { - if (name == null) { - return baseMapper.selectList(new QueryWrapper<>()); - } return baseMapper.selectListByName(name); } + /** * 切换在线状态返回切换数 */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java index 28907c6..3095526 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/device/vo/DeviceVo.java @@ -1,8 +1,6 @@ package com.zsc.edu.gateway.modules.iot.device.vo; -import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonInclude; -import com.zsc.edu.gateway.framework.json.JsonbTypeHandler; import com.zsc.edu.gateway.modules.attachment.entity.Attachment; import com.zsc.edu.gateway.modules.iot.device.entity.Device; import com.zsc.edu.gateway.modules.iot.product.entity.Product; @@ -117,6 +115,7 @@ public class DeviceVo { */ public Attachment icon; + /** * 设备预览图附件ID */ diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java b/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java index a48bc3d..f32cbf7 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/product/controller/ProductController.java @@ -1,6 +1,5 @@ package com.zsc.edu.gateway.modules.iot.product.controller; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zsc.edu.gateway.framework.message.sse.SseConfig; import com.zsc.edu.gateway.framework.mybatisplus.DataPermission; @@ -8,23 +7,13 @@ import com.zsc.edu.gateway.modules.iot.product.dto.ProductDto; import com.zsc.edu.gateway.modules.iot.product.entity.Product; import com.zsc.edu.gateway.modules.iot.product.query.ProductQuery; import com.zsc.edu.gateway.modules.iot.product.service.ProductService; -import com.zsc.edu.gateway.modules.iot.product.service.impl.ProductServiceImpl; -import com.zsc.edu.gateway.modules.iot.product.vo.ProductStatusVo; import com.zsc.edu.gateway.modules.operationLog.entity.OperationLogAnnotation; import jakarta.annotation.Resource; import lombok.AllArgsConstructor; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; -import org.springframework.data.web.PageableDefault; -import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; -import java.io.IOException; -import java.util.Collection; import java.util.List; -import java.util.concurrent.ExecutorService; /** * @author zhuang @@ -124,8 +113,8 @@ public class ProductController { @GetMapping(value = "/ws/product/status") @DataPermission @PreAuthorize("hasAuthority('iot:product:query')") - public String status() { - return "websocket-product-status"; + public Object status() { + return service.status(); } } diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/ParamService.java b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/ParamService.java index 78cd5a7..3b29772 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/ParamService.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/ParamService.java @@ -14,8 +14,6 @@ public interface ParamService extends IService { Boolean create(List params, Long id, Param.ForeignType foreignType); - Boolean createCompareParam(List params, Long id, Param.ForeignType foreignType); - Boolean update(List paramDto, Long id); Boolean delete(Long id); diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/EventServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/EventServiceImpl.java index d3c2995..35d5794 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/EventServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/EventServiceImpl.java @@ -3,9 +3,12 @@ package com.zsc.edu.gateway.modules.iot.tsl.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zsc.edu.gateway.exception.ConstraintException; import com.zsc.edu.gateway.modules.iot.tsl.dto.EventDto; +import com.zsc.edu.gateway.modules.iot.tsl.entity.CompareParam; import com.zsc.edu.gateway.modules.iot.tsl.entity.Event; import com.zsc.edu.gateway.modules.iot.tsl.entity.Param; +import com.zsc.edu.gateway.modules.iot.tsl.mapper.CompareParamMapper; import com.zsc.edu.gateway.modules.iot.tsl.mapper.EventMapper; +import com.zsc.edu.gateway.modules.iot.tsl.repo.CompareParamRepository; import com.zsc.edu.gateway.modules.iot.tsl.repo.EventRepository; import com.zsc.edu.gateway.modules.iot.tsl.service.EventService; import com.zsc.edu.gateway.modules.iot.tsl.service.ParamService; @@ -13,6 +16,9 @@ import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; +import java.util.stream.Collectors; + /** * @author Yao */ @@ -21,6 +27,8 @@ import org.springframework.transaction.annotation.Transactional; public class EventServiceImpl extends ServiceImpl implements EventService { private final EventMapper mapper; private final ParamService paramService; + private final CompareParamRepository compareParamRepository; + private final CompareParamMapper compareParamMapper; /** * 新建物模型事件 @@ -36,7 +44,15 @@ public class EventServiceImpl extends ServiceImpl implem } Event event = mapper.toEntity(dto); save(event); - paramService.createCompareParam(dto.getOutputs(), event.getId(), Param.ForeignType.EVENT); + List paramsToInsert = dto.getOutputs().stream() + .map(output -> { + CompareParam param = compareParamMapper.toEntity(output); + param.setForeignId(event.getId()); + param.setForeignType(Param.ForeignType.EVENT); + return param; + }) + .collect(Collectors.toList()); + compareParamRepository.insert(paramsToInsert); return event; } /** diff --git a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/ParamServiceImpl.java b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/ParamServiceImpl.java index 0f049d6..27964c5 100644 --- a/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/ParamServiceImpl.java +++ b/src/main/java/com/zsc/edu/gateway/modules/iot/tsl/service/impl/ParamServiceImpl.java @@ -44,20 +44,6 @@ public class ParamServiceImpl extends ServiceImpl implem return true; } - @Override - @Transactional - public Boolean createCompareParam(List params, Long id, Param.ForeignType foreignType) { - List paramsToInsert = params.stream() - .map(dto -> { - CompareParam param = compareParamMapper.toEntity(dto); - param.setForeignId(id); - param.setForeignType(foreignType); - return param; - }) - .collect(Collectors.toList()); - compareParamRepository.insert(paramsToInsert); - return true; - } @Override @Transactional diff --git a/src/main/resources/mappers/iot/DeviceMapper.xml b/src/main/resources/mappers/iot/DeviceMapper.xml index a313a5b..8016eb9 100644 --- a/src/main/resources/mappers/iot/DeviceMapper.xml +++ b/src/main/resources/mappers/iot/DeviceMapper.xml @@ -99,8 +99,6 @@ ip.name as param_name, ip.remark as param_remark, ai.id as icon_id, - ai.file_name as icon_file_name, - ap.file_name as preview_file_name, ap.id as preview_id from iot_device d left join iot_product p on d.product_id = p.id