From f7bf66339c7c6c539c0ce2ca6886a9e90f941716 Mon Sep 17 00:00:00 2001 From: sige Date: Mon, 29 Jan 2024 16:27:49 +0800 Subject: [PATCH] ~~ --- .../diframe/api/DiApiResource.java | 54 ++++++++++++++- .../graphiteDigesterBg/resource/ResAcidBucket.java | 5 +- .../resource/ResAcidManager.java | 24 ++++++- .../my/graphiteDigesterBg/task/TaskLiquidAdd.java | 11 +++- src/web/src/pages/main/contents/AcidManagement.vue | 76 ++++++++++++++-------- src/web/src/pages/main/contents/Operation.vue | 35 ++++++---- src/web/src/utils/ApiClient.js | 5 ++ 7 files changed, 162 insertions(+), 48 deletions(-) diff --git a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiResource.java b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiResource.java index 0e5ac2e..6bf261d 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiResource.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiResource.java @@ -1,12 +1,13 @@ package com.my.graphiteDigesterBg.diframe.api; -import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; -import com.my.graphiteDigesterBg.diframe.DiApiResponse; -import com.my.graphiteDigesterBg.diframe.DiDevice; +import com.my.graphiteDigesterBg.diframe.*; import jakarta.annotation.Resource; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.ResponseBody; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Map; @Controller public class DiApiResource extends DiApiControllerBase { @@ -21,4 +22,51 @@ public class DiApiResource extends DiApiControllerBase { Object data = man.getResourceData(); return this.success(data); } + + @ResponseBody + @PostMapping("/api/resource/action-execute") + public DiApiResponse actionExecute(@RequestBody Map params) { + String name = (String)params.get("name"); + String action = (String)params.get("action"); + Object actionParams = params.get("params"); + + var manager = this.device.getResource().getManager(name); + if ( null == manager ) { + return this.error("resource not found"); + } + + boolean hasParams = false; + Method actionMethod = null; + try { + actionMethod = manager.getClass().getMethod(action); + } catch (NoSuchMethodException e) { + try { + hasParams = true; + actionMethod = manager.getClass().getMethod(action, Map.class); + } catch (NoSuchMethodException ep) { + throw new RuntimeException(ep); + } + } + + Object actionResult = null; + try { + if ( hasParams ) { + if ( actionMethod.getReturnType().equals(Void.TYPE) ) { + actionMethod.invoke(manager, actionParams); + } else { + actionResult = actionMethod.invoke(manager, actionParams); + } + } else { + if ( actionMethod.getReturnType().equals(Void.TYPE) ) { + actionMethod.invoke(manager); + } else { + actionResult = actionMethod.invoke(manager); + } + } + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + + return this.success(actionResult); + } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidBucket.java b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidBucket.java index 0f46423..93e6d1e 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidBucket.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidBucket.java @@ -3,13 +3,14 @@ public class ResAcidBucket { public Integer index; public Integer volume; public Integer maxVolume; - public String acidName; + public String acidType; private ResAcidManager manager; + // constructor public ResAcidBucket( ResAcidManager manager, Integer index ) { this.index = index; this.volume = 5000; this.maxVolume = 5000; - this.acidName = "硫酸"; + this.acidType = "sulfuric"; } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java index 97b8c92..4718188 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/resource/ResAcidManager.java @@ -1,10 +1,9 @@ package com.my.graphiteDigesterBg.resource; import com.my.graphiteDigesterBg.diframe.DiResourceManagerBase; import com.my.graphiteDigesterBg.diframe.ResourceManager; - import java.util.ArrayList; import java.util.List; - +import java.util.Map; @ResourceManager(name="Acid") public class ResAcidManager extends DiResourceManagerBase { // slots @@ -23,4 +22,25 @@ public class ResAcidManager extends DiResourceManagerBase { public Object getResourceData() { return this.buckets; } + + // bucket update + public void bucketUpdate(Map params) { + Integer index = (Integer)params.get("index"); + Integer volume = (Integer)params.get("volume"); + String acidType = (String)params.get("acidType"); + + ResAcidBucket bucket = this.buckets.get(index); + bucket.volume = volume; + bucket.acidType = acidType; + } + + // get bucket by acid type + public ResAcidBucket getBucketByAcidType(String acidType) { + for (ResAcidBucket bucket : this.buckets) { + if ( bucket.acidType.equals(acidType) ) { + return bucket; + } + } + return null; + } } diff --git a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java index 6e56b50..3b35b80 100644 --- a/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java +++ b/src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java @@ -6,6 +6,7 @@ import com.my.graphiteDigesterBg.diframe.actuator.DiActMotor; import com.my.graphiteDigesterBg.diframe.actuator.DiActPeristalticPump; import com.my.graphiteDigesterBg.diframe.actuator.DiActServo; import com.my.graphiteDigesterBg.move.MoveMoveTubeRackFromHeatPlateToLiquidPlate; +import com.my.graphiteDigesterBg.resource.ResAcidManager; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlot; import com.my.graphiteDigesterBg.resource.ResHeatingTubeRackSlotManager; @Task(name="LiquidAdd") @@ -13,7 +14,7 @@ public class TaskLiquidAdd extends DiTaskBase { // slot index public Integer slotIndex; // liquid index - public Integer liquidIndex; + public String liquidType; // liquid volume public Integer liquidVolume; // shake times @@ -27,6 +28,14 @@ public class TaskLiquidAdd extends DiTaskBase { } catch (InterruptedException e) { throw new RuntimeException(e); } + + var bucketMan = this.getResourceManager(ResAcidManager.class); + var bucket = bucketMan.getBucketByAcidType(this.liquidType); + if ( null == bucket ) { + throw new RuntimeException("liquid type [" + this.liquidType + "] not found"); + } + bucket.volume -= this.liquidVolume; + // ResHeatingTubeRackSlotManager heatingSlotMan = this.getResourceManager(ResHeatingTubeRackSlotManager.class); // ResHeatingTubeRackSlot slot = heatingSlotMan.getSlotByIndex(this.slotIndex); // diff --git a/src/web/src/pages/main/contents/AcidManagement.vue b/src/web/src/pages/main/contents/AcidManagement.vue index 1d22625..cbf83c9 100644 --- a/src/web/src/pages/main/contents/AcidManagement.vue +++ b/src/web/src/pages/main/contents/AcidManagement.vue @@ -1,43 +1,65 @@ \ No newline at end of file + + \ No newline at end of file diff --git a/src/web/src/pages/main/contents/Operation.vue b/src/web/src/pages/main/contents/Operation.vue index 00650a3..be2a1ed 100644 --- a/src/web/src/pages/main/contents/Operation.vue +++ b/src/web/src/pages/main/contents/Operation.vue @@ -148,10 +148,7 @@ - - {{ acidBucket.acidName }} @ {{ acidBucket.index + 1 }} - + @@ -195,7 +192,7 @@ const sampleTakeout = ref({enable:false,slotIndex:0}); /** @var {Object} */ const presetSetup = ref({enable:false,slotIndex:0,id:null}); /** @var {Object} */ -const acidAdd = ref({enable:false,slotIndex:0,liquidIndex:0,liquidVolume:100,shakeTimes:3}); +const acidAdd = ref({enable:false,slotIndex:0,liquidType:null,liquidVolume:100,shakeTimes:3,acidOptions:[]}); /** @var {Object} */ const heating = ref({enable:false,slotIndex:0,temperature:100,duration:1}); /** @var {Array} */ @@ -229,7 +226,10 @@ async function refreshResource() { response = await client.resourceDataGet('Acid'); acidBuckets.value = structuredClone(response); - + let acidTypeMap = {hydrochloric:'盐酸',nitric:'硝酸',sulfuric:'硫酸',hydrofluoric:'氢氟酸',perchloric:'高氯酸',hydrobromic:'液溴',phosphoric:'磷酸',tartaric:'酒石酸'}; + for ( let acidBucket of acidBuckets.value ) { + acidBucket.acidName = acidTypeMap[acidBucket.acidType]; + } refreshTimer = setTimeout(refreshResource,1000); } @@ -255,8 +255,6 @@ async function actionSampleAddCancel() { // 样本取出 async function actionSampleTakeOut() { sampleTakeout.value.enable = true; - // let client = ApiClient.getClient(); - // await client.taskAppend('SampleTakeOut'); } // 样本取出确认 @@ -320,7 +318,18 @@ function getTubeRackSlotHeatingProgress(tubeRackSlot) { } // 加酸 -function actionAcidAdd() { +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; } @@ -329,10 +338,10 @@ async function acidAddOk() { acidAdd.value.enable = false; let client = ApiClient.getClient(); await client.taskAppend('LiquidAdd',{ - slotIndex:presetSetup.value.slotIndex, - liquidIndex:presetSetup.value.liquidIndex, - liquidVolume:presetSetup.value.liquidVolume, - shakeTimes:presetSetup.value.shakeTimes, + slotIndex:acidAdd.value.slotIndex * 1, + liquidType:acidAdd.value.liquidType, + liquidVolume:acidAdd.value.liquidVolume * 1, + shakeTimes:acidAdd.value.shakeTimes * 1, }); } diff --git a/src/web/src/utils/ApiClient.js b/src/web/src/utils/ApiClient.js index a5cb551..a54a4d8 100644 --- a/src/web/src/utils/ApiClient.js +++ b/src/web/src/utils/ApiClient.js @@ -106,4 +106,9 @@ export default class ApiClient { async digestionPresetDelete(id) { return await this.call('digestion-preset/delete', {id}); } + + // resource action execute + async resourceActionExecute(name, action, params) { + return await this.call('resource/action-execute',{name,action, params}); + } } \ No newline at end of file