From 616eae7602ddc396d2f14c4b7ef246157cd19ea0 Mon Sep 17 00:00:00 2001 From: zhaohe Date: Wed, 31 Jul 2024 18:36:32 +0800 Subject: [PATCH] update --- .../engineer/utils/EnginnerPageTabOrder.java | 15 ++ src/main/java/a8k/service/AddSampleService.java | 4 - src/main/java/a8k/service/FrontEndEventRouter.java | 62 -------- .../java/a8k/service/appbase/A8kDeviceState.java | 6 +- .../service/appcfgs/A8kDeviceCfgMgrService.java | 119 ---------------- .../java/a8k/service/appcfgs/AppCfgMgrService.java | 119 ++++++++++++++++ .../appconsumable/AppConsumableMgrService.java | 44 ------ .../appconsumable/AppConsumablesMgrService.java | 50 +++++++ .../appconsumable/base/ConsumableItemGroup.java | 19 --- .../service/appconsumable/base/Consumables.java | 19 +++ .../java/a8k/service/appctrl/AppCtrlService.java | 31 ++-- .../appfrontend/AppFrontEndEventRouter.java | 62 ++++++++ .../a8k/service/appstate/AppStateMgrService.java | 7 +- .../a8k/service/hardware/HardwareTestScript.java | 134 +++++++++++++++++ src/main/java/a8k/service/hardware/TestScript.java | 134 ----------------- .../project_mgr/AppProjectItemMgrService.java | 158 +++++++++++++++++++++ .../service/project_mgr/ProjectItemMgrService.java | 135 ------------------ zhaohe_app.db | Bin 180224 -> 180224 bytes 18 files changed, 582 insertions(+), 536 deletions(-) delete mode 100644 src/main/java/a8k/service/AddSampleService.java delete mode 100644 src/main/java/a8k/service/FrontEndEventRouter.java delete mode 100644 src/main/java/a8k/service/appcfgs/A8kDeviceCfgMgrService.java create mode 100644 src/main/java/a8k/service/appcfgs/AppCfgMgrService.java delete mode 100644 src/main/java/a8k/service/appconsumable/AppConsumableMgrService.java create mode 100644 src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java delete mode 100644 src/main/java/a8k/service/appconsumable/base/ConsumableItemGroup.java create mode 100644 src/main/java/a8k/service/appconsumable/base/Consumables.java create mode 100644 src/main/java/a8k/service/appfrontend/AppFrontEndEventRouter.java create mode 100644 src/main/java/a8k/service/hardware/HardwareTestScript.java delete mode 100644 src/main/java/a8k/service/hardware/TestScript.java create mode 100644 src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java delete mode 100644 src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java diff --git a/src/main/java/a8k/controler/engineer/utils/EnginnerPageTabOrder.java b/src/main/java/a8k/controler/engineer/utils/EnginnerPageTabOrder.java index 9ec977a..b39e723 100644 --- a/src/main/java/a8k/controler/engineer/utils/EnginnerPageTabOrder.java +++ b/src/main/java/a8k/controler/engineer/utils/EnginnerPageTabOrder.java @@ -1,6 +1,21 @@ package a8k.controler.engineer.utils; + public enum EnginnerPageTabOrder { + + AppCtrlService, + AppConsumablesMgrService, + AppProjectItemMgrService, + AppSettingsMgr, + AppStateMgrService, + AppUserMgrService, + AppCfgMgrService, + AppFrontEndEventRouter, + SamplesPreProcessModuleCtrlService, ReactionPlatesTransmitCtrlService, + MotorTubeRackMoveCtrlService, + HbotControlService, + HardwareTestScript, + Max; } diff --git a/src/main/java/a8k/service/AddSampleService.java b/src/main/java/a8k/service/AddSampleService.java deleted file mode 100644 index 1dba6c3..0000000 --- a/src/main/java/a8k/service/AddSampleService.java +++ /dev/null @@ -1,4 +0,0 @@ -package a8k.service; - -public class AddSampleService { -} diff --git a/src/main/java/a8k/service/FrontEndEventRouter.java b/src/main/java/a8k/service/FrontEndEventRouter.java deleted file mode 100644 index b6467f3..0000000 --- a/src/main/java/a8k/service/FrontEndEventRouter.java +++ /dev/null @@ -1,62 +0,0 @@ -package a8k.service; - -import a8k.service.appeventbus.AppEventListener; -import a8k.appbase.appret.AppRet; -import a8k.controler.engineer.utils.EngineerPageTab; -import a8k.controler.engineer.utils.EnginnerPageAction; -import a8k.service.appeventbus.AppEventBusService; -import a8k.service.appeventbus.appevent.A8kHardwareReport; -import a8k.service.appeventbus.appevent.AppEvent; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.Queue; - -@Component -@EngineerPageTab(name = "FrontEndEventRouter") -public class FrontEndEventRouter implements AppEventListener { - static Logger logger = org.slf4j.LoggerFactory.getLogger(FrontEndEventRouter.class); - - @Resource - AppEventBusService eventBus; - - private final Queue appEventQueue = new java.util.concurrent.ConcurrentLinkedQueue<>(); - - - @PostConstruct - public void init() { - eventBus.regListener(this); - } - - public Boolean filterEvent(AppEvent event) { - if (event instanceof A8kHardwareReport) { - return true; - } - return false; - } - - synchronized public AppEvent _pollAppEvent() { - return appEventQueue.poll(); - } - - @Override public void onAppEvent(AppEvent event) { - if (filterEvent(event)) { - return; - } - - appEventQueue.add(event); - if (appEventQueue.size() >= 10) { - logger.warn("too many events in queue, drop some"); - _pollAppEvent(); - } - } - - @EnginnerPageAction(name = "pollAppEvent") - public AppRet pollAppEvent() { - AppEvent event = _pollAppEvent(); - return AppRet.success(event); - } - -} diff --git a/src/main/java/a8k/service/appbase/A8kDeviceState.java b/src/main/java/a8k/service/appbase/A8kDeviceState.java index da2173c..fe5b130 100644 --- a/src/main/java/a8k/service/appbase/A8kDeviceState.java +++ b/src/main/java/a8k/service/appbase/A8kDeviceState.java @@ -1,7 +1,7 @@ package a8k.service.appbase; import a8k.db.ProjectInfo; -import a8k.service.appconsumable.base.ConsumableItemGroup; +import a8k.service.appconsumable.base.Consumables; import a8k.service.appbase.runstate.ReactingPlateRunState; import a8k.service.appbase.runstate.EmergencyPosRunState; import a8k.service.appbase.runstate.TubeHolderRunState; @@ -10,9 +10,9 @@ import java.util.List; public class A8kDeviceState { //耗材状态 - public ConsumableItemGroup consumable = new ConsumableItemGroup(); + public Consumables consumable = new Consumables(); //急诊为状态 - public EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); + public EmergencyPosRunState emergencyPosRunState = new EmergencyPosRunState(); //正在孵育的任务状态 public List incubatingPlateStates = null; //当前正在被处理的试管架状态 diff --git a/src/main/java/a8k/service/appcfgs/A8kDeviceCfgMgrService.java b/src/main/java/a8k/service/appcfgs/A8kDeviceCfgMgrService.java deleted file mode 100644 index acf9f48..0000000 --- a/src/main/java/a8k/service/appcfgs/A8kDeviceCfgMgrService.java +++ /dev/null @@ -1,119 +0,0 @@ -package a8k.service.appcfgs; - -import a8k.appbase.appret.AppRet; -import a8k.controler.engineer.utils.EngineerPageTab; -import a8k.controler.engineer.utils.EnginnerPageAction; -import a8k.service.appcfgs.base.A8kDeviceCfg; -import a8k.service.appcfgs.base.EmergencyCfg; -import a8k.appbase.type.BloodType; -import a8k.service.appcfgs.base.SampleTubeCfg; -import a8k.service.appcfgs.base.SampleTubeHolderCfg; -import a8k.service.hardware.canbus.protocol.A8kEcode; -import org.springframework.stereotype.Component; - -@Component -@EngineerPageTab(name = "A8kDeviceCfgMgrService") -public class A8kDeviceCfgMgrService { - A8kDeviceCfg deviceCfg = new A8kDeviceCfg(); - - - private SampleTubeHolderCfg dbFindCfg(String tubeHolderCfgUUID) { - for (SampleTubeHolderCfg cfg : deviceCfg.cfgs) { - if (cfg.uuid.equals(tubeHolderCfgUUID)) { - return cfg; - } - } - return null; - } - - private void dbRemoveCfg(String tubeHolderCfgUUID) { - deviceCfg.cfgs.removeIf(cfg -> cfg.uuid.equals(tubeHolderCfgUUID)); - } - - private SampleTubeCfg dbFindTubeCfg(String tubeHolderCfgUUID, Integer tubeIndex) { - SampleTubeHolderCfg cfg = dbFindCfg(tubeHolderCfgUUID); - if (cfg == null) { - return null; - } - return cfg.tubeCfgs.get(tubeIndex); - } - - - @EnginnerPageAction(name = "获取设备配置", group = "基础", groupOrder = 1) - public A8kDeviceCfg getA8kDeviceCfg() { - return deviceCfg; - } - - @EnginnerPageAction(name = "添加<试管架>配置", group = "试管架", groupOrder = 2) - public AppRet addCfg() { - SampleTubeHolderCfg cfg = new SampleTubeHolderCfg(); - deviceCfg.cfgs.add(cfg); - return AppRet.success(cfg); - } - - @EnginnerPageAction(name = "删除<试管架>配置", group = "试管架") - public AppRet removeCfg(String tubeHolderCfgUUID) { - dbRemoveCfg(tubeHolderCfgUUID); - return AppRet.success(); - } - - - @EnginnerPageAction(name = "激活<试管架>配置", group = "试管架") - public AppRet activeCfg(String tubeHolderCfgUUID, Boolean active) { - SampleTubeHolderCfg cfg = dbFindCfg(tubeHolderCfgUUID); - if (cfg == null) { - return AppRet.fail(A8kEcode.TubeHolderCfgNotExist); - } - cfg.active = active; - return AppRet.success(); - } - - - @EnginnerPageAction(name = "修改<试管>用户信息配置", group = "试管", groupOrder = 3) - public AppRet updateTubeUsrCfg(String uuid, Integer tubeIndex, String udpid, String barcodeid) { - SampleTubeHolderCfg cfg = dbFindCfg(uuid); - assert cfg != null; - cfg.tubeCfgs.get(tubeIndex).barcodeid = barcodeid; - cfg.tubeCfgs.get(tubeIndex).udpid = udpid; - return AppRet.success(cfg.tubeCfgs.get(tubeIndex)); - } - - - @EnginnerPageAction(name = "清除<试管>项目信息", group = "试管") - public AppRet clearTubeProjectCfg(String uuid, Integer tubeIndex) { - SampleTubeHolderCfg cfg = dbFindCfg(uuid); - assert cfg != null; - cfg.tubeCfgs.get(tubeIndex).projectCodes.clear(); - cfg.tubeCfgs.get(tubeIndex).bloodType = BloodType.WHOLE_BLOOD; - return AppRet.success(cfg.tubeCfgs.get(tubeIndex)); - } - - @EnginnerPageAction(name = "添加<试管>项目信息", group = "试管") - public AppRet addTubeProjectCode(String uuid, Integer tubeIndex, String pjc) { - SampleTubeHolderCfg cfg = dbFindCfg(uuid); - assert cfg != null; - SampleTubeCfg tubeCfg = new SampleTubeCfg(); - tubeCfg.projectCodes.add(pjc); - cfg.tubeCfgs.add(tubeCfg); - return AppRet.success(tubeCfg); - } - - @EnginnerPageAction(name = "设置<试管>血型", group = "试管") - public AppRet setTubeBloodType(String uuid, Integer tubeIndex, BloodType bloodType) { - SampleTubeCfg tubeCfg = dbFindTubeCfg(uuid, tubeIndex); - assert tubeCfg != null; - tubeCfg.bloodType = bloodType; - return AppRet.success(); - } - - @EnginnerPageAction(name = "获取<急诊位>配置", group = "急诊位", groupOrder = 4) - public AppRet getEmergencyCfg() { - return AppRet.success(deviceCfg.emergencyCfg); - } - - @EnginnerPageAction(name = "添加<急诊位>配置", group = "急诊位") - public AppRet addEmergencyCfg(EmergencyCfg cfg) { - deviceCfg.emergencyCfg = cfg; - return AppRet.success(deviceCfg.emergencyCfg); - } -} diff --git a/src/main/java/a8k/service/appcfgs/AppCfgMgrService.java b/src/main/java/a8k/service/appcfgs/AppCfgMgrService.java new file mode 100644 index 0000000..3c8d3ae --- /dev/null +++ b/src/main/java/a8k/service/appcfgs/AppCfgMgrService.java @@ -0,0 +1,119 @@ +package a8k.service.appcfgs; + +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.service.appcfgs.base.A8kDeviceCfg; +import a8k.service.appcfgs.base.EmergencyCfg; +import a8k.appbase.type.BloodType; +import a8k.service.appcfgs.base.SampleTubeCfg; +import a8k.service.appcfgs.base.SampleTubeHolderCfg; +import a8k.service.hardware.canbus.protocol.A8kEcode; +import org.springframework.stereotype.Component; + +@Component +@EngineerPageTab(name = "AppCfgMgrService") +public class AppCfgMgrService { + A8kDeviceCfg deviceCfg = new A8kDeviceCfg(); + + + private SampleTubeHolderCfg dbFindCfg(String tubeHolderCfgUUID) { + for (SampleTubeHolderCfg cfg : deviceCfg.cfgs) { + if (cfg.uuid.equals(tubeHolderCfgUUID)) { + return cfg; + } + } + return null; + } + + private void dbRemoveCfg(String tubeHolderCfgUUID) { + deviceCfg.cfgs.removeIf(cfg -> cfg.uuid.equals(tubeHolderCfgUUID)); + } + + private SampleTubeCfg dbFindTubeCfg(String tubeHolderCfgUUID, Integer tubeIndex) { + SampleTubeHolderCfg cfg = dbFindCfg(tubeHolderCfgUUID); + if (cfg == null) { + return null; + } + return cfg.tubeCfgs.get(tubeIndex); + } + + + @EnginnerPageAction(name = "获取设备配置", group = "基础", groupOrder = 1) + public A8kDeviceCfg getA8kDeviceCfg() { + return deviceCfg; + } + + @EnginnerPageAction(name = "添加<试管架>配置", group = "试管架", groupOrder = 2) + public AppRet addCfg() { + SampleTubeHolderCfg cfg = new SampleTubeHolderCfg(); + deviceCfg.cfgs.add(cfg); + return AppRet.success(cfg); + } + + @EnginnerPageAction(name = "删除<试管架>配置", group = "试管架") + public AppRet removeCfg(String tubeHolderCfgUUID) { + dbRemoveCfg(tubeHolderCfgUUID); + return AppRet.success(); + } + + + @EnginnerPageAction(name = "激活<试管架>配置", group = "试管架") + public AppRet activeCfg(String tubeHolderCfgUUID, Boolean active) { + SampleTubeHolderCfg cfg = dbFindCfg(tubeHolderCfgUUID); + if (cfg == null) { + return AppRet.fail(A8kEcode.TubeHolderCfgNotExist); + } + cfg.active = active; + return AppRet.success(); + } + + + @EnginnerPageAction(name = "修改<试管>用户信息配置", group = "试管", groupOrder = 3) + public AppRet updateTubeUsrCfg(String uuid, Integer tubeIndex, String udpid, String barcodeid) { + SampleTubeHolderCfg cfg = dbFindCfg(uuid); + assert cfg != null; + cfg.tubeCfgs.get(tubeIndex).barcodeid = barcodeid; + cfg.tubeCfgs.get(tubeIndex).udpid = udpid; + return AppRet.success(cfg.tubeCfgs.get(tubeIndex)); + } + + + @EnginnerPageAction(name = "清除<试管>项目信息", group = "试管") + public AppRet clearTubeProjectCfg(String uuid, Integer tubeIndex) { + SampleTubeHolderCfg cfg = dbFindCfg(uuid); + assert cfg != null; + cfg.tubeCfgs.get(tubeIndex).projectCodes.clear(); + cfg.tubeCfgs.get(tubeIndex).bloodType = BloodType.WHOLE_BLOOD; + return AppRet.success(cfg.tubeCfgs.get(tubeIndex)); + } + + @EnginnerPageAction(name = "添加<试管>项目信息", group = "试管") + public AppRet addTubeProjectCode(String uuid, Integer tubeIndex, String pjc) { + SampleTubeHolderCfg cfg = dbFindCfg(uuid); + assert cfg != null; + SampleTubeCfg tubeCfg = new SampleTubeCfg(); + tubeCfg.projectCodes.add(pjc); + cfg.tubeCfgs.add(tubeCfg); + return AppRet.success(tubeCfg); + } + + @EnginnerPageAction(name = "设置<试管>血型", group = "试管") + public AppRet setTubeBloodType(String uuid, Integer tubeIndex, BloodType bloodType) { + SampleTubeCfg tubeCfg = dbFindTubeCfg(uuid, tubeIndex); + assert tubeCfg != null; + tubeCfg.bloodType = bloodType; + return AppRet.success(); + } + + @EnginnerPageAction(name = "获取<急诊位>配置", group = "急诊位", groupOrder = 4) + public AppRet getEmergencyCfg() { + return AppRet.success(deviceCfg.emergencyCfg); + } + + @EnginnerPageAction(name = "添加<急诊位>配置", group = "急诊位") + public AppRet addEmergencyCfg(EmergencyCfg cfg) { + deviceCfg.emergencyCfg = cfg; + return AppRet.success(deviceCfg.emergencyCfg); + } +} diff --git a/src/main/java/a8k/service/appconsumable/AppConsumableMgrService.java b/src/main/java/a8k/service/appconsumable/AppConsumableMgrService.java deleted file mode 100644 index 15d06fa..0000000 --- a/src/main/java/a8k/service/appconsumable/AppConsumableMgrService.java +++ /dev/null @@ -1,44 +0,0 @@ -package a8k.service.appconsumable; - -import a8k.appbase.appret.AppRet; -import a8k.controler.engineer.utils.EngineerPageTab; -import a8k.controler.engineer.utils.EnginnerPageAction; -import a8k.service.ProjectColorAllocer; -import a8k.service.appconsumable.base.ConsumableItemGroup; -import a8k.service.appconsumable.base.ReactantItem; -import a8k.service.appconsumable.base.TipGroupInfo; -import a8k.service.appstate.AppStateMgrService; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Component; - -@EngineerPageTab(name = "AppConsumableMgrService") -@Component -public class AppConsumableMgrService { - - @Resource - ProjectColorAllocer projectColorAllocer; - - @Resource - AppStateMgrService stateMgrService; - - //扫描耗材 - @EnginnerPageAction(name = "扫描耗材") - public AppRet scanningConsumables() { - ConsumableItemGroup var = new ConsumableItemGroup(); - for (int i = 0; i < 6; i++) { - var.reactantItems[i] = new ReactantItem(); - var.reactantItems[i].projId = "PROJECT_" + i; - var.reactantItems[i].lotVal = "LOT_" + i; - var.reactantItems[i].color = projectColorAllocer.getProjectColor(var.reactantItems[i].projId); - var.reactantItems[i].hasDetectionMaterial = i % 2 == 0; - var.reactantItems[i].hasSmallBufferBottle = i % 2 == 1; - var.reactantItems[i].hasLargeBufferBottle = i % 2 == 0; - - } - var.tip[0] = new TipGroupInfo(); - var.tip[1] = new TipGroupInfo(); - var.tip[2] = new TipGroupInfo(); - stateMgrService.setConsumable(var); - return AppRet.success(var); - } -} diff --git a/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java b/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java new file mode 100644 index 0000000..24b9cc7 --- /dev/null +++ b/src/main/java/a8k/service/appconsumable/AppConsumablesMgrService.java @@ -0,0 +1,50 @@ +package a8k.service.appconsumable; + +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.controler.engineer.utils.EnginnerPageTabOrder; +import a8k.service.ProjectColorAllocer; +import a8k.service.appconsumable.base.Consumables; +import a8k.service.appconsumable.base.ReactantItem; +import a8k.service.appconsumable.base.TipGroupInfo; +import a8k.service.appstate.AppStateMgrService; +import jakarta.annotation.Resource; +import org.springframework.stereotype.Component; + +@EngineerPageTab(name = "应用-耗材管理服务", order = EnginnerPageTabOrder.AppConsumablesMgrService) +@Component +public class AppConsumablesMgrService { + + @Resource + ProjectColorAllocer projectColorAllocer; + + @Resource + AppStateMgrService stateMgrService; + + //扫描耗材 + @EnginnerPageAction(name = "扫描耗材") + public AppRet scanningConsumables() { + Consumables var = new Consumables(); + for (int i = 0; i < 6; i++) { + var.reactantItems[i] = new ReactantItem(); + var.reactantItems[i].projId = "PROJECT_" + i; + var.reactantItems[i].lotVal = "LOT_" + i; + var.reactantItems[i].color = projectColorAllocer.getProjectColor(var.reactantItems[i].projId); + var.reactantItems[i].hasDetectionMaterial = i % 2 == 0; + var.reactantItems[i].hasSmallBufferBottle = i % 2 == 1; + var.reactantItems[i].hasLargeBufferBottle = i % 2 == 0; + + } + var.tip[0] = new TipGroupInfo(); + var.tip[1] = new TipGroupInfo(); + var.tip[2] = new TipGroupInfo(); + stateMgrService.setConsumable(var); + return AppRet.success(var); + } + + @EnginnerPageAction(name = "获取耗材状态") + public AppRet getConsumables() { + return AppRet.success(stateMgrService.getConsumable()); + } +} diff --git a/src/main/java/a8k/service/appconsumable/base/ConsumableItemGroup.java b/src/main/java/a8k/service/appconsumable/base/ConsumableItemGroup.java deleted file mode 100644 index 0971b23..0000000 --- a/src/main/java/a8k/service/appconsumable/base/ConsumableItemGroup.java +++ /dev/null @@ -1,19 +0,0 @@ -package a8k.service.appconsumable.base; - -import java.util.Date; - -public class ConsumableItemGroup { - - public Date scanDate = new Date(); - public ReactantItem[] reactantItems = new ReactantItem[6]; - public TipGroupInfo[] tip = new TipGroupInfo[3]; - - public ConsumableItemGroup() { - for (int i = 0; i < reactantItems.length; i++) { - reactantItems[i] = new ReactantItem(); - } - for (int i = 0; i < tip.length; i++) { - tip[i] = new TipGroupInfo(); - } - } -} diff --git a/src/main/java/a8k/service/appconsumable/base/Consumables.java b/src/main/java/a8k/service/appconsumable/base/Consumables.java new file mode 100644 index 0000000..a5e6a20 --- /dev/null +++ b/src/main/java/a8k/service/appconsumable/base/Consumables.java @@ -0,0 +1,19 @@ +package a8k.service.appconsumable.base; + +import java.util.Date; + +public class Consumables { + + public Date scanDate = new Date(); + public ReactantItem[] reactantItems = new ReactantItem[6]; + public TipGroupInfo[] tip = new TipGroupInfo[3]; + + public Consumables() { + for (int i = 0; i < reactantItems.length; i++) { + reactantItems[i] = new ReactantItem(); + } + for (int i = 0; i < tip.length; i++) { + tip[i] = new TipGroupInfo(); + } + } +} diff --git a/src/main/java/a8k/service/appctrl/AppCtrlService.java b/src/main/java/a8k/service/appctrl/AppCtrlService.java index 55c008f..f7a1747 100644 --- a/src/main/java/a8k/service/appctrl/AppCtrlService.java +++ b/src/main/java/a8k/service/appctrl/AppCtrlService.java @@ -3,51 +3,54 @@ package a8k.service.appctrl; import a8k.appbase.appret.AppRet; import a8k.controler.engineer.utils.EngineerPageTab; import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.controler.engineer.utils.EnginnerPageTabOrder; +import org.slf4j.Logger; import org.springframework.stereotype.Component; -@EngineerPageTab(name = "AppCtrlService") +@EngineerPageTab(name = "应用-设备控制", order = EnginnerPageTabOrder.AppCtrlService) @Component public class AppCtrlService { + static final Logger logger = org.slf4j.LoggerFactory.getLogger(AppCtrlService.class); + static class ORDER { + static final int initDevice = 1; + } - @EnginnerPageAction(name = "初始化设备") + @EnginnerPageAction(name = "初始化设备", group = "设备基础控制", order = ORDER.initDevice) public AppRet initDevice() { return AppRet.success(); + } + //关机 + @EnginnerPageAction(name = "关机", group = "设备基础控制", order = 1) + public AppRet shutdown() { + return AppRet.success(); } //启动 - @EnginnerPageAction(name = "启动") + @EnginnerPageAction(name = "启动", group = "应用控制", groupOrder = 1, order = 1) public AppRet startProcess() { return AppRet.success(); } //暂停 - @EnginnerPageAction(name = "暂停") + @EnginnerPageAction(name = "暂停", group = "应用控制", order = 2) public AppRet pauseProcess() { return AppRet.success(); } //急停 - @EnginnerPageAction(name = "急停") + @EnginnerPageAction(name = "急停", group = "应用控制", order = 3) public AppRet forceStopProcess() { return AppRet.success(); } //停止 - @EnginnerPageAction(name = "停止") + @EnginnerPageAction(name = "停止", group = "应用控制", order = 4) public AppRet stopProcess() { return AppRet.success(); } - //关机 - @EnginnerPageAction(name = "关机") - public AppRet shutdown() { - return AppRet.success(); - } - - - } diff --git a/src/main/java/a8k/service/appfrontend/AppFrontEndEventRouter.java b/src/main/java/a8k/service/appfrontend/AppFrontEndEventRouter.java new file mode 100644 index 0000000..17f41af --- /dev/null +++ b/src/main/java/a8k/service/appfrontend/AppFrontEndEventRouter.java @@ -0,0 +1,62 @@ +package a8k.service.appfrontend; + +import a8k.service.appeventbus.AppEventListener; +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.service.appeventbus.AppEventBusService; +import a8k.service.appeventbus.appevent.A8kHardwareReport; +import a8k.service.appeventbus.appevent.AppEvent; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.Queue; + +@Component +@EngineerPageTab(name = "FrontEndEventRouter") +public class AppFrontEndEventRouter implements AppEventListener { + static Logger logger = org.slf4j.LoggerFactory.getLogger(AppFrontEndEventRouter.class); + + @Resource + AppEventBusService eventBus; + + private final Queue appEventQueue = new java.util.concurrent.ConcurrentLinkedQueue<>(); + + + @PostConstruct + public void init() { + eventBus.regListener(this); + } + + public Boolean filterEvent(AppEvent event) { + if (event instanceof A8kHardwareReport) { + return true; + } + return false; + } + + synchronized public AppEvent _pollAppEvent() { + return appEventQueue.poll(); + } + + @Override public void onAppEvent(AppEvent event) { + if (filterEvent(event)) { + return; + } + + appEventQueue.add(event); + if (appEventQueue.size() >= 10) { + logger.warn("too many events in queue, drop some"); + _pollAppEvent(); + } + } + + @EnginnerPageAction(name = "pollAppEvent") + public AppRet pollAppEvent() { + AppEvent event = _pollAppEvent(); + return AppRet.success(event); + } + +} diff --git a/src/main/java/a8k/service/appstate/AppStateMgrService.java b/src/main/java/a8k/service/appstate/AppStateMgrService.java index 2e19806..7bec717 100644 --- a/src/main/java/a8k/service/appstate/AppStateMgrService.java +++ b/src/main/java/a8k/service/appstate/AppStateMgrService.java @@ -3,7 +3,7 @@ package a8k.service.appstate; import a8k.controler.engineer.utils.EngineerPageTab; import a8k.controler.engineer.utils.EnginnerPageAction; import a8k.db.ProjectInfo; -import a8k.service.appconsumable.base.ConsumableItemGroup; +import a8k.service.appconsumable.base.Consumables; import a8k.service.appbase.A8kDeviceState; import jakarta.annotation.PostConstruct; import org.slf4j.Logger; @@ -34,8 +34,11 @@ public class AppStateMgrService { deviceState.curIdCardInfo = projectInfo; } - public void setConsumable(ConsumableItemGroup cig) { + public void setConsumable(Consumables cig) { deviceState.consumable = cig; } + public Consumables getConsumable() { + return deviceState.consumable; + } } diff --git a/src/main/java/a8k/service/hardware/HardwareTestScript.java b/src/main/java/a8k/service/hardware/HardwareTestScript.java new file mode 100644 index 0000000..e6c3c88 --- /dev/null +++ b/src/main/java/a8k/service/hardware/HardwareTestScript.java @@ -0,0 +1,134 @@ +package a8k.service.hardware; + +import a8k.appbase.ConsumableGroup; +import a8k.appbase.HardwareException; +import a8k.appbase.cfg.*; +import a8k.appbase.appret.AppRet; +import a8k.service.hardware.canbus.A8kCanBusService; +import a8k.service.hardware.canbus.protocol.A8kEcode; +import a8k.service.hardware.canbus.protocol.MId; +import a8k.service.hardware.canbus.protocol.RegIndex; +import a8k.controler.engineer.utils.EnginnerParamReader; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.controler.engineer.utils.EnginnerPageParams; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; + +@Component +@EngineerPageTab(name = "测试脚本") +@EnginnerPageParams(service = HardwareTestScript.class) +public class HardwareTestScript { + static Logger logger = LoggerFactory.getLogger(HardwareTestScript.class); + + @Resource + A8kCanBusService canBus; + + @Resource + CommonHardwareOpeartion comHardwareOpera; + + @Resource + ApplicationContext appCxt; + + @Resource + HbotControlService hbotcs; + + EnginnerParamReader settingReader = new EnginnerParamReader(HbotControlService.class); + + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // 测试 + // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Boolean testScriptWorkFlag = false; + + @EnginnerPageAction(name = "停止测试脚本", group = "控制") + public void testTakeAllTipStop() throws HardwareException, InterruptedException { + testScriptWorkFlag = false; + } + + @EnginnerPageAction(name = "取放Tip-单步", group = "Hbot测试脚本") + public AppRet takeTipTestStep(Integer tipgroup, Integer index) throws HardwareException, InterruptedException { + var ret = hbotcs.takeTip(tipgroup, index); + TipPickUpPosInfo tipPos = hbotcs.getTipPickUpPosInfo(); + + canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, tipPos.getPickUpZPos(tipgroup) - 100, hbotcs.getActionOvertime()); + canBus.pipetteCtrlPutTipBlock(MId.PipetteMod); + + if (canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1) { + throw new HardwareException(A8kEcode.PutTipFail); + } + + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); + return ret; + } + + @EnginnerPageAction(name = "取放Tip-全部", group = "Hbot测试脚本") + public AppRet> testTakeAllTip(Integer groupId, Integer startFrom) throws HardwareException, InterruptedException { + // ObjectMapper mapper = new ObjectMapper(); + testScriptWorkFlag = true; + Map result = new HashMap<>(); + for (int i = startFrom; i < TipPickUpPosInfo.cgetTipNum(); i++) { + var ret = takeTipTestStep(groupId, i); + if (!ret.getData()) { + throw new HardwareException(A8kEcode.TakeTipFail); + } + + result.put("Tip" + i, ret.getData() ? "suc" : "fail"); + logger.info("Take Tip {}-{} => {}", groupId, i, ret.getData()); + if (!testScriptWorkFlag) { + break; + } + } + return AppRet.success(result); + } + + @EnginnerPageAction(name = "测试所有小瓶缓冲液位置", group = "Hbot测试脚本") + public void testAllLittleBottleBufferPos(ConsumableGroup group) throws HardwareException, InterruptedException { + testScriptWorkFlag = true; + BottleGroupsPosInfo posInfo = hbotcs.getBottleBufferPosInfo(); + for (int i = 0; i < BottlesPosInfo.cgetMAX(); i++) { + BottleGroupsPosInfo pos = hbotcs.getBottleBufferPosInfo(); + hbotcs.hbotMoveToSmallBottleGroup(group, i); + canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, pos.posTestZ, hbotcs.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); + if (!testScriptWorkFlag) { + break; + } + } + } + + @EnginnerPageAction(name = "测试所有探测物质位置", group = "Hbot测试脚本") + public void testAllDetectMaterialPos(ConsumableGroup group) throws HardwareException, InterruptedException { + testScriptWorkFlag = true; + for (int i = 0; i < BottlesPosInfo.cgetMAX(); i++) { + BottleGroupsPosInfo pos = hbotcs.getBottleBufferPosInfo(); + hbotcs.hbotMoveToDetectMaterialPos(group, i); + canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, pos.posTestZ, hbotcs.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); + if (!testScriptWorkFlag) { + break; + } + } + } + + @EnginnerPageAction(name = "测试所有大瓶缓冲液位置", group = "Hbot测试脚本") + public void testAllBigBottleBufferPos() throws HardwareException, InterruptedException { + testScriptWorkFlag = true; + // 遍历枚举 ConsumableGroup + for (ConsumableGroup group : ConsumableGroup.values()) { + hbotcs.hbotMoveToLargeBottleGroup(group); + canBus.stepMotorEasyMoveByBlock(MId.PipetteModZM, 100, hbotcs.getActionOvertime()); + canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); + if (!testScriptWorkFlag) { + break; + } + } + } + + +} diff --git a/src/main/java/a8k/service/hardware/TestScript.java b/src/main/java/a8k/service/hardware/TestScript.java deleted file mode 100644 index f12f965..0000000 --- a/src/main/java/a8k/service/hardware/TestScript.java +++ /dev/null @@ -1,134 +0,0 @@ -package a8k.service.hardware; - -import a8k.appbase.ConsumableGroup; -import a8k.appbase.HardwareException; -import a8k.appbase.cfg.*; -import a8k.appbase.appret.AppRet; -import a8k.service.hardware.canbus.A8kCanBusService; -import a8k.service.hardware.canbus.protocol.A8kEcode; -import a8k.service.hardware.canbus.protocol.MId; -import a8k.service.hardware.canbus.protocol.RegIndex; -import a8k.controler.engineer.utils.EnginnerParamReader; -import a8k.controler.engineer.utils.EngineerPageTab; -import a8k.controler.engineer.utils.EnginnerPageAction; -import a8k.controler.engineer.utils.EnginnerPageParams; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.Map; - -@Component -@EngineerPageTab(name = "测试脚本") -@EnginnerPageParams(service = TestScript.class) -public class TestScript { - static Logger logger = LoggerFactory.getLogger(TestScript.class); - - @Resource - A8kCanBusService canBus; - - @Resource - CommonHardwareOpeartion comHardwareOpera; - - @Resource - ApplicationContext appCxt; - - @Resource - HbotControlService hbotcs; - - EnginnerParamReader settingReader = new EnginnerParamReader(HbotControlService.class); - - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // 测试 - // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - Boolean testScriptWorkFlag = false; - - @EnginnerPageAction(name = "停止测试脚本", group = "控制") - public void testTakeAllTipStop() throws HardwareException, InterruptedException { - testScriptWorkFlag = false; - } - - @EnginnerPageAction(name = "取放Tip-单步", group = "Hbot测试脚本") - public AppRet takeTipTestStep(Integer tipgroup, Integer index) throws HardwareException, InterruptedException { - var ret = hbotcs.takeTip(tipgroup, index); - TipPickUpPosInfo tipPos = hbotcs.getTipPickUpPosInfo(); - - canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, tipPos.getPickUpZPos(tipgroup) - 100, hbotcs.getActionOvertime()); - canBus.pipetteCtrlPutTipBlock(MId.PipetteMod); - - if (canBus.moduleGetReg(MId.PipetteMod, RegIndex.kreg_pipette_tip_state) == 1) { - throw new HardwareException(A8kEcode.PutTipFail); - } - - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); - return ret; - } - - @EnginnerPageAction(name = "取放Tip-全部", group = "Hbot测试脚本") - public AppRet> testTakeAllTip(Integer groupId, Integer startFrom) throws HardwareException, InterruptedException { - // ObjectMapper mapper = new ObjectMapper(); - testScriptWorkFlag = true; - Map result = new HashMap<>(); - for (int i = startFrom; i < TipPickUpPosInfo.cgetTipNum(); i++) { - var ret = takeTipTestStep(groupId, i); - if (!ret.getData()) { - throw new HardwareException(A8kEcode.TakeTipFail); - } - - result.put("Tip" + i, ret.getData() ? "suc" : "fail"); - logger.info("Take Tip {}-{} => {}", groupId, i, ret.getData()); - if (!testScriptWorkFlag) { - break; - } - } - return AppRet.success(result); - } - - @EnginnerPageAction(name = "测试所有小瓶缓冲液位置", group = "Hbot测试脚本") - public void testAllLittleBottleBufferPos(ConsumableGroup group) throws HardwareException, InterruptedException { - testScriptWorkFlag = true; - BottleGroupsPosInfo posInfo = hbotcs.getBottleBufferPosInfo(); - for (int i = 0; i < BottlesPosInfo.cgetMAX(); i++) { - BottleGroupsPosInfo pos = hbotcs.getBottleBufferPosInfo(); - hbotcs.hbotMoveToSmallBottleGroup(group, i); - canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, pos.posTestZ, hbotcs.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); - if (!testScriptWorkFlag) { - break; - } - } - } - - @EnginnerPageAction(name = "测试所有探测物质位置", group = "Hbot测试脚本") - public void testAllDetectMaterialPos(ConsumableGroup group) throws HardwareException, InterruptedException { - testScriptWorkFlag = true; - for (int i = 0; i < BottlesPosInfo.cgetMAX(); i++) { - BottleGroupsPosInfo pos = hbotcs.getBottleBufferPosInfo(); - hbotcs.hbotMoveToDetectMaterialPos(group, i); - canBus.stepMotorEasyMoveToBlock(MId.PipetteModZM, pos.posTestZ, hbotcs.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); - if (!testScriptWorkFlag) { - break; - } - } - } - - @EnginnerPageAction(name = "测试所有大瓶缓冲液位置", group = "Hbot测试脚本") - public void testAllBigBottleBufferPos() throws HardwareException, InterruptedException { - testScriptWorkFlag = true; - // 遍历枚举 ConsumableGroup - for (ConsumableGroup group : ConsumableGroup.values()) { - hbotcs.hbotMoveToLargeBottleGroup(group); - canBus.stepMotorEasyMoveByBlock(MId.PipetteModZM, 100, hbotcs.getActionOvertime()); - canBus.stepMotorEasyMoveToZeroPointQuickBlock(MId.PipetteModZM, hbotcs.getActionOvertime()); - if (!testScriptWorkFlag) { - break; - } - } - } - - -} diff --git a/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java b/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java new file mode 100644 index 0000000..f79267b --- /dev/null +++ b/src/main/java/a8k/service/project_mgr/AppProjectItemMgrService.java @@ -0,0 +1,158 @@ +package a8k.service.project_mgr; + + +import a8k.controler.engineer.utils.EnginnerPageStatu; +import a8k.controler.engineer.utils.EnginnerPageTabOrder; +import a8k.service.appeventbus.AppEventListener; +import a8k.appbase.HardwareException; +import a8k.appbase.ProjectInfoSimple; +import a8k.appbase.appret.AppRet; +import a8k.controler.engineer.utils.EngineerPageTab; +import a8k.controler.engineer.utils.EnginnerPageAction; +import a8k.db.ProjectInfo; +import a8k.service.appeventbus.AppEventBusService; +import a8k.service.appeventbus.appevent.A8kCanBusOnConnectEvent; +import a8k.service.appeventbus.appevent.A8kHardwareReport; +import a8k.service.appeventbus.appevent.AppEvent; +import a8k.service.hardware.canbus.A8kCanBusService; +import a8k.service.hardware.canbus.protocol.A8kPacket; +import a8k.service.hardware.canbus.protocol.CmdId; +import a8k.service.hardware.canbus.protocol.MId; +import a8k.service.hardware.canbus.protocol.RegIndex; +import a8k.service.appstate.AppStateMgrService; +import a8k.utils.wq.ZWorkQueue; +import jakarta.annotation.PostConstruct; +import jakarta.annotation.Resource; +import org.slf4j.Logger; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Component +@EngineerPageTab(name = "应用-项目管理", order = EnginnerPageTabOrder.AppProjectItemMgrService) +public class AppProjectItemMgrService implements AppEventListener { + static Logger logger = org.slf4j.LoggerFactory.getLogger(AppProjectItemMgrService.class); + + @Resource + A8kCanBusService canBus; + + @Resource + AppEventBusService eventBus; + + @Resource + AppStateMgrService stateMgr; + + ZWorkQueue workQueue = new ZWorkQueue(2, 1); + + @PostConstruct + public void init() { + + eventBus.regListener(this); + } + + @Override public void onAppEvent(AppEvent event) { + if (event instanceof A8kHardwareReport canPacket) { + A8kPacket packet = canPacket.getReportPacket(); + CmdId cmdId = CmdId.valueOf(packet.getCmdId()); + if (CmdId.event_a8000_idcard_online.equals(cmdId)) { + logger.info("插入ID卡"); + workQueue.addTask(this::readIDCard); + } else if (CmdId.event_a8000_idcard_offline.equals(cmdId)) { + logger.info("拔出ID卡"); + } + } else if (event instanceof A8kCanBusOnConnectEvent canPacket) { + if (idCardStatus()) { + logger.info("ID卡读卡器在线"); + workQueue.addTask(this::readIDCard); + } + } + } + + ProjectInfo dbGetProjectInfo(String lotName) { + return ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", lotName)); + } + + List dbGetProjectInfos() { + var pinfos = ProjectInfo.find(ProjectInfo.class); + List result = new ArrayList<>(); + for (var pinfo : pinfos) { + result.add(new ProjectInfoSimple(pinfo)); + } + return result; + } + + Boolean isNewProjectInfo(ProjectInfo newpinfo) { + var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); + return pinfo == null || newpinfo.updateChipVersion >= pinfo.updateChipVersion; + } + + private ProjectInfo readAndConstructProjectInfo() { + //读取ID卡信息 + byte[] data = null; + try { + data = canBus.a8kIdcardReaderReadRaw(); + logger.info("ID卡信息:{}", data); + //TODO: + // 解析ID + // 构造ProjectInfo + } catch (HardwareException e) { + throw new RuntimeException(e); + } + return null; + } + + void readIDCard() { + //读取ID卡信息 + //TODO: + // 解析ID + // 构造ProjectInfo + // 判断是否是新的ProjectInfo (by call isNewProjectInfo) + // 构造NewAppIDCardDetectEvent + // 发送事件到事件总线上去,事件将由 FrontEndEventRouter 路由到前端 + // 存储项目信息到数据库中 + // 调用 stateMgr.setCurrentIdCardInfo(); 将ID卡信息存储到状态管理器中 + ProjectInfo pjinfo = readAndConstructProjectInfo(); + + } + + + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + // PUBLIC + // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + @EnginnerPageAction(name = "获取项目信息(简单)", order = 1) + public AppRet> getProjectInfoSimple() { + return AppRet.success(dbGetProjectInfos()); + } + + @EnginnerPageAction(name = "添加项目信息", order = 2) + public AppRet addProjectInfo(ProjectInfo newpinfo) { + var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); + if (pinfo != null && newpinfo.updateChipVersion < pinfo.updateChipVersion) { + return AppRet.success("新项目版本低于数据库中的项目版本,不更新"); + } else { + if (pinfo != null) { + pinfo.delete(); + } + newpinfo.save(); + } + return AppRet.success("添加成功"); + } + + @EnginnerPageAction(name = "读取ID卡信息", order = 3) + public AppRet readIDCardInfo() { + ProjectInfo pinfo = readAndConstructProjectInfo(); + return AppRet.success(pinfo); + } + + @EnginnerPageStatu(name = "ID卡状态") + public Boolean idCardStatus() { + try { + return canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1; + } catch (HardwareException ignored) { + } + return false; + } +} diff --git a/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java b/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java deleted file mode 100644 index 0f77ead..0000000 --- a/src/main/java/a8k/service/project_mgr/ProjectItemMgrService.java +++ /dev/null @@ -1,135 +0,0 @@ -package a8k.service.project_mgr; - - -import a8k.service.appeventbus.AppEventListener; -import a8k.appbase.HardwareException; -import a8k.appbase.ProjectInfoSimple; -import a8k.appbase.appret.AppRet; -import a8k.controler.engineer.utils.EngineerPageTab; -import a8k.controler.engineer.utils.EnginnerPageAction; -import a8k.db.ProjectInfo; -import a8k.service.appeventbus.AppEventBusService; -import a8k.service.appeventbus.appevent.A8kCanBusOnConnectEvent; -import a8k.service.appeventbus.appevent.A8kHardwareReport; -import a8k.service.appeventbus.appevent.AppEvent; -import a8k.service.hardware.canbus.A8kCanBusService; -import a8k.service.hardware.canbus.protocol.A8kPacket; -import a8k.service.hardware.canbus.protocol.CmdId; -import a8k.service.hardware.canbus.protocol.MId; -import a8k.service.hardware.canbus.protocol.RegIndex; -import a8k.service.appstate.AppStateMgrService; -import a8k.utils.wq.ZWorkQueue; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import org.slf4j.Logger; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -@Component -@EngineerPageTab(name = "ProjectItemMgrService") -public class ProjectItemMgrService implements AppEventListener { - static Logger logger = org.slf4j.LoggerFactory.getLogger(ProjectItemMgrService.class); - - @Resource - A8kCanBusService canBus; - - @Resource - AppEventBusService eventBus; - - @Resource - AppStateMgrService stateMgr; - - ZWorkQueue workQueue = new ZWorkQueue(2, 1); - - @PostConstruct - public void init() { - - eventBus.regListener(this); - } - - @Override public void onAppEvent(AppEvent event) { - if (event instanceof A8kHardwareReport canPacket) { - A8kPacket packet = canPacket.getReportPacket(); - CmdId cmdId = CmdId.valueOf(packet.getCmdId()); - if (CmdId.event_a8000_idcard_online.equals(cmdId)) { - logger.info("插入ID卡"); - workQueue.addTask(this::readIDCard); - } else if (CmdId.event_a8000_idcard_offline.equals(cmdId)) { - logger.info("拔出ID卡"); - } - } else if (event instanceof A8kCanBusOnConnectEvent canPacket) { - try { - if (canBus.moduleGetReg(MId.A8kIdCardReader, RegIndex.kreg_id_card_reader_is_online) == 1) { - logger.info("ID卡读卡器在线"); - workQueue.addTask(this::readIDCard); - } - } catch (HardwareException e) { - throw new RuntimeException(e); - } - } - } - - ProjectInfo dbGetProjectInfo(String lotName) { - return ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", lotName)); - } - - List dbGetProjectInfos() { - var pinfos = ProjectInfo.find(ProjectInfo.class); - List result = new ArrayList<>(); - for (var pinfo : pinfos) { - result.add(new ProjectInfoSimple(pinfo)); - } - return result; - } - - Boolean isNewProjectInfo(ProjectInfo newpinfo) { - var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); - return pinfo == null || newpinfo.updateChipVersion >= pinfo.updateChipVersion; - } - - void readIDCard() { - //读取ID卡信息 - byte[] data = null; - try { - data = canBus.a8kIdcardReaderReadRaw(); - logger.info("ID卡信息:{}", data); - //TODO: - // 解析ID - // 构造ProjectInfo - // 判断是否是新的ProjectInfo (by call isNewProjectInfo) - // 构造NewAppIDCardDetectEvent - // 发送事件到事件总线上去,事件将由 FrontEndEventRouter 路由到前端 - // 存储项目信息到数据库中 - // 调用 stateMgr.setCurrentIdCardInfo(); 将ID卡信息存储到状态管理器中 - } catch (HardwareException e) { - throw new RuntimeException(e); - } - } - - - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - // PUBLIC - // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - - @EnginnerPageAction(name = "获取项目信息(简单)") - public AppRet> getProjectInfoSimple() { - return AppRet.success(dbGetProjectInfos()); - } - - @EnginnerPageAction(name = "添加项目信息") - public AppRet addProjectInfo(ProjectInfo newpinfo) { - var pinfo = ProjectInfo.findOne(ProjectInfo.class, Map.of("lotName", newpinfo.lotName)); - if (pinfo != null && newpinfo.updateChipVersion < pinfo.updateChipVersion) { - return AppRet.success("新项目版本低于数据库中的项目版本,不更新"); - } else { - if (pinfo != null) { - pinfo.delete(); - } - newpinfo.save(); - } - return AppRet.success("添加成功"); - } -} diff --git a/zhaohe_app.db b/zhaohe_app.db index 6ff5f440822a6b5b05b20e6d1d9f1f9f670cc425..c27d0b268e8c5b2f38eb2f384feedc369e8cd046 100644 GIT binary patch delta 613 zcma)&y-LJD6ovD%E3RRU{R%26w7D>UcV;d&g3qv}uro>KB?J=-t@TM17V%YllP$Dx z62VSPG2Qvjx%2gX(f7sED&0LFU#GkK&BG>r+hn(QotBJS!5WZGSx|^IxS$$Pj2dTj z!A&db{btFQt zVB1*0McWOOKr2KQLam6id_;VMM5qv~vkny147@@D$9?RVH6tl1t7DaB*+?jdiW)1S zMIO)Bq`{L%AQ`-tsHEo@HzL7VIuedCd8sjI;L^kqXE6Rf&Y>mekPK-w5wXI`gCt4z z$|5OW%A))zA4^rylpp delta 613 zcma)&Jx&}!5QS&<2N_m)oUbK=Hh`q0>h7BAYLOsuh7B!k|4d!N61xOAwohV92yq0i z;F~xw0lgCt;teW$pWdr)w_EIXiyzDO`RC`G_W5peziA&glW(`%Y$zoi9Kt0%G!o(6U&+60cN=*+?j79HJ{V ztO&%GAm-9Tz`ph;c0pWPsb&fWrz2vycQ#9bo|6TN1wpV!z|87QAkV&*u&OXlMj{iH z!WKc%3_!_62!%p@iAf}z=m)7Cl`z2(hV%SaBy! z(;Rh+rlanAx9EO#f4Z*^=VyOEZZD_n_7I6j``{t&=KJ6~%HE94_QCBTrl#Y_0|ZSj crt9Oqm;Y%wtv;Gh^&XC||9yFy{hqvZubKpv9RL6T