Browse Source

fix:实现可编辑的设备控制功能

master
白凤吉 5 months ago
parent
commit
1d6460ecbf
  1. 33
      src/main/java/com/qyft/gd/device/controller/DeviceCtrlController.java
  2. 6
      src/main/java/com/qyft/gd/device/model/bo/DeviceCtrlFuncCMD.java
  3. 8
      src/main/java/com/qyft/gd/device/model/form/CtrlFuncForm.java
  4. 2
      src/main/java/com/qyft/gd/device/service/ICtrlFuncService.java
  5. 47
      src/main/java/com/qyft/gd/device/service/impl/CtrlFuncServiceImpl.java
  6. 7
      src/main/java/com/qyft/gd/service/CMDService.java
  7. 16
      src/main/java/com/qyft/gd/system/config/WebConfig.java

33
src/main/java/com/qyft/gd/device/controller/DeviceCtrlController.java

@ -1,11 +1,9 @@
package com.qyft.gd.device.controller;
import com.qyft.gd.device.model.bo.DeviceCtrlFuncCMD;
import com.qyft.gd.device.model.bo.DeviceStatus;
import com.qyft.gd.device.model.entity.CtrlFunc;
import com.qyft.gd.device.model.form.CtrlFuncForm;
import com.qyft.gd.device.model.vo.DeviceCtrlFuncVO;
import com.qyft.gd.device.service.DeviceStatusService;
import com.qyft.gd.device.service.ICtrlFuncService;
import com.qyft.gd.system.common.result.Result;
import com.qyft.gd.system.common.result.ResultCode;
@ -43,7 +41,7 @@ public class DeviceCtrlController {
@Operation(summary = "根据id获取设备控制方法与步骤")
@GetMapping("/ctrl/{id}")
public Result<DeviceCtrlFuncVO> getById(@PathVariable Long id) {
DeviceCtrlFuncVO ctrlFuncVO = ctrlFuncService.findById(id);
DeviceCtrlFuncVO ctrlFuncVO = ctrlFuncService.findVOById(id);
return Result.success(ctrlFuncVO);
}
@ -52,12 +50,12 @@ public class DeviceCtrlController {
public Result<String> addCtrlFunc(@RequestBody CtrlFuncForm ctrlFuncForm) {
long count = ctrlFuncService.countFuncCmdByFuncCmd(ctrlFuncForm.getFuncCmd());
if (count > 0) {
boolean isSuccess = ctrlFuncService.addCtrlFunc(ctrlFuncForm);
if (isSuccess) {
return Result.success();
}
} else {
return Result.failed(ResultCode.DATA_ALREADY_EXISTS);
}
boolean isSuccess = ctrlFuncService.addCtrlFunc(ctrlFuncForm);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ -65,15 +63,19 @@ public class DeviceCtrlController {
@Operation(summary = "更新设备控制方法与步骤")
@PutMapping("/ctrl/{id}")
public Result<String> updateCtrlFunc(@PathVariable Long id, @RequestBody CtrlFuncForm ctrlFuncForm) {
long count = ctrlFuncService.countFuncCmdByFuncCmd(ctrlFuncForm.getFuncCmd());
if (count > 0) {
boolean isSuccess = ctrlFuncService.updateCtrlFunc(id, ctrlFuncForm);
if (isSuccess) {
return Result.success();
CtrlFunc currentCtrlFunc = ctrlFuncService.getById(id);
if (currentCtrlFunc != null && !currentCtrlFunc.getFuncCmd().equals(ctrlFuncForm.getFuncCmd())) {
//改了指令需要判断指令是否重复
long count = ctrlFuncService.countFuncCmdByFuncCmd(ctrlFuncForm.getFuncCmd());
if (count > 0) {
return Result.failed(ResultCode.DATA_ALREADY_EXISTS);
}
} else {
return Result.failed(ResultCode.DATA_ALREADY_EXISTS);
}
boolean isSuccess = ctrlFuncService.updateCtrlFunc(id, ctrlFuncForm);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
@ -88,5 +90,4 @@ public class DeviceCtrlController {
}
}

6
src/main/java/com/qyft/gd/device/model/bo/DeviceCtrlFuncCMD.java

@ -9,9 +9,10 @@ import lombok.EqualsAndHashCode;
@Data
public class DeviceCtrlFuncCMD {
public DeviceCtrlFuncCMD(String name, String deviceCmd) {
public DeviceCtrlFuncCMD(String name, String deviceCmd, String params) {
this.name = name;
this.deviceCmd = deviceCmd;
this.params = params;
}
@Schema(description = "指令名称")
@ -20,4 +21,7 @@ public class DeviceCtrlFuncCMD {
@Schema(description = "设备指令")
private String deviceCmd;
@Schema(description = "参数")
private String params;
}

8
src/main/java/com/qyft/gd/device/model/form/CtrlFuncForm.java

@ -5,9 +5,10 @@ import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
import java.util.Map;
@EqualsAndHashCode(callSuper = false)
@Schema(description = "获取所有设备控制方法表单")
@Schema(description = "设备控制方法表单")
@Data
public class CtrlFuncForm {
@ -23,14 +24,11 @@ public class CtrlFuncForm {
@Data
public static class CtrlFuncStepForm {
@Schema(description = "控制方法的id")
private Long funcId;
@Schema(description = "设备指令")
private String deviceCmd;
@Schema(description = "设备指令的参数,为null则动态传入")
private String params;
private Map<String, Object> params;
}

2
src/main/java/com/qyft/gd/device/service/ICtrlFuncService.java

@ -15,7 +15,7 @@ public interface ICtrlFuncService extends IService<CtrlFunc> {
List<CtrlFunc> findAll();
DeviceCtrlFuncVO findById(Long id);
DeviceCtrlFuncVO findVOById(Long id);
long countFuncCmdByFuncCmd(String funcCmd);

47
src/main/java/com/qyft/gd/device/service/impl/CtrlFuncServiceImpl.java

@ -1,5 +1,6 @@
package com.qyft.gd.device.service.impl;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qyft.gd.device.mapper.CtrlFuncMapper;
@ -27,22 +28,22 @@ public class CtrlFuncServiceImpl extends ServiceImpl<CtrlFuncMapper, CtrlFunc> i
private static final List<DeviceCtrlFuncCMD> ctrlFuncDeviceCMDList = new ArrayList<>();
static {
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("开门", "openDoor"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("关门", "closeDoor"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂运动到指定点位", "moveRailArmToPoint"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂相对运动", "moveRailArmRelative"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂移至指定加热区上方", "moveToHeatArea"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂移至加液区上方", "moveToActionArea"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("打开导轨机械臂夹爪", "openClaw"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("收合导轨机械臂夹爪", "closeClaw"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区开始加热", "startHeating"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区停止加热", "stopHeating"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区抬起托盘", "raiseTray"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区放下托盘", "lowerTray"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("依次添加溶液", "addLiquid"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("开始摇匀", "startShaking"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("停止摇匀", "stopShaking"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("拍照", "takePhoto"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("开门", "openDoor", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("关门", "closeDoor", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂运动到指定点位", "moveRailArmToPoint", "{\"x\":0,\"y\":0,\"z\":0}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂相对运动", "moveRailArmRelative", "{\"x\":0,\"y\":0,\"z\":0}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂移至指定加热区上方", "moveToHeatArea", "{\"heatId\":2}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("导轨机械臂移至加液区上方", "moveToActionArea", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("打开导轨机械臂夹爪", "openClaw", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("收合导轨机械臂夹爪", "closeClaw", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区开始加热", "startHeating", "{\"heatId\":2}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区停止加热", "stopHeating", "{\"heatId\":2}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区抬起托盘", "raiseTray", "{\"heatId\":2}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("指定加热区放下托盘", "lowerTray", "{\"heatId\":2}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("依次添加溶液", "addLiquid", "{\"tubeSolList\":[{\"tubeNum\":1,\"solId\":15,\"volume\":20}]}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("开始摇匀", "startShaking", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("停止摇匀", "stopShaking", "{}"));
ctrlFuncDeviceCMDList.add(new DeviceCtrlFuncCMD("拍照", "takePhoto", "{}"));
}
@Override
@ -56,7 +57,7 @@ public class CtrlFuncServiceImpl extends ServiceImpl<CtrlFuncMapper, CtrlFunc> i
}
@Override
public DeviceCtrlFuncVO findById(Long id) {
public DeviceCtrlFuncVO findVOById(Long id) {
CtrlFunc ctrlFunc = this.getById(id);
List<CtrlFuncStep> ctrlFuncStepList = ctrlFuncStepService.selectListByFuncCmd(ctrlFunc.getFuncCmd());
DeviceCtrlFuncVO ctrlFuncVO = new DeviceCtrlFuncVO();
@ -78,7 +79,7 @@ public class CtrlFuncServiceImpl extends ServiceImpl<CtrlFuncMapper, CtrlFunc> i
ctrlFunc.setFuncCmd(ctrlFuncForm.getFuncCmd());
ctrlFunc.setName(ctrlFuncForm.getName());
if (this.save(ctrlFunc)) {
return saveCtrlFunc(ctrlFuncForm, ctrlFunc);
return reSaveCtrlFunc(ctrlFuncForm, ctrlFunc);
}
return false;
}
@ -90,7 +91,7 @@ public class CtrlFuncServiceImpl extends ServiceImpl<CtrlFuncMapper, CtrlFunc> i
ctrlFunc.setFuncCmd(ctrlFuncForm.getFuncCmd());
ctrlFunc.setName(ctrlFuncForm.getName());
if (this.updateById(ctrlFunc)) {
return saveCtrlFunc(ctrlFuncForm, ctrlFunc);
return reSaveCtrlFunc(ctrlFuncForm, ctrlFunc);
}
}
return false;
@ -102,19 +103,21 @@ public class CtrlFuncServiceImpl extends ServiceImpl<CtrlFuncMapper, CtrlFunc> i
.map(Long::parseLong)
.collect(Collectors.toList());
for (Long id : ids) {
ctrlFuncStepService.remove(new LambdaQueryWrapper<CtrlFuncStep>().eq(CtrlFuncStep::getFuncCmd, id));
String funcCmd = this.getById(id).getFuncCmd();
ctrlFuncStepService.remove(new LambdaQueryWrapper<CtrlFuncStep>().eq(CtrlFuncStep::getFuncCmd, funcCmd));
}
return this.removeByIds(ids);
}
private boolean saveCtrlFunc(CtrlFuncForm ctrlFuncForm, CtrlFunc ctrlFunc) {
private boolean reSaveCtrlFunc(CtrlFuncForm ctrlFuncForm, CtrlFunc ctrlFunc) {
ctrlFuncStepService.remove(new LambdaQueryWrapper<CtrlFuncStep>().eq(CtrlFuncStep::getFuncCmd, ctrlFunc.getFuncCmd()));
List<CtrlFuncForm.CtrlFuncStepForm> ctrlFuncStepFormList = ctrlFuncForm.getCtrlFuncStepList();
List<CtrlFuncStep> ctrlFuncStepList = ctrlFuncStepFormList.stream()
.map(ctrlFuncStepForm -> {
CtrlFuncStep ctrlFuncStep = new CtrlFuncStep();
ctrlFuncStep.setFuncCmd(ctrlFunc.getFuncCmd());
ctrlFuncStep.setDeviceCmd(ctrlFuncStepForm.getDeviceCmd());
ctrlFuncStep.setParams(ctrlFuncStepForm.getParams());
ctrlFuncStep.setParams(JSONUtil.toJsonStr(ctrlFuncStepForm.getParams()));
return ctrlFuncStep;
}).toList();
return ctrlFuncStepService.saveBatch(ctrlFuncStepList);

7
src/main/java/com/qyft/gd/service/CMDService.java

@ -45,7 +45,7 @@ public class CMDService {
int index = 0;
for (CtrlFuncStep ctrlFuncStep : ctrlFuncStepList) {
Map<String, Object> params = null;
Map<String, Object> params;
if (ctrlFuncStep.getParams() == null) { // 如果没有参数定义使用传入的参数
try {
params = (Map<String, Object>) paramsList.get(index);
@ -57,14 +57,15 @@ public class CMDService {
return;
}
index++; // 移动到下一个参数
}else{//如果有参数定义使用参数定义
params = JSONUtil.toBean(ctrlFuncStep.getParams(), Map.class);
}
String deviceCmd = ctrlFuncStep.getDeviceCmd();
Method method = getMethodByName(deviceCmd);
if (method != null) {
boolean success = (boolean) method.invoke(deviceCtrlService, params);
if (!success) {
log.error("指令执行错误,执行{}返回false: {}", deviceCmd, JSONUtil.toJsonStr(cmdForm));
log.error("指令执行错误,执行设备指令{}返回false: {}", deviceCmd, JSONUtil.toJsonStr(cmdForm));
executionResult.setStatus(CMDResultCode.FAILURE.getCode());
executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);

16
src/main/java/com/qyft/gd/system/config/WebConfig.java

@ -0,0 +1,16 @@
package com.qyft.gd.system.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*");
}
}
Loading…
Cancel
Save