From 1a084c681dfb4821a2fea6471f16b6c1e0a07b3d Mon Sep 17 00:00:00 2001 From: guoapeng Date: Wed, 19 Feb 2025 14:52:40 +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?;=E5=9F=BA=E7=A1=80=E6=95=B0=E6=8D=AE=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=E5=85=AC=E5=85=B1=E6=96=B9=E6=B3=95.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/demo.sql | 24 ++-- .../qyft/gd/controller/SysSettingsController.java | 4 +- .../java/com/qyft/gd/model/vo/SysSettingVO.java | 14 ++- .../java/com/qyft/gd/service/BaseDataService.java | 138 ++++++++++++++++++--- src/main/java/com/qyft/gd/service/CMDService.java | 23 ++-- .../java/com/qyft/gd/service/StatusService.java | 40 ++++++ .../gd/service/impl/SysSettingsServiceImpl.java | 1 - src/main/resources/mapper/SysSettingsMapper.xml | 10 +- 8 files changed, 207 insertions(+), 47 deletions(-) create mode 100644 src/main/java/com/qyft/gd/service/StatusService.java diff --git a/sql/demo.sql b/sql/demo.sql index 05361d6..93de601 100644 --- a/sql/demo.sql +++ b/sql/demo.sql @@ -49,20 +49,26 @@ CREATE TABLE IF NOT EXISTS sys_settings ( INSERT INTO sys_settings (id, parent_id, name, code, value1, value2, value3, value4) VALUES (1, -1, '加热区域配置', 'heat_area', '坐标', '硬件代号', '温度', '工艺id' ), - (2, 1, 'A1', 'heat_area_A1', '1,1,1', '', '', ''), - (3, 1, 'A2', 'heat_area_A2', '2,2,2', '', '',''), - (4, 1, 'A3', 'heat_area_A3', '3,3,3', '', '',''), - (5, 1, 'A4', 'heat_area_A4', '4,4,4', '', '',''), - (6, 1, 'A5', 'heat_area_A5', '5,5,5', '', '',''), - (7, 1, 'A6', 'heat_area_A6', '6,6,6', '', '',''), + (2, 1, 'A1', 'heat_area_A1', '1,1,1', '11', '', ''), + (3, 1, 'A2', 'heat_area_A2', '2,2,2', '22', '',''), + (4, 1, 'A3', 'heat_area_A3', '3,3,3', '33', '',''), + (5, 1, 'A4', 'heat_area_A4', '4,4,4', '44', '',''), + (6, 1, 'A5', 'heat_area_A5', '5,5,5', '55', '',''), + (7, 1, 'A6', 'heat_area_A6', '6,6,6', '66', '',''), (8, -1, '加液区域配置', 'solution_area', '坐标', '硬件代号', '','' ), - (9, 8, '加液区', 'solution_area_A7', '7,7,7', '', '','' ), + (9, 8, '加液区', 'solution_area_A7', '7,7,7', '77', '','' ), (10, -1, '拍子区域配置', 'lid_area', '坐标', '硬件代号', '' ,''), - (11, 10, '拍子存放区', 'lid_area_A8', '8,8,8', '', '','' ), + (11, 10, '拍子存放区', 'lid_area_A8', '8,8,8', '88', '','' ), (12, -1, '其他系统配置', 'sys_setting', '系统配置的值', '', '' ,''), (13, 12, '溶液量低提示', 'sys_setting_volume', '300', '', '',''), (14, 12, '异常处理区', 'sys_setting_abnormal_area', '7' , '', '',''), - (15, 12, '设备信息', 'sys_setting_info', '12345' , '', '',''); + (15, 12, '设备信息', 'sys_setting_info', '12345' , '', '',''), + (16, -1, '偏移量', 'sys_offset', '毫米' , '', '',''), + (17, 16, '试管半径', 'sys_offset_tube_radius', '100' , '', '',''), + (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' , '', '',''); -- 创建 solutions 溶液 表 diff --git a/src/main/java/com/qyft/gd/controller/SysSettingsController.java b/src/main/java/com/qyft/gd/controller/SysSettingsController.java index 39e1571..12fe5a7 100644 --- a/src/main/java/com/qyft/gd/controller/SysSettingsController.java +++ b/src/main/java/com/qyft/gd/controller/SysSettingsController.java @@ -1,6 +1,7 @@ package com.qyft.gd.controller; import com.qyft.gd.model.dto.SysSettingsDTO; +import com.qyft.gd.service.BaseDataService; import com.qyft.gd.service.SysSettingsService; import com.qyft.gd.system.common.result.Result; import io.micrometer.common.lang.Nullable; @@ -20,6 +21,7 @@ import java.util.List; @Slf4j public class SysSettingsController { private final SysSettingsService sysSettingsService; + private final BaseDataService baseDataService; @Operation(summary = "获取配置") @GetMapping("/getConfig") public Result> getConfig( @@ -40,7 +42,7 @@ public class SysSettingsController { @Operation(summary = "更新配置") @PutMapping("/updateConfig") public Result updateConfig(@RequestBody List dto) { - boolean isSuccess = sysSettingsService.updateConfig(dto); + boolean isSuccess = baseDataService.updateConfig(dto); if (isSuccess) { return Result.success(); } diff --git a/src/main/java/com/qyft/gd/model/vo/SysSettingVO.java b/src/main/java/com/qyft/gd/model/vo/SysSettingVO.java index 3398891..34dc3f6 100644 --- a/src/main/java/com/qyft/gd/model/vo/SysSettingVO.java +++ b/src/main/java/com/qyft/gd/model/vo/SysSettingVO.java @@ -12,10 +12,10 @@ import java.util.List; public class SysSettingVO { @Schema(description = "主键id") - private Long id; + private int id; @Schema(description = "父id") - private Long parentId; + private int parentId; @Schema(description = "名称") private String name; @@ -30,9 +30,15 @@ public class SysSettingVO { private String hardwareId; @Schema(description = "加热区温度") - private Integer temperature; + private Long temperature; @Schema(description = "工艺id") - private Long craftId; + private int craftId; + + @Schema(description = "试管坐标list") + private List tubePositionList; + + @Schema(description = "拍子坐标") + private String LidPosition; } diff --git a/src/main/java/com/qyft/gd/service/BaseDataService.java b/src/main/java/com/qyft/gd/service/BaseDataService.java index 3ef7a45..55dddc1 100644 --- a/src/main/java/com/qyft/gd/service/BaseDataService.java +++ b/src/main/java/com/qyft/gd/service/BaseDataService.java @@ -1,57 +1,157 @@ package com.qyft.gd.service; +import com.qyft.gd.mapper.SysSettingsMapper; import com.qyft.gd.model.dto.SysSettingsDTO; 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.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +@Slf4j @Service public class BaseDataService { private final SysSettingsService sysSettingsService; private final ContainerService containerService; + private final SysSettingsMapper sysSettingsMapper; private final BaseDataVO map = new BaseDataVO(); - public BaseDataService(SysSettingsService sysSettingsService, ContainerService containerService) { + public BaseDataService(SysSettingsService sysSettingsService, ContainerService containerService, SysSettingsMapper sysSettingsMapper) { this.sysSettingsService = sysSettingsService; this.containerService = containerService; + this.sysSettingsMapper = sysSettingsMapper; } -// @PostConstruct - public void init() { + // 获取试管架某个试管坐标 + public String getTubePositionByHeatArea(int areaId, int tubeNumber) { + SysSettingVO sysSettingVO = findSysSettingById(map.getHeat_area(), areaId); + if (sysSettingVO != null) { + return sysSettingVO.getTubePositionList().get(tubeNumber - 1); + } + return null; + } + // 获取加液区某个试管坐标 + public String getTubePositionBySolutionArea(int tubeNumber) { + List list = map.getSolution_area(); + return list.get(0).getTubePositionList().get(tubeNumber - 1); + } + + // 获取所有加热区 + public List getAllHeatArea() { + return map.getHeat_area(); + } + + // 根据id获取加热区坐标 + public String getHeatAreaPositionById(int id) { + for (SysSettingVO sysSettingVO : map.getHeat_area()) { + if (sysSettingVO.getId() == id) { + return sysSettingVO.getValue(); + } + } + return null; // 如果没有找到,返回 null + } + + // 获取加液区坐标 + public String getSolutionAreaPosition() { + List list = map.getSolution_area(); + if (!list.isEmpty()) { + return list.get(0).getValue(); + } + return null; // 如果没有找到,返回 null + } + + // 根据id获取加热区拍子的坐标 + public String getHeatAreaLidPositionById(int id) { + for (SysSettingVO sysSettingVO : map.getHeat_area()) { + if (sysSettingVO.getId() == id) { + return sysSettingVO.getLidPosition(); + } + } + return null; // 如果没有找到,返回 null + } + + // 获取所有基础数据 + public BaseDataVO getBaseData() { + return map; + } + + // 更新配置 + public Boolean updateConfig(List dto) { + for (SysSettingsDTO sysSettingsDTO : dto) { + sysSettingsMapper.updateById(sysSettingsDTO); + } + init(); + return true; + } + + @PostConstruct + private void init() { List heatAreaList = sysSettingsService.getConfig("heat_area"); List solutionAreaList = sysSettingsService.getConfig("solution_area"); List lidAreaList = sysSettingsService.getConfig("lid_area"); List sysSettingList = sysSettingsService.getConfig("sys_setting"); List containerList = containerService.getAllContainer(); - for (SysSettingVO sysSettingVO : sysSettingList) { - sysSettingVO.setTemperature(0); - sysSettingVO.setCraftId(null); - } map.setHeat_area(heatAreaList); map.setSolution_area(solutionAreaList); map.setLid_area(lidAreaList); map.setSys_setting(sysSettingList); map.setContainers(containerList); + calculateTubeCoordinates(); + log.info("初始化数据成功:{}", map); } - public BaseDataVO getBaseData() { - return map; + + // 计算试管坐标 + 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); } - public void updateBaseData(SysSettingsDTO dto) { - init(); - List heatAreaList = map.getHeat_area(); - for (SysSettingVO sysSettingVO : heatAreaList) { - if (sysSettingVO.getId().equals(dto.getId())) { - if(dto.getTemperature() != null ) { - sysSettingVO.setTemperature(Math.toIntExact(dto.getTemperature())); - } - if (dto.getCraftId() != null) { - sysSettingVO.setCraftId(dto.getCraftId()); + // 封装计算试管位置的公共方法 + private void calculateTubePositions(List areaList, Map offsetMap, int type) { + areaList.forEach(sysSettingVO -> { + List tubePositionList = new ArrayList<>(); + // 试管架中心点 + String centerPosition = sysSettingVO.getValue(); + String[] split = centerPosition.split(","); + // 试管半径 + int radius = Integer.parseInt((String) offsetMap.get("sys_offset_tube_radius")); + // 圆心间距 + int distance = Integer.parseInt((String) offsetMap.get("sys_offset_tube_distance")); + // 圆心之间的水平和垂直偏移量 + int firstX = (int) (Integer.parseInt(split[0]) - 1.5 * distance); + int firstY = (int) (Integer.parseInt(split[1]) + 1.5 * distance); + // 循环计算每个圆的坐标 + for (int row = 0; row < 4 ; row++) { + for (int col = 0; col < 4; col++) { + int x = firstX + col * distance; + int y = firstY - row * distance; + tubePositionList.add(x + "," + y + ","+ offsetMap.get("sys_offset_tube_height")); } } + sysSettingVO.setTubePositionList(tubePositionList); + if(type == 0) { + sysSettingVO.setLidPosition(split[0] + "," + split[1] + "," + offsetMap.get("sys_offset_lid_height")); + } + }); + } + + private SysSettingVO findSysSettingById(List list, int id) { + for (SysSettingVO item : list) { + if (item.getId() == id) { + return item; + } } + return null; // 如果没有找到,返回 null } } diff --git a/src/main/java/com/qyft/gd/service/CMDService.java b/src/main/java/com/qyft/gd/service/CMDService.java index f86ea96..895558e 100644 --- a/src/main/java/com/qyft/gd/service/CMDService.java +++ b/src/main/java/com/qyft/gd/service/CMDService.java @@ -42,6 +42,17 @@ public class CMDService { commandMap.put(Commands.PUT_BACK_CAP, this::putBackCap); commandMap.put(Commands.MOVE_MACHINE_ARM, this::moveMachineArm); commandMap.put(Commands.MOVE_TUBE, this::moveTube); + commandMap.put(Commands.MOVE_TO_HEAT_AREA, this::moveToHeatArea); + } + // 移至加热 + private boolean moveToHeatArea(CMDForm cmdForm) { + 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; } // 移动单个试管 private Boolean moveTube(CMDForm cmdForm) { @@ -196,17 +207,5 @@ public class CMDService { } command.apply(cmdForm); return true; - -// ExecutionResult executionResult = new ExecutionResult(); -// executionResult.setCommandId(cmdForm.getCommandId()); -// executionResult.setCommandName(cmdForm.getCommand()); -// boolean result =command.apply(cmdForm); -// if(result) { -// executionResult.setStatus(CMDResultCode.SUCCESS.getCode()); -// executionResult.setMessage(CMDResultCode.SUCCESS.getMsg()); -// }else { -// executionResult.setStatus(CMDResultCode.FAILURE.getCode()); -// executionResult.setMessage(CMDResultCode.FAILURE.getMsg()); -// } } } diff --git a/src/main/java/com/qyft/gd/service/StatusService.java b/src/main/java/com/qyft/gd/service/StatusService.java new file mode 100644 index 0000000..4c5deaa --- /dev/null +++ b/src/main/java/com/qyft/gd/service/StatusService.java @@ -0,0 +1,40 @@ +package com.qyft.gd.service; + +import com.qyft.gd.device.model.bo.DeviceStatus; +import com.qyft.gd.device.service.DeviceStateService; +import jakarta.annotation.PostConstruct; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Timer; +import java.util.TimerTask; + +@Slf4j +@Service +public class StatusService { + + private final WebSocketService webSocketService; + private final DeviceStateService deviceStateService; + private Timer timer; + + @Autowired + public StatusService(WebSocketService webSocketService, DeviceStateService deviceStateService) { + this.webSocketService = webSocketService; + this.deviceStateService = deviceStateService; + } + + @PostConstruct + public void init() { + timer = new Timer(); + TimerTask task = new TimerTask() { + @Override + public void run() { + DeviceStatus deviceStatus = deviceStateService.getDeviceStatus(); + webSocketService.pushMsg("status", deviceStatus); + } + }; + + timer.schedule(task, 10, 100); + } +} diff --git a/src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java b/src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java index 31059b4..c301826 100644 --- a/src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java +++ b/src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java @@ -49,7 +49,6 @@ public class SysSettingsServiceImpl extends ServiceImpl dto) { for (SysSettingsDTO sysSettingsDTO : dto) { sysSettingsMapper.updateById(sysSettingsDTO); -// baseDataService.updateBaseData(sysSettingsDTO); } return true; } diff --git a/src/main/resources/mapper/SysSettingsMapper.xml b/src/main/resources/mapper/SysSettingsMapper.xml index cd3a388..0dec4e1 100644 --- a/src/main/resources/mapper/SysSettingsMapper.xml +++ b/src/main/resources/mapper/SysSettingsMapper.xml @@ -2,7 +2,15 @@