Browse Source

现场代码同步

master
白凤吉 3 months ago
parent
commit
ab11cb7267
  1. 3
      src/main/java/com/iflytop/gd/app/cmd/FanStartCommand.java
  2. 3
      src/main/java/com/iflytop/gd/app/cmd/FanStopCommand.java
  3. 8
      src/main/java/com/iflytop/gd/app/controller/AuthController.java
  4. 42
      src/main/java/com/iflytop/gd/app/controller/DeviceParamController.java
  5. 46
      src/main/java/com/iflytop/gd/app/controller/TasksController.java
  6. 1
      src/main/java/com/iflytop/gd/app/controller/UserController.java
  7. 6
      src/main/java/com/iflytop/gd/app/core/device/DeviceState.java
  8. 4
      src/main/java/com/iflytop/gd/app/core/device/HeatModuleState.java
  9. 1
      src/main/java/com/iflytop/gd/app/mapper/TaskStepsMapper.java
  10. 7
      src/main/java/com/iflytop/gd/app/mapper/TasksMapper.java
  11. 13
      src/main/java/com/iflytop/gd/app/model/dto/GetAllTasksDTO.java
  12. 13
      src/main/java/com/iflytop/gd/app/model/entity/Tasks.java
  13. 2
      src/main/java/com/iflytop/gd/app/model/vo/SetCraftsVO.java
  14. 35
      src/main/java/com/iflytop/gd/app/model/vo/TaskListVO.java
  15. 16
      src/main/java/com/iflytop/gd/app/model/vo/TaskStepsVO.java
  16. 29
      src/main/java/com/iflytop/gd/app/service/DeviceInitService.java
  17. 17
      src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java
  18. 34
      src/main/java/com/iflytop/gd/app/service/DeviceStateService.java
  19. 2
      src/main/java/com/iflytop/gd/app/service/OresService.java
  20. 8
      src/main/java/com/iflytop/gd/app/service/TaskStepsService.java
  21. 123
      src/main/java/com/iflytop/gd/app/service/TasksService.java
  22. 7
      src/main/java/com/iflytop/gd/app/service/UserService.java
  23. 4
      src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java
  24. 5
      src/main/java/com/iflytop/gd/hardware/controller/AcidPumpController.java
  25. 8
      src/main/java/com/iflytop/gd/hardware/controller/ServoController.java
  26. 23
      src/main/java/com/iflytop/gd/hardware/controller/StepMotorController.java
  27. 3
      src/main/resources/sql/init.sql

3
src/main/java/com/iflytop/gd/app/cmd/FanStartCommand.java

@ -4,6 +4,7 @@ import cn.hutool.json.JSONArray;
import com.iflytop.gd.app.core.BaseCommandHandler;
import com.iflytop.gd.app.model.dto.CmdDTO;
import com.iflytop.gd.app.service.DeviceCommandUtilService;
import com.iflytop.gd.app.service.DeviceStateService;
import com.iflytop.gd.common.annotation.CommandMapping;
import com.iflytop.gd.common.enums.HeatModuleCode;
import lombok.RequiredArgsConstructor;
@ -21,6 +22,7 @@ import java.util.concurrent.CompletableFuture;
@CommandMapping("fan_start")
public class FanStartCommand extends BaseCommandHandler {
private final DeviceCommandUtilService deviceCommandUtilService;
private final DeviceStateService deviceStateService;
@Override
public CompletableFuture<Void> handle(CmdDTO cmdDTO) {
@ -30,6 +32,7 @@ public class FanStartCommand extends BaseCommandHandler {
String heatId = heatIdJsonArray.getStr(i);
HeatModuleCode heatModuleId = HeatModuleCode.valueOf(heatId);
deviceCommandUtilService.fanStart(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleId);
deviceStateService.setHeatModuleStateFanOpen(heatModuleId, true);
}
});
}

3
src/main/java/com/iflytop/gd/app/cmd/FanStopCommand.java

@ -4,6 +4,7 @@ import cn.hutool.json.JSONArray;
import com.iflytop.gd.app.core.BaseCommandHandler;
import com.iflytop.gd.app.model.dto.CmdDTO;
import com.iflytop.gd.app.service.DeviceCommandUtilService;
import com.iflytop.gd.app.service.DeviceStateService;
import com.iflytop.gd.common.annotation.CommandMapping;
import com.iflytop.gd.common.enums.HeatModuleCode;
import lombok.RequiredArgsConstructor;
@ -21,6 +22,7 @@ import java.util.concurrent.CompletableFuture;
@CommandMapping("fan_stop")
public class FanStopCommand extends BaseCommandHandler {
private final DeviceCommandUtilService deviceCommandUtilService;
private final DeviceStateService deviceStateService;
@Override
public CompletableFuture<Void> handle(CmdDTO cmdDTO) {
@ -30,6 +32,7 @@ public class FanStopCommand extends BaseCommandHandler {
String heatId = heatIdJsonArray.getStr(i);
HeatModuleCode heatModuleId = HeatModuleCode.valueOf(heatId);
deviceCommandUtilService.fanClose(cmdDTO.getCommandId(), cmdDTO.getCommand(), heatModuleId);
deviceStateService.setHeatModuleStateFanOpen(heatModuleId, false);
}
});
}

8
src/main/java/com/iflytop/gd/app/controller/AuthController.java

@ -3,6 +3,7 @@ package com.iflytop.gd.app.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.iflytop.gd.app.model.dto.LoginDTO;
import com.iflytop.gd.app.model.entity.User;
import com.iflytop.gd.app.service.DeviceStateService;
import com.iflytop.gd.app.service.UserService;
import com.iflytop.gd.common.enums.data.Deleted;
import com.iflytop.gd.common.result.Result;
@ -27,13 +28,14 @@ import java.util.Objects;
public class AuthController {
private final UserService userService;
private final DeviceStateService deviceStateService;
@Operation(summary = "账号密码登录")
@PostMapping("/login")
public Result<User> login(@Valid @RequestBody LoginDTO loginDTO) {
User user = userService.getOne(new LambdaQueryWrapper<>(User.class).eq(User::getUsername, loginDTO.getUsername()));
if (user != null && !Objects.equals(user.getDeleted(), Deleted.ENABLE) && user.getPassword().equals(loginDTO.getPassword())) {
userService.setCurrentUser(user);
deviceStateService.setCurrentUser(user);
user.setPassword(null);
return Result.success(user);
}
@ -43,13 +45,13 @@ public class AuthController {
@Operation(summary = "用户登出")
@PostMapping("/logout")
public Result<String> logout() {
userService.clearCurrentUser();
deviceStateService.setCurrentUser(null);
return Result.success();
}
@Operation(summary = "获取当前登录用户")
@GetMapping("/current")
public Result<User> current() {
return Result.success(userService.getCurrentUser());
return Result.success(deviceStateService.getDeviceState().getCurrentUser());
}
}

42
src/main/java/com/iflytop/gd/app/controller/DeviceParamController.java

@ -12,8 +12,13 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
/**
@ -74,4 +79,41 @@ public class DeviceParamController {
return Result.failed();
}
@Operation(summary = "上传csv文件覆盖数据库配置")
@PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public Result<String> uploadFile(@RequestPart("file") MultipartFile file) {
//文件后缀检查
if (!file.getOriginalFilename().endsWith(".csv")) {
return Result.failed("<UNK>.csv<UNK>");
}
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(file.getInputStream(), StandardCharsets.UTF_8))) {
String line;
//是否含有表头
boolean isHeader = true;
List<DeviceParamConfig> deviceParamConfigList = new ArrayList<>();
while ((line = reader.readLine()) != null) {
if (isHeader) {
isHeader = false;
continue; // 跳过CSV文件的标题行
}
String[] data = line.split(",");
if (data.length >= 4) { // 假设CSV文件至少包含4列
DeviceParamConfig deviceParamConfig = new DeviceParamConfig();
deviceParamConfig.setId(Long.valueOf(data[0]));
deviceParamConfig.setMid(String.valueOf(data[1]));
deviceParamConfig.setRegIndex(String.valueOf(data[2]));
deviceParamConfig.setRegVal(Integer.valueOf(data[3]));
deviceParamConfigService.save(deviceParamConfig);
deviceParamConfigList.add(deviceParamConfig);
}
}
deviceParamConfigService.saveOrUpdateBatch(deviceParamConfigList);
} catch (IOException e) {
log.error("csv文件导入数据库失败:{}", e.getMessage());
throw new RuntimeException(e);
}
return Result.success();
}
}

46
src/main/java/com/iflytop/gd/app/controller/TasksController.java

@ -1,12 +1,13 @@
package com.iflytop.gd.app.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.iflytop.gd.app.model.dto.StopTaskDTO;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.iflytop.gd.app.model.dto.GetAllTasksDTO;
import com.iflytop.gd.app.model.dto.TaskDTO;
import com.iflytop.gd.app.model.entity.Tasks;
import com.iflytop.gd.app.model.vo.TaskListVO;
import com.iflytop.gd.app.model.vo.TaskStepsVO;
import com.iflytop.gd.app.service.TasksService;
import com.iflytop.gd.common.base.BasePageQuery;
import com.iflytop.gd.common.result.PageResult;
import com.iflytop.gd.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
@ -26,51 +27,48 @@ public class TasksController {
@Operation(summary = "实验列表")
@GetMapping("/list")
public PageResult<TaskListVO> getAllTasks(BasePageQuery pageQuery) {
IPage<TaskListVO> result = tasksService.getPage(pageQuery);
public PageResult<Tasks> list(GetAllTasksDTO getAllTasksDTO) {
IPage<Tasks> result = tasksService.page(new Page<>(getAllTasksDTO.getPageNum(), getAllTasksDTO.getPageSize()), new LambdaQueryWrapper<Tasks>().like(Tasks::getName, "%" + getAllTasksDTO.getName() + "%"));
return PageResult.success(result);
}
@Operation(summary = "实验详情")
@GetMapping("/{id}")
public Result<TaskListVO> detail(@PathVariable Long id) {
return Result.success(tasksService.selectById(id));
public Result<TaskStepsVO> detail(@PathVariable Long id) {
return Result.success(tasksService.detail(id));
}
@Operation(summary = "获取正在进行的实验")
@GetMapping("/getIngTask")
public Result<Tasks> getIngTask() {
return Result.success(tasksService.getIngTask());
@GetMapping("/current")
public Result<Tasks> getCurrent() {
return Result.success(tasksService.getCurrent());
}
@Operation(summary = "添加新实验")
@Operation(summary = "开始新实验")
@PostMapping("/")
public Result<Tasks> addTask(@RequestBody TaskDTO dto) {
if (tasksService.getIngTask() != null) {
public Result<Tasks> start(@RequestBody TaskDTO dto) {
if (tasksService.getCurrent() != null) {
return Result.failed("存在正在运行的实验,请先停止");
}
return Result.success(tasksService.addTask(dto.getName()));
return Result.success(tasksService.start(dto.getName()));
}
@Operation(summary = "更新实验")
@PutMapping("/")
public Result<Boolean> updateTask(@RequestBody Tasks task) {
public Result<?> updateTask(@RequestBody Tasks task) {
return Result.success(tasksService.updateById(task));
}
@Operation(summary = "删除实验")
@DeleteMapping("/{ids}")
public Result<Integer> deleteTask(@Parameter(description = "实验ID,多个以英文逗号(,)分割") @PathVariable String ids) {
return Result.success(tasksService.removeByIds(ids));
public Result<?> deleteTask(@Parameter(description = "ID,多个以英文逗号(,)分割") @PathVariable String ids) {
return Result.success(tasksService.deleteTasks(ids));
}
@Operation(summary = "停止实验")
@Operation(summary = "停止当前实验")
@PostMapping("/stop")
public Result<Integer> stopTask(@RequestBody StopTaskDTO dto) {
if (dto.getTaskId() != null) {
return Result.success(tasksService.stopTask(dto.getTaskId()));
}
return Result.failed("停止实验失败");
public Result<Integer> stop() {
tasksService.stop();
return Result.success();
}
}

1
src/main/java/com/iflytop/gd/app/controller/UserController.java

@ -3,7 +3,6 @@ package com.iflytop.gd.app.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.iflytop.gd.app.model.entity.Ores;
import com.iflytop.gd.app.model.entity.User;
import com.iflytop.gd.app.service.UserService;
import com.iflytop.gd.common.base.BasePageQuery;

6
src/main/java/com/iflytop/gd/app/core/device/DeviceState.java

@ -1,5 +1,7 @@
package com.iflytop.gd.app.core.device;
import com.iflytop.gd.app.model.entity.Tasks;
import com.iflytop.gd.app.model.entity.User;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -27,4 +29,8 @@ public class DeviceState {
private boolean selfTest = false;
@Schema(description = "是否是急停状态,true为急停")
private boolean emergencyStop = false;
@Schema(description = "当前登录用户")
private User currentUser;
@Schema(description = "当前实验")
private Tasks currentTasks;
}

4
src/main/java/com/iflytop/gd/app/core/device/HeatModuleState.java

@ -26,10 +26,10 @@ public class HeatModuleState {
private boolean capExist = false;
@Schema(description = "加热器目标温度")
private double targetTemperature = 0.0;
private Double targetTemperature = null;
@Schema(description = "加热器当前温度")
private double temperature = 0.0;
private Double temperature = null;
public HeatModuleState(HeatModuleCode moduleCode) {
this.moduleCode = moduleCode;

1
src/main/java/com/iflytop/gd/app/mapper/TaskStepsMapper.java

@ -11,5 +11,4 @@ import java.util.List;
*/
@Mapper
public interface TaskStepsMapper extends BaseMapper<TaskSteps> {
List<TaskSteps> getTaskStepsByTaskId(Long taskId);
}

7
src/main/java/com/iflytop/gd/app/mapper/TasksMapper.java

@ -3,7 +3,6 @@ package com.iflytop.gd.app.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.iflytop.gd.app.model.entity.Tasks;
import com.iflytop.gd.app.model.vo.TaskListVO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@ -13,11 +12,5 @@ import java.util.List;
*/
@Mapper
public interface TasksMapper extends BaseMapper<Tasks> {
Page<TaskListVO> selectPage(Page<TaskListVO> page);
TaskListVO selectById(Long id);
Integer removeByIds(List<Long> ids);
int stopTask(Long taskId);
}

13
src/main/java/com/iflytop/gd/app/model/dto/GetAllTasksDTO.java

@ -0,0 +1,13 @@
package com.iflytop.gd.app.model.dto;
import com.iflytop.gd.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = true)
@Data
public class GetAllTasksDTO extends BasePageQuery {
@Schema(description = "实验名称")
private String name;
}

13
src/main/java/com/iflytop/gd/app/model/entity/Tasks.java

@ -1,12 +1,15 @@
package com.iflytop.gd.app.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.iflytop.gd.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
@EqualsAndHashCode(callSuper = true)
@Schema(description = "实验")
@TableName("tasks")
@ -19,14 +22,16 @@ public class Tasks extends BaseEntity {
@NotBlank
@Schema(description = "开始时间")
private String startTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
@Schema(description = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
@Schema(description = "创建人")
private Long createUser;
@Schema(description = "结束时间")
private String endTime;
@Schema(description = "状态 1 执行中 2 执行完毕")
private Integer status;

2
src/main/java/com/iflytop/gd/app/model/vo/SetCraftsVO.java

@ -10,11 +10,13 @@ public class SetCraftsVO {
@Schema(description = "工艺名称")
private String craftsName;
@Schema(description = "工艺名称")
private Long craftsId;
@Schema(description = "矿石名称")
private String oresName;
@Schema(description = "矿石ID")
private Long oresId;
}

35
src/main/java/com/iflytop/gd/app/model/vo/TaskListVO.java

@ -1,35 +0,0 @@
package com.iflytop.gd.app.model.vo;
import com.iflytop.gd.app.model.entity.TaskSteps;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = false)
@Data
public class TaskListVO {
@Schema(description = "实验id")
private Long id;
@Schema(description = "实验名称")
private String name;
@NotBlank
@Schema(description = "开始时间")
private String startTime;
@Schema(description = "创建人")
private Long createUser;
@Schema(description = "结束时间")
private String endTime;
@Schema(description = "状态 1 执行中 2 执行完毕")
private Integer status;
@Schema(description = "实验步骤")
private List<TaskSteps> steps;
}

16
src/main/java/com/iflytop/gd/app/model/vo/TaskStepsVO.java

@ -0,0 +1,16 @@
package com.iflytop.gd.app.model.vo;
import com.iflytop.gd.app.model.entity.TaskSteps;
import com.iflytop.gd.app.model.entity.Tasks;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
@EqualsAndHashCode(callSuper = false)
@Data
public class TaskStepsVO extends Tasks {
@Schema(description = "实验步骤")
private List<TaskSteps> steps;
}

29
src/main/java/com/iflytop/gd/app/service/DeviceInitService.java

@ -5,6 +5,7 @@ import com.iflytop.gd.app.core.device.HeatModuleState;
import com.iflytop.gd.app.core.device.SolutionContainerState;
import com.iflytop.gd.app.model.bo.DeviceInitializationData;
import com.iflytop.gd.app.model.entity.Container;
import com.iflytop.gd.app.model.entity.DeviceParamConfig;
import com.iflytop.gd.common.enums.ContainerCode;
import com.iflytop.gd.common.enums.ContainerType;
import com.iflytop.gd.common.enums.HeatModuleCode;
@ -50,6 +51,7 @@ public class DeviceInitService {
private final LeisaiServoDriver leisaiServoDriver;
private final ActionOvertimeConstant actionOvertimeConstant;
private final OutputIOCtrlDriver outputIOCtrlDriver;
private final DeviceParamConfigService deviceParamConfigService;
@PostConstruct
public void init() {
@ -86,7 +88,7 @@ public class DeviceInitService {
/**
* 设置各动作超时时间
*/
public void initOvertime(){
public void initOvertime() {
actionOvertimeConstant.pushNewConfig(StepMotorMId.DOOR_MOTOR_MID, CmdId.step_motor_easy_move_to_zero, 90 * 1000);
actionOvertimeConstant.pushNewConfig(LeisaiServoMId.MainXSV, CmdId.step_motor_easy_move_to_zero, 300 * 1000);
actionOvertimeConstant.pushNewConfig(LeisaiServoMId.MainYSV, CmdId.step_motor_easy_move_to_zero, 120 * 1000);
@ -129,30 +131,25 @@ public class DeviceInitService {
if (deviceStateService.getDeviceState().isVirtual() || deviceStateService.getDeviceState().isInitComplete()) {
return;
}
try {
// 使用 ClassPathResource 来从类路径加载 CSV 文件并使用 InputStream 读取
ClassPathResource resource = new ClassPathResource("init/zapp_sub_module_reg_initial_value.csv");
try (CSVReader reader = new CSVReader(new InputStreamReader(resource.getInputStream()))) {
reader.readNext(); // 跳过表头
String[] line;
while ((line = reader.readNext()) != null) {
//从数据库中读取数据通过串口进行数据初始化
List<DeviceParamConfig> deviceParamConfigs = deviceParamConfigService.list();
for (DeviceParamConfig deviceParamConfig : deviceParamConfigs) {
DeviceInitializationData data = new DeviceInitializationData();
data.setId(Integer.parseInt(line[0]));
data.setMid(line[1]);
data.setRegIndex(line[2]);
data.setRegInitVal(Integer.parseInt(line[3]));
data.setId(Math.toIntExact(deviceParamConfig.getId()));
data.setMid(deviceParamConfig.getMid());
data.setRegIndex(deviceParamConfig.getRegIndex());
data.setRegInitVal(deviceParamConfig.getRegVal());
try {
sendToDevice(data);
}
}
} catch (Exception e) {
log.error("设备初始化写入参数失败,2秒后重试", e);
// 如果发生错误可以递归调用重试如果需要
Thread.sleep(2000);
initDeviceSetData();
}
}
}
public void sendToDevice(DeviceInitializationData data) throws Exception {
canBusService.moduleSetReg(MId.valueOf(data.getMid()), RegIndex.valueOf(data.getRegIndex()), data.getRegInitVal());
}

17
src/main/java/com/iflytop/gd/app/service/DeviceParamConfigService.java

@ -1,6 +1,7 @@
package com.iflytop.gd.app.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iflytop.gd.app.mapper.DeviceParamConfigMapper;
import com.iflytop.gd.app.model.entity.DeviceParamConfig;
@ -67,6 +68,22 @@ public class DeviceParamConfigService extends ServiceImpl<DeviceParamConfigMappe
}
/**
* 根据模块标识和寄存器索引设置设备参数配置
*
* @param moduleId 模块枚举
* @param regIndex 寄存器索引
* @param regVal 寄存器值
* @return 唯一匹配的 DeviceParamConfig找不到返回 null
*/
public int setModuleAndReg(String moduleId, String regIndex, Integer regVal) {
return deviceParamConfigMapper.update(new LambdaUpdateWrapper<DeviceParamConfig>()
.eq(DeviceParamConfig::getMid, moduleId)
.eq(DeviceParamConfig::getRegIndex, regIndex)
.set(DeviceParamConfig::getRegVal, regVal));
}
/**
* 列出所有 ModuleId返回 VO 列表
*
* @return List<ModuleIdVO>

34
src/main/java/com/iflytop/gd/app/service/DeviceStateService.java

@ -2,6 +2,8 @@ package com.iflytop.gd.app.service;
import com.iflytop.gd.app.core.device.*;
import com.iflytop.gd.app.core.listener.DeviceStateListener;
import com.iflytop.gd.app.model.entity.Tasks;
import com.iflytop.gd.app.model.entity.User;
import com.iflytop.gd.common.enums.ContainerCode;
import com.iflytop.gd.common.enums.HeatModuleCode;
import lombok.RequiredArgsConstructor;
@ -139,6 +141,20 @@ public class DeviceStateService {
support.firePropertyChange("setHeatModuleStateHeating", oldValue, heating);
}
public synchronized void setHeatModuleStateFanOpen(HeatModuleCode heatModuleId, boolean fanOpen) {
HeatModuleState heatModuleState = null;
for (HeatModuleState t : deviceState.getHeatModule()) {
if (heatModuleId.equals(t.getModuleCode())) {
heatModuleState = t;
break;
}
}
assert heatModuleState != null;
boolean oldValue = heatModuleState.isFanOpen();
heatModuleState.setFanOpen(fanOpen);
support.firePropertyChange("setHeatModuleStateFanOpen", oldValue, fanOpen);
}
public synchronized void setHeatModuleStateCapExist(HeatModuleCode heatModuleId, boolean capStatus) {
HeatModuleState heatModuleState = null;
for (HeatModuleState t : deviceState.getHeatModule()) {
@ -162,7 +178,7 @@ public class DeviceStateService {
}
}
assert heatModuleState != null;
double oldValue = heatModuleState.getTargetTemperature();
Double oldValue = heatModuleState.getTargetTemperature();
heatModuleState.setTargetTemperature(targetTemperature);
support.firePropertyChange("setHeatModuleStateTargetTemperature", oldValue, targetTemperature);
}
@ -176,7 +192,7 @@ public class DeviceStateService {
}
}
assert heatModuleState != null;
double oldValue = heatModuleState.getTemperature();
Double oldValue = heatModuleState.getTemperature();
heatModuleState.setTemperature(temperature);
support.firePropertyChange("setHeatModuleStateTemperature", oldValue, temperature);
}
@ -320,4 +336,18 @@ public class DeviceStateService {
support.firePropertyChange("setTubeStateAddSolution", oldValue, addSolution);
}
public synchronized void setCurrentUser(User currentUser) {
User oldValue = deviceState.getCurrentUser();
deviceState.setCurrentUser(currentUser);
support.firePropertyChange("setCurrentUser", oldValue, currentUser);
}
public synchronized void setCurrentTasks(Tasks currentTasks) {
User oldValue = deviceState.getCurrentUser();
deviceState.setCurrentTasks(currentTasks);
support.firePropertyChange("setCurrentTasks", oldValue, currentTasks);
}
}

2
src/main/java/com/iflytop/gd/app/service/OresService.java

@ -34,7 +34,7 @@ public class OresService extends ServiceImpl<OresMapper, Ores> {
Page<Ores> oresPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
// 分页查询矿石数据
IPage<Ores> oresIPage = this.baseMapper.selectPage(oresPage, new QueryWrapper<Ores>());
IPage<Ores> oresIPage = this.baseMapper.selectPage(oresPage, new QueryWrapper<>());
// 获取矿石ID列表
List<Long> oresIds = oresIPage.getRecords().stream()

8
src/main/java/com/iflytop/gd/app/service/TaskStepsService.java

@ -14,13 +14,5 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class TaskStepsService extends ServiceImpl<TaskStepsMapper, TaskSteps> {
private final TaskStepsMapper taskStepsMapper;
public List<TaskSteps> getTaskStepsByTaskId(Long taskId) {
return taskStepsMapper.getTaskStepsByTaskId(taskId);
}
public int addTaskSteps(TaskSteps taskSteps) {
return this.baseMapper.insert(taskSteps);
}
}

123
src/main/java/com/iflytop/gd/app/service/TasksService.java

@ -1,22 +1,18 @@
package com.iflytop.gd.app.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iflytop.gd.app.mapper.TaskStepsMapper;
import com.iflytop.gd.app.mapper.TasksMapper;
import com.iflytop.gd.app.model.entity.TaskSteps;
import com.iflytop.gd.app.model.entity.Tasks;
import com.iflytop.gd.app.model.entity.User;
import com.iflytop.gd.app.model.vo.TaskListVO;
import com.iflytop.gd.common.base.BasePageQuery;
import com.iflytop.gd.app.model.vo.TaskStepsVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -25,95 +21,64 @@ import java.util.stream.Collectors;
@Service
@RequiredArgsConstructor
public class TasksService extends ServiceImpl<TasksMapper, Tasks> {
private final TasksMapper tasksMapper;
private final UserService userService;
private final TaskStepsMapper taskStepsMapper;
private final TaskStepsService taskStepsService;
public IPage<TaskListVO> getPage(BasePageQuery pageQuery) {
// 构建分页对象
Page<TaskListVO> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
IPage<TaskListVO> tasksIPage = tasksMapper.selectPage(page);
List<Long> taskIds = tasksIPage.getRecords().stream()
.map(TaskListVO::getId)
.toList();
QueryWrapper<TaskSteps> queryWrapper = new QueryWrapper<>();
queryWrapper.in("task_id", taskIds);
List<TaskSteps> list = taskStepsMapper.selectList(queryWrapper);
Map<Long, List<TaskSteps>> map = list.stream()
.collect(Collectors.groupingBy(TaskSteps::getTaskId));
List<TaskListVO> taskList = tasksIPage.getRecords().stream().map(task -> {
TaskListVO taskListVO = new TaskListVO();
taskListVO.setId(task.getId());
taskListVO.setName(task.getName());
taskListVO.setStatus(task.getStatus());
taskListVO.setStartTime(task.getStartTime());
taskListVO.setEndTime(task.getEndTime());
taskListVO.setCreateUser(task.getCreateUser());
List<TaskSteps> steps = map.get(task.getId());
taskListVO.setSteps(steps);
return taskListVO;
}).collect(Collectors.toList());
Page<TaskListVO> resultPage = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
resultPage.setTotal(tasksIPage.getTotal());
resultPage.setRecords(taskList);
return resultPage;
private final DeviceStateService deviceStateService;
public TaskStepsVO detail(Long id) {
Tasks tasks = this.getById(id);
List<TaskSteps> taskSteps = taskStepsService.list(new LambdaQueryWrapper<>(TaskSteps.class).eq(TaskSteps::getTaskId, id));
TaskStepsVO taskStepsVO = new TaskStepsVO();
taskStepsVO.setId(tasks.getId());
taskStepsVO.setName(tasks.getName());
taskStepsVO.setStartTime(tasks.getStartTime());
taskStepsVO.setEndTime(tasks.getEndTime());
taskStepsVO.setCreateUser(tasks.getCreateUser());
taskStepsVO.setStatus(tasks.getStatus());
taskStepsVO.setIsDeleted(tasks.getIsDeleted());
taskStepsVO.setSteps(taskSteps);
return taskStepsVO;
}
public TaskListVO selectById(Long id) {
TaskListVO taskListVO = tasksMapper.selectById(id);
List<TaskSteps> taskSteps = taskStepsMapper.selectList(new QueryWrapper<TaskSteps>().eq("task_id", id));
taskListVO.setSteps(taskSteps);
return taskListVO;
}
public Tasks addTask(String taskName) {
public Tasks start(String taskName) {
Tasks tasks = new Tasks();
tasks.setName(taskName);
User user = userService.getCurrentUser();
tasks.setCreateUser(user.getId());
tasks.setCreateUser(deviceStateService.getDeviceState().getCurrentUser().getId());
tasks.setStatus(1);
tasks.setIsDeleted(0);
tasksMapper.insert(tasks);
tasks.setStartTime(LocalDateTime.now());
this.save(tasks);
TaskSteps taskSteps = new TaskSteps();
taskSteps.setTaskId(tasks.getId());
taskSteps.setStepDescription("开始实验");
taskStepsService.addTaskSteps(taskSteps);
taskStepsService.save(taskSteps);
deviceStateService.setCurrentTasks(tasks);
return tasks;
}
public Tasks getIngTask() {
return tasksMapper.selectOne(new QueryWrapper<Tasks>().eq("status", 1));
public Tasks getCurrent() {
return deviceStateService.getDeviceState().getCurrentTasks();
}
public int removeByIds(String ids) {
List<Long> idsArr = Arrays.stream(ids.split(","))
public boolean deleteTasks(String idsStr) {
List<Long> ids = Arrays.stream(idsStr.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
return tasksMapper.removeByIds(idsArr);
.toList();
for (Long id : ids) {
List<TaskSteps> taskSteps = taskStepsService.list(new LambdaQueryWrapper<>(TaskSteps.class).eq(TaskSteps::getTaskId, id));
taskStepsService.removeByIds(taskSteps.stream().map(TaskSteps::getId).collect(Collectors.toList()));
this.removeById(id);
}
return true;
}
public int stopTask(Long taskId) {
TaskSteps taskSteps = new TaskSteps();
taskSteps.setTaskId(taskId);
taskSteps.setStepDescription("结束实验");
taskStepsService.addTaskSteps(taskSteps);
return tasksMapper.stopTask(taskId);
public void stop() {
Tasks tasks = deviceStateService.getDeviceState().getCurrentTasks();
if (tasks != null) {
tasks.setStatus(2);
tasks.setEndTime(LocalDateTime.now());
this.updateById(tasks);
deviceStateService.setCurrentTasks(null);
}
}
}

7
src/main/java/com/iflytop/gd/app/service/UserService.java

@ -1,6 +1,7 @@
package com.iflytop.gd.app.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.iflytop.gd.app.core.device.DeviceState;
import com.iflytop.gd.app.mapper.UserMapper;
import com.iflytop.gd.app.model.entity.User;
import com.iflytop.gd.common.enums.data.Deleted;
@ -19,9 +20,6 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class UserService extends ServiceImpl<UserMapper, User> {
@Getter
@Setter
private User currentUser;
public boolean deleteUser(String idsStr) {
List<Long> ids = Arrays.stream(idsStr.split(","))
@ -37,7 +35,4 @@ public class UserService extends ServiceImpl<UserMapper, User> {
return true;
}
public void clearCurrentUser() {
currentUser = null;
}
}

4
src/main/java/com/iflytop/gd/common/enums/data/DevicePositionCode.java

@ -8,6 +8,10 @@ import lombok.Getter;
@Getter
public enum DevicePositionCode {
/**
* 预充防滴落距离
*/
antiDripDistance(DevicePositionType.DISTANCE, "预充防滴落距离"),
/**
* 试管间距距离
*/
testTubeSpacing(DevicePositionType.DISTANCE, "试管间距距离"),

5
src/main/java/com/iflytop/gd/hardware/controller/AcidPumpController.java

@ -1,7 +1,10 @@
package com.iflytop.gd.hardware.controller;
import com.iflytop.gd.app.service.DeviceParamConfigService;
import com.iflytop.gd.hardware.drivers.StepMotorDriver.AcidPumpDriver;
import com.iflytop.gd.hardware.type.Servo.MiniServoRegIndex;
import com.iflytop.gd.hardware.type.StepMotor.StepMotorMId;
import com.iflytop.gd.hardware.type.StepMotor.StepMotorRegIndex;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -17,12 +20,14 @@ import org.springframework.web.bind.annotation.RestController;
@Slf4j
public class AcidPumpController {
private final AcidPumpDriver driver;
private final DeviceParamConfigService deviceParamConfigService;
@PostMapping("/set-speed")
public void setSpeed(@RequestParam StepMotorMId stepMotorMId, @RequestParam int speed) {
log.info("Setting acid pump speed to: {}", speed);
try {
driver.setSpeed(stepMotorMId, speed);
deviceParamConfigService.setModuleAndReg(stepMotorMId.mid.name(), StepMotorRegIndex.kreg_step_motor_default_velocity.regIndex.name(),speed);
} catch (Exception e) {
log.error("Failed to set speed for acid pump: {}", e.getMessage());
}

8
src/main/java/com/iflytop/gd/hardware/controller/ServoController.java

@ -1,10 +1,12 @@
package com.iflytop.gd.hardware.controller;
import com.iflytop.gd.app.service.DeviceParamConfigService;
import com.iflytop.gd.common.result.Result;
import com.iflytop.gd.hardware.type.Servo.DeviceServoId;
import com.iflytop.gd.hardware.type.Servo.MiniServoRegIndex;
import com.iflytop.gd.hardware.exception.HardwareException;
import com.iflytop.gd.hardware.service.ServoService;
import com.iflytop.gd.hardware.type.StepMotor.StepMotorRegIndex;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
@ -23,6 +25,7 @@ import java.util.Map;
@Slf4j
public class ServoController {
private final ServoService servoService;
private final DeviceParamConfigService deviceParamConfigService;
// 获取设备列表
@PostMapping("/get-device-list")
@ -88,7 +91,6 @@ public class ServoController {
servoService.rotate(deviceId, 0);
return Result.success();
}
@PostMapping("/rotate-with-torque")
@Operation(summary = "旋转(力矩)")
public Result<?> rotateWithTorque(@RequestParam DeviceServoId deviceId, @RequestParam Integer pos) throws HardwareException {
@ -110,6 +112,7 @@ public class ServoController {
@RequestParam DeviceServoId deviceId,
@RequestParam Integer val) throws HardwareException {
servoService.setLimitVelocity(deviceId, val);
deviceParamConfigService.setModuleAndReg(deviceId.getServoMId().mid.name(), MiniServoRegIndex.kreg_mini_servo_limit_velocity.regIndex.name(),val);
return Result.success();
}
@ -119,6 +122,7 @@ public class ServoController {
@RequestParam DeviceServoId deviceId,
@RequestParam Integer val) throws HardwareException {
servoService.setLimitTorque(deviceId, val);
deviceParamConfigService.setModuleAndReg(deviceId.getServoMId().mid.name(), MiniServoRegIndex.kreg_mini_servo_limit_torque.regIndex.name(),val);
return Result.success();
}
@ -128,6 +132,7 @@ public class ServoController {
@RequestParam DeviceServoId deviceId,
@RequestParam Integer val) throws HardwareException {
servoService.setProtectiveTorque(deviceId, val);
deviceParamConfigService.setModuleAndReg(deviceId.getServoMId().mid.name(), MiniServoRegIndex.kreg_mini_servo_protective_torque.regIndex.name(),val);
return Result.success();
}
@ -138,6 +143,7 @@ public class ServoController {
@RequestParam MiniServoRegIndex reg,
@RequestParam Integer val) throws HardwareException {
servoService.setReg(deviceId, reg, val);
deviceParamConfigService.setModuleAndReg(deviceId.getServoMId().mid.name(), reg.regIndex.name(),val);
return Result.success();
}

23
src/main/java/com/iflytop/gd/hardware/controller/StepMotorController.java

@ -1,5 +1,6 @@
package com.iflytop.gd.hardware.controller;
import com.iflytop.gd.app.service.DeviceParamConfigService;
import com.iflytop.gd.common.result.Result;
import com.iflytop.gd.hardware.exception.HardwareException;
import com.iflytop.gd.hardware.service.StepMotorService;
@ -24,6 +25,7 @@ import java.util.Map;
@Slf4j
public class StepMotorController {
private final StepMotorService stepMotorService;
private final DeviceParamConfigService deviceParamConfigService;
// 获取设备列表
@PostMapping("/get-device-list")
@ -142,6 +144,7 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer mres) throws HardwareException {
stepMotorService.setMres(deviceId, mres);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_mres.regIndex.name(),mres);
return Result.success();
}
@ -151,6 +154,7 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer irun) throws HardwareException {
stepMotorService.setIRUN(deviceId, irun);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_irun.regIndex.name(),irun);
return Result.success();
}
@ -160,6 +164,7 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer ihold) throws HardwareException {
stepMotorService.setIHOLD(deviceId, ihold);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_ihold.regIndex.name(),ihold);
return Result.success();
}
@ -169,6 +174,10 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer v) throws HardwareException {
stepMotorService.setStartAndStopVel(deviceId, v);
//开始速度参数保存到数据库
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_vstart.regIndex.name(),v);
//停止速度参数保存到数据库
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_vstop.regIndex.name(),v);
return Result.success();
}
@ -178,6 +187,8 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer v) throws HardwareException {
stepMotorService.setV1(deviceId, v);
//参数保存到数据库
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_v1.regIndex.name(),v);
return Result.success();
}
@ -187,6 +198,8 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer acc) throws HardwareException {
stepMotorService.setA1AndD1(deviceId, acc);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_a1.regIndex.name(),acc);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_d1.regIndex.name(),acc);
return Result.success();
}
@ -196,6 +209,8 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer acc) throws HardwareException {
stepMotorService.setAmaxAndDmax(deviceId, acc);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_amax.regIndex.name(),acc);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_dmax.regIndex.name(),acc);
return Result.success();
}
@ -205,6 +220,7 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer v) throws HardwareException {
stepMotorService.setDefaultVel(deviceId, v);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_default_velocity.regIndex.name(),v);
return Result.success();
}
@ -216,6 +232,9 @@ public class StepMotorController {
@RequestParam Integer mid,
@RequestParam Integer high) throws HardwareException {
stepMotorService.setSpeed(deviceId, low, mid, high);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_low_velocity.regIndex.name(),low);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_mid_velocity.regIndex.name(),mid);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_high_velocity.regIndex.name(),high);
return Result.success();
}
@ -226,6 +245,8 @@ public class StepMotorController {
@RequestParam Integer pulse,
@RequestParam Integer denominator) throws HardwareException {
stepMotorService.setOneCirclePulse(deviceId, pulse, denominator);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_one_circle_pulse.regIndex.name(),pulse);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_one_circle_pulse_denominator.regIndex.name(),denominator);
return Result.success();
}
@ -235,6 +256,7 @@ public class StepMotorController {
@RequestParam DeviceStepMotorId deviceId,
@RequestParam Integer dzero) throws HardwareException {
stepMotorService.setDZero(deviceId, dzero);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),StepMotorRegIndex.kreg_step_motor_dzero_pos.regIndex.name(),dzero);
return Result.success();
}
@ -253,6 +275,7 @@ public class StepMotorController {
@RequestParam StepMotorRegIndex reg,
@RequestParam Integer val) throws HardwareException {
stepMotorService.setReg(deviceId, reg, val);
deviceParamConfigService.setModuleAndReg(deviceId.getStepMotorMId().mid.name(),reg.regIndex.name(),val);
return Result.success();
}

3
src/main/resources/sql/init.sql

@ -48,6 +48,7 @@ CREATE TABLE IF NOT EXISTS container
pump_id TEXT,
capacity_total INTEGER,
capacity_used INTEGER,
filled REAL,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
@ -153,7 +154,7 @@ CREATE TABLE IF NOT EXISTS task_steps
CREATE TABLE IF NOT EXISTS device_param_config
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
m_id text,
mid text,
reg_index text,
reg_val INTEGER,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

Loading…
Cancel
Save