From f898a7a2f27bfd0126813e6589311262ca71dda7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=87=A4=E5=90=89?= Date: Sat, 26 Jul 2025 15:35:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=95=B0=E6=8D=AE=E5=BA=93id=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E4=B8=BALong=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pipeline/PipelineCleanStartCommand.java | 2 +- .../control/pipeline/PipelineCleanStopCommand.java | 2 +- .../pipeline/PipelineDrainStartCommand.java | 2 +- .../control/pipeline/PipelineDrainStopCommand.java | 2 +- .../pipeline/PipelinePreFillStartCommand.java | 2 +- .../pipeline/PipelinePreFillStopCommand.java | 2 +- .../control/solution/SolutionAddCommand.java | 2 +- .../control/solution/SolutionStopCommand.java | 2 +- .../app/common/enums/AddSolutionType.java | 5 ++ .../app/common/enums/TubeCurrentLocal.java | 5 ++ .../app/controller/CraftsController.java | 14 ++- .../app/core/crafts/CraftsContext.java | 41 +++++++++ .../app/core/crafts/CraftsDispatcher.java | 87 ++++-------------- .../app/core/crafts/CraftsExecutionService.java | 100 +++++++++++++++++++++ .../colortitration/app/core/crafts/CraftsJob.java | 32 ------- .../colortitration/app/core/crafts/CraftsStep.java | 10 +++ .../colortitration/app/model/dto/CommandDTO.java | 6 ++ .../app/service/module/TitrationModuleService.java | 18 ++-- .../common/model/entity/Container.java | 2 +- .../common/service/CraftsService.java | 4 +- 20 files changed, 215 insertions(+), 125 deletions(-) create mode 100644 src/main/java/com/iflytop/colortitration/app/common/enums/AddSolutionType.java create mode 100644 src/main/java/com/iflytop/colortitration/app/common/enums/TubeCurrentLocal.java create mode 100644 src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsContext.java create mode 100644 src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsExecutionService.java delete mode 100644 src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsJob.java create mode 100644 src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsStep.java diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStartCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStartCommand.java index 614df85..d0a3983 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStartCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStartCommand.java @@ -27,7 +27,7 @@ public class PipelineCleanStartCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String titrationModuleCodeStr = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(titrationModuleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStopCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStopCommand.java index 862dec2..efb43b3 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStopCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineCleanStopCommand.java @@ -26,7 +26,7 @@ public class PipelineCleanStopCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String titrationModuleCodeStr = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(titrationModuleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStartCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStartCommand.java index bbd3a25..f8038d5 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStartCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStartCommand.java @@ -26,7 +26,7 @@ public class PipelineDrainStartCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String titrationModuleCodeStr = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(titrationModuleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStopCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStopCommand.java index 3feae3f..14adbdd 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStopCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelineDrainStopCommand.java @@ -26,7 +26,7 @@ public class PipelineDrainStopCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String motorCode = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(motorCode) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER); diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStartCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStartCommand.java index 340192b..6f104c7 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStartCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStartCommand.java @@ -26,7 +26,7 @@ public class PipelinePreFillStartCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String titrationModuleCodeStr = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(titrationModuleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStopCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStopCommand.java index e340328..e7fcb77 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStopCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/pipeline/PipelinePreFillStopCommand.java @@ -26,7 +26,7 @@ public class PipelinePreFillStopCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); String titrationModuleCodeStr = commandDTO.getStringParam("titrationModuleCode"); if (StringUtils.isEmpty(titrationModuleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionAddCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionAddCommand.java index 24682ea..afc4142 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionAddCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionAddCommand.java @@ -27,7 +27,7 @@ public class SolutionAddCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { String moduleCodeStr = commandDTO.getStringParam("titrationModuleCode"); - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); Double volume = commandDTO.getDoubleParam("volume"); String type = commandDTO.getStringParam("type"); if (type.equals("drop")) { diff --git a/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionStopCommand.java b/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionStopCommand.java index f5d7127..56aeaf4 100644 --- a/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionStopCommand.java +++ b/src/main/java/com/iflytop/colortitration/app/command/control/solution/SolutionStopCommand.java @@ -27,7 +27,7 @@ public class SolutionStopCommand extends BaseCommandHandler { @Override public CompletableFuture handle(CommandDTO commandDTO) { String moduleCodeStr = commandDTO.getStringParam("titrationModuleCode"); - Integer solutionId = commandDTO.getIntegerParam("solutionId"); + Long solutionId = commandDTO.getLongParam("solutionId"); if (StringUtils.isEmpty(moduleCodeStr) || solutionId == null) { throw new AppException(ResultCode.INVALID_PARAMETER);//参数缺失 } diff --git a/src/main/java/com/iflytop/colortitration/app/common/enums/AddSolutionType.java b/src/main/java/com/iflytop/colortitration/app/common/enums/AddSolutionType.java new file mode 100644 index 0000000..e430b2b --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/common/enums/AddSolutionType.java @@ -0,0 +1,5 @@ +package com.iflytop.colortitration.app.common.enums; + +public enum AddSolutionType { + fixed,segmented,titration +} diff --git a/src/main/java/com/iflytop/colortitration/app/common/enums/TubeCurrentLocal.java b/src/main/java/com/iflytop/colortitration/app/common/enums/TubeCurrentLocal.java new file mode 100644 index 0000000..2194b24 --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/common/enums/TubeCurrentLocal.java @@ -0,0 +1,5 @@ +package com.iflytop.colortitration.app.common.enums; + +public enum TubeCurrentLocal { + TRAY, TITRATION, HEAT +} diff --git a/src/main/java/com/iflytop/colortitration/app/controller/CraftsController.java b/src/main/java/com/iflytop/colortitration/app/controller/CraftsController.java index 24d741f..cf02588 100644 --- a/src/main/java/com/iflytop/colortitration/app/controller/CraftsController.java +++ b/src/main/java/com/iflytop/colortitration/app/controller/CraftsController.java @@ -2,6 +2,7 @@ package com.iflytop.colortitration.app.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.iflytop.colortitration.app.core.crafts.CraftsDispatcher; +import com.iflytop.colortitration.app.core.state.DeviceState; import com.iflytop.colortitration.app.model.dto.SetCraftsDTO; import com.iflytop.colortitration.common.base.BasePageQuery; import com.iflytop.colortitration.common.model.entity.Crafts; @@ -28,6 +29,7 @@ import java.util.Arrays; public class CraftsController { private final CraftsService craftsService; private final CraftsDispatcher craftsDispatcher; + private final DeviceState deviceState; @Operation(summary = "分页查询工艺列表") @@ -80,21 +82,27 @@ public class CraftsController { @Operation(summary = "暂停执行工艺") @PostMapping("/pause") public Result pauseCrafts() { - craftsDispatcher.pause(); + deviceState.setCraftsPaused(true); return Result.success(); } @Operation(summary = "恢复执行工艺") @PostMapping("/resume") public Result resumeCrafts() { - craftsDispatcher.resume(); + deviceState.setCraftsPaused(false); return Result.success(); } @Operation(summary = "停止执行工艺") @PostMapping("/stop") public Result stopCrafts() { - craftsDispatcher.stop(); + craftsDispatcher.clearQueue(); + deviceState.getTrayTubeStateMap().forEach((key, value) -> { + value.setCraftsId(null); + value.setCraftsName(null); + value.setTitrationModuleCodes(null); + value.setQueueNum(null); + }); return Result.success(); } diff --git a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsContext.java b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsContext.java new file mode 100644 index 0000000..fa67cb0 --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsContext.java @@ -0,0 +1,41 @@ +package com.iflytop.colortitration.app.core.crafts; + +import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; +import com.iflytop.colortitration.app.common.enums.TubeCurrentLocal; +import com.iflytop.colortitration.common.model.entity.Crafts; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Slf4j +@Component +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +@Data +public class CraftsContext { + private int tubeNum; + private Crafts crafts; + private List selectedModules; + private int currentCommandCount = 0; + private int historyCommandCount = 0; + private MultipleModuleCode currentTitrationModuleCode; + private MultipleModuleCode currentHeatModuleCode; + private TubeCurrentLocal tubeCurrentLocal; + + /** + * 自增当前指令计数器 + */ + public int incrementCurrentCommandCount() { + return currentCommandCount++; + } + + /** + * 自增历史指令计数器 + */ + public int incrementHistoryCommandCount() { + return historyCommandCount++; + } +} diff --git a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsDispatcher.java b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsDispatcher.java index ed89aa1..6e9a68f 100644 --- a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsDispatcher.java +++ b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsDispatcher.java @@ -1,6 +1,7 @@ package com.iflytop.colortitration.app.core.crafts; import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; +import com.iflytop.colortitration.app.common.enums.TitrationStatus; import com.iflytop.colortitration.app.core.state.DeviceState; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; @@ -12,8 +13,6 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; /** * 动态为每个滴定位模块创建独立队列和工作线程 @@ -22,12 +21,12 @@ import java.util.concurrent.locks.ReentrantLock; @Component @RequiredArgsConstructor public class CraftsDispatcher { - private final BlockingQueue jobQueue = new LinkedBlockingQueue<>(); + private final BlockingQueue contextQueue = new LinkedBlockingQueue<>(); private ExecutorService executor; private final AtomicInteger threadCounter = new AtomicInteger(0); - private final ReentrantLock pauseLock = new ReentrantLock(); - private final Condition pauseCondition = pauseLock.newCondition(); + private final DeviceState deviceState; + private final CraftsExecutionService craftsStepService; @PostConstruct public void init() { @@ -50,9 +49,11 @@ public class CraftsDispatcher { return () -> { while (true) { try { - CraftsJob job = jobQueue.take(); - job.executeSteps(this); - log.info("试管编号 {} 的任务执行成功。", job.getTubeNum()); + CraftsContext craftsContext = contextQueue.take(); + deviceState.getTrayTubeStateMap().get(craftsContext.getTubeNum()).setTitrationStatus(TitrationStatus.IN_PROGRESS); + craftsStepService.executeStep(craftsContext); + deviceState.getTrayTubeStateMap().get(craftsContext.getTubeNum()).setTitrationStatus(TitrationStatus.COMPLETED); + log.info("试管编号 {} 的任务执行成功。", craftsContext.getTubeNum()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); log.warn("工作线程被中断,停止执行。"); @@ -67,9 +68,9 @@ public class CraftsDispatcher { /** * 将新的待执行工艺添加至队列 */ - public void addCraftsJob(CraftsJob craftsJob) { + public void addCraftsJob(CraftsContext craftsJob) { try { - jobQueue.put(craftsJob); + contextQueue.put(craftsJob); log.info("试管编号 {} 的任务已添加到队列中。", craftsJob.getTubeNum()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); @@ -80,8 +81,8 @@ public class CraftsDispatcher { /** * 获取所有待执行的任务 */ - public BlockingQueue getAllJobs() { - return jobQueue; + public BlockingQueue getAllJobs() { + return contextQueue; } /** @@ -89,9 +90,9 @@ public class CraftsDispatcher { */ public void removeCraftsJob(int tubeNum) { boolean removed = false; - for (CraftsJob job : jobQueue) { + for (CraftsContext job : contextQueue) { if (job.getTubeNum() == tubeNum) { - jobQueue.remove(job); // 删除任务 + contextQueue.remove(job); // 删除任务 removed = true; log.info("试管编号 {} 的任务已从队列中删除。", tubeNum); } @@ -101,62 +102,8 @@ public class CraftsDispatcher { } } - /** - * 如果暂停,线程将进入等待状态 - * - * @throws InterruptedException 如果线程被中断 - */ - public void waitIfPaused() throws InterruptedException { - pauseLock.lock(); - try { - while (deviceState.isCraftsPaused()) { - // 如果已暂停,当前线程将被挂起,直到调用 notifyAll() 唤醒 - pauseCondition.await(); - } - } finally { - pauseLock.unlock(); - } - } - - /** - * 暂停所有任务 - */ - public void pause() { - pauseLock.lock(); - try { - deviceState.setCraftsPaused(true); - log.info("所有任务已暂停。"); - } finally { - pauseLock.unlock(); - } - } - - /** - * 恢复所有任务 - */ - public void resume() { - pauseLock.lock(); - try { - deviceState.setCraftsPaused(false); - pauseCondition.signalAll(); // 唤醒所有等待的线程 - log.info("所有任务已恢复。"); - } finally { - pauseLock.unlock(); - } - } - - /** - * 停止工艺 - */ - public void stop(){ - //TODO 发送停止指令 - jobQueue.clear(); - deviceState.getTrayTubeStateMap().forEach((key, value) -> { - value.setCraftsId(null); - value.setCraftsName(null); - value.setTitrationModuleCodes(null); - value.setQueueNum(null); - }); + public void clearQueue() { + contextQueue.clear(); } } \ No newline at end of file diff --git a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsExecutionService.java b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsExecutionService.java new file mode 100644 index 0000000..5e3b890 --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsExecutionService.java @@ -0,0 +1,100 @@ +package com.iflytop.colortitration.app.core.crafts; + +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; +import com.iflytop.colortitration.app.common.enums.AddSolutionType; +import com.iflytop.colortitration.app.common.utils.CommandUtil; +import com.iflytop.colortitration.app.core.command.CommandFuture; +import com.iflytop.colortitration.app.service.DeviceCommandService; +import com.iflytop.colortitration.app.service.module.TitrationModuleService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 工艺步骤执行服务 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class CraftsExecutionService { + private final DeviceCommandService deviceCommandService; + private final TitrationModuleService titrationModuleService; + + /** + * 执行工艺步骤,直接从 CraftsContext 中获取步骤 + */ + public boolean executeStep(CraftsContext craftsContext) throws Exception { + craftsContext.setCurrentCommandCount(0); + List craftsStepList = JSONUtil.parseArray(craftsContext.getCrafts().getSteps()).toList(CraftsStep.class); + for (CraftsStep craftsStep : craftsStepList) { + String method = craftsStep.getMethod(); + JSONObject params = craftsStep.getParams(); + return switch (method) { + case "addSolution" -> addSolution(craftsContext, params); + case "heat" -> heat(craftsContext, params); + case "addMagnet" -> addMagnet(craftsContext, params); + case "waiting" -> waiting(craftsContext, params); + default -> true; + }; + } + return true; + } + + private boolean addSolution(CraftsContext craftsContext, JSONObject params) throws Exception { + moveToTitration();//移动至滴定 + //TODO 调用相机判断滴定位是否存在试管 + Long solutionId = params.getLong("solutionId");//使用的溶液id + Double amount = params.getDouble("amount");//加液量 + Long colorId = params.getLong("colorId");//终点颜色 + String type = params.getStr("type");//加液方式 + AddSolutionType addSolutionType = AddSolutionType.valueOf(type); + Integer waitTime = params.getInt("waitTime");//加液后等待时长 + Double maxAmount = params.getDouble("maxAmount");//滴定最大体积 + Boolean stirFlag = params.getBool("stirFlag");//是否搅拌 + if(AddSolutionType.fixed.equals(addSolutionType)){//定量加液 + titrationModuleService.addSolutionStart(craftsContext.getCurrentTitrationModuleCode(), solutionId, amount); + }else if(AddSolutionType.segmented.equals(addSolutionType)){//分段加液 + + }else if(AddSolutionType.titration.equals(addSolutionType)){//滴定加液 + + } + return true; + } + + private boolean heat(CraftsContext craftsContext, JSONObject params) { + moveToHeat();//移动至加热 + //TODO 调用传感器判断加热位是否存在试管 + + return true; + } + + private boolean addMagnet(CraftsContext craftsContext, JSONObject params) { + return true; + } + + private boolean waiting(CraftsContext craftsContext, JSONObject params) { + return true; + } + //移动至滴定 + private void moveToTitration(){ + //动态分配使用的模块 + } + //移动至加热 + private void moveToHeat(){ + //动态分配使用的模块 + } + + private void wait(CraftsContext craftsContext, CommandFuture... futures) throws Exception { + wait(craftsContext, null, futures); + } + + private void wait(CraftsContext craftsContext, Long timeout, CommandFuture... futures) throws Exception { + CommandUtil.wait(timeout, futures); + craftsContext.incrementCurrentCommandCount(); + craftsContext.incrementHistoryCommandCount(); + } + +} diff --git a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsJob.java b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsJob.java deleted file mode 100644 index ded29b9..0000000 --- a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsJob.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.iflytop.colortitration.app.core.crafts; - -import com.iflytop.colortitration.app.common.enums.MultipleModuleCode; -import com.iflytop.colortitration.common.model.entity.Crafts; -import lombok.Data; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Scope; -import org.springframework.stereotype.Component; - -import java.util.List; - -@Slf4j -@Component -@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) -@Data -public class CraftsJob { - private int tubeNum; - private List selectedModules; - private Crafts crafts; - - public void executeSteps(CraftsDispatcher dispatcher) { - log.info("执行工艺开始,试管{}", tubeNum); - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - log.info("执行工艺结束,试管{}", tubeNum); - } - -} diff --git a/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsStep.java b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsStep.java new file mode 100644 index 0000000..42f20f2 --- /dev/null +++ b/src/main/java/com/iflytop/colortitration/app/core/crafts/CraftsStep.java @@ -0,0 +1,10 @@ +package com.iflytop.colortitration.app.core.crafts; + +import cn.hutool.json.JSONObject; +import lombok.Data; + +@Data +public class CraftsStep { + private String method; + private JSONObject params; +} diff --git a/src/main/java/com/iflytop/colortitration/app/model/dto/CommandDTO.java b/src/main/java/com/iflytop/colortitration/app/model/dto/CommandDTO.java index c2070ee..be63bea 100644 --- a/src/main/java/com/iflytop/colortitration/app/model/dto/CommandDTO.java +++ b/src/main/java/com/iflytop/colortitration/app/model/dto/CommandDTO.java @@ -43,6 +43,12 @@ public class CommandDTO { return (value != null && !value.isEmpty()) ? Integer.parseInt(value) : null; } + // 获取 Long 类型的参数,null 或空字符串时返回 null + public Long getLongParam(String key) { + String value = getStringParam(key); + return (value != null && !value.isEmpty()) ? Long.parseLong(value) : null; + } + // 获取 Boolean 类型的参数,null 或空字符串时返回 null public Boolean getBooleanParam(String key) { String value = getStringParam(key); diff --git a/src/main/java/com/iflytop/colortitration/app/service/module/TitrationModuleService.java b/src/main/java/com/iflytop/colortitration/app/service/module/TitrationModuleService.java index 166ba65..2deb0af 100644 --- a/src/main/java/com/iflytop/colortitration/app/service/module/TitrationModuleService.java +++ b/src/main/java/com/iflytop/colortitration/app/service/module/TitrationModuleService.java @@ -36,7 +36,7 @@ public class TitrationModuleService { /** * 添加溶液开始 */ - public void addSolutionStart(MultipleModuleCode titrationModuleCode, Integer solutionId, double volume) { + public void addSolutionStart(MultipleModuleCode titrationModuleCode, Long solutionId, double volume) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -64,7 +64,7 @@ public class TitrationModuleService { /** * 添加溶液结束 */ - public void addSolutionStop(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void addSolutionStop(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -92,7 +92,7 @@ public class TitrationModuleService { /** * 预充开始 */ - public void preFillStart(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void preFillStart(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -120,7 +120,7 @@ public class TitrationModuleService { /** * 预充结束 */ - public void preFillStop(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void preFillStop(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -148,7 +148,7 @@ public class TitrationModuleService { /** * 清洗开始 */ - public void cleanStart(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void cleanStart(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -176,7 +176,7 @@ public class TitrationModuleService { /** * 清洗结束 */ - public void cleanStop(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void cleanStop(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -204,7 +204,7 @@ public class TitrationModuleService { /** * 排空溶液开始 */ - public void drainStart(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void drainStart(MultipleModuleCode titrationModuleCode, Long solutionId) { Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { case Device.BRUSHLESS_PUMP_1 -> DeviceCommandGenerator.brushlessPump1BackwardRotate(); @@ -231,7 +231,7 @@ public class TitrationModuleService { /** * 排空结束 */ - public void drainStop(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public void drainStop(MultipleModuleCode titrationModuleCode, Long solutionId) { //找到泵 Device deviceCode = getPumpCode(titrationModuleCode, solutionId); DeviceCommand deviceCommand = switch (deviceCode) { @@ -259,7 +259,7 @@ public class TitrationModuleService { /** * 获取泵的code值 */ - public Device getPumpCode(MultipleModuleCode titrationModuleCode, Integer solutionId) { + public Device getPumpCode(MultipleModuleCode titrationModuleCode, Long solutionId) { Container container = containerService.getOne(new LambdaQueryWrapper<>(Container.class).eq(Container::getSolutionId, solutionId)); if (container != null) { Pump pump = pumpService.getOne(new LambdaQueryWrapper<>(Pump.class).eq(Pump::getContainerId, container.getId()).eq(Pump::getSolutionModule, titrationModuleCode.name())); diff --git a/src/main/java/com/iflytop/colortitration/common/model/entity/Container.java b/src/main/java/com/iflytop/colortitration/common/model/entity/Container.java index f34ffd4..b0e336d 100644 --- a/src/main/java/com/iflytop/colortitration/common/model/entity/Container.java +++ b/src/main/java/com/iflytop/colortitration/common/model/entity/Container.java @@ -16,7 +16,7 @@ public class Container extends BaseEntity { private String name; @Schema(description = "关联的溶液ID") - private Integer solutionId; + private Long solutionId; @Schema(description = "总容量") private Integer capacityTotal; diff --git a/src/main/java/com/iflytop/colortitration/common/service/CraftsService.java b/src/main/java/com/iflytop/colortitration/common/service/CraftsService.java index f72ddd6..c50afd1 100644 --- a/src/main/java/com/iflytop/colortitration/common/service/CraftsService.java +++ b/src/main/java/com/iflytop/colortitration/common/service/CraftsService.java @@ -3,8 +3,8 @@ package com.iflytop.colortitration.common.service; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.iflytop.colortitration.app.common.enums.TitrationStatus; +import com.iflytop.colortitration.app.core.crafts.CraftsContext; import com.iflytop.colortitration.app.core.crafts.CraftsDispatcher; -import com.iflytop.colortitration.app.core.crafts.CraftsJob; import com.iflytop.colortitration.app.core.state.DeviceState; import com.iflytop.colortitration.app.core.state.TubeState; import com.iflytop.colortitration.app.model.dto.SetCraftsDTO; @@ -40,7 +40,7 @@ public class CraftsService extends ServiceImpl { tubeState.setCraftsName(crafts.getName()); tubeState.setTitrationModuleCodes(startCraftsDTO.getModuleCodes()); - CraftsJob job = new CraftsJob(); + CraftsContext job = new CraftsContext(); job.setTubeNum(tubeNum); job.setCrafts(crafts); job.setSelectedModules(startCraftsDTO.getModuleCodes());