sige 2 years ago
parent
commit
21ec078a98
  1. 7
      src/main/java/com/dreamworks/boditech/controller/DeviceController.java
  2. 45
      src/main/java/com/dreamworks/boditech/controller/TestController.java
  3. 16
      src/main/java/com/dreamworks/boditech/driver/task/Executor.java
  4. 1
      src/main/java/com/dreamworks/boditech/driver/task/TaskTestEmergency.java
  5. 52
      src/main/java/com/dreamworks/boditech/driver/task/TaskTestRegular.java
  6. 80
      src/main/java/com/dreamworks/boditech/driver/task/TaskTestTubeRackPrepare.java
  7. 11
      src/main/java/com/dreamworks/boditech/entity/MdbTestTubeRackTestTaskTube.java
  8. 6
      src/main/java/com/dreamworks/boditech/mapper/TestMapper.java
  9. 6
      src/main/java/com/dreamworks/boditech/mapper/TestTubeRackTestTaskMapper.java
  10. 7
      src/main/java/com/dreamworks/boditech/mapper/TestTubeRackTestTaskTubeMapper.java
  11. 21
      src/main/java/com/dreamworks/boditech/service/DeviceService.java
  12. 50
      src/main/java/com/dreamworks/boditech/service/TestService.java

7
src/main/java/com/dreamworks/boditech/controller/DeviceController.java

@ -175,6 +175,11 @@ public class DeviceController extends BaseController {
@ResponseBody
@PostMapping("/api/device/init")
public ApiResponse init() {
if ( this.deviceService.device.enable ) {
this.deviceService.reset(false);
return this.success();
}
if ( initCount > 0 ) {
this.initCount --;
ApiResponse response = new ApiResponse();
@ -351,7 +356,6 @@ public class DeviceController extends BaseController {
}
@ResponseBody
@PostMapping("/api/device/test-tube-rack-status-get")
public ApiResponse testTubeRackStatusGet() {
@ -360,6 +364,7 @@ public class DeviceController extends BaseController {
List<Map<String,Object>> tasks = new ArrayList<>();
for ( int ti=0; ti<3; ti++ ) {
Map<String,Object> task = new HashMap<>();
task.put("projectColor", "red");
task.put("projectName", "hsCRP");
task.put("projectId", "01");
tasks.add(task);

45
src/main/java/com/dreamworks/boditech/controller/TestController.java

@ -48,18 +48,19 @@ public class TestController extends BaseController {
Map<String,Object> tubeItem = MyCommon.objectToMap(tube);
// attach projects to tube
String[] ids = tube.projectIds.isEmpty() ? new String[0] : tube.projectIds.split(",");
List<Integer> projectIds = new ArrayList<>();
if ( tube.projectIds.isEmpty() ) {
tube.projectIds = "[]";
}
List<Integer> projectIds = MyCommon.jsonToObject(tube.projectIds, List.class);
List<Map<String,Object>> projectList = new ArrayList<>();
for ( String id : ids ) {
Project project = this.projectService.activeProjectGetById(Integer.parseInt(id));
for ( Integer projectId : projectIds ) {
Project project = this.projectService.activeProjectGetById(projectId);
Map<String,Object> projectItem = MyCommon.objectToMap(project);
projectItem.remove("steps");
projectList.add(projectItem);
projectIds.add(Integer.parseInt(id));
}
tubeItem.put("projects", projectList);
tubeItem.put("projectIds", projectIds);
tubeItem.put("projectIds", projectIds.isEmpty() ? new ArrayList<>() : projectIds);
tubeList.add(tubeItem);
}
item.put("tubes", tubeList);
@ -136,4 +137,36 @@ public class TestController extends BaseController {
"list", list
));
}
@ResponseBody
@PostMapping("/api/test/test-tube-rack-status-get")
public ApiResponse testTubeRackStatusGet() {
MdbTestTubeRackTestTask task = this.testService.testTubeRackTaskCurrentGet();
if (null == task) {
return this.success(null);
}
Map<String, Object> rackTask = MyCommon.objectToMap(task);
List<MdbTestTubeRackTestTaskTube> tubes = this.testService.testTubeRackTaskTubeListByRackId(task.id);
List<Map<String, Object>> tubeList = new ArrayList<>();
for (MdbTestTubeRackTestTaskTube tube : tubes) {
Map<String, Object> tubeItem = MyCommon.objectToMap(tube);
// attach projects to tube
List<Integer> projectIds = MyCommon.jsonToObject(tube.projectIds, List.class);
List<Map<String, Object>> projectList = new ArrayList<>();
for (Integer projectId : projectIds) {
Project project = this.projectService.activeProjectGetById(projectId);
Map<String, Object> projectItem = MyCommon.objectToMap(project);
projectItem.remove("steps");
projectList.add(projectItem);
projectIds.add(projectId);
}
tubeItem.put("projects", projectList);
tubeItem.put("projectIds", projectIds);
tubeList.add(tubeItem);
}
rackTask.put("tubes", tubeList);
return this.success(rackTask);
}
}

16
src/main/java/com/dreamworks/boditech/driver/task/Executor.java

@ -171,6 +171,14 @@ public class Executor implements Runnable {
}
}
// append task
public void appendTask(Task task) {
synchronized (this.tasks) {
this.tasks.add(task);
this.tasks.notify();
}
}
@ -223,13 +231,7 @@ public class Executor implements Runnable {
return this.device;
}
// append task
public void appendTask(Task task) {
// synchronized (this.tasks) {
// this.tasks.add(task);
// this.tasks.notify();
// }
}
/**
* pause executor

1
src/main/java/com/dreamworks/boditech/driver/task/TaskTestEmergency.java

@ -16,6 +16,7 @@ public class TaskTestEmergency extends TaskTestBase {
this.taskExecutor.getDevice().testService.emergencyTaskStart(this.mdbTask);
// setup test info
test.barCode = this.mdbTask.barCode;
test.taskType = "emergency";
test.taskId = this.mdbTask.id;
test.lotCode = this.project.lotCode;

52
src/main/java/com/dreamworks/boditech/driver/task/TaskTestRegular.java

@ -4,41 +4,57 @@ import com.dreamworks.boditech.driver.actuator.ActMotor;
import com.dreamworks.boditech.driver.actuator.ActuatorModule;
import com.dreamworks.boditech.driver.consumable.CsmSampleTube;
import com.dreamworks.boditech.entity.MdbTest;
import com.dreamworks.boditech.entity.MdbTestTubeRackTestTask;
import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube;
public class TaskTestRegular extends TaskTestBase {
// tube index
public Integer tubeIndex;
// tube type
public String tubeType;
// blood type
public String bloodType;
// bar code
public String barcode;
// user id
public String patientCode;
// mdb test tube rack test task
private MdbTestTubeRackTestTask mdbTask;
// mdb test tube rack test task tube
private MdbTestTubeRackTestTaskTube tube;
// set mdb test tube rack test task
public void setMdbTestTubeRackTestTask(MdbTestTubeRackTestTask mdbTestTubeRackTestTask) {
this.mdbTask = mdbTestTubeRackTestTask;
}
// set mdb test tube rack test task tube
public void setMdbTestTubeRackTestTaskTube(MdbTestTubeRackTestTaskTube tube) {
this.tube = tube;
}
@Override
protected void beforeTaskExecute(MdbTest test) {
// setup test info
test.taskType = "regular";
test.barCode = this.tube.barCode;
test.taskId = this.mdbTask.id;
test.lotCode = this.project.lotCode;
test.projectId = this.project.id;
test.projectName = this.project.name;
test.tubeType = this.mdbTask.tubeType;
test.tubeIndex = this.tube.index;
test.sampleUid = this.tube.sampleUid;
test.sampleType = this.tube.sampleType;
if ( test.sampleType.isEmpty() ) {
// @TODO : 这里的SampleType为空的时候需要从LIS获取数据了 ~~~
throw new RuntimeException("sampleType is empty");
}
Device device = this.taskExecutor.getDevice();
ActMotor testTubeMoveMotor = (ActMotor)device.getActuator(ActuatorModule.TEST_TUBE_RACK_MOVE_MOTOR);
CsmSampleTube sampleTube = new CsmSampleTube(this.taskExecutor.getDevice());
sampleTube.type = this.tubeType;
sampleTube.type = test.tubeType;
sampleTube.taskType = CsmSampleTube.TASK_TYPE_REGULAR;
sampleTube.locationY = this.taskExecutor.getDevice().getLocationByName("testTubeRackTubeSampling.y");
sampleTube.locationX = this.taskExecutor.getDevice().getLocationByName("testTubeRackTubeSampling.x");
this.setSampleTube(sampleTube);
// setup test info
test.tubeType = this.tubeType;
// test.projectName = this.projectName;
test.sampleType = this.bloodType;
// test.patientCode = this.patientCode;
// move tube to sampling position
Integer samplingStartPos = device.getLocationByName("testTubeRackTubeSamplingStart");
Integer samplingDistance = device.getLocationByName("testTubeRackTubeSamplingDistance");
int samplingPos = samplingStartPos + samplingDistance * this.tubeIndex;
int samplingPos = samplingStartPos + samplingDistance * test.tubeIndex;
testTubeMoveMotor.moveTo(samplingPos);
}

80
src/main/java/com/dreamworks/boditech/driver/task/TaskTestTubeRackPrepare.java

@ -3,12 +3,32 @@ import com.dreamworks.boditech.driver.Device;
import com.dreamworks.boditech.driver.actuator.*;
import com.dreamworks.boditech.driver.entity.LisTestInfo;
import com.dreamworks.boditech.driver.entity.TaskBatchTubeTestInfo;
import com.dreamworks.boditech.entity.MdbTestTubeRackTestTask;
import com.dreamworks.boditech.entity.MdbTestTubeRackTestTaskTube;
import com.dreamworks.boditech.service.TestService;
import com.dreamworks.boditech.utils.MyCommon;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class TaskBatchTubePrepare extends TaskBase {
// tests
public List<TaskBatchTubeTestInfo> tests;
public class TaskTestTubeRackPrepare extends TaskBase {
// test service
private TestService testService;
// test tube rack test task
private MdbTestTubeRackTestTask mdbTask;
// test tube rack test task tubes
public void setTestService(TestService testService) {
this.testService = testService;
}
// set mdb test tube rack test task
public void setMdbTestTubeRackTestTask(MdbTestTubeRackTestTask mdbTestTubeRackTestTask) {
this.mdbTask = mdbTestTubeRackTestTask;
}
// device
private Device device;
// testTubeMovement
@ -20,6 +40,8 @@ public class TaskBatchTubePrepare extends TaskBase {
// testTubeBarcodes
private String[] testTubeBarcodes;
@Override
public void execute( Executor executor ) {
this.setStatus(Task.STATUS_EXECUTING);
@ -58,6 +80,11 @@ public class TaskBatchTubePrepare extends TaskBase {
this.testTubeBarcodes[i] = code;
}
if ( this.mdbTask.tubeType.isEmpty() ) {
// @TODO : 试管为空需要扫描试管架了
this.mdbTask.tubeType = "BloodTube5ml";
}
// 04. 扫描完成后推送到预备区域
testTubeMoveMotor.moveTo("testTubeRackStandby");
@ -70,39 +97,38 @@ public class TaskBatchTubePrepare extends TaskBase {
// 追加测试到执行器
private void appendTestTasksToExecutor(Executor executor) {
for ( TaskBatchTubeTestInfo test : this.tests ) {
if ( !this.testTubeExistsStatus[test.tubeIndex] ) {
List<MdbTestTubeRackTestTaskTube> tubes = this.testService.testTubeRackTaskTubeListByRackId(this.mdbTask.id);
for (MdbTestTubeRackTestTaskTube tube : tubes) {
if ( !this.testTubeExistsStatus[tube.index] ) {
continue;
}
String barCode = test.barcode;
if ( barCode.isEmpty() ) {
barCode = this.testTubeBarcodes[test.tubeIndex];
if ( tube.barCode.isEmpty() ) {
tube.barCode = this.testTubeBarcodes[tube.index];
}
// @TODO : 这里的SampleType为空的时候需要从LIS获取数据了 ~~~
// 获取LIS测试信息
LisTestInfo lisTestInfo = device.lis.requestTestInfo(barCode);
if ( null == lisTestInfo ) {
lisTestInfo = new LisTestInfo();
lisTestInfo.sampleType = "";
lisTestInfo.projectNames = new ArrayList<>();
}
lisTestInfo.sampleType = test.blood.isEmpty() ? lisTestInfo.sampleType : test.blood;
lisTestInfo.projectNames = test.projectNames.isEmpty() ? lisTestInfo.projectNames : test.projectNames;
// 追加测试任务
for ( String projectName : lisTestInfo.projectNames ) {
// LisTestInfo lisTestInfo = device.lis.requestTestInfo(barCode);
// if ( null == lisTestInfo ) {
// lisTestInfo = new LisTestInfo();
// lisTestInfo.sampleType = "";
// lisTestInfo.projectNames = new ArrayList<>();
// }
// lisTestInfo.sampleType = test.blood.isEmpty() ? lisTestInfo.sampleType : test.blood;
// lisTestInfo.projectNames = test.projectNames.isEmpty() ? lisTestInfo.projectNames : test.projectNames;
List<Integer> projectIds = (List<Integer>) MyCommon.jsonToObject(tube.projectIds, List.class);
for (Integer projectId : projectIds) {
TaskTestRegular task = new TaskTestRegular();
task.tubeIndex = test.tubeIndex;
task.patientCode = test.patientCode;
task.tubeType = test.testTube;
task.barcode = barCode;
// task.projectName = projectName;
task.bloodType = lisTestInfo.sampleType;
task.setMdbTestTubeRackTestTask(this.mdbTask);
task.setMdbTestTubeRackTestTaskTube(tube);
task.setProjectId(projectId);
executor.appendTask(task);
// Device.LOG.info("append test task: {}", task.projectName);
}
tube.status = MdbTestTubeRackTestTaskTube.STATUS_WAITING;
this.testService.testTubeRackTaskTubeStatusUpdate(tube);
}
}

11
src/main/java/com/dreamworks/boditech/entity/MdbTestTubeRackTestTaskTube.java

@ -1,5 +1,14 @@
package com.dreamworks.boditech.entity;
public class MdbTestTubeRackTestTaskTube {
// status : new
public final static String STATUS_NEW = "NEW";
// status : waiting
public final static String STATUS_WAITING = "WAITING";
// status : executing
public final static String STATUS_EXECUTING = "EXECUTING";
// status : finished
public final static String STATUS_FINISHED = "FINISHED";
// id
public Integer id;
// test tube rack test rack id
@ -20,4 +29,6 @@ public class MdbTestTubeRackTestTaskTube {
public String barCode;
// preprocess
public Boolean attenuation;
// status
public String status;
}

6
src/main/java/com/dreamworks/boditech/mapper/TestMapper.java

@ -8,9 +8,9 @@ import java.util.List;
@Mapper
public interface TestMapper {
@Insert("INSERT INTO bdt_tests (" +
"lotCode, taskType, taskId, sampleUid, projectId, projectName, sampleType, tubeType, startedAt, startedBy" +
"serialCode, barCode, lotCode, taskType, taskId, sampleUid, projectId, projectName, sampleType, tubeType, startedAt, startedBy" +
") VALUES (" +
"#{lotCode}, #{taskType}, #{taskId}, #{sampleUid}, #{projectId}, #{projectName}, #{sampleType}, #{tubeType}, #{startedAt}, #{startedBy}" +
"#{serialCode}, #{barCode}, #{lotCode}, #{taskType}, #{taskId}, #{sampleUid}, #{projectId}, #{projectName}, #{sampleType}, #{tubeType}, #{startedAt}, #{startedBy}" +
")")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
int insert(MdbTest test);
@ -34,8 +34,6 @@ public interface TestMapper {
Integer count(ParamTestSearch param);
@Update("UPDATE bdt_tests SET " +
"barCode = #{barCode}, " +
"serialCode = #{serialCode}, " +
"tubeIndex = #{tubeIndex}, " +
"incubateStartedAt = #{incubateStartedAt}, " +
"incubateTime = #{incubateTime}, " +

6
src/main/java/com/dreamworks/boditech/mapper/TestTubeRackTestTaskMapper.java

@ -40,4 +40,10 @@ public interface TestTubeRackTestTaskMapper {
@Delete("DELETE FROM btd_test_tube_rack_test_tasks WHERE id = #{id}")
void deleteById(Integer id);
@Select("SELECT * FROM btd_test_tube_rack_test_tasks WHERE status = 'WAITING' ORDER BY id ASC LIMIT 1")
MdbTestTubeRackTestTask findExecutableTask();
@Select("SELECT * FROM btd_test_tube_rack_test_tasks WHERE status = 'EXECUTING' ORDER BY id ASC LIMIT 1")
MdbTestTubeRackTestTask findCurrentTask();
}

7
src/main/java/com/dreamworks/boditech/mapper/TestTubeRackTestTaskTubeMapper.java

@ -7,9 +7,9 @@ import java.util.List;
@Mapper
public interface TestTubeRackTestTaskTubeMapper {
@Insert("INSERT INTO btd_test_tube_rack_test_task_tubes " +
"(rackId, `index`, projectDetectType, projectIds, sampleTypeDetectType, sampleType, sampleUid, barCode, attenuation) " +
"(rackId, `index`, projectDetectType, projectIds, sampleTypeDetectType, sampleType, sampleUid, barCode, attenuation, status) " +
"VALUES " +
"(#{rackId}, #{index}, #{projectDetectType}, #{projectIds}, #{sampleTypeDetectType}, #{sampleType}, #{sampleUid}, #{barCode}, #{attenuation})")
"(#{rackId}, #{index}, #{projectDetectType}, #{projectIds}, #{sampleTypeDetectType}, #{sampleType}, #{sampleUid}, #{barCode}, #{attenuation}, #{status})")
@Options(useGeneratedKeys=true, keyProperty="id", keyColumn="id")
void insert(MdbTestTubeRackTestTaskTube tube);
@ -18,4 +18,7 @@ public interface TestTubeRackTestTaskTubeMapper {
@Select("SELECT * FROM btd_test_tube_rack_test_task_tubes WHERE rackId = #{rackId} ORDER BY `index` ASC")
List<MdbTestTubeRackTestTaskTube> findAllByRackId(Integer rackId);
@Update("UPDATE btd_test_tube_rack_test_task_tubes SET status = #{status} WHERE id = #{id}")
void statusUpdate( MdbTestTubeRackTestTaskTube tube );
}

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

@ -4,8 +4,6 @@ import com.dreamworks.boditech.driver.consumable.*;
import com.dreamworks.boditech.driver.entity.*;
import com.dreamworks.boditech.driver.task.*;
import com.dreamworks.boditech.driver.task.TaskStopReset;
import com.dreamworks.boditech.entity.ParamTestEmergencyAppend;
import com.dreamworks.boditech.entity.Project;
import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSave;
import com.dreamworks.boditech.entity.parameter.ParamTestTubeRackTaskSaveTube;
import jakarta.annotation.Resource;
@ -208,25 +206,6 @@ public class DeviceService {
return new HashMap<>();
}
// regular task append
public void regularTaskAppend(ParamTestTubeRackTaskSave param) {
TaskBatchTubePrepare task = new TaskBatchTubePrepare();
task.tests = new ArrayList<>();
for (ParamTestTubeRackTaskSaveTube taskItem : param.tubes) {
TaskBatchTubeTestInfo test = new TaskBatchTubeTestInfo();
// test.tubeIndex = taskItem.tubeIndex;
// test.patientCode = taskItem.patientCode;
// test.barcode = taskItem.barCode;
// test.testTube = taskItem.tubeType;
// test.projectNames = taskItem.projectNames;
// test.blood = taskItem.bloodType;
task.tests.add(test);
}
this.taskAppend(task);
}
// append task
public void taskAppend(Task task) {
synchronized (this.tasks) {

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

@ -1,6 +1,8 @@
package com.dreamworks.boditech.service;
import com.dreamworks.boditech.driver.task.Task;
import com.dreamworks.boditech.driver.task.TaskTestEmergency;
import com.dreamworks.boditech.driver.task.TaskTestRegular;
import com.dreamworks.boditech.driver.task.TaskTestTubeRackPrepare;
import com.dreamworks.boditech.entity.*;
import com.dreamworks.boditech.entity.parameter.ParamEmergencyTaskSave;
import com.dreamworks.boditech.entity.parameter.ParamTestSearch;
@ -41,18 +43,30 @@ public class TestService {
// fetch task from database
public List<Task> fetchTask() {
// find emergency task first
MdbEmergencyTestTask test = this.emergencyTestTaskMapper.findExecutableTask();
if ( null != test ) {
List<Integer> projectIds = (List<Integer>)MyCommon.jsonToObject(test.projectIds, List.class);
// MdbEmergencyTestTask test = this.emergencyTestTaskMapper.findExecutableTask();
// if ( null != test ) {
// List<Integer> projectIds = (List<Integer>)MyCommon.jsonToObject(test.projectIds, List.class);
// List<Task> tasks = new ArrayList<>();
// for (Integer projectId : projectIds) {
// TaskTestEmergency task = new TaskTestEmergency();
// task.setMdbEmergencyTestTask(test);
// task.setProjectId(projectId);
// tasks.add(task);
// }
// return tasks;
// }
// find test tube rack task
MdbTestTubeRackTestTask rack = this.testTubeRackTestTaskMapper.findExecutableTask();
if ( null != rack ) {
List<Task> tasks = new ArrayList<>();
for (Integer projectId : projectIds) {
TaskTestEmergency task = new TaskTestEmergency();
task.setMdbEmergencyTestTask(test);
task.setProjectId(projectId);
tasks.add(task);
}
TaskTestTubeRackPrepare prepare = new TaskTestTubeRackPrepare();
prepare.setTestService(this);
prepare.setMdbTestTubeRackTestTask(rack);
tasks.add(prepare);
return tasks;
}
return new ArrayList<>();
}
@ -112,11 +126,8 @@ public class TestService {
item.sampleUid = tube.sampleUid;
item.barCode = tube.barCode;
item.attenuation = tube.attenuation;
List<String> projectIds = new ArrayList<>();
for (Integer projectId : tube.projectIds) {
projectIds.add(projectId.toString());
}
item.projectIds = String.join(",", projectIds);
item.projectIds = MyCommon.objectToJson(tube.projectIds);
item.status = MdbTestTubeRackTestTaskTube.STATUS_NEW;
this.testTubeRackTestTaskTubeMapper.insert(item);
}
}
@ -131,6 +142,11 @@ public class TestService {
return this.testTubeRackTestTaskTubeMapper.findAllByRackId(rackId);
}
// test tube rack task tube status update
public void testTubeRackTaskTubeStatusUpdate( MdbTestTubeRackTestTaskTube tube ) {
this.testTubeRackTestTaskTubeMapper.statusUpdate(tube);
}
// test tube rack task delete
public void testTubeRackTaskDeleteById(Integer id) {
this.actionLog.log("test-tube-rack-task.delete", id);
@ -153,6 +169,8 @@ public class TestService {
task.updatedAt = System.currentTimeMillis();
task.updatedBy = this.accountService.getCurrentAccountId();
this.testTubeRackTestTaskMapper.updateLock(task);
this.deviceService.getTaskExecutor().newTaskNotify();
}
// test tube rack task unlock
@ -224,6 +242,10 @@ public class TestService {
this.emergencyTestTaskMapper.executeCancel(task);
}
// test tube rack task current get
public MdbTestTubeRackTestTask testTubeRackTaskCurrentGet() {
return this.testTubeRackTestTaskMapper.findCurrentTask();
}

Loading…
Cancel
Save