Browse Source

feat: 系统配置新增偏移量信息;基础数据新增公共方法.

master
guoapeng 6 months ago
parent
commit
1a084c681d
  1. 24
      sql/demo.sql
  2. 4
      src/main/java/com/qyft/gd/controller/SysSettingsController.java
  3. 14
      src/main/java/com/qyft/gd/model/vo/SysSettingVO.java
  4. 138
      src/main/java/com/qyft/gd/service/BaseDataService.java
  5. 23
      src/main/java/com/qyft/gd/service/CMDService.java
  6. 40
      src/main/java/com/qyft/gd/service/StatusService.java
  7. 1
      src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java
  8. 10
      src/main/resources/mapper/SysSettingsMapper.xml

24
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 溶液 表

4
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<List<?>> getConfig(
@ -40,7 +42,7 @@ public class SysSettingsController {
@Operation(summary = "更新配置")
@PutMapping("/updateConfig")
public Result<String> updateConfig(@RequestBody List<SysSettingsDTO> dto) {
boolean isSuccess = sysSettingsService.updateConfig(dto);
boolean isSuccess = baseDataService.updateConfig(dto);
if (isSuccess) {
return Result.success();
}

14
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<String> tubePositionList;
@Schema(description = "拍子坐标")
private String LidPosition;
}

138
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<SysSettingVO> list = map.getSolution_area();
return list.get(0).getTubePositionList().get(tubeNumber - 1);
}
// 获取所有加热区
public List<SysSettingVO> 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<SysSettingVO> 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<SysSettingsDTO> dto) {
for (SysSettingsDTO sysSettingsDTO : dto) {
sysSettingsMapper.updateById(sysSettingsDTO);
}
init();
return true;
}
@PostConstruct
private void init() {
List<SysSettingVO> heatAreaList = sysSettingsService.getConfig("heat_area");
List<SysSettingVO> solutionAreaList = sysSettingsService.getConfig("solution_area");
List<SysSettingVO> lidAreaList = sysSettingsService.getConfig("lid_area");
List<SysSettingVO> sysSettingList = sysSettingsService.getConfig("sys_setting");
List<ContainerListVO> 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<SysSettingVO> sysSettingVOList = sysSettingsService.getConfig("sys_offset");
Map<String, Object> 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<SysSettingVO> 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<SysSettingVO> areaList, Map<String, Object> offsetMap, int type) {
areaList.forEach(sysSettingVO -> {
List<String> 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<SysSettingVO> list, int id) {
for (SysSettingVO item : list) {
if (item.getId() == id) {
return item;
}
}
return null; // 如果没有找到返回 null
}
}

23
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<Supplier<Boolean>> 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());
// }
}
}

40
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);
}
}

1
src/main/java/com/qyft/gd/service/impl/SysSettingsServiceImpl.java

@ -49,7 +49,6 @@ public class SysSettingsServiceImpl extends ServiceImpl<SysSettingsMapper, SysSe
public Boolean updateConfig(List<SysSettingsDTO> dto) {
for (SysSettingsDTO sysSettingsDTO : dto) {
sysSettingsMapper.updateById(sysSettingsDTO);
// baseDataService.updateBaseData(sysSettingsDTO);
}
return true;
}

10
src/main/resources/mapper/SysSettingsMapper.xml

@ -2,7 +2,15 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyft.gd.mapper.SysSettingsMapper">
<select id="getConfig" resultType="com.qyft.gd.model.vo.SysSettingVO">
select id, parent_id, code, name, value1 as value, value2 as hardwareId from sys_settings where parent_id = #{parentId}
select
id,
parent_id,
code, name,
value1 as value,
value2 as hardwareId,
value3 as temperature,
value4 as craftId
from sys_settings where parent_id = #{parentId}
</select>
<select id="getIdByCode" resultType="java.lang.Integer">
select id from sys_settings where code = #{type}

Loading…
Cancel
Save