From 7b0271429d3f177640737e04c2e1bc14ea057425 Mon Sep 17 00:00:00 2001 From: sige Date: Tue, 26 Dec 2023 16:55:35 +0800 Subject: [PATCH] =?UTF-8?q?=E6=80=A5=E8=AF=8A=E4=BB=BB=E5=8A=A1=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0&=E7=8A=B6=E6=80=81=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../boditech/controller/DeviceController.java | 87 ++++++++-------------- .../boditech/controller/TestController.java | 34 ++++++--- .../driver/consumable/CsmTestCardManager.java | 14 ++++ .../dreamworks/boditech/driver/task/Executor.java | 56 ++++++++++++-- .../com/dreamworks/boditech/driver/task/Task.java | 6 ++ .../dreamworks/boditech/driver/task/TaskBase.java | 12 +++ .../dreamworks/boditech/driver/task/TaskLoad.java | 2 + .../boditech/entity/MdbEmergencyTestTask.java | 39 ++++++++++ .../entity/parameter/ParamEmergencyTaskSave.java | 22 ++++++ .../boditech/mapper/EmergencyTestTaskMapper.java | 26 +++++++ .../dreamworks/boditech/service/DeviceService.java | 8 ++ .../dreamworks/boditech/service/TestService.java | 49 ++++++++++-- .../com/dreamworks/boditech/utils/MyCommon.java | 11 +++ 13 files changed, 287 insertions(+), 79 deletions(-) create mode 100644 src/main/java/com/dreamworks/boditech/entity/MdbEmergencyTestTask.java create mode 100644 src/main/java/com/dreamworks/boditech/entity/parameter/ParamEmergencyTaskSave.java create mode 100644 src/main/java/com/dreamworks/boditech/mapper/EmergencyTestTaskMapper.java diff --git a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java b/src/main/java/com/dreamworks/boditech/controller/DeviceController.java index 8d4a5b6..66a97ed 100644 --- a/src/main/java/com/dreamworks/boditech/controller/DeviceController.java +++ b/src/main/java/com/dreamworks/boditech/controller/DeviceController.java @@ -93,29 +93,18 @@ public class DeviceController extends BaseController { return this.success(this.deviceService.device.pipetteTips.getAll()); } - - - - - - - - - - - - - - - - - - - - - - - + @ResponseBody + @PostMapping("/api/device/status-get") + public ApiResponse status() { + String status = "READY"; + if ( this.deviceService.device.testCards.getIsLoaded() ) { + status = "CONSUMABLES_LOADED"; + } + if ( this.deviceService.isExecutorRunning() ) { + status = this.deviceService.getExecutorWorkingStatus(); + } + return this.success(Map.of("status", status)); + } @ResponseBody @PostMapping("/api/device/start") @@ -124,6 +113,24 @@ public class DeviceController extends BaseController { return this.success(); } + @ResponseBody + @PostMapping("/api/device/stop") + public ApiResponse stop() { +// this.deviceService.stop(); + return this.success(); + } + + @ResponseBody + @PostMapping("/api/device/pause") + public ApiResponse pause() { + return this.success(); + } + + @ResponseBody + @PostMapping("/api/device/resume") + public ApiResponse resume() { + return this.success(); + } @@ -288,41 +295,7 @@ public class DeviceController extends BaseController { return this.success(this.deviceService.device.largeBufferTubes.getAll()); } - @ResponseBody - @PostMapping("/api/device/emergency-slot-status-get") - public ApiResponse emergencySlotStatusGet() { - return this.success(Map.of( - "slotA", Map.of("status","EMPTY"), - "slotB", Map.of("status","EMPTY") - )); - } - - @ResponseBody - @PostMapping("/api/device/status-get") - public ApiResponse status() { - return this.success(Map.of( - "status", "WAIT_FOR_TUBE_RACK" - )); - } - - @ResponseBody - @PostMapping("/api/device/stop") - public ApiResponse stop() { -// this.deviceService.stop(); - return this.success(); - } - @ResponseBody - @PostMapping("/api/device/pause") - public ApiResponse pause() { - return this.success(); - } - - @ResponseBody - @PostMapping("/api/device/resume") - public ApiResponse resume() { - return this.success(); - } diff --git a/src/main/java/com/dreamworks/boditech/controller/TestController.java b/src/main/java/com/dreamworks/boditech/controller/TestController.java index ac5b882..8cb791d 100644 --- a/src/main/java/com/dreamworks/boditech/controller/TestController.java +++ b/src/main/java/com/dreamworks/boditech/controller/TestController.java @@ -3,6 +3,7 @@ import com.dreamworks.boditech.controller.entity.ApiResponse; import com.dreamworks.boditech.entity.MdbTestTubeRackTestTask; import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube; import com.dreamworks.boditech.entity.Project; +import com.dreamworks.boditech.entity.parameter.ParamEmergencyTaskSave; import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave; import com.dreamworks.boditech.service.ProjectService; import com.dreamworks.boditech.service.TestService; @@ -89,9 +90,31 @@ public class TestController extends BaseController { return this.success(); } + @ResponseBody + @PostMapping("/api/test/emergency-task-append") + public ApiResponse testEmergencyAppend( @RequestBody List param) { + for ( ParamEmergencyTaskSave item : param ) { + this.testService.emergencyTaskSave(item); + } + return this.success(); + } - - + @ResponseBody + @PostMapping("/api/test/emergency-slot-status-get") + public ApiResponse emergencySlotStatusGet() { + String slot0Status = this.testService.emergencyTaskStatusGet(0); + if ( null == slot0Status ) { + slot0Status = "EMPTY"; + } + String slot1Status = this.testService.emergencyTaskStatusGet(1); + if ( null == slot1Status ) { + slot1Status = "EMPTY"; + } + return this.success(List.of( + Map.of("index","0","status",slot0Status), + Map.of("index","1","status",slot1Status) + )); + } @@ -122,13 +145,6 @@ public class TestController extends BaseController { } @ResponseBody - @PostMapping("/api/test/emergency-append") - public ApiResponse testEmergencyAppend( @RequestBody Object param) { - // this.deviceService.testEmergencyAppend(param); - return this.success(); - } - - @ResponseBody @PostMapping("/api/test/search") public ApiResponse search( @RequestBody Map params ) { List> list = new ArrayList<>(); diff --git a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java index 430c50f..9b34544 100644 --- a/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java +++ b/src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java @@ -10,10 +10,13 @@ public class CsmTestCardManager { private final Device device; // list of test card boxes private final List testCardBoxes = new ArrayList<>(); + // is loaded + private Boolean isLoaded = false; // constructor public CsmTestCardManager(Device device) { this.device = device; + this.isLoaded = false; for ( int i=0; i<6; i++ ) { CsmTestCardBox box = new CsmTestCardBox(); box.index = i; @@ -26,6 +29,11 @@ public class CsmTestCardManager { return this.device; } + // get is loaded + public Boolean getIsLoaded() { + return this.isLoaded; + } + // get test cards public List getAllBoxes() { return this.testCardBoxes; @@ -33,6 +41,7 @@ public class CsmTestCardManager { // clear all test cards public void clear() { + this.isLoaded = false; this.testCardBoxes.clear(); for ( int i=0; i<6; i++ ) { CsmTestCardBox box = new CsmTestCardBox(); @@ -81,6 +90,11 @@ public class CsmTestCardManager { box.isLoaded = true; } + // done loading + public void doneLoading() { + this.isLoaded = true; + } + diff --git a/src/main/java/com/dreamworks/boditech/driver/task/Executor.java b/src/main/java/com/dreamworks/boditech/driver/task/Executor.java index db82386..42c3ec7 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/Executor.java +++ b/src/main/java/com/dreamworks/boditech/driver/task/Executor.java @@ -12,11 +12,18 @@ public class Executor implements Runnable { public static final Integer STATUS_STOPPED = 0; public static final Integer STATUS_RUNNING = 1; public static final Integer STATUS_STOP_REQUEST = 2; + public static final Integer STATUS_PAUSED = 3; + public static final Integer STATUS_PAUSE_REQUEST = 4; private final Device device; private final List tasks; // executor status private Integer status = Executor.STATUS_STOPPED; + // executor status lock + private final Object statusLock = new Object(); + + // working status + public String workingStatus = "WAIT_FOR_TUBE_RACK"; /** * execute single task on device @@ -29,17 +36,29 @@ public class Executor implements Runnable { task.execute(executor); } + /** + * constructor + * @param tasks tasks + * @param device device instance + */ public Executor(List tasks, Device device ) { this.tasks = tasks; this.device = device; } /** - * get executor status - * @return executor status + * pause executor */ - public Integer getStatus() { - return this.status; + public void pause() { + synchronized (this.tasks) { + this.tasks.notifyAll(); + } + this.status = Executor.STATUS_PAUSE_REQUEST; + try { + this.statusLock.wait(); + } catch (InterruptedException e) { + e.printStackTrace(); + } } // stop executor @@ -48,6 +67,15 @@ public class Executor implements Runnable { this.tasks.notifyAll(); } this.status = Executor.STATUS_STOP_REQUEST; + this.workingStatus = "STOPPED"; + } + + /** + * get executor status + * @return executor status + */ + public Integer getStatus() { + return this.status; } @Override @@ -79,13 +107,31 @@ public class Executor implements Runnable { private Task findExecutableTask() { synchronized (this.tasks) { if (this.tasks.isEmpty()) { + this.workingStatus = "WAIT_FOR_TUBE_RACK"; LOG.info("task executor wait for task ..."); try { this.tasks.wait(); } catch (InterruptedException e) { - e.printStackTrace(); + return null; + } + } + } + + if ( Executor.STATUS_PAUSE_REQUEST.equals(this.status) ) { + this.status = Executor.STATUS_PAUSED; + this.workingStatus = "PAUSED"; + this.statusLock.notifyAll(); + } + + // find background task if executor paused + if ( Executor.STATUS_PAUSED.equals(this.status) ) { + for ( Task task : this.tasks ) { + if ( task.getIsBackgroundTask() + && Objects.equals(task.getStatus(), Task.STATUS_READY)) { + return task; } } + return null; } // find ready task first diff --git a/src/main/java/com/dreamworks/boditech/driver/task/Task.java b/src/main/java/com/dreamworks/boditech/driver/task/Task.java index f51d598..d88151f 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/Task.java +++ b/src/main/java/com/dreamworks/boditech/driver/task/Task.java @@ -33,6 +33,12 @@ public interface Task { */ void setStatus(Integer status); + // get is background task + Boolean getIsBackgroundTask(); + + // set is background task + void setIsBackgroundTask(Boolean isBackgroundTask); + /** * execute task * @param executor Executor diff --git a/src/main/java/com/dreamworks/boditech/driver/task/TaskBase.java b/src/main/java/com/dreamworks/boditech/driver/task/TaskBase.java index f663426..4749e6a 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/TaskBase.java +++ b/src/main/java/com/dreamworks/boditech/driver/task/TaskBase.java @@ -2,6 +2,8 @@ package com.dreamworks.boditech.driver.task; abstract public class TaskBase implements Task { // status private Integer status = 0; + // is background task + private Boolean isBackgroundTask = false; // get status public Integer getStatus() { @@ -12,4 +14,14 @@ abstract public class TaskBase implements Task { public void setStatus(Integer status) { this.status = status; } + + // get is background task + public Boolean getIsBackgroundTask() { + return this.isBackgroundTask; + } + + // set is background task + public void setIsBackgroundTask(Boolean isBackgroundTask) { + this.isBackgroundTask = isBackgroundTask; + } } diff --git a/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java b/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java index a9c1853..c1507d3 100644 --- a/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java +++ b/src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java @@ -34,6 +34,7 @@ public class TaskLoad extends TaskBase { device.testCards.appendByBoxCode(3, "4||CAGGB66U||2024.03.26||1279||06"); device.testCards.appendByBoxCode(4, "5||CAGGB66U||2024.03.26||1279||06"); device.testCards.appendByBoxCode(5, "6||CAGGB66U||2024.03.26||1279||06"); + device.testCards.doneLoading(); return ; } @@ -56,6 +57,7 @@ public class TaskLoad extends TaskBase { } device.testCards.appendByBoxCode(i, code); } + device.testCards.doneLoading(); } // load buffer tube diff --git a/src/main/java/com/dreamworks/boditech/entity/MdbEmergencyTestTask.java b/src/main/java/com/dreamworks/boditech/entity/MdbEmergencyTestTask.java new file mode 100644 index 0000000..955b2bb --- /dev/null +++ b/src/main/java/com/dreamworks/boditech/entity/MdbEmergencyTestTask.java @@ -0,0 +1,39 @@ +package com.dreamworks.boditech.entity; +public class MdbEmergencyTestTask { + // id + public Integer id; + // index of slot + public Integer index; + // enable + public Boolean enable; + // is slot locked + public Boolean isSlotLocked; + // status + public String status; + // project detect type + public String projectDetectType; + // project ids + public String projectIds; + // sample type detect type + public String sampleTypeDetectType; + // sample type + public String sampleType; + // sample uid + public String sampleUid; + // bar code + public String barCode; + // preprocess + public Boolean attenuation; + // created at + public Long createdAt; + // created by + public Integer createdBy; + // updated at + public Long updatedAt; + // updated by + public Integer updatedBy; + // exec started at + public Long execStartedAt; + // exec finished at + public Long execFinishedAt; +} diff --git a/src/main/java/com/dreamworks/boditech/entity/parameter/ParamEmergencyTaskSave.java b/src/main/java/com/dreamworks/boditech/entity/parameter/ParamEmergencyTaskSave.java new file mode 100644 index 0000000..69303e2 --- /dev/null +++ b/src/main/java/com/dreamworks/boditech/entity/parameter/ParamEmergencyTaskSave.java @@ -0,0 +1,22 @@ +package com.dreamworks.boditech.entity.parameter; +import java.util.List; +public class ParamEmergencyTaskSave { + // index of slot + public Integer index; + // enable + public Boolean enable; + // project detect type + public String projectDetectType; + // project ids + public List projectIds; + // sample type detect type + public String sampleTypeDetectType; + // sample type + public String sampleType; + // sample uid + public String sampleUid; + // bar code + public String barCode; + // preprocess + public Boolean attenuation; +} diff --git a/src/main/java/com/dreamworks/boditech/mapper/EmergencyTestTaskMapper.java b/src/main/java/com/dreamworks/boditech/mapper/EmergencyTestTaskMapper.java new file mode 100644 index 0000000..eed6817 --- /dev/null +++ b/src/main/java/com/dreamworks/boditech/mapper/EmergencyTestTaskMapper.java @@ -0,0 +1,26 @@ +package com.dreamworks.boditech.mapper; +import com.dreamworks.boditech.entity.MdbEmergencyTestTask; +import org.apache.ibatis.annotations.*; + +@Mapper +public interface EmergencyTestTaskMapper { + @Select("SELECT * FROM bdt_emergency_test_tasks WHERE id = #{id}") + MdbEmergencyTestTask findById(Integer id); + + @Insert("INSERT INTO bdt_emergency_test_tasks " + + "(" + + "`index`, enable, projectDetectType, projectIds, sampleTypeDetectType, sampleType, " + + "sampleUid, barCode, attenuation, createdAt, createdBy, isSlotLocked, status" + + ") " + + "VALUES " + + "(" + + "#{index}, #{enable}, #{projectDetectType}, #{projectIds}, #{sampleTypeDetectType}, #{sampleType}, " + + "#{sampleUid}, #{barCode}, #{attenuation}, #{createdAt}, #{createdBy}, #{isSlotLocked}, #{status}" + + ")" + ) + @Options(useGeneratedKeys = true, keyProperty = "id") + void insert(MdbEmergencyTestTask task); + + @Select("SELECT status FROM bdt_emergency_test_tasks WHERE `index` = #{slotIndex} AND isSlotLocked = 1 ORDER BY id DESC LIMIT 1") + String emergencyTaskStatusGet(Integer slotIndex); +} diff --git a/src/main/java/com/dreamworks/boditech/service/DeviceService.java b/src/main/java/com/dreamworks/boditech/service/DeviceService.java index f18d3a0..a6fb4f6 100644 --- a/src/main/java/com/dreamworks/boditech/service/DeviceService.java +++ b/src/main/java/com/dreamworks/boditech/service/DeviceService.java @@ -39,6 +39,14 @@ public class DeviceService { return Executor.STATUS_RUNNING.equals(this.taskExecutor.getStatus()); } + // get executor working status + public String getExecutorWorkingStatus() { + if ( null == this.taskExecutor ) { + return null; + } + return this.taskExecutor.workingStatus; + } + /** * load consumable resources */ diff --git a/src/main/java/com/dreamworks/boditech/service/TestService.java b/src/main/java/com/dreamworks/boditech/service/TestService.java index 6566434..d6bc387 100644 --- a/src/main/java/com/dreamworks/boditech/service/TestService.java +++ b/src/main/java/com/dreamworks/boditech/service/TestService.java @@ -1,14 +1,10 @@ package com.dreamworks.boditech.service; -import com.dreamworks.boditech.entity.MdbTestTubeRackTestTask; -import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube; -import com.dreamworks.boditech.entity.Test; -import com.dreamworks.boditech.entity.TestStepLogEntry; +import com.dreamworks.boditech.entity.*; +import com.dreamworks.boditech.entity.parameter.ParamEmergencyTaskSave; import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave; import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSaveTube; -import com.dreamworks.boditech.mapper.TestMapper; -import com.dreamworks.boditech.mapper.TestStepMapper; -import com.dreamworks.boditech.mapper.TestTubeRackTestTaskMapper; -import com.dreamworks.boditech.mapper.TestTubeRackTestTaskTubeMapper; +import com.dreamworks.boditech.mapper.*; +import com.dreamworks.boditech.utils.MyCommon; import jakarta.annotation.Resource; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; @@ -28,6 +24,8 @@ public class TestService { @Resource private TestTubeRackTestTaskTubeMapper testTubeRackTestTaskTubeMapper; @Resource + private EmergencyTestTaskMapper emergencyTestTaskMapper; + @Resource @Lazy private AccountService accountService; @Resource @@ -149,6 +147,41 @@ public class TestService { this.testTubeRackTestTaskMapper.updateLock(task); } + // emergency task save + public void emergencyTaskSave(ParamEmergencyTaskSave param) { + MdbEmergencyTestTask task = new MdbEmergencyTestTask(); + task.index = param.index; + task.enable = param.enable; + task.isSlotLocked = true; + task.projectDetectType = param.projectDetectType; + task.sampleTypeDetectType = param.sampleTypeDetectType; + task.sampleType = param.sampleType; + task.sampleUid = param.sampleUid; + task.barCode = param.barCode; + task.attenuation = param.attenuation; + task.updatedAt = System.currentTimeMillis(); + task.updatedBy = this.accountService.getCurrentAccountId(); + task.projectIds = MyCommon.objectToJson(param.projectIds); + task.status = "WAITING"; + task.createdAt = System.currentTimeMillis(); + task.createdBy = this.accountService.getCurrentAccountId(); + this.emergencyTestTaskMapper.insert(task); + } + + // emergency task status get + public String emergencyTaskStatusGet(Integer slotIndex) { + return this.emergencyTestTaskMapper.emergencyTaskStatusGet(slotIndex); + } + + + + + + + + + + diff --git a/src/main/java/com/dreamworks/boditech/utils/MyCommon.java b/src/main/java/com/dreamworks/boditech/utils/MyCommon.java index 6266794..3d079f6 100644 --- a/src/main/java/com/dreamworks/boditech/utils/MyCommon.java +++ b/src/main/java/com/dreamworks/boditech/utils/MyCommon.java @@ -1,5 +1,6 @@ package com.dreamworks.boditech.utils; +import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cglib.beans.BeanMap; import java.lang.reflect.Field; @@ -26,4 +27,14 @@ public class MyCommon { } return map; } + + // object to json + public static String objectToJson( Object obj ) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(obj); + } catch (Exception e) { + throw new RuntimeException(e); + } + } }