From 0bd15ff02f6d6bb6a3408f46e18b8a573b55ce9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Wed, 28 May 2025 17:05:58 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=AE=BE=E5=A4=87=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=8E=A8=E9=80=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/GraphiteDigesterServiceApplication.java | 2 +- .../gd/app/command/selftest/TrayOutCommand.java | 36 ++++++++++++++++++++++ .../app/core/aspect/DeviceStateChangeAspect.java | 13 ++------ .../gd/app/model/bo/status/device/DeviceState.java | 18 ++++++++--- .../gd/app/model/bo/status/device/DoorState.java | 8 +++++ .../app/model/bo/status/device/GantryArmState.java | 8 +++++ .../model/bo/status/device/HeatModuleState.java | 8 +++++ .../bo/status/device/SolutionContainerState.java | 8 +++++ .../bo/status/device/SolutionModuleState.java | 8 +++++ .../gd/app/service/crafts/CraftsStepService.java | 3 +- .../gd/app/service/device/DeviceInitService.java | 10 +++--- .../gd/app/service/device/DeviceStateService.java | 2 +- 12 files changed, 101 insertions(+), 23 deletions(-) create mode 100644 src/main/java/com/iflytop/gd/app/command/selftest/TrayOutCommand.java diff --git a/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java b/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java index 6e34480..b03c04d 100644 --- a/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java +++ b/src/main/java/com/iflytop/gd/GraphiteDigesterServiceApplication.java @@ -17,7 +17,7 @@ public class GraphiteDigesterServiceApplication { SpringApplication app = new SpringApplication(GraphiteDigesterServiceApplication.class); app.addInitializers(ctx -> { try { - Thread.sleep(5_000); + Thread.sleep(0); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } diff --git a/src/main/java/com/iflytop/gd/app/command/selftest/TrayOutCommand.java b/src/main/java/com/iflytop/gd/app/command/selftest/TrayOutCommand.java new file mode 100644 index 0000000..86f0764 --- /dev/null +++ b/src/main/java/com/iflytop/gd/app/command/selftest/TrayOutCommand.java @@ -0,0 +1,36 @@ +package com.iflytop.gd.app.command.selftest; + +import com.iflytop.gd.app.core.BaseCommandHandler; +import com.iflytop.gd.app.model.dto.CmdDTO; +import com.iflytop.gd.app.service.device.SelfTestService; +import com.iflytop.gd.app.service.device.module.SolutionModuleService; +import com.iflytop.gd.common.annotation.CommandMapping; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import java.util.concurrent.CompletableFuture; + +/** + * 移除一个托盘 + */ +@Slf4j +@Component +@RequiredArgsConstructor +@CommandMapping("tray_out")//业务指令注解 +public class TrayOutCommand extends BaseCommandHandler { + private final SolutionModuleService solutionModuleService; + private final SelfTestService selfTestService; + + @Override + public CompletableFuture handle(CmdDTO cmdDTO) { + //TODO 通过传感器获取一个有托盘的加热模块,顺序按照1-6 + + return runAsync(() -> { + //如果没开门则开门 + //拆下拍子 + //将托盘移动至加液模块 + }); + } +} + diff --git a/src/main/java/com/iflytop/gd/app/core/aspect/DeviceStateChangeAspect.java b/src/main/java/com/iflytop/gd/app/core/aspect/DeviceStateChangeAspect.java index f655886..4ff6b4d 100644 --- a/src/main/java/com/iflytop/gd/app/core/aspect/DeviceStateChangeAspect.java +++ b/src/main/java/com/iflytop/gd/app/core/aspect/DeviceStateChangeAspect.java @@ -23,22 +23,13 @@ public class DeviceStateChangeAspect { private final DeviceStateService deviceStateService; private final Lock lock = new ReentrantLock(); - private Object beforeValue; @Before("execution(* com.iflytop.gd.app.model.bo.status..set*(..))") public void beforeSetMethod(JoinPoint joinPoint) { lock.lock(); - try { - Object[] methodArgs = joinPoint.getArgs(); - if (methodArgs != null && methodArgs.length > 0) { - beforeValue = methodArgs[0]; - } - } catch (Exception e) { - log.error("处理状态变更前的值失败", e); - } } - @After("execution(* com.iflytop.gd.app.model.bo.status..set*(..))") + @After("execution(* com.iflytop.gd.app.model.bo.status.device.*.set*(..))") public void afterSetMethod(JoinPoint joinPoint) { try { String className = joinPoint.getSignature().getDeclaringType().getName(); // 获取类名 @@ -47,7 +38,7 @@ public class DeviceStateChangeAspect { if (methodArgs != null && methodArgs.length > 0) { // 保存修改后的值 Object afterValue = methodArgs[0]; - log.info("设备状态发生改变,类型{}.{} ,from {} to {}", className, methodName, beforeValue, afterValue); + log.info("设备状态发生改变,类型{}.{}({})", className, methodName, afterValue); webSocketService.push(WebSocketMessageType.STATUS, deviceStateService.getDeviceState()); } } catch (Exception e) { diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/DeviceState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/DeviceState.java index 15d1110..a12dde4 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/DeviceState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/DeviceState.java @@ -1,27 +1,35 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.iflytop.gd.app.model.entity.Tasks; import com.iflytop.gd.app.model.entity.User; import com.iflytop.gd.common.enums.HeatModuleCode; 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.util.ArrayList; import java.util.List; @Schema(description = "当前设备") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class DeviceState { @Schema(description = "门状态") - private final DoorState door = new DoorState(); + private final DoorState door; @Schema(description = "龙门架机械臂状态") - private final GantryArmState gantryArm = new GantryArmState(); + private final GantryArmState gantryArm; @Schema(description = "加液模块属性") - private final SolutionModuleState solutionModule = new SolutionModuleState(); + private final SolutionModuleState solutionModule; @Schema(description = "加热模块属性") - private final List heatModule = new ArrayList<>(); + private List heatModule = new ArrayList<>(); @Schema(description = "托盘") - private final List tray = new ArrayList<>(); + private List tray = new ArrayList<>(); @Schema(description = "虚拟模式,true为虚拟") private boolean virtual = false; @Schema(description = "初始化状态,true初始化完毕") diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/DoorState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/DoorState.java index 2a10b4d..2a8ef81 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/DoorState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/DoorState.java @@ -1,10 +1,18 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 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; @Schema(description = "门") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class DoorState { @Schema(description = "是否开门,true为开启状态,false为关闭状态") private boolean open = false; diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/GantryArmState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/GantryArmState.java index 0e4b65b..2482fbc 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/GantryArmState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/GantryArmState.java @@ -1,10 +1,18 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 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; @Schema(description = "龙门架机械臂") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class GantryArmState { @Schema(description = "是否空闲,true为空闲,false为占用") private boolean idle = true; diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/HeatModuleState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/HeatModuleState.java index 029988e..317325e 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/HeatModuleState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/HeatModuleState.java @@ -1,11 +1,19 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.iflytop.gd.common.enums.HeatModuleCode; 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; @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 HeatModuleCode moduleCode; diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionContainerState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionContainerState.java index 89adcd7..1e2e361 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionContainerState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionContainerState.java @@ -1,12 +1,20 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.iflytop.gd.common.enums.ContainerCode; import com.iflytop.gd.common.enums.ContainerType; 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; @Schema(description = "溶液容器") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class SolutionContainerState { @Schema(description = "容器数据id") private Long id; diff --git a/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionModuleState.java b/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionModuleState.java index bd2eb91..9662eb1 100644 --- a/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionModuleState.java +++ b/src/main/java/com/iflytop/gd/app/model/bo/status/device/SolutionModuleState.java @@ -1,13 +1,21 @@ package com.iflytop.gd.app.model.bo.status.device; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 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.util.ArrayList; import java.util.List; @Schema(description = "加液模块") @Data +@Component +@Scope("prototype") +@RequiredArgsConstructor +@JsonIgnoreProperties(value = {"advisors", "frozen", "preFiltered", "proxyTargetClass", "targetSource", "exposeProxy", "advisorCount", "proxiedInterfaces", "targetClass"}) public class SolutionModuleState { @Schema(description = "是否空闲,true为空闲,false为占用") private boolean idle = true; diff --git a/src/main/java/com/iflytop/gd/app/service/crafts/CraftsStepService.java b/src/main/java/com/iflytop/gd/app/service/crafts/CraftsStepService.java index c80f94f..9bfac3e 100644 --- a/src/main/java/com/iflytop/gd/app/service/crafts/CraftsStepService.java +++ b/src/main/java/com/iflytop/gd/app/service/crafts/CraftsStepService.java @@ -65,6 +65,7 @@ public class CraftsStepService { */ private boolean addLiquid(String heatId, JSONObject params) throws Exception { HeatModuleCode heatModuleCode = HeatModuleCode.valueOf(heatId); + //TODO 判断加液区是否有托盘,如果没有托盘的话,判断加热区是否有托盘,然后将其移动至加液区 moveToSolutionModule(heatModuleCode); JSONArray tubeSolList = params.getJSONArray("tubeSolList"); for (int i = 0; i < tubeSolList.size(); i++) { @@ -94,7 +95,7 @@ public class CraftsStepService { */ private boolean shaking(String heatId, JSONObject params) throws Exception { HeatModuleCode heatModuleCode = HeatModuleCode.valueOf(heatId); - if (deviceStateService.getDeviceState().getSolutionModule().getTrayStatus() == 0) { + if (deviceStateService.getDeviceState().getSolutionModule().getTrayStatus() == 0) {//TODO 实际应该从传感器获取托盘状态 moveToSolutionModule(heatModuleCode); } Integer second = params.getInt("second"); diff --git a/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java b/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java index f82aa11..7f0df37 100644 --- a/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java +++ b/src/main/java/com/iflytop/gd/app/service/device/DeviceInitService.java @@ -31,6 +31,7 @@ import com.iflytop.gd.hardware.type.StepMotor.StepMotorMId; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Service; import java.util.List; @@ -51,12 +52,13 @@ public class DeviceInitService { private final ActionOvertimeConstant actionOvertimeConstant; private final OutputIOCtrlDriver outputIOCtrlDriver; private final DeviceParamConfigService deviceParamConfigService; + private final ObjectProvider heatModuleStateProvider; + private final ObjectProvider solutionContainerStateProvider; @PostConstruct public void init() { new Thread(() -> { try { - Thread.sleep(3000); CompletableFuture.runAsync(() -> { try { tricolorLightDriver.open(MId.TriColorLight, TricolorLightDriver.Color.BLUE); @@ -157,16 +159,16 @@ public class DeviceInitService { DeviceState deviceState = deviceStateService.getDeviceState(); List heatArea = deviceState.getHeatModule(); for (HeatModuleCode code : HeatModuleCode.values()) { - heatArea.add(new HeatModuleState(code)); + heatArea.add(heatModuleStateProvider.getObject(code)); } List containerList = containerService.getList(); List solutionBucket = deviceState.getSolutionModule().getSolutionContainer(); for (Container container : containerList) { if (container.getType() == 0) { - solutionBucket.add(new SolutionContainerState(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.solution)); + solutionBucket.add(solutionContainerStateProvider.getObject(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.solution)); } else { - solutionBucket.add(new SolutionContainerState(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.neutralization)); + solutionBucket.add(solutionContainerStateProvider.getObject(container.getId(), ContainerCode.valueOf(container.getCode()), ContainerType.neutralization)); } } } diff --git a/src/main/java/com/iflytop/gd/app/service/device/DeviceStateService.java b/src/main/java/com/iflytop/gd/app/service/device/DeviceStateService.java index 1accfc6..40093fb 100644 --- a/src/main/java/com/iflytop/gd/app/service/device/DeviceStateService.java +++ b/src/main/java/com/iflytop/gd/app/service/device/DeviceStateService.java @@ -15,7 +15,7 @@ import java.util.concurrent.atomic.AtomicReference; @RequiredArgsConstructor public class DeviceStateService { @Getter - private final DeviceState deviceState = new DeviceState(); + private final DeviceState deviceState; @Getter private final AtomicReference commandMutexState = new AtomicReference<>(new CommandMutexState());