Browse Source

启动时关闭测试任务

tags/v0
sige 1 year ago
parent
commit
e69d5f5368
  1. BIN
      app.db
  2. 2
      pom.xml
  3. 1
      src/main/java/com/iflytop/a800/controller/TestController.java
  4. 2
      src/main/java/com/iflytop/a800/device/Pipette.java
  5. 8
      src/main/java/com/iflytop/a800/resource/TestCard.java
  6. 18
      src/main/java/com/iflytop/a800/task/TubeRackTask.java
  7. 101
      src/main/java/com/iflytop/a800/task/TubeTestTask.java
  8. 4
      src/main/resources/application.yml

BIN
app.db

2
pom.xml

@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>com.iflytop</groupId> <groupId>com.iflytop</groupId>
<artifactId>uf</artifactId> <artifactId>uf</artifactId>
<version>0.0.40</version>
<version>0.0.43</version>
</dependency> </dependency>
</dependencies> </dependencies>

1
src/main/java/com/iflytop/a800/controller/TestController.java

@ -104,6 +104,7 @@ public class TestController extends UfApiControllerBase {
tube.put("projectIds", UfJsonHelper.objectToJson(projectIds)); tube.put("projectIds", UfJsonHelper.objectToJson(projectIds));
var tubeModel = new MdbTubeRackTestTaskTube(); var tubeModel = new MdbTubeRackTestTaskTube();
tubeModel.rackId = task.id; tubeModel.rackId = task.id;
tubeModel.status = UfMdbDictItem.getValue("TUBE_STATUS", "NEW");
tubeModel.setAttributes(tube); tubeModel.setAttributes(tube);
tubeModel.save(); tubeModel.save();
} }

2
src/main/java/com/iflytop/a800/device/Pipette.java

@ -296,6 +296,8 @@ public class Pipette {
Double coefficient = UfMdbOption.getDouble("SampleTubeRackWB5mlTubeLiquidLevelFollowCoefficient"); Double coefficient = UfMdbOption.getDouble("SampleTubeRackWB5mlTubeLiquidLevelFollowCoefficient");
Integer depth = (int)(coefficient * volume); Integer depth = (int)(coefficient * volume);
this.aspirateWithLiquidLevelFollow(volume, depth); this.aspirateWithLiquidLevelFollow(volume, depth);
UfActuatorCmdExecutor.execute("ArmXY", "xymotor_move_to", "2385,3100,0");
} }
// 从全血3ml吸液 // 从全血3ml吸液

8
src/main/java/com/iflytop/a800/resource/TestCard.java

@ -1,5 +1,9 @@
package com.iflytop.a800.resource; package com.iflytop.a800.resource;
public class TestCard { public class TestCard {
public Integer boxIndex;
public String lotCode;
// box index inside warehouse
public Integer boxIndex = -1;
// lot code
public String lotCode = "";
// slot index in incubator
public Integer incubatorSlotIndex = -1;
} }

18
src/main/java/com/iflytop/a800/task/TubeRackTask.java

@ -41,15 +41,23 @@ public class TubeRackTask extends TaskBase {
tubeRack.tubes = new ArrayList<>(); tubeRack.tubes = new ArrayList<>();
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
var tube = new TestTube(); var tube = new TestTube();
tube.index = i;
var tubeModel = UfActiveRecord.findOne(
MdbTubeRackTestTaskTube.class,
Map.of("rackId", this.taskModel.id, "index", tube.index)
);
tube.isExisted = feeder.readIsTestTubeExisted(i); tube.isExisted = feeder.readIsTestTubeExisted(i);
if ( !tube.isExisted ) { if ( !tube.isExisted ) {
tubeModel.status = UfMdbDictItem.getValue("TUBE_STATUS", "IGNORED");
tubeModel.save();
continue ; continue ;
} }
tubeRack.tubes.add(tube); tubeRack.tubes.add(tube);
this.samplingTubes.add(tube); this.samplingTubes.add(tube);
tube.index = i;
tube.type = tubeRack.type; tube.type = tubeRack.type;
if ( !UfMdbDictItem.match("TUBE_TYPE","WB",tube.type) ) { if ( !UfMdbDictItem.match("TUBE_TYPE","WB",tube.type) ) {
continue; continue;
@ -60,18 +68,18 @@ public class TubeRackTask extends TaskBase {
tube.barCode = feeder.readBarCode(i); tube.barCode = feeder.readBarCode(i);
// 创建任务 // 创建任务
MdbTubeRackTestTaskTube tubeModel = UfActiveRecord.findOne(
MdbTubeRackTestTaskTube.class,
Map.of("rackId", this.taskModel.id, "index", tube.index)
);
for ( var projectId : tubeModel.getProjectIdList() ) { for ( var projectId : tubeModel.getProjectIdList() ) {
var project = UfActiveRecord.findOne(MdbProject.class, Map.of("id", projectId)); var project = UfActiveRecord.findOne(MdbProject.class, Map.of("id", projectId));
var testTask = new TubeTestTask(); var testTask = new TubeTestTask();
testTask.tube = tube; testTask.tube = tube;
testTask.project = project; testTask.project = project;
testTask.tubeModel = tubeModel;
testTask.on("TubeSamplingFinished", this::onTubeSamplingFinished); testTask.on("TubeSamplingFinished", this::onTubeSamplingFinished);
taskMan.append(testTask); taskMan.append(testTask);
} }
tubeModel.status = UfMdbDictItem.getValue("TUBE_STATUS", "WAITING");
tubeModel.save();
} }
if ( this.samplingTubes.isEmpty() ) { if ( this.samplingTubes.isEmpty() ) {

101
src/main/java/com/iflytop/a800/task/TubeTestTask.java

@ -7,8 +7,10 @@ import com.iflytop.a800.device.Device;
import com.iflytop.a800.model.MdbIdChip; import com.iflytop.a800.model.MdbIdChip;
import com.iflytop.a800.model.MdbProject; import com.iflytop.a800.model.MdbProject;
import com.iflytop.a800.model.MdbTest; import com.iflytop.a800.model.MdbTest;
import com.iflytop.a800.model.MdbTubeRackTestTaskTube;
import com.iflytop.a800.resource.*; import com.iflytop.a800.resource.*;
import com.iflytop.a800.utils.ScanResultAnalysisAlgo; import com.iflytop.a800.utils.ScanResultAnalysisAlgo;
import com.iflytop.uf.UfActiveRecord;
import com.iflytop.uf.UfActuatorCmdExecutor; import com.iflytop.uf.UfActuatorCmdExecutor;
import com.iflytop.uf.UfCmdSnippetExecutor; import com.iflytop.uf.UfCmdSnippetExecutor;
import com.iflytop.uf.model.UfMdbDictItem; import com.iflytop.uf.model.UfMdbDictItem;
@ -24,18 +26,28 @@ public class TubeTestTask extends TaskBase {
public TestTube tube; public TestTube tube;
// 测试项目 // 测试项目
public MdbProject project; public MdbProject project;
// 测试试管
public MdbTubeRackTestTaskTube tubeModel;
// 测试记录
private MdbTest test;
public TestTubeRack tubeRack; public TestTubeRack tubeRack;
public String status; public String status;
// 测试记录
private MdbTest test;
// 缓冲液试管 // 缓冲液试管
private BufferTube bufferTube; private BufferTube bufferTube;
// 大容量缓冲液试管 // 大容量缓冲液试管
private LargeBufferTube largeBufferTube; private LargeBufferTube largeBufferTube;
// 测试卡 // 测试卡
private TestCard testCard;
private TestCard testCard = null;
// id chip // id chip
private MdbIdChip idChip; private MdbIdChip idChip;
// 孵育槽位 // 孵育槽位
@ -46,7 +58,7 @@ public class TubeTestTask extends TaskBase {
var device = Device.getInstance(); var device = Device.getInstance();
// 申请测试卡 // 申请测试卡
this.testCard = device.testCard.alloc(this.project);
this.prepareTestcard();
// 缓冲液/探测物质 // 缓冲液/探测物质
this.bufferTube = device.bufferTube.alloc(this.testCard); this.bufferTube = device.bufferTube.alloc(this.testCard);
@ -58,8 +70,10 @@ public class TubeTestTask extends TaskBase {
// 测试记录 // 测试记录
this.test = new MdbTest(); this.test = new MdbTest();
this.test.tubeId = this.tubeModel.id;
this.test.projectCode = this.project.code; this.test.projectCode = this.project.code;
this.test.materialLotCode = this.testCard.lotCode; this.test.materialLotCode = this.testCard.lotCode;
this.test.isSamplingFinished = "no";
this.test.save(); this.test.save();
// 移动试管架 // 移动试管架
@ -85,14 +99,35 @@ public class TubeTestTask extends TaskBase {
))); )));
} }
// 申请测试卡
private void prepareTestcard() {
var device = Device.getInstance();
this.testCard = device.testCard.alloc(this.project);
this.log("测试卡:Box={}; Lot={}", this.testCard.boxIndex, this.testCard.lotCode);
var threadPushCardToSlot = new Thread(() -> {
this.log("测试卡推送至孵育盘 :开始");
this.incubatorSlot = device.incubator.pushNewCard(this.testCard);
this.testCard.incubatorSlotIndex = this.incubatorSlot.index;
this.log("测试卡推送至孵育盘 : 完成 -> Slot={}", this.testCard.incubatorSlotIndex);
synchronized ( this.testCard ) {
this.testCard.notifyAll();
}
});
threadPushCardToSlot.start();
}
// 记录日志 // 记录日志
private void log(String message, Object ... args ) { private void log(String message, Object ... args ) {
message = String.format("[TubeTestTask:T%d-P%s] %s", this.tube.index, this.test.projectCode, message);
message = String.format("[TubeTestTask:T%d-P%s] %s", this.tube.index, this.project.code, message);
LOG.info(message, args); LOG.info(message, args);
} }
@Override @Override
public void run() { public void run() {
this.tubeModel.status = UfMdbDictItem.getValue("TUBE_STATUS", "EXECUTING");
this.tubeModel.save();
this.prepare(); this.prepare();
ObjectMapper jsonMapper = new ObjectMapper(); ObjectMapper jsonMapper = new ObjectMapper();
@ -109,23 +144,45 @@ public class TubeTestTask extends TaskBase {
continue; continue;
} }
var stepAction = stepNode.get("action").asText();
switch ( stepAction ) {
case "shaking" : this.shake(stepNode); break;
case "uncap" : this.uncap(); break;
case "cap" : this.cap(); break;
case "puncture" : this.executeStepPuncture(stepNode); break;
case "aspirate" : this.executeStepAspirate(stepNode); break;
case "mixing" : this.executeStepMixing(stepNode); break;
case "drop-tip" : this.executeStepDropTip(stepNode); break;
case "incubate" : this.executeStepIncubate(stepNode); break;
case "analysis" : this.executeStepAnalysis(stepNode); break;
try {
var stepAction = stepNode.get("action").asText();
switch ( stepAction ) {
case "shaking" : this.shake(stepNode); break;
case "uncap" : this.uncap(); break;
case "cap" : this.cap(); break;
case "puncture" : this.executeStepPuncture(stepNode); break;
case "aspirate" : this.executeStepAspirate(stepNode); break;
case "mixing" : this.executeStepMixing(stepNode); break;
case "drop-tip" : this.executeStepDropTip(stepNode); break;
case "incubate" : this.executeStepIncubate(stepNode); break;
case "analysis" : this.executeStepAnalysis(stepNode); break;
case "sampling-done" : this.executeStepSamplingDone(stepNode); break;
}
} catch ( InterruptedException e ) {
throw new RuntimeException(e);
} }
} }
this.taskFinish(); this.taskFinish();
} }
// 采样完成
private void executeStepSamplingDone(JsonNode stepNode) {
this.log("采样完成");
this.test.isSamplingFinished = "yes";
this.test.save();
var doneSamplingCount = UfActiveRecord.count(MdbTest.class, Map.of(
"isSamplingFinished","yes",
"tubeId", this.tubeModel.id
));
if ( doneSamplingCount == this.tubeModel.getProjectIdList().size() ) {
this.log("试管采样结束");
this.tubeModel.status = UfMdbDictItem.getValue("TUBE_STATUS", "FINISHED");
this.tubeModel.save();
}
}
// 摇匀 // 摇匀
private void shake( JsonNode stepNode ) { private void shake( JsonNode stepNode ) {
int count = stepNode.get("count").asInt(); int count = stepNode.get("count").asInt();
@ -207,10 +264,16 @@ public class TubeTestTask extends TaskBase {
} }
// 孵育 // 孵育
private void executeStepIncubate( JsonNode stepNode ) {
Device device = Device.getInstance();
this.incubatorSlot = device.incubator.pushNewCard(this.testCard);
private void executeStepIncubate( JsonNode stepNode ) throws InterruptedException {
if ( -1 == this.testCard.incubatorSlotIndex ) {
synchronized ( this.testCard ) {
this.log("测试卡就绪等待");
this.testCard.wait();
this.log("测试卡就绪等待完成");
}
}
Device device = Device.getInstance();
var pipette = device.pipette; var pipette = device.pipette;
pipette.tipPickUp(); pipette.tipPickUp();

4
src/main/resources/application.yml

@ -1,3 +1,7 @@
spring: spring:
profiles: profiles:
active: dev active: dev
#mybatis:
# configuration:
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
Loading…
Cancel
Save