Browse Source

急诊任务追加&状态获取

master
sige 2 years ago
parent
commit
7b0271429d
  1. 87
      src/main/java/com/dreamworks/boditech/controller/DeviceController.java
  2. 34
      src/main/java/com/dreamworks/boditech/controller/TestController.java
  3. 14
      src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java
  4. 56
      src/main/java/com/dreamworks/boditech/driver/task/Executor.java
  5. 6
      src/main/java/com/dreamworks/boditech/driver/task/Task.java
  6. 12
      src/main/java/com/dreamworks/boditech/driver/task/TaskBase.java
  7. 2
      src/main/java/com/dreamworks/boditech/driver/task/TaskLoad.java
  8. 39
      src/main/java/com/dreamworks/boditech/entity/MdbEmergencyTestTask.java
  9. 22
      src/main/java/com/dreamworks/boditech/entity/parameter/ParamEmergencyTaskSave.java
  10. 26
      src/main/java/com/dreamworks/boditech/mapper/EmergencyTestTaskMapper.java
  11. 8
      src/main/java/com/dreamworks/boditech/service/DeviceService.java
  12. 49
      src/main/java/com/dreamworks/boditech/service/TestService.java
  13. 11
      src/main/java/com/dreamworks/boditech/utils/MyCommon.java

87
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()); 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 @ResponseBody
@PostMapping("/api/device/start") @PostMapping("/api/device/start")
@ -124,6 +113,24 @@ public class DeviceController extends BaseController {
return this.success(); 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()); 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();
}

34
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.MdbTestTubeRackTestTask;
import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube; import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube;
import com.dreamworks.boditech.entity.Project; import com.dreamworks.boditech.entity.Project;
import com.dreamworks.boditech.entity.parameter.ParamEmergencyTaskSave;
import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave; import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave;
import com.dreamworks.boditech.service.ProjectService; import com.dreamworks.boditech.service.ProjectService;
import com.dreamworks.boditech.service.TestService; import com.dreamworks.boditech.service.TestService;
@ -89,9 +90,31 @@ public class TestController extends BaseController {
return this.success(); return this.success();
} }
@ResponseBody
@PostMapping("/api/test/emergency-task-append")
public ApiResponse testEmergencyAppend( @RequestBody List<ParamEmergencyTaskSave> 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 @ResponseBody
@PostMapping("/api/test/emergency-append")
public ApiResponse testEmergencyAppend( @RequestBody Object param) {
// this.deviceService.testEmergencyAppend(param);
return this.success();
}
@ResponseBody
@PostMapping("/api/test/search") @PostMapping("/api/test/search")
public ApiResponse search( @RequestBody Map<String,Object> params ) { public ApiResponse search( @RequestBody Map<String,Object> params ) {
List<Map<String,Object>> list = new ArrayList<>(); List<Map<String,Object>> list = new ArrayList<>();

14
src/main/java/com/dreamworks/boditech/driver/consumable/CsmTestCardManager.java

@ -10,10 +10,13 @@ public class CsmTestCardManager {
private final Device device; private final Device device;
// list of test card boxes // list of test card boxes
private final List<CsmTestCardBox> testCardBoxes = new ArrayList<>(); private final List<CsmTestCardBox> testCardBoxes = new ArrayList<>();
// is loaded
private Boolean isLoaded = false;
// constructor // constructor
public CsmTestCardManager(Device device) { public CsmTestCardManager(Device device) {
this.device = device; this.device = device;
this.isLoaded = false;
for ( int i=0; i<6; i++ ) { for ( int i=0; i<6; i++ ) {
CsmTestCardBox box = new CsmTestCardBox(); CsmTestCardBox box = new CsmTestCardBox();
box.index = i; box.index = i;
@ -26,6 +29,11 @@ public class CsmTestCardManager {
return this.device; return this.device;
} }
// get is loaded
public Boolean getIsLoaded() {
return this.isLoaded;
}
// get test cards // get test cards
public List<CsmTestCardBox> getAllBoxes() { public List<CsmTestCardBox> getAllBoxes() {
return this.testCardBoxes; return this.testCardBoxes;
@ -33,6 +41,7 @@ public class CsmTestCardManager {
// clear all test cards // clear all test cards
public void clear() { public void clear() {
this.isLoaded = false;
this.testCardBoxes.clear(); this.testCardBoxes.clear();
for ( int i=0; i<6; i++ ) { for ( int i=0; i<6; i++ ) {
CsmTestCardBox box = new CsmTestCardBox(); CsmTestCardBox box = new CsmTestCardBox();
@ -81,6 +90,11 @@ public class CsmTestCardManager {
box.isLoaded = true; box.isLoaded = true;
} }
// done loading
public void doneLoading() {
this.isLoaded = true;
}

56
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_STOPPED = 0;
public static final Integer STATUS_RUNNING = 1; public static final Integer STATUS_RUNNING = 1;
public static final Integer STATUS_STOP_REQUEST = 2; 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 Device device;
private final List<Task> tasks; private final List<Task> tasks;
// executor status // executor status
private Integer status = Executor.STATUS_STOPPED; 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 * execute single task on device
@ -29,17 +36,29 @@ public class Executor implements Runnable {
task.execute(executor); task.execute(executor);
} }
/**
* constructor
* @param tasks tasks
* @param device device instance
*/
public Executor(List<Task> tasks, Device device ) { public Executor(List<Task> tasks, Device device ) {
this.tasks = tasks; this.tasks = tasks;
this.device = device; 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 // stop executor
@ -48,6 +67,15 @@ public class Executor implements Runnable {
this.tasks.notifyAll(); this.tasks.notifyAll();
} }
this.status = Executor.STATUS_STOP_REQUEST; this.status = Executor.STATUS_STOP_REQUEST;
this.workingStatus = "STOPPED";
}
/**
* get executor status
* @return executor status
*/
public Integer getStatus() {
return this.status;
} }
@Override @Override
@ -79,13 +107,31 @@ public class Executor implements Runnable {
private Task findExecutableTask() { private Task findExecutableTask() {
synchronized (this.tasks) { synchronized (this.tasks) {
if (this.tasks.isEmpty()) { if (this.tasks.isEmpty()) {
this.workingStatus = "WAIT_FOR_TUBE_RACK";
LOG.info("task executor wait for task ..."); LOG.info("task executor wait for task ...");
try { try {
this.tasks.wait(); this.tasks.wait();
} catch (InterruptedException e) { } 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 // find ready task first

6
src/main/java/com/dreamworks/boditech/driver/task/Task.java

@ -33,6 +33,12 @@ public interface Task {
*/ */
void setStatus(Integer status); void setStatus(Integer status);
// get is background task
Boolean getIsBackgroundTask();
// set is background task
void setIsBackgroundTask(Boolean isBackgroundTask);
/** /**
* execute task * execute task
* @param executor Executor * @param executor Executor

12
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 { abstract public class TaskBase implements Task {
// status // status
private Integer status = 0; private Integer status = 0;
// is background task
private Boolean isBackgroundTask = false;
// get status // get status
public Integer getStatus() { public Integer getStatus() {
@ -12,4 +14,14 @@ abstract public class TaskBase implements Task {
public void setStatus(Integer status) { public void setStatus(Integer status) {
this.status = 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;
}
} }

2
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(3, "4||CAGGB66U||2024.03.26||1279||06");
device.testCards.appendByBoxCode(4, "5||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.appendByBoxCode(5, "6||CAGGB66U||2024.03.26||1279||06");
device.testCards.doneLoading();
return ; return ;
} }
@ -56,6 +57,7 @@ public class TaskLoad extends TaskBase {
} }
device.testCards.appendByBoxCode(i, code); device.testCards.appendByBoxCode(i, code);
} }
device.testCards.doneLoading();
} }
// load buffer tube // load buffer tube

39
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;
}

22
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<Integer> 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;
}

26
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);
}

8
src/main/java/com/dreamworks/boditech/service/DeviceService.java

@ -39,6 +39,14 @@ public class DeviceService {
return Executor.STATUS_RUNNING.equals(this.taskExecutor.getStatus()); 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 * load consumable resources
*/ */

49
src/main/java/com/dreamworks/boditech/service/TestService.java

@ -1,14 +1,10 @@
package com.dreamworks.boditech.service; 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.ParamTestTubeRackTaskSave;
import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSaveTube; 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 jakarta.annotation.Resource;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@ -28,6 +24,8 @@ public class TestService {
@Resource @Resource
private TestTubeRackTestTaskTubeMapper testTubeRackTestTaskTubeMapper; private TestTubeRackTestTaskTubeMapper testTubeRackTestTaskTubeMapper;
@Resource @Resource
private EmergencyTestTaskMapper emergencyTestTaskMapper;
@Resource
@Lazy @Lazy
private AccountService accountService; private AccountService accountService;
@Resource @Resource
@ -149,6 +147,41 @@ public class TestService {
this.testTubeRackTestTaskMapper.updateLock(task); 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);
}

11
src/main/java/com/dreamworks/boditech/utils/MyCommon.java

@ -1,5 +1,6 @@
package com.dreamworks.boditech.utils; package com.dreamworks.boditech.utils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cglib.beans.BeanMap; import org.springframework.cglib.beans.BeanMap;
import java.lang.reflect.Field; import java.lang.reflect.Field;
@ -26,4 +27,14 @@ public class MyCommon {
} }
return map; 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);
}
}
} }
Loading…
Cancel
Save