Browse Source

fix:DeviceStatus交由spring管理

tags/1.0
白凤吉 5 months ago
parent
commit
21937cbb4c
  1. 3
      src/main/java/com/qyft/ms/app/core/aspect/DeviceStatusAspect.java
  2. 13
      src/main/java/com/qyft/ms/app/device/spray/SprayTaskExecutor.java
  3. 8
      src/main/java/com/qyft/ms/app/device/spray/SprayTaskPointCollector.java
  4. 22
      src/main/java/com/qyft/ms/app/device/status/DeviceStatus.java
  5. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStart.java
  6. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/DehumidifierStop.java
  7. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayPause.java
  8. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStart.java
  9. 7
      src/main/java/com/qyft/ms/app/front/cmd/business/MatrixSprayStop.java
  10. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFill.java
  11. 5
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelinePreFillStop.java
  12. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/NozzlePipelineWash.java
  13. 3
      src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWash.java
  14. 5
      src/main/java/com/qyft/ms/app/front/cmd/business/SyringePipelineWashStop.java
  15. 3
      src/main/java/com/qyft/ms/app/service/SelfTestService.java
  16. 10
      src/main/java/com/qyft/ms/system/controller/FrontCmdController.java

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

@ -15,6 +15,7 @@ import org.springframework.stereotype.Component;
@RequiredArgsConstructor
public class DeviceStatusAspect {
private final WebSocketService webSocketService;
private final DeviceStatus deviceStatus;
@Pointcut("execution(* com.qyft.ms.app.device.status.DeviceStatus.set*(..))")
public void setterMethods() {
@ -22,6 +23,6 @@ public class DeviceStatusAspect {
@After("setterMethods()")
public void afterSetter(JoinPoint joinPoint) throws Throwable {
webSocketService.pushMsg(WebSocketMessageType.DEVICE_STATUS_CHANGE, DeviceStatus.getInstance());
webSocketService.pushMsg(WebSocketMessageType.DEVICE_STATUS_CHANGE, deviceStatus.toJSON());
}
}

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

@ -30,6 +30,7 @@ public class SprayTaskExecutor {
private final DeviceCommandService deviceCommandService;
private final SprayTaskPointCollector sprayTaskPointCollector;
private final SysSettingsService sysSettingsService;
private final DeviceStatus deviceStatus;
private Thread taskThread;
@ -86,7 +87,7 @@ public class SprayTaskExecutor {
List<Point2D> sprayStepList = new ArrayList<>();
sprayTask.setSuspendable(true);//可以暂停单次喷涂范围内可以进行暂停
DeviceStatus.getInstance().setSuspendable(true);
deviceStatus.setSuspendable(true);
for (List<DeviceCommand> deviceCommandAgg : deviceCommandList) {//单次喷涂
if (reCurrentStep < currentStep) {
break;
@ -113,7 +114,7 @@ public class SprayTaskExecutor {
}
currentSprayIndex++;
sprayTask.setSuspendable(false);//不可暂停
DeviceStatus.getInstance().setSuspendable(false);
deviceStatus.setSuspendable(false);
sprayTask.getSprayedPoints().add(sprayStepList);
DeviceCommand nozzleValveCloseCommand = DeviceCommandGenerator.nozzleValveClose();//关闭喷嘴阀
@ -135,7 +136,7 @@ public class SprayTaskExecutor {
CommandFuture motorYPositionSetCommandFuture = deviceCommandService.sendCommand(motorYPositionSetCommand);
CommandFuture motorZPositionSetCommandFuture = deviceCommandService.sendCommand(motorZPositionSetCommand);
commandWait(motorXPositionSetCommandFuture, motorYPositionSetCommandFuture, motorZPositionSetCommandFuture);
webSocketService.pushMsg(WebSocketMessageType.SPRAY_TASK, "喷涂任务执行完毕");
} catch (InterruptedException e) {
webSocketService.pushMsg(WebSocketMessageType.SPRAY_TASK, "喷涂任务线程停止");
Thread.currentThread().interrupt();
@ -147,9 +148,9 @@ public class SprayTaskExecutor {
synchronized (this) {
taskThread = null;
SprayTask.getInstance().clear();
DeviceStatus.getInstance().setSpraying(false);
DeviceStatus.getInstance().setPaused(false);
DeviceStatus.getInstance().setSuspendable(false);
deviceStatus.setSpraying(false);
deviceStatus.setPaused(false);
deviceStatus.setSuspendable(false);
}
}
});

8
src/main/java/com/qyft/ms/app/device/spray/SprayTaskPointCollector.java

@ -1,7 +1,9 @@
package com.qyft.ms.app.device.spray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.qyft.ms.app.common.constant.WebSocketMessageType;
import com.qyft.ms.app.device.status.SprayTask;
import com.qyft.ms.app.model.bo.Point2D;
import com.qyft.ms.app.model.bo.SprayTaskPointCollectorPushBO;
import com.qyft.ms.system.common.device.command.CommandFuture;
@ -54,6 +56,9 @@ public class SprayTaskPointCollector {
private void collectPoints() {
try {
if(SprayTask.getInstance().isPaused()){
stopCollecting();
}
DeviceCommand motorXyzPositionGetCommand = DeviceCommandGenerator.motorXyzPositionGet(); //生成电机XYZ相对原点坐标指令
CommandFuture motorXyzPositionGetCommandFuture = deviceCommandService.sendCommand(motorXyzPositionGetCommand);
JSONObject motorXyzPositionGetCommandResult = motorXyzPositionGetCommandFuture.getResponseResult();
@ -61,9 +66,10 @@ public class SprayTaskPointCollector {
Double yAxisPosition = motorXyzPositionGetCommandResult.getDouble("yAxisPosition");
Point2D point2D = new Point2D(xAxisPosition, yAxisPosition);
SprayTaskPointCollectorPushBO sprayTaskPointCollectorPushBO = new SprayTaskPointCollectorPushBO(currentSprayIndex, point2D);
log.info("喷涂点位采集,采集到点位:{}", JSONUtil.toJsonStr(sprayTaskPointCollectorPushBO));
webSocketService.pushMsg(WebSocketMessageType.SPRAY_POINT, sprayTaskPointCollectorPushBO);
} catch (Exception e) {
log.error("喷涂任务点位采集错误", e);
log.error("喷涂点位采集发生错误", e);
}
}
}

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

@ -1,16 +1,16 @@
package com.qyft.ms.app.device.status;
import cn.hutool.json.JSONObject;
import lombok.Data;
import org.springframework.stereotype.Component;
/**
* 设备运行状态
*/
@Data
@Component
public class DeviceStatus {
private DeviceStatus() {
}
/**
* 设备是否正在进行的喷涂任务
*/
@ -51,11 +51,17 @@ public class DeviceStatus {
*/
private volatile boolean selfTestCompleted = false;
private static class Holder {
private static final DeviceStatus INSTANCE = new DeviceStatus();
public JSONObject toJSON() {
JSONObject json = new JSONObject();
json.putOnce("spraying", spraying);
json.putOnce("paused", paused);
json.putOnce("suspendable", suspendable);
json.putOnce("cleaningSyringePipeline", cleaningSyringePipeline);
json.putOnce("cleaningNozzlePipeline", cleaningNozzlePipeline);
json.putOnce("prefilling", prefilling);
json.putOnce("dehumidifierRunning", dehumidifierRunning);
json.putOnce("selfTestCompleted", selfTestCompleted);
return json;
}
public static DeviceStatus getInstance() {
return DeviceStatus.Holder.INSTANCE;
}
}

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

@ -29,6 +29,7 @@ import java.util.concurrent.CompletableFuture;
public class DehumidifierStart extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -60,7 +61,7 @@ public class DehumidifierStart extends BaseCommandHandler {
CommandFuture dehumidifierValveOpenCmdFuture = deviceCommandService.sendCommand(dehumidifierValveOpenCmd, form, emitter);
commandWait(dehumidifierValveOpenCmdFuture);
DeviceStatus.getInstance().setDehumidifierRunning(true);
deviceStatus.setDehumidifierRunning(true);
});
}
}

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

@ -26,6 +26,7 @@ import java.util.concurrent.CompletableFuture;
public class DehumidifierStop extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -34,7 +35,7 @@ public class DehumidifierStop extends BaseCommandHandler {
CommandFuture dehumidifierStopCommandFuture = deviceCommandService.sendCommand(dehumidifierStopCommand, form, emitter);
commandWait(dehumidifierStopCommandFuture);
DeviceStatus.getInstance().setDehumidifierRunning(false);
deviceStatus.setDehumidifierRunning(false);
});
}
}

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

@ -32,6 +32,7 @@ public class MatrixSprayPause extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final SprayTaskExecutor sprayTaskExecutor;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -57,7 +58,7 @@ public class MatrixSprayPause extends BaseCommandHandler {
CommandFuture motorZStopCommandFuture = deviceCommandService.sendCommand(motorZStopCommand, form, emitter);
commandWait(motorXStopCommandFuture, motorYStopCommandFuture, motorZStopCommandFuture);
sprayTask.setPaused(true);
DeviceStatus.getInstance().setPaused(true);
deviceStatus.setPaused(true);
}else{
emitter.send(FrontCommand.backstage(form.getCmdId(), form.getCmdCode(), CommandStatus.ERROR, "当前喷涂任务不可暂停"), MediaType.APPLICATION_JSON);
}

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

@ -43,6 +43,7 @@ public class MatrixSprayStart extends BaseCommandHandler {
private final SprayTaskExecutor sprayTaskExecutor;
private final PositionService positionService;
private final DeviceStatus deviceStatus;
private static boolean nonNullCheck(ResponseBodyEmitter emitter, String cmdId, String cmdCode,
@ -113,7 +114,7 @@ public class MatrixSprayStart extends BaseCommandHandler {
return;
} else {
sprayTask.setSpraying(true);
DeviceStatus.getInstance().setSpraying(true);
deviceStatus.setSpraying(true);
}
// 1. 参数校验

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

@ -29,6 +29,7 @@ public class MatrixSprayStop extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final SprayTaskExecutor sprayTaskExecutor;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -61,9 +62,9 @@ public class MatrixSprayStop extends BaseCommandHandler {
commandWait(motorXPositionSetCommandFuture, motorYPositionSetCommandFuture, motorZPositionSetCommandFuture);
SprayTask.getInstance().clear();
DeviceStatus.getInstance().setSpraying(false);
DeviceStatus.getInstance().setPaused(false);
DeviceStatus.getInstance().setSuspendable(false);
deviceStatus.setSpraying(false);
deviceStatus.setPaused(false);
deviceStatus.setSuspendable(false);
});
}
}

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

@ -37,6 +37,7 @@ public class NozzlePipelinePreFill extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final SysSettingsService sysSettingsService;
private final PositionService positionService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -84,7 +85,7 @@ public class NozzlePipelinePreFill extends BaseCommandHandler {
CommandFuture syringePumpStartCommandFuture = deviceCommandService.sendCommand(syringePumpStartCommand, form, emitter);
commandWait(syringePumpStartCommandFuture);
DeviceStatus.getInstance().setPrefilling(true);
deviceStatus.setPrefilling(true);
});
}

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

@ -21,10 +21,11 @@ import java.util.concurrent.CompletableFuture;
@Slf4j
@Component
@RequiredArgsConstructor
@CommandMapping("matrix_prefill")//业务指令注解
@CommandMapping("matrix_prefill_stop")//业务指令注解
public class NozzlePipelinePreFillStop extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -40,7 +41,7 @@ public class NozzlePipelinePreFillStop extends BaseCommandHandler {
CommandFuture nozzleValveCloseCommandFuture = deviceCommandService.sendCommand(nozzleValveCloseCommand, form, emitter);
commandWait(syringePumpStopCommandFuture, threeWayValveCloseAllCommandFuture, nozzleValveCloseCommandFuture);
DeviceStatus.getInstance().setPrefilling(false);
deviceStatus.setPrefilling(false);
});
}

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

@ -36,6 +36,7 @@ public class NozzlePipelineWash extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final SysSettingsService sysSettingsService;
private final PositionService positionService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -71,7 +72,7 @@ public class NozzlePipelineWash extends BaseCommandHandler {
CommandFuture threeWayValveOpenSyringePipelineCommandFuture = deviceCommandService.sendCommand(threeWayValveOpenSyringePipelineCommand, form, emitter);
commandWait(threeWayValveOpenSyringePipelineCommandFuture);
DeviceStatus.getInstance().setCleaningNozzlePipeline(true);
deviceStatus.setCleaningNozzlePipeline(true);
});
}

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

@ -36,6 +36,7 @@ public class SyringePipelineWash extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final SysSettingsService sysSettingsService;
private final PositionService positionService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -80,7 +81,7 @@ public class SyringePipelineWash extends BaseCommandHandler {
CommandFuture syringePumpStartCommandFuture = deviceCommandService.sendCommand(syringePumpStartCommand, form, emitter);
commandWait(syringePumpStartCommandFuture);
DeviceStatus.getInstance().setCleaningSyringePipeline(true);
deviceStatus.setCleaningSyringePipeline(true);
});
}

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

@ -25,6 +25,7 @@ import java.util.concurrent.CompletableFuture;
public class SyringePipelineWashStop extends BaseCommandHandler {
private final DeviceCommandService deviceCommandService;
private final DeviceStatus deviceStatus;
@Override
public CompletableFuture<Void> handle(FrontCmdControlForm form, ResponseBodyEmitter emitter) {
@ -37,8 +38,8 @@ public class SyringePipelineWashStop extends BaseCommandHandler {
CommandFuture threeWayValveCloseAllCommandFuture = deviceCommandService.sendCommand(threeWayValveCloseAllCommand, form, emitter);
commandWait(syringePumpStopCommandFuture, threeWayValveCloseAllCommandFuture);
DeviceStatus.getInstance().setCleaningSyringePipeline(false);
DeviceStatus.getInstance().setCleaningNozzlePipeline(true);
deviceStatus.setCleaningSyringePipeline(false);
deviceStatus.setCleaningNozzlePipeline(true);
});
}

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

@ -10,13 +10,14 @@ import org.springframework.stereotype.Service;
@Service
@RequiredArgsConstructor
public class SelfTestService {
private final DeviceStatus deviceStatus;
/**
* 开始自检
*/
public SelfTestVO startTest() {
SelfTestVO selfTestBO = new SelfTestVO();
DeviceStatus.getInstance().setSelfTestCompleted(true);
deviceStatus.setSelfTestCompleted(true);
return selfTestBO;
}
}

10
src/main/java/com/qyft/ms/system/controller/FrontCmdController.java

@ -38,22 +38,26 @@ public class FrontCmdController {
CommandHandler commandHandler = registry.getHandler(code);
if (commandHandler == null) {
emitter.send(FrontCommand.backstage(id, code, CommandStatus.ERROR, "未找到对应的业务指令"), MediaType.APPLICATION_JSON);
log.error("未找到对应的业务指令");
emitter.complete();
return emitter;
}
emitter.send(FrontCommand.backstage(id, code, CommandStatus.START, "业务指令开始执行"), MediaType.APPLICATION_JSON);
log.info("业务指令开始执行");
CompletableFuture<Void> future = commandHandler.handle(form, emitter);
future.whenComplete((v, ex) -> {
try {
if (ex != null) {
emitter.send(FrontCommand.backstage(id, code, CommandStatus.ERROR, "业务指令处理异常", ex.getMessage()), MediaType.APPLICATION_JSON);
emitter.send(FrontCommand.backstage(id, code, CommandStatus.ERROR, "业务指令执行异常", ex.getMessage()), MediaType.APPLICATION_JSON);
log.error("执行业务指令发生异常: {}", JSONUtil.toJsonStr(form), ex);
}
emitter.send(FrontCommand.backstage(id, code, CommandStatus.FINISH, "业务指令处理结束"), MediaType.APPLICATION_JSON);
Thread.sleep(50);
emitter.send(FrontCommand.backstage(id, code, CommandStatus.FINISH, "业务指令执行结束"), MediaType.APPLICATION_JSON);
log.info("业务指令执行结束");
} catch (Exception e) {
log.error("执行业务指令发生异常: {}", JSONUtil.toJsonStr(form), e);
} finally {
log.info("业务指令 emitter complete");
emitter.complete();
}
});

Loading…
Cancel
Save