From f6cd5291947ac635535595b5b3af7cf2c0161e97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Wed, 19 Mar 2025 15:52:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E8=AE=BE=E5=A4=87?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=8E=A8=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../app/common/constant/WebSocketMessageType.java | 13 +++-- .../ms/app/core/aspect/DeviceStatusAspect.java | 27 ++++++++++ .../ms/app/device/spray/SprayTaskExecutor.java | 7 +++ .../qyft/ms/app/device/status/DeviceStatus.java | 61 ++++++++++++++++++++++ .../com/qyft/ms/app/device/status/SprayTask.java | 3 ++ .../app/front/cmd/business/DehumidifierStart.java | 3 ++ .../app/front/cmd/business/DehumidifierStop.java | 4 ++ .../app/front/cmd/business/MatrixSprayPause.java | 3 ++ .../app/front/cmd/business/MatrixSprayStart.java | 2 + .../ms/app/front/cmd/business/MatrixSprayStop.java | 7 +++ .../front/cmd/business/NozzlePipelinePreFill.java | 4 ++ .../cmd/business/NozzlePipelinePreFillStop.java | 3 ++ .../app/front/cmd/business/NozzlePipelineWash.java | 3 ++ .../front/cmd/business/SyringePipelineWash.java | 3 ++ .../cmd/business/SyringePipelineWashStop.java | 3 ++ .../com/qyft/ms/app/service/SelfTestService.java | 2 + 17 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java create mode 100644 src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java diff --git a/build.gradle b/build.gradle index 6a6db4c..a201096 100644 --- a/build.gradle +++ b/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' diff --git a/src/main/java/com/qyft/ms/app/common/constant/WebSocketMessageType.java b/src/main/java/com/qyft/ms/app/common/constant/WebSocketMessageType.java index 914cd80..bc63894 100644 --- a/src/main/java/com/qyft/ms/app/common/constant/WebSocketMessageType.java +++ b/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"; } diff --git a/src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java b/src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java new file mode 100644 index 0000000..4c71178 --- /dev/null +++ b/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()); + } +} diff --git a/src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java b/src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java index 851b4d8..1e33b98 100644 --- a/src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java +++ b/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 sprayStepList = new ArrayList<>(); sprayTask.setSuspendable(true);//可以暂停,单次喷涂范围内可以进行暂停 + DeviceStatus.getInstance().setSuspendable(true); for (List 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); } } }); diff --git a/src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java b/src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java new file mode 100644 index 0000000..52e3635 --- /dev/null +++ b/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; + } +} diff --git a/src/main/java/com/qyft/ms/app/device/status/SprayTask.java b/src/main/java/com/qyft/ms/app/device/status/SprayTask.java index 1575a16..e0042a7 100644 --- a/src/main/java/com/qyft/ms/app/device/status/SprayTask.java +++ b/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 diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java b/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java index 5195bef..d6888b0 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java +++ b/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); }); } } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java b/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java index 3367715..3a4ae0f 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java +++ b/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); }); } } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java b/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java index 806526e..7fcbc76 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java +++ b/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); } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java b/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java index ce3cc53..146a42b 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java +++ b/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. 参数校验 diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java b/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java index c420c27..fe23fef 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java +++ b/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); }); } } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java b/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java index 6626e2e..5faf78c 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java +++ b/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); }); } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java b/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java index c904a3c..942eb49 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java +++ b/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); }); } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java b/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java index 386136c..fe6fe1c 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java +++ b/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); }); } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java b/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java index 3a4015b..ae90521 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java +++ b/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); }); } diff --git a/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java b/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java index 9eaaf40..595a778 100644 --- a/src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java +++ b/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); }); } diff --git a/src/main/java/com/qyft/ms/app/service/SelfTestService.java b/src/main/java/com/qyft/ms/app/service/SelfTestService.java index 40a3dbc..985769d 100644 --- a/src/main/java/com/qyft/ms/app/service/SelfTestService.java +++ b/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; } }