Browse Source

feat:增加设备状态推送

tags/1.0
白凤吉 5 months ago
parent
commit
f6cd529194
  1. 1
      build.gradle
  2. 13
      src/main/java/com/qyft/ms/app/common/constant/WebSocketMessageType.java
  3. 27
      src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java
  4. 7
      src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java
  5. 61
      src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java
  6. 3
      src/main/java/com/qyft/ms/app/device/status/SprayTask.java
  7. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java
  8. 4
      src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java
  9. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java
  10. 2
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java
  11. 7
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java
  12. 4
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java
  13. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java
  14. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java
  15. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java
  16. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java
  17. 2
      src/main/java/com/qyft/ms/app/service/SelfTestService.java

1
build.gradle

@ -35,6 +35,7 @@ dependencies {
implementation group: 'cn.hutool', name: 'hutool-all', version: '5.8.35'
implementation group: 'com.github.xiaoymin', name: 'knife4j-openapi3-jakarta-spring-boot-starter', version: '4.5.0'
implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.12.6'
implementation 'org.springframework.boot:spring-boot-starter-aop'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.12.6'
runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.12.6'
implementation group: 'com.alibaba', name: 'fastjson', version: '2.0.54'

13
src/main/java/com/qyft/ms/app/common/constant/WebSocketMessageType.java

@ -1,16 +1,18 @@
package com.qyft.ms.app.common.constant;
public class WebSocketMessageType {
private WebSocketMessageType() {}
private WebSocketMessageType() {
}
/**
* 喷涂任务消息
*/
public static final String SPRAY_TASK = "spray-tsk";
public static final String SPRAY_TASK = "spray_tsk";
/**
* 喷涂点位变化
*/
public static final String SPRAY_POINT = "spray-point";
public static final String SPRAY_POINT = "spray_point";
/**
* 系统急停按钮被按下
@ -21,7 +23,10 @@ public class WebSocketMessageType {
* 系统急停按钮被释放
*/
public static final String SYSTEM_E_STOP_RELEASED = "system_e_stop_released";
/**
* 设备状态发生改变
*/
public static final String DEVICE_STATUS_CHANGE = "device_status_change";
}

27
src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java

@ -0,0 +1,27 @@
package com.qyft.ms.app.core.aspect;
import com.qyft.ms.app.common.constant.WebSocketMessageType;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.system.service.WebSocketService;
import lombok.RequiredArgsConstructor;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
@Component
@RequiredArgsConstructor
public class DeviceStatusAspect {
private final WebSocketService webSocketService;
@Pointcut("execution(* com.qyft.ms.app.device.status.DeviceStatus.set*(..))")
public void setterMethods() {
}
@After("setterMethods()")
public void afterSetter(JoinPoint joinPoint) throws Throwable {
webSocketService.pushMsg(WebSocketMessageType.DEVICE_STATUS_CHANGE, DeviceStatus.getInstance());
}
}

7
src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java

@ -3,6 +3,7 @@ package com.qyft.ms.app.device.spray;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qyft.ms.app.common.constant.WebSocketMessageType;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.app.model.bo.Point2D;
import com.qyft.ms.app.model.entity.SysSettings;
@ -85,6 +86,7 @@ public class SprayTaskExecutor {
List<Point2D> sprayStepList = new ArrayList<>();
sprayTask.setSuspendable(true);//可以暂停单次喷涂范围内可以进行暂停
DeviceStatus.getInstance().setSuspendable(true);
for (List<DeviceCommand> deviceCommandAgg : deviceCommandList) {//单次喷涂
if (reCurrentStep < currentStep) {
break;
@ -111,6 +113,7 @@ public class SprayTaskExecutor {
}
currentSprayIndex++;
sprayTask.setSuspendable(false);//不可暂停
DeviceStatus.getInstance().setSuspendable(false);
sprayTask.getSprayedPoints().add(sprayStepList);
DeviceCommand nozzleValveCloseCommand = DeviceCommandGenerator.nozzleValveClose();//关闭喷嘴阀
@ -143,6 +146,10 @@ public class SprayTaskExecutor {
// 在线程结束后将 taskThread 设置为 null保证状态一致和资源释放
synchronized (this) {
taskThread = null;
SprayTask.getInstance().clear();
DeviceStatus.getInstance().setSpraying(false);
DeviceStatus.getInstance().setPaused(false);
DeviceStatus.getInstance().setSuspendable(false);
}
}
});

61
src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java

@ -0,0 +1,61 @@
package com.qyft.ms.app.device.status;
import lombok.Data;
/**
* 设备运行状态
*/
@Data
public class DeviceStatus {
private DeviceStatus() {
}
/**
* 设备是否正在进行的喷涂任务
*/
private volatile boolean spraying = false;
/**
* 喷涂任务暂停状态
*/
private volatile boolean paused = false;
/**
* 当前状态是否可以暂停
*/
private volatile boolean suspendable = false;
/**
* 是否正在清洗注射器管路
*/
private volatile boolean cleaningSyringePipeline = false;
/**
* 是否正在清洗喷嘴管路
*/
private volatile boolean cleaningNozzlePipeline = false;
/**
* 是否正在预充
*/
private volatile boolean prefilling = false;
/**
* 是否正在除湿
*/
private volatile boolean dehumidifierRunning = false;
/**
* 是否完成自检
*/
private volatile boolean selfTestCompleted = false;
private static class Holder {
private static final DeviceStatus INSTANCE = new DeviceStatus();
}
public static DeviceStatus getInstance() {
return DeviceStatus.Holder.INSTANCE;
}
}

3
src/main/java/com/qyft/ms/app/device/status/SprayTask.java

@ -96,9 +96,12 @@ public class SprayTask {
public void clear() {
paused = false;
suspendable = false;
spraying = false;
sprayPreStepsCompleted = false;
spraySteps.clear();
currentStep = 0;
sprayedPoints.clear();
}
@Data

3
src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java

@ -1,6 +1,7 @@
package com.qyft.ms.app.front.cmd.business;
import cn.hutool.json.JSONObject;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.constant.CommandStatus;
import com.qyft.ms.system.common.device.command.CommandFuture;
@ -58,6 +59,8 @@ public class DehumidifierStart extends BaseCommandHandler {
DeviceCommand dehumidifierValveOpenCmd = DeviceCommandGenerator.dehumidifierValveOpen(); // 生成开启除湿阀指令
CommandFuture dehumidifierValveOpenCmdFuture = deviceCommandService.sendCommand(dehumidifierValveOpenCmd, form, emitter);
commandWait(dehumidifierValveOpenCmdFuture);
DeviceStatus.getInstance().setDehumidifierRunning(true);
});
}
}

4
src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java

@ -1,5 +1,7 @@
package com.qyft.ms.app.front.cmd.business;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.device.command.CommandFuture;
import com.qyft.ms.system.common.device.command.DeviceCommandGenerator;
@ -31,6 +33,8 @@ public class DehumidifierStop extends BaseCommandHandler {
DeviceCommand dehumidifierStopCommand = DeviceCommandGenerator.dehumidifierValveClose(); // 生成关闭除湿阀指令
CommandFuture dehumidifierStopCommandFuture = deviceCommandService.sendCommand(dehumidifierStopCommand, form, emitter);
commandWait(dehumidifierStopCommandFuture);
DeviceStatus.getInstance().setDehumidifierRunning(false);
});
}
}

3
src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java

@ -2,6 +2,7 @@ package com.qyft.ms.app.front.cmd.business;
import com.qyft.ms.app.device.spray.SprayTaskExecutor;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.constant.CommandStatus;
@ -55,6 +56,8 @@ public class MatrixSprayPause extends BaseCommandHandler {
CommandFuture motorYStopCommandFuture = deviceCommandService.sendCommand(motorYStopCommand, form, emitter);
CommandFuture motorZStopCommandFuture = deviceCommandService.sendCommand(motorZStopCommand, form, emitter);
commandWait(motorXStopCommandFuture, motorYStopCommandFuture, motorZStopCommandFuture);
sprayTask.setPaused(true);
DeviceStatus.getInstance().setPaused(true);
}else{
emitter.send(FrontCommand.backstage(form.getCmdId(), form.getCmdCode(), CommandStatus.ERROR, "当前喷涂任务不可暂停"), MediaType.APPLICATION_JSON);
}

2
src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java

@ -3,6 +3,7 @@ package com.qyft.ms.app.front.cmd.business;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qyft.ms.app.common.generator.PathGenerator;
import com.qyft.ms.app.device.spray.SprayTaskExecutor;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.app.model.entity.Position;
import com.qyft.ms.app.service.PositionService;
@ -112,6 +113,7 @@ public class MatrixSprayStart extends BaseCommandHandler {
return;
} else {
sprayTask.setSpraying(true);
DeviceStatus.getInstance().setSpraying(true);
}
// 1. 参数校验

7
src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java

@ -1,6 +1,8 @@
package com.qyft.ms.app.front.cmd.business;
import com.qyft.ms.app.device.spray.SprayTaskExecutor;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.device.command.CommandFuture;
import com.qyft.ms.system.common.device.command.DeviceCommandGenerator;
@ -57,6 +59,11 @@ public class MatrixSprayStop extends BaseCommandHandler {
CommandFuture motorYPositionSetCommandFuture = deviceCommandService.sendCommand(motorYPositionSetCommand, form, emitter);
CommandFuture motorZPositionSetCommandFuture = deviceCommandService.sendCommand(motorZPositionSetCommand, form, emitter);
commandWait(motorXPositionSetCommandFuture, motorYPositionSetCommandFuture, motorZPositionSetCommandFuture);
SprayTask.getInstance().clear();
DeviceStatus.getInstance().setSpraying(false);
DeviceStatus.getInstance().setPaused(false);
DeviceStatus.getInstance().setSuspendable(false);
});
}
}

4
src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java

@ -2,6 +2,8 @@ package com.qyft.ms.app.front.cmd.business;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.app.model.entity.Position;
import com.qyft.ms.app.model.entity.SysSettings;
import com.qyft.ms.app.service.PositionService;
@ -81,6 +83,8 @@ public class NozzlePipelinePreFill extends BaseCommandHandler {
DeviceCommand syringePumpStartCommand = DeviceCommandGenerator.syringePumpForward(speed); // 生成移动注射泵指令
CommandFuture syringePumpStartCommandFuture = deviceCommandService.sendCommand(syringePumpStartCommand, form, emitter);
commandWait(syringePumpStartCommandFuture);
DeviceStatus.getInstance().setPrefilling(true);
});
}

3
src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java

@ -1,5 +1,6 @@
package com.qyft.ms.app.front.cmd.business;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.device.command.CommandFuture;
import com.qyft.ms.system.common.device.command.DeviceCommandGenerator;
@ -38,6 +39,8 @@ public class NozzlePipelinePreFillStop extends BaseCommandHandler {
DeviceCommand nozzleValveCloseCommand = DeviceCommandGenerator.nozzleValveClose(); //关闭喷嘴阀
CommandFuture nozzleValveCloseCommandFuture = deviceCommandService.sendCommand(nozzleValveCloseCommand, form, emitter);
commandWait(syringePumpStopCommandFuture, threeWayValveCloseAllCommandFuture, nozzleValveCloseCommandFuture);
DeviceStatus.getInstance().setPrefilling(false);
});
}

3
src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java

@ -2,6 +2,7 @@ package com.qyft.ms.app.front.cmd.business;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.model.entity.Position;
import com.qyft.ms.app.model.entity.SysSettings;
import com.qyft.ms.app.service.PositionService;
@ -69,6 +70,8 @@ public class NozzlePipelineWash extends BaseCommandHandler {
DeviceCommand threeWayValveOpenSyringePipelineCommand = DeviceCommandGenerator.threeWayValveOpenSyringePipeline(); // 打开三通阀喷嘴管路
CommandFuture threeWayValveOpenSyringePipelineCommandFuture = deviceCommandService.sendCommand(threeWayValveOpenSyringePipelineCommand, form, emitter);
commandWait(threeWayValveOpenSyringePipelineCommandFuture);
DeviceStatus.getInstance().setCleaningNozzlePipeline(true);
});
}

3
src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java

@ -2,6 +2,7 @@ package com.qyft.ms.app.front.cmd.business;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.model.entity.Position;
import com.qyft.ms.app.model.entity.SysSettings;
import com.qyft.ms.app.service.PositionService;
@ -78,6 +79,8 @@ public class SyringePipelineWash extends BaseCommandHandler {
DeviceCommand syringePumpStartCommand = DeviceCommandGenerator.syringePumpForward(speed); // 生成移动注射泵指令
CommandFuture syringePumpStartCommandFuture = deviceCommandService.sendCommand(syringePumpStartCommand, form, emitter);
commandWait(syringePumpStartCommandFuture);
DeviceStatus.getInstance().setCleaningSyringePipeline(true);
});
}

3
src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java

@ -1,5 +1,6 @@
package com.qyft.ms.app.front.cmd.business;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.system.common.annotation.CommandMapping;
import com.qyft.ms.system.common.device.command.CommandFuture;
import com.qyft.ms.system.common.device.command.DeviceCommandGenerator;
@ -35,6 +36,8 @@ public class SyringePipelineWashStop extends BaseCommandHandler {
DeviceCommand threeWayValveCloseAllCommand = DeviceCommandGenerator.threeWayValveCloseAll(); // 生成全部关闭三通阀指令
CommandFuture threeWayValveCloseAllCommandFuture = deviceCommandService.sendCommand(threeWayValveCloseAllCommand, form, emitter);
commandWait(syringePumpStopCommandFuture, threeWayValveCloseAllCommandFuture);
DeviceStatus.getInstance().setCleaningSyringePipeline(false);
});
}

2
src/main/java/com/qyft/ms/app/service/SelfTestService.java

@ -1,5 +1,6 @@
package com.qyft.ms.app.service;
import com.qyft.ms.app.device.status.DeviceStatus;
import com.qyft.ms.app.model.vo.SelfTestVO;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -15,6 +16,7 @@ public class SelfTestService {
*/
public SelfTestVO startTest() {
SelfTestVO selfTestBO = new SelfTestVO();
DeviceStatus.getInstance().setSelfTestCompleted(true);
return selfTestBO;
}
}
Loading…
Cancel
Save