From 02670c7935876daa9c439db6d1c00622872239ff Mon Sep 17 00:00:00 2001 From: guoapeng Date: Mon, 24 Feb 2025 16:59:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=89=B9=E9=87=8F=E5=8A=A0=E6=B6=B2?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gd/common/constant/WebSocketMessageType.java | 5 ++ .../java/com/qyft/gd/controller/CMDController.java | 19 ++----- .../com/qyft/gd/model/dto/CmdInjectFluidDTO.java | 11 ++-- .../java/com/qyft/gd/model/dto/InjectFluid.java | 14 +++++ .../java/com/qyft/gd/service/BaseDataService.java | 17 ++++++ src/main/java/com/qyft/gd/service/CMDService.java | 66 +++++++++++++++++++++- .../java/com/qyft/gd/service/ContainerService.java | 2 + .../java/com/qyft/gd/service/WebSocketService.java | 1 + .../qyft/gd/service/impl/ContainerServiceImpl.java | 5 ++ 9 files changed, 116 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/qyft/gd/model/dto/InjectFluid.java diff --git a/src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java b/src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java index dcf138f..5526e46 100644 --- a/src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java +++ b/src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java @@ -17,4 +17,9 @@ public class WebSocketMessageType { * 工艺执行反馈 */ public static final String CRAFTS = "crafts"; + /** + * 容器剩余状态 + */ + public static final String CONTAINER = "container"; + } diff --git a/src/main/java/com/qyft/gd/controller/CMDController.java b/src/main/java/com/qyft/gd/controller/CMDController.java index 538210f..78e5837 100644 --- a/src/main/java/com/qyft/gd/controller/CMDController.java +++ b/src/main/java/com/qyft/gd/controller/CMDController.java @@ -14,9 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; +import java.util.function.Supplier; @Tag(name = "控制指令") @RestController @@ -64,18 +63,8 @@ public class CMDController { @Operation(summary = "批量加液") @PostMapping("/injectFluid") - public Result injectFluid(@RequestBody CmdInjectFluidDTO[] list) { - for (CmdInjectFluidDTO cmdInjectFluidDTO : list) { - CMDForm cmdForm = new CMDForm(); - cmdForm.setCommand("injectFluid"); - cmdForm.setCommandId(UUID.randomUUID().toString()); - Map params = new HashMap<>(); - params.put("tubeNum", cmdInjectFluidDTO.getTubeNum()); - params.put("solutionId", cmdInjectFluidDTO.getSolutionId()); - params.put("volume", cmdInjectFluidDTO.getVolume()); - cmdForm.setParams(params); - cmdService.executeCommand(cmdForm); - } + public Result injectFluid(@RequestBody CmdInjectFluidDTO dto) { + cmdService.injectFluids(dto); return Result.success("操作成功"); } } diff --git a/src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java b/src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java index a65925f..620b8cc 100644 --- a/src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java +++ b/src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java @@ -5,10 +5,9 @@ import lombok.Data; @Data public class CmdInjectFluidDTO { - @Schema(description = "试管编号") - private Integer tubeNum; - @Schema(description = "溶液id") - private Integer solutionId; - @Schema(description = "容量") - private Integer volume; + @Schema(description = "指令id") + private String commandId; + + @Schema(description = "加液数据list") + private InjectFluid[] injectFluids; } diff --git a/src/main/java/com/qyft/gd/model/dto/InjectFluid.java b/src/main/java/com/qyft/gd/model/dto/InjectFluid.java new file mode 100644 index 0000000..cfff148 --- /dev/null +++ b/src/main/java/com/qyft/gd/model/dto/InjectFluid.java @@ -0,0 +1,14 @@ +package com.qyft.gd.model.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class InjectFluid { + @Schema(description = "试管编号") + private Integer tubeNum; + @Schema(description = "溶液id") + private Integer solutionId; + @Schema(description = "容量") + private Integer volume; +} diff --git a/src/main/java/com/qyft/gd/service/BaseDataService.java b/src/main/java/com/qyft/gd/service/BaseDataService.java index cd3774c..5b66da7 100644 --- a/src/main/java/com/qyft/gd/service/BaseDataService.java +++ b/src/main/java/com/qyft/gd/service/BaseDataService.java @@ -51,6 +51,17 @@ public class BaseDataService { return null; } + // 根据容液id获取容器信息 + public ContainerListVO getContainerBySolutionId(int solutionId) { + List containers = map.getContainers(); + for (ContainerListVO container : containers) { + if (container.getSolutionId() == solutionId) { + return container; + } + } + return null; + } + // 获取试管架某个试管坐标 public String getTubePositionByHeatArea(int areaId, int tubeNumber) { SysSettingVO sysSettingVO = findSysSettingById(map.getHeat_area(), areaId); @@ -134,6 +145,12 @@ public class BaseDataService { return true; } + // 更新配置 + public Boolean updateConfig() { + init(); + return true; + } + @PostConstruct private void init() { List heatAreaList = sysSettingsService.getConfig("heat_area"); diff --git a/src/main/java/com/qyft/gd/service/CMDService.java b/src/main/java/com/qyft/gd/service/CMDService.java index 17580ad..2ee44dc 100644 --- a/src/main/java/com/qyft/gd/service/CMDService.java +++ b/src/main/java/com/qyft/gd/service/CMDService.java @@ -5,9 +5,12 @@ import com.qyft.gd.common.constant.Commands; import com.qyft.gd.common.constant.WebSocketMessageType; import com.qyft.gd.common.result.CMDResultCode; import com.qyft.gd.device.service.DeviceService; +import com.qyft.gd.model.dto.CmdInjectFluidDTO; +import com.qyft.gd.model.dto.InjectFluid; import com.qyft.gd.model.entity.TaskSteps; import com.qyft.gd.model.entity.Tasks; import com.qyft.gd.model.form.CMDForm; +import com.qyft.gd.model.vo.ContainerListVO; import com.qyft.gd.model.vo.ExecutionResult; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -29,15 +32,19 @@ public class CMDService { DeviceService deviceService; WebSocketService webSocketService; BaseDataService baseDataService; + ContainerService containerService; Map, List>>> commandMap; CMDForm form; Map cmdMap; @Autowired - public CMDService(DeviceService deviceService, WebSocketService webSocketService, BaseDataService baseDataService, TasksService tasksService, TaskStepsService taskStepsService) { + public CMDService(DeviceService deviceService, WebSocketService webSocketService, BaseDataService baseDataService, TasksService tasksService, TaskStepsService taskStepsService, ContainerService containerService) { this.deviceService = deviceService; this.webSocketService = webSocketService; this.baseDataService = baseDataService; + this.tasksService = tasksService; + this.taskStepsService = taskStepsService; + this.containerService = containerService; this.cmdMap = new HashMap<>(); cmdMap.put("openDoor", "开门"); cmdMap.put("closeDoor", "关门"); @@ -77,8 +84,7 @@ public class CMDService { commandMap.put(Commands.MOVE_TO_HEAT_AREA, this::moveToHeatArea); commandMap.put(Commands.OPEN_CLAW, this::openClaw); commandMap.put(Commands.CLOSE_CLAW, this::closeClaw); - this.tasksService = tasksService; - this.taskStepsService = taskStepsService; + } // 开门 @@ -339,9 +345,46 @@ public class CMDService { } + // 批量加液 + public void injectFluids(CmdInjectFluidDTO dto) { + List> cmdList = new ArrayList<>(); + for (InjectFluid injectFluid : dto.getInjectFluids()) { + Map map = new HashMap<>(); + map.put("tubeNum", injectFluid.getTubeNum()); + map.put("solutionId", injectFluid.getSolutionId()); + map.put("volume", injectFluid.getVolume()); + cmdList.addAll(injectFluid(map)); + } + + new Thread(() -> { + ExecutionResult executionResult = new ExecutionResult(); + executionResult.setCommandId(dto.getCommandId()); + // 执行所有命令 + for (Supplier command : cmdList) { + boolean result = command.get(); + if (!result) { + log.error("指令执行异常: {}", JSONUtil.toJsonStr(dto)); + executionResult.setStatus(CMDResultCode.FAILURE.getCode()); + executionResult.setMessage(CMDResultCode.FAILURE.getMsg()); + webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult); + return; + } + } + executionResult.setStatus(CMDResultCode.SUCCESS.getCode()); + executionResult.setMessage(CMDResultCode.SUCCESS.getMsg()); + webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult); + }).start(); + } + // 加液 public List> injectFluid(Map params) { List> cmdList = new ArrayList<>(); + // 获取容器信息 + ContainerListVO container = baseDataService.getContainerBySolutionId((Integer) params.get("solutionId")); + if(container.getCapacityTotal() - container.getCapacityUsed() < (Integer) params.get("volume")) { + cmdList.add(() -> false); + } + // 试管的坐标 String tubePosition = baseDataService.getTubePositionBySolutionArea((Integer) params.get("tubeNum")); String[] tubePositionArr = tubePosition.split(","); @@ -355,6 +398,8 @@ public class CMDService { } cmdList.add(() -> deviceService.moveLiquidArmToPoint(x, y, z)); cmdList.add(() -> deviceService.addLiquid(Long.valueOf(pumpId), ((Integer) params.get("volume")))); + cmdList.add(() -> updateVolume(params)); + return cmdList; } @@ -381,6 +426,19 @@ public class CMDService { return cmdList; } + private boolean updateVolume (Map params) { + // 获取容器信息 + ContainerListVO container = baseDataService.getContainerBySolutionId((Integer) params.get("solutionId")); + container.setCapacityUsed(container.getCapacityUsed() + (Integer) params.get("volume")); + containerService.updateById(container); + baseDataService.updateConfig(); + List list = containerService.getAllContainer(); + Map containerMap = new HashMap<>(); + containerMap.put("containerList", list); + webSocketService.pushMsg(WebSocketMessageType.CONTAINER, containerMap); + return true; + } + private void initExecutorThread(List> cmdList) { new Thread(() -> run(cmdList)).start(); } @@ -424,4 +482,6 @@ public class CMDService { initExecutorThread(cmdList); return true; } + + } diff --git a/src/main/java/com/qyft/gd/service/ContainerService.java b/src/main/java/com/qyft/gd/service/ContainerService.java index 3fdfc1b..b604d22 100644 --- a/src/main/java/com/qyft/gd/service/ContainerService.java +++ b/src/main/java/com/qyft/gd/service/ContainerService.java @@ -14,4 +14,6 @@ public interface ContainerService extends IService { List getAllContainer(); Boolean updateById(ContainerDTO dto); + + Container selectById(Long id); } diff --git a/src/main/java/com/qyft/gd/service/WebSocketService.java b/src/main/java/com/qyft/gd/service/WebSocketService.java index c7a1807..f9423d3 100644 --- a/src/main/java/com/qyft/gd/service/WebSocketService.java +++ b/src/main/java/com/qyft/gd/service/WebSocketService.java @@ -1,6 +1,7 @@ package com.qyft.gd.service; import cn.hutool.json.JSONUtil; +import com.qyft.gd.common.constant.WebSocketMessageType; import com.qyft.gd.config.WebSocketServer; import com.qyft.gd.model.vo.WebsocketResult; import org.springframework.stereotype.Service; diff --git a/src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java b/src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java index ff3b0b9..701df19 100644 --- a/src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java +++ b/src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java @@ -32,4 +32,9 @@ public class ContainerServiceImpl extends ServiceImpl 0; } + + @Override + public Container selectById(Long id) { + return this.baseMapper.selectById(id); + } }