Browse Source

feat: 系统配置新增偏移量信息;部分指令逻辑完成

master
guoapeng 6 months ago
parent
commit
f4fce15902
  1. 5
      sql/demo.sql
  2. 2
      src/main/java/com/qyft/gd/model/form/CMDForm.java
  3. 41
      src/main/java/com/qyft/gd/service/BaseDataService.java
  4. 184
      src/main/java/com/qyft/gd/service/CMDService.java

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

2
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: 温度

41
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<String, Object> 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<ContainerListVO> 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<SysSettingVO> lidAreaList = sysSettingsService.getConfig("lid_area");
List<SysSettingVO> sysSettingList = sysSettingsService.getConfig("sys_setting");
List<ContainerListVO> containerList = containerService.getAllContainer();
List<SysSettingVO> 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<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);
calculateTubePositions(map.getHeat_area(), 0);
calculateTubePositions(map.getSolution_area(), 1);
}
// 封装计算试管位置的公共方法
private void calculateTubePositions(List<SysSettingVO> areaList, Map<String, Object> offsetMap, int type) {
private void calculateTubePositions(List<SysSettingVO> areaList, int type) {
areaList.forEach(sysSettingVO -> {
List<String> tubePositionList = new ArrayList<>();
// 试管架中心点

184
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<String, Function<CMDForm, Boolean>> commandMap;
BaseDataService baseDataService;
Map<String, Function<Map<String, Object>, List<Supplier<Boolean>>>> 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<Supplier<Boolean>> moveToHeatArea(Map<String, Object> params) {
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;
return cmdList;
}
// 移动单个试管
private Boolean moveTube(CMDForm cmdForm) {
//TODO 执行指令
return true;
private List<Supplier<Boolean> >moveTube(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(() -> deviceService.moveRailArmToPoint(11,22,33));
return cmdList;
}
// 机械臂
private Boolean moveMachineArm(CMDForm cmdForm) {
private List<Supplier<Boolean>> moveMachineArm(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(() -> deviceService.moveRailArmToPoint(11,22,33));
initExecutorThread(cmdList, cmdForm);
return true;
return cmdList;
}
// 装回盖子
private Boolean putBackCap(CMDForm cmdForm) {
private List<Supplier<Boolean>> putBackCap(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> takeOffCap(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> takePhoto(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(() -> deviceService.takePhoto());
initExecutorThread(cmdList, cmdForm);
return true;
return cmdList;
}
// 停止加热
private Boolean stopHeat(CMDForm cmdForm) {
private List<Supplier<Boolean>> stopHeat(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> startHeat(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> startShakeUp(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> stopShakeUp(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(() -> deviceService.stopShaking());
initExecutorThread(cmdList, cmdForm);
return true;
return cmdList;
}
// 移至加液
private Boolean moveToActionArea(CMDForm cmdForm) {
private List<Supplier<Boolean>> moveToActionArea(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
// 加液位是否有托盘
// Boolean liquidTrayStatus = deviceStateService.getDeviceStatus().getLiquidTrayStatus();
// if(liquidTrayStatus) {
// return false;
// }
cmdList.add(() -> deviceService.moveRailArmToPoint(1, 2, 3));
Map<String ,Object> 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<Supplier<Boolean>> injectFluid(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
// TODO 计算出试管的坐标
// TODO 溶液id 容量
Map<String, Object> 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<Supplier<Boolean>> downTray(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> upTray(Map<String, Object> params) {
List<Supplier<Boolean>> 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<Supplier<Boolean>> cmdList, CMDForm cmdForm) {
new Thread(() -> run(cmdList, cmdForm)).start();
private void initExecutorThread(List<Supplier<Boolean>> cmdList) {
new Thread(() -> run(cmdList)).start();
}
private void run(List<Supplier<Boolean>> cmdList, CMDForm cmdForm) {
private void run(List<Supplier<Boolean>> cmdList) {
ExecutionResult executionResult = new ExecutionResult();
executionResult.setCommandId(cmdForm.getCommandId());
executionResult.setCommandName(cmdForm.getCommand());
executionResult.setCommandId(form.getCommandId());
executionResult.setCommandName(form.getCommand());
// 执行所有命令
for (Supplier<Boolean> 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<CMDForm, Boolean> command = commandMap.get(commandName);
Function<Map<String, Object>, List<Supplier<Boolean>>> command = commandMap.get(commandName);
if (command == null) {
return false;
}
command.apply(cmdForm);
command.apply(form.getParams());
return true;
}
}
Loading…
Cancel
Save