sige 1 year ago
parent
commit
eaedeec117
  1. 33
      src/src/main/java/com/my/graphiteDigesterBg/step/StepChecking.java
  2. 24
      src/src/main/java/com/my/graphiteDigesterBg/step/StepExecuteErrorTask.java
  3. 33
      src/src/main/java/com/my/graphiteDigesterBg/step/StepMoveErrorTubesToErrorSlot.java
  4. 5
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
  5. 40
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskErrorDigestion.java
  6. 37
      src/web/src/pages/main/contents/TaskStepManagement.vue

33
src/src/main/java/com/my/graphiteDigesterBg/step/StepChecking.java

@ -0,0 +1,33 @@
package com.my.graphiteDigesterBg.step;
import com.my.graphiteDigesterBg.diframe.*;
import com.my.graphiteDigesterBg.diframe.model.DiMdbNotification;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
import com.my.graphiteDigesterBg.task.TaskDigestion;
import java.util.LinkedHashMap;
import java.util.List;
@TaskStep(name="Checking")
public class StepChecking extends DiTaskStepBase {
@Override
public void run() {
var task = (TaskDigestion)this.getTask();
var slot = task.getSlot();
if (!ResHeatingTubeRackSlot.LOCATION_LIQUID_PLATE.equals(slot.rackPosition)) {
task.throwException("试管架尚未移至加液区域,无法执行检测操作");
return;
}
DiMdbNotification.taskAction(task,"TaskDigestionStepChecking");
var action = task.waitAction("TaskDigestionStepChecking");
task.errorTubeIndexes = action.getResult(List.class);
}
// action done
public void actionDone( LinkedHashMap<String,Object> params ) {
var task = (TaskDigestion)this.getTask();
var action = task.getAction("TaskDigestionStepChecking");
Object tubes = params.get("tubes");
action.finish(tubes);
}
}

24
src/src/main/java/com/my/graphiteDigesterBg/step/StepExecuteErrorTask.java

@ -0,0 +1,24 @@
package com.my.graphiteDigesterBg.step;
import com.my.graphiteDigesterBg.diframe.*;
import com.my.graphiteDigesterBg.task.TaskDigestion;
import java.util.Map;
@TaskStep(name="ExecuteErrorTask")
public class StepExecuteErrorTask extends DiTaskStepBase {
// duration in minutes
public Integer errorTaskId;
@Override
public void run() {
var task = (TaskDigestion)this.getTask();
DiTaskManager taskManager = task.getDevice().getTaskManager();
DiTask errorTask = taskManager.generateTask("ErrorDigestion", Map.of(
"id", this.errorTaskId,
"errorTubes", task.errorRackTubeIndexes
));
errorTask.setUser(task.getUser());
errorTask.prepare();
errorTask.init();
DiTaskExecutor executor = task.getDevice().getTaskManager().getExecutor();
executor.appendTask(errorTask);
}
}

33
src/src/main/java/com/my/graphiteDigesterBg/step/StepMoveErrorTubesToErrorSlot.java

@ -0,0 +1,33 @@
package com.my.graphiteDigesterBg.step;
import com.my.graphiteDigesterBg.diframe.DiTaskStepBase;
import com.my.graphiteDigesterBg.diframe.TaskStep;
import com.my.graphiteDigesterBg.move.MoveTubeToErrorRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import com.my.graphiteDigesterBg.task.TaskDigestion;
@TaskStep(name="MoveErrorTubesToErrorSlot")
public class StepMoveErrorTubesToErrorSlot extends DiTaskStepBase {
@Override
public void run() {
var task = (TaskDigestion)this.getTask();
var slot = task.getSlot();
var errorTubes = task.errorTubeIndexes;
var slotMan = task.getResourceManager(ResHeatingTubeRackSlotManager.class);
var errorSlot = slotMan.getErrorSlot();
var emptyTubeIndexList = errorSlot.allocEmptyTubeIndexes(errorTubes.size());
task.errorRackTubeIndexes = emptyTubeIndexList;
// move error tubes to error rack
for (int i = 0; i < errorTubes.size(); i++) {
var move = new MoveTubeToErrorRackSlot();
move.setDevice(task.getDevice());
move.srcSlotIndex = slot.index;
move.srcTubeIndex = (Integer)errorTubes.get(i);
move.errorTubeIndex = emptyTubeIndexList.get(i);
move.run();
}
throw new RuntimeException("无法正常加液");
// @TODO: 取出收需要标记响应位置为空 不然后面加液会出错 ~~~
}
}

5
src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java

@ -7,6 +7,7 @@ import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import java.util.List;
import java.util.Map;
@Task(name="Digestion")
public class TaskDigestion extends DiTaskStepTaskBase {
@ -14,6 +15,10 @@ public class TaskDigestion extends DiTaskStepTaskBase {
public Integer id;
// slot index
public Integer slotIndex;
// list of error tubes
public List<Integer> errorTubeIndexes;
// list of error rack tubes
public List<Integer> errorRackTubeIndexes;
// slot
private ResHeatingTubeRackSlot slot;

40
src/src/main/java/com/my/graphiteDigesterBg/task/TaskErrorDigestion.java

@ -0,0 +1,40 @@
package com.my.graphiteDigesterBg.task;
import com.my.graphiteDigesterBg.diframe.DiActiveRecord;
import com.my.graphiteDigesterBg.diframe.DiTaskStepTaskBase;
import com.my.graphiteDigesterBg.diframe.Task;
import com.my.graphiteDigesterBg.model.MdbDigestionTask;
import com.my.graphiteDigesterBg.model.MdbOperationLog;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot;
import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager;
import java.util.List;
@Task(name="ErrorDigestion")
public class TaskErrorDigestion extends DiTaskStepTaskBase {
// id of error digestion task
public Integer id;
// list of error tubes
public List<Integer> errorTubes;
// taskModel
private MdbDigestionTask taskModel;
@Override
protected void setup() {
this.taskModel = DiActiveRecord.findOne(MdbDigestionTask.class, this.id);
if ( this.taskModel == null ) {
throw new RuntimeException("task [" + this.id.toString() + "] not found");
}
this.loadStepsByJson(this.taskModel.steps);
MdbOperationLog.log(this.getUser(), "异常试管架 : 执行预设【%s】", this.taskModel.name);
}
// throw exception
public void throwException(String message) {
String msg = String.format("[异常试管架 - %s] : %s", this.taskModel.name, message);
throw new RuntimeException(msg);
}
// get slot
public ResHeatingTubeRackSlot getSlot() {
var slotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class);
return slotMan.getErrorSlot();
}
}

37
src/web/src/pages/main/contents/TaskStepManagement.vue

@ -7,6 +7,10 @@
</template>
</template>
<template #bodyCell="{ column, record }">
<template v-if="'type' === column.key">
<span v-if="record.type === 'normal'">正常步骤</span>
<span v-else>异常步骤</span>
</template>
<template v-if="column.key === 'action'">
<a-popconfirm title="是否删除当前预设 ?" @confirm="actionDelete(record)">
<DeleteOutlined />
@ -22,7 +26,15 @@
:closable="false"
:mask-closable="false"
>
<p><a-input v-model:value="edit.data.name" placeholder="名称" /></p>
<div class="flex flex-row">
<a-radio-group v-model:value="edit.data.type" button-style="solid">
<a-radio-button value="normal">正常</a-radio-button>
<a-radio-button value="error">异常</a-radio-button>
</a-radio-group>
<div class="w-0 grow ml-1">
<a-input v-model:value="edit.data.name" placeholder="名称" />
</div>
</div>
<a-row class="py-3">
<a-col :span="12">执行步骤</a-col>
<a-col :span="12" class="text-right">
@ -49,6 +61,8 @@
<a-select-option value="MoveToHeatingPlate">转移至加热区</a-select-option>
<a-select-option value="MoveToLiquidPlate">转移至加液区</a-select-option>
<a-select-option value="Checking">检查</a-select-option>
<a-select-option value="MoveErrorTubesToErrorSlot">转移异常试管至异常区</a-select-option>
<a-select-option value="ExecuteErrorTask">执行异常处理</a-select-option>
<a-select-option value="TakeOut">取出</a-select-option>
</a-select>
</a-form-item>
@ -85,6 +99,9 @@
<a-form-item label="目标温度" v-if="'TempDownWait' === step.action">
<a-input-number v-model:value="step.temperature" addon-after="" class="w-full"/>
</a-form-item>
<a-form-item label="异常处理" v-if="'ExecuteErrorTask' === step.action">
<a-select v-model:value="step.errorTaskId" :options="errorTaskList"></a-select>
</a-form-item>
</a-form>
</a-collapse-panel>
</a-collapse>
@ -92,10 +109,11 @@
</template>
<script setup>
import ApiClient from '@/utils/ApiClient';
import { onMounted, ref, nextTick } from 'vue';
import { onMounted, ref, nextTick, computed } from 'vue';
/** @var {Array<Object>} */
const columns = [
{key:'name',dataIndex:'name',title:'名称',align:'left',width:200},
{key:'type',dataIndex:'type',title:'类型',align:'left',width:100},
{key:'steps',dataIndex:'stepSummary',title:'步骤',align:'left'},
{key:'action',dataIndex:'action',align:'right',width:80},
];
@ -105,6 +123,8 @@ const dataSource = ref([]);
const edit = ref({enable:false,id:null,data:{name:'',steps:[]}});
/** @var {Ref<String>} */
const editActiveStepKey = ref(null);
/** @var {Array<Object>} */
const errorTaskList = computed(computeErrorTaskList);
// mounted
onMounted(mounted);
@ -113,6 +133,17 @@ async function mounted() {
await refresh();
}
// compute error task list
function computeErrorTaskList() {
let list = [];
for ( let item of dataSource.value ) {
if ( item.type === 'error' ) {
list.push({label:item.name,value:item.id});
}
}
return list;
}
// step name get
function stepNameGet(step) {
let acidMap = {hydrochloric:'盐酸',nitric:'硝酸',sulfuric:'硫酸',hydrofluoric:'氢氟酸',perchloric:'高氯酸',hydrobromic:'液溴',phosphoric:'磷酸',tartaric:'酒石酸'};
@ -129,6 +160,7 @@ function stepNameGet(step) {
case 'MoveToLiquidPlate' : return `转移至加液区`;
case 'TakeOut' : return `取出`;
case 'Checking' : return `检查`;
case 'MoveErrorTubesToErrorSlot' : return `转移异常试管至异常区`;
}
}
@ -156,6 +188,7 @@ function actionCreate() {
edit.value.data = {};
edit.value.data.name = '未命名预设';
edit.value.data.steps = [{}];
edit.value.data.type = 'normal';
}
//

Loading…
Cancel
Save