From f4fce1590226c06177ecc0f3455fb83a8c1c589d Mon Sep 17 00:00:00 2001 From: guoapeng Date: Wed, 19 Feb 2025 19:21:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=B3=BB=E7=BB=9F=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=81=8F=E7=A7=BB=E9=87=8F=E4=BF=A1=E6=81=AF?= =?UTF-8?q?;=E9=83=A8=E5=88=86=E6=8C=87=E4=BB=A4=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/demo.sql | 5 +- src/main/java/com/qyft/gd/model/form/CMDForm.java | 2 +- .../java/com/qyft/gd/service/BaseDataService.java | 41 ++++- src/main/java/com/qyft/gd/service/CMDService.java | 184 ++++++++++++--------- 4 files changed, 140 insertions(+), 92 deletions(-) diff --git a/sql/demo.sql b/sql/demo.sql index 93de601..420660b 100644 --- a/sql/demo.sql +++ b/sql/demo.sql @@ -68,7 +68,10 @@ VALUES (18, 16, '试管圆心间距', 'sys_offset_tube_distance', '100' , '', '',''), (19, 16, '试管高度', 'sys_offset_tube_height', '300' , '', '',''), (20, 16, '试管架高度', 'sys_offset_tube_rack_height', '280' , '', '',''), - (21, 16, '拍子高度', 'sys_offset_lid_height', '350' , '', '',''); + (21, 16, '拍子高度', 'sys_offset_lid_height', '350' , '', '',''), + (22, 16, '试管夹取高度', 'sys_offset_tube_take_height', '10' , '', '',''), + (23, 16, '拍子夹取高度', 'sys_offset_lid_take_height', '10' , '', '',''), + (24, 16, '试管架夹取高度', 'sys_offset_tube_rack_take_height', '10' , '', '',''); -- 创建 solutions 溶液 表 diff --git a/src/main/java/com/qyft/gd/model/form/CMDForm.java b/src/main/java/com/qyft/gd/model/form/CMDForm.java index f1f442a..b6883ee 100644 --- a/src/main/java/com/qyft/gd/model/form/CMDForm.java +++ b/src/main/java/com/qyft/gd/model/form/CMDForm.java @@ -24,7 +24,7 @@ public class CMDForm { params : { // 添加溶液所需字段 tubeNum: 试管编号 - solutions: 溶液id + solutionId: 溶液id volume: 容量 // 关于温度 temperature: 温度 diff --git a/src/main/java/com/qyft/gd/service/BaseDataService.java b/src/main/java/com/qyft/gd/service/BaseDataService.java index 55dddc1..205dabf 100644 --- a/src/main/java/com/qyft/gd/service/BaseDataService.java +++ b/src/main/java/com/qyft/gd/service/BaseDataService.java @@ -6,6 +6,7 @@ import com.qyft.gd.model.vo.BaseDataVO; import com.qyft.gd.model.vo.ContainerListVO; import com.qyft.gd.model.vo.SysSettingVO; import jakarta.annotation.PostConstruct; +import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -21,6 +22,8 @@ public class BaseDataService { private final ContainerService containerService; private final SysSettingsMapper sysSettingsMapper; private final BaseDataVO map = new BaseDataVO(); + @Getter + Map offsetMap = new HashMap<>(); public BaseDataService(SysSettingsService sysSettingsService, ContainerService containerService, SysSettingsMapper sysSettingsMapper) { this.sysSettingsService = sysSettingsService; @@ -28,6 +31,17 @@ public class BaseDataService { this.sysSettingsMapper = sysSettingsMapper; } + // 根据容液id获取泵id + public String getPumpIdBySolutionId(int solutionId) { + List containers = map.getContainers(); + for (ContainerListVO container : containers) { + if (container.getSolutionId() == solutionId) { + return container.getPumpId(); + } + } + return null; + } + // 获取试管架某个试管坐标 public String getTubePositionByHeatArea(int areaId, int tubeNumber) { SysSettingVO sysSettingVO = findSysSettingById(map.getHeat_area(), areaId); @@ -75,6 +89,15 @@ public class BaseDataService { } return null; // 如果没有找到,返回 null } + // 获取某个加热区的机器代码 + public String getHeatAreaHardwareIdById(int id) { + for (SysSettingVO sysSettingVO : map.getHeat_area()) { + if (sysSettingVO.getId() == id) { + return sysSettingVO.getHardwareId(); + } + } + return null; // 如果没有找到,返回 null + } // 获取所有基础数据 public BaseDataVO getBaseData() { @@ -97,6 +120,12 @@ public class BaseDataService { List lidAreaList = sysSettingsService.getConfig("lid_area"); List sysSettingList = sysSettingsService.getConfig("sys_setting"); List containerList = containerService.getAllContainer(); + + List sysSettingVOList = sysSettingsService.getConfig("sys_offset"); + for (SysSettingVO sysSettingVO : sysSettingVOList) { + offsetMap.put(sysSettingVO.getCode(), sysSettingVO.getValue()); + } + map.setHeat_area(heatAreaList); map.setSolution_area(solutionAreaList); map.setLid_area(lidAreaList); @@ -108,17 +137,11 @@ public class BaseDataService { // 计算试管坐标 private void calculateTubeCoordinates() { - List sysSettingVOList = sysSettingsService.getConfig("sys_offset"); - Map offsetMap = new HashMap<>(); - for (SysSettingVO sysSettingVO : sysSettingVOList) { - offsetMap.put(sysSettingVO.getCode(), sysSettingVO.getValue()); - } - log.info("calculateTubeCoordinates offsetMap:{}", offsetMap); - calculateTubePositions(map.getHeat_area(), offsetMap, 0); - calculateTubePositions(map.getSolution_area(), offsetMap, 1); + calculateTubePositions(map.getHeat_area(), 0); + calculateTubePositions(map.getSolution_area(), 1); } // 封装计算试管位置的公共方法 - private void calculateTubePositions(List areaList, Map offsetMap, int type) { + private void calculateTubePositions(List areaList, int type) { areaList.forEach(sysSettingVO -> { List tubePositionList = new ArrayList<>(); // 试管架中心点 diff --git a/src/main/java/com/qyft/gd/service/CMDService.java b/src/main/java/com/qyft/gd/service/CMDService.java index ccd66d1..24c1d7f 100644 --- a/src/main/java/com/qyft/gd/service/CMDService.java +++ b/src/main/java/com/qyft/gd/service/CMDService.java @@ -4,7 +4,6 @@ import cn.hutool.json.JSONUtil; import com.qyft.gd.common.constant.Commands; import com.qyft.gd.common.result.CMDResultCode; import com.qyft.gd.device.service.DeviceService; -import com.qyft.gd.device.service.DeviceStateService; import com.qyft.gd.model.form.CMDForm; import com.qyft.gd.model.vo.ExecutionResult; import lombok.extern.slf4j.Slf4j; @@ -19,14 +18,16 @@ import java.util.function.Supplier; public class CMDService { DeviceService deviceService; - DeviceStateService deviceStateService; WebSocketService webSocketService; - Map> commandMap; + BaseDataService baseDataService; + Map, List>>> commandMap; + CMDForm form; @Autowired - public CMDService(DeviceService deviceService , WebSocketService webSocketService) { + public CMDService(DeviceService deviceService , WebSocketService webSocketService, BaseDataService baseDataService) { this.deviceService = deviceService; this.webSocketService = webSocketService; + this.baseDataService = baseDataService; // 初始化命令映射 this.commandMap = new HashMap<>(); commandMap.put(Commands.UP_TRAY, this::upTray); @@ -45,149 +46,169 @@ public class CMDService { commandMap.put(Commands.MOVE_TO_HEAT_AREA, this::moveToHeatArea); } // 移至加热 - private boolean moveToHeatArea(CMDForm cmdForm) { + private List> moveToHeatArea(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.moveRailArmToPoint(1,2,3)); cmdList.add(() -> deviceService.openClaw()); cmdList.add(() -> deviceService.moveRailArmToPoint(4,5,6)); cmdList.add(() -> deviceService.closeClaw()); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 移动单个试管 - private Boolean moveTube(CMDForm cmdForm) { - //TODO 执行指令 - return true; + private List >moveTube(Map params) { + List> cmdList = new ArrayList<>(); + cmdList.add(() -> deviceService.moveRailArmToPoint(11,22,33)); + return cmdList; } // 机械臂 - private Boolean moveMachineArm(CMDForm cmdForm) { + private List> moveMachineArm(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.moveRailArmToPoint(11,22,33)); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 装回盖子 - private Boolean putBackCap(CMDForm cmdForm) { + private List> putBackCap(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.moveRailArmToPoint(11,22,33)); cmdList.add(() -> deviceService.openClaw()); cmdList.add(() -> deviceService.moveRailArmToPoint(4,54,6)); cmdList.add(() -> deviceService.closeClaw()); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 取试管架盖 - private Boolean takeOffCap(CMDForm cmdForm) { + private List> takeOffCap(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.moveRailArmToPoint(13,42,53)); cmdList.add(() -> deviceService.openClaw()); cmdList.add(() -> deviceService.moveRailArmToPoint(4,5,6)); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 拍照 - private Boolean takePhoto(CMDForm cmdForm) { + private List> takePhoto(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.takePhoto()); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 停止加热 - private Boolean stopHeat(CMDForm cmdForm) { + private List> stopHeat(Map params) { List> cmdList = new ArrayList<>(); - cmdList.add(() -> deviceService.stopHeating((String) cmdForm.getParams().get("areaId"))); - initExecutorThread(cmdList, cmdForm); - return true; + String hardwareId = baseDataService.getHeatAreaHardwareIdById((Integer) params.get("areaId")); + cmdList.add(() -> deviceService.stopHeating(hardwareId)); + return cmdList; } // 开始加热 - private Boolean startHeat(CMDForm cmdForm) { + private List> startHeat(Map params) { List> cmdList = new ArrayList<>(); - cmdList.add(() -> deviceService.startHeating((String) cmdForm.getParams().get("areaId"),(Double) cmdForm.getParams().get("temperature"))); - initExecutorThread(cmdList, cmdForm); - return true; + + String hardwareId = baseDataService.getHeatAreaHardwareIdById((Integer) params.get("areaId")); + cmdList.add(() -> deviceService.startHeating(hardwareId, (Double) params.get("temperature"))); + return cmdList; } // 开始摇匀 - private Boolean startShakeUp(CMDForm cmdForm) { -// deviceService.startShaking(); -// Timer timer = new Timer(); -// TimerTask task = new TimerTask() { -// @Override -// public void run() { -// deviceService.stopShaking(); -// } -// }; -// timer.schedule(task, 1000); -// return true; + private List> startShakeUp(Map params) { List> cmdList = new ArrayList<>(); + cmdList.add(() -> deviceService.setShakingSpeed((Integer) params.get("speed"))); cmdList.add(() -> deviceService.startShaking()); - cmdList.add(() -> deviceService.setShakingSpeed((Integer) cmdForm.getParams().get("speed"))); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 结束摇匀 - private Boolean stopShakeUp(CMDForm cmdForm) { + private List> stopShakeUp(Map params) { List> cmdList = new ArrayList<>(); cmdList.add(() -> deviceService.stopShaking()); - initExecutorThread(cmdList, cmdForm); - return true; + return cmdList; } // 移至加液 - private Boolean moveToActionArea(CMDForm cmdForm) { + private List> moveToActionArea(Map params) { List> cmdList = new ArrayList<>(); - // 加液位是否有托盘 -// Boolean liquidTrayStatus = deviceStateService.getDeviceStatus().getLiquidTrayStatus(); -// if(liquidTrayStatus) { -// return false; -// } - cmdList.add(() -> deviceService.moveRailArmToPoint(1, 2, 3)); + Map map = baseDataService.getOffsetMap(); + String heatAreaPosition = baseDataService.getHeatAreaPositionById((Integer) params.get("areaId")); + String [] heatAreaPositionArr =heatAreaPosition.split(","); + int x1 = Integer.parseInt(heatAreaPositionArr[0]); + int y1 = Integer.parseInt(heatAreaPositionArr[1]); + int z1 = Integer.parseInt(heatAreaPositionArr[2]); + + String solutionAreaPosition = baseDataService.getSolutionAreaPosition(); + String [] solutionAreaPositionArr = solutionAreaPosition.split(","); + int x2 = Integer.parseInt(solutionAreaPositionArr[0]); + int y2 = Integer.parseInt(solutionAreaPositionArr[1]); + int z2 = Integer.parseInt(solutionAreaPositionArr[2]); + // 机械臂移动到指定的加热位坐标 + cmdList.add(() -> deviceService.moveRailArmToPoint(x1,y1,z1)); + // 打开钩子 cmdList.add(() -> deviceService.openClaw()); - cmdList.add(() -> deviceService.moveRailArmToPoint(4,5,6)); + // 下降高度 + cmdList.add(() -> deviceService.moveRailArmToPoint(x1,y1, z1 - (Integer) map.get("sys_offset_tube_rack_take_height"))); + // 闭合钩子 cmdList.add(() -> deviceService.closeClaw()); - initExecutorThread(cmdList, cmdForm); - return true; + // 机械臂抬起高度 + cmdList.add(() -> deviceService.moveRailArmToPoint(x1,y1, z1 + (Integer) map.get("sys_offset_tube_rack_take_height") + (Integer) map.get("sys_offset_tube_height"))); + // 机械臂移动到加液位高度 + cmdList.add(() -> deviceService.moveRailArmToPoint(x2,y2, z1 + (Integer) map.get("sys_offset_tube_rack_take_height") + (Integer) map.get("sys_offset_tube_height"))); + // 机械臂下降高度 + cmdList.add(() -> deviceService.moveRailArmToPoint(x2,y2, z2)); + // 机械臂打开钩子 + cmdList.add(() -> deviceService.openClaw()); + // 机械臂上升高度 + cmdList.add(() -> deviceService.moveRailArmToPoint(x2,y2, z2 + (Integer) map.get("sys_offset_tube_rack_take_height"))); + // 关闭钩子 + cmdList.add(() -> deviceService.closeClaw()); + + return cmdList; } // 加液 - private Boolean injectFluid(CMDForm cmdForm) { + private List> injectFluid(Map params) { List> cmdList = new ArrayList<>(); - // TODO 计算出试管的坐标 - // TODO 溶液id 容量 - Map params = cmdForm.getParams(); - cmdList.add(() -> deviceService.moveLiquidArmToPoint(1,2,3)); - cmdList.add(() -> deviceService.addLiquid((Long) params.get("pumpId"), ((Integer)params.get("volume")))); - initExecutorThread(cmdList, cmdForm); - return true; + // 试管的坐标 + String tubePosition = baseDataService.getTubePositionBySolutionArea((Integer) params.get("tubeNum")); + String [] tubePositionArr =tubePosition.split(","); + int x = Integer.parseInt(tubePositionArr[0]); + int y = Integer.parseInt(tubePositionArr[1]); + int z = Integer.parseInt(tubePositionArr[2]); + // 泵id + String pumpId = baseDataService.getPumpIdBySolutionId((Integer) params.get("solutionId")); + cmdList.add(() -> deviceService.moveLiquidArmToPoint(x,y,z)); + cmdList.add(() -> deviceService.addLiquid(Long.valueOf(pumpId), ((Integer)params.get("volume")))); + return cmdList; } // 放下托盘 - private boolean downTray(CMDForm cmdForm) { + private List> downTray(Map params) { List> cmdList = new ArrayList<>(); - cmdList.add(() -> deviceService.lowerTray((String) cmdForm.getParams().get("heaterId"))); - initExecutorThread(cmdList, cmdForm); - return true; + String hardwareId = baseDataService.getHeatAreaHardwareIdById((Integer) params.get("areaId")); + if(params.get("height") != null && params.get("speed") != null) { + cmdList.add(() -> deviceService.setTrayParams(hardwareId, (Integer) params.get("speed"), (Integer) params.get("height"))); + } + cmdList.add(() -> deviceService.lowerTray(hardwareId)); + return cmdList; } + // 抬起托盘 - private boolean upTray(CMDForm cmdForm) { + private List> upTray(Map params) { List> cmdList = new ArrayList<>(); - cmdList.add(() -> deviceService.raiseTray((String) cmdForm.getParams().get("heaterId"))); - initExecutorThread(cmdList, cmdForm); - return true; + String hardwareId = baseDataService.getHeatAreaHardwareIdById((Integer) params.get("areaId")); + if(params.get("height") != null && params.get("speed") != null) { + cmdList.add(() -> deviceService.setTrayParams(hardwareId, (Integer) params.get("speed"), (Integer) params.get("height"))); + } + cmdList.add(() -> deviceService.raiseTray(hardwareId)); + + return cmdList; } - private void initExecutorThread(List> cmdList, CMDForm cmdForm) { - new Thread(() -> run(cmdList, cmdForm)).start(); + private void initExecutorThread(List> cmdList) { + new Thread(() -> run(cmdList)).start(); } - private void run(List> cmdList, CMDForm cmdForm) { + private void run(List> cmdList) { ExecutionResult executionResult = new ExecutionResult(); - executionResult.setCommandId(cmdForm.getCommandId()); - executionResult.setCommandName(cmdForm.getCommand()); + executionResult.setCommandId(form.getCommandId()); + executionResult.setCommandName(form.getCommand()); // 执行所有命令 for (Supplier command : cmdList) { boolean result = command.get(); if (!result) { - log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm)); + log.error("指令执行异常: {}", JSONUtil.toJsonStr(form)); executionResult.setStatus(CMDResultCode.FAILURE.getCode()); executionResult.setMessage(CMDResultCode.FAILURE.getMsg()); webSocketService.pushMsg("cmd", executionResult); @@ -200,12 +221,13 @@ public class CMDService { } public boolean executeCommand(CMDForm cmdForm) { + form = cmdForm; String commandName = cmdForm.getCommand(); - Function command = commandMap.get(commandName); + Function, List>> command = commandMap.get(commandName); if (command == null) { return false; } - command.apply(cmdForm); + command.apply(form.getParams()); return true; } }