Browse Source

fix: 批量加液逻辑修改

master
guoapeng 5 months ago
parent
commit
02670c7935
  1. 5
      src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java
  2. 19
      src/main/java/com/qyft/gd/controller/CMDController.java
  3. 11
      src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java
  4. 14
      src/main/java/com/qyft/gd/model/dto/InjectFluid.java
  5. 17
      src/main/java/com/qyft/gd/service/BaseDataService.java
  6. 66
      src/main/java/com/qyft/gd/service/CMDService.java
  7. 2
      src/main/java/com/qyft/gd/service/ContainerService.java
  8. 1
      src/main/java/com/qyft/gd/service/WebSocketService.java
  9. 5
      src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java

5
src/main/java/com/qyft/gd/common/constant/WebSocketMessageType.java

@ -17,4 +17,9 @@ public class WebSocketMessageType {
* 工艺执行反馈
*/
public static final String CRAFTS = "crafts";
/**
* 容器剩余状态
*/
public static final String CONTAINER = "container";
}

19
src/main/java/com/qyft/gd/controller/CMDController.java

@ -14,9 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import java.util.*;
import java.util.function.Supplier;
@Tag(name = "控制指令")
@RestController
@ -64,18 +63,8 @@ public class CMDController {
@Operation(summary = "批量加液")
@PostMapping("/injectFluid")
public Result<String> injectFluid(@RequestBody CmdInjectFluidDTO[] list) {
for (CmdInjectFluidDTO cmdInjectFluidDTO : list) {
CMDForm cmdForm = new CMDForm();
cmdForm.setCommand("injectFluid");
cmdForm.setCommandId(UUID.randomUUID().toString());
Map<String, Object> params = new HashMap<>();
params.put("tubeNum", cmdInjectFluidDTO.getTubeNum());
params.put("solutionId", cmdInjectFluidDTO.getSolutionId());
params.put("volume", cmdInjectFluidDTO.getVolume());
cmdForm.setParams(params);
cmdService.executeCommand(cmdForm);
}
public Result<String> injectFluid(@RequestBody CmdInjectFluidDTO dto) {
cmdService.injectFluids(dto);
return Result.success("操作成功");
}
}

11
src/main/java/com/qyft/gd/model/dto/CmdInjectFluidDTO.java

@ -5,10 +5,9 @@ import lombok.Data;
@Data
public class CmdInjectFluidDTO {
@Schema(description = "试管编号")
private Integer tubeNum;
@Schema(description = "溶液id")
private Integer solutionId;
@Schema(description = "容量")
private Integer volume;
@Schema(description = "指令id")
private String commandId;
@Schema(description = "加液数据list")
private InjectFluid[] injectFluids;
}

14
src/main/java/com/qyft/gd/model/dto/InjectFluid.java

@ -0,0 +1,14 @@
package com.qyft.gd.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class InjectFluid {
@Schema(description = "试管编号")
private Integer tubeNum;
@Schema(description = "溶液id")
private Integer solutionId;
@Schema(description = "容量")
private Integer volume;
}

17
src/main/java/com/qyft/gd/service/BaseDataService.java

@ -51,6 +51,17 @@ public class BaseDataService {
return null;
}
// 根据容液id获取容器信息
public ContainerListVO getContainerBySolutionId(int solutionId) {
List<ContainerListVO> containers = map.getContainers();
for (ContainerListVO container : containers) {
if (container.getSolutionId() == solutionId) {
return container;
}
}
return null;
}
// 获取试管架某个试管坐标
public String getTubePositionByHeatArea(int areaId, int tubeNumber) {
SysSettingVO sysSettingVO = findSysSettingById(map.getHeat_area(), areaId);
@ -134,6 +145,12 @@ public class BaseDataService {
return true;
}
// 更新配置
public Boolean updateConfig() {
init();
return true;
}
@PostConstruct
private void init() {
List<SysSettingVO> heatAreaList = sysSettingsService.getConfig("heat_area");

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

@ -5,9 +5,12 @@ import com.qyft.gd.common.constant.Commands;
import com.qyft.gd.common.constant.WebSocketMessageType;
import com.qyft.gd.common.result.CMDResultCode;
import com.qyft.gd.device.service.DeviceService;
import com.qyft.gd.model.dto.CmdInjectFluidDTO;
import com.qyft.gd.model.dto.InjectFluid;
import com.qyft.gd.model.entity.TaskSteps;
import com.qyft.gd.model.entity.Tasks;
import com.qyft.gd.model.form.CMDForm;
import com.qyft.gd.model.vo.ContainerListVO;
import com.qyft.gd.model.vo.ExecutionResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -29,15 +32,19 @@ public class CMDService {
DeviceService deviceService;
WebSocketService webSocketService;
BaseDataService baseDataService;
ContainerService containerService;
Map<String, Function<Map<String, Object>, List<Supplier<Boolean>>>> commandMap;
CMDForm form;
Map<String, String> cmdMap;
@Autowired
public CMDService(DeviceService deviceService, WebSocketService webSocketService, BaseDataService baseDataService, TasksService tasksService, TaskStepsService taskStepsService) {
public CMDService(DeviceService deviceService, WebSocketService webSocketService, BaseDataService baseDataService, TasksService tasksService, TaskStepsService taskStepsService, ContainerService containerService) {
this.deviceService = deviceService;
this.webSocketService = webSocketService;
this.baseDataService = baseDataService;
this.tasksService = tasksService;
this.taskStepsService = taskStepsService;
this.containerService = containerService;
this.cmdMap = new HashMap<>();
cmdMap.put("openDoor", "开门");
cmdMap.put("closeDoor", "关门");
@ -77,8 +84,7 @@ public class CMDService {
commandMap.put(Commands.MOVE_TO_HEAT_AREA, this::moveToHeatArea);
commandMap.put(Commands.OPEN_CLAW, this::openClaw);
commandMap.put(Commands.CLOSE_CLAW, this::closeClaw);
this.tasksService = tasksService;
this.taskStepsService = taskStepsService;
}
// 开门
@ -339,9 +345,46 @@ public class CMDService {
}
// 批量加液
public void injectFluids(CmdInjectFluidDTO dto) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
for (InjectFluid injectFluid : dto.getInjectFluids()) {
Map<String, Object> map = new HashMap<>();
map.put("tubeNum", injectFluid.getTubeNum());
map.put("solutionId", injectFluid.getSolutionId());
map.put("volume", injectFluid.getVolume());
cmdList.addAll(injectFluid(map));
}
new Thread(() -> {
ExecutionResult executionResult = new ExecutionResult();
executionResult.setCommandId(dto.getCommandId());
// 执行所有命令
for (Supplier<Boolean> command : cmdList) {
boolean result = command.get();
if (!result) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(dto));
executionResult.setStatus(CMDResultCode.FAILURE.getCode());
executionResult.setMessage(CMDResultCode.FAILURE.getMsg());
webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
return;
}
}
executionResult.setStatus(CMDResultCode.SUCCESS.getCode());
executionResult.setMessage(CMDResultCode.SUCCESS.getMsg());
webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
}).start();
}
// 加液
public List<Supplier<Boolean>> injectFluid(Map<String, Object> params) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
// 获取容器信息
ContainerListVO container = baseDataService.getContainerBySolutionId((Integer) params.get("solutionId"));
if(container.getCapacityTotal() - container.getCapacityUsed() < (Integer) params.get("volume")) {
cmdList.add(() -> false);
}
// 试管的坐标
String tubePosition = baseDataService.getTubePositionBySolutionArea((Integer) params.get("tubeNum"));
String[] tubePositionArr = tubePosition.split(",");
@ -355,6 +398,8 @@ public class CMDService {
}
cmdList.add(() -> deviceService.moveLiquidArmToPoint(x, y, z));
cmdList.add(() -> deviceService.addLiquid(Long.valueOf(pumpId), ((Integer) params.get("volume"))));
cmdList.add(() -> updateVolume(params));
return cmdList;
}
@ -381,6 +426,19 @@ public class CMDService {
return cmdList;
}
private boolean updateVolume (Map<String, Object> params) {
// 获取容器信息
ContainerListVO container = baseDataService.getContainerBySolutionId((Integer) params.get("solutionId"));
container.setCapacityUsed(container.getCapacityUsed() + (Integer) params.get("volume"));
containerService.updateById(container);
baseDataService.updateConfig();
List<ContainerListVO> list = containerService.getAllContainer();
Map<String, Object> containerMap = new HashMap<>();
containerMap.put("containerList", list);
webSocketService.pushMsg(WebSocketMessageType.CONTAINER, containerMap);
return true;
}
private void initExecutorThread(List<Supplier<Boolean>> cmdList) {
new Thread(() -> run(cmdList)).start();
}
@ -424,4 +482,6 @@ public class CMDService {
initExecutorThread(cmdList);
return true;
}
}

2
src/main/java/com/qyft/gd/service/ContainerService.java

@ -14,4 +14,6 @@ public interface ContainerService extends IService<Container> {
List<ContainerListVO> getAllContainer();
Boolean updateById(ContainerDTO dto);
Container selectById(Long id);
}

1
src/main/java/com/qyft/gd/service/WebSocketService.java

@ -1,6 +1,7 @@
package com.qyft.gd.service;
import cn.hutool.json.JSONUtil;
import com.qyft.gd.common.constant.WebSocketMessageType;
import com.qyft.gd.config.WebSocketServer;
import com.qyft.gd.model.vo.WebsocketResult;
import org.springframework.stereotype.Service;

5
src/main/java/com/qyft/gd/service/impl/ContainerServiceImpl.java

@ -32,4 +32,9 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container
container.setCapacityUsed(dto.getCapacityUsed());
return this.baseMapper.updateById(container) > 0;
}
@Override
public Container selectById(Long id) {
return this.baseMapper.selectById(id);
}
}
Loading…
Cancel
Save