Browse Source

feat: 新增指令接口/工艺/基质/日志

master
guoapeng 5 months ago
parent
commit
c30bb8eeb6
  1. BIN
      matrix-spray.db
  2. 31
      sql/init.sql
  3. 3
      src/main/java/com/qyft/ms/app/common/generator/PathGenerator.java
  4. 245
      src/main/java/com/qyft/ms/app/controller/CMDController.java
  5. 55
      src/main/java/com/qyft/ms/app/controller/LogsController.java
  6. 56
      src/main/java/com/qyft/ms/app/controller/MatrixController.java
  7. 72
      src/main/java/com/qyft/ms/app/controller/MatrixCraftController.java
  8. 66
      src/main/java/com/qyft/ms/app/controller/OperationLogController.java
  9. 34
      src/main/java/com/qyft/ms/app/controller/SysSettingsController.java
  10. 18
      src/main/java/com/qyft/ms/app/mapper/MatrixCraftMapper.java
  11. 6
      src/main/java/com/qyft/ms/app/mapper/MatrixMapper.java
  12. 13
      src/main/java/com/qyft/ms/app/mapper/OperationLogMapper.java
  13. 5
      src/main/java/com/qyft/ms/app/mapper/SysSettingsMapper.java
  14. 42
      src/main/java/com/qyft/ms/app/model/dto/MatrixCraftDTO.java
  15. 19
      src/main/java/com/qyft/ms/app/model/entity/Matrix.java
  16. 58
      src/main/java/com/qyft/ms/app/model/entity/MatrixCraft.java
  17. 24
      src/main/java/com/qyft/ms/app/model/entity/OperationLog.java
  18. 8
      src/main/java/com/qyft/ms/app/model/entity/SysSettings.java
  19. 7
      src/main/java/com/qyft/ms/app/model/form/CMDForm.java
  20. 19
      src/main/java/com/qyft/ms/app/model/vo/SysSettingVO.java
  21. 263
      src/main/java/com/qyft/ms/app/service/CMDService.java
  22. 11
      src/main/java/com/qyft/ms/app/service/ILogsService.java
  23. 7
      src/main/java/com/qyft/ms/app/service/ISysSettingsService.java
  24. 25
      src/main/java/com/qyft/ms/app/service/MatrixCraftService.java
  25. 14
      src/main/java/com/qyft/ms/app/service/MatrixService.java
  26. 22
      src/main/java/com/qyft/ms/app/service/OperationLogService.java
  27. 3
      src/main/java/com/qyft/ms/app/service/StatusService.java
  28. 29
      src/main/java/com/qyft/ms/app/service/impl/ILogsServiceImpl.java
  29. 51
      src/main/java/com/qyft/ms/app/service/impl/ISysSettingsServiceImpl.java
  30. 49
      src/main/java/com/qyft/ms/app/service/impl/MatrixCraftServiceImpl.java
  31. 40
      src/main/java/com/qyft/ms/app/service/impl/MatrixServiceImpl.java
  32. 59
      src/main/java/com/qyft/ms/app/service/impl/OperationLogServiceImpl.java
  33. 1
      src/main/java/com/qyft/ms/device/common/constant/DeviceCommands.java
  34. 37
      src/main/java/com/qyft/ms/device/model/bo/DeviceStatus.java
  35. 15
      src/main/java/com/qyft/ms/device/service/DeviceTcpCMDService.java
  36. 2
      src/main/resources/application.yml
  37. 30
      src/main/resources/mapper/SysSettingsMapper.xml
  38. 14
      src/main/resources/mapper/app/MatrixCraftMapper.xml
  39. 12
      src/main/resources/mapper/app/OperationLogMapper.xml
  40. 4
      src/main/resources/mapper/app/SysSettingsMapper.xml

BIN
matrix-spray.db

31
sql/init.sql

@ -50,7 +50,7 @@ CREATE TABLE IF NOT EXISTS matrix_craft
name TEXT NOT NULL,
matrix_id INTEGER NOT NULL,
route_type INTEGER,
z_height INTEGER,
height INTEGER,
nitrogen_flow_velocity INTEGER,
nitrogen_air_pressure INTEGER,
matrix_flow_velocity INTEGER,
@ -62,21 +62,11 @@ CREATE TABLE IF NOT EXISTS matrix_craft
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建 syringe 注射器表
CREATE TABLE IF NOT EXISTS syringe
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
flow_rate INTEGER,
fluid_volume INTEGER,
run_time INTEGER,
cycle_intervals INTEGER
);
-- 创建 operation_log 操作记录表
CREATE TABLE IF NOT EXISTS operation_log
(
id INTEGER PRIMARY KEY AUTOINCREMENT,
matrix_craft_id INTEGER,
matrix_id INTEGER,
matrix_info TEXT,
status INTEGER,
create_user INTEGER,
@ -93,3 +83,20 @@ CREATE TABLE IF NOT EXISTS sys_settings
code TEXT,
value TEXT
);
-- 插入 sys_settings 表数据
INSERT INTO sys_settings (id, parent_id, name, code, value)
VALUES (1, NULL, '玻片位置', 'slide_position', NULL),
(2, 1, '玻片1位置', 'slide_position1', '1,2,3'),
(3, 1, '玻片2位置', 'slide_position2', '1,2,3'),
(4, 1, '玻片3位置', 'slide_position3', '1,2,3'),
(5, 1, '玻片4位置', 'slide_position4', '1,2,3'),
(6, NULL, '电机电流', 'current', NULL),
(7, 6, 'x轴电流', 'x_current', 2),
(8, 6, 'y轴电流', 'y_current', 3),
(9, 6, 'z轴电流', 'z_current', 4),
(10, NULL, '电机运行速度', 'speed', NULL),
(11, 10, 'x轴速度', 'x_speed', 10),
(12, 10, 'y轴速度', 'y_speed', 10),
(13, 10, 'z轴速度', 'z_speed', 10);

3
src/main/java/com/qyft/ms/app/common/generator/PathGenerator.java

@ -49,7 +49,8 @@ public class PathGenerator {
) {
// 基本校验
if (left >= right || bottom >= top) {
throw new IllegalArgumentException("无效矩形边界: left>=right 或 bottom>=top");
throw new IllegalArgumentException("无效矩形边界: left>=right 或 bottom>=top" + left + ", " + right + " ," + bottom + ", " + top);
}
if (spacing <= 0) {
throw new IllegalArgumentException("spacing必须>0");

245
src/main/java/com/qyft/ms/app/controller/CMDController.java

@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
@ -24,16 +25,250 @@ public class CMDController {
private final CMDService cmdService;
@Operation(summary = "执行指令")
@PostMapping("/execute")
public Result<String> execute(@RequestBody CMDForm cmdForm) {
@Operation(summary = "控制电机")
@PostMapping("/moveMotorToPosition")
public Result<String> moveMotorToPosition(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("moveMotorToPosition");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.moveMotorToPosition(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "三通阀切换")
@PostMapping("/switchThreeWayValve")
public Result<String> switchThreeWayValve(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("switchThreeWayValve");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.switchThreeWayValve(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "除湿阀、清洗阀、喷嘴阀控制")
@PostMapping("/controlValve")
public Result<String> controlValve(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("controlValve");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.controlValve(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "以指定电压值开启高压电")
@PostMapping("/turnOnHighVoltage")
public Result<String> turnOnHighVoltage(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("turnOnHighVoltage");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.turnOnHighVoltage(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "关闭高压电")
@PostMapping("/turnOffHighVoltage")
public Result<String> turnOffHighVoltage(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("turnOffHighVoltage");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.turnOffHighVoltage(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "以指定转速、方向和时间开启注射泵")
@PostMapping("/turnOnSyringePump")
public Result<String> turnOnSyringePump(@RequestBody CMDForm cmdForm) {
try {
String commandId = UUID.randomUUID().toString();
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("turnOnSyringePump");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.turnOnSyringePump(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "停止注射泵")
@PostMapping("/turnOffSyringePump")
public Result<String> turnOffSyringePump(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("turnOffSyringePump");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.turnOffSyringePump(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "开始喷涂")
@PostMapping("/startWork")
public Result<String> startWork(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("startWork");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.startWork(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "结束喷涂")
@PostMapping("/stopWork")
public Result<String> stopWork(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("stopWork");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.stopWork(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "设置指定轴的电机运行时电流")
@PostMapping("/setMotorRunningCurrent")
public Result<String> setMotorRunningCurrent(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("setMotorRunningCurrent");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.setMotorRunningCurrent(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");
}
} catch (Exception e) {
log.error("指令执行异常: {}", JSONUtil.toJsonStr(cmdForm), e);
return Result.failed("执行失败");
}
}
@Operation(summary = "测试: 以指定转速运行指定时间")
@PostMapping("/rotate")
public Result<String> rotate(@RequestBody CMDForm cmdForm) {
try {
if (cmdForm.getCommandId() == null || cmdForm.getCommandId().isEmpty()) {
String commandId = UUID.randomUUID().toString();
cmdForm.setCommandId(commandId);
}
if (cmdForm.getCommandName() == null || cmdForm.getCommandName().isEmpty()) {
cmdForm.setCommandName("rotate");
}
log.info("接收到指令: {}", JSONUtil.toJsonStr(cmdForm));
if (cmdService.executeCommand(cmdForm)) {
if (cmdService.rotate(cmdForm)) {
return Result.success(cmdForm.getCommandId());
} else {
return Result.failed("无效命令");

55
src/main/java/com/qyft/ms/app/controller/LogsController.java

@ -1,55 +0,0 @@
package com.qyft.ms.app.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qyft.ms.app.model.entity.Logs;
import com.qyft.ms.app.service.ILogsService;
import com.qyft.ms.system.common.base.BasePageQuery;
import com.qyft.ms.system.common.result.PageResult;
import com.qyft.ms.system.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
@Tag(name = "日志")
@RestController
@RequestMapping("/api/logs")
@RequiredArgsConstructor
@Slf4j
public class LogsController {
private final ILogsService logsService;
@Operation(summary = "日志列表")
@GetMapping("/list")
public PageResult<Logs> getAllTasks(BasePageQuery pageQuery) {
return PageResult.success(logsService.page(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize())));
}
@Operation(summary = "日志新增")
@PostMapping("/add")
public Result<Integer> add(String log) {
return Result.success(logsService.insertLog(log));
}
@Operation(summary = "日志详情")
@GetMapping("/")
public Result<Logs> detail(@RequestParam Long id) {
return Result.success(logsService.getBaseMapper().selectById(id));
}
@Operation(summary = "删除日志")
@DeleteMapping("/{ids}")
public Result<Boolean> deleteLog(@Parameter(description = "日志ID,多个以英文逗号(,)分割") @PathVariable String ids) {
List<Long> idsArr = Arrays.stream(ids.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
return Result.success(logsService.removeByIds(idsArr));
}
}

56
src/main/java/com/qyft/ms/app/controller/MatrixController.java

@ -0,0 +1,56 @@
package com.qyft.ms.app.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qyft.ms.app.model.entity.Matrix;
import com.qyft.ms.app.service.MatrixService;
import com.qyft.ms.system.common.base.BasePageQuery;
import com.qyft.ms.system.common.result.PageResult;
import com.qyft.ms.system.common.result.Result;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Tag(name = "基质")
@RestController
@RequestMapping("/api/matrix")
@RequiredArgsConstructor
@Slf4j
public class MatrixController {
private final MatrixService matrixService;
@Operation(summary = "新增基质")
@PostMapping("/add")
public Result<Integer> add(@RequestBody Matrix matrix) {
return Result.success(matrixService.addMatrix(matrix));
}
@Operation(summary = "基质详情")
@GetMapping("/{id}")
public Result<Matrix> getMatrixById(@PathVariable Integer id) {
return Result.success(matrixService.getById(id));
}
@Operation(summary = "基质列表")
@GetMapping("/list")
public PageResult<Matrix> getAll(BasePageQuery pageQuery) {
IPage<Matrix> result = matrixService.page(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), null);
return PageResult.success(result);
}
@Operation(summary = "基质更新")
@PutMapping
public Result<Boolean> update(@RequestBody Matrix matrix) {
return Result.success(matrixService.updateMatrix(matrix));
}
@Operation(summary = "基质删除")
@DeleteMapping("/{ids}")
public Result<Boolean> deleteMatrix(@PathVariable String ids) {
return Result.success(matrixService.deleteMatrix(ids));
}
}

72
src/main/java/com/qyft/ms/app/controller/MatrixCraftController.java

@ -0,0 +1,72 @@
package com.qyft.ms.app.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qyft.ms.app.model.dto.MatrixCraftDTO;
import com.qyft.ms.app.model.entity.Matrix;
import com.qyft.ms.app.model.entity.MatrixCraft;
import com.qyft.ms.app.service.MatrixCraftService;
import com.qyft.ms.system.common.base.BasePageQuery;
import com.qyft.ms.system.common.result.PageResult;
import com.qyft.ms.system.common.result.Result;
import com.qyft.ms.system.model.entity.User;
import com.qyft.ms.system.service.IUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Tag(name = "基质工艺")
@RestController
@RequestMapping("/api/matrixCraft")
@RequiredArgsConstructor
@Slf4j
public class MatrixCraftController {
private final MatrixCraftService matrixCraftService;
private final IUserService iUserService;
@Operation(summary = "新增基质工艺")
@PostMapping("/add")
public Result<Integer> add(@RequestBody MatrixCraftDTO dto) {
User user = iUserService.currentUser();
if (user != null) {
dto.setCreateUser(user.getId());
}
return Result.success(matrixCraftService.add(dto));
}
@Operation(summary = "基质工艺详情")
@GetMapping("/{id}")
public Result<MatrixCraft> getCraftById(@PathVariable Long id) {
return Result.success(matrixCraftService.getCraftById(id));
}
@Operation(summary = "基质工艺列表")
@GetMapping("/getListByMatrixId/{matrixId}")
public Result<List<MatrixCraft>> getListByMatrixId(@PathVariable Long matrixId) {
return Result.success(matrixCraftService.getListByMatrixId(matrixId));
}
@Operation(summary = "所有工艺列表")
@GetMapping("/list")
public PageResult<MatrixCraft> getAll(BasePageQuery pageQuery) {
IPage<MatrixCraft> result = matrixCraftService.page(new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize()), null);
return PageResult.success(result);
}
@Operation(summary = "基质工艺更新")
@PutMapping
public Result<Boolean> update(@RequestBody MatrixCraft matrixCraft) {
return Result.success(matrixCraftService.updateMatrixCraft(matrixCraft));
}
@Operation(summary = "基质删除")
@DeleteMapping("/{ids}")
public Result<Boolean> deleteMatrixCraft(@PathVariable String ids) {
return Result.success(matrixCraftService.deleteMatrixCraft(ids));
}
}

66
src/main/java/com/qyft/ms/app/controller/OperationLogController.java

@ -0,0 +1,66 @@
package com.qyft.ms.app.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qyft.ms.app.model.entity.Matrix;
import com.qyft.ms.app.model.entity.OperationLog;
import com.qyft.ms.app.service.OperationLogService;
import com.qyft.ms.system.common.base.BasePageQuery;
import com.qyft.ms.system.common.result.PageResult;
import com.qyft.ms.system.common.result.Result;
import com.qyft.ms.system.model.entity.User;
import com.qyft.ms.system.service.IUserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
@Tag(name = "操作记录")
@RestController
@RequestMapping("/api/log")
@RequiredArgsConstructor
@Slf4j
public class OperationLogController {
private final OperationLogService op;
private final IUserService userService;
@Operation(summary = "新增日志")
@PostMapping("/add")
public Result<Integer> add(@RequestBody OperationLog operationLog) {
User user = userService.currentUser();
if (user != null) {
operationLog.setCreateUser(user.getId());
}
return Result.success(op.add(operationLog));
}
@Operation(summary = "日志详情")
@GetMapping("/{id}")
public Result<OperationLog> getLogById(@PathVariable Integer id) {
return Result.success(op.getLogById(id));
}
@Operation(summary = "日志列表")
@GetMapping("/list")
public PageResult<OperationLog> getAll(BasePageQuery pageQuery) {
return PageResult.success(op.getAll(pageQuery));
}
@Operation(summary = "获取进行中的喷涂任务")
@GetMapping("/getIng")
public Result<OperationLog> getIng() {
return Result.success(op.getIng());
}
@Operation(summary = "日志更新")
@PutMapping
public Result<Boolean> update(@RequestBody OperationLog operationLog) {
return Result.success(op.updateById(operationLog));
}
@Operation(summary = "日志删除")
@DeleteMapping("/{ids}")
public Result<Boolean> deleteLog(@PathVariable String ids) {
return Result.success(op.deleteLog(ids));
}
}

34
src/main/java/com/qyft/ms/app/controller/SysSettingsController.java

@ -19,38 +19,4 @@ import java.util.List;
@RequiredArgsConstructor
@Slf4j
public class SysSettingsController {
private final ISysSettingsService sysSettingsService;
@Operation(summary = "获取配置")
@GetMapping("/getConfig")
public Result<List<?>> getConfig(
@Parameter(
description = "配置类型(heat_area 工作区配置 solution_area 加液区配置 lid_area 拍子区域配置 sys_setting 其他系统配置)"
)
@RequestParam
@Nullable
String type
) {
if (type == null) {
return Result.success(sysSettingsService.getAllConfig());
} else {
return Result.success(sysSettingsService.getConfig(type));
}
}
@Operation(summary = "更新配置")
@PutMapping("/updateConfig")
public Result<String> updateConfig(@RequestBody List<SysSettingsDTO> dto) {
return Result.failed();
}
@Operation(summary = "修改系统日期与时间(Linux date -s)")
@PutMapping("/setSysDate/{newTime}")
public Result<String> setSysDate(@Parameter(description = "时间字符串 YYYY-MM-DD HH:mm:ss") @PathVariable String newTime) {
boolean isSuccess = sysSettingsService.setSysDate(newTime);
if (isSuccess) {
return Result.success();
}
return Result.failed();
}
}

18
src/main/java/com/qyft/ms/app/mapper/MatrixCraftMapper.java

@ -0,0 +1,18 @@
package com.qyft.ms.app.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qyft.ms.app.model.dto.MatrixCraftDTO;
import com.qyft.ms.app.model.entity.MatrixCraft;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* 基质持久层接口
*/
@Mapper
public interface MatrixCraftMapper extends BaseMapper<MatrixCraft> {
List<MatrixCraft> getListByMatrixId(Long matrixId);
Integer add(MatrixCraftDTO dto);
}

6
src/main/java/com/qyft/ms/app/mapper/LogsMapper.java → src/main/java/com/qyft/ms/app/mapper/MatrixMapper.java

@ -1,12 +1,12 @@
package com.qyft.ms.app.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qyft.ms.app.model.entity.Logs;
import com.qyft.ms.app.model.entity.Matrix;
import org.apache.ibatis.annotations.Mapper;
/**
* 日志持久层接口
* 基质持久层接口
*/
@Mapper
public interface LogsMapper extends BaseMapper<Logs> {
public interface MatrixMapper extends BaseMapper<Matrix> {
}

13
src/main/java/com/qyft/ms/app/mapper/OperationLogMapper.java

@ -0,0 +1,13 @@
package com.qyft.ms.app.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.qyft.ms.app.model.entity.OperationLog;
import org.apache.ibatis.annotations.Mapper;
/**
* 基质持久层接口
*/
@Mapper
public interface OperationLogMapper extends BaseMapper<OperationLog> {
}

5
src/main/java/com/qyft/ms/app/mapper/SysSettingsMapper.java

@ -20,10 +20,5 @@ import java.util.List;
@Mapper
public interface SysSettingsMapper extends BaseMapper<SysSettings> {
List<SysSettingVO> getConfig(String type);
void updateById(SysSettingsDTO dto);
int getIdByCode(String type);
}

42
src/main/java/com/qyft/ms/app/model/dto/MatrixCraftDTO.java

@ -0,0 +1,42 @@
package com.qyft.ms.app.model.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class MatrixCraftDTO {
@Schema(description = "名称")
private String name;
@Schema(description = "基质id")
private Long matrixId;
@Schema(description = "路径类型 0 竖向 1 横向")
private Integer routeType;
@Schema(description = "喷涂高度")
private Integer height;
@Schema(description = "氮气流速")
private Integer nitrogenFlowVelocity;
@Schema(description = "氮气气压")
private Integer nitrogenAirPressure;
@Schema(description = "基质流速")
private Integer matrixFlowVelocity;
@Schema(description = "电压")
private Integer voltage;
@Schema(description = "移速")
private Integer movementSpeed;
@Schema(description = "行间距")
private Integer space;
@Schema(description = "创建人")
private Long createUser;
}

19
src/main/java/com/qyft/ms/app/model/entity/Matrix.java

@ -0,0 +1,19 @@
package com.qyft.ms.app.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qyft.ms.system.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Schema(description = "基质类型")
@TableName("matrix")
@Data
public class Matrix extends BaseEntity {
@NotBlank
@Schema(description = "名称")
private String name;
}

58
src/main/java/com/qyft/ms/app/model/entity/MatrixCraft.java

@ -0,0 +1,58 @@
package com.qyft.ms.app.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qyft.ms.system.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Schema(description = "基质工艺")
@TableName("matrix_craft")
@Data
public class MatrixCraft extends BaseEntity {
@NotBlank
@Schema(description = "名称")
private String name;
@NotBlank
@Schema(description = "基质id")
private Long matrixId;
@NotBlank
@Schema(description = "路径类型 0 竖向 1 横向")
private Integer routeType;
@NotBlank
@Schema(description = "喷涂高度")
private Integer height;
@NotBlank
@Schema(description = "氮气流速")
private Integer nitrogenFlowVelocity;
@NotBlank
@Schema(description = "氮气气压")
private Integer nitrogenAirPressure;
@NotBlank
@Schema(description = "基质流速")
private Integer matrixFlowVelocity;
@NotBlank
@Schema(description = "电压")
private Integer voltage;
@NotBlank
@Schema(description = "移速")
private Integer movementSpeed;
@NotBlank
@Schema(description = "行间距")
private Integer space;
@NotBlank
@Schema(description = "创建人")
private Long createUser;
}

24
src/main/java/com/qyft/ms/app/model/entity/Logs.java → src/main/java/com/qyft/ms/app/model/entity/OperationLog.java

@ -1,30 +1,30 @@
package com.qyft.ms.app.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.qyft.ms.system.common.base.BaseEntity;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
@EqualsAndHashCode(callSuper = false)
@Schema(description = "日志")
@TableName("logs")
@Schema(description = "操作记录")
@TableName("operation_log")
@Data
public class Logs {
public class OperationLog extends BaseEntity {
@NotBlank
@Schema(description = "id")
private Long id;
@Schema(description = "所选基质")
private Long matrixId;
@NotBlank
@Schema(description = "创建人")
private Long createUser;
@Schema(description = "工艺参数")
private String matrixInfo;
@NotBlank
@Schema(description = "日志内容")
private String text;
@Schema(description = "完成状态 0 进行中 1 已完成")
private Integer status;
@NotBlank
@Schema(description = "创建时间")
private String createTime;
@Schema(description = "创建")
private Long createUser;
}

8
src/main/java/com/qyft/ms/app/model/entity/SysSettings.java

@ -32,12 +32,6 @@ public class SysSettings {
private String code;
@Schema(description = "配置值")
private String value1;
@Schema(description = "配置值")
private String value2;
@Schema(description = "配置值")
private String value3;
private String value;
}

7
src/main/java/com/qyft/ms/app/model/form/CMDForm.java

@ -5,6 +5,7 @@ import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Schema(description = "指令")
@Data
@ -14,10 +15,10 @@ public class CMDForm {
private String commandId;
@NotBlank()
@Schema(description = "指令类型", example = "upTray")
private String command;
@Schema(description = "指令类型", example = "moveMotorToPosition")
private String commandName;
@Schema(description = "参数")
private List<Object> params;
private Map<String, Object> params;
}

19
src/main/java/com/qyft/ms/app/model/vo/SysSettingVO.java

@ -11,10 +11,10 @@ import java.util.List;
public class SysSettingVO {
@Schema(description = "主键id")
private int id;
private Long id;
@Schema(description = "父id")
private int parentId;
private Long parentId;
@Schema(description = "名称")
private String name;
@ -25,19 +25,4 @@ public class SysSettingVO {
@Schema(description = "配置值")
private String value;
@Schema(description = "设备id")
private String hardwareId;
@Schema(description = "加热区温度")
private String temperature;
@Schema(description = "工艺id")
private int craftId;
@Schema(description = "试管坐标list")
private List<String> tubePositionList;
@Schema(description = "拍子坐标")
private String LidPosition;
}

263
src/main/java/com/qyft/ms/app/service/CMDService.java

@ -1,31 +1,274 @@
package com.qyft.ms.app.service;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.qyft.ms.app.common.constant.WebSocketMessageType;
import com.qyft.ms.app.common.generator.PathGenerator;
import com.qyft.ms.app.common.result.CMDResultCode;
import com.qyft.ms.device.model.bo.DeviceCtrlFuncCMD;
import com.qyft.ms.app.model.entity.OperationLog;
import com.qyft.ms.app.model.form.CMDForm;
import com.qyft.ms.app.model.vo.ExecutionResult;
import com.qyft.ms.device.service.DeviceTcpCMDService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.awt.*;
import java.util.*;
import java.util.List;
import java.util.function.Function;
import java.util.function.Supplier;
import static com.qyft.ms.app.common.generator.PathGenerator.generatePathPoints;
@Slf4j
@RequiredArgsConstructor
@Service
public class CMDService {
private final WebSocketService webSocketService;
CMDForm form;
private final DeviceTcpCMDService deviceTcpCMDService;
private final OperationLogService operationLogService;
private final MatrixCraftService matrixCraftService;
private void initExecutorThread(List<Supplier<Boolean>> cmdList, CMDForm form) {
new Thread(() -> run(cmdList, form)).start();
}
// 电机移动
public boolean moveMotorToPosition(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
String axis = (String) params.get("axis");
double position = Optional.ofNullable(params.get("position"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition(axis, position));
initExecutorThread(cmdList, form);
return true;
};
// 切换清洗管路/喷涂管路
public boolean switchThreeWayValve(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
String type = (String) params.get("type");
if (type.equals("clean")) {
cmdList.add(deviceTcpCMDService::switchThreeWayValveToSubstrate);
} else if (type.equals("spray")) {
cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray);
}
initExecutorThread(cmdList, form);
return true;
}
// 除湿阀清洗阀喷嘴阀控制方法
public boolean controlValve(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
if(params.get("valveType") !=null && params.get("isOpen") !=null) {
String valveType = (String) params.get("valveType");
boolean isOpen = (boolean) params.get("isOpen");
cmdList.add(() -> deviceTcpCMDService.controlValve(valveType,isOpen));
}
initExecutorThread(cmdList, form);
return true;
}
// 以指定电压值开启高压电
public boolean turnOnHighVoltage(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
double voltage = Optional.ofNullable(params.get("voltage"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage(voltage));
initExecutorThread(cmdList, form);
return true;
}
// 关闭高压电
public boolean turnOffHighVoltage(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(deviceTcpCMDService::turnOffHighVoltage);
initExecutorThread(cmdList, form);
return true;
}
// 以指定转速方向和时间开启注射泵
public boolean turnOnSyringePump(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
double time = Optional.ofNullable(params.get("time"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
String direction = (String) params.get("direction");
cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(rotationSpeed, direction, time));
initExecutorThread(cmdList, form);
return true;
}
// 停止注射泵
public boolean turnOffSyringePump(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
cmdList.add(deviceTcpCMDService::turnOffSyringePump);
initExecutorThread(cmdList, form);
return true;
}
private void run(List<Supplier<Boolean>> cmdList) {
// 设置指定轴的电机运行时电流
public boolean setMotorRunningCurrent(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
String axis = (String) params.get("axis");
double current = Optional.ofNullable(params.get("current"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
cmdList.add(() -> deviceTcpCMDService.setMotorRunningCurrent(axis, current));
initExecutorThread(cmdList, form);
return true;
}
// 开始喷涂
public boolean startWork(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
// 托盘位置
Map<String, Integer> trayPosition = new HashMap<>();
trayPosition.put("x", 0);
trayPosition.put("y", 0);
trayPosition.put("z", 0);
int space = (Integer) params.get("space");
List<Map<String, Integer>> position = (List<Map<String, Integer>>) params.get("position");
Map<String, Integer> p1 = position.get(0);
Map<String, Integer> p2 = position.get(1);
// 托盘点位 x y z
int left = trayPosition.get("x")+ p1.get("x");
int right = trayPosition.get("x") + p2.get("x");
int top = trayPosition.get("y") + p2.get("y");
int bottom = trayPosition.get("y") + p1.get("y");
// 获取轨迹list
int direction = (Integer) params.get("direction");
List<Point> horizontalPath = generatePathPoints(
left, right, bottom, top, space, direction == 1 ? PathGenerator.MoveMode.HORIZONTAL_ZIGZAG_TOP_DOWN : PathGenerator.MoveMode.VERTICAL_ZIGZAG_LEFT_RIGHT
);
// 将三通阀转至喷涂管路
cmdList.add(deviceTcpCMDService::switchThreeWayValveToSpray);
// 设置指定轴的电机的运行速度
int setMotorSpeed = (Integer) params.get("setMotorSpeed");
cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("x", setMotorSpeed));
cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("y", setMotorSpeed));
cmdList.add(() -> deviceTcpCMDService.setMotorSpeed("z", setMotorSpeed));
// 移动到指定高度(位置)
int height = (Integer) params.get("height");
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("z",trayPosition.get("z") + height ));
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", left));
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", top));
// 是否加电 电压
Object voltage = params.get("voltage");
if (voltage instanceof Integer) {
cmdList.add(() -> deviceTcpCMDService.turnOnHighVoltage( (Integer) voltage));
}
// 开启喷嘴阀
cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
// 推注射泵
cmdList.add(() -> deviceTcpCMDService.turnOnSyringePump(100, "right", 5000));
// 插入日志
cmdList.add( () -> {
OperationLog operationLog = new OperationLog();
operationLog.setStatus(0);
operationLog.setMatrixId((Long) params.get("matrixCraftId"));
operationLog.setMatrixInfo(JSON.toJSONString(params));
operationLogService.add(operationLog);
return true;
});
// 执行轨迹
double curX = left;
double curY = top;
for (Point point : horizontalPath) {
double nextX = (int) point.getX();
double nextY = (int) point.getY();
double distanceX = nextX - curX;
double distanceY = nextY - curY;
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("x", distanceX));
cmdList.add(() -> deviceTcpCMDService.moveMotorToPosition("y", distanceY));
curX = nextX;
curY = nextY;
}
// 停止喷涂
cmdList.add(deviceTcpCMDService::turnOffSyringePump);
// 关闭喷嘴阀
cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
// 回到原点
cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Y"));
cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
// 结束日志
cmdList.add( () -> {
OperationLog operationLog = operationLogService.getIng();
operationLog.setStatus(1);
operationLogService.updateById(operationLog);
return true;
});
initExecutorThread(cmdList, form);
return true;
}
// 结束喷涂
public boolean stopWork(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
// 停止喷涂
cmdList.add(deviceTcpCMDService::turnOffSyringePump);
// 关闭喷嘴阀
cmdList.add(() -> deviceTcpCMDService.controlValve("Nozzle", true));
// 回到原点
cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("X"));
cmdList.add(() -> deviceTcpCMDService.motorMoveToHome("Z"));
initExecutorThread(cmdList, form);
return true;
}
// 测试轴转动
public boolean rotate(CMDForm form) {
Map<String, Object> params = form.getParams();
List<Supplier<Boolean>> cmdList = new ArrayList<>();
String axis = (String) params.get("axis");
double rotationSpeed = Optional.ofNullable(params.get("rotationSpeed"))
.filter(Number.class::isInstance)
.map(Number.class::cast)
.map(Number::doubleValue)
.orElse(0.0);
int time = (Integer) params.get("time");
cmdList.add(() -> deviceTcpCMDService.rotate(axis, rotationSpeed, time));
initExecutorThread(cmdList, form);
return true;
}
private void run(List<Supplier<Boolean>> cmdList, CMDForm form) {
ExecutionResult executionResult = new ExecutionResult();
executionResult.setCommandId(form.getCommandId());
executionResult.setCommandName(form.getCommand());
executionResult.setCommandName(form.getCommandName());
// 执行所有命令
for (Supplier<Boolean> command : cmdList) {
@ -38,17 +281,9 @@ public class CMDService {
return;
}
}
log.info("指令执行成功: {}", JSONUtil.toJsonStr(form));
executionResult.setStatus(CMDResultCode.SUCCESS.getCode());
executionResult.setMessage(CMDResultCode.SUCCESS.getMsg());
webSocketService.pushMsg(WebSocketMessageType.CMD, executionResult);
}
public boolean executeCommand(CMDForm cmdForm) {
List<Supplier<Boolean>> cmdList = new ArrayList<>();
new Thread(() -> run(cmdList)).start();
return false;
}
}

11
src/main/java/com/qyft/ms/app/service/ILogsService.java

@ -1,11 +0,0 @@
package com.qyft.ms.app.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qyft.ms.app.model.entity.Logs;
/**
* 日志业务接口
*/
public interface ILogsService extends IService<Logs> {
int insertLog(String log);
}

7
src/main/java/com/qyft/ms/app/service/ISysSettingsService.java

@ -14,11 +14,4 @@ import java.util.List;
*/
public interface ISysSettingsService extends IService<SysSettings> {
List<SysSettingVO> getConfig(String type);
List<SysSettingResult> getAllConfig();
Boolean updateConfig(List<SysSettingsDTO> dto);
boolean setSysDate(String newTime);
}

25
src/main/java/com/qyft/ms/app/service/MatrixCraftService.java

@ -0,0 +1,25 @@
package com.qyft.ms.app.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qyft.ms.app.model.dto.MatrixCraftDTO;
import com.qyft.ms.app.model.entity.MatrixCraft;
import java.util.List;
/**
* 日志业务接口
*/
public interface MatrixCraftService extends IService<MatrixCraft> {
Integer add(MatrixCraftDTO dto);
MatrixCraft getCraftById(Long id);
List<MatrixCraft> getListByMatrixId(Long matrixId);
Boolean updateMatrixCraft(MatrixCraft matrixCraft);
Boolean deleteMatrixCraft(String ids);
}

14
src/main/java/com/qyft/ms/app/service/MatrixService.java

@ -0,0 +1,14 @@
package com.qyft.ms.app.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qyft.ms.app.model.entity.Matrix;
/**
* 日志业务接口
*/
public interface MatrixService extends IService<Matrix> {
int addMatrix(Matrix matrix);
boolean updateMatrix(Matrix matrix);
boolean deleteMatrix(String ids);
}

22
src/main/java/com/qyft/ms/app/service/OperationLogService.java

@ -0,0 +1,22 @@
package com.qyft.ms.app.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.qyft.ms.app.model.entity.OperationLog;
import com.qyft.ms.system.common.base.BasePageQuery;
/**
* 日志业务接口
*/
public interface OperationLogService extends IService<OperationLog> {
Integer add(OperationLog operationLog);
OperationLog getLogById(Integer id);
Boolean deleteLog(String ids);
IPage<OperationLog> getAll(BasePageQuery pageQuery);
OperationLog getIng();
}

3
src/main/java/com/qyft/ms/app/service/StatusService.java

@ -3,6 +3,7 @@ package com.qyft.ms.app.service;
import com.qyft.ms.app.common.constant.WebSocketMessageType;
import com.qyft.ms.device.model.bo.DeviceStatus;
import com.qyft.ms.device.service.DeviceStatusService;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
@ -19,7 +20,7 @@ public class StatusService {
private final WebSocketService webSocketService;
private final DeviceStatusService deviceStatusService;
// @PostConstruct
@PostConstruct
public void init() {
ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();
executorService.scheduleAtFixedRate(() -> {

29
src/main/java/com/qyft/ms/app/service/impl/ILogsServiceImpl.java

@ -1,29 +0,0 @@
package com.qyft.ms.app.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qyft.ms.app.mapper.LogsMapper;
import com.qyft.ms.app.model.entity.Logs;
import com.qyft.ms.app.service.ILogsService;
import com.qyft.ms.system.model.entity.User;
import com.qyft.ms.system.service.IUserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
/**
* 实验业务实现类
*/
@Service
@RequiredArgsConstructor
public class ILogsServiceImpl extends ServiceImpl<LogsMapper, Logs> implements ILogsService {
private final LogsMapper logsMapper;
private final IUserService userService;
@Override
public int insertLog(String log) {
Logs logs = new Logs();
logs.setText(log);
User user = userService.currentUser();
logs.setCreateUser(user.getId());
return logsMapper.insert(logs);
}
}

51
src/main/java/com/qyft/ms/app/service/impl/ISysSettingsServiceImpl.java

@ -19,57 +19,6 @@ import java.util.List;
@Service
@RequiredArgsConstructor
public class ISysSettingsServiceImpl extends ServiceImpl<SysSettingsMapper, SysSettings> implements ISysSettingsService {
private final SysSettingsMapper sysSettingsMapper;
@Override
public List<SysSettingVO> getConfig(String type) {
int parentId = sysSettingsMapper.getIdByCode(type);
return sysSettingsMapper.getConfig(String.valueOf(parentId));
}
@Override
public List<SysSettingResult> getAllConfig() {
List<SysSettingVO> list = sysSettingsMapper.getConfig("-1");
List<SysSettingResult> result = new ArrayList<>();
for (SysSettingVO sysSettings : list) {
List<SysSettingVO> childrenList = sysSettingsMapper.getConfig(String.valueOf(sysSettings.getId()));
SysSettingResult map = new SysSettingResult();
map.setName(sysSettings.getName());
map.setCode(sysSettings.getCode());
map.setId(sysSettings.getId());
map.setValue(sysSettings.getValue());
map.setHardwareId(sysSettings.getHardwareId());
map.setChildren(childrenList);
result.add(map);
}
return result;
}
@Override
public Boolean updateConfig(List<SysSettingsDTO> dto) {
for (SysSettingsDTO sysSettingsDTO : dto) {
sysSettingsMapper.updateById(sysSettingsDTO);
}
return true;
}
/**
* 修改服务器系统时间
*
* @param newTime 时间字符串 YYYY-MM-DD HH:mm:ss
* @return 是否修改成功
*/
@Override
public boolean setSysDate(String newTime) {
try {
String command = "date -s \"" + newTime + "\"";
Process process = Runtime.getRuntime().exec(command);
int exitCode = process.waitFor();
return exitCode == 0;
} catch (Exception e) {
log.error("修改系统时间失败", e);
return false;
}
}
}

49
src/main/java/com/qyft/ms/app/service/impl/MatrixCraftServiceImpl.java

@ -0,0 +1,49 @@
package com.qyft.ms.app.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qyft.ms.app.mapper.MatrixCraftMapper;
import com.qyft.ms.app.model.dto.MatrixCraftDTO;
import com.qyft.ms.app.model.entity.MatrixCraft;
import com.qyft.ms.app.service.MatrixCraftService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 基质业务实现类
*/
@Service
@RequiredArgsConstructor
public class MatrixCraftServiceImpl extends ServiceImpl<MatrixCraftMapper, MatrixCraft> implements MatrixCraftService {
private final MatrixCraftMapper matrixCraftMapper;
@Override
public Integer add(MatrixCraftDTO dto) {
return matrixCraftMapper.add(dto);
}
@Override
public MatrixCraft getCraftById(Long id) {
return matrixCraftMapper.selectById(id);
}
@Override
public List<MatrixCraft> getListByMatrixId(Long matrixId) {
return matrixCraftMapper.getListByMatrixId(matrixId);
}
@Override
public Boolean updateMatrixCraft(MatrixCraft matrixCraft) {
return matrixCraftMapper.updateById(matrixCraft) > 0;
}
@Override
public Boolean deleteMatrixCraft(String ids) {
List<Long> idsArr = Arrays.stream(ids.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
return this.removeByIds(idsArr);
}
}

40
src/main/java/com/qyft/ms/app/service/impl/MatrixServiceImpl.java

@ -0,0 +1,40 @@
package com.qyft.ms.app.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.qyft.ms.app.mapper.MatrixMapper;
import com.qyft.ms.app.model.entity.Matrix;
import com.qyft.ms.app.service.MatrixService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 基质业务实现类
*/
@Service
@RequiredArgsConstructor
public class MatrixServiceImpl extends ServiceImpl<MatrixMapper, Matrix> implements MatrixService {
private final MatrixMapper matrixMapper;
@Override
public int addMatrix(Matrix matrix) {
return matrixMapper.insert(matrix);
}
@Override
public boolean updateMatrix(Matrix matrix) {
return matrixMapper.updateById(matrix) > 0;
}
@Override
public boolean deleteMatrix(String ids) {
List<Long> idsArr = Arrays.stream(ids.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
return this.removeByIds(idsArr);
}
}

59
src/main/java/com/qyft/ms/app/service/impl/OperationLogServiceImpl.java

@ -0,0 +1,59 @@
package com.qyft.ms.app.service.impl;
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.extension.service.impl.ServiceImpl;
import com.qyft.ms.app.mapper.OperationLogMapper;
import com.qyft.ms.app.model.entity.OperationLog;
import com.qyft.ms.app.service.OperationLogService;
import com.qyft.ms.system.common.base.BasePageQuery;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
* 基质业务实现类
*/
@Service
@RequiredArgsConstructor
public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements OperationLogService {
private final OperationLogMapper operationLogMapper;
@Override
public Integer add(OperationLog operationLog) {
return operationLogMapper.insert(operationLog);
}
@Override
public OperationLog getLogById(Integer id) {
return operationLogMapper.selectById(id);
}
@Override
public Boolean deleteLog(String ids) {
List<Long> idsArr = Arrays.stream(ids.split(","))
.map(Long::parseLong)
.collect(Collectors.toList());
return this.removeByIds(idsArr);
}
@Override
public IPage<OperationLog> getAll(BasePageQuery pageQuery) {
// 构建分页对象
Page<OperationLog> page = new Page<>(pageQuery.getPageNum(), pageQuery.getPageSize());
QueryWrapper<OperationLog> queryWrapper = new QueryWrapper<>();
queryWrapper.in("status", 1);
return operationLogMapper.selectPage(page, queryWrapper);
}
@Override
public OperationLog getIng() {
QueryWrapper<OperationLog> queryWrapper = new QueryWrapper<>();
queryWrapper.in("status", 0);
return operationLogMapper.selectOne(queryWrapper);
}
}

1
src/main/java/com/qyft/ms/device/common/constant/DeviceCommands.java

@ -34,5 +34,6 @@ public class DeviceCommands {
public static final String SET_SYRINGE_PUMP_PARAMETERS = "setSyringePumpParameters";
// 推送指定容量的液体
public static final String PUSH_VOLUME = "pushVolume";
public static final String ROTATE = "rotate";
}

37
src/main/java/com/qyft/ms/device/model/bo/DeviceStatus.java

@ -9,5 +9,42 @@ import lombok.Data;
@Schema(description = "设备当前传感器状态")
@Data
public class DeviceStatus {
// 急停信号
private boolean emergencyStop;
// 暂停信号
private boolean pause;
// X 轴电机状态
private double xAxisPosition;
private double xAxisSpeed;
private boolean xAxisMovementEnded;
private boolean xAxisAtOrigin;
private boolean xAxisLimited;
// Y 轴电机状态
private double yAxisPosition;
private double yAxisSpeed;
private boolean yAxisMovementEnded;
private boolean yAxisAtOrigin;
private boolean yAxisLimited;
// Z 轴电机状态
private double zAxisPosition;
private double zAxisSpeed;
private boolean zAxisMovementEnded;
private boolean zAxisAtOrigin;
private boolean zAxisLimited;
// 三通阀状态
private String threeWayValvePosition;
// 流量计状态
private double flowRate;
// 温湿度传感器状态
private double temperature;
private double humidity;
// 注射泵状态
private boolean syringePumpNormal;
}

15
src/main/java/com/qyft/ms/device/service/DeviceTcpCMDService.java

@ -142,7 +142,7 @@ public class DeviceTcpCMDService {
// 三通阀控制方法
/**
* 切换三通阀到基质状态
* 切换三通阀到清洗状态
* @return 操作是否成功
*/
public boolean switchThreeWayValveToSubstrate() {
@ -160,14 +160,15 @@ public class DeviceTcpCMDService {
// 除湿阀清洗阀喷嘴阀控制方法
/**
* 控制指定阀的开启或关闭
* @param valveType 阀类型可选值为 "Dehumidification", "Cleaning", "Nozzle"
* @param isOpen 是否开启true 为开启false 为关闭
* valveType 阀类型可选值为 "Dehumidification", "Cleaning", "Nozzle"
* isOpen 是否开启true 为开启false 为关闭
* @return 操作是否成功
*/
public boolean controlValve(String valveType, boolean isOpen) {
Map<String, Object> params = new HashMap<>();
params.put("valveType", valveType);
params.put("isOpen", isOpen);
return this.putTask(DeviceCommands.CONTROL_VALVE, params);
}
@ -258,4 +259,12 @@ public class DeviceTcpCMDService {
params.put("volume", volume);
return this.putTask(DeviceCommands.PUSH_VOLUME, params);
}
public boolean rotate(String axis, double rotationSpeed, int time) {
Map<String, Object> params = new HashMap<>();
params.put("axis", axis);
params.put("rotationSpeed", rotationSpeed);
params.put("time", time);
return this.putTask(DeviceCommands.ROTATE, params);
}
}

2
src/main/resources/application.yml

@ -35,7 +35,7 @@ jwt:
#与设备TCP链接
tcp:
enable: false # 是否开启 TCP 连接
host: 127.0.0.1
host: 192.168.1.130
port: 9080
reconnect: 5000 # 断线重连间隔(单位:毫秒)
timeout: 10000 # 连接超时时间(单位:毫秒)

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

@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyft.ms.app.mapper.SysSettingsMapper">
<select id="getConfig" resultType="com.qyft.ms.app.model.vo.SysSettingVO">
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}
</select>
<update id="updateById">
UPDATE sys_settings
SET
value1 = CASE WHEN #{value} IS NOT NULL THEN #{value} ELSE value1 END,
value3 = CASE WHEN #{temperature} IS NOT NULL THEN #{temperature} ELSE value3 END,
value4 = CASE WHEN #{craftId} IS NOT NULL THEN #{craftId} ELSE value4 END
WHERE id = #{id}
</update>
</mapper>

14
src/main/resources/mapper/app/MatrixCraftMapper.xml

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyft.ms.app.mapper.MatrixCraftMapper">
<select id="getListByMatrixId" resultType="com.qyft.ms.app.model.entity.MatrixCraft">
select *
from matrix_craft where matrix_id = #{matrixId}
</select>
<insert id="add" >
insert into matrix_craft(name,matrix_id,route_type,height,nitrogen_flow_velocity,nitrogen_air_pressure,matrix_flow_velocity,voltage,movement_speed,space,create_user)
values(#{name},#{matrixId},#{routeType},#{height},#{nitrogenFlowVelocity},#{nitrogenAirPressure},#{matrixFlowVelocity},#{voltage},#{movementSpeed},#{space},#{createUser})
</insert>
</mapper>

12
src/main/resources/mapper/app/OperationLogMapper.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyft.ms.app.mapper.OperationLogMapper">
<select id="selectAll" resultType="com.qyft.ms.app.model.entity.OperationLog">
select *
from operation_log where status = 1
</select>
<select id="selectIng" resultType="com.qyft.ms.app.model.entity.OperationLog">
select *
from operation_log where status = 0
</select>
</mapper>

4
src/main/resources/mapper/app/SysSettingsMapper.xml

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qyft.ms.app.mapper.SysSettingsMapper">
</mapper>
Loading…
Cancel
Save