sige 1 year ago
parent
commit
41664dc1b0
  1. 25
      src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java
  2. 5
      src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java
  3. 28
      src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java
  4. 10
      src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java
  5. 16
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
  6. 40
      src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
  7. 52
      src/src/main/resources/device.yml
  8. 59
      src/web/src/pages/main/contents/Operation.vue
  9. 78
      src/web/src/pages/main/contents/OperationTubeRackAcidAdd.vue
  10. 3
      src/web/src/pages/main/contents/OperationTubeRacks.vue

25
src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskMoveBase.java

@ -1,5 +1,12 @@
package com.my.graphiteDigesterBg.diframe; package com.my.graphiteDigesterBg.diframe;
import java.util.ArrayList;
import java.util.List;
abstract public class DiTaskMoveBase { abstract public class DiTaskMoveBase {
// finish callback
public interface ExecuteCallback {
void callback();
}
// device // device
private DiDevice device; private DiDevice device;
// task // task
@ -28,4 +35,22 @@ abstract public class DiTaskMoveBase {
// run // run
abstract public void run(); abstract public void run();
// execute batch actions
public void execute(List<ExecuteCallback> actions) {
List<Thread> threads = new ArrayList<>();
for (ExecuteCallback action : actions) {
Thread thread = new Thread(action::callback);
threads.add(thread);
thread.start();
}
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} }

5
src/src/main/java/com/my/graphiteDigesterBg/diframe/actuator/DiActPeristalticPump.java

@ -20,6 +20,8 @@ public class DiActPeristalticPump extends DiActuatorBase {
protected Integer stepMotorIRun; protected Integer stepMotorIRun;
// volume per circle // volume per circle
protected Double volumePerCircle; protected Double volumePerCircle;
// retraction circle count
protected Integer retractionCircleCount;
@Override @Override
protected void onEnable() { protected void onEnable() {
@ -61,5 +63,8 @@ public class DiActPeristalticPump extends DiActuatorBase {
public void pump(Integer volume) { public void pump(Integer volume) {
Integer circleCount = (int) (volume / this.volumePerCircle); Integer circleCount = (int) (volume / this.volumePerCircle);
this.rotateByCircleCount(circleCount); this.rotateByCircleCount(circleCount);
if ( null != this.retractionCircleCount && 0 < this.retractionCircleCount ) {
this.rotateByCircleCount(this.retractionCircleCount * -1);
}
} }
} }

28
src/src/main/java/com/my/graphiteDigesterBg/move/MoveLiquidAdd.java

@ -4,7 +4,7 @@ import com.my.graphiteDigesterBg.diframe.DiTaskMoveBase;
import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor;
import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump;
import com.my.graphiteDigesterBg.resource.ResAcidManager; import com.my.graphiteDigesterBg.resource.ResAcidManager;
import java.util.List;
public class MoveLiquidAdd extends DiTaskMoveBase { public class MoveLiquidAdd extends DiTaskMoveBase {
// shake times // shake times
public Integer shakeTimes; public Integer shakeTimes;
@ -24,18 +24,26 @@ public class MoveLiquidAdd extends DiTaskMoveBase {
DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class); DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class);
DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class); DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class);
for ( int i=0; i<4; i++ ) { for ( int i=0; i<4; i++ ) {
// 外圈试管加液
liquidMotor.moveTo("LiquidArmPumpGroupOut");
liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", i);
groupOutPump.pump(this.liquidVolume);
groupInPump.pump(this.liquidVolume);
int index = i;
this.execute(List.of( // 移动到外圈试管位置
() -> liquidMotor.moveTo("LiquidArmPumpGroupOut"),
() -> liquidPlateMotor.moveTo("LiquidPlateSlotPumpOutGroup", index)
));
this.execute(List.of( // 加液
() -> groupOutPump.pump(this.liquidVolume),
() -> groupInPump.pump(this.liquidVolume)
));
bucket.consume(this.liquidVolume * 2); bucket.consume(this.liquidVolume * 2);
// 内圈试管加液 // 内圈试管加液
liquidMotor.moveTo("LiquidArmPumpGroupIn");
liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", i);
groupInPump.pump(this.liquidVolume);
groupOutPump.pump(this.liquidVolume);
this.execute(List.of( // 移动到内圈试管位置
() -> liquidMotor.moveTo("LiquidArmPumpGroupIn"),
() -> liquidPlateMotor.moveTo("LiquidPlateSlotPumpInGroup", index)
));
this.execute(List.of( // 加液
() -> groupInPump.pump(this.liquidVolume),
() -> groupOutPump.pump(this.liquidVolume)
));
bucket.consume(this.liquidVolume * 2); bucket.consume(this.liquidVolume * 2);
} }

10
src/src/main/java/com/my/graphiteDigesterBg/resource/ResHeatingTubeRackSlotManager.java

@ -41,11 +41,11 @@ public class ResHeatingTubeRackSlotManager extends DiResourceManagerBase {
// refresh slot temperature // refresh slot temperature
public void refreshSlotTemperature() { public void refreshSlotTemperature() {
var registers = this.getDevice().getRegisters();
for (ResHeatingTubeRackSlot slot : this.slots) {
slot.temperature = registers.getValue("HeatingPlateSlotTemperature" + slot.index);
LOG.info("[Heating Slot {}] temperature: {}", slot.index, slot.temperature);
}
// var registers = this.getDevice().getRegisters();
// for (ResHeatingTubeRackSlot slot : this.slots) {
// slot.temperature = registers.getValue("HeatingPlateSlotTemperature" + slot.index);
// LOG.info("[Heating Slot {}] temperature: {}", slot.index, slot.temperature);
// }
} }
// get resource data // get resource data

16
src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java

@ -22,10 +22,10 @@ public class TaskLiquidAdd extends DiTaskBase {
this.setStatus(TaskStatus.RUNNING); this.setStatus(TaskStatus.RUNNING);
// move tube rack from heat plate to liquid plate // move tube rack from heat plate to liquid plate
var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate();
moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice());
moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex;
moveTubeRackFromHeatPlateToLiquidPlate.run();
// var moveTubeRackFromHeatPlateToLiquidPlate = new MoveMoveTubeRackFromHeatPlateToLiquidPlate();
// moveTubeRackFromHeatPlateToLiquidPlate.setDevice(this.getDevice());
// moveTubeRackFromHeatPlateToLiquidPlate.slotIndex = this.slotIndex;
// moveTubeRackFromHeatPlateToLiquidPlate.run();
MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume); MdbOperationLog.log(this.getUser(), "试管架%d : 样本加液 类型=%s, 加液量=%d", this.slotIndex, this.liquidType, this.liquidVolume);
@ -38,10 +38,10 @@ public class TaskLiquidAdd extends DiTaskBase {
liquidAdd.run(); liquidAdd.run();
// move tube rack from liquid plate to heat plate // move tube rack from liquid plate to heat plate
var moveTubeRackFromLiquidPlateToHeatPlate = new MoveMoveTubeRackFromLiquidPlateToHeatPlate();
moveTubeRackFromLiquidPlateToHeatPlate.setDevice(this.getDevice());
moveTubeRackFromLiquidPlateToHeatPlate.slotIndex = this.slotIndex;
moveTubeRackFromLiquidPlateToHeatPlate.run();
// var moveTubeRackFromLiquidPlateToHeatPlate = new MoveMoveTubeRackFromLiquidPlateToHeatPlate();
// moveTubeRackFromLiquidPlateToHeatPlate.setDevice(this.getDevice());
// moveTubeRackFromLiquidPlateToHeatPlate.slotIndex = this.slotIndex;
// moveTubeRackFromLiquidPlateToHeatPlate.run();
this.setStatus(TaskStatus.FINISHED); this.setStatus(TaskStatus.FINISHED);
} }

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

@ -27,11 +27,11 @@ public class TaskStartReset extends DiTaskBase {
// transferClipServo.setEnable(true); // transferClipServo.setEnable(true);
// transferClipServo.moveTo("TransClipServoClose"); // transferClipServo.moveTo("TransClipServoClose");
// //
// this.setProgressMessage("设备初始化 : 加液臂复位");
// DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class);
// liquidMotor.setEnable(true);
// liquidMotor.reset();
// liquidMotor.moveTo("LiquidArmStandby");
this.setProgressMessage("设备初始化 : 加液臂复位");
DiActMotor liquidMotor = this.getActuator(MyDevice.ACT_LIQUID_MOTOR, DiActMotor.class);
liquidMotor.setEnable(true);
liquidMotor.reset();
liquidMotor.moveTo("LiquidArmStandby");
// //
// // @todo http://127.0.0.1:5566/issues/38 // // @todo http://127.0.0.1:5566/issues/38
// this.setProgressMessage("设备初始化 : 搬运机械臂上下移动复位"); // this.setProgressMessage("设备初始化 : 搬运机械臂上下移动复位");
@ -54,11 +54,11 @@ public class TaskStartReset extends DiTaskBase {
// heatSlotCoverServo.setCurrentPosAsMiddle(); // heatSlotCoverServo.setCurrentPosAsMiddle();
// } // }
// //
// // @TODO : http://127.0.0.1:5566/issues/39
// this.setProgressMessage("设备初始化 : 加液转盘复位");
// DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class);
// liquidPlateMotor.setEnable(true);
// liquidPlateMotor.reset();
// @TODO : http://127.0.0.1:5566/issues/39
this.setProgressMessage("设备初始化 : 加液转盘复位");
DiActMotor liquidPlateMotor = this.getActuator(MyDevice.ACT_LIQUID_PLATE_MOTOR, DiActMotor.class);
liquidPlateMotor.setEnable(true);
liquidPlateMotor.reset();
// //
// // @TODO : http://127.0.0.1:5566/issues/40 // // @TODO : http://127.0.0.1:5566/issues/40
// this.setProgressMessage("设备初始化 : 加热盘转盘复位"); // this.setProgressMessage("设备初始化 : 加热盘转盘复位");
@ -66,16 +66,16 @@ public class TaskStartReset extends DiTaskBase {
// heatPlateMotor.setEnable(true); // heatPlateMotor.setEnable(true);
// heatPlateMotor.reset(); // heatPlateMotor.reset();
// heatPlateMotor.moveTo("HeatPlateStandby"); // heatPlateMotor.moveTo("HeatPlateStandby");
//
// int peristalticPumpCount = 1;
// var actuators = this.getDevice().getActuators().getAll();
// for ( var actuator : actuators ) {
// if (actuator instanceof DiActPeristalticPump pump) {
// this.setProgressMessage("设备初始化 : 蠕动泵复位 " + peristalticPumpCount + "/16");
// pump.setEnable(true);
// peristalticPumpCount++;
// }
// }
int peristalticPumpCount = 1;
var actuators = this.getDevice().getActuators().getAll();
for ( var actuator : actuators ) {
if (actuator instanceof DiActPeristalticPump pump) {
this.setProgressMessage("设备初始化 : 蠕动泵复位 " + peristalticPumpCount + "/16");
pump.setEnable(true);
peristalticPumpCount++;
}
}
this.setProgressMessage("设备初始化 : 完成"); this.setProgressMessage("设备初始化 : 完成");
runtimeVars.setString("IsDeviceReady", "YES"); runtimeVars.setString("IsDeviceReady", "YES");

52
src/src/main/resources/device.yml

@ -41,8 +41,8 @@ actuators :
shaft : 1 shaft : 1
oneCirclePulse : 10000 oneCirclePulse : 10000
oneCirclePulseDenominator : 18 oneCirclePulseDenominator : 18
defaultVelocity : 40
defaultAcc : 2
defaultVelocity : 100
defaultAcc : 5
defaultDec : 2 defaultDec : 2
runToZeroSpeed : 50 runToZeroSpeed : 50
runToZeroDec : 30 runToZeroDec : 30
@ -121,7 +121,8 @@ actuators :
defaultDec : 300 defaultDec : 300
stepMotorIHold : 0 stepMotorIHold : 0
stepMotorIRun : 25 stepMotorIRun : 25
volumePerCircle : 0.1
volumePerCircle : 0.06
retractionCircleCount : 1
- name: 蠕动泵-0-1 - name: 蠕动泵-0-1
key: LiquidPeristalticPump_0_1 key: LiquidPeristalticPump_0_1
@ -135,7 +136,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-1-0 - name: 蠕动泵-1-0
key: LiquidPeristalticPump_1_0 key: LiquidPeristalticPump_1_0
@ -149,7 +151,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-1-1 - name: 蠕动泵-1-1
key: LiquidPeristalticPump_1_1 key: LiquidPeristalticPump_1_1
@ -163,7 +166,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-2-0 - name: 蠕动泵-2-0
key: LiquidPeristalticPump_2_0 key: LiquidPeristalticPump_2_0
@ -177,7 +181,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-2-1 - name: 蠕动泵-2-1
key: LiquidPeristalticPump_2_1 key: LiquidPeristalticPump_2_1
@ -191,7 +196,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-3-0 - name: 蠕动泵-3-0
key: LiquidPeristalticPump_3_0 key: LiquidPeristalticPump_3_0
@ -205,7 +211,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-3-1 - name: 蠕动泵-3-1
key: LiquidPeristalticPump_3_1 key: LiquidPeristalticPump_3_1
@ -219,7 +226,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-4-0 - name: 蠕动泵-4-0
key: LiquidPeristalticPump_4_0 key: LiquidPeristalticPump_4_0
@ -233,7 +241,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-4-1 - name: 蠕动泵-4-1
key: LiquidPeristalticPump_4_1 key: LiquidPeristalticPump_4_1
@ -247,7 +256,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-5-0 - name: 蠕动泵-5-0
key: LiquidPeristalticPump_5_0 key: LiquidPeristalticPump_5_0
@ -261,7 +271,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-5-1 - name: 蠕动泵-5-1
key: LiquidPeristalticPump_5_1 key: LiquidPeristalticPump_5_1
@ -275,7 +286,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-6-0 - name: 蠕动泵-6-0
key: LiquidPeristalticPump_6_0 key: LiquidPeristalticPump_6_0
@ -289,7 +301,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-6-1 - name: 蠕动泵-6-1
key: LiquidPeristalticPump_6_1 key: LiquidPeristalticPump_6_1
@ -303,7 +316,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-7-0 - name: 蠕动泵-7-0
key: LiquidPeristalticPump_7_0 key: LiquidPeristalticPump_7_0
@ -317,7 +331,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name: 蠕动泵-7-1 - name: 蠕动泵-7-1
key: LiquidPeristalticPump_7_1 key: LiquidPeristalticPump_7_1
@ -331,7 +346,8 @@ actuators :
defaultDec: 300 defaultDec: 300
stepMotorIHold: 0 stepMotorIHold: 0
stepMotorIRun: 25 stepMotorIRun: 25
volumePerCircle: 0.1
volumePerCircle: 0.06
retractionCircleCount : 1
- name : 设备门电机 - name : 设备门电机
key: DoorMotor key: DoorMotor

59
src/web/src/pages/main/contents/Operation.vue

@ -68,29 +68,7 @@
</a-form> </a-form>
</a-modal> </a-modal>
<!-- 加酸 -->
<a-modal v-model:visible="acidAdd.enable" title="加酸" @ok="acidAddOk" @cancel="acidAddCancel" ok-text="确认" cancel-text="取消">
<a-form :label-col="{span:4}" :wrapper-col="{span:20}" label-align="left" class="py-5">
<a-form-item label="位置">
<a-radio-group v-model:value="acidAdd.slotIndex" button-style="solid">
<a-radio-button value="0">A-1</a-radio-button>
<a-radio-button value="1">A-2</a-radio-button>
<a-radio-button value="2">A-3</a-radio-button>
<a-radio-button value="3">A-4</a-radio-button>
<a-radio-button value="4">A-5</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="酸液">
<a-select v-model:value="acidAdd.liquidType" :options="acidAdd.acidOptions"></a-select>
</a-form-item>
<a-form-item label="加量">
<a-input-number v-model:value="acidAdd.liquidVolume" :min="0" />
</a-form-item>
<a-form-item label="摇匀次数">
<a-input-number v-model:value="acidAdd.shakeTimes" :min="0" />
</a-form-item>
</a-form>
</a-modal>
</div> </div>
</template> </template>
<script setup> <script setup>
@ -105,8 +83,6 @@ import OperationTubeRackTemperature from './OperationTubeRackTemperature.vue';
const sampleTakeout = ref({enable:false,slotIndex:0}); const sampleTakeout = ref({enable:false,slotIndex:0});
/** @var {Object} */ /** @var {Object} */
const presetSetup = ref({enable:false,slotIndex:0,id:null}); const presetSetup = ref({enable:false,slotIndex:0,id:null});
/** @var {Object} */
const acidAdd = ref({enable:false,slotIndex:0,liquidType:null,liquidVolume:100,shakeTimes:3,acidOptions:[]});
/** @var {Array} */ /** @var {Array} */
const tubeRackSlots = ref([]); const tubeRackSlots = ref([]);
/** @var {Array} */ /** @var {Array} */
@ -186,37 +162,4 @@ async function actionPresetSetupOk() {
async function actionPresetSetupCancel() { async function actionPresetSetupCancel() {
presetSetup.value.enable = false; presetSetup.value.enable = false;
} }
//
async function actionAcidAdd() {
acidAdd.value.acidOptions = [];
for ( let acidBucket of acidBuckets.value ) {
if ( -1 !== acidAdd.value.acidOptions.findIndex(item => item.value === acidBucket.acidType) ) {
continue ;
}
acidAdd.value.acidOptions.push({
label : `${acidBucket.acidName}`,
value : acidBucket.acidType
});
}
acidAdd.value.enable = true;
}
//
async function acidAddOk() {
acidAdd.value.enable = false;
let client = ApiClient.getClient();
await client.taskAppend('LiquidAdd',{
slotIndex:acidAdd.value.slotIndex * 1,
liquidType:acidAdd.value.liquidType,
liquidVolume:acidAdd.value.liquidVolume * 1,
shakeTimes:acidAdd.value.shakeTimes * 1,
});
}
//
function acidAddCancel() {
acidAdd.value.enable = false;
}
</script> </script>

78
src/web/src/pages/main/contents/OperationTubeRackAcidAdd.vue

@ -0,0 +1,78 @@
<template>
<a-button class="ml-1"
style="background: transparent;border: solid 1px #becfe7;color: #7c92b1;"
@click="actionAcidAdd"
><ExperimentOutlined /></a-button>
<!-- 加酸 -->
<a-modal v-if="enable" v-model:visible="enable" title="加酸" @ok="acidAddOk" @cancel="acidAddCancel" ok-text="确认" cancel-text="取消">
<a-form :label-col="{span:4}" :wrapper-col="{span:20}" label-align="left" class="py-5">
<a-form-item label="酸液">
<a-select v-model:value="acidAdd.liquidType" :options="acidOptions"></a-select>
</a-form-item>
<a-form-item label="加量">
<a-input-number class="w-full" v-model:value="acidAdd.liquidVolume" :min="0" addon-after="ml" />
</a-form-item>
<a-form-item label="摇匀次数">
<a-input-number class="w-full" v-model:value="acidAdd.shakeTimes" :min="0" />
</a-form-item>
</a-form>
</a-modal>
</template>
<script setup>
import ApiClient from '@/utils/ApiClient';
import { ref } from 'vue';
/** @var {Object} */
const props = defineProps({
activeSlot: Object,
});
/** @var {Boolean} */
const enable = ref(false);
/** @var {Array} */
const acidOptions = ref([]);
/** @var {Object} */
const acidAdd = ref({liquidType:null,liquidVolume:1,shakeTimes:3});
//
async function actionAcidAdd() {
let client = ApiClient.getClient();
let acidBuckets = await client.resourceDataGet('Acid');
let acidTypeMap = {hydrochloric:'盐酸',nitric:'硝酸',sulfuric:'硫酸',hydrofluoric:'氢氟酸',perchloric:'高氯酸',hydrobromic:'液溴',phosphoric:'磷酸',tartaric:'酒石酸'};
for ( let acidBucket of acidBuckets ) {
acidBucket.acidName = acidTypeMap[acidBucket.acidType];
}
acidOptions.value = [];
for ( let acidBucket of acidBuckets ) {
if ( -1 !== acidOptions.value.findIndex(item => item.value === acidBucket.acidType) ) {
continue ;
}
acidOptions.value.push({
label : `${acidBucket.acidName}`,
value : acidBucket.acidType
});
}
enable.value = true;
if ( null === acidAdd.value.liquidType ) {
acidAdd.value.liquidType = acidBuckets[0].acidType;
}
}
//
async function acidAddOk() {
enable.value = false;
let client = ApiClient.getClient();
await client.taskAppend('LiquidAdd',{
slotIndex : props.activeSlot.index * 1,
liquidType : acidAdd.value.liquidType,
liquidVolume : acidAdd.value.liquidVolume * 1,
shakeTimes : acidAdd.value.shakeTimes * 1,
});
}
//
function acidAddCancel() {
enable.value = false;
}
</script>

3
src/web/src/pages/main/contents/OperationTubeRacks.vue

@ -42,7 +42,7 @@
<a-row> <a-row>
<a-col :span="13" class="text-left"> <a-col :span="13" class="text-left">
<!-- 这里还有个预设按钮 ~~~ --> <!-- 这里还有个预设按钮 ~~~ -->
<a-button class="ml-1" @click="actionAcidAdd"><ExperimentOutlined /></a-button>
<operation-tube-rack-acid-add v-if="null !== activeRackSlot" :active-slot="activeRackSlot"/>
<operation-tube-rack-heating v-if="null !== activeRackSlot" :active-slot="activeRackSlot"/> <operation-tube-rack-heating v-if="null !== activeRackSlot" :active-slot="activeRackSlot"/>
<!-- <operation-sample-take-shot /> --> <!-- <operation-sample-take-shot /> -->
</a-col> </a-col>
@ -63,6 +63,7 @@
import { ref } from 'vue'; import { ref } from 'vue';
import anime from 'animejs/lib/anime.es.js'; import anime from 'animejs/lib/anime.es.js';
import OperationTubeRackHeating from './OperationTubeRackHeating.vue'; import OperationTubeRackHeating from './OperationTubeRackHeating.vue';
import OperationTubeRackAcidAdd from './OperationTubeRackAcidAdd.vue';
/** @var {Object} */ /** @var {Object} */
const props = defineProps({ const props = defineProps({
tubeRackSlots: Array, tubeRackSlots: Array,

Loading…
Cancel
Save