Browse Source

fix:优化设备状态推送方式

master
白凤吉 2 weeks ago
parent
commit
c9af5d98a1
  1. 8
      src/main/java/com/iflytop/colortitration/app/controller/TestController.java
  2. 45
      src/main/java/com/iflytop/colortitration/app/core/aspect/DeviceStateChangeAspect.java
  3. 14
      src/main/java/com/iflytop/colortitration/app/core/event/StateChangeEvent.java
  4. 48
      src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java
  5. 41
      src/main/java/com/iflytop/colortitration/app/core/state/HeatModuleState.java
  6. 3
      src/main/java/com/iflytop/colortitration/app/websocket/server/WebsocketResult.java

8
src/main/java/com/iflytop/colortitration/app/controller/TestController.java

@ -1,5 +1,7 @@
package com.iflytop.colortitration.app.controller;
import com.iflytop.colortitration.app.core.state.DeviceState;
import com.iflytop.colortitration.app.service.TestService;
import com.iflytop.colortitration.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -12,16 +14,20 @@ import org.springframework.web.bind.annotation.RestController;
/**
* 测试用
*/
@Tag(name = "测试用")
@Tag(name = "测试用")
@RestController
@RequestMapping("/api/test")
@RequiredArgsConstructor
@Slf4j
public class TestController {
private final TestService testService;
private final DeviceState deviceState;
@Operation(summary = "启动虚拟模式")
@PostMapping("/virtual")
public Result<?> changeVirtualMode() {
deviceState.setVirtual(true);
return Result.success();
}
}

45
src/main/java/com/iflytop/colortitration/app/core/aspect/DeviceStateChangeAspect.java

@ -0,0 +1,45 @@
package com.iflytop.colortitration.app.core.aspect;
import com.iflytop.colortitration.app.core.state.DeviceState;
import com.iflytop.colortitration.app.websocket.server.WebSocketMessageType;
import com.iflytop.colortitration.app.websocket.server.WebSocketSender;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
@Slf4j
@Aspect
@Component
@RequiredArgsConstructor
public class DeviceStateChangeAspect {
private final WebSocketSender webSocketService;
private final DeviceState deviceState;
private final Lock lock = new ReentrantLock();
@Before("execution(* com.iflytop.colortitration.app.core.state.*.set*(..))")
public void beforeSetMethod(JoinPoint joinPoint) {
lock.lock();
}
@After("execution(* com.iflytop.colortitration.app.core.state.*.set*(..))")
public void afterSetMethod(JoinPoint joinPoint) {
try {
Object[] methodArgs = joinPoint.getArgs();
if (methodArgs != null && methodArgs.length > 0) {
webSocketService.push(WebSocketMessageType.STATUS, deviceState.toJSON());
}
} catch (Exception e) {
log.error("处理状态变更后的值失败", e);
} finally {
lock.unlock();
}
}
}

14
src/main/java/com/iflytop/colortitration/app/core/event/StateChangeEvent.java

@ -0,0 +1,14 @@
package com.iflytop.colortitration.app.core.event;
import lombok.AllArgsConstructor;
import lombok.Data;
/**
* 状态变更事件
*/
@Data
@AllArgsConstructor
public class StateChangeEvent {
private String fieldPath;
private Object oldValue;
private Object newValue;
}

48
src/main/java/com/iflytop/colortitration/app/core/state/DeviceState.java

@ -0,0 +1,48 @@
package com.iflytop.colortitration.app.core.state;
import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.iflytop.colortitration.common.enums.Device;
import com.iflytop.colortitration.common.model.entity.User;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@Schema(description = "设备当前状态")
@Data
@Component
@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"})
public class DeviceState {
@Schema(description = "加热模块属性")
private Map<Device, HeatModuleState> heatModule = new HashMap<>();
@Schema(description = "虚拟模式,true为虚拟")
private boolean virtual = false;
@Schema(description = "初始化状态,true初始化完毕")
private boolean initComplete = false;
@Schema(description = "自检状态,true自检完毕")
private boolean selfTest = false;
@Schema(description = "是否是急停状态,true为急停")
private boolean emergencyStop = false;
@Schema(description = "当前登录用户")
private User currentUser;
public JSONObject toJSON() {
JSONObject json = new JSONObject();
json.putOnce("heatModule", new ArrayList<>(heatModule.values()));
json.putOnce("virtual", virtual);
json.putOnce("initComplete", initComplete);
json.putOnce("selfTest", selfTest);
json.putOnce("emergencyStop", emergencyStop);
json.putOnce("currentUser", currentUser);
return json;
}
}

41
src/main/java/com/iflytop/colortitration/app/core/state/HeatModuleState.java

@ -0,0 +1,41 @@
package com.iflytop.colortitration.app.core.state;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.iflytop.colortitration.common.enums.Device;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Schema(description = "当前加热模块状态")
@Data
@Component
@Scope("prototype")
@RequiredArgsConstructor
@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"})
public class HeatModuleState {
@Schema(description = "加热模块code")
private Device deviceCode;
@Schema(description = "是否启动加热,true为正在加热,false为未在加热")
private boolean open = false;
@Schema(description = "加热器当前温度")
private Double temperature = null;
@Schema(description = "加热器目标温度")
private Double targetTemperature = null;
@Schema(description = "加热器目标加热时间,单位秒")
private Integer targetTime = null;
@Schema(description = "开始加热的时间")
private LocalDateTime startHeatTime = null;
public HeatModuleState(Device deviceCode) {
this.deviceCode = deviceCode;
}
}

3
src/main/java/com/iflytop/colortitration/app/websocket/server/WebsocketResult.java

@ -15,4 +15,7 @@ public class WebsocketResult {
*/
@Schema(description = "推送数据")
private Object data;
@Schema(description = "推送时间戳")
private Long timestamp;
}
Loading…
Cancel
Save