|
|
@ -8,9 +8,7 @@ import com.iflytop.digester.underframework.dao.model.UfMdbOption; |
|
|
|
import com.iflytop.digester.underframework.dao.record.UfActiveRecord; |
|
|
|
import org.slf4j.Logger; |
|
|
|
import org.slf4j.LoggerFactory; |
|
|
|
|
|
|
|
import java.util.*; |
|
|
|
|
|
|
|
public class DigestionTaskThread extends Thread { |
|
|
|
// 任务完成回调 |
|
|
|
public interface FinishCallback { |
|
|
@ -148,6 +146,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
this.taskModel.save(); |
|
|
|
|
|
|
|
if ( "auto".equals(this.taskModel.mode) ) { |
|
|
|
this.lockLiquidPlate(); |
|
|
|
// 打开门 |
|
|
|
device.door.open(); |
|
|
|
// 等待放入试管架 |
|
|
@ -175,6 +174,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
|
|
|
|
// 搬运到加热转盘 |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
|
|
|
|
// 加热 |
|
|
|
for ( var heating : digestionRound.heatings ) { |
|
|
@ -184,6 +184,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
} |
|
|
|
|
|
|
|
// 移至加液区, 以便执行下一轮 |
|
|
|
this.lockLiquidPlate(); |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); |
|
|
|
this.updateTaskStatus("RoundFinish", "配置轮次执行结束"); |
|
|
|
} |
|
|
@ -204,6 +205,9 @@ public class DigestionTaskThread extends Thread { |
|
|
|
} |
|
|
|
this.updateTaskStatus("Liquid", "摇匀"); |
|
|
|
liquidAddition.shake(digestionRound.shakingCount); |
|
|
|
// 搬运到加热转盘 |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
|
|
|
|
// 预检查定时, 在结束前10分钟执行 |
|
|
|
Integer totalDurationCount = 0; |
|
|
@ -245,6 +249,10 @@ public class DigestionTaskThread extends Thread { |
|
|
|
this.updateTaskStatus("PreCheckWait", "预检完成"); |
|
|
|
} |
|
|
|
|
|
|
|
// 移动到加液盘准备取出 |
|
|
|
this.lockLiquidPlate(); |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); // 移动到加液盘 |
|
|
|
|
|
|
|
// 加水定容 |
|
|
|
if ( 0 < digestionRound.waterVolume ) { |
|
|
|
this.updateTaskStatus("Water", String.format("加水定容 : %d", digestionRound.waterVolume)); |
|
|
@ -253,12 +261,12 @@ public class DigestionTaskThread extends Thread { |
|
|
|
|
|
|
|
// 正常消解结束; |
|
|
|
this.updateTaskStatus("LastRound", "取出试管架"); |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); // 移动到加液盘 |
|
|
|
device.door.open(); // 打开门 |
|
|
|
this.waitForTubeRackTakeOut(); // 等待取出 |
|
|
|
device.door.close(); // 关闭门 |
|
|
|
this.heatingSlot.setTubeRackNo(null); // 释放加热位 |
|
|
|
this.updateTaskStatus("LastRound", "执行最后一轮配置结束"); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
} |
|
|
|
|
|
|
|
// 执行消解最后一轮预检查 |
|
|
@ -268,6 +276,8 @@ public class DigestionTaskThread extends Thread { |
|
|
|
|
|
|
|
// 检查试管 |
|
|
|
var device = Device.getInstance(); |
|
|
|
this.lockLiquidPlate(); |
|
|
|
|
|
|
|
// 移动到加液盘 |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(this.heatingSlot.index); |
|
|
|
// 拍照检查异常试管 |
|
|
@ -302,6 +312,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
|
|
|
|
// 将正常试管放入加热转盘 |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(this.heatingSlot.index); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
|
|
|
|
// 启动异常处理线程 |
|
|
|
DigestionTaskThread.this.errorProcessThread = new Thread(DigestionTaskThread.this::executeErrorProcess); |
|
|
@ -361,6 +372,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
this.updateTaskStatus("TubeCheck", String.format("取出剩余异常试管 : [%s]", errorTubeIndexes)); |
|
|
|
// 如果还存在异常, 则直接取出 |
|
|
|
var device = Device.getInstance(); |
|
|
|
this.lockLiquidPlate(); |
|
|
|
// 等待放入空试管架 |
|
|
|
device.door.open(); |
|
|
|
this.waitForEmptyTubeRackPutIn(); |
|
|
@ -377,6 +389,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
device.door.open(); |
|
|
|
this.waitForTubeRackTakeOut(); |
|
|
|
device.door.close(); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
} catch (InterruptedException e) { |
|
|
|
UfMdbNotification.error("消解异常处理失败 : " + e.getMessage()); |
|
|
|
this.updateTaskStatus("Error", String.format("消解异常处理失败 : %s", e.getMessage())); |
|
|
@ -399,6 +412,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
} |
|
|
|
|
|
|
|
this.updateTaskStatus("ErrorRound", "移动异常试管架至加液区"); |
|
|
|
this.lockLiquidPlate(); |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(errorSlot.index); |
|
|
|
|
|
|
|
var liquidAddition = device.liquidAddition; |
|
|
@ -412,6 +426,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
|
|
|
|
this.updateTaskStatus("ErrorRound", "移动异常试管架至加热区"); |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(errorSlot.index); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
|
|
|
|
for ( var heating : errorRound.heatings ) { |
|
|
|
this.updateTaskStatus("ErrorRoundHeating", String.format("异常加热 %d℃ %d分钟", heating.temperature, heating.duration)); |
|
|
@ -420,19 +435,21 @@ public class DigestionTaskThread extends Thread { |
|
|
|
} |
|
|
|
|
|
|
|
this.updateTaskStatus("ErrorRound", "移动异常试管架至加液区"); |
|
|
|
this.lockLiquidPlate(); |
|
|
|
device.transferArm.moveTubeRackToLiquidPlate(errorSlot.index); |
|
|
|
|
|
|
|
// 拍照检查是否存在消解完成的试管 |
|
|
|
this.executeErrorRoundTakeShotAndCheckFinishedTubes(); |
|
|
|
|
|
|
|
this.updateTaskStatus("ErrorRound", "移动异常试管架至加热区"); |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(errorSlot.index); |
|
|
|
|
|
|
|
// 如果不存在消解完成的试管则本轮次结束 |
|
|
|
if (this.finishedErrorTubeIndexes.isEmpty()) { |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
return ; |
|
|
|
} |
|
|
|
|
|
|
|
this.updateTaskStatus("ErrorRound", "移动异常试管架至加热区"); |
|
|
|
device.transferArm.moveTubeRackToHeatingTurntable(errorSlot.index); |
|
|
|
|
|
|
|
// 等待放入空试管架 |
|
|
|
device.door.open(); |
|
|
|
this.waitForEmptyTubeRackPutIn(); |
|
|
@ -446,6 +463,7 @@ public class DigestionTaskThread extends Thread { |
|
|
|
device.door.open(); |
|
|
|
this.waitForTubeRackTakeOut(); |
|
|
|
device.door.close(); |
|
|
|
this.unlockLiquidPlate(); |
|
|
|
|
|
|
|
// 更新异常试管索引列表 |
|
|
|
this.errorTubeIndexes.removeAll(this.finishedErrorTubeIndexes); |
|
|
@ -539,6 +557,31 @@ public class DigestionTaskThread extends Thread { |
|
|
|
this.updateTaskStatus("TubeRackTakeOutWaitDone", "试管架已取出"); |
|
|
|
} |
|
|
|
|
|
|
|
// 使用加液盘 |
|
|
|
private void lockLiquidPlate() { |
|
|
|
var lockName = this.taskModel.id; |
|
|
|
if ( "manual".equals(this.taskModel.mode) ) { |
|
|
|
lockName = this.taskModel.batchNo; |
|
|
|
} |
|
|
|
|
|
|
|
var device = Device.getInstance(); |
|
|
|
this.updateTaskStatus("WaitForLiquidPlate", "等待加液盘空闲"); |
|
|
|
device.liquidAddition.lockLiquidPlate(lockName); |
|
|
|
this.updateTaskStatus("WaitForLiquidPlate", "锁定加液盘"); |
|
|
|
} |
|
|
|
|
|
|
|
// 释放加液盘 |
|
|
|
private void unlockLiquidPlate() { |
|
|
|
var lockName = this.taskModel.id; |
|
|
|
if ( "manual".equals(this.taskModel.mode) ) { |
|
|
|
lockName = this.taskModel.batchNo; |
|
|
|
} |
|
|
|
|
|
|
|
var device = Device.getInstance(); |
|
|
|
this.updateTaskStatus("WaitForLiquidPlate", "释放加液盘"); |
|
|
|
device.liquidAddition.unlockLiquidPlate(lockName); |
|
|
|
} |
|
|
|
|
|
|
|
// 更新任务状态 |
|
|
|
private void updateTaskStatus(String status, String message) { |
|
|
|
LOG.info("[Digestion Task : {}] ({}) {}", taskModel.id, status, message); |
|
|
|